diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..9615220ede --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +liberapay: pietervdvn diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000000..128e8530c4 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,65 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ master ] + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://git.io/codeql-language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/deploy_pietervdvn.yml b/.github/workflows/deploy_pietervdvn.yml index dfa5644685..9a2cf8c7c2 100644 --- a/.github/workflows/deploy_pietervdvn.yml +++ b/.github/workflows/deploy_pietervdvn.yml @@ -37,6 +37,13 @@ jobs: git clone --depth 1 --single-branch --branch master "https://x-access-token:$DEPLOY_KEY_PIETERVDVN@github.com/pietervdvn/pietervdvn.github.io.git" echo "Destination repo is cloned" + - name: Sync repo + env: + DEPLOY_KEY_PIETERVDVN: ${{ secrets.DEPLOY_KEY_PIETERVDVN }} + run: | + cd pietervdvn.github.io + git pull + - name: "Copying files" run: | echo "Deploying" diff --git a/Customizations/AllKnownLayers.ts b/Customizations/AllKnownLayers.ts index 2335fe7103..b55da3b583 100644 --- a/Customizations/AllKnownLayers.ts +++ b/Customizations/AllKnownLayers.ts @@ -1,14 +1,33 @@ import * as known_layers from "../assets/generated/known_layers_and_themes.json" import {Utils} from "../Utils"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; +import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson"; +import SharedTagRenderings from "./SharedTagRenderings"; +import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; +import WithContextLoader from "../Models/ThemeConfig/WithContextLoader"; export default class AllKnownLayers { + public static inited = (_ => { + WithContextLoader.getKnownTagRenderings = (id => AllKnownLayers.getTagRendering(id)) + return true + })() + // Must be below the list... public static sharedLayers: Map = AllKnownLayers.getSharedLayers(); public static sharedLayersJson: Map = AllKnownLayers.getSharedLayersJson(); + + public static added_by_default: string[] = ["gps_location", "home_location", "gps_track"] + public static no_include: string[] = [ "conflation", "left_right_style"] + /** + * Layer IDs of layers which have special properties through built-in hooks + */ + public static priviliged_layers: string[] = [...AllKnownLayers.added_by_default, "type_node",...AllKnownLayers.no_include] + + + private static getSharedLayers(): Map { const sharedLayers = new Map(); for (const layer of known_layers.layers) { @@ -16,7 +35,6 @@ export default class AllKnownLayers { // @ts-ignore const parsed = new LayerConfig(layer, "shared_layers") sharedLayers.set(layer.id, parsed); - sharedLayers[layer.id] = parsed; } catch (e) { if (!Utils.runningFromConsole) { console.error("CRITICAL: Could not parse a layer configuration!", layer.id, " due to", e) @@ -48,7 +66,7 @@ export default class AllKnownLayers { return sharedLayers; } - private static getSharedLayersJson(): Map { + private static getSharedLayersJson(): Map { const sharedLayers = new Map(); for (const layer of known_layers.layers) { sharedLayers.set(layer.id, layer); @@ -57,5 +75,41 @@ export default class AllKnownLayers { return sharedLayers; } + /** + * Gets the appropriate tagRenderingJSON + * Allows to steal them from other layers. + * This will add the tags of the layer to the configuration though! + * @param renderingId + */ + static getTagRendering(renderingId: string): TagRenderingConfigJson { + if(renderingId.indexOf(".") < 0){ + return SharedTagRenderings.SharedTagRenderingJson.get(renderingId) + } + + const [layerId, id] = renderingId.split(".") + const layer = AllKnownLayers.getSharedLayersJson().get(layerId) + if(layer === undefined){ + if(Utils.runningFromConsole){ + // Probably generating the layer overview + return { + id: "dummy" + } + } + throw "Builtin layer "+layerId+" not found" + } + const renderings = layer?.tagRenderings ?? [] + for (const rendering of renderings) { + if(rendering["id"] === id){ + const found = JSON.parse(JSON.stringify(rendering)) + if(found.condition === undefined){ + found.condition = layer.source.osmTags + }else{ + found.condition = {and: [found.condition, layer.source.osmTags]} + } + return found + } + } + throw `The rendering with id ${id} was not found in the builtin layer ${layerId}. Try one of ${Utils.NoNull(renderings.map(r => r["id"])).join(", ")}` + } } diff --git a/Customizations/AllKnownLayouts.ts b/Customizations/AllKnownLayouts.ts index f5695d70b4..4d0c394428 100644 --- a/Customizations/AllKnownLayouts.ts +++ b/Customizations/AllKnownLayouts.ts @@ -2,6 +2,10 @@ import AllKnownLayers from "./AllKnownLayers"; import * as known_themes from "../assets/generated/known_layers_and_themes.json" import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; +import BaseUIElement from "../UI/BaseUIElement"; +import Combine from "../UI/Base/Combine"; +import Title from "../UI/Base/Title"; +import List from "../UI/Base/List"; export class AllKnownLayouts { @@ -9,16 +13,16 @@ export class AllKnownLayouts { public static allKnownLayouts: Map = AllKnownLayouts.AllLayouts(); public static layoutsList: LayoutConfig[] = AllKnownLayouts.GenerateOrderedList(AllKnownLayouts.allKnownLayouts); - public static AllPublicLayers(){ - const allLayers : LayerConfig[] = [] + public static AllPublicLayers() { + const allLayers: LayerConfig[] = [] const seendIds = new Set() const publicLayouts = AllKnownLayouts.layoutsList.filter(l => !l.hideFromOverview) for (const layout of publicLayouts) { - if(layout.hideFromOverview){ + if (layout.hideFromOverview) { continue } for (const layer of layout.layers) { - if(seendIds.has(layer.id)){ + if (seendIds.has(layer.id)) { continue } seendIds.add(layer.id) @@ -28,7 +32,51 @@ export class AllKnownLayouts { } return allLayers } - + + public static GenLayerOverviewText(): BaseUIElement { + for (const id of AllKnownLayers.priviliged_layers) { + if (!AllKnownLayers.sharedLayers.has(id)) { + throw "Priviliged layer definition not found: " + id + } + } + const allLayers: LayerConfig[] = Array.from(AllKnownLayers.sharedLayers.values()) + + const themesPerLayer = new Map() + + for (const layout of Array.from(AllKnownLayouts.allKnownLayouts.values())) { + if(layout.hideFromOverview){ + continue + } + for (const layer of layout.layers) { + if (!themesPerLayer.has(layer.id)) { + themesPerLayer.set(layer.id, []) + } + themesPerLayer.get(layer.id).push(layout.id) + } + } + + + let popularLayerCutoff = 2; + const popupalLayers = allLayers.filter((layer) => themesPerLayer.get(layer.id)?.length >= 2) + .filter(layer => AllKnownLayers.priviliged_layers.indexOf(layer.id) < 0) + + return new Combine([ + new Title("Special and other useful layers", 1), + "MapComplete has a few data layers available in the theme which have special properties through builtin-hooks. Furthermore, there are some normal layers (which are built from normal Theme-config files) but are so general that they get a mention here.", + new Title("Priviliged layers", 1), + new List(AllKnownLayers.priviliged_layers.map(id => "[" + id + "](#" + id + ")")), + ...AllKnownLayers.priviliged_layers + .map(id => AllKnownLayers.sharedLayers.get(id)) + .map((l) => l.GenerateDocumentation(themesPerLayer.get(l.id), AllKnownLayers.added_by_default.indexOf(l.id) >= 0, AllKnownLayers.no_include.indexOf(l.id) < 0)), + new Title("Frequently reused layers", 1), + "The following layers are used by at least "+popularLayerCutoff+" mapcomplete themes and might be interesting for your custom theme too", + new List(popupalLayers.map(layer => "[" + layer.id + "](#" + layer.id + ")")), + ...popupalLayers.map((layer) => layer.GenerateDocumentation(themesPerLayer.get(layer.id))) + ]) + + + } + private static GenerateOrderedList(allKnownLayouts: Map): LayoutConfig[] { const keys = ["personal", "cyclofix", "hailhydrant", "bookcases", "toilets", "aed"] const list = [] diff --git a/Customizations/SharedTagRenderings.ts b/Customizations/SharedTagRenderings.ts index 035a61dcc4..4344b6e893 100644 --- a/Customizations/SharedTagRenderings.ts +++ b/Customizations/SharedTagRenderings.ts @@ -15,7 +15,7 @@ export default class SharedTagRenderings { const d = new Map() for (const key of Array.from(configJsons.keys())) { try { - d.set(key, new TagRenderingConfig(configJsons.get(key), undefined, `SharedTagRenderings.${key}`)) + d.set(key, new TagRenderingConfig(configJsons.get(key), `SharedTagRenderings.${key}`)) } catch (e) { if (!Utils.runningFromConsole) { console.error("BUG: could not parse", key, " from questions.json or icons.json - this error happened during the build step of the SharedTagRenderings", e) @@ -37,8 +37,11 @@ export default class SharedTagRenderings { for (const key in icons) { dict.set(key, icons[key]) } + + dict.forEach((value, key) => value.id = key) return dict; } + } diff --git a/Docs/BuiltinLayers.md b/Docs/BuiltinLayers.md new file mode 100644 index 0000000000..78e563111e --- /dev/null +++ b/Docs/BuiltinLayers.md @@ -0,0 +1,236 @@ + + + Special and other useful layers +================================= + + MapComplete has a few data layers available in the theme which have special properties through builtin-hooks. Furthermore, there are some normal layers (which are built from normal Theme-config files) but are so general that they get a mention here. + + Priviliged layers +=================== + + + + - [gps_location](#gps_location) + - [home_location](#home_location) + - [gps_track](#gps_track) + - [type_node](#type_node) + - [conflation](#conflation) + - [left_right_style](#left_right_style) + + +### gps_location + + + +Meta layer showing the current location of the user. Add this to your theme and override the icon to change the appearance of the current location. The object will always have `id=gps` and will have _all_ the properties included in the [`Coordinates`-object](https://developer.mozilla.org/en-US/docs/Web/API/GeolocationCoordinates) returned by the browser. + +[Go to the source code](../assets/layers/gps_location/gps_location.json) + + + + - **This layer is included automatically in every theme. This layer might contain no points** + - Not clickable by default. If you import this layer in your theme, override `title` to make this clickable + - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` + + +### home_location + + + +Meta layer showing the home location of the user. The home location can be set in the [profile settings](https://www.openstreetmap.org/profile/edit) of OpenStreetMap. + +[Go to the source code](../assets/layers/home_location/home_location.json) + + + + - **This layer is included automatically in every theme. This layer might contain no points** + - Not clickable by default. If you import this layer in your theme, override `title` to make this clickable + - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` + + +### gps_track + + + +Meta layer showing the previou locations of the user. Add this to your theme and override the icon to change the appearance of the current location. + +[Go to the source code](../assets/layers/gps_track/gps_track.json) + + + + - **This layer is included automatically in every theme. This layer might contain no points** + - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` + + +### type_node + + + +This is a priviliged meta_layer which exports _every_ point in OSM. This only works if zoomed below the point that the full tile is loaded (and not loaded via Overpass). Note that this point will also contain a property `parent_ways` which contains all the ways this node is part of as a list. This is mainly used for extremely specialized themes, which do advanced conflations. Expert use only. + +[Go to the source code](../assets/layers/type_node/type_node.json) + + + + - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` + + +### conflation + + + +If the import-button is set to conflate two ways, a preview is shown. This layer defines how this preview is rendered. This layer cannot be included in a theme. + +[Go to the source code](../assets/layers/conflation/conflation.json) + + + + - This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing a minimap with custom data. + + +### left_right_style + + + +Special meta-style which will show one single line, either on the left or on the right depending on the id. This is used in the small popups with left_right roads. Cannot be included in a theme + +[Go to the source code](../assets/layers/left_right_style/left_right_style.json) + + + + - This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing a minimap with custom data. + + + Frequently reused layers +========================== + + The following layers are used by at least 2 mapcomplete themes and might be interesting for your custom theme too + + - [bicycle_library](#bicycle_library) + - [drinking_water](#drinking_water) + - [food](#food) + - [map](#map) + - [all_streets](#all_streets) + + +### bicycle_library + + + +A facility where bicycles can be lent for longer period of times + +[Go to the source code](../assets/layers/bicycle_library/bicycle_library.json) + + + + + + + + +#### Themes using this layer + + + + + + - [bicyclelib](https://mapcomplete.osm.be/bicyclelib) + - [cyclofix](https://mapcomplete.osm.be/cyclofix) + + +### drinking_water + + + +[Go to the source code](../assets/layers/drinking_water/drinking_water.json) + + + + + + + + +#### Themes using this layer + + + + + + - [cyclofix](https://mapcomplete.osm.be/cyclofix) + - [drinking_water](https://mapcomplete.osm.be/drinking_water) + - [nature](https://mapcomplete.osm.be/nature) + + +### food + + + +[Go to the source code](../assets/layers/food/food.json) + + + + + + + + +#### Themes using this layer + + + + + + - [food](https://mapcomplete.osm.be/food) + - [fritures](https://mapcomplete.osm.be/fritures) + + +### map + + + +A map, meant for tourists which is permanently installed in the public space + +[Go to the source code](../assets/layers/map/map.json) + + + + + + + + +#### Themes using this layer + + + + + + - [maps](https://mapcomplete.osm.be/maps) + - [nature](https://mapcomplete.osm.be/nature) + + +### all_streets + + + +[Go to the source code](../assets/layers/all_streets/all_streets.json) + + + + - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` + + + + +#### Themes using this layer + + + + + + - [cyclestreets](https://mapcomplete.osm.be/cyclestreets) + - [street_lighting](https://mapcomplete.osm.be/street_lighting) + + +This document is autogenerated from AllKnownLayers.ts \ No newline at end of file diff --git a/Docs/CalculatedTags.md b/Docs/CalculatedTags.md index b9bfe21042..91b0dd568b 100644 --- a/Docs/CalculatedTags.md +++ b/Docs/CalculatedTags.md @@ -1,4 +1,5 @@ + Metatags ========== @@ -11,6 +12,7 @@ The are calculated automatically on every feature when the data arrives in the w **Hint:** when using metatags, add the [query parameter](URL_Parameters.md) `debug=true` to the URL. This will include a box in the popup for features which shows all the properties of the object + Metatags calculated by MapComplete ------------------------------------ @@ -19,6 +21,7 @@ The are calculated automatically on every feature when the data arrives in the w The following values are always calculated, by default, by MapComplete and are available automatically on all elements in every theme + ### _lat, _lon @@ -28,6 +31,7 @@ The latitude and longitude of the point (or centerpoint in the case of a way/are + ### _layer @@ -37,6 +41,7 @@ The layer-id to which this feature belongs. Note that this might be return any a + ### _surface, _surface:ha @@ -46,6 +51,7 @@ The surface area of the feature, in square meters and in hectare. Not set on poi This is a lazy metatag and is only calculated when needed + ### _length, _length:km @@ -55,6 +61,7 @@ The total length of a feature in meters (and in kilometers, rounded to one decim + ### Theme-defined keys @@ -64,6 +71,7 @@ If 'units' is defined in the layoutConfig, then this metatagger will rewrite the + ### _country @@ -73,6 +81,7 @@ The country code of the property (with latlon2country) + ### _isOpen, _isOpen:description @@ -82,6 +91,7 @@ If 'opening_hours' is present, it will add the current state of the feature (bei This is a lazy metatag and is only calculated when needed + ### _direction:numerical, _direction:leftright @@ -91,6 +101,7 @@ _direction:numerical is a normalized, numerical direction based on 'camera:direc + ### _now:date, _now:datetime, _loaded:date, _loaded:_datetime @@ -100,7 +111,8 @@ Adds the time that the data got loaded - pretty much the time of downloading fro -### _last_edit:contributor, _last_edit:contributor:uid, _last_edit:changeset, _last_edit:timestamp, _version_number + +### _last_edit:contributor, _last_edit:contributor:uid, _last_edit:changeset, _last_edit:timestamp, _version_number, _backend @@ -109,6 +121,17 @@ Information about the last edit of this object. + +### sidewalk:left, sidewalk:right, generic_key:left:property, generic_key:right:property + + + +Rewrites tags from 'generic_key:both:property' as 'generic_key:left:property' and 'generic_key:right:property' (and similar for sidewalk tagging). Note that this rewritten tags _will be reuploaded on a change_. To prevent to much unrelated retagging, this is only enabled if the layer has at least some lineRenderings with offset defined + + + + + Calculating tags with Javascript ---------------------------------- @@ -157,12 +180,14 @@ The above code will be executed for every feature in the layer. The feature is a Some advanced functions are available on **feat** as well: - - distanceTo - - overlapWith - - closest - - closestn - - memberships + - [distanceTo](#distanceTo) + - [overlapWith](#overlapWith) + - [closest](#closest) + - [closestn](#closestn) + - [memberships](#memberships) + - [get](#get) + ### distanceTo Calculates the distance between the feature and a specified point in kilometer. The input should either be a pair of coordinates, a geojson feature or the ID of an object @@ -170,20 +195,26 @@ Some advanced functions are available on **feat** as well: 0. feature OR featureID OR longitude 1. undefined OR latitude + ### overlapWith - Gives a list of features from the specified layer which this feature (partly) overlaps with. If the current feature is a point, all features that embed the point are given. The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point. + Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well.If the current feature is a point, all features that this point is embeded in are given. + +The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point. +The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')` 0. ...layerIds - one or more layer ids of the layer from which every feature is checked for overlap) + ### closest Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. In the case of ways/polygons, only the centerpoint is considered. Returns a single geojson feature or undefined if nothing is found (or not yet laoded) 0. list of features or a layer name or '*' to get all features + ### closestn Given either a list of geojson features or a single layer name, gives the n closest objects which are nearest to the feature (excluding the feature itself). In the case of ways/polygons, only the centerpoint is considered. Returns a list of `{feat: geojson, distance:number}` the empty list if nothing is found (or not yet loaded) @@ -195,6 +226,7 @@ If a 'unique tag key' is given, the tag with this key will only appear once (e.g 2. unique tag key (optional) 3. maxDistanceInMeters (optional) + ### memberships Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. @@ -202,4 +234,13 @@ If a 'unique tag key' is given, the tag with this key will only appear once (e.g For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')` - Generated from SimpleMetaTagger, ExtraFunction \ No newline at end of file + + +### get + + Gets the property of the feature, parses it (as JSON) and returns it. Might return 'undefined' if not defined, null, ... + + 0. key + + +This document is autogenerated from SimpleMetaTagger, ExtraFunction \ No newline at end of file diff --git a/Docs/ContributorRights.md b/Docs/ContributorRights.md new file mode 100644 index 0000000000..c9257350de --- /dev/null +++ b/Docs/ContributorRights.md @@ -0,0 +1,42 @@ +Rights of contributors +====================== + +If a contributor is quite active within MapComplete, this contributor might be granted access to the main repository. + +If you have access to the repository, you can make a fork of an already existing branch and push this new branch to +github. This means that this branch will be _automatically built_ and be **deployed** +to `https://pietervdvn.github.io/mc/`. You can see the deploy process +on [Github Actions](https://github.com/pietervdvn/MapComplete/actions). Don't worry about pushing too much. These +deploys are free and totally automatic. They might fail if something is wrong, but this will hinder no-one. + +Additionaly, some other maintainer might step in and merge the latest develop with your branch, making later pull +requests easier. + +Don't worry about bugs +---------------------- + +As a non-admin contributor, you can _not_ make changes to the `master` nor to the `develop` branch. This is because, as +soon as master is changed, this is built and deployed on `mapcomplete.osm.be`, which a lot of people use. An error there +will cause a lot of grieve. + +A push on `develop` is automatically deployed to [pietervdvn.github.io/mc/develop] and is used by quite some people to. +People using this version should know that this is a testing ground for new features and might contain a bug every now +and then. + +In other words, to get your theme deployed on the main instances, you'll still have to create a pull request. The +maintainers will then doublecheck and pull it in. + +If you have a local repository +------------------------------ + +If you have made a fork earlier and have received contributor rights, you need to tell your local git repository that +pushing to the main repository is possible. + +To do this: + +1. type `git remote add upstream git@github.com:pietervdvn/MapComplete` +2. Run `git push upstream` to push your latest changes to the main repo (and not your fork). Running `git push` will + push to your fork. + +Alternatively, if you don't have any unmerged changes, you can remove your local copy and clone `pietervdvn/MapComplete` +again to start fresh. \ No newline at end of file diff --git a/Docs/Development_deployment.md b/Docs/Development_deployment.md index 2bf304508f..30e14a4528 100644 --- a/Docs/Development_deployment.md +++ b/Docs/Development_deployment.md @@ -28,14 +28,15 @@ To develop and build MapComplete, you 0. Make a fork and clone the repository. 0. Install the nodejs version specified in [.tool-versions](./.tool-versions) - - On linux: install npm first `sudo apt install npm`, then install `n` using npm: ` npm install -g n`, which can then install node with `n install ` - - You can [use asdf to manage your runtime versions](https://asdf-vm.com/). + - On linux: install npm first `sudo apt install npm`, then install `n` using npm: ` npm install -g n`, which can + then install node with `n install ` + - You can [use asdf to manage your runtime versions](https://asdf-vm.com/). 0. Install `npm`. Linux: `sudo apt install npm` (or your favourite package manager), Windows: install nodeJS: https://nodejs.org/en/download/ 0. On iOS, install `wget` (`brew install wget`) 0. Run `npm run init` which … - - runs `npm install` - - generates some additional dependencies and files + - runs `npm install` + - generates some additional dependencies and files 0. Run `npm run start` to host a local testversion at http://localhost:1234/index.html 0. By default, a landing page with available themes is served. In order to load a single theme, use `layout=themename` or `userlayout=true#` as [Query parameter](URL_Parameters.md). Note that the shorter URLs ( @@ -106,7 +107,8 @@ Try removing `node_modules`, `package-lock.json` and `.cache` Misc setup ---------- -The json-git-merger is used to quickly merge translation files, [documentation here](https://github.com/jonatanpedersen/git-json-merge#single-project--directory) +~~The json-git-merger is used to quickly merge translation files, [documentation here](https://github.com/jonatanpedersen/git-json-merge#single-project--directory).~~ +This merge driver is broken and would sometimes drop new questions or duplicate them... Not a good idea! Overview of package.json-scripts -------------------------------- diff --git a/Docs/Making_Your_Own_Theme.md b/Docs/Making_Your_Own_Theme.md index dc6cb2eb4e..9b206e4452 100644 --- a/Docs/Making_Your_Own_Theme.md +++ b/Docs/Making_Your_Own_Theme.md @@ -105,11 +105,68 @@ Every field is documented in the source code itself - you can find them here: - [The `TagRendering`](https://github.com/pietervdvn/MapComplete/blob/master/Models/ThemeConfig/Json/TagRenderingConfigJson.ts) - At last, the exact semantics of tags is documented [here](Tags_format.md) +A JSON-schema file is available in Docs/Schemas - use LayoutConfig.schema.json to validate a theme file. + ### MetaTags There are few tags available that are calculated for convenience - e.g. the country an object is located at. [An overview of all these metatags is available here](Docs/CalculatedTags.md) + +### TagRendering groups + +A tagRendering can have a `group`-attribute, which acts as a tag. +All tagRenderings with the same group name will be rendered together, in the same order as they were defined. + +For example, if the defined tagrenderings have groups `A A B A A B B B`, the group order is `A B` and first all tagrenderings from group A will be rendered (thus numbers 0, 1, 3 and 4) followed by the question box for this group. +Then, all the tagRenderings for group B will be shown, thus number 2, 5, 6 and 7, again followed by their questionbox. + +Additionally, every tagrendering will receive a the groupname as class in the HTML, which can be used to hook up custom CSS. + +If no group tag is given, the group is `` (empty string) + +### Deciding the questions position + +By default, the questions are shown just beneath their group. + +To override this behaviour, one can add a tagrendering with id `questions` to move the questions up. + +To add a title to the questions, one can add a `render` and a condition. + +To change the behaviour of the questionbox to show _all_ questions at once, one can use a helperArgs in the freeform field with option `showAllQuestions`. + +For example, to show the questions on top, use: + +``` +"tagRenderings": [ + { "id": "questions" } + { ... some tagrendering ... } + { ... more tagrendering ...} +] +``` + +To show _all_ the questions of a group at once in the middle of the tagrenderings, with a header, use: + +``` +"tagRenderings": [ + { + "id": "questions" , + "group": "groupname", + "render": { + "en": "

Technical questions

The following questions are very technical!
{questions} + }, + "freeform": { + "key": "questions", + "helperArgs": { + "showAllQuestions": true + } + } + } + { ... some tagrendering ... } + { ... more tagrendering ...} +] +``` + Some hints ------------ @@ -173,16 +230,7 @@ Instead, make one layer for one kind of object and change the icon based on attr Using layers as filters - this doesn't work! -_All_ data is downloaded in one go and cached locally first. The layer selection (bottom left of the live app) then -selects _anything_ that matches the criteria. This match is then passed of to the rendering layer, which selects the -layer independently. This means that a feature can show up, even if it's layer is unselected! - -For example, in the [cyclofix-theme](https://mapcomplete.osm.org/cyclofix), there is the layer with _bike-wash_ for do -it yourself bikecleaning - points marked with `service:bicycle:cleaning`. However, a bicycle repair shop can offer this -service too! - -If all the layers are deselected except the bike wash layer, a shop having this tag will still match and will still show -up as shop. +Use the `filter`-functionality instead ### Not reading the .JSON-specs diff --git a/Docs/Misc/geolocation_button.gv.svg b/Docs/Misc/geolocation_button.gv.svg index 6dbf788489..5fd2710d0e 100644 --- a/Docs/Misc/geolocation_button.gv.svg +++ b/Docs/Misc/geolocation_button.gv.svg @@ -1,145 +1,181 @@ + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> - -G - - - -init - -init - - - -denied - -denied - - - -init->denied - - -geolocation permanently denied - - - -getting_location - -getting_location - - - -init->getting_location - - -previously granted flag set - - - -idle - -idle - - - -init->idle - - -previously granted flag unset - - - -location_found - -location_found - - - -getting_location->location_found - - -location found - - - -request_permission - -request_permission - - - -idle->request_permission - - -on click - - - -request_permission->denied - - -permanently denied - - - -request_permission->getting_location - - -granted (sets flag) - - - -request_permission->idle - - -not granted - - - -open_lock - -open_lock - - - -location_found->open_lock - - -on click (zooms to location) - - - -open_lock->location_found - - -after 3 sec - - - -closed_lock - -closed_lock - - - -open_lock->closed_lock - - -on click (locks zoom to location) - - - -closed_lock->location_found - - -on click - - + viewBox="0.00 0.00 664.25 566.00" xmlns="http://www.w3.org/2000/svg"> + + G + + + + init + + init + + + + denied + + denied + + + + init->denied + + + geolocation + permanently denied + + + + + getting_location + + + getting_location + + + + + init->getting_location + + + previously + granted flag set + + + + + idle + + idle + + + + init->idle + + + previously + granted flag unset + + + + + location_found + + + location_found + + + + + getting_location->location_found + + + location + found + + + + + request_permission + + + request_permission + + + + + idle->request_permission + + + on click + + + + request_permission->denied + + + permanently + denied + + + + + request_permission->getting_location + + + granted (sets + flag) + + + + + request_permission->idle + + + not granted + + + + + open_lock + + open_lock + + + + + location_found->open_lock + + + on click (zooms + to location) + + + + + open_lock->location_found + + + after 3 sec + + + + + closed_lock + + closed_lock + + + + + open_lock->closed_lock + + + on click (locks + zoom to location) + + + + + closed_lock->location_found + + + on click + + diff --git a/Docs/Release_Notes.md b/Docs/Release_Notes.md index c6f0ac35dc..e352720c2e 100644 --- a/Docs/Release_Notes.md +++ b/Docs/Release_Notes.md @@ -6,13 +6,15 @@ Some highlights of new releases. 0.10 ---- -The 0.10 version contains a lot of refactorings on various core of the application, namely in the rendering stack, the fetching of data and uploading. +The 0.10 version contains a lot of refactorings on various core of the application, namely in the rendering stack, the +fetching of data and uploading. Some highlights are: 1. The addition of fallback overpass servers 2. Fetching data from OSM directly (especially useful in the personal theme) -3. Splitting all the features per tile (with a maximum amount of features per tile, splitting further if needed), making everything a ton faster +3. Splitting all the features per tile (with a maximum amount of features per tile, splitting further if needed), making + everything a ton faster 4. If a tile has too much features, the featuers are not shown. Instead, a rectangle with the feature amount is shown. Furthermore, it contains a few new themes and theme updates: @@ -31,9 +33,8 @@ Other various small improvements: 0.8 and 0.9 ----------- -Addition of filters per layer -Addition of a download-as-pdf for select themes -Addition of a download-as-geojson and download-as-csv for select themes +Addition of filters per layer Addition of a download-as-pdf for select themes Addition of a download-as-geojson and +download-as-csv for select themes ... diff --git a/Docs/Schemas/AndOrTagConfigJson.schema.json b/Docs/Schemas/AndOrTagConfigJson.schema.json new file mode 100644 index 0000000000..a6214c2ea0 --- /dev/null +++ b/Docs/Schemas/AndOrTagConfigJson.schema.json @@ -0,0 +1,39 @@ +{ + "$ref": "#/definitions/AndOrTagConfigJson", + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + }, + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/AndOrTagConfigJsonJSC.ts b/Docs/Schemas/AndOrTagConfigJsonJSC.ts new file mode 100644 index 0000000000..6600f85021 --- /dev/null +++ b/Docs/Schemas/AndOrTagConfigJsonJSC.ts @@ -0,0 +1,37 @@ +export default { + "$ref": "#/definitions/AndOrTagConfigJson", + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/DeleteConfigJson.schema.json b/Docs/Schemas/DeleteConfigJson.schema.json new file mode 100644 index 0000000000..bdaca19eda --- /dev/null +++ b/Docs/Schemas/DeleteConfigJson.schema.json @@ -0,0 +1,93 @@ +{ + "type": "object", + "properties": { + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } + }, + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } + }, + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" + } + }, + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + }, + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/DeleteConfigJsonJSC.ts b/Docs/Schemas/DeleteConfigJsonJSC.ts new file mode 100644 index 0000000000..bdc96c0c48 --- /dev/null +++ b/Docs/Schemas/DeleteConfigJsonJSC.ts @@ -0,0 +1,91 @@ +export default { + "type": "object", + "properties": { + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } + }, + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } + }, + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" + } + }, + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/FilterConfigJson.schema.json b/Docs/Schemas/FilterConfigJson.schema.json new file mode 100644 index 0000000000..da7c9c8f06 --- /dev/null +++ b/Docs/Schemas/FilterConfigJson.schema.json @@ -0,0 +1,72 @@ +{ + "type": "object", + "properties": { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", + "type": "string" + }, + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } + } + }, + "required": [ + "id", + "options" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + }, + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/FilterConfigJsonJSC.ts b/Docs/Schemas/FilterConfigJsonJSC.ts new file mode 100644 index 0000000000..b2f245b1b5 --- /dev/null +++ b/Docs/Schemas/FilterConfigJsonJSC.ts @@ -0,0 +1,70 @@ +export default { + "type": "object", + "properties": { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", + "type": "string" + }, + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } + } + }, + "required": [ + "id", + "options" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/LayerConfigJson.schema.json b/Docs/Schemas/LayerConfigJson.schema.json new file mode 100644 index 0000000000..471fd02820 --- /dev/null +++ b/Docs/Schemas/LayerConfigJson.schema.json @@ -0,0 +1,900 @@ +{ + "description": "Configuration for a single layer", + "type": "object", + "properties": { + "id": { + "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", + "type": "string" + }, + "name": { + "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control" + }, + "description": { + "description": "A description for this layer.\nShown in the layer selections and in the personel theme" + }, + "source": { + "description": "This determines where the data for the layer is fetched.\nThere are some options:\n\n# Query OSM directly\nsource: {osmTags: \"key=value\"}\n will fetch all objects with given tags from OSM.\n Currently, this will create a query to overpass and fetch the data - in the future this might fetch from the OSM API\n\n# Query OSM Via the overpass API with a custom script\nsource: {overpassScript: \"\"} when you want to do special things. _This should be really rare_.\n This means that the data will be pulled from overpass with this script, and will ignore the osmTags for the query\n However, for the rest of the pipeline, the OsmTags will _still_ be used. This is important to enable layers etc...\n\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\nSome API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nNote that both geojson-options might set a flag 'isOsmCache' indicating that the data originally comes from OSM too\n\n\nNOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: \"key=value\"}\n While still supported, this is considered deprecated", + "anyOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "overpassScript": { + "type": "string" + } + }, + "required": [ + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "geoJson": { + "type": "string" + }, + "geoJsonZoomLevel": { + "type": "number" + }, + "isOsmCache": { + "type": "boolean" + }, + "mercatorCrs": { + "type": "boolean" + } + }, + "required": [ + "geoJson", + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + } + ] + }, + "calculatedTags": { + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]", + "type": "array", + "items": { + "type": "string" + } + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", + "type": "boolean" + }, + "isShown": { + "description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", + "$ref": "#/definitions/TagRenderingConfigJson" + }, + "minzoom": { + "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", + "type": "number" + }, + "minzoomVisible": { + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", + "type": "number" + }, + "title": { + "description": "The title shown in a popup for elements of this layer.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "titleIcons": { + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "mapRendering": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/default_3" + }, + { + "$ref": "#/definitions/default_4" + } + ] + } + }, + "passAllFeatures": { + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", + "type": "boolean" + }, + "presets": { + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "description": "The title - shown on the 'add-new'-button." + }, + "tags": { + "description": "The tags to add. It determines the icon too", + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)" + }, + "preciseInput": { + "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", + "anyOf": [ + { + "type": "object", + "properties": { + "preferredBackground": { + "description": "The type of background picture", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "snapToLayer": { + "description": "If specified, these layers will be shown to and the new point will be snapped towards it", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "maxSnapDistance": { + "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", + "type": "number" + } + }, + "required": [ + "preferredBackground" + ] + }, + { + "enum": [ + true + ], + "type": "boolean" + } + ] + } + }, + "required": [ + "tags", + "title" + ] + } + }, + "tagRenderings": { + "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "object", + "properties": { + "rewrite": { + "type": "array", + "items": { + "type": "object", + "properties": { + "sourceString": { + "type": "string" + }, + "into": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "into", + "sourceString" + ] + } + }, + "renderings": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + } + }, + "required": [ + "renderings", + "rewrite" + ] + }, + { + "type": "string" + } + ] + } + }, + "filter": { + "description": "All the extra questions for filtering", + "type": "array", + "items": { + "$ref": "#/definitions/default" + } + }, + "deletion": { + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", + "anyOf": [ + { + "$ref": "#/definitions/DeleteConfigJson" + }, + { + "type": "boolean" + } + ] + }, + "allowMove": { + "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", + "anyOf": [ + { + "$ref": "#/definitions/default_2" + }, + { + "type": "boolean" + } + ] + }, + "allowSplit": { + "description": "IF set, a 'split this road' button is shown", + "type": "boolean" + }, + "units": { + "description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given", + "type": "array", + "items": { + "$ref": "#/definitions/default_1" + } + } + }, + "required": [ + "id", + "mapRendering", + "source" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + }, + "additionalProperties": false + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ], + "additionalProperties": false + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + }, + "default_3": { + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], + "type": "string" + } + }, + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] + } + }, + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" + ], + "additionalProperties": false + }, + "default_4": { + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "width": { + "description": "The stroke-width for way-elements", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } + ] + } + }, + "additionalProperties": false + }, + "default": { + "type": "object", + "properties": { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", + "type": "string" + }, + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } + } + }, + "required": [ + "id", + "options" + ], + "additionalProperties": false + }, + "DeleteConfigJson": { + "type": "object", + "properties": { + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } + }, + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } + }, + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" + } + }, + "additionalProperties": false + }, + "default_2": { + "type": "object", + "properties": { + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" + }, + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" + } + }, + "additionalProperties": false + }, + "default_1": { + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { + "type": "string" + } + }, + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } + } + }, + "required": [ + "applicableUnits", + "appliesToKey" + ], + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/LayerConfigJsonJSC.ts b/Docs/Schemas/LayerConfigJsonJSC.ts new file mode 100644 index 0000000000..3f72a2e974 --- /dev/null +++ b/Docs/Schemas/LayerConfigJsonJSC.ts @@ -0,0 +1,890 @@ +export default { + "description": "Configuration for a single layer", + "type": "object", + "properties": { + "id": { + "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", + "type": "string" + }, + "name": { + "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control" + }, + "description": { + "description": "A description for this layer.\nShown in the layer selections and in the personel theme" + }, + "source": { + "description": "This determines where the data for the layer is fetched.\nThere are some options:\n\n# Query OSM directly\nsource: {osmTags: \"key=value\"}\n will fetch all objects with given tags from OSM.\n Currently, this will create a query to overpass and fetch the data - in the future this might fetch from the OSM API\n\n# Query OSM Via the overpass API with a custom script\nsource: {overpassScript: \"\"} when you want to do special things. _This should be really rare_.\n This means that the data will be pulled from overpass with this script, and will ignore the osmTags for the query\n However, for the rest of the pipeline, the OsmTags will _still_ be used. This is important to enable layers etc...\n\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\nSome API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nNote that both geojson-options might set a flag 'isOsmCache' indicating that the data originally comes from OSM too\n\n\nNOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: \"key=value\"}\n While still supported, this is considered deprecated", + "anyOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "overpassScript": { + "type": "string" + } + }, + "required": [ + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "geoJson": { + "type": "string" + }, + "geoJsonZoomLevel": { + "type": "number" + }, + "isOsmCache": { + "type": "boolean" + }, + "mercatorCrs": { + "type": "boolean" + } + }, + "required": [ + "geoJson", + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + } + ] + }, + "calculatedTags": { + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]", + "type": "array", + "items": { + "type": "string" + } + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", + "type": "boolean" + }, + "isShown": { + "description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", + "$ref": "#/definitions/TagRenderingConfigJson" + }, + "minzoom": { + "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", + "type": "number" + }, + "minzoomVisible": { + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", + "type": "number" + }, + "title": { + "description": "The title shown in a popup for elements of this layer.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "titleIcons": { + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "mapRendering": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/default_3" + }, + { + "$ref": "#/definitions/default_4" + } + ] + } + }, + "passAllFeatures": { + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", + "type": "boolean" + }, + "presets": { + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "description": "The title - shown on the 'add-new'-button." + }, + "tags": { + "description": "The tags to add. It determines the icon too", + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)" + }, + "preciseInput": { + "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", + "anyOf": [ + { + "type": "object", + "properties": { + "preferredBackground": { + "description": "The type of background picture", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "snapToLayer": { + "description": "If specified, these layers will be shown to and the new point will be snapped towards it", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "maxSnapDistance": { + "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", + "type": "number" + } + }, + "required": [ + "preferredBackground" + ] + }, + { + "enum": [ + true + ], + "type": "boolean" + } + ] + } + }, + "required": [ + "tags", + "title" + ] + } + }, + "tagRenderings": { + "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "object", + "properties": { + "rewrite": { + "type": "array", + "items": { + "type": "object", + "properties": { + "sourceString": { + "type": "string" + }, + "into": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "into", + "sourceString" + ] + } + }, + "renderings": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + } + }, + "required": [ + "renderings", + "rewrite" + ] + }, + { + "type": "string" + } + ] + } + }, + "filter": { + "description": "All the extra questions for filtering", + "type": "array", + "items": { + "$ref": "#/definitions/default" + } + }, + "deletion": { + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", + "anyOf": [ + { + "$ref": "#/definitions/DeleteConfigJson" + }, + { + "type": "boolean" + } + ] + }, + "allowMove": { + "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", + "anyOf": [ + { + "$ref": "#/definitions/default_2" + }, + { + "type": "boolean" + } + ] + }, + "allowSplit": { + "description": "IF set, a 'split this road' button is shown", + "type": "boolean" + }, + "units": { + "description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given", + "type": "array", + "items": { + "$ref": "#/definitions/default_1" + } + } + }, + "required": [ + "id", + "mapRendering", + "source" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "default_3": { + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], + "type": "string" + } + }, + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] + } + }, + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" + ] + }, + "default_4": { + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "width": { + "description": "The stroke-width for way-elements", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } + ] + } + } + }, + "default": { + "type": "object", + "properties": { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", + "type": "string" + }, + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } + } + }, + "required": [ + "id", + "options" + ] + }, + "DeleteConfigJson": { + "type": "object", + "properties": { + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } + }, + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } + }, + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" + } + } + }, + "default_2": { + "type": "object", + "properties": { + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" + }, + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" + } + } + }, + "default_1": { + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { + "type": "string" + } + }, + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } + } + }, + "required": [ + "applicableUnits", + "appliesToKey" + ] + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/LayoutConfigJson.schema.json b/Docs/Schemas/LayoutConfigJson.schema.json new file mode 100644 index 0000000000..0acf04ad5d --- /dev/null +++ b/Docs/Schemas/LayoutConfigJson.schema.json @@ -0,0 +1,1215 @@ +{ + "description": "Defines the entire theme.\n\nA theme is the collection of the layers that are shown; the intro text, the icon, ...\nIt more or less defines the entire experience.\n\nMost of the fields defined here are metadata about the theme, such as its name, description, supported languages, default starting location, ...\n\nThe main chunk of the json will however be the 'layers'-array, where the details of your layers are.\n\nGeneral remark: a type (string | any) indicates either a fixed or a translatable string.", + "type": "object", + "properties": { + "id": { + "description": "The id of this layout.\n\nThis is used as hashtag in the changeset message, which will read something like \"Adding data with #mapcomplete for theme #\"\nMake sure it is something decent and descriptive, it should be a simple, lowercase string.\n\nOn official themes, it'll become the name of the page, e.g.\n'cyclestreets' which become 'cyclestreets.html'", + "type": "string" + }, + "credits": { + "description": "Who helped to create this theme and should be attributed?", + "type": "string" + }, + "maintainer": { + "description": "Who does maintian this preset?", + "type": "string" + }, + "version": { + "description": "A version number, either semantically or by date.\nShould be sortable, where the higher value is the later version", + "type": "string" + }, + "language": { + "description": "The supported language(s).\nThis should be a two-letter, lowercase code which identifies the language, e.g. \"en\", \"nl\", ...\nIf the theme supports multiple languages, use a list: `[\"en\",\"nl\",\"fr\"]` to allow the user to pick any of them", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "mustHaveLanguage": { + "description": "Only used in 'generateLayerOverview': if present, every translation will be checked to make sure it is fully translated", + "type": "array", + "items": { + "type": "string" + } + }, + "title": { + "description": "The title, as shown in the welcome message and the more-screen" + }, + "shortDescription": { + "description": "A short description, showed as social description and in the 'more theme'-buttons.\nNote that if this one is not defined, the first sentence of 'description' is used" + }, + "description": { + "description": "The description, as shown in the welcome message and the more-screen" + }, + "descriptionTail": { + "description": "A part of the description, shown under the login-button." + }, + "icon": { + "description": "The icon representing this theme.\nUsed as logo in the more-screen and (for official themes) as favicon, webmanifest logo, ...\nEither a URL or a base64 encoded value (which should include 'data:image/svg+xml;base64)", + "type": "string" + }, + "socialImage": { + "description": "Link to a 'social image' which is included as og:image-tag on official themes.\nUseful to share the theme on social media.\nSee https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit for more information", + "type": "string" + }, + "startZoom": { + "description": "Default location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used", + "type": "number" + }, + "startLat": { + "type": "number" + }, + "startLon": { + "type": "number" + }, + "widenFactor": { + "description": "When a query is run, the data within bounds of the visible map is loaded.\nHowever, users tend to pan and zoom a lot. It is pretty annoying if every single pan means a reloading of the data.\nFor this, the bounds are widened in order to make a small pan still within bounds of the loaded data.\n\nIF widenfactor is 1, this feature is disabled. A recommended value is between 1 and 3", + "type": "number" + }, + "overpassMaxZoom": { + "description": "At low zoom levels, overpass is used to query features.\nAt high zoom level, the OSM api is used to fetch one or more BBOX aligning with a slippy tile.\nThe overpassMaxZoom controls the flipoverpoint: if the zoom is this or lower, overpass is used.", + "type": "number" + }, + "osmApiTileSize": { + "description": "When the OSM-api is used to fetch features, it does so in a tiled fashion.\nThese tiles are using a ceratin zoom level, that can be controlled here\nDefault: overpassMaxZoom + 1", + "type": "number" + }, + "overrideAll": { + "description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer" + }, + "defaultBackgroundId": { + "description": "The id of the default background. BY default: vanilla OSM", + "type": "string" + }, + "tileLayerSources": { + "description": "Define some (overlay) slippy map tilesources", + "type": "array", + "items": { + "$ref": "#/definitions/default_5" + } + }, + "layers": { + "description": "The layers to display.\n\nEvery layer contains a description of which feature to display - the overpassTags which are queried.\nInstead of running one query for every layer, the query is fused.\n\nAfterwards, every layer is given the list of features.\nEvery layer takes away the features that match with them*, and give the leftovers to the next layers.\n\nThis implies that the _order_ of the layers is important in the case of features with the same tags;\nas the later layers might never receive their feature.\n\n*layers can also remove 'leftover'-features if the leftovers overlap with a feature in the layer itself\n\nNote that builtin layers can be reused. Either put in the name of the layer to reuse, or use {builtin: \"layername\", override: ...}\n\nThe 'override'-object will be copied over the original values of the layer, which allows to change certain aspects of the layer\n\nFor example: If you would like to use layer nature reserves, but only from a specific operator (eg. Natuurpunt) you would use the following in your theme:\n\n```\n\"layer\": {\n \"builtin\": \"nature_reserve\",\n \"override\": {\"source\": \n {\"osmTags\": {\n \"+and\":[\"operator=Natuurpunt\"]\n }\n }\n }\n}\n```\n\nIt's also possible to load multiple layers at once, for example, if you would like for both drinking water and benches to start at the zoomlevel at 12, you would use the following:\n\n```\n\"layer\": {\n \"builtin\": [\"benches\", \"drinking_water\"],\n \"override\": {\"minzoom\": 12}\n}\n```", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/LayerConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "clustering": { + "description": "If defined, data will be clustered.\nDefaults to {maxZoom: 16, minNeeded: 500}", + "type": "object", + "properties": { + "maxZoom": { + "description": "All zoom levels above 'maxzoom' are not clustered anymore.\nDefaults to 18", + "type": "number" + }, + "minNeededElements": { + "description": "The number of elements per tile needed to start clustering\nIf clustering is defined, defaults to 25", + "type": "number" + } + } + }, + "customCss": { + "description": "The URL of a custom CSS stylesheet to modify the layout", + "type": "string" + }, + "hideFromOverview": { + "description": "If set to true, this layout will not be shown in the overview with more themes", + "type": "boolean" + }, + "lockLocation": { + "description": "If set to true, the basemap will not scroll outside of the area visible on initial zoom.\nIf set to [[lat0, lon0], [lat1, lon1]], the map will not scroll outside of those bounds.\nOff by default, which will enable panning to the entire world", + "anyOf": [ + { + "type": "array", + "items": [ + { + "type": "array", + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "minItems": 2, + "maxItems": 2 + } + ], + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "number" + } + } + }, + { + "type": "boolean" + } + ] + }, + "enableUserBadge": { + "type": "boolean" + }, + "enableShareScreen": { + "type": "boolean" + }, + "enableMoreQuests": { + "type": "boolean" + }, + "enableLayers": { + "type": "boolean" + }, + "enableSearch": { + "type": "boolean" + }, + "enableAddNewPoints": { + "type": "boolean" + }, + "enableGeolocation": { + "type": "boolean" + }, + "enableBackgroundLayerSelection": { + "type": "boolean" + }, + "enableShowAllQuestions": { + "type": "boolean" + }, + "enableDownload": { + "type": "boolean" + }, + "enablePdfDownload": { + "type": "boolean" + }, + "enableIframePopout": { + "type": "boolean" + }, + "overpassUrl": { + "description": "Set one or more overpass URLs to use for this theme..", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "overpassTimeout": { + "description": "Set a different timeout for overpass queries - in seconds. Default: 30s", + "type": "number" + } + }, + "required": [ + "description", + "icon", + "id", + "language", + "layers", + "maintainer", + "startLat", + "startLon", + "startZoom", + "title", + "version" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + }, + "additionalProperties": false + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ], + "additionalProperties": false + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + }, + "default_3": { + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], + "type": "string" + } + }, + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] + } + }, + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" + ], + "additionalProperties": false + }, + "default_4": { + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "width": { + "description": "The stroke-width for way-elements", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } + ] + } + }, + "additionalProperties": false + }, + "default": { + "type": "object", + "properties": { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", + "type": "string" + }, + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } + } + }, + "required": [ + "id", + "options" + ], + "additionalProperties": false + }, + "DeleteConfigJson": { + "type": "object", + "properties": { + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } + }, + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } + }, + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" + } + }, + "additionalProperties": false + }, + "default_2": { + "type": "object", + "properties": { + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" + }, + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" + } + }, + "additionalProperties": false + }, + "default_1": { + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { + "type": "string" + } + }, + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } + } + }, + "required": [ + "applicableUnits", + "appliesToKey" + ], + "additionalProperties": false + }, + "default_5": { + "description": "Configuration for a tilesource config", + "type": "object", + "properties": { + "id": { + "description": "Id of this overlay, used in the URL-parameters to set the state", + "type": "string" + }, + "source": { + "description": "The path, where {x}, {y} and {z} will be substituted", + "type": "string" + }, + "isOverlay": { + "description": "Wether or not this is an overlay. Default: true", + "type": "boolean" + }, + "name": { + "description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled" + }, + "minZoom": { + "description": "Only visible at this or a higher zoom level", + "type": "number" + }, + "maxZoom": { + "description": "Only visible at this or a lower zoom level", + "type": "number" + }, + "defaultState": { + "description": "The default state, set to false to hide by default", + "type": "boolean" + } + }, + "required": [ + "defaultState", + "id", + "source" + ], + "additionalProperties": false + }, + "LayerConfigJson": { + "description": "Configuration for a single layer", + "type": "object", + "properties": { + "id": { + "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", + "type": "string" + }, + "name": { + "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control" + }, + "description": { + "description": "A description for this layer.\nShown in the layer selections and in the personel theme" + }, + "source": { + "description": "This determines where the data for the layer is fetched.\nThere are some options:\n\n# Query OSM directly\nsource: {osmTags: \"key=value\"}\n will fetch all objects with given tags from OSM.\n Currently, this will create a query to overpass and fetch the data - in the future this might fetch from the OSM API\n\n# Query OSM Via the overpass API with a custom script\nsource: {overpassScript: \"\"} when you want to do special things. _This should be really rare_.\n This means that the data will be pulled from overpass with this script, and will ignore the osmTags for the query\n However, for the rest of the pipeline, the OsmTags will _still_ be used. This is important to enable layers etc...\n\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\nSome API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nNote that both geojson-options might set a flag 'isOsmCache' indicating that the data originally comes from OSM too\n\n\nNOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: \"key=value\"}\n While still supported, this is considered deprecated", + "anyOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "overpassScript": { + "type": "string" + } + }, + "required": [ + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "geoJson": { + "type": "string" + }, + "geoJsonZoomLevel": { + "type": "number" + }, + "isOsmCache": { + "type": "boolean" + }, + "mercatorCrs": { + "type": "boolean" + } + }, + "required": [ + "geoJson", + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + } + ] + }, + "calculatedTags": { + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]", + "type": "array", + "items": { + "type": "string" + } + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", + "type": "boolean" + }, + "isShown": { + "description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", + "$ref": "#/definitions/TagRenderingConfigJson" + }, + "minzoom": { + "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", + "type": "number" + }, + "minzoomVisible": { + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", + "type": "number" + }, + "title": { + "description": "The title shown in a popup for elements of this layer.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "titleIcons": { + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "mapRendering": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/default_3" + }, + { + "$ref": "#/definitions/default_4" + } + ] + } + }, + "passAllFeatures": { + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", + "type": "boolean" + }, + "presets": { + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "description": "The title - shown on the 'add-new'-button." + }, + "tags": { + "description": "The tags to add. It determines the icon too", + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)" + }, + "preciseInput": { + "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", + "anyOf": [ + { + "type": "object", + "properties": { + "preferredBackground": { + "description": "The type of background picture", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "snapToLayer": { + "description": "If specified, these layers will be shown to and the new point will be snapped towards it", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "maxSnapDistance": { + "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", + "type": "number" + } + }, + "required": [ + "preferredBackground" + ] + }, + { + "enum": [ + true + ], + "type": "boolean" + } + ] + } + }, + "required": [ + "tags", + "title" + ] + } + }, + "tagRenderings": { + "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "object", + "properties": { + "rewrite": { + "type": "array", + "items": { + "type": "object", + "properties": { + "sourceString": { + "type": "string" + }, + "into": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "into", + "sourceString" + ] + } + }, + "renderings": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + } + }, + "required": [ + "renderings", + "rewrite" + ] + }, + { + "type": "string" + } + ] + } + }, + "filter": { + "description": "All the extra questions for filtering", + "type": "array", + "items": { + "$ref": "#/definitions/default" + } + }, + "deletion": { + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", + "anyOf": [ + { + "$ref": "#/definitions/DeleteConfigJson" + }, + { + "type": "boolean" + } + ] + }, + "allowMove": { + "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", + "anyOf": [ + { + "$ref": "#/definitions/default_2" + }, + { + "type": "boolean" + } + ] + }, + "allowSplit": { + "description": "IF set, a 'split this road' button is shown", + "type": "boolean" + }, + "units": { + "description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given", + "type": "array", + "items": { + "$ref": "#/definitions/default_1" + } + } + }, + "required": [ + "id", + "mapRendering", + "source" + ], + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/LayoutConfigJsonJSC.ts b/Docs/Schemas/LayoutConfigJsonJSC.ts new file mode 100644 index 0000000000..2c337340e2 --- /dev/null +++ b/Docs/Schemas/LayoutConfigJsonJSC.ts @@ -0,0 +1,1203 @@ +export default { + "description": "Defines the entire theme.\n\nA theme is the collection of the layers that are shown; the intro text, the icon, ...\nIt more or less defines the entire experience.\n\nMost of the fields defined here are metadata about the theme, such as its name, description, supported languages, default starting location, ...\n\nThe main chunk of the json will however be the 'layers'-array, where the details of your layers are.\n\nGeneral remark: a type (string | any) indicates either a fixed or a translatable string.", + "type": "object", + "properties": { + "id": { + "description": "The id of this layout.\n\nThis is used as hashtag in the changeset message, which will read something like \"Adding data with #mapcomplete for theme #\"\nMake sure it is something decent and descriptive, it should be a simple, lowercase string.\n\nOn official themes, it'll become the name of the page, e.g.\n'cyclestreets' which become 'cyclestreets.html'", + "type": "string" + }, + "credits": { + "description": "Who helped to create this theme and should be attributed?", + "type": "string" + }, + "maintainer": { + "description": "Who does maintian this preset?", + "type": "string" + }, + "version": { + "description": "A version number, either semantically or by date.\nShould be sortable, where the higher value is the later version", + "type": "string" + }, + "language": { + "description": "The supported language(s).\nThis should be a two-letter, lowercase code which identifies the language, e.g. \"en\", \"nl\", ...\nIf the theme supports multiple languages, use a list: `[\"en\",\"nl\",\"fr\"]` to allow the user to pick any of them", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "mustHaveLanguage": { + "description": "Only used in 'generateLayerOverview': if present, every translation will be checked to make sure it is fully translated", + "type": "array", + "items": { + "type": "string" + } + }, + "title": { + "description": "The title, as shown in the welcome message and the more-screen" + }, + "shortDescription": { + "description": "A short description, showed as social description and in the 'more theme'-buttons.\nNote that if this one is not defined, the first sentence of 'description' is used" + }, + "description": { + "description": "The description, as shown in the welcome message and the more-screen" + }, + "descriptionTail": { + "description": "A part of the description, shown under the login-button." + }, + "icon": { + "description": "The icon representing this theme.\nUsed as logo in the more-screen and (for official themes) as favicon, webmanifest logo, ...\nEither a URL or a base64 encoded value (which should include 'data:image/svg+xml;base64)", + "type": "string" + }, + "socialImage": { + "description": "Link to a 'social image' which is included as og:image-tag on official themes.\nUseful to share the theme on social media.\nSee https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit for more information", + "type": "string" + }, + "startZoom": { + "description": "Default location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used", + "type": "number" + }, + "startLat": { + "type": "number" + }, + "startLon": { + "type": "number" + }, + "widenFactor": { + "description": "When a query is run, the data within bounds of the visible map is loaded.\nHowever, users tend to pan and zoom a lot. It is pretty annoying if every single pan means a reloading of the data.\nFor this, the bounds are widened in order to make a small pan still within bounds of the loaded data.\n\nIF widenfactor is 1, this feature is disabled. A recommended value is between 1 and 3", + "type": "number" + }, + "overpassMaxZoom": { + "description": "At low zoom levels, overpass is used to query features.\nAt high zoom level, the OSM api is used to fetch one or more BBOX aligning with a slippy tile.\nThe overpassMaxZoom controls the flipoverpoint: if the zoom is this or lower, overpass is used.", + "type": "number" + }, + "osmApiTileSize": { + "description": "When the OSM-api is used to fetch features, it does so in a tiled fashion.\nThese tiles are using a ceratin zoom level, that can be controlled here\nDefault: overpassMaxZoom + 1", + "type": "number" + }, + "overrideAll": { + "description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer" + }, + "defaultBackgroundId": { + "description": "The id of the default background. BY default: vanilla OSM", + "type": "string" + }, + "tileLayerSources": { + "description": "Define some (overlay) slippy map tilesources", + "type": "array", + "items": { + "$ref": "#/definitions/default_5" + } + }, + "layers": { + "description": "The layers to display.\n\nEvery layer contains a description of which feature to display - the overpassTags which are queried.\nInstead of running one query for every layer, the query is fused.\n\nAfterwards, every layer is given the list of features.\nEvery layer takes away the features that match with them*, and give the leftovers to the next layers.\n\nThis implies that the _order_ of the layers is important in the case of features with the same tags;\nas the later layers might never receive their feature.\n\n*layers can also remove 'leftover'-features if the leftovers overlap with a feature in the layer itself\n\nNote that builtin layers can be reused. Either put in the name of the layer to reuse, or use {builtin: \"layername\", override: ...}\n\nThe 'override'-object will be copied over the original values of the layer, which allows to change certain aspects of the layer\n\nFor example: If you would like to use layer nature reserves, but only from a specific operator (eg. Natuurpunt) you would use the following in your theme:\n\n```\n\"layer\": {\n \"builtin\": \"nature_reserve\",\n \"override\": {\"source\": \n {\"osmTags\": {\n \"+and\":[\"operator=Natuurpunt\"]\n }\n }\n }\n}\n```\n\nIt's also possible to load multiple layers at once, for example, if you would like for both drinking water and benches to start at the zoomlevel at 12, you would use the following:\n\n```\n\"layer\": {\n \"builtin\": [\"benches\", \"drinking_water\"],\n \"override\": {\"minzoom\": 12}\n}\n```", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/LayerConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "clustering": { + "description": "If defined, data will be clustered.\nDefaults to {maxZoom: 16, minNeeded: 500}", + "type": "object", + "properties": { + "maxZoom": { + "description": "All zoom levels above 'maxzoom' are not clustered anymore.\nDefaults to 18", + "type": "number" + }, + "minNeededElements": { + "description": "The number of elements per tile needed to start clustering\nIf clustering is defined, defaults to 25", + "type": "number" + } + } + }, + "customCss": { + "description": "The URL of a custom CSS stylesheet to modify the layout", + "type": "string" + }, + "hideFromOverview": { + "description": "If set to true, this layout will not be shown in the overview with more themes", + "type": "boolean" + }, + "lockLocation": { + "description": "If set to true, the basemap will not scroll outside of the area visible on initial zoom.\nIf set to [[lat0, lon0], [lat1, lon1]], the map will not scroll outside of those bounds.\nOff by default, which will enable panning to the entire world", + "anyOf": [ + { + "type": "array", + "items": [ + { + "type": "array", + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "minItems": 2, + "maxItems": 2 + } + ], + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "number" + } + } + }, + { + "type": "boolean" + } + ] + }, + "enableUserBadge": { + "type": "boolean" + }, + "enableShareScreen": { + "type": "boolean" + }, + "enableMoreQuests": { + "type": "boolean" + }, + "enableLayers": { + "type": "boolean" + }, + "enableSearch": { + "type": "boolean" + }, + "enableAddNewPoints": { + "type": "boolean" + }, + "enableGeolocation": { + "type": "boolean" + }, + "enableBackgroundLayerSelection": { + "type": "boolean" + }, + "enableShowAllQuestions": { + "type": "boolean" + }, + "enableDownload": { + "type": "boolean" + }, + "enablePdfDownload": { + "type": "boolean" + }, + "enableIframePopout": { + "type": "boolean" + }, + "overpassUrl": { + "description": "Set one or more overpass URLs to use for this theme..", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "overpassTimeout": { + "description": "Set a different timeout for overpass queries - in seconds. Default: 30s", + "type": "number" + } + }, + "required": [ + "description", + "icon", + "id", + "language", + "layers", + "maintainer", + "startLat", + "startLon", + "startZoom", + "title", + "version" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "default_3": { + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], + "type": "string" + } + }, + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] + } + }, + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" + ] + }, + "default_4": { + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "width": { + "description": "The stroke-width for way-elements", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } + ] + } + } + }, + "default": { + "type": "object", + "properties": { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", + "type": "string" + }, + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } + } + }, + "required": [ + "id", + "options" + ] + }, + "DeleteConfigJson": { + "type": "object", + "properties": { + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } + }, + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } + }, + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" + } + } + }, + "default_2": { + "type": "object", + "properties": { + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" + }, + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" + } + } + }, + "default_1": { + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { + "type": "string" + } + }, + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } + } + }, + "required": [ + "applicableUnits", + "appliesToKey" + ] + }, + "default_5": { + "description": "Configuration for a tilesource config", + "type": "object", + "properties": { + "id": { + "description": "Id of this overlay, used in the URL-parameters to set the state", + "type": "string" + }, + "source": { + "description": "The path, where {x}, {y} and {z} will be substituted", + "type": "string" + }, + "isOverlay": { + "description": "Wether or not this is an overlay. Default: true", + "type": "boolean" + }, + "name": { + "description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled" + }, + "minZoom": { + "description": "Only visible at this or a higher zoom level", + "type": "number" + }, + "maxZoom": { + "description": "Only visible at this or a lower zoom level", + "type": "number" + }, + "defaultState": { + "description": "The default state, set to false to hide by default", + "type": "boolean" + } + }, + "required": [ + "defaultState", + "id", + "source" + ] + }, + "LayerConfigJson": { + "description": "Configuration for a single layer", + "type": "object", + "properties": { + "id": { + "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", + "type": "string" + }, + "name": { + "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control" + }, + "description": { + "description": "A description for this layer.\nShown in the layer selections and in the personel theme" + }, + "source": { + "description": "This determines where the data for the layer is fetched.\nThere are some options:\n\n# Query OSM directly\nsource: {osmTags: \"key=value\"}\n will fetch all objects with given tags from OSM.\n Currently, this will create a query to overpass and fetch the data - in the future this might fetch from the OSM API\n\n# Query OSM Via the overpass API with a custom script\nsource: {overpassScript: \"\"} when you want to do special things. _This should be really rare_.\n This means that the data will be pulled from overpass with this script, and will ignore the osmTags for the query\n However, for the rest of the pipeline, the OsmTags will _still_ be used. This is important to enable layers etc...\n\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\nSome API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nNote that both geojson-options might set a flag 'isOsmCache' indicating that the data originally comes from OSM too\n\n\nNOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: \"key=value\"}\n While still supported, this is considered deprecated", + "anyOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "overpassScript": { + "type": "string" + } + }, + "required": [ + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "geoJson": { + "type": "string" + }, + "geoJsonZoomLevel": { + "type": "number" + }, + "isOsmCache": { + "type": "boolean" + }, + "mercatorCrs": { + "type": "boolean" + } + }, + "required": [ + "geoJson", + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + } + ] + }, + "calculatedTags": { + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]", + "type": "array", + "items": { + "type": "string" + } + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", + "type": "boolean" + }, + "isShown": { + "description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", + "$ref": "#/definitions/TagRenderingConfigJson" + }, + "minzoom": { + "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", + "type": "number" + }, + "minzoomVisible": { + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", + "type": "number" + }, + "title": { + "description": "The title shown in a popup for elements of this layer.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "titleIcons": { + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "mapRendering": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/default_3" + }, + { + "$ref": "#/definitions/default_4" + } + ] + } + }, + "passAllFeatures": { + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", + "type": "boolean" + }, + "presets": { + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "description": "The title - shown on the 'add-new'-button." + }, + "tags": { + "description": "The tags to add. It determines the icon too", + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)" + }, + "preciseInput": { + "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", + "anyOf": [ + { + "type": "object", + "properties": { + "preferredBackground": { + "description": "The type of background picture", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "snapToLayer": { + "description": "If specified, these layers will be shown to and the new point will be snapped towards it", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "maxSnapDistance": { + "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", + "type": "number" + } + }, + "required": [ + "preferredBackground" + ] + }, + { + "enum": [ + true + ], + "type": "boolean" + } + ] + } + }, + "required": [ + "tags", + "title" + ] + } + }, + "tagRenderings": { + "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "object", + "properties": { + "rewrite": { + "type": "array", + "items": { + "type": "object", + "properties": { + "sourceString": { + "type": "string" + }, + "into": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "into", + "sourceString" + ] + } + }, + "renderings": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + } + }, + "required": [ + "renderings", + "rewrite" + ] + }, + { + "type": "string" + } + ] + } + }, + "filter": { + "description": "All the extra questions for filtering", + "type": "array", + "items": { + "$ref": "#/definitions/default" + } + }, + "deletion": { + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", + "anyOf": [ + { + "$ref": "#/definitions/DeleteConfigJson" + }, + { + "type": "boolean" + } + ] + }, + "allowMove": { + "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", + "anyOf": [ + { + "$ref": "#/definitions/default_2" + }, + { + "type": "boolean" + } + ] + }, + "allowSplit": { + "description": "IF set, a 'split this road' button is shown", + "type": "boolean" + }, + "units": { + "description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given", + "type": "array", + "items": { + "$ref": "#/definitions/default_1" + } + } + }, + "required": [ + "id", + "mapRendering", + "source" + ] + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/LineRenderingConfigJson.schema.json b/Docs/Schemas/LineRenderingConfigJson.schema.json new file mode 100644 index 0000000000..0f7289f025 --- /dev/null +++ b/Docs/Schemas/LineRenderingConfigJson.schema.json @@ -0,0 +1,293 @@ +{ + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "width": { + "description": "The stroke-width for way-elements", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } + ] + } + }, + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + }, + "additionalProperties": false + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ], + "additionalProperties": false + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/LineRenderingConfigJsonJSC.ts b/Docs/Schemas/LineRenderingConfigJsonJSC.ts new file mode 100644 index 0000000000..2c0642834f --- /dev/null +++ b/Docs/Schemas/LineRenderingConfigJsonJSC.ts @@ -0,0 +1,289 @@ +export default { + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "width": { + "description": "The stroke-width for way-elements", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } + ] + } + }, + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + } + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/MoveConfigJson.schema.json b/Docs/Schemas/MoveConfigJson.schema.json new file mode 100644 index 0000000000..74106b056d --- /dev/null +++ b/Docs/Schemas/MoveConfigJson.schema.json @@ -0,0 +1,87 @@ +{ + "type": "object", + "properties": { + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" + }, + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" + } + }, + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + }, + "additionalProperties": false + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ], + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/MoveConfigJsonJSC.ts b/Docs/Schemas/MoveConfigJsonJSC.ts new file mode 100644 index 0000000000..23f191109b --- /dev/null +++ b/Docs/Schemas/MoveConfigJsonJSC.ts @@ -0,0 +1,84 @@ +export default { + "type": "object", + "properties": { + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" + }, + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" + } + }, + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/PointRenderingConfigJson.schema.json b/Docs/Schemas/PointRenderingConfigJson.schema.json new file mode 100644 index 0000000000..03ec4cf3c5 --- /dev/null +++ b/Docs/Schemas/PointRenderingConfigJson.schema.json @@ -0,0 +1,305 @@ +{ + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], + "type": "string" + } + }, + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] + } + }, + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + }, + "additionalProperties": false + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ], + "additionalProperties": false + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/PointRenderingConfigJsonJSC.ts b/Docs/Schemas/PointRenderingConfigJsonJSC.ts new file mode 100644 index 0000000000..2e88c1cf83 --- /dev/null +++ b/Docs/Schemas/PointRenderingConfigJsonJSC.ts @@ -0,0 +1,301 @@ +export default { + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], + "type": "string" + } + }, + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] + } + }, + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + } + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/TagRenderingConfigJson.schema.json b/Docs/Schemas/TagRenderingConfigJson.schema.json new file mode 100644 index 0000000000..c330dbc058 --- /dev/null +++ b/Docs/Schemas/TagRenderingConfigJson.schema.json @@ -0,0 +1,167 @@ +{ + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + }, + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/TagRenderingConfigJsonJSC.ts b/Docs/Schemas/TagRenderingConfigJsonJSC.ts new file mode 100644 index 0000000000..bbc00373d2 --- /dev/null +++ b/Docs/Schemas/TagRenderingConfigJsonJSC.ts @@ -0,0 +1,165 @@ +export default { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/TilesourceConfigJson.schema.json b/Docs/Schemas/TilesourceConfigJson.schema.json new file mode 100644 index 0000000000..da181e8e54 --- /dev/null +++ b/Docs/Schemas/TilesourceConfigJson.schema.json @@ -0,0 +1,569 @@ +{ + "description": "Configuration for a tilesource config", + "type": "object", + "properties": { + "id": { + "description": "Id of this overlay, used in the URL-parameters to set the state", + "type": "string" + }, + "source": { + "description": "The path, where {x}, {y} and {z} will be substituted", + "type": "string" + }, + "isOverlay": { + "description": "Wether or not this is an overlay. Default: true", + "type": "boolean" + }, + "name": { + "description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled" + }, + "minZoom": { + "description": "Only visible at this or a higher zoom level", + "type": "number" + }, + "maxZoom": { + "description": "Only visible at this or a lower zoom level", + "type": "number" + }, + "defaultState": { + "description": "The default state, set to false to hide by default", + "type": "boolean" + } + }, + "required": [ + "defaultState", + "id", + "source" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + }, + "additionalProperties": false + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ], + "additionalProperties": false + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + }, + "default_3": { + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], + "type": "string" + } + }, + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] + } + }, + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" + ], + "additionalProperties": false + }, + "default_4": { + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "width": { + "description": "The stroke-width for way-elements", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } + ] + } + }, + "additionalProperties": false + }, + "default": { + "type": "object", + "properties": { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", + "type": "string" + }, + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } + } + }, + "required": [ + "id", + "options" + ], + "additionalProperties": false + }, + "DeleteConfigJson": { + "type": "object", + "properties": { + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } + }, + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } + }, + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" + } + }, + "additionalProperties": false + }, + "default_2": { + "type": "object", + "properties": { + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" + }, + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" + } + }, + "additionalProperties": false + }, + "default_1": { + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { + "type": "string" + } + }, + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } + } + }, + "required": [ + "applicableUnits", + "appliesToKey" + ], + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/TilesourceConfigJsonJSC.ts b/Docs/Schemas/TilesourceConfigJsonJSC.ts new file mode 100644 index 0000000000..a21c3f2ccb --- /dev/null +++ b/Docs/Schemas/TilesourceConfigJsonJSC.ts @@ -0,0 +1,559 @@ +export default { + "description": "Configuration for a tilesource config", + "type": "object", + "properties": { + "id": { + "description": "Id of this overlay, used in the URL-parameters to set the state", + "type": "string" + }, + "source": { + "description": "The path, where {x}, {y} and {z} will be substituted", + "type": "string" + }, + "isOverlay": { + "description": "Wether or not this is an overlay. Default: true", + "type": "boolean" + }, + "name": { + "description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled" + }, + "minZoom": { + "description": "Only visible at this or a higher zoom level", + "type": "number" + }, + "maxZoom": { + "description": "Only visible at this or a lower zoom level", + "type": "number" + }, + "defaultState": { + "description": "The default state, set to false to hide by default", + "type": "boolean" + } + }, + "required": [ + "defaultState", + "id", + "source" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "default_3": { + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], + "type": "string" + } + }, + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] + } + }, + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" + ] + }, + "default_4": { + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "width": { + "description": "The stroke-width for way-elements", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } + ] + } + } + }, + "default": { + "type": "object", + "properties": { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", + "type": "string" + }, + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } + } + }, + "required": [ + "id", + "options" + ] + }, + "DeleteConfigJson": { + "type": "object", + "properties": { + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } + }, + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } + }, + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" + } + } + }, + "default_2": { + "type": "object", + "properties": { + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" + }, + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" + } + } + }, + "default_1": { + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { + "type": "string" + } + }, + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } + } + }, + "required": [ + "applicableUnits", + "appliesToKey" + ] + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/UnitConfigJson.schema.json b/Docs/Schemas/UnitConfigJson.schema.json new file mode 100644 index 0000000000..a8af51f40a --- /dev/null +++ b/Docs/Schemas/UnitConfigJson.schema.json @@ -0,0 +1,101 @@ +{ + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { + "type": "string" + } + }, + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } + } + }, + "required": [ + "applicableUnits", + "appliesToKey" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + }, + "additionalProperties": false + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ], + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/UnitConfigJsonJSC.ts b/Docs/Schemas/UnitConfigJsonJSC.ts new file mode 100644 index 0000000000..9e8fa3c0d1 --- /dev/null +++ b/Docs/Schemas/UnitConfigJsonJSC.ts @@ -0,0 +1,98 @@ +export default { + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { + "type": "string" + } + }, + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } + } + }, + "required": [ + "applicableUnits", + "appliesToKey" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/SpecialInputElements.md b/Docs/SpecialInputElements.md index 3c05b4c874..138054b30c 100644 --- a/Docs/SpecialInputElements.md +++ b/Docs/SpecialInputElements.md @@ -1,4 +1,9 @@ -# Available types for text fields + + + Available types for text fields +================================= + + The listed types here trigger a special input element. Use them in `tagrendering.freeform.type` of your tagrendering to activate them @@ -8,7 +13,7 @@ A basic string ## text -A string, but allows input of longer strings more comfortably (a text area) +A string, but allows input of longer strings more comfortably and supports newlines (a text area) ## date @@ -24,7 +29,46 @@ A geographical length in meters (rounded at two points). Will give an extra mini ## wikidata -A wikidata identifier, e.g. Q42. Input helper arguments: [ key: the value of this tag will initialize search (default: name), options: { removePrefixes: string[], removePostfixes: string[] } these prefixes and postfixes will be removed from the initial search value] +A wikidata identifier, e.g. Q42. + +### Helper arguments + + + +name | doc +------ | ----- +key | the value of this tag will initialize search (default: name) +options | A JSON-object of type `{ removePrefixes: string[], removePostfixes: string[] }`. + +subarg | doc +-------- | ----- +removePrefixes | remove these snippets of text from the start of the passed string to search +removePostfixes | remove these snippets of text from the end of the passed string to search + + + +### Example usage + + The following is the 'freeform'-part of a layer config which will trigger a search for the wikidata item corresponding with the name of the selected feature. It will also remove '-street', '-square', ... if found at the end of the name + +``` +"freeform": { + "key": "name:etymology:wikidata", + "type": "wikidata", + "helperArgs": [ + "name", + { + "removePostfixes": [ + "street", + "boulevard", + "path", + "square", + "plaza", + ] + } + ] +} +``` ## int @@ -60,8 +104,45 @@ A phone number ## opening_hours -Has extra elements to easily input when a POI is opened +Has extra elements to easily input when a POI is opened. + +### Helper arguments + + + +name | doc +------ | ----- +options | A JSON-object of type `{ prefix: string, postfix: string }`. + +subarg | doc +-------- | ----- +prefix | Piece of text that will always be added to the front of the generated opening hours. If the OSM-data does not start with this, it will fail to parse +postfix | Piece of text that will always be added to the end of the generated opening hours + + + +### Example usage + + To add a conditional (based on time) access restriction: + +``` + +"freeform": { + "key": "access:conditional", + "type": "opening_hours", + "helperArgs": [ + { + "prefix":"no @ (", + "postfix":")" + } + ] +} +``` + +*Don't forget to pass the prefix and postfix in the rendering as well*: `{opening_hours_table(opening_hours,yes @ &LPARENS, &RPARENS )` ## color -Shows a color picker Generated from ValidatedTextField.ts \ No newline at end of file +Shows a color picker + +This document is autogenerated from ValidatedTextField.ts \ No newline at end of file diff --git a/Docs/SpecialRenderings.md b/Docs/SpecialRenderings.md index 7fff507974..717e75e867 100644 --- a/Docs/SpecialRenderings.md +++ b/Docs/SpecialRenderings.md @@ -1,24 +1,59 @@ + ### Special tag renderings - In a tagrendering, some special values are substituted by an advanced UI-element. This allows advanced features and visualizations to be reused by custom themes or even to query third-party API's. General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do not_fcs need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a comma in your args + + +In a tagrendering, some special values are substituted by an advanced UI-element. This allows advanced features and visualizations to be reused by custom themes or even to query third-party API's. + +General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do not_ need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a comma in your args + + + + - [all_tags](#all_tags) + - [image_carousel](#image_carousel) + - [image_upload](#image_upload) + - [wikipedia](#wikipedia) + - [minimap](#minimap) + - [sided_minimap](#sided_minimap) + - [reviews](#reviews) + - [opening_hours_table](#opening_hours_table) + - [live](#live) + - [histogram](#histogram) + - [share_link](#share_link) + - [canonical](#canonical) + - [import_button](#import_button) + - [multi_apply](#multi_apply) + - [tag_apply](#tag_apply) + + + + ### all_tags Prints all key-value pairs of the object - used for debugging + #### Example usage - `{all_tags()}` + `{all_tags()}` + + + ### image_carousel Creates an image carousel for the given sources. An attempt will be made to guess what source is used. Supported: Wikidata identifiers, Wikipedia pages, Wikimedia categories, IMGUR (with attribution, direct links) name | default | description ------ | --------- | ------------- -image key/prefix (multiple values allowed if comma-seperated) | image | The keys given to the images, e.g. if image is given, the first picture URL will be added as image, the second as image:0, the third as image:1, etc... +image key/prefix (multiple values allowed if comma-seperated) | image,mapillary,image,wikidata,wikimedia_commons,image,image | The keys given to the images, e.g. if image is given, the first picture URL will be added as image, the second as image:0, the third as image:1, etc... + #### Example usage - `{image_carousel(image)}` + `{image_carousel(image,mapillary,image,wikidata,wikimedia_commons,image,image)}` + + + ### image_upload Creates a button where a user can upload an image to IMGUR @@ -28,9 +63,13 @@ name | default | description image-key | image | Image tag to add the URL to (or image-tag:0, image-tag:1 when multiple images are added) label | Add image | The text to show on the button + #### Example usage - `{image_upload(image,Add image)}` + `{image_upload(image,Add image)}` + + + ### wikipedia A box showing the corresponding wikipedia article - based on the wikidata tag @@ -39,21 +78,44 @@ name | default | description ------ | --------- | ------------- keyToShowWikipediaFor | wikidata | Use the wikidata entry from this key to show the wikipedia article for + #### Example usage - `{wikipedia()}` is a basic example, `{wikipedia(name:etymology:wikidata)}` to show the wikipedia page of whom the feature was named after. Also remember that these can be styled, e.g. `{wikipedia():max-height: 10rem}` to limit the height + `{wikipedia()}` is a basic example, `{wikipedia(name:etymology:wikidata)}` to show the wikipedia page of whom the feature was named after. Also remember that these can be styled, e.g. `{wikipedia():max-height: 10rem}` to limit the height + + + ### minimap - A small map showing the selected feature. Note that no styling is applied, wrap this in a div + A small map showing the selected feature. name | default | description ------ | --------- | ------------- zoomlevel | 18 | The (maximum) zoomlevel: the target zoomlevel after fitting the entire feature. The minimap will fit the entire feature, then zoom out to this zoom level. The higher, the more zoomed in with 1 being the entire world and 19 being really close idKey | id | (Matches all resting arguments) This argument should be the key of a property of the feature. The corresponding value is interpreted as either the id or the a list of ID's. The features with these ID's will be shown on this minimap. + #### Example usage - `{minimap()}`, `{minimap(17, id, _list_of_embedded_feature_ids_calculated_by_calculated_tag):height:10rem; border: 2px solid black}` + `{minimap()}`, `{minimap(17, id, _list_of_embedded_feature_ids_calculated_by_calculated_tag):height:10rem; border: 2px solid black}` + + + +### sided_minimap + + A small map showing _only one side_ the selected feature. *This features requires to have linerenderings with offset* as only linerenderings with a postive or negative offset will be shown. Note: in most cases, this map will be automatically introduced + +name | default | description +------ | --------- | ------------- +side | _undefined_ | The side to show, either `left` or `right` + + +#### Example usage + + `{sided_minimap(left)}` + + + ### reviews Adds an overview of the mangrove-reviews of this object. Mangrove.Reviews needs - in order to identify the reviewed object - a coordinate and a name. By default, the name of the object is given, but this can be overwritten @@ -61,11 +123,15 @@ idKey | id | (Matches all resting arguments) This argument should be the key of name | default | description ------ | --------- | ------------- subjectKey | name | The key to use to determine the subject. If specified, the subject will be tags[subjectKey] -fallback | undefined | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value +fallback | _undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value + #### Example usage - `{reviews()}` for a vanilla review, `{reviews(name, play_forest)}` to review a play forest. If a name is known, the name will be used as identifier, otherwise 'play_forest' is used + `{reviews()}` for a vanilla review, `{reviews(name, play_forest)}` to review a play forest. If a name is known, the name will be used as identifier, otherwise 'play_forest' is used + + + ### opening_hours_table Creates an opening-hours table. Usage: {opening_hours_table(opening_hours)} to create a table of the tag 'opening_hours'. @@ -73,63 +139,87 @@ fallback | undefined | The identifier to use, if tags[subjectKey] as spec name | default | description ------ | --------- | ------------- key | opening_hours | The tagkey from which the table is constructed. +prefix | _empty string_ | Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__ +postfix | _empty string_ | Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__ + #### Example usage - `{opening_hours_table(opening_hours)}` + A normal opening hours table can be invoked with `{opening_hours_table()}`. A table for e.g. conditional access with opening hours can be `{opening_hours_table(access:conditional, no @ &LPARENS, &RPARENS)}` + + + ### live Downloads a JSON from the given URL, e.g. '{live(example.org/data.json, shorthand:x.y.z, other:a.b.c, shorthand)}' will download the given file, will create an object {shorthand: json[x][y][z], other: json[a][b][c] out of it and will return 'other' or 'json[a][b][c]. This is made to use in combination with tags, e.g. {live({url}, {url:format}, needed_value)} name | default | description ------ | --------- | ------------- -Url | undefined | The URL to load -Shorthands | undefined | A list of shorthands, of the format 'shorthandname:path.path.path'. separated by ; -path | undefined | The path (or shorthand) that should be returned +Url | _undefined_ | The URL to load +Shorthands | _undefined_ | A list of shorthands, of the format 'shorthandname:path.path.path'. separated by ; +path | _undefined_ | The path (or shorthand) that should be returned + #### Example usage - {live({url},{url:format},hour)} {live(https://data.mobility.brussels/bike/api/counts/?request=live&featureID=CB2105,hour:data.hour_cnt;day:data.day_cnt;year:data.year_cnt,hour)} + {live({url},{url:format},hour)} {live(https://data.mobility.brussels/bike/api/counts/?request=live&featureID=CB2105,hour:data.hour_cnt;day:data.day_cnt;year:data.year_cnt,hour)} + + + ### histogram Create a histogram for a list of given values, read from the properties. name | default | description ------ | --------- | ------------- -key | undefined | The key to be read and to generate a histogram from -title | | The text to put above the given values column -countHeader | | The text to put above the counts -colors* | undefined | (Matches all resting arguments - optional) Matches a regex onto a color value, e.g. `3[a-zA-Z+-]*:#33cc33` +key | _undefined_ | The key to be read and to generate a histogram from +title | _empty string_ | The text to put above the given values column +countHeader | _empty string_ | The text to put above the counts +colors* | _undefined_ | (Matches all resting arguments - optional) Matches a regex onto a color value, e.g. `3[a-zA-Z+-]*:#33cc33` + #### Example usage - `{histogram('some_key')}` with properties being `{some_key: ['a','b','a','c']} to create a histogram + `{histogram('some_key')}` with properties being `{some_key: ['a','b','a','c']} to create a histogram + + + ### share_link Creates a link that (attempts to) open the native 'share'-screen name | default | description ------ | --------- | ------------- -url | undefined | The url to share (default: current URL) +url | _undefined_ | The url to share (default: current URL) + #### Example usage - {share_link()} to share the current page, {share_link()} to share the given url + {share_link()} to share the current page, {share_link()} to share the given url + + + ### canonical Converts a short, canonical value into the long, translated text name | default | description ------ | --------- | ------------- -key | undefined | The key of the tag to give the canonical text for +key | _undefined_ | The key of the tag to give the canonical text for + #### Example usage - {canonical(length)} will give 42 metre (in french) + {canonical(length)} will give 42 metre (in french) + + + ### import_button This button will copy the data from an external dataset into OpenStreetMap. It is only functional in official themes but can be tested in unofficial themes. +#### Importing a dataset into OpenStreetMap: requirements + If you want to import a dataset, make sure that: 1. The dataset to import has a suitable license @@ -138,36 +228,104 @@ If you want to import a dataset, make sure that: There are also some technicalities in your theme to keep in mind: -1. The new point will be added and will flow through the program as any other new point as if it came from OSM. +1. The new feature will be added and will flow through the program as any other new point as if it came from OSM. This means that there should be a layer which will match the new tags and which will display it. -2. The original point from your geojson layer will gain the tag '_imported=yes'. +2. The original feature from your geojson layer will gain the tag '_imported=yes'. This should be used to change the appearance or even to hide it (eg by changing the icon size to zero) 3. There should be a way for the theme to detect previously imported points, even after reloading. - A reference number to the original dataset is an excellen way to do this + A reference number to the original dataset is an excellent way to do this +4. When importing ways, the theme creator is also responsible of avoiding overlapping ways. + +#### Disabled in unofficial themes + +The import button can be tested in an unofficial theme by adding `test=true` or `backend=osm-test` as [URL-paramter](URL_Parameters.md). +The import button will show up then. If in testmode, you can read the changeset-XML directly in the web console. +In the case that MapComplete is pointed to the testing grounds, the edit will be made on https://master.apis.dev.openstreetmap.org + + +#### Specifying which tags to copy or add + +The argument `tags` of the import button takes a `;`-seperated list of tags to add. + +These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number`. +This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. + +If a value to substitute is undefined, empty string will be used instead. + +This supports multiple values, e.g. `ref=$source:geometry:type/$source:geometry:ref` + +Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name (matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special rendering... + +Note that these values can be prepare with javascript in the theme by using a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) + + + name | default | description ------ | --------- | ------------- -tags | undefined | Tags to copy-specification. This contains one or more pairs (seperated by a `;`), e.g. `amenity=fast_food; addr:housenumber=$number`. This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. (Hint: prepare these values, e.g. with calculatedTags) +targetLayer | _undefined_ | The id of the layer where this point should end up. This is not very strict, it will simply result in checking that this layer is shown preventing possible duplicate elements +tags | _undefined_ | The tags to add onto the new object - see specification above text | Import this data into OpenStreetMap | The text to show on the button icon | ./assets/svg/addSmall.svg | A nice icon to show in the button minzoom | 18 | How far the contributor must zoom in before being able to import the point +Snap onto layer(s)/replace geometry with this other way | _undefined_ | - If the value corresponding with this key starts with 'way/' and the feature is a LineString or Polygon, the original OSM-way geometry will be changed to match the new geometry + - If a way of the given layer(s) is closeby, will snap the new point onto this way (similar as preset might snap). To show multiple layers to snap onto, use a `;`-seperated list +snap max distance | 5 | The maximum distance that this point will move to snap onto a layer (in meters) + #### Example usage - `{import_button(,Import this data into OpenStreetMap,./assets/svg/addSmall.svg,18)}` + `{import_button(,,Import this data into OpenStreetMap,./assets/svg/addSmall.svg,18,,5)}` + + + ### multi_apply A button to apply the tagging of this object onto a list of other features. This is an advanced feature for which you'll need calculatedTags name | default | description ------ | --------- | ------------- -feature_ids | undefined | A JSOn-serialized list of IDs of features to apply the tagging on -keys | undefined | One key (or multiple keys, seperated by ';') of the attribute that should be copied onto the other features. -text | undefined | The text to show on the button -autoapply | undefined | A boolean indicating wether this tagging should be applied automatically if the relevant tags on this object are changed. A visual element indicating the multi_apply is still shown -overwrite | undefined | If set to 'true', the tags on the other objects will always be overwritten. The default behaviour will be to only change the tags on other objects if they are either undefined or had the same value before the change +feature_ids | _undefined_ | A JSOn-serialized list of IDs of features to apply the tagging on +keys | _undefined_ | One key (or multiple keys, seperated by ';') of the attribute that should be copied onto the other features. +text | _undefined_ | The text to show on the button +autoapply | _undefined_ | A boolean indicating wether this tagging should be applied automatically if the relevant tags on this object are changed. A visual element indicating the multi_apply is still shown +overwrite | _undefined_ | If set to 'true', the tags on the other objects will always be overwritten. The default behaviour will be to only change the tags on other objects if they are either undefined or had the same value before the change + #### Example usage - {multi_apply(_features_with_the_same_name_within_100m, name:etymology:wikidata;name:etymology, Apply etymology information on all nearby objects with the same name)} Generated from UI/SpecialVisualisations.ts \ No newline at end of file + {multi_apply(_features_with_the_same_name_within_100m, name:etymology:wikidata;name:etymology, Apply etymology information on all nearby objects with the same name)} + + + +### tag_apply + + Shows a big button; clicking this button will apply certain tags onto the feature. + +The first argument takes a specification of which tags to add. +These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number`. +This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. + +If a value to substitute is undefined, empty string will be used instead. + +This supports multiple values, e.g. `ref=$source:geometry:type/$source:geometry:ref` + +Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name (matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special rendering... + +Note that these values can be prepare with javascript in the theme by using a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) + + +name | default | description +------ | --------- | ------------- +tags_to_apply | _undefined_ | A specification of the tags to apply +message | _undefined_ | The text to show to the contributor +image | _undefined_ | An image to show to the contributor on the button +id_of_object_to_apply_this_one | _undefined_ | If specified, applies the the tags onto _another_ object. The id will be read from properties[id_of_object_to_apply_this_one] of the selected object. The tags are still calculated based on the tags of the _selected_ element + + +#### Example usage + + `{tag_apply(survey_date:=$_now:date, Surveyed today!)}` + +This document is autogenerated from UI/SpecialVisualisations.ts \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_aed.json b/Docs/TagInfo/mapcomplete_aed.json index 115eb3525f..b88de395d0 100644 --- a/Docs/TagInfo/mapcomplete_aed.json +++ b/Docs/TagInfo/mapcomplete_aed.json @@ -112,7 +112,7 @@ }, { "key": "wheelchair", - "description": "Layer 'Defibrillators' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')", + "description": "Layer 'Defibrillators' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')", "value": "designated" }, { diff --git a/Docs/TagInfo/mapcomplete_cafes_and_pubs.json b/Docs/TagInfo/mapcomplete_cafes_and_pubs.json index 630d8e52b5..a72df9b193 100644 --- a/Docs/TagInfo/mapcomplete_cafes_and_pubs.json +++ b/Docs/TagInfo/mapcomplete_cafes_and_pubs.json @@ -103,7 +103,7 @@ }, { "key": "wheelchair", - "description": "Layer 'Cafés and pubs' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')", + "description": "Layer 'Cafés and pubs' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')", "value": "designated" }, { @@ -121,6 +121,26 @@ "description": "Layer 'Cafés and pubs' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')", "value": "no" }, + { + "key": "service:electricity", + "description": "Layer 'Cafés and pubs' shows service:electricity=yes with a fixed text, namely 'There are plenty of domestic sockets available to customers seated indoors, where they can charge their electronics' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')", + "value": "yes" + }, + { + "key": "service:electricity", + "description": "Layer 'Cafés and pubs' shows service:electricity=limited with a fixed text, namely 'There are a few domestic sockets available to customers seated indoors, where they can charge their electronics' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')", + "value": "limited" + }, + { + "key": "service:electricity", + "description": "Layer 'Cafés and pubs' shows service:electricity=ask with a fixed text, namely 'There are no sockets available indoors to customers, but charging might be possible if the staff is asked' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')", + "value": "ask" + }, + { + "key": "service:electricity", + "description": "Layer 'Cafés and pubs' shows service:electricity=no with a fixed text, namely 'There are a no domestic sockets available to customers seated indoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')", + "value": "no" + }, { "key": "dog", "description": "Layer 'Cafés and pubs' shows dog=yes with a fixed text, namely 'Dogs are allowed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')", diff --git a/Docs/TagInfo/mapcomplete_charging_stations.json b/Docs/TagInfo/mapcomplete_charging_stations.json index 6cd7b7772a..5f23aa146c 100644 --- a/Docs/TagInfo/mapcomplete_charging_stations.json +++ b/Docs/TagInfo/mapcomplete_charging_stations.json @@ -48,7 +48,7 @@ }, { "key": "bicycle", - "description": "Layer 'Charging stations' shows bicycle=yes with a fixed text, namely 'bicycles can be charged here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "description": "Layer 'Charging stations' shows bicycle=yes with a fixed text, namely 'Bcycles can be charged here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", "value": "yes" }, { @@ -92,7 +92,7 @@ }, { "key": "access", - "description": "Layer 'Charging stations' shows access=customers with a fixed text, namely 'Only customers of the place this station belongs to can use this charging station
E.g. a charging station operated by hotel which is only usable by their guests ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "description": "Layer 'Charging stations' shows access=customers with a fixed text, namely 'Only customers of the place this station belongs to can use this charging station
E.g. a charging station operated by hotel which is only usable by their guests' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", "value": "customers" }, { @@ -252,677 +252,66 @@ "key": "socket:schuko", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:schuko:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:schuko:voltage", - "description": "Layer 'Charging stations' shows socket:socket:schuko:voltage=230 V with a fixed text, namely '
Schuko wall plug without ground pin (CEE7/4 type F)
outputs 230 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "230 V" - }, - { - "key": "socket:schuko:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:schuko:current", - "description": "Layer 'Charging stations' shows socket:socket:schuko:current=16 A with a fixed text, namely '
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most 16 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "16 A" - }, - { - "key": "socket:schuko:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:schuko:output", - "description": "Layer 'Charging stations' shows socket:socket:schuko:output=3.6 kw with a fixed text, namely '
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most 3.6 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "3.6 kw" - }, { "key": "socket:typee", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:typee:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:typee:voltage", - "description": "Layer 'Charging stations' shows socket:socket:typee:voltage=230 V with a fixed text, namely '
European wall plug with ground pin (CEE7/4 type E)
outputs 230 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "230 V" - }, - { - "key": "socket:typee:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:typee:current", - "description": "Layer 'Charging stations' shows socket:socket:typee:current=16 A with a fixed text, namely '
European wall plug with ground pin (CEE7/4 type E)
outputs at most 16 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "16 A" - }, - { - "key": "socket:typee:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:typee:output", - "description": "Layer 'Charging stations' shows socket:socket:typee:output=3 kw with a fixed text, namely '
European wall plug with ground pin (CEE7/4 type E)
outputs at most 3 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "3 kw" - }, - { - "key": "socket:socket:typee:output", - "description": "Layer 'Charging stations' shows socket:socket:typee:output=22 kw with a fixed text, namely '
European wall plug with ground pin (CEE7/4 type E)
outputs at most 22 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "22 kw" - }, { "key": "socket:chademo", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:chademo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:chademo:voltage", - "description": "Layer 'Charging stations' shows socket:socket:chademo:voltage=500 V with a fixed text, namely '
Chademo
outputs 500 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "500 V" - }, - { - "key": "socket:chademo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:chademo:current", - "description": "Layer 'Charging stations' shows socket:socket:chademo:current=120 A with a fixed text, namely '
Chademo
outputs at most 120 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "120 A" - }, - { - "key": "socket:chademo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:chademo:output", - "description": "Layer 'Charging stations' shows socket:socket:chademo:output=50 kw with a fixed text, namely '
Chademo
outputs at most 50 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "50 kw" - }, { "key": "socket:type1_cable", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type1_cable:voltage=200 V with a fixed text, namely '
Type 1 with cable (J1772)
outputs 200 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "200 V" - }, - { - "key": "socket:socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type1_cable:voltage=240 V with a fixed text, namely '
Type 1 with cable (J1772)
outputs 240 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "240 V" - }, - { - "key": "socket:type1_cable:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type1_cable:current", - "description": "Layer 'Charging stations' shows socket:socket:type1_cable:current=32 A with a fixed text, namely '
Type 1 with cable (J1772)
outputs at most 32 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "32 A" - }, - { - "key": "socket:type1_cable:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type1_cable:output", - "description": "Layer 'Charging stations' shows socket:socket:type1_cable:output=3.7 kw with a fixed text, namely '
Type 1 with cable (J1772)
outputs at most 3.7 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "3.7 kw" - }, - { - "key": "socket:socket:type1_cable:output", - "description": "Layer 'Charging stations' shows socket:socket:type1_cable:output=7 kw with a fixed text, namely '
Type 1 with cable (J1772)
outputs at most 7 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "7 kw" - }, { "key": "socket:type1", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:type1:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type1:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type1:voltage=200 V with a fixed text, namely '
Type 1 without cable (J1772)
outputs 200 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "200 V" - }, - { - "key": "socket:socket:type1:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type1:voltage=240 V with a fixed text, namely '
Type 1 without cable (J1772)
outputs 240 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "240 V" - }, - { - "key": "socket:type1:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type1:current", - "description": "Layer 'Charging stations' shows socket:socket:type1:current=32 A with a fixed text, namely '
Type 1 without cable (J1772)
outputs at most 32 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "32 A" - }, - { - "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type1:output", - "description": "Layer 'Charging stations' shows socket:socket:type1:output=3.7 kw with a fixed text, namely '
Type 1 without cable (J1772)
outputs at most 3.7 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "3.7 kw" - }, - { - "key": "socket:socket:type1:output", - "description": "Layer 'Charging stations' shows socket:socket:type1:output=6.6 kw with a fixed text, namely '
Type 1 without cable (J1772)
outputs at most 6.6 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "6.6 kw" - }, - { - "key": "socket:socket:type1:output", - "description": "Layer 'Charging stations' shows socket:socket:type1:output=7 kw with a fixed text, namely '
Type 1 without cable (J1772)
outputs at most 7 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "7 kw" - }, - { - "key": "socket:socket:type1:output", - "description": "Layer 'Charging stations' shows socket:socket:type1:output=7.2 kw with a fixed text, namely '
Type 1 without cable (J1772)
outputs at most 7.2 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "7.2 kw" - }, { "key": "socket:type1_combo", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type1_combo:voltage=400 V with a fixed text, namely '
Type 1 CCS (aka Type 1 Combo)
outputs 400 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "400 V" - }, - { - "key": "socket:socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type1_combo:voltage=1000 V with a fixed text, namely '
Type 1 CCS (aka Type 1 Combo)
outputs 1000 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "1000 V" - }, - { - "key": "socket:type1_combo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type1_combo:current", - "description": "Layer 'Charging stations' shows socket:socket:type1_combo:current=50 A with a fixed text, namely '
Type 1 CCS (aka Type 1 Combo)
outputs at most 50 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "50 A" - }, - { - "key": "socket:socket:type1_combo:current", - "description": "Layer 'Charging stations' shows socket:socket:type1_combo:current=125 A with a fixed text, namely '
Type 1 CCS (aka Type 1 Combo)
outputs at most 125 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "125 A" - }, - { - "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:socket:type1_combo:output=50 kw with a fixed text, namely '
Type 1 CCS (aka Type 1 Combo)
outputs at most 50 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "50 kw" - }, - { - "key": "socket:socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:socket:type1_combo:output=62.5 kw with a fixed text, namely '
Type 1 CCS (aka Type 1 Combo)
outputs at most 62.5 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "62.5 kw" - }, - { - "key": "socket:socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:socket:type1_combo:output=150 kw with a fixed text, namely '
Type 1 CCS (aka Type 1 Combo)
outputs at most 150 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "150 kw" - }, - { - "key": "socket:socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:socket:type1_combo:output=350 kw with a fixed text, namely '
Type 1 CCS (aka Type 1 Combo)
outputs at most 350 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "350 kw" - }, { "key": "socket:tesla_supercharger", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:tesla_supercharger:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_supercharger:voltage", - "description": "Layer 'Charging stations' shows socket:socket:tesla_supercharger:voltage=480 V with a fixed text, namely '
Tesla Supercharger
outputs 480 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "480 V" - }, - { - "key": "socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows socket:socket:tesla_supercharger:current=125 A with a fixed text, namely '
Tesla Supercharger
outputs at most 125 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "125 A" - }, - { - "key": "socket:socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows socket:socket:tesla_supercharger:current=350 A with a fixed text, namely '
Tesla Supercharger
outputs at most 350 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "350 A" - }, - { - "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:socket:tesla_supercharger:output=120 kw with a fixed text, namely '
Tesla Supercharger
outputs at most 120 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "120 kw" - }, - { - "key": "socket:socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:socket:tesla_supercharger:output=150 kw with a fixed text, namely '
Tesla Supercharger
outputs at most 150 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "150 kw" - }, - { - "key": "socket:socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:socket:tesla_supercharger:output=250 kw with a fixed text, namely '
Tesla Supercharger
outputs at most 250 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "250 kw" - }, { "key": "socket:type2", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:type2:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type2:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type2:voltage=230 V with a fixed text, namely '
Type 2 (mennekes)
outputs 230 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "230 V" - }, - { - "key": "socket:socket:type2:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type2:voltage=400 V with a fixed text, namely '
Type 2 (mennekes)
outputs 400 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "400 V" - }, - { - "key": "socket:type2:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type2:current", - "description": "Layer 'Charging stations' shows socket:socket:type2:current=16 A with a fixed text, namely '
Type 2 (mennekes)
outputs at most 16 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "16 A" - }, - { - "key": "socket:socket:type2:current", - "description": "Layer 'Charging stations' shows socket:socket:type2:current=32 A with a fixed text, namely '
Type 2 (mennekes)
outputs at most 32 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "32 A" - }, - { - "key": "socket:type2:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type2:output", - "description": "Layer 'Charging stations' shows socket:socket:type2:output=11 kw with a fixed text, namely '
Type 2 (mennekes)
outputs at most 11 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "11 kw" - }, - { - "key": "socket:socket:type2:output", - "description": "Layer 'Charging stations' shows socket:socket:type2:output=22 kw with a fixed text, namely '
Type 2 (mennekes)
outputs at most 22 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "22 kw" - }, { "key": "socket:type2_combo", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type2_combo:voltage=500 V with a fixed text, namely '
Type 2 CCS (mennekes)
outputs 500 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "500 V" - }, - { - "key": "socket:socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type2_combo:voltage=920 V with a fixed text, namely '
Type 2 CCS (mennekes)
outputs 920 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "920 V" - }, - { - "key": "socket:type2_combo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type2_combo:current", - "description": "Layer 'Charging stations' shows socket:socket:type2_combo:current=125 A with a fixed text, namely '
Type 2 CCS (mennekes)
outputs at most 125 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "125 A" - }, - { - "key": "socket:socket:type2_combo:current", - "description": "Layer 'Charging stations' shows socket:socket:type2_combo:current=350 A with a fixed text, namely '
Type 2 CCS (mennekes)
outputs at most 350 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "350 A" - }, - { - "key": "socket:type2_combo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type2_combo:output", - "description": "Layer 'Charging stations' shows socket:socket:type2_combo:output=50 kw with a fixed text, namely '
Type 2 CCS (mennekes)
outputs at most 50 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "50 kw" - }, { "key": "socket:type2_cable", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type2_cable:voltage=230 V with a fixed text, namely '
Type 2 with cable (mennekes)
outputs 230 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "230 V" - }, - { - "key": "socket:socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows socket:socket:type2_cable:voltage=400 V with a fixed text, namely '
Type 2 with cable (mennekes)
outputs 400 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "400 V" - }, - { - "key": "socket:type2_cable:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type2_cable:current", - "description": "Layer 'Charging stations' shows socket:socket:type2_cable:current=16 A with a fixed text, namely '
Type 2 with cable (mennekes)
outputs at most 16 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "16 A" - }, - { - "key": "socket:socket:type2_cable:current", - "description": "Layer 'Charging stations' shows socket:socket:type2_cable:current=32 A with a fixed text, namely '
Type 2 with cable (mennekes)
outputs at most 32 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "32 A" - }, - { - "key": "socket:type2_cable:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:type2_cable:output", - "description": "Layer 'Charging stations' shows socket:socket:type2_cable:output=11 kw with a fixed text, namely '
Type 2 with cable (mennekes)
outputs at most 11 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "11 kw" - }, - { - "key": "socket:socket:type2_cable:output", - "description": "Layer 'Charging stations' shows socket:socket:type2_cable:output=22 kw with a fixed text, namely '
Type 2 with cable (mennekes)
outputs at most 22 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "22 kw" - }, { "key": "socket:tesla_supercharger_ccs", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows socket:socket:tesla_supercharger_ccs:voltage=500 V with a fixed text, namely '
Tesla Supercharger CCS (a branded type2_css)
outputs 500 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "500 V" - }, - { - "key": "socket:socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows socket:socket:tesla_supercharger_ccs:voltage=920 V with a fixed text, namely '
Tesla Supercharger CCS (a branded type2_css)
outputs 920 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "920 V" - }, - { - "key": "socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows socket:socket:tesla_supercharger_ccs:current=125 A with a fixed text, namely '
Tesla Supercharger CCS (a branded type2_css)
outputs at most 125 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "125 A" - }, - { - "key": "socket:socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows socket:socket:tesla_supercharger_ccs:current=350 A with a fixed text, namely '
Tesla Supercharger CCS (a branded type2_css)
outputs at most 350 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "350 A" - }, - { - "key": "socket:tesla_supercharger_ccs:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_supercharger_ccs:output", - "description": "Layer 'Charging stations' shows socket:socket:tesla_supercharger_ccs:output=50 kw with a fixed text, namely '
Tesla Supercharger CCS (a branded type2_css)
outputs at most 50 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "50 kw" - }, { "key": "socket:tesla_destination", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:voltage=480 V with a fixed text, namely '
Tesla Supercharger (destination)
outputs 480 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "480 V" - }, - { - "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:current=125 A with a fixed text, namely '
Tesla Supercharger (destination)
outputs at most 125 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "125 A" - }, - { - "key": "socket:socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:current=350 A with a fixed text, namely '
Tesla Supercharger (destination)
outputs at most 350 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "350 A" - }, - { - "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:output=120 kw with a fixed text, namely '
Tesla Supercharger (destination)
outputs at most 120 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "120 kw" - }, - { - "key": "socket:socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:output=150 kw with a fixed text, namely '
Tesla Supercharger (destination)
outputs at most 150 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "150 kw" - }, - { - "key": "socket:socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:output=250 kw with a fixed text, namely '
Tesla Supercharger (destination)
outputs at most 250 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "250 kw" - }, { "key": "socket:tesla_destination", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:voltage=230 V with a fixed text, namely '
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs 230 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "230 V" - }, - { - "key": "socket:socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:voltage=400 V with a fixed text, namely '
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs 400 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "400 V" - }, - { - "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:current=16 A with a fixed text, namely '
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 16 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "16 A" - }, - { - "key": "socket:socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:current=32 A with a fixed text, namely '
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 32 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "32 A" - }, - { - "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:output=11 kw with a fixed text, namely '
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 11 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "11 kw" - }, - { - "key": "socket:socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:socket:tesla_destination:output=22 kw with a fixed text, namely '
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 22 kw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "22 kw" - }, { "key": "socket:USB-A", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:USB-A:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:USB-A:voltage", - "description": "Layer 'Charging stations' shows socket:socket:USB-A:voltage=5 V with a fixed text, namely '
USB to charge phones and small electronics
outputs 5 volt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "5 V" - }, - { - "key": "socket:USB-A:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:USB-A:current", - "description": "Layer 'Charging stations' shows socket:socket:USB-A:current=1 A with a fixed text, namely '
USB to charge phones and small electronics
outputs at most 1 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "1 A" - }, - { - "key": "socket:socket:USB-A:current", - "description": "Layer 'Charging stations' shows socket:socket:USB-A:current=2 A with a fixed text, namely '
USB to charge phones and small electronics
outputs at most 2 A' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "2 A" - }, - { - "key": "socket:USB-A:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:socket:USB-A:output", - "description": "Layer 'Charging stations' shows socket:socket:USB-A:output=5w with a fixed text, namely '
USB to charge phones and small electronics
outputs at most 5w' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "5w" - }, - { - "key": "socket:socket:USB-A:output", - "description": "Layer 'Charging stations' shows socket:socket:USB-A:output=10w with a fixed text, namely '
USB to charge phones and small electronics
outputs at most 10w' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "10w" - }, { "key": "socket:bosch_3pin", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:bosch_3pin:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:bosch_3pin:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:bosch_3pin:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, { "key": "socket:bosch_5pin", "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "socket:bosch_5pin:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:voltage' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:bosch_5pin:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:current' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "socket:bosch_5pin:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:output' (in the MapComplete.osm.be theme 'Charging stations')" - }, - { - "key": "authentication:membership_card", - "description": "Layer 'Charging stations' shows authentication:membership_card=yes with a fixed text, namely 'Authentication by a membership card' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "yes" - }, - { - "key": "authentication:app", - "description": "Layer 'Charging stations' shows authentication:app=yes with a fixed text, namely 'Authentication by an app' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "yes" - }, - { - "key": "authentication:phone_call", - "description": "Layer 'Charging stations' shows authentication:phone_call=yes with a fixed text, namely 'Authentication via phone call is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "yes" - }, - { - "key": "authentication:short_message", - "description": "Layer 'Charging stations' shows authentication:short_message=yes with a fixed text, namely 'Authentication via phone call is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "yes" - }, - { - "key": "authentication:nfc", - "description": "Layer 'Charging stations' shows authentication:nfc=yes with a fixed text, namely 'Authentication via NFC is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "yes" - }, - { - "key": "authentication:money_card", - "description": "Layer 'Charging stations' shows authentication:money_card=yes with a fixed text, namely 'Authentication via Money Card is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "yes" - }, - { - "key": "authentication:debit_card", - "description": "Layer 'Charging stations' shows authentication:debit_card=yes with a fixed text, namely 'Authentication via debit card is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "yes" - }, - { - "key": "authentication:none", - "description": "Layer 'Charging stations' shows authentication:none=yes with a fixed text, namely 'No authentication is needed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "yes" - }, - { - "key": "authentication:phone_call:number", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'authentication:phone_call:number' (in the MapComplete.osm.be theme 'Charging stations')" - }, { "key": "opening_hours", "description": "Layer 'Charging stations' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Charging stations')" @@ -932,20 +321,75 @@ "description": "Layer 'Charging stations' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", "value": "24/7" }, - { - "key": "charge", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Charging stations')" - }, { "key": "fee", - "description": "Layer 'Charging stations' shows fee=no&charge= with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "description": "Layer 'Charging stations' shows fee=no with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Charging stations')", "value": "no" }, { - "key": "charge", - "description": "Layer 'Charging stations' shows fee=no&charge= with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key charge.", + "key": "fee", + "description": "Layer 'Charging stations' shows fee=no&fee:conditional=&charge=&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "no" + }, + { + "key": "fee:conditional", + "description": "Layer 'Charging stations' shows fee=no&fee:conditional=&charge=&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key fee:conditional.", "value": "" }, + { + "key": "charge", + "description": "Layer 'Charging stations' shows fee=no&fee:conditional=&charge=&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key charge.", + "value": "" + }, + { + "key": "authentication:none", + "description": "Layer 'Charging stations' shows fee=no&fee:conditional=&charge=&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "yes" + }, + { + "key": "fee", + "description": "Layer 'Charging stations' shows fee=no&fee:conditional=&charge=&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "no" + }, + { + "key": "fee:conditional", + "description": "Layer 'Charging stations' shows fee=no&fee:conditional=&charge=&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key fee:conditional.", + "value": "" + }, + { + "key": "charge", + "description": "Layer 'Charging stations' shows fee=no&fee:conditional=&charge=&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key charge.", + "value": "" + }, + { + "key": "authentication:none", + "description": "Layer 'Charging stations' shows fee=no&fee:conditional=&charge=&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "no" + }, + { + "key": "fee", + "description": "Layer 'Charging stations' shows fee=yes&fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "yes" + }, + { + "key": "fee:conditional", + "description": "Layer 'Charging stations' shows fee=yes&fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "no @ customers" + }, + { + "key": "fee", + "description": "Layer 'Charging stations' shows fee=yes&fee:conditional= with a fixed text, namely 'Paid use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "yes" + }, + { + "key": "fee:conditional", + "description": "Layer 'Charging stations' shows fee=yes&fee:conditional= with a fixed text, namely 'Paid use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key fee:conditional.", + "value": "" + }, + { + "key": "charge", + "description": "Layer 'Charging stations' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Charging stations')" + }, { "key": "payment:cash", "description": "Layer 'Charging stations' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", @@ -966,6 +410,50 @@ "description": "Layer 'Charging stations' shows payment:membership_card=yes with a fixed text, namely 'Payment is done using a membership card' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", "value": "yes" }, + { + "key": "authentication:membership_card", + "description": "Layer 'Charging stations' shows authentication:membership_card=yes with a fixed text, namely 'Authentication by a membership card' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "yes" + }, + { + "key": "authentication:app", + "description": "Layer 'Charging stations' shows authentication:app=yes with a fixed text, namely 'Authentication by an app' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "yes" + }, + { + "key": "authentication:phone_call", + "description": "Layer 'Charging stations' shows authentication:phone_call=yes with a fixed text, namely 'Authentication via phone call is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "yes" + }, + { + "key": "authentication:short_message", + "description": "Layer 'Charging stations' shows authentication:short_message=yes with a fixed text, namely 'Authentication via SMS is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "yes" + }, + { + "key": "authentication:nfc", + "description": "Layer 'Charging stations' shows authentication:nfc=yes with a fixed text, namely 'Authentication via NFC is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "yes" + }, + { + "key": "authentication:money_card", + "description": "Layer 'Charging stations' shows authentication:money_card=yes with a fixed text, namely 'Authentication via Money Card is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "yes" + }, + { + "key": "authentication:debit_card", + "description": "Layer 'Charging stations' shows authentication:debit_card=yes with a fixed text, namely 'Authentication via debit card is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "yes" + }, + { + "key": "authentication:none", + "description": "Layer 'Charging stations' shows authentication:none=yes with a fixed text, namely 'Charging here is (also) possible without authentication' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "yes" + }, + { + "key": "authentication:phone_call:number", + "description": "Layer 'Charging stations' shows and asks freeform values for key 'authentication:phone_call:number' (in the MapComplete.osm.be theme 'Charging stations')" + }, { "key": "maxstay", "description": "Layer 'Charging stations' shows and asks freeform values for key 'maxstay' (in the MapComplete.osm.be theme 'Charging stations')" @@ -1053,51 +541,131 @@ "key": "ref", "description": "Layer 'Charging stations' shows and asks freeform values for key 'ref' (in the MapComplete.osm.be theme 'Charging stations')" }, - { - "key": "operational_status", - "description": "Layer 'Charging stations' shows operational_status=broken with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "broken" - }, { "key": "planned:amenity", - "description": "Layer 'Charging stations' shows planned:amenity=charging_station&amenity= with a fixed text, namely 'A charging station is planned here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "charging_station" - }, - { - "key": "amenity", - "description": "Layer 'Charging stations' shows planned:amenity=charging_station&amenity= with a fixed text, namely 'A charging station is planned here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key amenity.", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=&operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station works' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key planned:amenity.", "value": "" }, { "key": "construction:amenity", - "description": "Layer 'Charging stations' shows construction:amenity=charging_station&amenity= with a fixed text, namely 'A charging station is constructed here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "charging_station" - }, - { - "key": "amenity", - "description": "Layer 'Charging stations' shows construction:amenity=charging_station&amenity= with a fixed text, namely 'A charging station is constructed here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key amenity.", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=&operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station works' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key construction:amenity.", "value": "" }, { "key": "disused:amenity", - "description": "Layer 'Charging stations' shows disused:amenity=charging_station&amenity= with a fixed text, namely 'This charging station has beed permanently disabled and is not in use anymore but is still visible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", - "value": "charging_station" + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=&operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station works' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key disused:amenity.", + "value": "" + }, + { + "key": "operational_status", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=&operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station works' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "broken" }, { "key": "amenity", - "description": "Layer 'Charging stations' shows disused:amenity=charging_station&amenity= with a fixed text, namely 'This charging station has beed permanently disabled and is not in use anymore but is still visible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key amenity.", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=&operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station works' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "charging_station" + }, + { + "key": "planned:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=charging_station&construction:amenity=&disused:amenity=&operational_status=&amenity= with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "charging_station" + }, + { + "key": "construction:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=charging_station&construction:amenity=&disused:amenity=&operational_status=&amenity= with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key construction:amenity.", + "value": "" + }, + { + "key": "disused:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=charging_station&construction:amenity=&disused:amenity=&operational_status=&amenity= with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key disused:amenity.", + "value": "" + }, + { + "key": "operational_status", + "description": "Layer 'Charging stations' shows planned:amenity=charging_station&construction:amenity=&disused:amenity=&operational_status=&amenity= with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key operational_status.", "value": "" }, { "key": "amenity", - "description": "Layer 'Charging stations' shows amenity=charging_station&operational_status= with a fixed text, namely 'This charging station works' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "description": "Layer 'Charging stations' shows planned:amenity=charging_station&construction:amenity=&disused:amenity=&operational_status=&amenity= with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key amenity.", + "value": "" + }, + { + "key": "planned:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=charging_station&disused:amenity=&operational_status=&amenity= with a fixed text, namely 'A charging station is planned here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key planned:amenity.", + "value": "" + }, + { + "key": "construction:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=charging_station&disused:amenity=&operational_status=&amenity= with a fixed text, namely 'A charging station is planned here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "charging_station" + }, + { + "key": "disused:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=charging_station&disused:amenity=&operational_status=&amenity= with a fixed text, namely 'A charging station is planned here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key disused:amenity.", + "value": "" + }, + { + "key": "operational_status", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=charging_station&disused:amenity=&operational_status=&amenity= with a fixed text, namely 'A charging station is planned here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key operational_status.", + "value": "" + }, + { + "key": "amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=charging_station&disused:amenity=&operational_status=&amenity= with a fixed text, namely 'A charging station is planned here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key amenity.", + "value": "" + }, + { + "key": "planned:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=charging_station&operational_status=&amenity= with a fixed text, namely 'A charging station is constructed here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key planned:amenity.", + "value": "" + }, + { + "key": "construction:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=charging_station&operational_status=&amenity= with a fixed text, namely 'A charging station is constructed here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key construction:amenity.", + "value": "" + }, + { + "key": "disused:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=charging_station&operational_status=&amenity= with a fixed text, namely 'A charging station is constructed here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", "value": "charging_station" }, { "key": "operational_status", - "description": "Layer 'Charging stations' shows amenity=charging_station&operational_status= with a fixed text, namely 'This charging station works' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key operational_status.", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=charging_station&operational_status=&amenity= with a fixed text, namely 'A charging station is constructed here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key operational_status.", "value": "" }, + { + "key": "amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=charging_station&operational_status=&amenity= with a fixed text, namely 'A charging station is constructed here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key amenity.", + "value": "" + }, + { + "key": "planned:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=&operational_status=&amenity=charging_station with a fixed text, namely 'This charging station has beed permanently disabled and is not in use anymore but is still visible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key planned:amenity.", + "value": "" + }, + { + "key": "construction:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=&operational_status=&amenity=charging_station with a fixed text, namely 'This charging station has beed permanently disabled and is not in use anymore but is still visible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key construction:amenity.", + "value": "" + }, + { + "key": "disused:amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=&operational_status=&amenity=charging_station with a fixed text, namely 'This charging station has beed permanently disabled and is not in use anymore but is still visible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key disused:amenity.", + "value": "" + }, + { + "key": "operational_status", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=&operational_status=&amenity=charging_station with a fixed text, namely 'This charging station has beed permanently disabled and is not in use anymore but is still visible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key operational_status.", + "value": "" + }, + { + "key": "amenity", + "description": "Layer 'Charging stations' shows planned:amenity=&construction:amenity=&disused:amenity=&operational_status=&amenity=charging_station with a fixed text, namely 'This charging station has beed permanently disabled and is not in use anymore but is still visible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", + "value": "charging_station" + }, { "key": "parking:fee", "description": "Layer 'Charging stations' shows parking:fee=no with a fixed text, namely 'No additional parking cost while charging' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')", diff --git a/Docs/TagInfo/mapcomplete_climbing.json b/Docs/TagInfo/mapcomplete_climbing.json index d0505237c7..75142f1cec 100644 --- a/Docs/TagInfo/mapcomplete_climbing.json +++ b/Docs/TagInfo/mapcomplete_climbing.json @@ -194,6 +194,26 @@ "key": "wikipedia", "description": "The layer 'Climbing gyms allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "name", + "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, + { + "key": "website", + "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, + { + "key": "phone", + "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, + { + "key": "email", + "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, + { + "key": "opening_hours", + "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, { "key": "url", "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'url' (in the MapComplete.osm.be theme 'Open Climbing Map')" @@ -314,26 +334,6 @@ "key": "climbing:speed", "description": "Layer 'Climbing gyms' shows climbing:speed~^..*$ with a fixed text, namely 'There are {climbing:speed} speed climbing walls' (in the MapComplete.osm.be theme 'Open Climbing Map')" }, - { - "key": "name", - "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, - { - "key": "website", - "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, - { - "key": "phone", - "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, - { - "key": "email", - "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, - { - "key": "opening_hours", - "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, { "key": "climbing", "description": "The MapComplete theme Open Climbing Map has a layer Climbing routes showing features with this tag", @@ -355,6 +355,46 @@ "key": "wikipedia", "description": "The layer 'Climbing routes allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "name", + "description": "Layer 'Climbing routes' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, + { + "key": "noname", + "description": "Layer 'Climbing routes' shows noname=yes&name= with a fixed text, namely 'This climbing route doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", + "value": "yes" + }, + { + "key": "name", + "description": "Layer 'Climbing routes' shows noname=yes&name= with a fixed text, namely 'This climbing route doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map') Picking this answer will delete the key name.", + "value": "" + }, + { + "key": "climbing:length", + "description": "Layer 'Climbing routes' shows and asks freeform values for key 'climbing:length' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, + { + "key": "climbing:grade:french", + "description": "Layer 'Climbing routes' shows and asks freeform values for key 'climbing:grade:french' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, + { + "key": "climbing:bolts", + "description": "Layer 'Climbing routes' shows and asks freeform values for key 'climbing:bolts' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, + { + "key": "climbing:bolted", + "description": "Layer 'Climbing routes' shows climbing:bolted=no with a fixed text, namely 'This route is not bolted' (in the MapComplete.osm.be theme 'Open Climbing Map')", + "value": "no" + }, + { + "key": "climbing:bolted", + "description": "Layer 'Climbing routes' shows climbing:bolted=no&climbing:bolts= with a fixed text, namely 'This route is not bolted' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", + "value": "no&climbing:bolts=" + }, + { + "key": "description", + "description": "Layer 'Climbing routes' shows and asks freeform values for key 'description' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, { "key": "url", "description": "Layer 'Climbing routes' shows and asks freeform values for key 'url' (in the MapComplete.osm.be theme 'Open Climbing Map')" @@ -475,46 +515,6 @@ "key": "climbing:speed", "description": "Layer 'Climbing routes' shows climbing:speed~^..*$ with a fixed text, namely 'There are {climbing:speed} speed climbing walls' (in the MapComplete.osm.be theme 'Open Climbing Map')" }, - { - "key": "name", - "description": "Layer 'Climbing routes' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, - { - "key": "noname", - "description": "Layer 'Climbing routes' shows noname=yes&name= with a fixed text, namely 'This climbing route doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", - "value": "yes" - }, - { - "key": "name", - "description": "Layer 'Climbing routes' shows noname=yes&name= with a fixed text, namely 'This climbing route doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map') Picking this answer will delete the key name.", - "value": "" - }, - { - "key": "climbing:length", - "description": "Layer 'Climbing routes' shows and asks freeform values for key 'climbing:length' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, - { - "key": "climbing:grade:french", - "description": "Layer 'Climbing routes' shows and asks freeform values for key 'climbing:grade:french' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, - { - "key": "climbing:bolts", - "description": "Layer 'Climbing routes' shows and asks freeform values for key 'climbing:bolts' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, - { - "key": "climbing:bolted", - "description": "Layer 'Climbing routes' shows climbing:bolted=no with a fixed text, namely 'This route is not bolted' (in the MapComplete.osm.be theme 'Open Climbing Map')", - "value": "no" - }, - { - "key": "climbing:bolted", - "description": "Layer 'Climbing routes' shows climbing:bolted=no&climbing:bolts= with a fixed text, namely 'This route is not bolted' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", - "value": "no&climbing:bolts=" - }, - { - "key": "description", - "description": "Layer 'Climbing routes' shows and asks freeform values for key 'description' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, { "key": "sport", "description": "The MapComplete theme Open Climbing Map has a layer Climbing opportunities showing features with this tag", @@ -536,6 +536,44 @@ "key": "wikipedia", "description": "The layer 'Climbing opportunities allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "name", + "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, + { + "key": "noname", + "description": "Layer 'Climbing opportunities' shows noname=yes&name= with a fixed text, namely 'This climbing opportunity doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", + "value": "yes" + }, + { + "key": "name", + "description": "Layer 'Climbing opportunities' shows noname=yes&name= with a fixed text, namely 'This climbing opportunity doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map') Picking this answer will delete the key name.", + "value": "" + }, + { + "key": "climbing", + "description": "Layer 'Climbing opportunities' shows climbing=boulder with a fixed text, namely 'A climbing boulder - a single rock or cliff with one or a few climbing routes which can be climbed safely without rope' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", + "value": "boulder" + }, + { + "key": "climbing", + "description": "Layer 'Climbing opportunities' shows climbing=crag with a fixed text, namely 'A climbing crag - a single rock or cliff with at least a few climbing routes' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", + "value": "crag" + }, + { + "key": "climbing", + "description": "Layer 'Climbing opportunities' shows climbing=area with a fixed text, namely 'A climbing area with one or more climbing crags and/or boulders' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", + "value": "area" + }, + { + "key": "rock", + "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'rock' (in the MapComplete.osm.be theme 'Open Climbing Map')" + }, + { + "key": "rock", + "description": "Layer 'Climbing opportunities' shows rock=limestone with a fixed text, namely 'Limestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", + "value": "limestone" + }, { "key": "url", "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'url' (in the MapComplete.osm.be theme 'Open Climbing Map')" @@ -656,44 +694,6 @@ "key": "climbing:speed", "description": "Layer 'Climbing opportunities' shows climbing:speed~^..*$ with a fixed text, namely 'There are {climbing:speed} speed climbing walls' (in the MapComplete.osm.be theme 'Open Climbing Map')" }, - { - "key": "name", - "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, - { - "key": "noname", - "description": "Layer 'Climbing opportunities' shows noname=yes&name= with a fixed text, namely 'This climbing opportunity doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", - "value": "yes" - }, - { - "key": "name", - "description": "Layer 'Climbing opportunities' shows noname=yes&name= with a fixed text, namely 'This climbing opportunity doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map') Picking this answer will delete the key name.", - "value": "" - }, - { - "key": "climbing", - "description": "Layer 'Climbing opportunities' shows climbing=boulder with a fixed text, namely 'A climbing boulder - a single rock or cliff with one or a few climbing routes which can be climbed safely without rope' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", - "value": "boulder" - }, - { - "key": "climbing", - "description": "Layer 'Climbing opportunities' shows climbing=crag with a fixed text, namely 'A climbing crag - a single rock or cliff with at least a few climbing routes' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", - "value": "crag" - }, - { - "key": "climbing", - "description": "Layer 'Climbing opportunities' shows climbing=area with a fixed text, namely 'A climbing area with one or more climbing crags and/or boulders' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", - "value": "area" - }, - { - "key": "rock", - "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'rock' (in the MapComplete.osm.be theme 'Open Climbing Map')" - }, - { - "key": "rock", - "description": "Layer 'Climbing opportunities' shows rock=limestone with a fixed text, namely 'Limestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Climbing Map')", - "value": "limestone" - }, { "key": "leisure", "description": "The MapComplete theme Open Climbing Map has a layer Climbing opportunities? showing features with this tag", diff --git a/Docs/TagInfo/mapcomplete_cycle_infra.json b/Docs/TagInfo/mapcomplete_cycle_infra.json index 634538d407..7a38c85e26 100644 --- a/Docs/TagInfo/mapcomplete_cycle_infra.json +++ b/Docs/TagInfo/mapcomplete_cycle_infra.json @@ -600,7 +600,7 @@ }, { "key": "cycle_barrier:type", - "description": "Layer 'Barriers' shows cycle_barrier:type=double with a fixed text, namely 'Double, two barriers behind each other ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')", + "description": "Layer 'Barriers' shows cycle_barrier:type=double with a fixed text, namely 'Double, two barriers behind each other ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')", "value": "double" }, { diff --git a/Docs/TagInfo/mapcomplete_cyclofix.json b/Docs/TagInfo/mapcomplete_cyclofix.json index 9138e75b4e..f9a4eef42c 100644 --- a/Docs/TagInfo/mapcomplete_cyclofix.json +++ b/Docs/TagInfo/mapcomplete_cyclofix.json @@ -116,25 +116,6 @@ "key": "opening_hours", "description": "Layer 'Bike cafe' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')" }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike cafe' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike cafe' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike cafe' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike cafe' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "yes" - }, { "key": "shop", "description": "The MapComplete theme Cyclofix - an open map for cyclists has a layer Bike repair/shop showing features with this tag", @@ -417,25 +398,6 @@ "key": "description", "description": "Layer 'Bicycle library' shows and asks freeform values for key 'description' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')" }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bicycle library' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bicycle library' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bicycle library' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bicycle library' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "yes" - }, { "key": "amenity", "description": "The MapComplete theme Cyclofix - an open map for cyclists has a layer Bike stations (repair, pump or both) showing features with this tag", @@ -616,25 +578,6 @@ "description": "Layer 'Bike stations (repair, pump or both)' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", "value": "1" }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike stations (repair, pump or both)' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike stations (repair, pump or both)' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike stations (repair, pump or both)' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike stations (repair, pump or both)' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "yes" - }, { "key": "amenity", "description": "The MapComplete theme Cyclofix - an open map for cyclists has a layer Bicycle tube vending machine showing features with this tag", @@ -751,25 +694,6 @@ "description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_lock=yes with a fixed text, namely 'Bicycle locks are sold here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", "value": "yes" }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bicycle tube vending machine' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bicycle tube vending machine' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bicycle tube vending machine' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bicycle tube vending machine' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "yes" - }, { "key": "amenity", "description": "The MapComplete theme Cyclofix - an open map for cyclists has a layer Drinking water showing features with this tag", @@ -820,25 +744,6 @@ "description": "Layer 'Drinking water' shows bottle=no with a fixed text, namely 'Water bottles may not fit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", "value": "no" }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Drinking water' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Drinking water' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Drinking water' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Drinking water' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "yes" - }, { "key": "theme", "description": "The MapComplete theme Cyclofix - an open map for cyclists has a layer Bike related object showing features with this tag", @@ -920,25 +825,6 @@ "key": "opening_hours", "description": "Layer 'Bike related object' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')" }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike related object' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike related object' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike related object' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike related object' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "yes" - }, { "key": "service:bicycle:cleaning", "description": "The MapComplete theme Cyclofix - an open map for cyclists has a layer Bike cleaning service showing features with this tag", @@ -1080,13 +966,13 @@ }, { "key": "location", - "description": "Layer 'Bike parking' shows location=underground with a fixed text, namely 'Underground parking' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "underground" + "description": "Layer 'Bike parking' shows location=surface with a fixed text, namely 'Surface level parking' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", + "value": "surface" }, { "key": "location", - "description": "Layer 'Bike parking' shows location=surface with a fixed text, namely 'Surface level parking' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "surface" + "description": "Layer 'Bike parking' shows location=rooftop with a fixed text, namely 'Rooftop parking' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", + "value": "rooftop" }, { "key": "location", @@ -1149,25 +1035,6 @@ { "key": "capacity:cargo_bike", "description": "Layer 'Bike parking' shows and asks freeform values for key 'capacity:cargo_bike' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')" - }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike parking' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike parking' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike parking' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike parking' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')", - "value": "yes" } ] } \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_drinking_water.json b/Docs/TagInfo/mapcomplete_drinking_water.json index 2c687ac599..2db459901a 100644 --- a/Docs/TagInfo/mapcomplete_drinking_water.json +++ b/Docs/TagInfo/mapcomplete_drinking_water.json @@ -59,25 +59,6 @@ "key": "bottle", "description": "Layer 'Drinking water' shows bottle=no with a fixed text, namely 'Water bottles may not fit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water')", "value": "no" - }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Drinking water' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Drinking Water')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Drinking water' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Drinking water' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Drinking Water')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Drinking water' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water')", - "value": "yes" } ] } \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_etymology.json b/Docs/TagInfo/mapcomplete_etymology.json new file mode 100644 index 0000000000..ae6229db9d --- /dev/null +++ b/Docs/TagInfo/mapcomplete_etymology.json @@ -0,0 +1,206 @@ +{ + "data_format": 1, + "project": { + "name": "MapComplete Open Etymology Map", + "description": "What is the origin of a toponym?", + "project_url": "https://mapcomplete.osm.be/etymology", + "doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/", + "icon_url": "https://mapcomplete.osm.be/assets/layers/etymology/logo.svg", + "contact_name": "Pieter Vander Vennet, ", + "contact_email": "pietervdvn@posteo.net" + }, + "tags": [ + { + "key": "name:etymology:wikidata", + "description": "The MapComplete theme Open Etymology Map has a layer Has etymolgy showing features with this tag" + }, + { + "key": "name:etymology", + "description": "The MapComplete theme Open Etymology Map has a layer Has etymolgy showing features with this tag" + }, + { + "key": "image", + "description": "The layer 'Has etymolgy shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Has etymolgy shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Has etymolgy shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Has etymolgy shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "name:etymology:wikidata", + "description": "Layer 'Has etymolgy' shows and asks freeform values for key 'name:etymology:wikidata' (in the MapComplete.osm.be theme 'Open Etymology Map')" + }, + { + "key": "name:etymology", + "description": "Layer 'Has etymolgy' shows and asks freeform values for key 'name:etymology' (in the MapComplete.osm.be theme 'Open Etymology Map')" + }, + { + "key": "name:etymology", + "description": "Layer 'Has etymolgy' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Etymology Map')", + "value": "unknown" + }, + { + "key": "image", + "description": "The layer 'Has etymolgy allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Has etymolgy allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Has etymolgy allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Has etymolgy allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "Layer 'Has etymolgy' shows and asks freeform values for key 'wikidata' (in the MapComplete.osm.be theme 'Open Etymology Map')" + }, + { + "key": "wikidata", + "description": "Layer 'Has etymolgy' shows wikidata= with a fixed text, namely 'No Wikipedia page has been linked yet' (in the MapComplete.osm.be theme 'Open Etymology Map') Picking this answer will delete the key wikidata.", + "value": "" + }, + { + "key": "name", + "description": "The MapComplete theme Open Etymology Map has a layer Streets without etymology information showing features with this tag" + }, + { + "key": "highway", + "description": "The MapComplete theme Open Etymology Map has a layer Streets without etymology information showing features with this tag" + }, + { + "key": "image", + "description": "The layer 'Streets without etymology information shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Streets without etymology information shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Streets without etymology information shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Streets without etymology information shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "name:etymology:wikidata", + "description": "Layer 'Streets without etymology information' shows and asks freeform values for key 'name:etymology:wikidata' (in the MapComplete.osm.be theme 'Open Etymology Map')" + }, + { + "key": "name:etymology", + "description": "Layer 'Streets without etymology information' shows and asks freeform values for key 'name:etymology' (in the MapComplete.osm.be theme 'Open Etymology Map')" + }, + { + "key": "name:etymology", + "description": "Layer 'Streets without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Etymology Map')", + "value": "unknown" + }, + { + "key": "image", + "description": "The layer 'Streets without etymology information allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Streets without etymology information allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Streets without etymology information allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Streets without etymology information allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "Layer 'Streets without etymology information' shows and asks freeform values for key 'wikidata' (in the MapComplete.osm.be theme 'Open Etymology Map')" + }, + { + "key": "wikidata", + "description": "Layer 'Streets without etymology information' shows wikidata= with a fixed text, namely 'No Wikipedia page has been linked yet' (in the MapComplete.osm.be theme 'Open Etymology Map') Picking this answer will delete the key wikidata.", + "value": "" + }, + { + "key": "name", + "description": "The MapComplete theme Open Etymology Map has a layer Parks and forests without etymology information showing features with this tag" + }, + { + "key": "leisure", + "description": "The MapComplete theme Open Etymology Map has a layer Parks and forests without etymology information showing features with this tag", + "value": "park" + }, + { + "key": "landuse", + "description": "The MapComplete theme Open Etymology Map has a layer Parks and forests without etymology information showing features with this tag", + "value": "forest" + }, + { + "key": "image", + "description": "The layer 'Parks and forests without etymology information shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Parks and forests without etymology information shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Parks and forests without etymology information shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Parks and forests without etymology information shows images based on the keys image, image:0, image:1,... and wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "name:etymology:wikidata", + "description": "Layer 'Parks and forests without etymology information' shows and asks freeform values for key 'name:etymology:wikidata' (in the MapComplete.osm.be theme 'Open Etymology Map')" + }, + { + "key": "name:etymology", + "description": "Layer 'Parks and forests without etymology information' shows and asks freeform values for key 'name:etymology' (in the MapComplete.osm.be theme 'Open Etymology Map')" + }, + { + "key": "name:etymology", + "description": "Layer 'Parks and forests without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Etymology Map')", + "value": "unknown" + }, + { + "key": "image", + "description": "The layer 'Parks and forests without etymology information allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Parks and forests without etymology information allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Parks and forests without etymology information allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Parks and forests without etymology information allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "Layer 'Parks and forests without etymology information' shows and asks freeform values for key 'wikidata' (in the MapComplete.osm.be theme 'Open Etymology Map')" + }, + { + "key": "wikidata", + "description": "Layer 'Parks and forests without etymology information' shows wikidata= with a fixed text, namely 'No Wikipedia page has been linked yet' (in the MapComplete.osm.be theme 'Open Etymology Map') Picking this answer will delete the key wikidata.", + "value": "" + } + ] +} \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_food.json b/Docs/TagInfo/mapcomplete_food.json index 2ae75a8ffd..36d13bdce8 100644 --- a/Docs/TagInfo/mapcomplete_food.json +++ b/Docs/TagInfo/mapcomplete_food.json @@ -78,7 +78,7 @@ }, { "key": "wheelchair", - "description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')", + "description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')", "value": "designated" }, { @@ -305,6 +305,26 @@ "description": "Layer 'Restaurants and fast food' shows reusable_packaging:accept=only with a fixed text, namely 'You must bring your own container to order here.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')", "value": "only" }, + { + "key": "service:electricity", + "description": "Layer 'Restaurants and fast food' shows service:electricity=yes with a fixed text, namely 'There are plenty of domestic sockets available to customers seated indoors, where they can charge their electronics' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')", + "value": "yes" + }, + { + "key": "service:electricity", + "description": "Layer 'Restaurants and fast food' shows service:electricity=limited with a fixed text, namely 'There are a few domestic sockets available to customers seated indoors, where they can charge their electronics' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')", + "value": "limited" + }, + { + "key": "service:electricity", + "description": "Layer 'Restaurants and fast food' shows service:electricity=ask with a fixed text, namely 'There are no sockets available indoors to customers, but charging might be possible if the staff is asked' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')", + "value": "ask" + }, + { + "key": "service:electricity", + "description": "Layer 'Restaurants and fast food' shows service:electricity=no with a fixed text, namely 'There are a no domestic sockets available to customers seated indoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')", + "value": "no" + }, { "key": "dog", "description": "Layer 'Restaurants and fast food' shows dog=yes with a fixed text, namely 'Dogs are allowed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')", diff --git a/Docs/TagInfo/mapcomplete_fritures.json b/Docs/TagInfo/mapcomplete_fritures.json index ae5de3180e..42cf127741 100644 --- a/Docs/TagInfo/mapcomplete_fritures.json +++ b/Docs/TagInfo/mapcomplete_fritures.json @@ -83,7 +83,7 @@ }, { "key": "wheelchair", - "description": "Layer 'Fries shop' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", + "description": "Layer 'Fries shop' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", "value": "designated" }, { @@ -310,6 +310,26 @@ "description": "Layer 'Fries shop' shows reusable_packaging:accept=only with a fixed text, namely 'You must bring your own container to order here.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", "value": "only" }, + { + "key": "service:electricity", + "description": "Layer 'Fries shop' shows service:electricity=yes with a fixed text, namely 'There are plenty of domestic sockets available to customers seated indoors, where they can charge their electronics' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", + "value": "yes" + }, + { + "key": "service:electricity", + "description": "Layer 'Fries shop' shows service:electricity=limited with a fixed text, namely 'There are a few domestic sockets available to customers seated indoors, where they can charge their electronics' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", + "value": "limited" + }, + { + "key": "service:electricity", + "description": "Layer 'Fries shop' shows service:electricity=ask with a fixed text, namely 'There are no sockets available indoors to customers, but charging might be possible if the staff is asked' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", + "value": "ask" + }, + { + "key": "service:electricity", + "description": "Layer 'Fries shop' shows service:electricity=no with a fixed text, namely 'There are a no domestic sockets available to customers seated indoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", + "value": "no" + }, { "key": "dog", "description": "Layer 'Fries shop' shows dog=yes with a fixed text, namely 'Dogs are allowed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", @@ -398,7 +418,7 @@ }, { "key": "wheelchair", - "description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", + "description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", "value": "designated" }, { @@ -625,6 +645,26 @@ "description": "Layer 'Restaurants and fast food' shows reusable_packaging:accept=only with a fixed text, namely 'You must bring your own container to order here.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", "value": "only" }, + { + "key": "service:electricity", + "description": "Layer 'Restaurants and fast food' shows service:electricity=yes with a fixed text, namely 'There are plenty of domestic sockets available to customers seated indoors, where they can charge their electronics' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", + "value": "yes" + }, + { + "key": "service:electricity", + "description": "Layer 'Restaurants and fast food' shows service:electricity=limited with a fixed text, namely 'There are a few domestic sockets available to customers seated indoors, where they can charge their electronics' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", + "value": "limited" + }, + { + "key": "service:electricity", + "description": "Layer 'Restaurants and fast food' shows service:electricity=ask with a fixed text, namely 'There are no sockets available indoors to customers, but charging might be possible if the staff is asked' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", + "value": "ask" + }, + { + "key": "service:electricity", + "description": "Layer 'Restaurants and fast food' shows service:electricity=no with a fixed text, namely 'There are a no domestic sockets available to customers seated indoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", + "value": "no" + }, { "key": "dog", "description": "Layer 'Restaurants and fast food' shows dog=yes with a fixed text, namely 'Dogs are allowed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')", diff --git a/Docs/TagInfo/mapcomplete_hackerspaces.json b/Docs/TagInfo/mapcomplete_hackerspaces.json index dad5443202..bb607f4f30 100644 --- a/Docs/TagInfo/mapcomplete_hackerspaces.json +++ b/Docs/TagInfo/mapcomplete_hackerspaces.json @@ -52,7 +52,7 @@ }, { "key": "wheelchair", - "description": "Layer 'Hackerspace' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hackerspaces')", + "description": "Layer 'Hackerspace' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hackerspaces')", "value": "designated" }, { diff --git a/Docs/TagInfo/mapcomplete_maps.json b/Docs/TagInfo/mapcomplete_maps.json index 8fe815f50a..be108e5c11 100644 --- a/Docs/TagInfo/mapcomplete_maps.json +++ b/Docs/TagInfo/mapcomplete_maps.json @@ -74,25 +74,6 @@ "key": "map_source:attribution", "description": "Layer 'Maps' shows map_source:attribution=no with a fixed text, namely 'There is no attribution at all' (in the MapComplete.osm.be theme 'A map of maps')", "value": "no" - }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Maps' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'A map of maps')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Maps' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Maps' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'A map of maps')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Maps' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')", - "value": "yes" } ] } \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_nature.json b/Docs/TagInfo/mapcomplete_nature.json index c6782c08fa..75fc1ec2dd 100644 --- a/Docs/TagInfo/mapcomplete_nature.json +++ b/Docs/TagInfo/mapcomplete_nature.json @@ -60,25 +60,6 @@ "description": "Layer 'Drinking water' shows bottle=no with a fixed text, namely 'Water bottles may not fit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", "value": "no" }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Drinking water' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'De Natuur in')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Drinking water' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Drinking water' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Drinking water' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "yes" - }, { "key": "leisure", "description": "The MapComplete theme De Natuur in has a layer Vogelkijkhutten showing features with this tag", @@ -189,25 +170,6 @@ "description": "Layer 'Vogelkijkhutten' shows operator=Agentschap Natuur en Bos with a fixed text, namely 'Beheer door het Agentschap Natuur en Bos ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", "value": "Agentschap Natuur en Bos" }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Vogelkijkhutten' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'De Natuur in')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Vogelkijkhutten' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Vogelkijkhutten' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Vogelkijkhutten' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "yes" - }, { "key": "tourism", "description": "The MapComplete theme De Natuur in has a layer Maps showing features with this tag", @@ -273,25 +235,6 @@ "description": "Layer 'Maps' shows map_source:attribution=no with a fixed text, namely 'There is no attribution at all' (in the MapComplete.osm.be theme 'De Natuur in')", "value": "no" }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Maps' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'De Natuur in')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Maps' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Maps' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Maps' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "yes" - }, { "key": "information", "description": "The MapComplete theme De Natuur in has a layer Information boards showing features with this tag", @@ -313,25 +256,6 @@ "key": "wikipedia", "description": "The layer 'Information boards allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Information boards' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'De Natuur in')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Information boards' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Information boards' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Information boards' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "yes" - }, { "key": "leisure", "description": "The MapComplete theme De Natuur in has a layer Natuurgebied showing features with this tag", @@ -505,25 +429,6 @@ "key": "wikidata", "description": "Layer 'Natuurgebied' shows wikidata= with a fixed text, namely 'No Wikipedia page has been linked yet' (in the MapComplete.osm.be theme 'De Natuur in') Picking this answer will delete the key wikidata.", "value": "" - }, - { - "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Natuurgebied' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'De Natuur in')" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Natuurgebied' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "no&service:bicycle:cleaning:charge=" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Natuurgebied' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "no&" - }, - { - "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Natuurgebied' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'De Natuur in')", - "value": "yes" } ] } \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_observation_towers.json b/Docs/TagInfo/mapcomplete_observation_towers.json index f7f7caa243..1511340c08 100644 --- a/Docs/TagInfo/mapcomplete_observation_towers.json +++ b/Docs/TagInfo/mapcomplete_observation_towers.json @@ -76,19 +76,9 @@ "description": "Layer 'Observation towers' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Observation towers')", "value": "yes" }, - { - "key": "payment:app", - "description": "Layer 'Observation towers' shows payment:app=yes with a fixed text, namely 'Payment is done using a dedicated app' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Observation towers')", - "value": "yes" - }, - { - "key": "payment:membership_card", - "description": "Layer 'Observation towers' shows payment:membership_card=yes with a fixed text, namely 'Payment is done using a membership card' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Observation towers')", - "value": "yes" - }, { "key": "wheelchair", - "description": "Layer 'Observation towers' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Observation towers')", + "description": "Layer 'Observation towers' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Observation towers')", "value": "designated" }, { diff --git a/Docs/TagInfo/mapcomplete_street_lighting.json b/Docs/TagInfo/mapcomplete_street_lighting.json new file mode 100644 index 0000000000..9a3a67e87b --- /dev/null +++ b/Docs/TagInfo/mapcomplete_street_lighting.json @@ -0,0 +1,225 @@ +{ + "data_format": 1, + "project": { + "name": "MapComplete Street Lighting", + "description": "On this map you can find everything about street lighting", + "project_url": "https://mapcomplete.osm.be/street_lighting", + "doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/", + "icon_url": "https://mapcomplete.osm.be/assets/layers/street_lamps/street_lamp.svg", + "contact_name": "Pieter Vander Vennet, Robin van der Linde", + "contact_email": "pietervdvn@posteo.net" + }, + "tags": [ + { + "key": "highway", + "description": "The MapComplete theme Street Lighting has a layer Street Lamps showing features with this tag", + "value": "street_lamp" + }, + { + "key": "ref", + "description": "Layer 'Street Lamps' shows and asks freeform values for key 'ref' (in the MapComplete.osm.be theme 'Street Lighting')" + }, + { + "key": "support", + "description": "Layer 'Street Lamps' shows support=catenary with a fixed text, namely 'This lamp is suspended using cables' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "catenary" + }, + { + "key": "support", + "description": "Layer 'Street Lamps' shows support=ceiling with a fixed text, namely 'This lamp is mounted on a ceiling' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "ceiling" + }, + { + "key": "support", + "description": "Layer 'Street Lamps' shows support=ground with a fixed text, namely 'This lamp is mounted in the ground' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "ground" + }, + { + "key": "support", + "description": "Layer 'Street Lamps' shows support=pedestal with a fixed text, namely 'This lamp is mounted on a short pole (mostly < 1.5m)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "pedestal" + }, + { + "key": "support", + "description": "Layer 'Street Lamps' shows support=pole with a fixed text, namely 'This lamp is mounted on a pole' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "pole" + }, + { + "key": "support", + "description": "Layer 'Street Lamps' shows support=wall with a fixed text, namely 'This lamp is mounted directly to the wall' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "wall" + }, + { + "key": "support", + "description": "Layer 'Street Lamps' shows support=wall_mount with a fixed text, namely 'This lamp is mounted to the wall using a metal bar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "wall_mount" + }, + { + "key": "lamp_mount", + "description": "Layer 'Street Lamps' shows lamp_mount=straight_mast with a fixed text, namely 'This lamp sits atop of a straight mast' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "straight_mast" + }, + { + "key": "lamp_mount", + "description": "Layer 'Street Lamps' shows lamp_mount=bent_mast with a fixed text, namely 'This lamp sits at the end of a bent mast' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "bent_mast" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=electric with a fixed text, namely 'This lamp is lit electrically' (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "electric" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=LED with a fixed text, namely 'This lamp uses LEDs' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "LED" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=incandescent with a fixed text, namely 'This lamp uses incandescent lighting' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "incandescent" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=halogen with a fixed text, namely 'This lamp uses halogen lighting' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "halogen" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=discharge with a fixed text, namely 'This lamp uses discharge lamps (unknown type)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "discharge" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=mercury with a fixed text, namely 'This lamp uses a mercury-vapour lamp (lightly blueish)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "mercury" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=metal-halide with a fixed text, namely 'This lamp uses metal-halide lamps (bright white)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "metal-halide" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=fluorescent with a fixed text, namely 'This lamp uses fluorescent lighting' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "fluorescent" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=sodium with a fixed text, namely 'This lamp uses sodium lamps (unknown type)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "sodium" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=low_pressure_sodium with a fixed text, namely 'This lamp uses low pressure sodium lamps (monochrome orange)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "low_pressure_sodium" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=high_pressure_sodium with a fixed text, namely 'This lamp uses high pressure sodium lamps (orange with white)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "high_pressure_sodium" + }, + { + "key": "light:method", + "description": "Layer 'Street Lamps' shows light:method=gas with a fixed text, namely 'This lamp is lit using gas' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "gas" + }, + { + "key": "light:colour", + "description": "Layer 'Street Lamps' shows and asks freeform values for key 'light:colour' (in the MapComplete.osm.be theme 'Street Lighting')" + }, + { + "key": "light:colour", + "description": "Layer 'Street Lamps' shows light:colour=white with a fixed text, namely 'This lamp emits white light' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "white" + }, + { + "key": "light:colour", + "description": "Layer 'Street Lamps' shows light:colour=green with a fixed text, namely 'This lamp emits green light' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "green" + }, + { + "key": "light:colour", + "description": "Layer 'Street Lamps' shows light:colour=orange with a fixed text, namely 'This lamp emits orange light' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "orange" + }, + { + "key": "light:count", + "description": "Layer 'Street Lamps' shows and asks freeform values for key 'light:count' (in the MapComplete.osm.be theme 'Street Lighting')" + }, + { + "key": "light:count", + "description": "Layer 'Street Lamps' shows light:count=1 with a fixed text, namely 'This lamp has 1 fixture' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "1" + }, + { + "key": "light:count", + "description": "Layer 'Street Lamps' shows light:count=2 with a fixed text, namely 'This lamp has 2 fixtures' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "2" + }, + { + "key": "light:lit", + "description": "Layer 'Street Lamps' shows light:lit=dusk-dawn with a fixed text, namely 'This lamp is lit at night' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "dusk-dawn" + }, + { + "key": "light:lit", + "description": "Layer 'Street Lamps' shows light:lit=24/7 with a fixed text, namely 'This lamp is lit 24/7' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "24/7" + }, + { + "key": "light:lit", + "description": "Layer 'Street Lamps' shows light:lit=motion with a fixed text, namely 'This lamp is lit based on motion' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "motion" + }, + { + "key": "light:lit", + "description": "Layer 'Street Lamps' shows light:lit=demand with a fixed text, namely 'This lamp is lit based on demand (e.g. with a pushbutton)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "demand" + }, + { + "key": "light:direction", + "description": "Layer 'Street Lamps' shows and asks freeform values for key 'light:direction' (in the MapComplete.osm.be theme 'Street Lighting')" + }, + { + "key": "lit", + "description": "Layer 'Lit streets' shows lit=yes with a fixed text, namely 'This street is lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "yes" + }, + { + "key": "lit", + "description": "Layer 'Lit streets' shows lit=no with a fixed text, namely 'This street is not lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "no" + }, + { + "key": "lit", + "description": "Layer 'Lit streets' shows lit=sunset-sunrise with a fixed text, namely 'This street is lit at night' (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "sunset-sunrise" + }, + { + "key": "lit", + "description": "Layer 'Lit streets' shows lit=24/7 with a fixed text, namely 'This street is lit 24/7' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "24/7" + }, + { + "key": "lit", + "description": "Layer 'All streets' shows lit=yes with a fixed text, namely 'This street is lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "yes" + }, + { + "key": "lit", + "description": "Layer 'All streets' shows lit=no with a fixed text, namely 'This street is not lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "no" + }, + { + "key": "lit", + "description": "Layer 'All streets' shows lit=sunset-sunrise with a fixed text, namely 'This street is lit at night' (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "sunset-sunrise" + }, + { + "key": "lit", + "description": "Layer 'All streets' shows lit=24/7 with a fixed text, namely 'This street is lit 24/7' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Street Lighting')", + "value": "24/7" + } + ] +} \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_toilets.json b/Docs/TagInfo/mapcomplete_toilets.json index 776bae332e..4be49037fa 100644 --- a/Docs/TagInfo/mapcomplete_toilets.json +++ b/Docs/TagInfo/mapcomplete_toilets.json @@ -74,6 +74,25 @@ "key": "charge", "description": "Layer 'Toilets' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Open Toilet Map')" }, + { + "key": "payment:cash", + "description": "Layer 'Toilets' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')", + "value": "yes" + }, + { + "key": "payment:cards", + "description": "Layer 'Toilets' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')", + "value": "yes" + }, + { + "key": "opening_hours", + "description": "Layer 'Toilets' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Open Toilet Map')" + }, + { + "key": "opening_hours", + "description": "Layer 'Toilets' shows opening_hours=24/7 with a fixed text, namely 'Opened 24/7' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')", + "value": "24/7" + }, { "key": "wheelchair", "description": "Layer 'Toilets' shows wheelchair=yes with a fixed text, namely 'There is a dedicated toilet for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')", @@ -150,7 +169,7 @@ }, { "key": "toilets:paper_supplied", - "description": "Layer 'Toilets' shows toilets:paper_supplied=yes with a fixed text, namely 'Toilet paper is equipped with toilet paper' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')", + "description": "Layer 'Toilets' shows toilets:paper_supplied=yes with a fixed text, namely 'This toilet is equipped with toilet paper' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')", "value": "yes" }, { diff --git a/Docs/TagInfo/mapcomplete_waste_basket.json b/Docs/TagInfo/mapcomplete_waste_basket.json index eeebd2e5b9..1bbaca8cac 100644 --- a/Docs/TagInfo/mapcomplete_waste_basket.json +++ b/Docs/TagInfo/mapcomplete_waste_basket.json @@ -44,6 +44,31 @@ "key": "waste", "description": "Layer 'Waste Basket' shows waste=sharps with a fixed text, namely 'A waste basket for needles and other sharp objects' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Waste Basket')", "value": "sharps" + }, + { + "key": "vending", + "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag¬:vending= with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Waste Basket')", + "value": "dog_excrement_bag" + }, + { + "key": "not:vending", + "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag¬:vending= with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Waste Basket') Picking this answer will delete the key not:vending.", + "value": "" + }, + { + "key": "not:vending", + "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag&vending= with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Waste Basket')", + "value": "dog_excrement_bag" + }, + { + "key": "vending", + "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag&vending= with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Waste Basket') Picking this answer will delete the key vending.", + "value": "" + }, + { + "key": "vending", + "description": "Layer 'Waste Basket' shows vending= with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Waste Basket') Picking this answer will delete the key vending.", + "value": "" } ] } \ No newline at end of file diff --git a/Docs/Tools/GenPlot.py b/Docs/Tools/GenPlot.py index 62ab890da0..62419829a1 100644 --- a/Docs/Tools/GenPlot.py +++ b/Docs/Tools/GenPlot.py @@ -1,7 +1,7 @@ -from datetime import datetime -from matplotlib import pyplot import json import sys +from datetime import datetime +from matplotlib import pyplot def pyplot_init(): @@ -9,54 +9,55 @@ def pyplot_init(): pyplot.figure(figsize=(14, 8), dpi=200) pyplot.xticks(rotation='vertical') pyplot.grid() - + def genKeys(data, type): keys = map(lambda kv: kv["key"], data) if type == "date": - keys = map(lambda key : datetime.strptime(key, "%Y-%m-%dT%H:%M:%S.000Z"), keys) + keys = map(lambda key: datetime.strptime(key, "%Y-%m-%dT%H:%M:%S.000Z"), keys) return list(keys) + def createPie(options): data = options["plot"]["count"] keys = genKeys(data, options["interpetKeysAs"]) values = list(map(lambda kv: kv["value"], data)) - - total = sum(map(lambda kv : kv["value"], data)) + + total = sum(map(lambda kv: kv["value"], data)) first_pct = data[0]["value"] / total - + pyplot_init() pyplot.pie(values, labels=keys, startangle=(90 - 360 * first_pct / 2)) - + + def createBar(options): data = options["plot"]["count"] keys = genKeys(data, options["interpetKeysAs"]) values = list(map(lambda kv: kv["value"], data)) - + pyplot.bar(keys, values, label=options["name"]) pyplot.legend() - pyplot_init() title = sys.argv[1] pyplot.title = title names = [] -while(True): +while (True): line = sys.stdin.readline() if line == "" or line == "\n": - if(len(names) > 1): - pyplot.legend(loc="upper left", ncol=3) - pyplot.savefig(title+".png", dpi=400, facecolor='w', edgecolor='w', + if (len(names) > 1): + pyplot.legend(loc="upper left", ncol=3) + pyplot.savefig(title + ".png", dpi=400, facecolor='w', edgecolor='w', bbox_inches='tight') break - + options = json.loads(line) - print("Creating "+options["plot"]["type"]+" '"+options["name"]+"'") + print("Creating " + options["plot"]["type"] + " '" + options["name"] + "'") names.append(options["name"]) - if(options["plot"]["type"] == "pie"): + if (options["plot"]["type"] == "pie"): createPie(options) - elif(options["plot"]["type"] == "bar"): + elif (options["plot"]["type"] == "bar"): createBar(options) else: - print("Unkown type: "+options.type) \ No newline at end of file + print("Unkown type: " + options.type) diff --git a/Docs/Tools/centerpoints.geojson b/Docs/Tools/centerpoints.geojson index b1788a37b1..2492ca4507 100644 --- a/Docs/Tools/centerpoints.geojson +++ b/Docs/Tools/centerpoints.geojson @@ -26175,6 +26175,736 @@ ] } }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 9.912959749999999, + 53.568176550000004 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.9386236, + 52.39905455 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.92671375, + 52.398450800000006 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.8502412, + 50.9537904 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -4.5216465, + 41.6315787 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 13.7104317, + 52.5146233 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.86096605, + 50.9959552 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.8571554, + 50.9910854 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 14.45534885, + 51.86195935 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.500363200000001, + 52.9994699 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 8.88316705, + 49.750030949999996 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.5837175000000006, + 53.0112094 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 5.1877101, + 50.8138998 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 5.1803919, + 50.815788 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.5944477500000005, + 53.0124767 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 8.88559165, + 49.75416515 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.8711039, + 50.9838572 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -98.774433, + 38.520436000000004 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -98.77543514999999, + 38.51659705 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 1.7251018, + 41.2235419 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2134867, + 51.273909450000005 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.2426008500000005, + 50.7399335 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 14.5439431, + 52.5199993 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2135355, + 51.2739099 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -73.2482913, + -39.8174256 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.82372905, + 48.2770006 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2057786, + 51.2166419 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 149.10384465, + -35.307573649999995 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 8.74889525, + 49.95250085 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 8.8225693, + 45.8180233 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -0.3195168, + 51.5108692 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.9433354499999997, + 51.0501025 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.2011024, + 50.9274822 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.2311544, + 50.7306946 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.670592500000001, + 48.755136199999995 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.217245, + 51.2150345 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.71221775, + 48.75860525 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.3532934999999995, + 50.82130345 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -58.648593000000005, + -34.654215050000005 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.21610405, + 51.2132069 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 13.07104225, + 52.3901654 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 13.0475642, + 52.3835208 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 13.7228588, + 51.0560322 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.797343649999998, + 48.7811608 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.89930975, + 48.74755225 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.94291155, + 48.7458015 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -58.70531, + -34.6556281 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2165198, + 51.1951634 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2167532, + 51.1952601 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.20747325, + 51.1927598 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.7208156, + 51.04977505 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -80.41969245, + 37.2199775 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -58.76180895, + -34.6585943 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.21771215, + 51.21593945 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.377141649999999, + 48.52651415 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.4836779, + 51.1044175 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.5990736, + 46.66878385 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 35.9190812, + 31.95690195 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -58.467542449999996, + -34.62377535 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.090876, + 52.5058044 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.544858, + 52.2558548 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 5.9171064, + 52.5588591 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 5.9216479, + 52.5599441 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -99.3125855, + 38.876784 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.58372975, + 53.022156949999996 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -9.106560349999999, + 53.26894645 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.3665548, + 50.8442926 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.5689426, + 46.6417558 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -93.2252472, + 44.930924250000004 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.3353766, + 50.87851705 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -58.6487649, + -34.6541886 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.9755905, + 51.3370068 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.06280795, + 49.70883905 + ] + } + }, { "type": "Feature", "geometry": { @@ -29715,6 +30445,1126 @@ ] } }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.5463604, + 53.0115865 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.5481828, + 53.0129515 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.5486318, + 53.0134666 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.3435891, + 50.8314757 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.7124507, + 50.8657342 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.1439541, + 51.1716062 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.57651145, + 53.01670355 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.5695252, + 53.017952 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -0.0322978, + 49.0182547 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.7177802, + 44.351625049999996 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.2334872, + 50.7377122 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2084272499999997, + 51.220085499999996 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.35385915, + 46.4992565 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 8.992285, + 48.498860699999994 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 8.996022100000001, + 48.501749700000005 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.5389581, + 51.2419872 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.7148547499999998, + 42.210143200000005 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.5614855, + 53.0029268 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.6716799, + 44.764731 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 12.9823037, + 55.606332050000006 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 12.9923348, + 55.611163899999994 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 14.2590062, + 40.93136005 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.7280077, + 51.0445407 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.642136449999999, + 44.72005035 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.64026185, + 44.71636225 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.65099, + 44.71412565 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.35358545, + 46.498667350000005 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 12.975145300000001, + 55.597958199999994 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.678854300000001, + 44.754301749999996 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.34900455, + 46.500302649999995 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 12.98136865, + 55.60443215 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 12.97096985, + 55.60089265 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 88.3540677, + 22.57377235 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.5494963, + 53.0001853 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 7.434616650000001, + 46.949178700000004 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 13.06510535, + 52.3957008 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -58.5972038, + -34.645062249999995 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.9134751, + 51.2275968 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.1439541, + 51.1716062 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.5640763, + 53.0198777 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 7.4240155, + 46.939158649999996 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.8171891000000002, + 41.98195925 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 9.6414625, + 45.5027999 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.75107785, + 48.8108462 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.9132451, + 51.2274674 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.63869095, + 44.7081696 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 8.935956149999999, + 44.40689865 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2304059499999997, + 51.2099597 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.226562299999999, + 50.96279705 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 7.44229925, + 46.9489906 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.22910945, + 41.44735275 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.392894, + 51.20707575 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.50317545, + 48.75473 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.1353594, + 51.1818748 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.20497705, + 51.18472965 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.20557645, + 51.18384435 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.20416905, + 51.18382885 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.486115600000002, + 48.725182149999995 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2244893, + 51.2115434 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2041749499999996, + 51.1829392 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 7.4550518, + 46.9602491 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2178952, + 51.2148113 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2244893, + 51.21157615 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -58.648328750000005, + -34.651680850000005 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.083827149999999, + 50.78122465 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.1987681500000003, + 51.19621705 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 7.4177076, + 46.9393474 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 7.4288396, + 46.9526135 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.0106851, + 51.005699 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.21712535, + 51.214556 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.3507453, + 50.8536834 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.3499349, + 50.8533748 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10.63322065, + 48.8411258 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.219522, + 51.21604535 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.8604582, + 50.99566 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.289834, + 41.610439 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.1775754, + 51.1128633 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 6.5803687, + 53.2510803 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.20418225, + 51.18284165 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 7.4392947, + 46.95332115 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.2397780000000003, + 41.43957465 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.148393, + 51.1531118 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 7.44867075, + 46.96296565 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2254811, + 51.2084386 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.3413453, + 44.380366 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.67208595, + 52.10917795 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.665308750000001, + 52.114730699999996 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.20680885, + 51.2305336 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.2170325, + 51.2149832 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.2580250499999996, + 48.74150775 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 9.982036650000001, + 48.4100799 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 12.1995771, + 44.419088 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 7.42972365, + 46.953410950000006 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 4.30281045, + 50.833947699999996 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 7.433689749999999, + 46.9498844 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.8641211, + 51.0331532 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.8595969, + 51.0339334 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -9.10136625, + 53.2669087 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 30.6013954, + 50.4284077 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 30.59795485, + 50.429091 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.615215, + 50.8515194 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 5.18631465, + 50.815494900000004 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 5.1853377, + 50.814548 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 5.18632335, + 50.8154678 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 9.9102199, + 53.5662632 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 3.6454225, + 50.77147625 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -58.6672584, + -34.659333950000004 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 2.1128401, + 41.51369795 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 114.1728093, + 22.2773452 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 9.90980745, + 53.5710328 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 114.1728093, + 22.2773452 + ] + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 11.66709775, + 52.1275933 + ] + } + }, { "type": "Feature", "geometry": { diff --git a/Docs/Tools/graphs/Changesets per host in 2021.png b/Docs/Tools/graphs/Changesets per host in 2021.png index 3d25a958e6..d4931ed56b 100644 Binary files a/Docs/Tools/graphs/Changesets per host in 2021.png and b/Docs/Tools/graphs/Changesets per host in 2021.png differ diff --git a/Docs/Tools/graphs/Changesets per host.png b/Docs/Tools/graphs/Changesets per host.png index 1dd4a2ecf8..c7983e02f5 100644 Binary files a/Docs/Tools/graphs/Changesets per host.png and b/Docs/Tools/graphs/Changesets per host.png differ diff --git a/Docs/Tools/graphs/Changesets per theme (bar) in 2021.png b/Docs/Tools/graphs/Changesets per theme (bar) in 2021.png index c20e8357bb..8a594265bd 100644 Binary files a/Docs/Tools/graphs/Changesets per theme (bar) in 2021.png and b/Docs/Tools/graphs/Changesets per theme (bar) in 2021.png differ diff --git a/Docs/Tools/graphs/Changesets per theme (bar).png b/Docs/Tools/graphs/Changesets per theme (bar).png index a3d920de75..3323885089 100644 Binary files a/Docs/Tools/graphs/Changesets per theme (bar).png and b/Docs/Tools/graphs/Changesets per theme (bar).png differ diff --git a/Docs/Tools/graphs/Changesets per theme (pie) in 2021.png b/Docs/Tools/graphs/Changesets per theme (pie) in 2021.png index 8b1524bc7d..d1ba2e2699 100644 Binary files a/Docs/Tools/graphs/Changesets per theme (pie) in 2021.png and b/Docs/Tools/graphs/Changesets per theme (pie) in 2021.png differ diff --git a/Docs/Tools/graphs/Changesets per theme (pie).png b/Docs/Tools/graphs/Changesets per theme (pie).png index 5ae1dc7c0c..c01c15a086 100644 Binary files a/Docs/Tools/graphs/Changesets per theme (pie).png and b/Docs/Tools/graphs/Changesets per theme (pie).png differ diff --git a/Docs/Tools/graphs/Changesets per theme in 2021.png b/Docs/Tools/graphs/Changesets per theme in 2021.png index 8cfe945967..384126b577 100644 Binary files a/Docs/Tools/graphs/Changesets per theme in 2021.png and b/Docs/Tools/graphs/Changesets per theme in 2021.png differ diff --git a/Docs/Tools/graphs/Changesets per theme.png b/Docs/Tools/graphs/Changesets per theme.png index 0d67bafad5..5bb23d1fa9 100644 Binary files a/Docs/Tools/graphs/Changesets per theme.png and b/Docs/Tools/graphs/Changesets per theme.png differ diff --git a/Docs/Tools/graphs/Changesets per version number in 2021.png b/Docs/Tools/graphs/Changesets per version number in 2021.png index 0641d2a4f9..a76e399fc4 100644 Binary files a/Docs/Tools/graphs/Changesets per version number in 2021.png and b/Docs/Tools/graphs/Changesets per version number in 2021.png differ diff --git a/Docs/Tools/graphs/Changesets per version number.png b/Docs/Tools/graphs/Changesets per version number.png index bf6ccc351f..2840ba8ca9 100644 Binary files a/Docs/Tools/graphs/Changesets per version number.png and b/Docs/Tools/graphs/Changesets per version number.png differ diff --git a/Docs/Tools/graphs/Contributors per changeset count in 2021.png b/Docs/Tools/graphs/Contributors per changeset count in 2021.png index 87c5a63e12..5270f34e0a 100644 Binary files a/Docs/Tools/graphs/Contributors per changeset count in 2021.png and b/Docs/Tools/graphs/Contributors per changeset count in 2021.png differ diff --git a/Docs/Tools/graphs/Contributors per changeset count.png b/Docs/Tools/graphs/Contributors per changeset count.png index 54b2739816..5682b31776 100644 Binary files a/Docs/Tools/graphs/Contributors per changeset count.png and b/Docs/Tools/graphs/Contributors per changeset count.png differ diff --git a/Docs/Tools/graphs/Contributors per day in 2021.png b/Docs/Tools/graphs/Contributors per day in 2021.png index b4df69230d..5f7670ea63 100644 Binary files a/Docs/Tools/graphs/Contributors per day in 2021.png and b/Docs/Tools/graphs/Contributors per day in 2021.png differ diff --git a/Docs/Tools/graphs/Contributors per day.png b/Docs/Tools/graphs/Contributors per day.png index aaa99887fe..08bee71c2a 100644 Binary files a/Docs/Tools/graphs/Contributors per day.png and b/Docs/Tools/graphs/Contributors per day.png differ diff --git a/Docs/Tools/graphs/Empty changesets by date.png b/Docs/Tools/graphs/Empty changesets by date.png index f29901914c..fd9beb2587 100644 Binary files a/Docs/Tools/graphs/Empty changesets by date.png and b/Docs/Tools/graphs/Empty changesets by date.png differ diff --git a/Docs/Tools/stats/stats.2021-10.json b/Docs/Tools/stats/stats.2021-10.json index 5cfb485ec8..b39a4174fb 100644 --- a/Docs/Tools/stats/stats.2021-10.json +++ b/Docs/Tools/stats/stats.2021-10.json @@ -1,5 +1,4547 @@ { "features": [ + { + "id": 113211661, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 9.9095044, + 53.5645886 + ], + [ + 9.9164151, + 53.5645886 + ], + [ + 9.9164151, + 53.5717645 + ], + [ + 9.9095044, + 53.5717645 + ], + [ + 9.9095044, + 53.5645886 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Nicolelaine", + "uid": "2997398", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #waste_basket", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-31T23:18:23Z", + "reviewed_features": [], + "create": 7, + "modify": 2, + "delete": 0, + "area": 0.0000495904921300044, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "waste_basket", + "answer": 7, + "create": 7, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113209361, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.9337197, + 52.3969249 + ], + [ + 4.9435275, + 52.3969249 + ], + [ + 4.9435275, + 52.4011842 + ], + [ + 4.9337197, + 52.4011842 + ], + [ + 4.9337197, + 52.3969249 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "elmarburke", + "uid": "100952", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T21:20:58Z", + "reviewed_features": [], + "create": 0, + "modify": 16, + "delete": 0, + "area": 0.0000417743625400102, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 24, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113208196, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.9099, + 52.3871644 + ], + [ + 4.9435275, + 52.3871644 + ], + [ + 4.9435275, + 52.4097372 + ], + [ + 4.9099, + 52.4097372 + ], + [ + 4.9099, + 52.3871644 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "elmarburke", + "uid": "100952", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-31T20:35:55Z", + "reviewed_features": [], + "create": 0, + "modify": 170, + "delete": 0, + "area": 0.000759066831999958, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 263, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113206794, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.8502412, + 50.9537904 + ], + [ + 2.8502412, + 50.9537904 + ], + [ + 2.8502412, + 50.9537904 + ], + [ + 2.8502412, + 50.9537904 + ], + [ + 2.8502412, + 50.9537904 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "L'imaginaire", + "uid": "654234", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T19:46:20Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "imagery": "CartoDB.Voyager", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113203637, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -4.5216465, + 41.6315787 + ], + [ + -4.5216465, + 41.6315787 + ], + [ + -4.5216465, + 41.6315787 + ], + [ + -4.5216465, + 41.6315787 + ], + [ + -4.5216465, + 41.6315787 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "Ninopiña10", + "uid": "11138282", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #drinking_water", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T18:06:47Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "drinking_water", + "answer": 2, + "create": 1, + "imagery": "osm", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113200439, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 13.7104317, + 52.5146233 + ], + [ + 13.7104317, + 52.5146233 + ], + [ + 13.7104317, + 52.5146233 + ], + [ + 13.7104317, + 52.5146233 + ], + [ + 13.7104317, + 52.5146233 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "SKlettke", + "uid": "14218100", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cycle_infra", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T16:30:36Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cycle_infra", + "answer": 1, + "imagery": "CartoDB.Voyager", + "language": "de" + } + } + }, + { + "id": 113197196, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.8608721, + 50.9958993 + ], + [ + 2.86106, + 50.9958993 + ], + [ + 2.86106, + 50.9960111 + ], + [ + 2.8608721, + 50.9960111 + ], + [ + 2.8608721, + 50.9958993 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "L'imaginaire", + "uid": "654234", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-31T15:10:02Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 2.10072199998591e-8, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 1, + "imagery": "CartoDB.Voyager", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113196838, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.8571554, + 50.9910854 + ], + [ + 2.8571554, + 50.9910854 + ], + [ + 2.8571554, + 50.9910854 + ], + [ + 2.8571554, + 50.9910854 + ], + [ + 2.8571554, + 50.9910854 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "L'imaginaire", + "uid": "654234", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #observation_towers", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-31T15:00:25Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "observation_towers", + "imagery": "osm", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113194894, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 14.4289005, + 51.8548566 + ], + [ + 14.4817972, + 51.8548566 + ], + [ + 14.4817972, + 51.8690621 + ], + [ + 14.4289005, + 51.8690621 + ], + [ + 14.4289005, + 51.8548566 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "Mitch85302", + "uid": "14030677", + "editor": "MapComplete 0.7.2l", + "comment": "Adding data with #MapComplete for theme #waldbrand", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T14:13:38Z", + "reviewed_features": [], + "create": 5, + "modify": 5, + "delete": 0, + "area": 0.000751424071850168, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "waldbrand-app.de", + "theme": "waldbrand", + "imagery": "osm", + "language": "de", + "theme-creator": "Sebastian Kürten" + } + } + }, + { + "id": 113194138, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.4977152, + 52.9971236 + ], + [ + 6.5030112, + 52.9971236 + ], + [ + 6.5030112, + 53.0018162 + ], + [ + 6.4977152, + 53.0018162 + ], + [ + 6.4977152, + 52.9971236 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T13:56:10Z", + "reviewed_features": [], + "create": 0, + "modify": 18, + "delete": 0, + "area": 0.0000248520095999939, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 32, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113193868, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 8.878581, + 49.7459743 + ], + [ + 8.8877531, + 49.7459743 + ], + [ + 8.8877531, + 49.7540876 + ], + [ + 8.878581, + 49.7540876 + ], + [ + 8.878581, + 49.7459743 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "dekarl", + "uid": "5760", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T13:49:41Z", + "reviewed_features": [], + "create": 0, + "modify": 13, + "delete": 0, + "area": 0.0000744159989299727, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 21, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113193213, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5738892, + 53.0084482 + ], + [ + 6.5935458, + 53.0084482 + ], + [ + 6.5935458, + 53.0139706 + ], + [ + 6.5738892, + 53.0139706 + ], + [ + 6.5738892, + 53.0084482 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T13:33:04Z", + "reviewed_features": [], + "create": 0, + "modify": 18, + "delete": 0, + "area": 0.000108551607840076, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 29, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113192072, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 5.1877101, + 50.8138998 + ], + [ + 5.1877101, + 50.8138998 + ], + [ + 5.1877101, + 50.8138998 + ], + [ + 5.1877101, + 50.8138998 + ], + [ + 5.1877101, + 50.8138998 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #aed", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T13:05:09Z", + "reviewed_features": [], + "create": 1, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "aed", + "answer": 4, + "create": 1, + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113191871, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 5.1803919, + 50.815788 + ], + [ + 5.1803919, + 50.815788 + ], + [ + 5.1803919, + 50.815788 + ], + [ + 5.1803919, + 50.815788 + ], + [ + 5.1803919, + 50.815788 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #shops", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T12:59:32Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "shops", + "answer": 1, + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113188983, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5867669, + 53.0080644 + ], + [ + 6.6021286, + 53.0080644 + ], + [ + 6.6021286, + 53.016889 + ], + [ + 6.5867669, + 53.016889 + ], + [ + 6.5867669, + 53.0080644 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T11:37:43Z", + "reviewed_features": [], + "create": 0, + "modify": 67, + "delete": 0, + "area": 0.000135560857819959, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 112, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113185480, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 8.8815533, + 49.7526375 + ], + [ + 8.88963, + 49.7526375 + ], + [ + 8.88963, + 49.7556928 + ], + [ + 8.8815533, + 49.7556928 + ], + [ + 8.8815533, + 49.7526375 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "dekarl", + "uid": "5760", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T09:59:22Z", + "reviewed_features": [], + "create": 0, + "modify": 3, + "delete": 0, + "area": 0.0000246767415099986, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 5, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113183368, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.8711039, + 50.9838572 + ], + [ + 2.8711039, + 50.9838572 + ], + [ + 2.8711039, + 50.9838572 + ], + [ + 2.8711039, + 50.9838572 + ], + [ + 2.8711039, + 50.9838572 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "L'imaginaire", + "uid": "654234", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #aed", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-31T08:41:01Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "aed", + "imagery": "osm", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113178247, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -98.782857, + 38.51376 + ], + [ + -98.766009, + 38.51376 + ], + [ + -98.766009, + 38.527112 + ], + [ + -98.782857, + 38.527112 + ], + [ + -98.782857, + 38.51376 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "s_SoNick", + "uid": "8082926", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-31T02:14:53Z", + "reviewed_features": [], + "create": 0, + "modify": 11, + "delete": 0, + "area": 0.000224954496000215, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 11, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113178210, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -98.7761413, + 38.511638 + ], + [ + -98.774729, + 38.511638 + ], + [ + -98.774729, + 38.5215561 + ], + [ + -98.7761413, + 38.5215561 + ], + [ + -98.7761413, + 38.511638 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "s_SoNick", + "uid": "8082926", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-31T02:09:36Z", + "reviewed_features": [], + "create": 0, + "modify": 5, + "delete": 0, + "area": 0.000014007332630125, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 5, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113174278, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 1.725044, + 41.2232003 + ], + [ + 1.7251596, + 41.2232003 + ], + [ + 1.7251596, + 41.2238835 + ], + [ + 1.725044, + 41.2238835 + ], + [ + 1.725044, + 41.2232003 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "yopaseopor", + "uid": "500572", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #amenity", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-30T20:55:50Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 7.89779199996998e-8, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "amenity", + "answer": 1, + "create": 1, + "imagery": "osm", + "language": "ca" + } + } + }, + { + "id": 113171049, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2134379, + 51.273909 + ], + [ + 3.2135355, + 51.273909 + ], + [ + 3.2135355, + 51.2739099 + ], + [ + 3.2134379, + 51.2739099 + ], + [ + 3.2134379, + 51.273909 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #ghostbikes", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-30T18:39:23Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 8.78399996392555e-11, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "ghostbikes", + "imagery": "CartoDB.Positron", + "language": "en", + "move:node/9212378672": "improve_accuracy" + } + } + }, + { + "id": 113170848, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.242573, + 50.7396755 + ], + [ + 4.2426287, + 50.7396755 + ], + [ + 4.2426287, + 50.7401915 + ], + [ + 4.242573, + 50.7401915 + ], + [ + 4.242573, + 50.7396755 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "joost schouppe", + "uid": "67832", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-30T18:31:18Z", + "reviewed_features": [], + "create": 2, + "modify": 4, + "delete": 0, + "area": 2.87412000001961e-8, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 12, + "create": 2, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113167174, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 14.5439431, + 52.5199993 + ], + [ + 14.5439431, + 52.5199993 + ], + [ + 14.5439431, + 52.5199993 + ], + [ + 14.5439431, + 52.5199993 + ], + [ + 14.5439431, + 52.5199993 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "RoySiegel1409", + "uid": "14378838", + "editor": "MapComplete 0.7.2l", + "comment": "Adding data with #MapComplete for theme #waldbrand", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-30T16:24:35Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "waldbrand-app.de", + "theme": "waldbrand", + "imagery": "osm", + "language": "de", + "theme-creator": "Sebastian Kürten" + } + } + }, + { + "id": 113166817, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2135355, + 51.2739099 + ], + [ + 3.2135355, + 51.2739099 + ], + [ + 3.2135355, + 51.2739099 + ], + [ + 3.2135355, + 51.2739099 + ], + [ + 3.2135355, + 51.2739099 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "349499", + "uid": "7006347", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #ghostbikes", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-30T16:11:57Z", + "reviewed_features": [], + "create": 1, + "modify": 3, + "delete": 0, + "area": 0, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "ghostbikes", + "answer": 3, + "create": 1, + "imagery": "CartoDB.Positron", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113164317, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -73.2482913, + -39.8174256 + ], + [ + -73.2482913, + -39.8174256 + ], + [ + -73.2482913, + -39.8174256 + ], + [ + -73.2482913, + -39.8174256 + ], + [ + -73.2482913, + -39.8174256 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Awo", + "uid": "196556", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #trees", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-30T14:58:49Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "trees", + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113162656, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.8069881, + 48.2709046 + ], + [ + 11.84047, + 48.2709046 + ], + [ + 11.84047, + 48.2830966 + ], + [ + 11.8069881, + 48.2830966 + ], + [ + 11.8069881, + 48.2709046 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ladoga", + "uid": "827957", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-30T14:08:43Z", + "reviewed_features": [], + "create": 0, + "modify": 25, + "delete": 0, + "area": 0.000408211324799962, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 37, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113156911, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2057786, + 51.2166419 + ], + [ + 3.2057786, + 51.2166419 + ], + [ + 3.2057786, + 51.2166419 + ], + [ + 3.2057786, + 51.2166419 + ], + [ + 3.2057786, + 51.2166419 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #climbing", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-30T11:14:33Z", + "reviewed_features": [], + "create": 0, + "modify": 4, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "climbing", + "answer": 7, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113154144, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 149.1017236, + -35.3107329 + ], + [ + 149.1059657, + -35.3107329 + ], + [ + 149.1059657, + -35.3044144 + ], + [ + 149.1017236, + -35.3044144 + ], + [ + 149.1017236, + -35.3107329 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Leinna", + "uid": "12622581", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-30T09:51:15Z", + "reviewed_features": [], + "create": 0, + "modify": 5, + "delete": 0, + "area": 0.0000268037088499896, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 7, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113151688, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 8.6125637, + 49.7658392 + ], + [ + 8.8852268, + 49.7658392 + ], + [ + 8.8852268, + 50.1391625 + ], + [ + 8.6125637, + 50.1391625 + ], + [ + 8.6125637, + 49.7658392 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "dekarl", + "uid": "5760", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-30T08:24:32Z", + "reviewed_features": [], + "create": 0, + "modify": 26, + "delete": 0, + "area": 0.101791488280228, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 41, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113150555, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 8.8225646, + 45.818017 + ], + [ + 8.822574, + 45.818017 + ], + [ + 8.822574, + 45.8180296 + ], + [ + 8.8225646, + 45.8180296 + ], + [ + 8.8225646, + 45.818017 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "valhalla", + "uid": "18818", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #bookcases", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-30T07:37:57Z", + "reviewed_features": [], + "create": 1, + "modify": 5, + "delete": 0, + "area": 1.18440000044692e-10, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "bookcases", + "answer": 4, + "create": 1, + "imagery": "osm", + "language": "en", + "move:node/9211743706": "improve_accuracy" + } + } + }, + { + "id": 113146384, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -0.3195168, + 51.5108692 + ], + [ + -0.3195168, + 51.5108692 + ], + [ + -0.3195168, + 51.5108692 + ], + [ + -0.3195168, + 51.5108692 + ], + [ + -0.3195168, + 51.5108692 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Milhouse", + "uid": "132695", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-30T02:27:32Z", + "reviewed_features": [], + "create": 1, + "modify": 0, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 1, + "create": 1, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113145619, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.197621, + 50.8796176 + ], + [ + 4.6890499, + 50.8796176 + ], + [ + 4.6890499, + 51.2205874 + ], + [ + 3.197621, + 51.2205874 + ], + [ + 3.197621, + 50.8796176 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #ghostbikes", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-30T00:36:39Z", + "reviewed_features": [], + "create": 0, + "modify": 3, + "delete": 0, + "area": 0.508532213747214, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 2, + "theme": "ghostbikes", + "answer": 1, + "imagery": "CartoDB.Positron", + "language": "en", + "move:node/6017635080": "improve_accuracy", + "move:node/7947512310": "improve_accuracy" + } + } + }, + { + "id": 113141592, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.1913033, + 50.9108255 + ], + [ + 4.2109015, + 50.9108255 + ], + [ + 4.2109015, + 50.9441389 + ], + [ + 4.1913033, + 50.9441389 + ], + [ + 4.1913033, + 50.9108255 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Thierry1030", + "uid": "286563", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #cyclestreets", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-29T20:59:57Z", + "reviewed_features": [], + "create": 0, + "modify": 7, + "delete": 0, + "area": 0.000652882675879943, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclestreets", + "answer": 7, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113133260, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.2311544, + 50.7306946 + ], + [ + 4.2311544, + 50.7306946 + ], + [ + 4.2311544, + 50.7306946 + ], + [ + 4.2311544, + 50.7306946 + ], + [ + 4.2311544, + 50.7306946 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "joost schouppe", + "uid": "67832", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-29T16:57:13Z", + "reviewed_features": [], + "create": 1, + "modify": 0, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 4, + "create": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113132316, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.6684818, + 48.7547809 + ], + [ + 10.6727032, + 48.7547809 + ], + [ + 10.6727032, + 48.7554915 + ], + [ + 10.6684818, + 48.7554915 + ], + [ + 10.6684818, + 48.7547809 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ladoga", + "uid": "827957", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-29T16:33:48Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0.00000299972683999146, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 3, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113131130, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2155456, + 51.2139071 + ], + [ + 3.2189444, + 51.2139071 + ], + [ + 3.2189444, + 51.2161619 + ], + [ + 3.2155456, + 51.2161619 + ], + [ + 3.2155456, + 51.2139071 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.0-beta", + "comment": "Adding data with #MapComplete for theme #grb", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-29T16:07:28Z", + "reviewed_features": [], + "create": 0, + "modify": 7, + "delete": 0, + "area": 0.00000766361424000939, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "theme": "grb", + "answer": 13, + "imagery": "AGIVFlandersGRB", + "language": "nl" + } + } + }, + { + "id": 113128981, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.7113688, + 48.7561252 + ], + [ + 10.7130667, + 48.7561252 + ], + [ + 10.7130667, + 48.7610853 + ], + [ + 10.7113688, + 48.7610853 + ], + [ + 10.7113688, + 48.7561252 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ladoga", + "uid": "827957", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-29T15:08:58Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0.00000842175378999643, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 1, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113127802, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.3513466, + 50.8198358 + ], + [ + 6.3552404, + 50.8198358 + ], + [ + 6.3552404, + 50.8227711 + ], + [ + 6.3513466, + 50.8227711 + ], + [ + 6.3513466, + 50.8198358 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "tordans", + "uid": "11881", + "editor": "MapComplete 0.12.0-beta", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-29T14:38:40Z", + "reviewed_features": [], + "create": 0, + "modify": 4, + "delete": 0, + "area": 0.000011429471139987, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "etymology", + "answer": 13, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113125295, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -58.6505992, + -34.6548127 + ], + [ + -58.6465868, + -34.6548127 + ], + [ + -58.6465868, + -34.6536174 + ], + [ + -58.6505992, + -34.6536174 + ], + [ + -58.6505992, + -34.6548127 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "AgusQui", + "uid": "331218", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-29T13:34:05Z", + "reviewed_features": [], + "create": 1, + "modify": 2, + "delete": 0, + "area": 0.00000479602171999717, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "answer": 6, + "create": 1, + "imagery": "EsriWorldImageryClarity", + "language": "es" + } + } + }, + { + "id": 113125083, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2158276, + 51.2131309 + ], + [ + 3.2163805, + 51.2131309 + ], + [ + 3.2163805, + 51.2132829 + ], + [ + 3.2158276, + 51.2132829 + ], + [ + 3.2158276, + 51.2131309 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.0-beta", + "comment": "Adding data with #MapComplete for theme #grb", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-29T13:28:30Z", + "reviewed_features": [], + "create": 16, + "modify": 0, + "delete": 0, + "area": 8.40407999999901e-8, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "theme": "grb", + "import": 3, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113120672, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 13.0475642, + 52.3835208 + ], + [ + 13.0945203, + 52.3835208 + ], + [ + 13.0945203, + 52.39681 + ], + [ + 13.0475642, + 52.39681 + ], + [ + 13.0475642, + 52.3835208 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "hfs", + "uid": "9607", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #bookcases", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-29T11:38:22Z", + "reviewed_features": [], + "create": 0, + "modify": 15, + "delete": 0, + "area": 0.000624009004120114, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "bookcases", + "answer": 16, + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113120671, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 13.0475642, + 52.3835208 + ], + [ + 13.0475642, + 52.3835208 + ], + [ + 13.0475642, + 52.3835208 + ], + [ + 13.0475642, + 52.3835208 + ], + [ + 13.0475642, + 52.3835208 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "hfs", + "uid": "9607", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #bookcases", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-29T11:38:22Z", + "reviewed_features": [], + "create": 1, + "modify": 0, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "bookcases", + "create": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113116149, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 13.7228588, + 51.0560322 + ], + [ + 13.7228588, + 51.0560322 + ], + [ + 13.7228588, + 51.0560322 + ], + [ + 13.7228588, + 51.0560322 + ], + [ + 13.7228588, + 51.0560322 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "brust84", + "uid": "1225756", + "editor": "MapComplete 0.12.0-beta", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-29T09:56:35Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "cyclofix", + "answer": 2, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113108382, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.6407026, + 48.7462049 + ], + [ + 10.9539847, + 48.7462049 + ], + [ + 10.9539847, + 48.8161167 + ], + [ + 10.6407026, + 48.8161167 + ], + [ + 10.6407026, + 48.7462049 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ladoga", + "uid": "827957", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-29T06:31:05Z", + "reviewed_features": [], + "create": 0, + "modify": 77, + "delete": 0, + "area": 0.02190211551878, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 124, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113092656, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.8957393, + 48.7454436 + ], + [ + 10.9028802, + 48.7454436 + ], + [ + 10.9028802, + 48.7496609 + ], + [ + 10.8957393, + 48.7496609 + ], + [ + 10.8957393, + 48.7454436 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ladoga", + "uid": "827957", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-28T17:53:51Z", + "reviewed_features": [], + "create": 0, + "modify": 4, + "delete": 0, + "area": 0.000030115317570002, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 5, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113088240, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.9093188, + 48.7382601 + ], + [ + 10.9765043, + 48.7382601 + ], + [ + 10.9765043, + 48.7533429 + ], + [ + 10.9093188, + 48.7533429 + ], + [ + 10.9093188, + 48.7382601 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ladoga", + "uid": "827957", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-28T15:44:19Z", + "reviewed_features": [], + "create": 0, + "modify": 16, + "delete": 0, + "area": 0.00101334545940014, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 24, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113082716, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -58.7642102, + -34.657644 + ], + [ + -58.6464098, + -34.657644 + ], + [ + -58.6464098, + -34.6536122 + ], + [ + -58.7642102, + -34.6536122 + ], + [ + -58.7642102, + -34.657644 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "AgusQui", + "uid": "331218", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-28T13:17:57Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 0.000474947652719991, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "answer": 4, + "create": 1, + "imagery": "osm", + "language": "es" + } + } + }, + { + "id": 113082381, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2165198, + 51.1951634 + ], + [ + 3.2165198, + 51.1951634 + ], + [ + 3.2165198, + 51.1951634 + ], + [ + 3.2165198, + 51.1951634 + ], + [ + 3.2165198, + 51.1951634 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #personal", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-28T13:07:42Z", + "reviewed_features": [], + "create": 1, + "modify": 0, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "personal", + "answer": 1, + "create": 1, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113082319, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2167532, + 51.1952601 + ], + [ + 3.2167532, + 51.1952601 + ], + [ + 3.2167532, + 51.1952601 + ], + [ + 3.2167532, + 51.1952601 + ], + [ + 3.2167532, + 51.1952601 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #charging_stations", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-28T13:05:25Z", + "reviewed_features": [], + "create": 1, + "modify": 4, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "charging_stations", + "answer": 7, + "create": 1, + "imagery": "osm", + "language": "nl", + "add-image": 1, + "move:node/-1": "improve_accuracy" + } + } + }, + { + "id": 113082105, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2051478, + 51.1908592 + ], + [ + 3.2097987, + 51.1908592 + ], + [ + 3.2097987, + 51.1946604 + ], + [ + 3.2051478, + 51.1946604 + ], + [ + 3.2051478, + 51.1908592 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-28T12:59:33Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0.0000176790010799898, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 2, + "imagery": "osm", + "language": "nl", + "add-image": 2 + } + } + }, + { + "id": 113077093, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.7169707, + 51.0405579 + ], + [ + 3.7246605, + 51.0405579 + ], + [ + 3.7246605, + 51.0589922 + ], + [ + 3.7169707, + 51.0589922 + ], + [ + 3.7169707, + 51.0405579 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #food", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-28T10:56:10Z", + "reviewed_features": [], + "create": 0, + "modify": 8, + "delete": 0, + "area": 0.000141756080139967, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "food", + "answer": 13, + "imagery": "osm", + "language": "en", + "move:node/4227045139": "improve_accuracy" + } + } + }, + { + "id": 113059829, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -80.4202249, + 37.2173421 + ], + [ + -80.41916, + 37.2173421 + ], + [ + -80.41916, + 37.2226129 + ], + [ + -80.4202249, + 37.2226129 + ], + [ + -80.4202249, + 37.2173421 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "CuzRocks2Heavy", + "uid": "14297970", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-28T01:01:27Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0.00000561287491993851, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "etymology", + "answer": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113059588, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -58.7619062, + -34.658618 + ], + [ + -58.7617117, + -34.658618 + ], + [ + -58.7617117, + -34.6585706 + ], + [ + -58.7619062, + -34.6585706 + ], + [ + -58.7619062, + -34.658618 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "AgusQui", + "uid": "331218", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-28T00:36:01Z", + "reviewed_features": [], + "create": 2, + "modify": 0, + "delete": 0, + "area": 9.21929999990372e-9, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "answer": 2, + "create": 2, + "imagery": "osm", + "language": "es" + } + } + }, + { + "id": 113058608, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2144808, + 51.2119677 + ], + [ + 3.2209435, + 51.2119677 + ], + [ + 3.2209435, + 51.2199112 + ], + [ + 3.2144808, + 51.2199112 + ], + [ + 3.2144808, + 51.2119677 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.0-beta", + "comment": "Adding data with #MapComplete for theme #sidewalks", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-27T23:19:37Z", + "reviewed_features": [], + "create": 0, + "modify": 6, + "delete": 0, + "area": 0.0000513364574499761, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "theme": "sidewalks", + "answer": 7, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113051034, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.9484684, + 48.2694872 + ], + [ + 11.8058149, + 48.2694872 + ], + [ + 11.8058149, + 48.7835411 + ], + [ + 10.9484684, + 48.7835411 + ], + [ + 10.9484684, + 48.2694872 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ladoga", + "uid": "827957", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-27T18:35:39Z", + "reviewed_features": [], + "create": 0, + "modify": 22, + "delete": 0, + "area": 0.44072231197635, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 35, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113050669, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.4836779, + 51.1044175 + ], + [ + 3.4836779, + 51.1044175 + ], + [ + 3.4836779, + 51.1044175 + ], + [ + 3.4836779, + 51.1044175 + ], + [ + 3.4836779, + 51.1044175 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "s8evq", + "uid": "3710738", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #https://raw.githubusercontent.com/seppesantens/MapComplete-Themes/main/VerkeerdeBordenDatabank/VerkeerdeBordenDatabank.json", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-27T18:22:31Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "https://raw.githubusercontent.com/seppesantens/MapComplete-Themes/main/VerkeerdeBordenDatabank/VerkeerdeBordenDatabank.json", + "answer": 1, + "imagery": "Stamen.TonerLite", + "language": "en" + } + } + }, + { + "id": 113044898, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.5990696, + 46.6687776 + ], + [ + 11.5990776, + 46.6687776 + ], + [ + 11.5990776, + 46.6687901 + ], + [ + 11.5990696, + 46.6687901 + ], + [ + 11.5990696, + 46.6687776 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "Pablo667", + "uid": "13166651", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #toilets", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-27T16:06:49Z", + "reviewed_features": [], + "create": 1, + "modify": 3, + "delete": 0, + "area": 1.00000000023515e-10, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "toilets", + "answer": 4, + "create": 1, + "imagery": "osm", + "language": "en", + "move:node/9205242210": "improve_accuracy" + } + } + }, + { + "id": 113038656, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 35.9156074, + 31.9560911 + ], + [ + 35.922555, + 31.9560911 + ], + [ + 35.922555, + 31.9577128 + ], + [ + 35.9156074, + 31.9577128 + ], + [ + 35.9156074, + 31.9560911 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Alan Orth", + "uid": "10607774", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-27T13:38:04Z", + "reviewed_features": [], + "create": 0, + "modify": 4, + "delete": 0, + "area": 0.0000112669229200142, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 8, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113037755, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -58.5251221, + -34.6388335 + ], + [ + -58.4099628, + -34.6388335 + ], + [ + -58.4099628, + -34.6087172 + ], + [ + -58.5251221, + -34.6087172 + ], + [ + -58.5251221, + -34.6388335 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "AgusQui", + "uid": "331218", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-27T13:16:26Z", + "reviewed_features": [], + "create": 6, + "modify": 9, + "delete": 0, + "area": 0.00346817202658938, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "answer": 28, + "create": 6, + "imagery": "EsriWorldImageryClarity", + "language": "es" + } + } + }, + { + "id": 113034431, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.090876, + 52.5058044 + ], + [ + 6.090876, + 52.5058044 + ], + [ + 6.090876, + 52.5058044 + ], + [ + 6.090876, + 52.5058044 + ], + [ + 6.090876, + 52.5058044 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #drinking_water", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-27T11:46:19Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "drinking_water", + "answer": 1, + "imagery": "CartoDB.Voyager", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113030047, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.544858, + 52.2558548 + ], + [ + 10.544858, + 52.2558548 + ], + [ + 10.544858, + 52.2558548 + ], + [ + 10.544858, + 52.2558548 + ], + [ + 10.544858, + 52.2558548 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Willhelm_Mueller", + "uid": "308224", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #bookcases", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-27T10:15:34Z", + "reviewed_features": [], + "create": 1, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "bookcases", + "answer": 3, + "create": 1, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113028520, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 5.9171064, + 52.5588591 + ], + [ + 5.9171064, + 52.5588591 + ], + [ + 5.9171064, + 52.5588591 + ], + [ + 5.9171064, + 52.5588591 + ], + [ + 5.9171064, + 52.5588591 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #drinking_water", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-27T09:42:23Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "drinking_water", + "answer": 1, + "imagery": "CartoDB.Voyager", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113024531, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 5.9216479, + 52.5599441 + ], + [ + 5.9216479, + 52.5599441 + ], + [ + 5.9216479, + 52.5599441 + ], + [ + 5.9216479, + 52.5599441 + ], + [ + 5.9216479, + 52.5599441 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #drinking_water", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-27T08:00:45Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "drinking_water", + "answer": 1, + "create": 1, + "imagery": "CartoDB.Voyager", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113019941, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -99.3152435, + 38.870964 + ], + [ + -99.3099275, + 38.870964 + ], + [ + -99.3099275, + 38.882604 + ], + [ + -99.3152435, + 38.882604 + ], + [ + -99.3152435, + 38.870964 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "s_SoNick", + "uid": "8082926", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-27T06:03:22Z", + "reviewed_features": [], + "create": 0, + "modify": 4, + "delete": 0, + "area": 0.0000618782399999229, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 12, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113010848, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5712079, + 53.0125167 + ], + [ + 6.5962516, + 53.0125167 + ], + [ + 6.5962516, + 53.0317972 + ], + [ + 6.5712079, + 53.0317972 + ], + [ + 6.5712079, + 53.0125167 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-26T20:58:46Z", + "reviewed_features": [], + "create": 0, + "modify": 12, + "delete": 0, + "area": 0.000482855057850024, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 23, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113008229, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -9.1353143, + 53.2613781 + ], + [ + -9.0778064, + 53.2613781 + ], + [ + -9.0778064, + 53.2765148 + ], + [ + -9.1353143, + 53.2765148 + ], + [ + -9.1353143, + 53.2613781 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Cmap99", + "uid": "13524250", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #sport_pitches", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-26T19:41:15Z", + "reviewed_features": [], + "create": 0, + "modify": 25, + "delete": 0, + "area": 0.000870479829929949, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "sport_pitches", + "answer": 36, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113005319, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.3665548, + 50.8442926 + ], + [ + 4.3665548, + 50.8442926 + ], + [ + 4.3665548, + 50.8442926 + ], + [ + 4.3665548, + 50.8442926 + ], + [ + 4.3665548, + 50.8442926 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "joost schouppe", + "uid": "67832", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #charging_stations", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-26T17:57:48Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "charging_stations", + "answer": 1, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113001200, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.5689426, + 46.6417558 + ], + [ + 11.5689426, + 46.6417558 + ], + [ + 11.5689426, + 46.6417558 + ], + [ + 11.5689426, + 46.6417558 + ], + [ + 11.5689426, + 46.6417558 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "Pablo667", + "uid": "13166651", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #toilets", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-26T16:04:09Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "toilets", + "answer": 2, + "create": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 112999964, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -93.2370498, + 44.9152733 + ], + [ + -93.2134446, + 44.9152733 + ], + [ + -93.2134446, + 44.9465752 + ], + [ + -93.2370498, + 44.9465752 + ], + [ + -93.2370498, + 44.9152733 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "SpeedMcCool", + "uid": "2260722", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-26T15:34:08Z", + "reviewed_features": [], + "create": 0, + "modify": 8, + "delete": 0, + "area": 0.000738887609879628, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 12, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 112999873, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.3349443, + 50.8784486 + ], + [ + 4.3358089, + 50.8784486 + ], + [ + 4.3358089, + 50.8785855 + ], + [ + 4.3349443, + 50.8785855 + ], + [ + 4.3349443, + 50.8784486 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-26T15:31:35Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 1.1836374000094e-7, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "imagery": "osm", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 112993571, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -58.6497979, + -34.6545584 + ], + [ + -58.6477319, + -34.6545584 + ], + [ + -58.6477319, + -34.6538188 + ], + [ + -58.6497979, + -34.6538188 + ], + [ + -58.6497979, + -34.6545584 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "AgusQui", + "uid": "331218", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-10-26T13:05:41Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0.00000152801359999587, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "answer": 3, + "imagery": "osm", + "language": "es" + } + } + }, + { + "id": 112993400, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.9755905, + 51.3370068 + ], + [ + 4.9755905, + 51.3370068 + ], + [ + 4.9755905, + 51.3370068 + ], + [ + 4.9755905, + 51.3370068 + ], + [ + 4.9755905, + 51.3370068 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Stinus_Clasius", + "uid": "1086503", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #aed", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-26T13:00:55Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "aed", + "answer": 5, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 112986442, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.0567635, + 49.6987406 + ], + [ + 11.0688524, + 49.6987406 + ], + [ + 11.0688524, + 49.7189375 + ], + [ + 11.0567635, + 49.7189375 + ], + [ + 11.0567635, + 49.6987406 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "pbnoxious", + "uid": "356987", + "editor": "MapComplete 0.11.2", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-10-26T10:19:36Z", + "reviewed_features": [], + "create": 0, + "modify": 98, + "delete": 0, + "area": 0.000244158304410027, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 154, + "imagery": "osm", + "language": "en" + } + } + }, { "id": 112977842, "type": "Feature", diff --git a/Docs/Tools/stats/stats.2021-11.json b/Docs/Tools/stats/stats.2021-11.json new file mode 100644 index 0000000000..c9c20a8a19 --- /dev/null +++ b/Docs/Tools/stats/stats.2021-11.json @@ -0,0 +1,7103 @@ +{ + "features": [ + { + "id": 113491702, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5463604, + 53.0115865 + ], + [ + 6.5463604, + 53.0115865 + ], + [ + 6.5463604, + 53.0115865 + ], + [ + 6.5463604, + 53.0115865 + ], + [ + 6.5463604, + 53.0115865 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.12.1", + "comment": "Adding data with #MapComplete for theme #cycle_infra", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-07T18:29:20Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cycle_infra", + "answer": 2, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113491295, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5481828, + 53.0129515 + ], + [ + 6.5481828, + 53.0129515 + ], + [ + 6.5481828, + 53.0129515 + ], + [ + 6.5481828, + 53.0129515 + ], + [ + 6.5481828, + 53.0129515 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.12.1", + "comment": "Adding data with #MapComplete for theme #street_lighting_assen", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-07T18:16:06Z", + "reviewed_features": [], + "create": 1, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "street_lighting_assen", + "answer": 8, + "create": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113491238, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5486318, + 53.0134666 + ], + [ + 6.5486318, + 53.0134666 + ], + [ + 6.5486318, + 53.0134666 + ], + [ + 6.5486318, + 53.0134666 + ], + [ + 6.5486318, + 53.0134666 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.12.1", + "comment": "Adding data with #MapComplete for theme #street_lighting", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-07T18:14:19Z", + "reviewed_features": [], + "create": 1, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "street_lighting", + "answer": 8, + "create": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113489356, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.3435891, + 50.8314757 + ], + [ + 4.3435891, + 50.8314757 + ], + [ + 4.3435891, + 50.8314757 + ], + [ + 4.3435891, + 50.8314757 + ], + [ + 4.3435891, + 50.8314757 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1", + "comment": "Adding data with #MapComplete for theme #ghostbikes", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-07T17:18:25Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "theme": "ghostbikes", + "answer": 2, + "imagery": "CartoDB.Positron", + "language": "nl" + } + } + }, + { + "id": 113489134, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.7124507, + 50.8657342 + ], + [ + 3.7124507, + 50.8657342 + ], + [ + 3.7124507, + 50.8657342 + ], + [ + 3.7124507, + 50.8657342 + ], + [ + 3.7124507, + 50.8657342 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "L'imaginaire", + "uid": "654234", + "editor": "MapComplete 0.12.0", + "comment": "Adding data with #MapComplete for theme #artwork", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-07T17:13:14Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "artwork", + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113488340, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.1439541, + 51.1716062 + ], + [ + 4.1439541, + 51.1716062 + ], + [ + 4.1439541, + 51.1716062 + ], + [ + 4.1439541, + 51.1716062 + ], + [ + 4.1439541, + 51.1716062 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.0", + "comment": "Adding data with #MapComplete for theme #toilets", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-07T16:51:22Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "theme": "toilets", + "answer": 2, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113481936, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5628899, + 53.0090367 + ], + [ + 6.590133, + 53.0090367 + ], + [ + 6.590133, + 53.0243704 + ], + [ + 6.5628899, + 53.0243704 + ], + [ + 6.5628899, + 53.0090367 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.12.2-beta", + "comment": "Adding data with #MapComplete for theme #postboxes", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-07T14:14:41Z", + "reviewed_features": [], + "create": 0, + "modify": 13, + "delete": 0, + "area": 0.000417737522469978, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/post-partner/", + "theme": "postboxes", + "answer": 19, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113480631, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5695252, + 53.017952 + ], + [ + 6.5695252, + 53.017952 + ], + [ + 6.5695252, + 53.017952 + ], + [ + 6.5695252, + 53.017952 + ], + [ + 6.5695252, + 53.017952 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.12.2-beta", + "comment": "Adding data with #MapComplete for theme #cycle_infra", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-07T13:43:15Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "cycle_infra", + "answer": 1, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113480016, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -0.0323045, + 49.0182418 + ], + [ + -0.0322911, + 49.0182418 + ], + [ + -0.0322911, + 49.0182676 + ], + [ + -0.0323045, + 49.0182676 + ], + [ + -0.0323045, + 49.0182418 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "gtaro", + "uid": "2973154", + "editor": "MapComplete 0.11.4", + "comment": "Adding data with #MapComplete for theme #toilets", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-07T13:26:24Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 3.45720000041099e-10, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "toilets", + "answer": 5, + "create": 1, + "imagery": "osm", + "language": "fr", + "move:node/9233019525": "improve_accuracy" + } + } + }, + { + "id": 113477074, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.717778, + 44.3513939 + ], + [ + 11.7177824, + 44.3513939 + ], + [ + 11.7177824, + 44.3518562 + ], + [ + 11.717778, + 44.3518562 + ], + [ + 11.717778, + 44.3513939 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Danysan95", + "uid": "4425563", + "editor": "MapComplete 0.11.4", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-07T12:05:01Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 2.03412000078743e-9, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113472305, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.2334872, + 50.7377122 + ], + [ + 4.2334872, + 50.7377122 + ], + [ + 4.2334872, + 50.7377122 + ], + [ + 4.2334872, + 50.7377122 + ], + [ + 4.2334872, + 50.7377122 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "joost schouppe", + "uid": "67832", + "editor": "MapComplete 0.11.4", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-07T09:43:02Z", + "reviewed_features": [], + "create": 1, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 6, + "create": 1, + "imagery": "CartoDB.Voyager", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113465263, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.20747, + 51.2193065 + ], + [ + 3.2093845, + 51.2193065 + ], + [ + 3.2093845, + 51.2208645 + ], + [ + 3.20747, + 51.2208645 + ], + [ + 3.20747, + 51.2193065 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-07T01:09:51Z", + "reviewed_features": [], + "create": 0, + "modify": 14, + "delete": 0, + "area": 0.00000298279099999223, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 24, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113463623, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.3507974, + 46.4987505 + ], + [ + 11.3569209, + 46.4987505 + ], + [ + 11.3569209, + 46.4997625 + ], + [ + 11.3507974, + 46.4997625 + ], + [ + 11.3507974, + 46.4987505 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "MaximusIT", + "uid": "132225", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #surveillance", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-06T22:49:13Z", + "reviewed_features": [], + "create": 8, + "modify": 29, + "delete": 0, + "area": 0.00000619698200001883, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "surveillance", + "answer": 42, + "create": 8, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113463553, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 8.9920731, + 48.4988367 + ], + [ + 8.9924969, + 48.4988367 + ], + [ + 8.9924969, + 48.4988847 + ], + [ + 8.9920731, + 48.4988847 + ], + [ + 8.9920731, + 48.4988367 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Ygramul", + "uid": "1230818", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #trees", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-06T22:46:24Z", + "reviewed_features": [], + "create": 0, + "modify": 3, + "delete": 0, + "area": 2.03423999998362e-8, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "trees", + "answer": 6, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113463449, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 8.9908201, + 48.4997284 + ], + [ + 9.0012241, + 48.4997284 + ], + [ + 9.0012241, + 48.503771 + ], + [ + 8.9908201, + 48.503771 + ], + [ + 8.9908201, + 48.4997284 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Ygramul", + "uid": "1230818", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-06T22:39:48Z", + "reviewed_features": [], + "create": 0, + "modify": 5, + "delete": 0, + "area": 0.0000420592103999792, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 5, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113450975, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.5389581, + 51.2419872 + ], + [ + 4.5389581, + 51.2419872 + ], + [ + 4.5389581, + 51.2419872 + ], + [ + 4.5389581, + 51.2419872 + ], + [ + 4.5389581, + 51.2419872 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "pi11", + "uid": "12066190", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #surveillance", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-06T15:29:08Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "surveillance", + "answer": 1, + "create": 1, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113450551, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.6865183, + 42.1972861 + ], + [ + 2.7431912, + 42.1972861 + ], + [ + 2.7431912, + 42.2230003 + ], + [ + 2.6865183, + 42.2230003 + ], + [ + 2.6865183, + 42.1972861 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "quelgir", + "uid": "13293058", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-06T15:17:55Z", + "reviewed_features": [], + "create": 0, + "modify": 13, + "delete": 0, + "area": 0.00145729828518017, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 14, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113448373, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5614855, + 53.0029268 + ], + [ + 6.5614855, + 53.0029268 + ], + [ + 6.5614855, + 53.0029268 + ], + [ + 6.5614855, + 53.0029268 + ], + [ + 6.5614855, + 53.0029268 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #charging_stations", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-06T14:30:32Z", + "reviewed_features": [], + "create": 1, + "modify": 8, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "charging_stations", + "answer": 11, + "create": 1, + "imagery": "CartoDB.Voyager", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113444561, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.6692221, + 44.7605103 + ], + [ + 10.6741377, + 44.7605103 + ], + [ + 10.6741377, + 44.7689517 + ], + [ + 10.6692221, + 44.7689517 + ], + [ + 10.6692221, + 44.7605103 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "NonnEmilia", + "uid": "683102", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-06T12:46:37Z", + "reviewed_features": [], + "create": 0, + "modify": 6, + "delete": 0, + "area": 0.0000414945458399997, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 9, + "imagery": "osm", + "language": "it" + } + } + }, + { + "id": 113442152, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 12.9679002, + 55.5981608 + ], + [ + 12.9967072, + 55.5981608 + ], + [ + 12.9967072, + 55.6145033 + ], + [ + 12.9679002, + 55.6145033 + ], + [ + 12.9679002, + 55.5981608 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Cerritus", + "uid": "12919", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-06T11:27:52Z", + "reviewed_features": [], + "create": 0, + "modify": 16, + "delete": 0, + "area": 0.000470778397499989, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 19, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113438716, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 12.9896861, + 55.6099415 + ], + [ + 12.9949835, + 55.6099415 + ], + [ + 12.9949835, + 55.6123863 + ], + [ + 12.9896861, + 55.6123863 + ], + [ + 12.9896861, + 55.6099415 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Cerritus", + "uid": "12919", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-06T09:37:57Z", + "reviewed_features": [], + "create": 2, + "modify": 1, + "delete": 0, + "area": 0.0000129510835199958, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 3, + "create": 2, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113438500, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 14.2377422, + 40.9166827 + ], + [ + 14.2802702, + 40.9166827 + ], + [ + 14.2802702, + 40.9460374 + ], + [ + 14.2377422, + 40.9460374 + ], + [ + 14.2377422, + 40.9166827 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Acheloo", + "uid": "11366923", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-06T09:30:58Z", + "reviewed_features": [], + "create": 0, + "modify": 83, + "delete": 0, + "area": 0.00124839668159998, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 121, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113429453, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.7280077, + 51.0445407 + ], + [ + 3.7280077, + 51.0445407 + ], + [ + 3.7280077, + 51.0445407 + ], + [ + 3.7280077, + 51.0445407 + ], + [ + 3.7280077, + 51.0445407 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.2-beta", + "comment": "Adding data with #MapComplete for theme #drinking_water", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-05T22:34:25Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "drinking_water", + "answer": 1, + "create": 1, + "imagery": "CartoDB.Voyager", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113428932, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.6368818, + 44.7198549 + ], + [ + 10.6473911, + 44.7198549 + ], + [ + 10.6473911, + 44.7202458 + ], + [ + 10.6368818, + 44.7202458 + ], + [ + 10.6368818, + 44.7198549 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "NonnEmilia", + "uid": "683102", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #food", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T22:10:53Z", + "reviewed_features": [], + "create": 0, + "modify": 5, + "delete": 0, + "area": 0.00000410808536999299, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "food", + "answer": 12, + "imagery": "osm", + "language": "it" + } + } + }, + { + "id": 113428858, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.6368944, + 44.7155991 + ], + [ + 10.6436293, + 44.7155991 + ], + [ + 10.6436293, + 44.7171254 + ], + [ + 10.6368944, + 44.7171254 + ], + [ + 10.6368944, + 44.7155991 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "NonnEmilia", + "uid": "683102", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cafes_and_pubs", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T22:07:54Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0.0000102794778700148, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cafes_and_pubs", + "answer": 5, + "imagery": "osm", + "language": "it" + } + } + }, + { + "id": 113428835, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.6509034, + 44.7140631 + ], + [ + 10.6510766, + 44.7140631 + ], + [ + 10.6510766, + 44.7141882 + ], + [ + 10.6509034, + 44.7141882 + ], + [ + 10.6509034, + 44.7140631 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "NonnEmilia", + "uid": "683102", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #toilets", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T22:06:06Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 2.16673200007942e-8, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "toilets", + "answer": 4, + "imagery": "osm", + "language": "it" + } + } + }, + { + "id": 113428798, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.3495687, + 46.4970481 + ], + [ + 11.3576022, + 46.4970481 + ], + [ + 11.3576022, + 46.5002866 + ], + [ + 11.3495687, + 46.5002866 + ], + [ + 11.3495687, + 46.4970481 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "MaximusIT", + "uid": "132225", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #surveillance", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T22:04:13Z", + "reviewed_features": [], + "create": 6, + "modify": 15, + "delete": 0, + "area": 0.0000260164897500148, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "surveillance", + "answer": 33, + "create": 6, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113428563, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 12.9746711, + 55.5979214 + ], + [ + 12.9756195, + 55.5979214 + ], + [ + 12.9756195, + 55.597995 + ], + [ + 12.9746711, + 55.597995 + ], + [ + 12.9746711, + 55.5979214 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Cerritus", + "uid": "12919", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #shops", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T21:52:59Z", + "reviewed_features": [], + "create": 0, + "modify": 8, + "delete": 0, + "area": 6.98022400003523e-8, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "shops", + "answer": 8, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113428090, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.6665392, + 44.7445564 + ], + [ + 10.6911694, + 44.7445564 + ], + [ + 10.6911694, + 44.7640471 + ], + [ + 10.6665392, + 44.7640471 + ], + [ + 10.6665392, + 44.7445564 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "NonnEmilia", + "uid": "683102", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-05T21:35:55Z", + "reviewed_features": [], + "create": 0, + "modify": 22, + "delete": 0, + "area": 0.000480059839139946, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 28, + "imagery": "osm", + "language": "it" + } + } + }, + { + "id": 113426608, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.3487564, + 46.5002575 + ], + [ + 11.3492527, + 46.5002575 + ], + [ + 11.3492527, + 46.5003478 + ], + [ + 11.3487564, + 46.5003478 + ], + [ + 11.3487564, + 46.5002575 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "MaximusIT", + "uid": "132225", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #surveillance", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T20:45:16Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 4.48158900018126e-8, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "surveillance", + "answer": 4, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113421595, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 12.9669906, + 55.5962 + ], + [ + 12.9957467, + 55.5962 + ], + [ + 12.9957467, + 55.6126643 + ], + [ + 12.9669906, + 55.6126643 + ], + [ + 12.9669906, + 55.5962 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Cerritus", + "uid": "12919", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T18:24:33Z", + "reviewed_features": [], + "create": 0, + "modify": 21, + "delete": 0, + "area": 0.000473449057229855, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 24, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113418491, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 12.9677728, + 55.5984981 + ], + [ + 12.9741669, + 55.5984981 + ], + [ + 12.9741669, + 55.6032872 + ], + [ + 12.9677728, + 55.6032872 + ], + [ + 12.9677728, + 55.5984981 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Cerritus", + "uid": "12919", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T17:00:19Z", + "reviewed_features": [], + "create": 0, + "modify": 4, + "delete": 0, + "area": 0.0000306219843099754, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 5, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113413987, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 88.3509729, + 22.5620033 + ], + [ + 88.3571625, + 22.5620033 + ], + [ + 88.3571625, + 22.5855414 + ], + [ + 88.3509729, + 22.5855414 + ], + [ + 88.3509729, + 22.5620033 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Bodhisattwa", + "uid": "2876061", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T15:22:34Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0.000145691423759975, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 2, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113412065, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5494963, + 53.0001853 + ], + [ + 6.5494963, + 53.0001853 + ], + [ + 6.5494963, + 53.0001853 + ], + [ + 6.5494963, + 53.0001853 + ], + [ + 6.5494963, + 53.0001853 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.12.2-beta", + "comment": "Adding data with #MapComplete for theme #street_lighting", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-05T14:30:32Z", + "reviewed_features": [], + "create": 1, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "street_lighting", + "answer": 7, + "create": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113411796, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.4299429, + 46.9471541 + ], + [ + 7.4392904, + 46.9471541 + ], + [ + 7.4392904, + 46.9512033 + ], + [ + 7.4299429, + 46.9512033 + ], + [ + 7.4299429, + 46.9471541 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "habi", + "uid": "15671", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-05T14:22:58Z", + "reviewed_features": [], + "create": 4, + "modify": 3, + "delete": 0, + "area": 0.0000378498970000387, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 14, + "create": 4, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113410685, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 13.0497048, + 52.3891526 + ], + [ + 13.0805059, + 52.3891526 + ], + [ + 13.0805059, + 52.402249 + ], + [ + 13.0497048, + 52.402249 + ], + [ + 13.0497048, + 52.3891526 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "hfs", + "uid": "9607", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T13:55:26Z", + "reviewed_features": [], + "create": 0, + "modify": 68, + "delete": 0, + "area": 0.000403383526039839, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 115, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113410204, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -58.597413, + -34.6450639 + ], + [ + -58.5969946, + -34.6450639 + ], + [ + -58.5969946, + -34.6450606 + ], + [ + -58.597413, + -34.6450606 + ], + [ + -58.597413, + -34.6450639 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "AgusQui", + "uid": "331218", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-05T13:44:53Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 1.38071999830083e-9, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "answer": 2, + "imagery": "osm", + "language": "es" + } + } + }, + { + "id": 113409895, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.9134751, + 51.2275968 + ], + [ + 2.9134751, + 51.2275968 + ], + [ + 2.9134751, + 51.2275968 + ], + [ + 2.9134751, + 51.2275968 + ], + [ + 2.9134751, + 51.2275968 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "Tom Callens", + "uid": "14405801", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #benches", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T13:37:55Z", + "reviewed_features": [], + "create": 1, + "modify": 5, + "delete": 0, + "area": 0, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "benches", + "answer": 6, + "create": 1, + "imagery": "osm", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113409798, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.1439541, + 51.1716062 + ], + [ + 4.1439541, + 51.1716062 + ], + [ + 4.1439541, + 51.1716062 + ], + [ + 4.1439541, + 51.1716062 + ], + [ + 4.1439541, + 51.1716062 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.2-beta", + "comment": "Adding data with #MapComplete for theme #toilets", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-05T13:35:20Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "toilets", + "answer": 6, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113409011, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5640763, + 53.0198777 + ], + [ + 6.5640763, + 53.0198777 + ], + [ + 6.5640763, + 53.0198777 + ], + [ + 6.5640763, + 53.0198777 + ], + [ + 6.5640763, + 53.0198777 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #test", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-05T13:15:53Z", + "reviewed_features": [], + "create": 1, + "modify": 3, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "test", + "answer": 1, + "create": 1, + "imagery": "osm", + "language": "en", + "add-image": 2 + } + } + }, + { + "id": 113407314, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.4219758, + 46.9305649 + ], + [ + 7.4260552, + 46.9305649 + ], + [ + 7.4260552, + 46.9477524 + ], + [ + 7.4219758, + 46.9477524 + ], + [ + 7.4219758, + 46.9305649 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "habi", + "uid": "15671", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-05T12:31:10Z", + "reviewed_features": [], + "create": 1, + "modify": 5, + "delete": 0, + "area": 0.0000701146874999973, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "cyclofix", + "answer": 7, + "create": 1, + "imagery": "CartoDB.Voyager", + "language": "en", + "move:node/4568201391": "improve_accuracy" + } + } + }, + { + "id": 113405992, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.8108884, + 41.9797913 + ], + [ + 2.8234898, + 41.9797913 + ], + [ + 2.8234898, + 41.9841272 + ], + [ + 2.8108884, + 41.9841272 + ], + [ + 2.8108884, + 41.9797913 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "quelgir", + "uid": "13293058", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T11:53:54Z", + "reviewed_features": [], + "create": 0, + "modify": 4, + "delete": 0, + "area": 0.0000546384102600114, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 6, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113404377, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 9.6381426, + 45.498189 + ], + [ + 9.6447824, + 45.498189 + ], + [ + 9.6447824, + 45.5074108 + ], + [ + 9.6381426, + 45.5074108 + ], + [ + 9.6381426, + 45.498189 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Mannivu", + "uid": "1950277", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T11:15:15Z", + "reviewed_features": [], + "create": 0, + "modify": 41, + "delete": 0, + "area": 0.0000612309076399951, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 64, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113404365, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.7391136, + 48.7976723 + ], + [ + 10.7630421, + 48.7976723 + ], + [ + 10.7630421, + 48.8240201 + ], + [ + 10.7391136, + 48.8240201 + ], + [ + 10.7391136, + 48.7976723 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ladoga", + "uid": "827957", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T11:14:54Z", + "reviewed_features": [], + "create": 0, + "modify": 6, + "delete": 0, + "area": 0.00063046333229992, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 10, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113403407, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.9132451, + 51.2274674 + ], + [ + 2.9132451, + 51.2274674 + ], + [ + 2.9132451, + 51.2274674 + ], + [ + 2.9132451, + 51.2274674 + ], + [ + 2.9132451, + 51.2274674 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "Tom Callens", + "uid": "14405801", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #benches", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T10:51:47Z", + "reviewed_features": [], + "create": 1, + "modify": 5, + "delete": 0, + "area": 0, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "benches", + "answer": 5, + "create": 1, + "imagery": "osm", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113401156, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.6284641, + 44.6969162 + ], + [ + 10.6489178, + 44.6969162 + ], + [ + 10.6489178, + 44.719423 + ], + [ + 10.6284641, + 44.719423 + ], + [ + 10.6284641, + 44.6969162 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "NonnEmilia", + "uid": "683102", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-05T09:58:57Z", + "reviewed_features": [], + "create": 0, + "modify": 81, + "delete": 0, + "area": 0.000460347335160025, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 131, + "imagery": "osm", + "language": "it" + } + } + }, + { + "id": 113400546, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 8.9319354, + 44.4054811 + ], + [ + 8.9399769, + 44.4054811 + ], + [ + 8.9399769, + 44.4083162 + ], + [ + 8.9319354, + 44.4083162 + ], + [ + 8.9319354, + 44.4054811 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "sabas88", + "uid": "454589", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T09:39:14Z", + "reviewed_features": [], + "create": 0, + "modify": 32, + "delete": 0, + "area": 0.0000227984566499867, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 46, + "imagery": "osm", + "language": "it" + } + } + }, + { + "id": 113399744, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2303788, + 51.2099501 + ], + [ + 3.2304331, + 51.2099501 + ], + [ + 3.2304331, + 51.2099693 + ], + [ + 3.2303788, + 51.2099693 + ], + [ + 3.2303788, + 51.2099501 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Maarten O", + "uid": "13326535", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #aed", + "comments_count": 1, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T09:12:45Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 1.04255999983614e-9, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "aed", + "answer": 1, + "imagery": "osm", + "language": "nl", + "move:node/9223875638": "improve_accuracy" + } + } + }, + { + "id": 113397481, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.2245134, + 50.961555 + ], + [ + 4.2286112, + 50.961555 + ], + [ + 4.2286112, + 50.9640391 + ], + [ + 4.2245134, + 50.9640391 + ], + [ + 4.2245134, + 50.961555 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "kobevandeweerdt", + "uid": "14408432", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclestreets", + "comments_count": 3, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-05T08:06:00Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0.0000101793449800139, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclestreets", + "answer": 2, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113386555, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.4413531, + 46.9488652 + ], + [ + 7.4432454, + 46.9488652 + ], + [ + 7.4432454, + 46.949116 + ], + [ + 7.4413531, + 46.949116 + ], + [ + 7.4413531, + 46.9488652 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "habi", + "uid": "15671", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T21:19:11Z", + "reviewed_features": [], + "create": 4, + "modify": 5, + "delete": 0, + "area": 4.74588839993215e-7, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 15, + "create": 4, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113385218, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.2271092, + 41.4472158 + ], + [ + 2.2311097, + 41.4472158 + ], + [ + 2.2311097, + 41.4474897 + ], + [ + 2.2271092, + 41.4474897 + ], + [ + 2.2271092, + 41.4472158 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "Maribelens", + "uid": "13480216", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #https://llefia.org/arbres/mapcomplete1.json", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-04T20:33:11Z", + "reviewed_features": [], + "create": 13, + "modify": 23, + "delete": 0, + "area": 0.00000109573694998512, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "https://llefia.org/arbres/mapcomplete1.json", + "answer": 40, + "create": 13, + "imagery": "HDM_HOT", + "language": "ca" + } + } + }, + { + "id": 113382487, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.3925035, + 51.2058146 + ], + [ + 4.3932845, + 51.2058146 + ], + [ + 4.3932845, + 51.2083369 + ], + [ + 4.3925035, + 51.2083369 + ], + [ + 4.3925035, + 51.2058146 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "matissevdberg", + "uid": "12928471", + "editor": "MapComplete 0.12.2-beta", + "comment": "Adding data with #MapComplete for theme #surveillance", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-04T19:22:17Z", + "reviewed_features": [], + "create": 2, + "modify": 6, + "delete": 0, + "area": 0.00000196991630000178, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "surveillance", + "answer": 9, + "create": 2, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113382251, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.5015844, + 48.7539323 + ], + [ + 10.5047665, + 48.7539323 + ], + [ + 10.5047665, + 48.7555277 + ], + [ + 10.5015844, + 48.7555277 + ], + [ + 10.5015844, + 48.7539323 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ladoga", + "uid": "827957", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-04T19:15:47Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0.00000507672233999808, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 3, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113376351, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.1339296, + 51.1800377 + ], + [ + 3.1367892, + 51.1800377 + ], + [ + 3.1367892, + 51.1837119 + ], + [ + 3.1339296, + 51.1837119 + ], + [ + 3.1339296, + 51.1800377 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T16:12:01Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0.0000105067423199965, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 2, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113375792, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2031415, + 51.1837065 + ], + [ + 3.2068126, + 51.1837065 + ], + [ + 3.2068126, + 51.1857528 + ], + [ + 3.2031415, + 51.1857528 + ], + [ + 3.2031415, + 51.1837065 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.2-beta", + "comment": "Adding data with #MapComplete for theme #grb", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T15:56:32Z", + "reviewed_features": [], + "create": 95, + "modify": 18, + "delete": 0, + "area": 0.00000751217193001292, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "move": 14, + "theme": "grb", + "import": 16, + "imagery": "AGIV10cm", + "language": "en", + "conflation": 2 + } + } + }, + { + "id": 113375786, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2053807, + 51.183576 + ], + [ + 3.2057722, + 51.183576 + ], + [ + 3.2057722, + 51.1841127 + ], + [ + 3.2053807, + 51.1841127 + ], + [ + 3.2053807, + 51.183576 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.2-beta", + "comment": "Adding data with #MapComplete for theme #grb", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T15:56:22Z", + "reviewed_features": [], + "create": 9, + "modify": 0, + "delete": 0, + "area": 2.10118049999207e-7, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "theme": "grb", + "answer": 1, + "import": 1, + "imagery": "AGIV10cm", + "language": "en" + } + } + }, + { + "id": 113375744, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2033105, + 51.1834603 + ], + [ + 3.2050276, + 51.1834603 + ], + [ + 3.2050276, + 51.1841974 + ], + [ + 3.2033105, + 51.1841974 + ], + [ + 3.2033105, + 51.1834603 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.2-beta", + "comment": "Adding data with #MapComplete for theme #grb", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T15:55:06Z", + "reviewed_features": [], + "create": 22, + "modify": 1, + "delete": 0, + "area": 0.00000126567441000353, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "theme": "grb", + "answer": 2, + "import": 4, + "imagery": "AGIV10cm", + "language": "en" + } + } + }, + { + "id": 113375602, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.4793327, + 48.7206269 + ], + [ + 10.4928985, + 48.7206269 + ], + [ + 10.4928985, + 48.7297374 + ], + [ + 10.4793327, + 48.7297374 + ], + [ + 10.4793327, + 48.7206269 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ladoga", + "uid": "827957", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-04T15:51:05Z", + "reviewed_features": [], + "create": 0, + "modify": 12, + "delete": 0, + "area": 0.000123591220899982, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 22, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113375570, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2185596, + 51.2099383 + ], + [ + 3.230419, + 51.2099383 + ], + [ + 3.230419, + 51.2131485 + ], + [ + 3.2185596, + 51.2131485 + ], + [ + 3.2185596, + 51.2099383 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Maarten O", + "uid": "13326535", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #aed", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-04T15:50:25Z", + "reviewed_features": [], + "create": 0, + "modify": 3, + "delete": 0, + "area": 0.0000380710458800614, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 2, + "theme": "aed", + "answer": 2, + "imagery": "osm", + "language": "nl", + "move:node/9223875638": "improve_accuracy" + } + } + }, + { + "id": 113374469, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2026258, + 51.1822476 + ], + [ + 3.2057241, + 51.1822476 + ], + [ + 3.2057241, + 51.1836308 + ], + [ + 3.2026258, + 51.1836308 + ], + [ + 3.2026258, + 51.1822476 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.2-beta", + "comment": "Adding data with #MapComplete for theme #grb", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T15:21:59Z", + "reviewed_features": [], + "create": 229, + "modify": 22, + "delete": 0, + "area": 0.00000428556856002004, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "move": 16, + "theme": "grb", + "answer": 2, + "import": 18, + "imagery": "osm", + "language": "en", + "conflation": 4 + } + } + }, + { + "id": 113374140, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.4332193, + 46.9457835 + ], + [ + 7.4768843, + 46.9457835 + ], + [ + 7.4768843, + 46.9747147 + ], + [ + 7.4332193, + 46.9747147 + ], + [ + 7.4332193, + 46.9457835 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "habi", + "uid": "15671", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T15:11:15Z", + "reviewed_features": [], + "create": 6, + "modify": 4, + "delete": 0, + "area": 0.0012632808480001, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "cyclofix", + "answer": 11, + "create": 6, + "imagery": "CartoDB.Voyager", + "language": "en", + "move:node/9223995072": "improve_accuracy" + } + } + }, + { + "id": 113374077, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2174894, + 51.2146756 + ], + [ + 3.218301, + 51.2146756 + ], + [ + 3.218301, + 51.214947 + ], + [ + 3.2174894, + 51.214947 + ], + [ + 3.2174894, + 51.2146756 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #sidewalks", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T15:09:04Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 2.20268240002105e-7, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "sidewalks", + "answer": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113373022, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2185596, + 51.2100038 + ], + [ + 3.230419, + 51.2100038 + ], + [ + 3.230419, + 51.2131485 + ], + [ + 3.2185596, + 51.2131485 + ], + [ + 3.2185596, + 51.2100038 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Maarten O", + "uid": "13326535", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #aed_brugge", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T14:41:06Z", + "reviewed_features": [], + "create": 2, + "modify": 9, + "delete": 0, + "area": 0.0000372942551800002, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "aed_brugge", + "answer": 14, + "create": 2, + "imagery": "HDM_HOT", + "language": "nl", + "add-image": 7, + "move:node/9223917538": "improve_accuracy" + } + } + }, + { + "id": 113368653, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -58.7642102, + -34.6640938 + ], + [ + -58.5324473, + -34.6640938 + ], + [ + -58.5324473, + -34.6392679 + ], + [ + -58.7642102, + -34.6392679 + ], + [ + -58.7642102, + -34.6640938 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "AgusQui", + "uid": "331218", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T12:47:13Z", + "reviewed_features": [], + "create": 0, + "modify": 10, + "delete": 0, + "area": 0.00575372257911075, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "answer": 11, + "imagery": "osm", + "language": "es" + } + } + }, + { + "id": 113367547, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.8783306, + 50.7731883 + ], + [ + 4.2893237, + 50.7731883 + ], + [ + 4.2893237, + 50.789261 + ], + [ + 3.8783306, + 50.789261 + ], + [ + 3.8783306, + 50.7731883 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "joost schouppe", + "uid": "67832", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #grb", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T12:18:50Z", + "reviewed_features": [], + "create": 2, + "modify": 1, + "delete": 0, + "area": 0.00660576879837093, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "grb", + "answer": 1, + "import": 2, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113364948, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.1797695, + 51.1910897 + ], + [ + 3.2177668, + 51.1910897 + ], + [ + 3.2177668, + 51.2013444 + ], + [ + 3.1797695, + 51.2013444 + ], + [ + 3.1797695, + 51.1910897 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Maarten O", + "uid": "13326535", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #aed", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-04T11:00:44Z", + "reviewed_features": [], + "create": 0, + "modify": 4, + "delete": 0, + "area": 0.000389650912310169, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "aed", + "answer": 4, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113364737, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.4177076, + 46.9393474 + ], + [ + 7.4177076, + 46.9393474 + ], + [ + 7.4177076, + 46.9393474 + ], + [ + 7.4177076, + 46.9393474 + ], + [ + 7.4177076, + 46.9393474 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "habi", + "uid": "15671", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T10:54:30Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 3, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113360279, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.4281942, + 46.951999 + ], + [ + 7.429485, + 46.951999 + ], + [ + 7.429485, + 46.953228 + ], + [ + 7.4281942, + 46.953228 + ], + [ + 7.4281942, + 46.951999 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "habi", + "uid": "15671", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T08:23:47Z", + "reviewed_features": [], + "create": 0, + "modify": 6, + "delete": 0, + "area": 0.00000158639320000227, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 6, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113354339, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.0106851, + 51.005699 + ], + [ + 4.0106851, + 51.005699 + ], + [ + 4.0106851, + 51.005699 + ], + [ + 4.0106851, + 51.005699 + ], + [ + 4.0106851, + 51.005699 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Thierry1030", + "uid": "286563", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-04T01:41:04Z", + "reviewed_features": [], + "create": 1, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 4, + "create": 1, + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113353891, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.216794, + 51.2144849 + ], + [ + 3.2174567, + 51.2144849 + ], + [ + 3.2174567, + 51.2146271 + ], + [ + 3.216794, + 51.2146271 + ], + [ + 3.216794, + 51.2144849 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #grb", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-04T01:06:12Z", + "reviewed_features": [], + "create": 7, + "modify": 11, + "delete": 0, + "area": 9.42359399993855e-8, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "theme": "grb", + "import": 3, + "imagery": "AGIVFlandersGRB", + "language": "nl" + } + } + }, + { + "id": 113353572, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.3507453, + 50.8536834 + ], + [ + 4.3507453, + 50.8536834 + ], + [ + 4.3507453, + 50.8536834 + ], + [ + 4.3507453, + 50.8536834 + ], + [ + 4.3507453, + 50.8536834 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Thierry1030", + "uid": "286563", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #toilets", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-04T00:31:11Z", + "reviewed_features": [], + "create": 1, + "modify": 0, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "toilets", + "answer": 1, + "create": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113351309, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.3499349, + 50.8533748 + ], + [ + 4.3499349, + 50.8533748 + ], + [ + 4.3499349, + 50.8533748 + ], + [ + 4.3499349, + 50.8533748 + ], + [ + 4.3499349, + 50.8533748 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Thierry1030", + "uid": "286563", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-03T22:09:26Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 2, + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113351051, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.6106046, + 48.8341666 + ], + [ + 10.6558367, + 48.8341666 + ], + [ + 10.6558367, + 48.848085 + ], + [ + 10.6106046, + 48.848085 + ], + [ + 10.6106046, + 48.8341666 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ladoga", + "uid": "827957", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-03T21:58:13Z", + "reviewed_features": [], + "create": 0, + "modify": 9, + "delete": 0, + "area": 0.000629558460639741, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 13, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113350305, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2192701, + 51.2156384 + ], + [ + 3.2197739, + 51.2156384 + ], + [ + 3.2197739, + 51.2164523 + ], + [ + 3.2192701, + 51.2164523 + ], + [ + 3.2192701, + 51.2156384 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #grb", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-03T21:29:10Z", + "reviewed_features": [], + "create": 5, + "modify": 15, + "delete": 0, + "area": 4.10042819998336e-7, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "move": 13, + "theme": "grb", + "imagery": "AGIVFlandersGRB", + "language": "en", + "conflation": 4 + } + } + }, + { + "id": 113347810, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.8604582, + 50.99566 + ], + [ + 2.8604582, + 50.99566 + ], + [ + 2.8604582, + 50.99566 + ], + [ + 2.8604582, + 50.99566 + ], + [ + 2.8604582, + 50.99566 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "L'imaginaire", + "uid": "654234", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #charging_stations", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-03T20:06:21Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "charging_stations", + "imagery": "CartoDB.Voyager", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113347649, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.2855174, + 41.6075347 + ], + [ + 2.2941506, + 41.6075347 + ], + [ + 2.2941506, + 41.6133433 + ], + [ + 2.2855174, + 41.6133433 + ], + [ + 2.2855174, + 41.6075347 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Moisès", + "uid": "12884230", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-03T20:02:05Z", + "reviewed_features": [], + "create": 0, + "modify": 6, + "delete": 0, + "area": 0.0000501468055199548, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 3, + "imagery": "CartoDB.Voyager", + "language": "en", + "add-image": 3 + } + } + }, + { + "id": 113339240, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.1775754, + 51.1128633 + ], + [ + 4.1775754, + 51.1128633 + ], + [ + 4.1775754, + 51.1128633 + ], + [ + 4.1775754, + 51.1128633 + ], + [ + 4.1775754, + 51.1128633 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #shops", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-03T16:06:05Z", + "reviewed_features": [], + "create": 1, + "modify": 3, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "shops", + "answer": 3, + "create": 1, + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113337126, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.5803687, + 53.2510803 + ], + [ + 6.5803687, + 53.2510803 + ], + [ + 6.5803687, + 53.2510803 + ], + [ + 6.5803687, + 53.2510803 + ], + [ + 6.5803687, + 53.2510803 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Robin van der Linde", + "uid": "5093765", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #charging_stations", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-03T15:11:05Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "charging_stations", + "answer": 2, + "create": 1, + "imagery": "CartoDB.Voyager", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113337023, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2041788, + 51.182831 + ], + [ + 3.2041857, + 51.182831 + ], + [ + 3.2041857, + 51.1828523 + ], + [ + 3.2041788, + 51.1828523 + ], + [ + 3.2041788, + 51.182831 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Maarten O", + "uid": "13326535", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #aed", + "comments_count": 6, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-03T15:08:35Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 1.46969999997495e-10, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "aed", + "imagery": "osm", + "language": "nl", + "move:node/8771441240": "improve_accuracy" + } + } + }, + { + "id": 113336834, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.4316435, + 46.9458677 + ], + [ + 7.4469459, + 46.9458677 + ], + [ + 7.4469459, + 46.9607746 + ], + [ + 7.4316435, + 46.9607746 + ], + [ + 7.4316435, + 46.9458677 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "habi", + "uid": "15671", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-03T15:03:06Z", + "reviewed_features": [], + "create": 3, + "modify": 4, + "delete": 0, + "area": 0.000228111346560001, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "cyclofix", + "answer": 14, + "create": 3, + "imagery": "CartoDB.Voyager", + "language": "en", + "move:node/9221540197": "improve_accuracy" + } + } + }, + { + "id": 113335939, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.2393978, + 41.4393645 + ], + [ + 2.2401582, + 41.4393645 + ], + [ + 2.2401582, + 41.4397848 + ], + [ + 2.2393978, + 41.4397848 + ], + [ + 2.2393978, + 41.4393645 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "JBadalona", + "uid": "13507795", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #https://llefia.org/arbres/mapcomplete1.json", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-03T14:40:45Z", + "reviewed_features": [], + "create": 13, + "modify": 1, + "delete": 0, + "area": 3.19596119996116e-7, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "https://llefia.org/arbres/mapcomplete1.json", + "answer": 9, + "create": 13, + "imagery": "HDM_HOT", + "language": "ca" + } + } + }, + { + "id": 113334874, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.148393, + 51.1531118 + ], + [ + 4.148393, + 51.1531118 + ], + [ + 4.148393, + 51.1531118 + ], + [ + 4.148393, + 51.1531118 + ], + [ + 4.148393, + 51.1531118 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #shops", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-03T14:13:01Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "shops", + "answer": 2, + "create": 1, + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113331345, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.4453056, + 46.9609191 + ], + [ + 7.4520359, + 46.9609191 + ], + [ + 7.4520359, + 46.9650122 + ], + [ + 7.4453056, + 46.9650122 + ], + [ + 7.4453056, + 46.9609191 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "habi", + "uid": "15671", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-03T12:56:10Z", + "reviewed_features": [], + "create": 1, + "modify": 6, + "delete": 0, + "area": 0.0000275477909299911, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 14, + "create": 1, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113329273, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.2254811, + 51.2084386 + ], + [ + 3.2254811, + 51.2084386 + ], + [ + 3.2254811, + 51.2084386 + ], + [ + 3.2254811, + 51.2084386 + ], + [ + 3.2254811, + 51.2084386 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "Maarten O", + "uid": "13326535", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #aed_brugge", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-03T12:06:27Z", + "reviewed_features": [], + "create": 1, + "modify": 5, + "delete": 0, + "area": 0, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "aed_brugge", + "answer": 7, + "create": 1, + "imagery": "HDM_HOT", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113329108, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.3413453, + 44.380366 + ], + [ + 11.3413453, + 44.380366 + ], + [ + 11.3413453, + 44.380366 + ], + [ + 11.3413453, + 44.380366 + ], + [ + 11.3413453, + 44.380366 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "WinstonSmith", + "uid": "36030", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-03T12:03:02Z", + "reviewed_features": [], + "create": 1, + "modify": 0, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 5, + "create": 1, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113329026, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.6680694, + 52.103628 + ], + [ + 11.6761025, + 52.103628 + ], + [ + 11.6761025, + 52.1147279 + ], + [ + 11.6680694, + 52.1147279 + ], + [ + 11.6680694, + 52.103628 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ClickKlack", + "uid": "90262", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-03T12:01:13Z", + "reviewed_features": [], + "create": 0, + "modify": 38, + "delete": 0, + "area": 0.0000891666066899877, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 83, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113328646, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.6611054, + 52.1117208 + ], + [ + 11.6695121, + 52.1117208 + ], + [ + 11.6695121, + 52.1177406 + ], + [ + 11.6611054, + 52.1177406 + ], + [ + 11.6611054, + 52.1117208 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "ClickKlack", + "uid": "90262", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-03T11:52:01Z", + "reviewed_features": [], + "create": 0, + "modify": 10, + "delete": 0, + "area": 0.0000506066526599765, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 11, + "imagery": "osm", + "language": "de" + } + } + }, + { + "id": 113328015, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.1954819, + 51.2042282 + ], + [ + 3.2181358, + 51.2042282 + ], + [ + 3.2181358, + 51.256839 + ], + [ + 3.1954819, + 51.256839 + ], + [ + 3.1954819, + 51.2042282 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "Maarten O", + "uid": "13326535", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #aed", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-03T11:38:18Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0.00119183980211994, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 2, + "theme": "aed", + "imagery": "osm", + "language": "nl", + "move:node/8789200971": "improve_accuracy", + "move:node/8823682990": "improve_accuracy" + } + } + }, + { + "id": 113305401, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.216693, + 51.2146968 + ], + [ + 3.217372, + 51.2146968 + ], + [ + 3.217372, + 51.2152696 + ], + [ + 3.216693, + 51.2152696 + ], + [ + 3.216693, + 51.2146968 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #grb", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-02T22:41:02Z", + "reviewed_features": [], + "create": 28, + "modify": 51, + "delete": 0, + "area": 3.88931200000511e-7, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "127.0.0.1:1234", + "move": 48, + "theme": "grb", + "import": 1, + "imagery": "AGIVFlandersGRB", + "language": "nl", + "conflation": 10 + } + } + }, + { + "id": 113302704, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.142372, + 48.6790244 + ], + [ + 2.3736781, + 48.6790244 + ], + [ + 2.3736781, + 48.8039911 + ], + [ + 2.142372, + 48.8039911 + ], + [ + 2.142372, + 48.6790244 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Sukkoria", + "uid": "3083013", + "editor": "MapComplete 0.2.2a", + "comment": "Adding data with #MapComplete for theme #climbing", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-02T21:04:36Z", + "reviewed_features": [], + "create": 0, + "modify": 30, + "delete": 0, + "area": 0.0289055600068687, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "theme": "climbing", + "language": "en", + "theme-creator": "Christian Neumann " + } + } + }, + { + "id": 113300229, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 9.956298, + 48.3955135 + ], + [ + 10.0077753, + 48.3955135 + ], + [ + 10.0077753, + 48.4246463 + ], + [ + 9.956298, + 48.4246463 + ], + [ + 9.956298, + 48.3955135 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "stk_ulm", + "uid": "43217", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-02T19:58:44Z", + "reviewed_features": [], + "create": 0, + "modify": 38, + "delete": 0, + "area": 0.00149967788543997, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 49, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113291887, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 12.1995771, + 44.419088 + ], + [ + 12.1995771, + 44.419088 + ], + [ + 12.1995771, + 44.419088 + ], + [ + 12.1995771, + 44.419088 + ], + [ + 12.1995771, + 44.419088 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 40, + "name": "New mapper" + } + ], + "tags": [], + "features": [], + "user": "Pablo667", + "uid": "13166651", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #toilets", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-02T16:02:36Z", + "reviewed_features": [], + "create": 1, + "modify": 2, + "delete": 0, + "area": 0, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "toilets", + "answer": 4, + "create": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113284886, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.4294065, + 46.9520501 + ], + [ + 7.4300408, + 46.9520501 + ], + [ + 7.4300408, + 46.9547718 + ], + [ + 7.4294065, + 46.9547718 + ], + [ + 7.4294065, + 46.9520501 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "habi", + "uid": "15671", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-02T13:31:34Z", + "reviewed_features": [], + "create": 2, + "modify": 12, + "delete": 0, + "area": 0.0000017263743100007, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "cyclofix", + "answer": 18, + "create": 2, + "imagery": "CartoDB.Voyager", + "language": "en", + "move:node/9218593524": "improve_accuracy" + } + } + }, + { + "id": 113284013, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 4.3023895, + 50.8330165 + ], + [ + 4.3032314, + 50.8330165 + ], + [ + 4.3032314, + 50.8348789 + ], + [ + 4.3023895, + 50.8348789 + ], + [ + 4.3023895, + 50.8330165 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #https://gist.githubusercontent.com/joostschouppe/e1190515ff5f8847beec6eb9a1b788bb/raw/aa9d3ed1959529eb3fbefe1857cc8616f53b7ccf/temp.json", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-02T13:13:48Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0.00000156795455999889, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "https://gist.githubusercontent.com/joostschouppe/e1190515ff5f8847beec6eb9a1b788bb/raw/aa9d3ed1959529eb3fbefe1857cc8616f53b7ccf/temp.json", + "answer": 1, + "imagery": "osm", + "language": "nl" + } + } + }, + { + "id": 113270690, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 7.4298432, + 46.947855 + ], + [ + 7.4375363, + 46.947855 + ], + [ + 7.4375363, + 46.9519138 + ], + [ + 7.4298432, + 46.9519138 + ], + [ + 7.4298432, + 46.947855 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "habi", + "uid": "15671", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-02T08:20:35Z", + "reviewed_features": [], + "create": 0, + "modify": 3, + "delete": 0, + "area": 0.0000312247542800216, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 5, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113259034, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.8641211, + 51.0331532 + ], + [ + 2.8641211, + 51.0331532 + ], + [ + 2.8641211, + 51.0331532 + ], + [ + 2.8641211, + 51.0331532 + ], + [ + 2.8641211, + 51.0331532 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "L'imaginaire", + "uid": "654234", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #artwork", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T23:30:58Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "artwork", + "imagery": "osm", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113259014, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.8595969, + 51.0339334 + ], + [ + 2.8595969, + 51.0339334 + ], + [ + 2.8595969, + 51.0339334 + ], + [ + 2.8595969, + 51.0339334 + ], + [ + 2.8595969, + 51.0339334 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "L'imaginaire", + "uid": "654234", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T23:29:50Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "imagery": "CartoDB.Voyager", + "language": "nl", + "add-image": 1 + } + } + }, + { + "id": 113255395, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -9.1048793, + 53.2627567 + ], + [ + -9.0978532, + 53.2627567 + ], + [ + -9.0978532, + 53.2710607 + ], + [ + -9.1048793, + 53.2710607 + ], + [ + -9.1048793, + 53.2627567 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Cmap99", + "uid": "13524250", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #shops", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T21:11:21Z", + "reviewed_features": [ + { + "id": "node-2105271928", + "user": "PieterVanderVennet" + } + ], + "create": 0, + "modify": 3, + "delete": 0, + "area": 0.0000583447344000255, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "shops", + "answer": 3, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113251293, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 30.6013954, + 50.4284077 + ], + [ + 30.6013954, + 50.4284077 + ], + [ + 30.6013954, + 50.4284077 + ], + [ + 30.6013954, + 50.4284077 + ], + [ + 30.6013954, + 50.4284077 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "skfd", + "uid": "205595", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cafes_and_pubs", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T19:18:10Z", + "reviewed_features": [], + "create": 0, + "modify": 0, + "delete": 1, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cafes_and_pubs", + "imagery": "osm", + "deletion": 1, + "language": "en", + "deletion:node/2442953886": "disused" + } + } + }, + { + "id": 113250793, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 30.5944068, + 50.4282522 + ], + [ + 30.6015029, + 50.4282522 + ], + [ + 30.6015029, + 50.4299298 + ], + [ + 30.5944068, + 50.4299298 + ], + [ + 30.5944068, + 50.4282522 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "skfd", + "uid": "205595", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T19:04:23Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0.0000119044173599518, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 4, + "imagery": "CartoDB.Voyager", + "language": "en" + } + } + }, + { + "id": 113247252, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.615215, + 50.8515194 + ], + [ + 3.615215, + 50.8515194 + ], + [ + 3.615215, + 50.8515194 + ], + [ + 3.615215, + 50.8515194 + ], + [ + 3.615215, + 50.8515194 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "joost schouppe", + "uid": "67832", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #aed", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-01T17:20:32Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "aed", + "answer": 4, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113246649, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 5.1863126, + 50.8154877 + ], + [ + 5.1863167, + 50.8154877 + ], + [ + 5.1863167, + 50.8155021 + ], + [ + 5.1863126, + 50.8155021 + ], + [ + 5.1863126, + 50.8154877 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #charging_stations", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T17:04:34Z", + "reviewed_features": [], + "create": 1, + "modify": 2, + "delete": 0, + "area": 5.90400000192051e-11, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "move": 1, + "path": "mc/develop/", + "theme": "charging_stations", + "answer": 6, + "create": 1, + "imagery": "CartoDB.Voyager", + "language": "nl", + "move:node/9216683715": "improve_accuracy" + } + } + }, + { + "id": 113242289, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 5.1853377, + 50.814548 + ], + [ + 5.1853377, + 50.814548 + ], + [ + 5.1853377, + 50.814548 + ], + [ + 5.1853377, + 50.814548 + ], + [ + 5.1853377, + 50.814548 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #shops", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-01T15:24:21Z", + "reviewed_features": [], + "create": 1, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "shops", + "answer": 3, + "create": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113241377, + "type": "Feature", + "geometry": null, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #personal", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T15:05:15Z", + "reviewed_features": [], + "create": 0, + "modify": 0, + "delete": 0, + "area": null, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "personal", + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113241348, + "type": "Feature", + "geometry": null, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #personal", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T15:04:55Z", + "reviewed_features": [], + "create": 0, + "modify": 0, + "delete": 0, + "area": null, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "move": 1, + "path": "mc/develop/", + "theme": "personal", + "imagery": "osm", + "language": "en", + "move:node/-2": "improve_accuracy" + } + } + }, + { + "id": 113241334, + "type": "Feature", + "geometry": null, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #personal", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T15:04:42Z", + "reviewed_features": [], + "create": 0, + "modify": 0, + "delete": 0, + "area": null, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "personal", + "answer": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113241037, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 5.186322, + 50.8154538 + ], + [ + 5.1863247, + 50.8154538 + ], + [ + 5.1863247, + 50.8154818 + ], + [ + 5.186322, + 50.8154818 + ], + [ + 5.186322, + 50.8154538 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Pieter Vander Vennet", + "uid": "3818858", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #personal", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-01T14:59:26Z", + "reviewed_features": [], + "create": 2, + "modify": 2, + "delete": 0, + "area": 7.5600000014029e-11, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "personal", + "answer": 7, + "create": 3, + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113238301, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 9.9102199, + 53.5662632 + ], + [ + 9.9102199, + 53.5662632 + ], + [ + 9.9102199, + 53.5662632 + ], + [ + 9.9102199, + 53.5662632 + ], + [ + 9.9102199, + 53.5662632 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Nicolelaine", + "uid": "2997398", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #postboxes", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T14:02:53Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "postboxes", + "imagery": "CartoDB.Voyager", + "language": "en", + "add-image": 4 + } + } + }, + { + "id": 113237148, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.6454153, + 50.7714656 + ], + [ + 3.6454297, + 50.7714656 + ], + [ + 3.6454297, + 50.7714869 + ], + [ + 3.6454153, + 50.7714869 + ], + [ + 3.6454153, + 50.7714656 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "joost schouppe", + "uid": "67832", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #charging_stations", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-01T13:39:08Z", + "reviewed_features": [], + "create": 1, + "modify": 4, + "delete": 0, + "area": 3.06720000012044e-10, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "move": 1, + "theme": "charging_stations", + "answer": 8, + "create": 1, + "imagery": "AGIV10cm", + "language": "en", + "move:node/9216279358": "improve_accuracy" + } + } + }, + { + "id": 113236656, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -58.6818637, + -34.6633769 + ], + [ + -58.6526531, + -34.6633769 + ], + [ + -58.6526531, + -34.655291 + ], + [ + -58.6818637, + -34.655291 + ], + [ + -58.6818637, + -34.6633769 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "AgusQui", + "uid": "331218", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-01T13:27:59Z", + "reviewed_features": [], + "create": 0, + "modify": 2, + "delete": 0, + "area": 0.000236193990540127, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "https://raw.githubusercontent.com/AgusQui/MapCompleteRailway/main/Signals", + "answer": 2, + "imagery": "osm", + "language": "es" + } + } + }, + { + "id": 113234111, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 2.0076342, + 41.4572347 + ], + [ + 2.218046, + 41.4572347 + ], + [ + 2.218046, + 41.5701612 + ], + [ + 2.0076342, + 41.5701612 + ], + [ + 2.0076342, + 41.4572347 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Moisès", + "uid": "12884230", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #cyclofix", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T12:28:39Z", + "reviewed_features": [], + "create": 0, + "modify": 5, + "delete": 0, + "area": 0.0237610681327001, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "cyclofix", + "answer": 2, + "imagery": "CartoDB.Voyager", + "language": "en", + "add-image": 4 + } + } + }, + { + "id": 113227669, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 114.1728093, + 22.2773452 + ], + [ + 114.1728093, + 22.2773452 + ], + [ + 114.1728093, + 22.2773452 + ], + [ + 114.1728093, + 22.2773452 + ], + [ + 114.1728093, + 22.2773452 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Wright One", + "uid": "261189", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #aed", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T10:11:28Z", + "reviewed_features": [], + "create": 0, + "modify": 1, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "aed", + "answer": 1, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113225986, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 9.9033028, + 53.564361 + ], + [ + 9.9163121, + 53.564361 + ], + [ + 9.9163121, + 53.5777046 + ], + [ + 9.9033028, + 53.5777046 + ], + [ + 9.9033028, + 53.564361 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Nicolelaine", + "uid": "2997398", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #waste_basket", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T09:32:32Z", + "reviewed_features": [], + "create": 5, + "modify": 0, + "delete": 0, + "area": 0.000173590895479989, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "waste_basket", + "answer": 4, + "create": 5, + "imagery": "osm", + "language": "en" + } + } + }, + { + "id": 113224286, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 114.1728093, + 22.2773452 + ], + [ + 114.1728093, + 22.2773452 + ], + [ + 114.1728093, + 22.2773452 + ], + [ + 114.1728093, + 22.2773452 + ], + [ + 114.1728093, + 22.2773452 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [], + "tags": [], + "features": [], + "user": "Wright One", + "uid": "261189", + "editor": "MapComplete 0.12.1-beta", + "comment": "Adding data with #MapComplete for theme #aed", + "comments_count": 0, + "source": "survey", + "imagery_used": "Not reported", + "date": "2021-11-01T08:51:49Z", + "reviewed_features": [], + "create": 0, + "modify": 3, + "delete": 0, + "area": 0, + "is_suspect": false, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "pietervdvn.github.io", + "path": "mc/develop/", + "theme": "aed", + "answer": 3, + "imagery": "osm", + "language": "en", + "add-image": 1 + } + } + }, + { + "id": 113220970, + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 11.650008, + 52.1132121 + ], + [ + 11.6841875, + 52.1132121 + ], + [ + 11.6841875, + 52.1419745 + ], + [ + 11.650008, + 52.1419745 + ], + [ + 11.650008, + 52.1132121 + ] + ] + ] + }, + "properties": { + "check_user": null, + "reasons": [ + { + "id": 4, + "name": "mass modification" + } + ], + "tags": [], + "features": [], + "user": "ClickKlack", + "uid": "90262", + "editor": "MapComplete 0.11.3", + "comment": "Adding data with #MapComplete for theme #etymology", + "comments_count": 0, + "source": "Not reported", + "imagery_used": "Not reported", + "date": "2021-11-01T07:36:09Z", + "reviewed_features": [], + "create": 0, + "modify": 273, + "delete": 0, + "area": 0.000983084450800187, + "is_suspect": true, + "harmful": null, + "checked": false, + "check_date": null, + "metadata": { + "host": "mapcomplete.osm.be", + "theme": "etymology", + "answer": 519, + "imagery": "osm", + "language": "de" + } + } + } + ] +} \ No newline at end of file diff --git a/Docs/URL_Parameters.md b/Docs/URL_Parameters.md index bd363df9b7..47e54a29b8 100644 --- a/Docs/URL_Parameters.md +++ b/Docs/URL_Parameters.md @@ -20,41 +20,6 @@ the URL-parameters are stated in the part between the `?` and the `#`. There are Finally, the URL-hash is the part after the `#`. It is `node/1234` in this case. - download-control-toggle -------------------------- - - Whether or not the download panel is shown The default value is _false_ - - - filter-toggle ---------------- - - Whether or not the filter view is shown The default value is _false_ - - - tab ------ - - The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >50 changesets) The default value is _0_ - - - z ---- - - The initial/current zoom level The default value is _0_ - - - lat ------ - - The initial/current latitude The default value is _0_ - - - lon ------ - - The initial/current longitude of the app The default value is _0_ - fs-userbadge -------------- @@ -62,40 +27,47 @@ Finally, the URL-hash is the part after the `#`. It is `node/1234` in this case. Disables/Enables the user information pill (userbadge) at the top left. Disabling this disables logging in and thus disables editing all together, effectively putting MapComplete into read-only mode. The default value is _true_ + fs-search ----------- Disables/Enables the search bar The default value is _true_ + fs-background --------------- Disables/Enables the background layer control The default value is _true_ + fs-filter ----------- Disables/Enables the filter The default value is _true_ + fs-add-new ------------ Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place) The default value is _true_ + fs-welcome-message -------------------- Disables/enables the help menu or welcome message The default value is _true_ - fs-iframe ------------ - Disables/Enables the iframe-popup The default value is _false_ + fs-iframe-popout +------------------ + + Disables/Enables the iframe-popout button. If in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch) The default value is _true_ + fs-more-quests @@ -104,53 +76,41 @@ Finally, the URL-hash is the part after the `#`. It is `node/1234` in this case. Disables/Enables the 'More Quests'-tab in the welcome message The default value is _true_ + fs-share-screen ----------------- Disables/Enables the 'Share-screen'-tab in the welcome message The default value is _true_ + fs-geolocation ---------------- Disables/Enables the geolocation button The default value is _true_ + fs-all-questions ------------------ Always show all questions The default value is _false_ + fs-export ----------- Enable the export as GeoJSON and CSV button The default value is _false_ + fs-pdf -------- Enable the PDF download button The default value is _false_ - test ------- - - If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org The default value is _false_ - - - debug -------- - - If true, shows some extra debugging help such as all the available tags on every object The default value is _false_ - - - fake-user ------------ - - If true, 'dryrun' mode is activated and a fake user account is loaded The default value is _false_ - backend --------- @@ -158,22 +118,54 @@ Finally, the URL-hash is the part after the `#`. It is `node/1234` in this case. The OSM backend to use - can be used to redirect mapcomplete to the testing backend when using 'osm-test' The default value is _osm_ + + test +------ + + If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org The default value is _false_ + + + + debug +------- + + If true, shows some extra debugging help such as all the available tags on every object The default value is _false_ + + + + fake-user +----------- + + If true, 'dryrun' mode is activated and a fake user account is loaded The default value is _false_ + + + overpassUrl ------------- Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter The default value is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_ + overpassTimeout ----------------- Set a different timeout (in seconds) for queries in overpass The default value is _30_ - custom-css ------------- - If specified, the custom css from the given link will be loaded additionaly The default value is __ + overpassMaxZoom +----------------- + + point to switch between OSM-api and overpass The default value is _17_ + + + + osmApiTileSize +---------------- + + Tilesize when the OSM-API is used to fetch data within a BBOX The default value is _18_ + background @@ -182,7 +174,10 @@ Finally, the URL-hash is the part after the `#`. It is `node/1234` in this case. The id of the background layer to start with The default value is _osm_ + layer- ------------------ - Wether or not the layer with id is shown The default value is _true_ Generated from QueryParameters \ No newline at end of file + Wether or not the layer with id is shown The default value is _true_ + +This document is autogenerated from QueryParameters \ No newline at end of file diff --git a/Logic/Actors/AvailableBaseLayers.ts b/Logic/Actors/AvailableBaseLayers.ts index 89a5435e6a..c7b84247ba 100644 --- a/Logic/Actors/AvailableBaseLayers.ts +++ b/Logic/Actors/AvailableBaseLayers.ts @@ -5,8 +5,10 @@ import Loc from "../../Models/Loc"; export interface AvailableBaseLayersObj { readonly osmCarto: BaseLayer; layerOverview: BaseLayer[]; - AvailableLayersAt(location: UIEventSource): UIEventSource - SelectBestLayerAccordingTo(location: UIEventSource, preferedCategory: UIEventSource): UIEventSource ; + + AvailableLayersAt(location: UIEventSource): UIEventSource + + SelectBestLayerAccordingTo(location: UIEventSource, preferedCategory: UIEventSource): UIEventSource; } @@ -15,13 +17,13 @@ export interface AvailableBaseLayersObj { * Changes the basemap */ export default class AvailableBaseLayers { - - + + public static layerOverview: BaseLayer[]; public static osmCarto: BaseLayer; private static implementation: AvailableBaseLayersObj - + static AvailableLayersAt(location: UIEventSource): UIEventSource { return AvailableBaseLayers.implementation?.AvailableLayersAt(location) ?? new UIEventSource([]); } @@ -31,7 +33,7 @@ export default class AvailableBaseLayers { } - public static implement(backend: AvailableBaseLayersObj){ + public static implement(backend: AvailableBaseLayersObj) { AvailableBaseLayers.layerOverview = backend.layerOverview AvailableBaseLayers.osmCarto = backend.osmCarto AvailableBaseLayers.implementation = backend diff --git a/Logic/Actors/AvailableBaseLayersImplementation.ts b/Logic/Actors/AvailableBaseLayersImplementation.ts index 09f5cfe42a..880311eb49 100644 --- a/Logic/Actors/AvailableBaseLayersImplementation.ts +++ b/Logic/Actors/AvailableBaseLayersImplementation.ts @@ -3,13 +3,13 @@ import {UIEventSource} from "../UIEventSource"; import Loc from "../../Models/Loc"; import {GeoOperations} from "../GeoOperations"; import * as editorlayerindex from "../../assets/editor-layer-index.json"; +import * as L from "leaflet"; import {TileLayer} from "leaflet"; import * as X from "leaflet-providers"; -import * as L from "leaflet"; import {Utils} from "../../Utils"; import {AvailableBaseLayersObj} from "./AvailableBaseLayers"; -export default class AvailableBaseLayersImplementation implements AvailableBaseLayersObj{ +export default class AvailableBaseLayersImplementation implements AvailableBaseLayersObj { public readonly osmCarto: BaseLayer = { @@ -28,102 +28,6 @@ export default class AvailableBaseLayersImplementation implements AvailableBaseL public layerOverview = AvailableBaseLayersImplementation.LoadRasterIndex().concat(AvailableBaseLayersImplementation.LoadProviderIndex()); - public AvailableLayersAt(location: UIEventSource): UIEventSource { - const source = location.map( - (currentLocation) => { - - if (currentLocation === undefined) { - return this.layerOverview; - } - - const currentLayers = source?.data; // A bit unorthodox - I know - const newLayers = this.CalculateAvailableLayersAt(currentLocation?.lon, currentLocation?.lat); - - if (currentLayers === undefined) { - return newLayers; - } - if (newLayers.length !== currentLayers.length) { - return newLayers; - } - for (let i = 0; i < newLayers.length; i++) { - if (newLayers[i].name !== currentLayers[i].name) { - return newLayers; - } - } - - return currentLayers; - }); - return source; - } - - public SelectBestLayerAccordingTo(location: UIEventSource, preferedCategory: UIEventSource): UIEventSource { - return this.AvailableLayersAt(location).map(available => { - // First float all 'best layers' to the top - available.sort((a, b) => { - if (a.isBest && b.isBest) { - return 0; - } - if (!a.isBest) { - return 1 - } - - return -1; - } - ) - - if (preferedCategory.data === undefined) { - return available[0] - } - - let prefered: string [] - if (typeof preferedCategory.data === "string") { - prefered = [preferedCategory.data] - } else { - prefered = preferedCategory.data; - } - - prefered.reverse(); - for (const category of prefered) { - //Then sort all 'photo'-layers to the top. Stability of the sorting will force a 'best' photo layer on top - available.sort((a, b) => { - if (a.category === category && b.category === category) { - return 0; - } - if (a.category !== category) { - return 1 - } - - return -1; - } - ) - } - return available[0] - }) - } - - private CalculateAvailableLayersAt(lon: number, lat: number): BaseLayer[] { - const availableLayers = [this.osmCarto] - const globalLayers = []; - for (const layerOverviewItem of this.layerOverview) { - const layer = layerOverviewItem; - - if (layer.feature?.geometry === undefined || layer.feature?.geometry === null) { - globalLayers.push(layer); - continue; - } - - if (lon === undefined || lat === undefined) { - continue; - } - - if (GeoOperations.inside([lon, lat], layer.feature)) { - availableLayers.push(layer); - } - } - - return availableLayers.concat(globalLayers); - } - private static LoadRasterIndex(): BaseLayer[] { const layers: BaseLayer[] = [] // @ts-ignore @@ -289,4 +193,100 @@ export default class AvailableBaseLayersImplementation implements AvailableBaseL subdomains: domains }); } + + public AvailableLayersAt(location: UIEventSource): UIEventSource { + const source = location.map( + (currentLocation) => { + + if (currentLocation === undefined) { + return this.layerOverview; + } + + const currentLayers = source?.data; // A bit unorthodox - I know + const newLayers = this.CalculateAvailableLayersAt(currentLocation?.lon, currentLocation?.lat); + + if (currentLayers === undefined) { + return newLayers; + } + if (newLayers.length !== currentLayers.length) { + return newLayers; + } + for (let i = 0; i < newLayers.length; i++) { + if (newLayers[i].name !== currentLayers[i].name) { + return newLayers; + } + } + + return currentLayers; + }); + return source; + } + + public SelectBestLayerAccordingTo(location: UIEventSource, preferedCategory: UIEventSource): UIEventSource { + return this.AvailableLayersAt(location).map(available => { + // First float all 'best layers' to the top + available.sort((a, b) => { + if (a.isBest && b.isBest) { + return 0; + } + if (!a.isBest) { + return 1 + } + + return -1; + } + ) + + if (preferedCategory.data === undefined) { + return available[0] + } + + let prefered: string [] + if (typeof preferedCategory.data === "string") { + prefered = [preferedCategory.data] + } else { + prefered = preferedCategory.data; + } + + prefered.reverse(); + for (const category of prefered) { + //Then sort all 'photo'-layers to the top. Stability of the sorting will force a 'best' photo layer on top + available.sort((a, b) => { + if (a.category === category && b.category === category) { + return 0; + } + if (a.category !== category) { + return 1 + } + + return -1; + } + ) + } + return available[0] + }) + } + + private CalculateAvailableLayersAt(lon: number, lat: number): BaseLayer[] { + const availableLayers = [this.osmCarto] + const globalLayers = []; + for (const layerOverviewItem of this.layerOverview) { + const layer = layerOverviewItem; + + if (layer.feature?.geometry === undefined || layer.feature?.geometry === null) { + globalLayers.push(layer); + continue; + } + + if (lon === undefined || lat === undefined) { + continue; + } + + if (GeoOperations.inside([lon, lat], layer.feature)) { + availableLayers.push(layer); + } + } + + return availableLayers.concat(globalLayers); + } } \ No newline at end of file diff --git a/Logic/Actors/BackgroundLayerResetter.ts b/Logic/Actors/BackgroundLayerResetter.ts index 60666c53d6..f8c73892ee 100644 --- a/Logic/Actors/BackgroundLayerResetter.ts +++ b/Logic/Actors/BackgroundLayerResetter.ts @@ -13,11 +13,11 @@ export default class BackgroundLayerResetter { location: UIEventSource, availableLayers: UIEventSource, defaultLayerId: string = undefined) { - - if(Utils.runningFromConsole){ + + if (Utils.runningFromConsole) { return } - + defaultLayerId = defaultLayerId ?? AvailableBaseLayers.osmCarto.id; // Change the baselayer back to OSM if we go out of the current range of the layer diff --git a/Logic/Actors/GeoLocationHandler.ts b/Logic/Actors/GeoLocationHandler.ts index 86e656b505..4d6561391a 100644 --- a/Logic/Actors/GeoLocationHandler.ts +++ b/Logic/Actors/GeoLocationHandler.ts @@ -1,13 +1,27 @@ -import * as L from "leaflet"; import {UIEventSource} from "../UIEventSource"; import Svg from "../../Svg"; -import Img from "../../UI/Base/Img"; import {LocalStorageSource} from "../Web/LocalStorageSource"; import {VariableUiElement} from "../../UI/Base/VariableUIElement"; import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; import {QueryParameters} from "../Web/QueryParameters"; +import FeatureSource from "../FeatureSource/FeatureSource"; + +export interface GeoLocationPointProperties { + id: "gps", + "user:location": "yes", + "date": string, + "latitude": number + "longitude":number, + "speed": number, + "accuracy": number + "heading": number + "altitude":number +} export default class GeoLocationHandler extends VariableUiElement { + + private readonly currentLocation: FeatureSource + /** * Wether or not the geolocation is active, aka the user requested the current location * @private @@ -25,20 +39,12 @@ export default class GeoLocationHandler extends VariableUiElement { * @private */ private readonly _permission: UIEventSource; - /*** - * The marker on the map, in order to update it - * @private - */ - private _marker: L.Marker; /** * Literally: _currentGPSLocation.data != undefined * @private */ private readonly _hasLocation: UIEventSource; - private readonly _currentGPSLocation: UIEventSource<{ - latlng: any; - accuracy: number; - }>; + private readonly _currentGPSLocation: UIEventSource; /** * Kept in order to update the marker * @private @@ -63,10 +69,15 @@ export default class GeoLocationHandler extends VariableUiElement { private readonly _layoutToUse: LayoutConfig; constructor( - currentGPSLocation: UIEventSource<{ latlng: any; accuracy: number }>, - leafletMap: UIEventSource, - layoutToUse: LayoutConfig + state: { + currentUserLocation: FeatureSource, + leafletMap: UIEventSource, + layoutToUse: LayoutConfig, + featureSwitchGeolocation: UIEventSource + } ) { + const currentGPSLocation = new UIEventSource(undefined, "GPS-coordinate") + const leafletMap = state.leafletMap const hasLocation = currentGPSLocation.map( (location) => location !== undefined ); @@ -127,7 +138,7 @@ export default class GeoLocationHandler extends VariableUiElement { this._previousLocationGrant = previousLocationGrant; this._currentGPSLocation = currentGPSLocation; this._leafletMap = leafletMap; - this._layoutToUse = layoutToUse; + this._layoutToUse = state.layoutToUse; this._hasLocation = hasLocation; const self = this; @@ -172,7 +183,7 @@ export default class GeoLocationHandler extends VariableUiElement { const latLonGiven = QueryParameters.wasInitialized("lat") && QueryParameters.wasInitialized("lon") - this.init(false, !latLonGiven); + this.init(false, !latLonGiven && state.featureSwitchGeolocation.data); isLocked.addCallbackAndRunD(isLocked => { if (isLocked) { @@ -182,9 +193,29 @@ export default class GeoLocationHandler extends VariableUiElement { } }) - + this.currentLocation = state.currentUserLocation this._currentGPSLocation.addCallback((location) => { self._previousLocationGrant.setData("granted"); + const feature = { + "type": "Feature", + properties: { + id: "gps", + "user:location": "yes", + "date": new Date().toISOString(), + "latitude": location.latitude, + "longitude": location.longitude, + "speed": location.speed, + "accuracy": location.accuracy, + "heading": location.heading, + "altitude": location.altitude + }, + geometry: { + type: "Point", + coordinates: [location.longitude, location.latitude], + } + } + + self.currentLocation.features.setData([{feature, freshness: new Date()}]) const timeSinceRequest = (new Date().getTime() - (self._lastUserRequest?.getTime() ?? 0)) / 1000; @@ -194,36 +225,11 @@ export default class GeoLocationHandler extends VariableUiElement { self.MoveToCurrentLoction(); } - let color = "#1111cc"; - try { - color = getComputedStyle(document.body).getPropertyValue( - "--catch-detail-color" - ); - } catch (e) { - console.error(e); - } - const icon = L.icon({ - iconUrl: Img.AsData(Svg.location.replace(/#000000/g, color).replace(/#000/g, color)), - iconSize: [40, 40], // size of the icon - iconAnchor: [20, 20], // point of the icon which will correspond to marker's location - }); - - const map = self._leafletMap.data; - if(map === undefined){ - return; - } - - const newMarker = L.marker(location.latlng, {icon: icon}); - newMarker.addTo(map); - - if (self._marker !== undefined) { - map.removeLayer(self._marker); - } - self._marker = newMarker; }); + } - private init(askPermission: boolean, forceZoom: boolean) { + private init(askPermission: boolean, zoomToLocation: boolean) { const self = this; if (self._isActive.data) { @@ -237,7 +243,7 @@ export default class GeoLocationHandler extends VariableUiElement { ?.then(function (status) { console.log("Geolocation permission is ", status.state); if (status.state === "granted") { - self.StartGeolocating(forceZoom); + self.StartGeolocating(zoomToLocation); } self._permission.setData(status.state); status.onchange = function () { @@ -249,10 +255,10 @@ export default class GeoLocationHandler extends VariableUiElement { } if (askPermission) { - self.StartGeolocating(forceZoom); + self.StartGeolocating(zoomToLocation); } else if (this._previousLocationGrant.data === "granted") { this._previousLocationGrant.setData(""); - self.StartGeolocating(forceZoom); + self.StartGeolocating(zoomToLocation); } } @@ -261,8 +267,8 @@ export default class GeoLocationHandler extends VariableUiElement { this._lastUserRequest = undefined; if ( - this._currentGPSLocation.data.latlng[0] === 0 && - this._currentGPSLocation.data.latlng[1] === 0 + this._currentGPSLocation.data.latitude === 0 && + this._currentGPSLocation.data.longitude === 0 ) { console.debug("Not moving to GPS-location: it is null island"); return; @@ -275,20 +281,22 @@ export default class GeoLocationHandler extends VariableUiElement { if (b !== true) { // B is an array with our locklocation inRange = - b[0][0] <= location.latlng[0] && - location.latlng[0] <= b[1][0] && - b[0][1] <= location.latlng[1] && - location.latlng[1] <= b[1][1]; + b[0][0] <= location.latitude && + location.latitude <= b[1][0] && + b[0][1] <= location.longitude && + location.longitude <= b[1][1]; } } if (!inRange) { console.log( "Not zooming to GPS location: out of bounds", b, - location.latlng + location ); } else { - this._leafletMap.data.setView(location.latlng, targetZoom); + const currentZoom = this._leafletMap.data.getZoom() + + this._leafletMap.data.setView([location.latitude, location.longitude], Math.max(targetZoom ?? 0, currentZoom)); } } @@ -312,10 +320,7 @@ export default class GeoLocationHandler extends VariableUiElement { navigator.geolocation.watchPosition( function (position) { - self._currentGPSLocation.setData({ - latlng: [position.coords.latitude, position.coords.longitude], - accuracy: position.coords.accuracy, - }); + self._currentGPSLocation.setData(position.coords); }, function () { console.warn("Could not get location with navigator.geolocation"); diff --git a/Logic/Actors/OverpassFeatureSource.ts b/Logic/Actors/OverpassFeatureSource.ts index 49c605137f..feb09f9524 100644 --- a/Logic/Actors/OverpassFeatureSource.ts +++ b/Logic/Actors/OverpassFeatureSource.ts @@ -113,8 +113,7 @@ export default class OverpassFeatureSource implements FeatureSource { let data: any = undefined let date: Date = undefined let lastUsed = 0; - - + const layersToDownload = [] for (const layer of this.state.layoutToUse.layers) { @@ -137,7 +136,7 @@ export default class OverpassFeatureSource implements FeatureSource { const self = this; const overpassUrls = self.state.overpassUrl.data - let bounds : BBox + let bounds: BBox do { try { @@ -180,9 +179,9 @@ export default class OverpassFeatureSource implements FeatureSource { } } while (data === undefined && this._isActive.data); - + try { - if(data === undefined){ + if (data === undefined) { return undefined } data.features.forEach(feature => SimpleMetaTagger.objectMetaInfo.applyMetaTagsOnFeature(feature, date, undefined)); diff --git a/Logic/Actors/PendingChangesUploader.ts b/Logic/Actors/PendingChangesUploader.ts index 675491467f..f123123d1a 100644 --- a/Logic/Actors/PendingChangesUploader.ts +++ b/Logic/Actors/PendingChangesUploader.ts @@ -31,10 +31,10 @@ export default class PendingChangesUploader { } }); - if(Utils.runningFromConsole){ + if (Utils.runningFromConsole) { return; } - + document.addEventListener('mouseout', e => { // @ts-ignore if (!e.toElement && !e.relatedTarget) { diff --git a/Logic/Actors/SelectedElementTagsUpdater.ts b/Logic/Actors/SelectedElementTagsUpdater.ts index 765c9ee19d..2aa2c942ef 100644 --- a/Logic/Actors/SelectedElementTagsUpdater.ts +++ b/Logic/Actors/SelectedElementTagsUpdater.ts @@ -6,6 +6,8 @@ import {ElementStorage} from "../ElementStorage"; import {Changes} from "../Osm/Changes"; import {OsmObject} from "../Osm/OsmObject"; import {OsmConnection} from "../Osm/OsmConnection"; +import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; +import SimpleMetaTagger from "../SimpleMetaTagger"; export default class SelectedElementTagsUpdater { @@ -14,13 +16,14 @@ export default class SelectedElementTagsUpdater { "changeset", "user", "uid", - "id"] ) + "id"]) constructor(state: { selectedElement: UIEventSource, allElements: ElementStorage, changes: Changes, - osmConnection: OsmConnection + osmConnection: OsmConnection, + layoutToUse: LayoutConfig }) { @@ -37,7 +40,8 @@ export default class SelectedElementTagsUpdater { selectedElement: UIEventSource, allElements: ElementStorage, changes: Changes, - osmConnection: OsmConnection + osmConnection: OsmConnection, + layoutToUse: LayoutConfig }) { @@ -70,11 +74,18 @@ export default class SelectedElementTagsUpdater { selectedElement: UIEventSource, allElements: ElementStorage, changes: Changes, - osmConnection: OsmConnection + osmConnection: OsmConnection, + layoutToUse: LayoutConfig }, latestTags: any, id: string ) { try { + const leftRightSensitive = state.layoutToUse.isLeftRightSensitive() + + if (leftRightSensitive) { + SimpleMetaTagger.removeBothTagging(latestTags) + } + const pendingChanges = state.changes.pendingChanges.data .filter(change => change.type + "/" + change.id === id) .filter(change => change.tags !== undefined); @@ -92,6 +103,7 @@ export default class SelectedElementTagsUpdater { } } + // With the changes applied, we merge them onto the upstream object let somethingChanged = false; const currentTagsSource = state.allElements.getEventSourceById(id); @@ -115,7 +127,7 @@ export default class SelectedElementTagsUpdater { if (currentKey.startsWith("_")) { continue } - if(this.metatags.has(currentKey)){ + if (this.metatags.has(currentKey)) { continue } if (currentKey in latestTags) { diff --git a/Logic/Actors/SelectedFeatureHandler.ts b/Logic/Actors/SelectedFeatureHandler.ts index 7d431c7af5..3089be2cb4 100644 --- a/Logic/Actors/SelectedFeatureHandler.ts +++ b/Logic/Actors/SelectedFeatureHandler.ts @@ -10,7 +10,7 @@ import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; * Makes sure the hash shows the selected element and vice-versa. */ export default class SelectedFeatureHandler { - private static readonly _no_trigger_on = new Set(["welcome", "copyright", "layers", "new", "filter","", undefined]) + private static readonly _no_trigger_on = new Set(["welcome", "copyright", "layers", "new", "filters", "", undefined]) private readonly hash: UIEventSource; private readonly state: { selectedElement: UIEventSource, @@ -88,7 +88,7 @@ export default class SelectedFeatureHandler { if (!(hash.startsWith("node") || hash.startsWith("way") || hash.startsWith("relation"))) { return; } - + OsmObject.DownloadObjectAsync(hash).then(obj => { @@ -114,6 +114,7 @@ export default class SelectedFeatureHandler { // Hash has been cleared - we clear the selected element state.selectedElement.setData(undefined); } else { + // we search the element to select const feature = state.allElements.ContainingFeatures.get(h) if (feature === undefined) { diff --git a/Logic/Actors/StrayClickHandler.ts b/Logic/Actors/StrayClickHandler.ts index bdf79d162a..1cde818717 100644 --- a/Logic/Actors/StrayClickHandler.ts +++ b/Logic/Actors/StrayClickHandler.ts @@ -80,6 +80,5 @@ export default class StrayClickHandler { } - } \ No newline at end of file diff --git a/Logic/Actors/TitleHandler.ts b/Logic/Actors/TitleHandler.ts index d3d2f78fb2..a3c4b50813 100644 --- a/Logic/Actors/TitleHandler.ts +++ b/Logic/Actors/TitleHandler.ts @@ -8,7 +8,7 @@ import {ElementStorage} from "../ElementStorage"; import {Utils} from "../../Utils"; export default class TitleHandler { - constructor(state : { + constructor(state: { selectedElement: UIEventSource, layoutToUse: LayoutConfig, allElements: ElementStorage @@ -28,7 +28,7 @@ export default class TitleHandler { continue; } if (layer.source.osmTags.matchesProperties(tags)) { - const tagsSource = state.allElements.getEventSourceById(tags.id) + const tagsSource = state.allElements.getEventSourceById(tags.id) ?? new UIEventSource(tags) const title = new TagRenderingAnswer(tagsSource, layer.title) return new Combine([defaultTitle, " | ", title]).ConstructElement()?.innerText ?? defaultTitle; } @@ -39,7 +39,7 @@ export default class TitleHandler { currentTitle.addCallbackAndRunD(title => { - if(Utils.runningFromConsole){ + if (Utils.runningFromConsole) { return } document.title = title diff --git a/Logic/BBox.ts b/Logic/BBox.ts index 78634897b6..436f001252 100644 --- a/Logic/BBox.ts +++ b/Logic/BBox.ts @@ -4,11 +4,11 @@ import {GeoOperations} from "./GeoOperations"; export class BBox { + static global: BBox = new BBox([[-180, -90], [180, 90]]); readonly maxLat: number; readonly maxLon: number; readonly minLat: number; readonly minLon: number; - static global: BBox = new BBox([[-180, -90], [180, 90]]); constructor(coordinates) { this.maxLat = -90; @@ -45,6 +45,17 @@ export class BBox { return feature.bbox; } + static fromTile(z: number, x: number, y: number): BBox { + return new BBox(Tiles.tile_bounds_lon_lat(z, x, y)) + } + + static fromTileIndex(i: number): BBox { + if (i === 0) { + return BBox.global + } + return BBox.fromTile(...Tiles.tile_from_index(i)) + } + /** * Constructs a tilerange which fully contains this bbox (thus might be a bit larger) * @param zoomlevel @@ -83,24 +94,6 @@ export class BBox { return true; } - private check() { - if (isNaN(this.maxLon) || isNaN(this.maxLat) || isNaN(this.minLon) || isNaN(this.minLat)) { - console.log(this); - throw "BBOX has NAN"; - } - } - - static fromTile(z: number, x: number, y: number): BBox { - return new BBox(Tiles.tile_bounds_lon_lat(z, x, y)) - } - - static fromTileIndex(i: number): BBox { - if (i === 0) { - return BBox.global - } - return BBox.fromTile(...Tiles.tile_from_index(i)) - } - getEast() { return this.maxLon } @@ -117,6 +110,11 @@ export class BBox { return this.minLat } + contains(lonLat: [number, number]) { + return this.minLat <= lonLat[1] && lonLat[1] <= this.maxLat + && this.minLon <= lonLat[0] && lonLat[0] <= this.maxLon + } + pad(factor: number, maxIncrease = 2): BBox { const latDiff = Math.min(maxIncrease / 2, Math.abs(this.maxLat - this.minLat) * factor) @@ -174,4 +172,11 @@ export class BBox { } + + private check() { + if (isNaN(this.maxLon) || isNaN(this.maxLat) || isNaN(this.minLon) || isNaN(this.minLat)) { + console.log(this); + throw "BBOX has NAN"; + } + } } \ No newline at end of file diff --git a/Logic/ContributorCount.ts b/Logic/ContributorCount.ts index f39d1106f0..08eb496c53 100644 --- a/Logic/ContributorCount.ts +++ b/Logic/ContributorCount.ts @@ -8,6 +8,7 @@ export default class ContributorCount { public readonly Contributors: UIEventSource> = new UIEventSource>(new Map()); private readonly state: { featurePipeline: FeaturePipeline, currentBounds: UIEventSource, locationControl: UIEventSource }; + private lastUpdate: Date = undefined; constructor(state: { featurePipeline: FeaturePipeline, currentBounds: UIEventSource, locationControl: UIEventSource }) { this.state = state; @@ -16,15 +17,13 @@ export default class ContributorCount { self.update(bbox) }) state.featurePipeline.runningQuery.addCallbackAndRun( - _ => self.update(state.currentBounds.data) + _ => self.update(state.currentBounds.data) ) - + } - private lastUpdate: Date = undefined; - private update(bbox: BBox) { - if(bbox === undefined){ + if (bbox === undefined) { return; } const now = new Date(); diff --git a/Logic/DetermineLayout.ts b/Logic/DetermineLayout.ts index 476131732d..872b5b3e95 100644 --- a/Logic/DetermineLayout.ts +++ b/Logic/DetermineLayout.ts @@ -10,6 +10,7 @@ import {UIEventSource} from "./UIEventSource"; import {LocalStorageSource} from "./Web/LocalStorageSource"; import LZString from "lz-string"; import * as personal from "../assets/themes/personal/personal.json"; +import LegacyJsonConvert from "../Models/ThemeConfig/LegacyJsonConvert"; export default class DetermineLayout { @@ -60,42 +61,10 @@ export default class DetermineLayout { layer.minzoom = Math.max(16, layer.minzoom) } } - + return [layoutToUse, undefined] } - private static async LoadRemoteTheme(link: string): Promise { - console.log("Downloading map theme from ", link); - - new FixedUiElement(`Downloading the theme from the link...`) - .AttachTo("centermessage"); - - try { - - const parsed = await Utils.downloadJson(link) - console.log("Got ", parsed) - try { - parsed.id = link; - return new LayoutConfig(parsed, false).patchImages(link, JSON.stringify(parsed)); - } catch (e) { - console.error(e) - DetermineLayout.ShowErrorOnCustomTheme( - `${link} is invalid:`, - new FixedUiElement(e) - ) - return null; - } - - } catch (e) { - console.erorr(e) - DetermineLayout.ShowErrorOnCustomTheme( - `${link} is invalid - probably not found or invalid JSON:`, - new FixedUiElement(e) - ) - return null; - } - } - public static LoadLayoutFromHash( userLayoutParam: UIEventSource ): [LayoutConfig, string] | null { @@ -136,6 +105,7 @@ export default class DetermineLayout { } } + LegacyJsonConvert.fixThemeConfig(json) const layoutToUse = new LayoutConfig(json, false); userLayoutParam.setData(layoutToUse.id); return [layoutToUse, btoa(Utils.MinifyJSON(JSON.stringify(json)))]; @@ -163,4 +133,37 @@ export default class DetermineLayout { .AttachTo("centermessage"); } + private static async LoadRemoteTheme(link: string): Promise { + console.log("Downloading map theme from ", link); + + new FixedUiElement(`Downloading the theme from the link...`) + .AttachTo("centermessage"); + + try { + + const parsed = await Utils.downloadJson(link) + console.log("Got ", parsed) + LegacyJsonConvert.fixThemeConfig(parsed) + try { + parsed.id = link; + return new LayoutConfig(parsed, false).patchImages(link, JSON.stringify(parsed)); + } catch (e) { + console.error(e) + DetermineLayout.ShowErrorOnCustomTheme( + `${link} is invalid:`, + new FixedUiElement(e) + ) + return null; + } + + } catch (e) { + console.error(e) + DetermineLayout.ShowErrorOnCustomTheme( + `${link} is invalid - probably not found or invalid JSON:`, + new FixedUiElement(e) + ) + return null; + } + } + } \ No newline at end of file diff --git a/Logic/ElementStorage.ts b/Logic/ElementStorage.ts index ae51094aea..b64ac18efc 100644 --- a/Logic/ElementStorage.ts +++ b/Logic/ElementStorage.ts @@ -39,10 +39,10 @@ export class ElementStorage { } getEventSourceById(elementId): UIEventSource { - if(elementId === undefined){ + if (elementId === undefined) { return undefined; } - return this._elements.get(elementId); + return this._elements.get(elementId); } has(id) { diff --git a/Logic/ExtraFunction.ts b/Logic/ExtraFunction.ts index 8f0265bb14..2bb238f541 100644 --- a/Logic/ExtraFunction.ts +++ b/Logic/ExtraFunction.ts @@ -54,16 +54,17 @@ export class ExtraFunction { private static readonly OverlapFunc = new ExtraFunction( { name: "overlapWith", - doc: "Gives a list of features from the specified layer which this feature (partly) overlaps with. " + - "If the current feature is a point, all features that embed the point are given. " + + doc: "Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well." + + "If the current feature is a point, all features that this point is embeded in are given.\n\n" + "The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point.\n" + + "The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list\n" + "\n" + "For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')`", args: ["...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)"] }, (params, feat) => { return (...layerIds: string[]) => { - const result = [] + const result: { feat: any, overlap: number }[] = [] const bbox = BBox.get(feat) @@ -79,6 +80,9 @@ export class ExtraFunction { result.push(...GeoOperations.calculateOverlap(feat, otherLayer)); } } + + result.sort((a, b) => b.overlap - a.overlap) + return result; } } @@ -163,12 +167,41 @@ export class ExtraFunction { } ) + private static readonly GetParsed = new ExtraFunction( + { + name: "get", + doc: "Gets the property of the feature, parses it (as JSON) and returns it. Might return 'undefined' if not defined, null, ...", + args: ["key"] + }, + (params, feat) => { + return key => { + const value = feat.properties[key] + if (value === undefined) { + return undefined; + } + try { + const parsed = JSON.parse(value) + if (parsed === null) { + return undefined; + } + return parsed; + } catch (e) { + console.warn("Could not parse property " + key + " due to: " + e + ", the value is " + value) + return undefined; + } + + } + + } + ) + private static readonly allFuncs: ExtraFunction[] = [ ExtraFunction.DistanceToFunc, ExtraFunction.OverlapFunc, ExtraFunction.ClosestObjectFunc, ExtraFunction.ClosestNObjectFunc, - ExtraFunction.Memberships + ExtraFunction.Memberships, + ExtraFunction.GetParsed ]; private readonly _name: string; private readonly _args: string[]; @@ -200,7 +233,7 @@ export class ExtraFunction { return new Combine([ ExtraFunction.intro, - new List(ExtraFunction.allFuncs.map(func => func._name)), + new List(ExtraFunction.allFuncs.map(func => `[${func._name}](#${func._name})`)), ...elems ]); } @@ -222,7 +255,6 @@ export class ExtraFunction { const maxFeatures = options?.maxFeatures ?? 1 const maxDistance = options?.maxDistance ?? 500 const uniqueTag: string | undefined = options?.uniqueTag - console.log("Requested closestN") if (typeof features === "string") { const name = features const bbox = GeoOperations.bbox(GeoOperations.buffer(GeoOperations.bbox(feature), maxDistance)) @@ -238,7 +270,7 @@ export class ExtraFunction { let closestFeatures: { feat: any, distance: number }[] = []; for (const featureList of features) { for (const otherFeature of featureList) { - if (otherFeature === feature || otherFeature.id === feature.id) { + if (otherFeature === feature || otherFeature.properties.id === feature.properties.id) { continue; // We ignore self } const distance = GeoOperations.distanceBetween( @@ -249,6 +281,11 @@ export class ExtraFunction { console.error("Could not calculate the distance between", feature, "and", otherFeature) throw "Undefined distance!" } + + if (distance === 0) { + console.trace("Got a suspiciously zero distance between", otherFeature, "and self-feature", feature) + } + if (distance > maxDistance) { continue } diff --git a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts index 83a269b89e..4bbba043f7 100644 --- a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts +++ b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts @@ -39,7 +39,7 @@ export default class SaveTileToLocalStorageActor { } } - public static poison(layers: string[], lon: number, lat: number) { + public static poison(layers: string[], lon: number, lat: number) { for (let z = 0; z < 25; z++) { const {x, y} = Tiles.embedded_tile(lat, lon, z) diff --git a/Logic/FeatureSource/FeaturePipeline.ts b/Logic/FeatureSource/FeaturePipeline.ts index 8cd9aae67c..2b0392bf3c 100644 --- a/Logic/FeatureSource/FeaturePipeline.ts +++ b/Logic/FeatureSource/FeaturePipeline.ts @@ -12,7 +12,6 @@ import OverpassFeatureSource from "../Actors/OverpassFeatureSource"; import {Changes} from "../Osm/Changes"; import GeoJsonSource from "./Sources/GeoJsonSource"; import Loc from "../../Models/Loc"; -import WayHandlingApplyingFeatureSource from "./Sources/WayHandlingApplyingFeatureSource"; import RegisteringAllFromFeatureSourceActor from "./Actors/RegisteringAllFromFeatureSourceActor"; import TiledFromLocalStorageSource from "./TiledFeatureSource/TiledFromLocalStorageSource"; import SaveTileToLocalStorageActor from "./Actors/SaveTileToLocalStorageActor"; @@ -26,6 +25,8 @@ import OsmFeatureSource from "./TiledFeatureSource/OsmFeatureSource"; import {OsmConnection} from "../Osm/OsmConnection"; import {Tiles} from "../../Models/TileRange"; import TileFreshnessCalculator from "./TileFreshnessCalculator"; +import {ElementStorage} from "../ElementStorage"; +import FullNodeDatabaseSource from "./TiledFeatureSource/FullNodeDatabaseSource"; /** @@ -74,6 +75,9 @@ export default class FeaturePipeline { constructor( handleFeatureSource: (source: FeatureSourceForLayer & Tiled) => void, state: { + readonly historicalUserLocations: FeatureSourceForLayer & Tiled; + readonly homeLocation: FeatureSourceForLayer & Tiled; + readonly currentUserLocation: FeatureSourceForLayer & Tiled; readonly filteredLayers: UIEventSource, readonly locationControl: UIEventSource, readonly selectedElement: UIEventSource, @@ -85,7 +89,8 @@ export default class FeaturePipeline { readonly overpassMaxZoom: UIEventSource; readonly osmConnection: OsmConnection readonly currentBounds: UIEventSource, - readonly osmApiTileSize: UIEventSource + readonly osmApiTileSize: UIEventSource, + readonly allElements: ElementStorage }) { this.state = state; @@ -123,13 +128,11 @@ export default class FeaturePipeline { const perLayerHierarchy = new Map() this.perLayerHierarchy = perLayerHierarchy - const patchedHandleFeatureSource = function (src: FeatureSourceForLayer & IndexedFeatureSource & Tiled) { + function patchedHandleFeatureSource (src: FeatureSourceForLayer & IndexedFeatureSource & Tiled) { // This will already contain the merged features for this tile. In other words, this will only be triggered once for every tile const srcFiltered = new FilteringFeatureSource(state, src.tileIndex, - new WayHandlingApplyingFeatureSource( - new ChangeGeometryApplicator(src, state.changes) - ) + new ChangeGeometryApplicator(src, state.changes) ) handleFeatureSource(srcFiltered) @@ -137,6 +140,14 @@ export default class FeaturePipeline { // We do not mark as visited here, this is the responsability of the code near the actual loader (e.g. overpassLoader and OSMApiFeatureLoader) }; + function handlePriviligedFeatureSource(src: FeatureSourceForLayer & Tiled){ + // Passthrough to passed function, except that it registers as well + handleFeatureSource(src) + src.features.addCallbackAndRunD(fs => { + fs.forEach(ff => state.allElements.addOrGetElement(ff.feature)) + }) + } + for (const filteredLayer of state.filteredLayers.data) { const id = filteredLayer.layerDef.id @@ -147,6 +158,26 @@ export default class FeaturePipeline { this.freshnesses.set(id, new TileFreshnessCalculator()) + if (id === "type_node") { + // Handles by the 'FullNodeDatabaseSource' + continue; + } + + if (id === "gps_location") { + handlePriviligedFeatureSource(state.currentUserLocation) + continue + } + + if (id === "gps_track") { + handlePriviligedFeatureSource(state.historicalUserLocations) + continue + } + + if (id === "home_location") { + handlePriviligedFeatureSource(state.homeLocation) + continue + } + if (source.geojsonSource === undefined) { // This is an OSM layer // We load the cached values and register them @@ -222,6 +253,18 @@ export default class FeaturePipeline { }) }) + if (state.layoutToUse.trackAllNodes) { + const fullNodeDb = new FullNodeDatabaseSource( + state.filteredLayers.data.filter(l => l.layerDef.id === "type_node")[0], + tile => { + new RegisteringAllFromFeatureSourceActor(tile) + perLayerHierarchy.get(tile.layer.layerDef.id).registerTile(tile) + tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) + }) + + osmFeatureSource.rawDataHandlers.push((osmJson, tileId) => fullNodeDb.handleOsmJson(osmJson, tileId)) + } + const updater = this.initOverpassUpdater(state, useOsmApi) this.overpassUpdater = updater; @@ -266,7 +309,7 @@ export default class FeaturePipeline { // Whenever fresh data comes in, we need to update the metatagging - self.newDataLoadedSignal.stabilized(1000).addCallback(_ => { + self.newDataLoadedSignal.stabilized(250).addCallback(src => { self.updateAllMetaTagging() }) @@ -282,6 +325,34 @@ export default class FeaturePipeline { } + public GetAllFeaturesWithin(bbox: BBox): any[][] { + const self = this + const tiles = [] + Array.from(this.perLayerHierarchy.keys()) + .forEach(key => tiles.push(...self.GetFeaturesWithin(key, bbox))) + return tiles; + } + + public GetFeaturesWithin(layerId: string, bbox: BBox): any[][] { + if (layerId === "*") { + return this.GetAllFeaturesWithin(bbox) + } + const requestedHierarchy = this.perLayerHierarchy.get(layerId) + if (requestedHierarchy === undefined) { + console.warn("Layer ", layerId, "is not defined. Try one of ", Array.from(this.perLayerHierarchy.keys())) + return undefined; + } + return TileHierarchyTools.getTiles(requestedHierarchy, bbox) + .filter(featureSource => featureSource.features?.data !== undefined) + .map(featureSource => featureSource.features.data.map(fs => fs.feature)) + } + + public GetTilesPerLayerWithin(bbox: BBox, handleTile: (tile: FeatureSourceForLayer & Tiled) => void) { + Array.from(this.perLayerHierarchy.values()).forEach(hierarchy => { + TileHierarchyTools.getTiles(hierarchy, bbox).forEach(handleTile) + }) + } + private freshnessForVisibleLayers(z: number, x: number, y: number): Date { let oldestDate = undefined; for (const flayer of this.state.filteredLayers.data) { @@ -391,7 +462,7 @@ export default class FeaturePipeline { window.setTimeout( () => { const layerDef = src.layer.layerDef; - MetaTagging.addMetatags( + const somethingChanged = MetaTagging.addMetatags( src.features.data, { memberships: this.relationTracker, @@ -412,40 +483,13 @@ export default class FeaturePipeline { private updateAllMetaTagging() { const self = this; + console.debug("Updating the meta tagging of all tiles as new data got loaded") this.perLayerHierarchy.forEach(hierarchy => { - hierarchy.loadedTiles.forEach(src => { - self.applyMetaTags(src) + hierarchy.loadedTiles.forEach(tile => { + self.applyMetaTags(tile) }) }) } - public GetAllFeaturesWithin(bbox: BBox): any[][] { - const self = this - const tiles = [] - Array.from(this.perLayerHierarchy.keys()) - .forEach(key => tiles.push(...self.GetFeaturesWithin(key, bbox))) - return tiles; - } - - public GetFeaturesWithin(layerId: string, bbox: BBox): any[][] { - if (layerId === "*") { - return this.GetAllFeaturesWithin(bbox) - } - const requestedHierarchy = this.perLayerHierarchy.get(layerId) - if (requestedHierarchy === undefined) { - console.warn("Layer ", layerId, "is not defined. Try one of ", Array.from(this.perLayerHierarchy.keys())) - return undefined; - } - return TileHierarchyTools.getTiles(requestedHierarchy, bbox) - .filter(featureSource => featureSource.features?.data !== undefined) - .map(featureSource => featureSource.features.data.map(fs => fs.feature)) - } - - public GetTilesPerLayerWithin(bbox: BBox, handleTile: (tile: FeatureSourceForLayer & Tiled) => void) { - Array.from(this.perLayerHierarchy.values()).forEach(hierarchy => { - TileHierarchyTools.getTiles(hierarchy, bbox).forEach(handleTile) - }) - } - } \ No newline at end of file diff --git a/Logic/FeatureSource/FeatureSource.ts b/Logic/FeatureSource/FeatureSource.ts index 7d603d1f6b..df8b564128 100644 --- a/Logic/FeatureSource/FeatureSource.ts +++ b/Logic/FeatureSource/FeatureSource.ts @@ -1,5 +1,4 @@ import {UIEventSource} from "../UIEventSource"; -import {Utils} from "../../Utils"; import FilteredLayer from "../../Models/FilteredLayer"; import {BBox} from "../BBox"; @@ -19,7 +18,7 @@ export interface Tiled { /** * A feature source which only contains features for the defined layer */ -export interface FeatureSourceForLayer extends FeatureSource{ +export interface FeatureSourceForLayer extends FeatureSource { readonly layer: FilteredLayer } diff --git a/Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts b/Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts index f9a0cbe1a1..3e6f5f2a7f 100644 --- a/Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts +++ b/Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts @@ -14,15 +14,15 @@ export default class PerLayerFeatureSourceSplitter { constructor(layers: UIEventSource, handleLayerData: (source: FeatureSourceForLayer & Tiled) => void, upstream: FeatureSource, - options?:{ - tileIndex?: number, - handleLeftovers?: (featuresWithoutLayer: any[]) => void + options?: { + tileIndex?: number, + handleLeftovers?: (featuresWithoutLayer: any[]) => void }) { const knownLayers = new Map() function update() { - const features = upstream.features.data; + const features = upstream.features?.data; if (features === undefined) { return; } @@ -35,6 +35,7 @@ export default class PerLayerFeatureSourceSplitter { const featuresPerLayer = new Map(); const noLayerFound = [] + function addTo(layer: FilteredLayer, feature: { feature, freshness }) { const id = layer.layerDef.id const list = featuresPerLayer.get(id) @@ -80,9 +81,9 @@ export default class PerLayerFeatureSourceSplitter { featureSource.features.setData(features) } } - + // AT last, the leftovers are handled - if(options?.handleLeftovers !== undefined && noLayerFound.length > 0){ + if (options?.handleLeftovers !== undefined && noLayerFound.length > 0) { options.handleLeftovers(noLayerFound) } } diff --git a/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts b/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts index a35879d960..83ab174bd4 100644 --- a/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts +++ b/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts @@ -11,9 +11,9 @@ import {ChangeDescription, ChangeDescriptionTools} from "../../Osm/Actions/Chang export default class ChangeGeometryApplicator implements FeatureSourceForLayer { public readonly features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]); public readonly name: string; + public readonly layer: FilteredLayer private readonly source: IndexedFeatureSource; private readonly changes: Changes; - public readonly layer: FilteredLayer constructor(source: (IndexedFeatureSource & FeatureSourceForLayer), changes: Changes) { this.source = source; @@ -22,10 +22,10 @@ export default class ChangeGeometryApplicator implements FeatureSourceForLayer { this.name = "ChangesApplied(" + source.name + ")" this.features = new UIEventSource<{ feature: any; freshness: Date }[]>(undefined) - + const self = this; source.features.addCallbackAndRunD(_ => self.update()) - + changes.allChanges.addCallbackAndRunD(_ => self.update()) } @@ -52,9 +52,9 @@ export default class ChangeGeometryApplicator implements FeatureSourceForLayer { const changesPerId = new Map() for (const ch of changesToApply) { const key = ch.type + "/" + ch.id - if(changesPerId.has(key)){ + if (changesPerId.has(key)) { changesPerId.get(key).push(ch) - }else{ + } else { changesPerId.set(key, [ch]) } } @@ -66,7 +66,7 @@ export default class ChangeGeometryApplicator implements FeatureSourceForLayer { newFeatures.push(feature) continue; } - + // Allright! We have a feature to rewrite! const copy = { ...feature diff --git a/Logic/FeatureSource/Sources/FeatureSourceMerger.ts b/Logic/FeatureSource/Sources/FeatureSourceMerger.ts index b1797d0aec..99a9b9bc55 100644 --- a/Logic/FeatureSource/Sources/FeatureSourceMerger.ts +++ b/Logic/FeatureSource/Sources/FeatureSourceMerger.ts @@ -5,7 +5,6 @@ import {UIEventSource} from "../../UIEventSource"; import FeatureSource, {FeatureSourceForLayer, IndexedFeatureSource, Tiled} from "../FeatureSource"; import FilteredLayer from "../../../Models/FilteredLayer"; -import {Utils} from "../../../Utils"; import {Tiles} from "../../../Models/TileRange"; import {BBox} from "../../BBox"; @@ -14,17 +13,17 @@ export default class FeatureSourceMerger implements FeatureSourceForLayer, Tiled public features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]); public readonly name; public readonly layer: FilteredLayer - private readonly _sources: UIEventSource; public readonly tileIndex: number; public readonly bbox: BBox; public readonly containedIds: UIEventSource> = new UIEventSource>(new Set()) + private readonly _sources: UIEventSource; constructor(layer: FilteredLayer, tileIndex: number, bbox: BBox, sources: UIEventSource) { this.tileIndex = tileIndex; this.bbox = bbox; this._sources = sources; this.layer = layer; - this.name = "FeatureSourceMerger("+layer.layerDef.id+", "+Tiles.tile_from_index(tileIndex).join(",")+")" + this.name = "FeatureSourceMerger(" + layer.layerDef.id + ", " + Tiles.tile_from_index(tileIndex).join(",") + ")" const self = this; const handledSources = new Set(); diff --git a/Logic/FeatureSource/Sources/FilteringFeatureSource.ts b/Logic/FeatureSource/Sources/FilteringFeatureSource.ts index 0c2c9d92ae..d5ed4dc717 100644 --- a/Logic/FeatureSource/Sources/FilteringFeatureSource.ts +++ b/Logic/FeatureSource/Sources/FilteringFeatureSource.ts @@ -1,9 +1,10 @@ import {UIEventSource} from "../../UIEventSource"; -import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"; import FilteredLayer from "../../../Models/FilteredLayer"; import {FeatureSourceForLayer, Tiled} from "../FeatureSource"; import Hash from "../../Web/Hash"; import {BBox} from "../../BBox"; +import {ElementStorage} from "../../ElementStorage"; +import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"; export default class FilteringFeatureSource implements FeatureSourceForLayer, Tiled { public features: UIEventSource<{ feature: any; freshness: Date }[]> = @@ -12,79 +13,106 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti public readonly layer: FilteredLayer; public readonly tileIndex: number public readonly bbox: BBox + private readonly upstream: FeatureSourceForLayer; + private readonly state: { + locationControl: UIEventSource<{ zoom: number }>; selectedElement: UIEventSource, + allElements: ElementStorage + }; + private readonly _alreadyRegistered = new Set>(); + private readonly _is_dirty = new UIEventSource(false) constructor( state: { locationControl: UIEventSource<{ zoom: number }>, selectedElement: UIEventSource, + allElements: ElementStorage }, tileIndex, upstream: FeatureSourceForLayer ) { - const self = this; this.name = "FilteringFeatureSource(" + upstream.name + ")" this.tileIndex = tileIndex this.bbox = BBox.fromTileIndex(tileIndex) + this.upstream = upstream + this.state = state this.layer = upstream.layer; const layer = upstream.layer; - - function update() { - - const features: { feature: any; freshness: Date }[] = upstream.features.data; - const newFeatures = features.filter((f) => { - if ( - state.selectedElement.data?.id === f.feature.id || - f.feature.id === Hash.hash.data) { - // This is the selected object - it gets a free pass even if zoom is not sufficient or it is filtered away - return true; - } - - const isShown = layer.layerDef.isShown; - const tags = f.feature.properties; - if (isShown.IsKnown(tags)) { - const result = layer.layerDef.isShown.GetRenderValue( - f.feature.properties - ).txt; - if (result !== "yes") { - return false; - } - } - - const tagsFilter = layer.appliedFilters.data; - for (const filter of tagsFilter ?? []) { - const neededTags = filter.filter.options[filter.selected].osmTags - if (!neededTags.matchesProperties(f.feature.properties)) { - // Hidden by the filter on the layer itself - we want to hide it no matter wat - return false; - } - } - - - return true; - }); - - self.features.setData(newFeatures); - } - + const self = this; upstream.features.addCallback(() => { - update(); + self.update(); }); layer.appliedFilters.addCallback(_ => { - update() + self.update() }) - update(); + this._is_dirty.stabilized(250).addCallbackAndRunD(dirty => { + if (dirty) { + self.update() + } + }) + + this.update(); } - private static showLayer( - layer: { - isDisplayed: UIEventSource; - layerDef: LayerConfig; - }) { - return layer.isDisplayed.data; + public update() { + const self = this; + const layer = this.upstream.layer; + const features: { feature: any; freshness: Date }[] = this.upstream.features.data; + const newFeatures = features.filter((f) => { + self.registerCallback(f.feature, layer.layerDef) + + if ( + this.state.selectedElement.data?.id === f.feature.id || + f.feature.id === Hash.hash.data) { + // This is the selected object - it gets a free pass even if zoom is not sufficient or it is filtered away + return true; + } + + const isShown = layer.layerDef.isShown; + const tags = f.feature.properties; + if (isShown.IsKnown(tags)) { + const result = layer.layerDef.isShown.GetRenderValue( + f.feature.properties + ).txt; + if (result !== "yes") { + return false; + } + } + + const tagsFilter = layer.appliedFilters.data; + for (const filter of tagsFilter ?? []) { + const neededTags = filter.filter.options[filter.selected].osmTags + if (!neededTags.matchesProperties(f.feature.properties)) { + // Hidden by the filter on the layer itself - we want to hide it no matter wat + return false; + } + } + + + return true; + }); + + this.features.setData(newFeatures); + this._is_dirty.setData(false) } + + private registerCallback(feature: any, layer: LayerConfig) { + const src = this.state.allElements.addOrGetElement(feature) + if (this._alreadyRegistered.has(src)) { + return + } + this._alreadyRegistered.add(src) + if (layer.isShown !== undefined) { + + const self = this; + src.map(tags => layer.isShown?.GetRenderValue(tags, "yes").txt).addCallbackAndRunD(isShown => { + self._is_dirty.setData(true) + }) + } + } + } diff --git a/Logic/FeatureSource/Sources/GeoJsonSource.ts b/Logic/FeatureSource/Sources/GeoJsonSource.ts index 68f8fab823..e2269d6219 100644 --- a/Logic/FeatureSource/Sources/GeoJsonSource.ts +++ b/Logic/FeatureSource/Sources/GeoJsonSource.ts @@ -15,12 +15,10 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>; public readonly name; public readonly isOsmCache: boolean - private readonly seenids: Set = new Set() public readonly layer: FilteredLayer; - public readonly tileIndex public readonly bbox; - + private readonly seenids: Set = new Set() /** * Only used if the actual source is a tiled geojson. * A big feature might be contained in multiple tiles. @@ -32,7 +30,7 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { public constructor(flayer: FilteredLayer, zxy?: [number, number, number], options?: { - featureIdBlacklist?: UIEventSource> + featureIdBlacklist?: UIEventSource> }) { if (flayer.layerDef.source.geojsonZoomLevel !== undefined && zxy === undefined) { @@ -45,18 +43,18 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { if (zxy !== undefined) { const [z, x, y] = zxy; let tile_bbox = BBox.fromTile(z, x, y) - let bounds : { minLat: number, maxLat: number, minLon: number, maxLon: number } = tile_bbox - if(this.layer.layerDef.source.mercatorCrs){ + let bounds: { minLat: number, maxLat: number, minLon: number, maxLon: number } = tile_bbox + if (this.layer.layerDef.source.mercatorCrs) { bounds = tile_bbox.toMercator() } url = url .replace('{z}', "" + z) .replace('{x}', "" + x) .replace('{y}', "" + y) - .replace('{y_min}',""+bounds.minLat) - .replace('{y_max}',""+bounds.maxLat) - .replace('{x_min}',""+bounds.minLon) - .replace('{x_max}',""+bounds.maxLon) + .replace('{y_min}', "" + bounds.minLat) + .replace('{y_max}', "" + bounds.maxLat) + .replace('{x_min}', "" + bounds.minLon) + .replace('{x_max}', "" + bounds.maxLon) this.tileIndex = Tiles.tile_index(z, x, y) this.bbox = BBox.fromTile(z, x, y) @@ -78,11 +76,11 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { const self = this; Utils.downloadJson(url) .then(json => { - if(json.features === undefined || json.features === null){ + if (json.features === undefined || json.features === null) { return; } - - if(self.layer.layerDef.source.mercatorCrs){ + + if (self.layer.layerDef.source.mercatorCrs) { json = GeoOperations.GeoJsonToWGS84(json) } @@ -109,8 +107,8 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { continue; } self.seenids.add(props.id) - - if(self.featureIdBlacklist?.data?.has(props.id)){ + + if (self.featureIdBlacklist?.data?.has(props.id)) { continue; } @@ -122,7 +120,7 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { newFeatures.push({feature: feature, freshness: freshness}) } - if ( newFeatures.length == 0) { + if (newFeatures.length == 0) { return; } diff --git a/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts b/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts index 0a1c67f411..6b8611d507 100644 --- a/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts +++ b/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts @@ -7,7 +7,7 @@ import State from "../../../State"; export class NewGeometryFromChangesFeatureSource implements FeatureSource { // This class name truly puts the 'Java' into 'Javascript' - + /** * A feature source containing exclusively new elements */ @@ -31,7 +31,6 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource { // Already handled !seenChanges.has(ch))) .addCallbackAndRunD(changes => { - if (changes.length === 0) { return; } @@ -54,10 +53,10 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource { for (const kv of change.tags) { tags[kv.k] = kv.v } - tags["id"] = change.type+"/"+change.id - + tags["id"] = change.type + "/" + change.id + tags["_backend"] = State.state.osmConnection._oauth_config.url - + switch (change.type) { case "node": const n = new OsmNode(change.id) @@ -71,7 +70,7 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource { const w = new OsmWay(change.id) w.tags = tags w.nodes = change.changes["nodes"] - w.coordinates = change.changes["coordinates"].map(coor => coor.reverse()) + w.coordinates = change.changes["coordinates"].map(coor => [coor[1], coor[0]]) add(w.asGeoJson()) break; case "relation": @@ -86,7 +85,7 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource { } } - + self.features.ping() }) } diff --git a/Logic/FeatureSource/Sources/RememberingSource.ts b/Logic/FeatureSource/Sources/RememberingSource.ts index 6835767363..c9a5e97e4b 100644 --- a/Logic/FeatureSource/Sources/RememberingSource.ts +++ b/Logic/FeatureSource/Sources/RememberingSource.ts @@ -6,19 +6,19 @@ import FeatureSource, {Tiled} from "../FeatureSource"; import {UIEventSource} from "../../UIEventSource"; import {BBox} from "../../BBox"; -export default class RememberingSource implements FeatureSource , Tiled{ +export default class RememberingSource implements FeatureSource, Tiled { public readonly features: UIEventSource<{ feature: any, freshness: Date }[]>; public readonly name; - public readonly tileIndex : number - public readonly bbox : BBox - + public readonly tileIndex: number + public readonly bbox: BBox + constructor(source: FeatureSource & Tiled) { const self = this; this.name = "RememberingSource of " + source.name; - this.tileIndex= source.tileIndex + this.tileIndex = source.tileIndex this.bbox = source.bbox; - + const empty = []; this.features = source.features.map(features => { const oldFeatures = self.features?.data ?? empty; diff --git a/Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts b/Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts new file mode 100644 index 0000000000..9971dbc469 --- /dev/null +++ b/Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts @@ -0,0 +1,118 @@ +/** + * This feature source helps the ShowDataLayer class: it introduces the necessary extra features and indiciates with what renderConfig it should be rendered. + */ +import {UIEventSource} from "../../UIEventSource"; +import {GeoOperations} from "../../GeoOperations"; +import FeatureSource from "../FeatureSource"; +import PointRenderingConfig from "../../../Models/ThemeConfig/PointRenderingConfig"; +import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"; + +export default class RenderingMultiPlexerFeatureSource { + public readonly features: UIEventSource<(any & { pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined })[]>; + + constructor(upstream: FeatureSource, layer: LayerConfig) { + this.features = upstream.features.map( + features => { + if (features === undefined) { + return; + } + + const pointRenderObjects: { rendering: PointRenderingConfig, index: number }[] = layer.mapRendering.map((r, i) => ({ + rendering: r, + index: i + })) + const pointRenderings = pointRenderObjects.filter(r => r.rendering.location.has("point")) + const centroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("centroid")) + const startRenderings = pointRenderObjects.filter(r => r.rendering.location.has("start")) + const endRenderings = pointRenderObjects.filter(r => r.rendering.location.has("end")) + + const lineRenderObjects = layer.lineRendering + + const withIndex: (any & { pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined, multiLineStringIndex: number | undefined })[] = []; + + + function addAsPoint(feat, rendering, coordinate) { + const patched = { + ...feat, + pointRenderingIndex: rendering.index + } + patched.geometry = { + type: "Point", + coordinates: coordinate + } + withIndex.push(patched) + } + + for (const f of features) { + const feat = f.feature; + if (feat.geometry.type === "Point") { + + for (const rendering of pointRenderings) { + withIndex.push({ + ...feat, + pointRenderingIndex: rendering.index + }) + } + } else { + // This is a a line: add the centroids + for (const rendering of centroidRenderings) { + addAsPoint(feat, rendering, GeoOperations.centerpointCoordinates(feat)) + } + + if (feat.geometry.type === "LineString") { + + // Add start- and endpoints + const coordinates = feat.geometry.coordinates + for (const rendering of startRenderings) { + addAsPoint(feat, rendering, coordinates[0]) + } + for (const rendering of endRenderings) { + const coordinate = coordinates[coordinates.length - 1] + addAsPoint(feat, rendering, coordinate) + } + + } + + + if (feat.geometry.type === "MultiLineString") { + // Multilinestrings get a special treatment: we split them into their subparts before rendering + const lineList: [number, number][][] = feat.geometry.coordinates + + for (let i1 = 0; i1 < lineList.length; i1++) { + const coordinates = lineList[i1]; + + for (let i = 0; i < lineRenderObjects.length; i++) { + const orig = { + ...feat, + lineRenderingIndex: i, + multiLineStringIndex: i1 + } + orig.geometry.coordinates = coordinates + orig.geometry.type = "LineString" + withIndex.push(orig) + } + } + + }else{ + + // AT last, add it 'as is' to what we should render + for (let i = 0; i < lineRenderObjects.length; i++) { + withIndex.push({ + ...feat, + lineRenderingIndex: i + }) + } + } + + + } + } + + + return withIndex; + } + ); + + } + +} \ No newline at end of file diff --git a/Logic/FeatureSource/Sources/SimpleFeatureSource.ts b/Logic/FeatureSource/Sources/SimpleFeatureSource.ts index b06aae6d27..138a3465e6 100644 --- a/Logic/FeatureSource/Sources/SimpleFeatureSource.ts +++ b/Logic/FeatureSource/Sources/SimpleFeatureSource.ts @@ -1,22 +1,21 @@ import {UIEventSource} from "../../UIEventSource"; import FilteredLayer from "../../../Models/FilteredLayer"; import {FeatureSourceForLayer, Tiled} from "../FeatureSource"; -import {Utils} from "../../../Utils"; -import {Tiles} from "../../../Models/TileRange"; import {BBox} from "../../BBox"; export default class SimpleFeatureSource implements FeatureSourceForLayer, Tiled { - public readonly features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]); + public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>; public readonly name: string = "SimpleFeatureSource"; public readonly layer: FilteredLayer; public readonly bbox: BBox = BBox.global; public readonly tileIndex: number; - constructor(layer: FilteredLayer, tileIndex: number) { + constructor(layer: FilteredLayer, tileIndex: number, featureSource?: UIEventSource<{ feature:any; freshness: Date }[]>) { this.name = "SimpleFeatureSource(" + layer.layerDef.id + ")" this.layer = layer this.tileIndex = tileIndex ?? 0; this.bbox = BBox.fromTileIndex(this.tileIndex) + this.features = featureSource ?? new UIEventSource<{ feature: any; freshness: Date }[]>([]); } } \ No newline at end of file diff --git a/Logic/FeatureSource/Sources/WayHandlingApplyingFeatureSource.ts b/Logic/FeatureSource/Sources/WayHandlingApplyingFeatureSource.ts deleted file mode 100644 index cb36c4b21a..0000000000 --- a/Logic/FeatureSource/Sources/WayHandlingApplyingFeatureSource.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * This is the part of the pipeline which introduces extra points at the center of an area (but only if this is demanded by the wayhandling) - */ -import {UIEventSource} from "../../UIEventSource"; -import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"; -import {GeoOperations} from "../../GeoOperations"; -import {FeatureSourceForLayer} from "../FeatureSource"; - -export default class WayHandlingApplyingFeatureSource implements FeatureSourceForLayer { - public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>; - public readonly name; - public readonly layer; - - constructor(upstream: FeatureSourceForLayer) { - - this.name = "Wayhandling(" + upstream.name + ")"; - this.layer = upstream.layer - const layer = upstream.layer.layerDef; - - if (layer.wayHandling === LayerConfig.WAYHANDLING_DEFAULT) { - // We don't have to do anything fancy - // lets just wire up the upstream - this.features = upstream.features; - return; - } - - this.features = upstream.features.map( - features => { - if (features === undefined) { - return; - } - const newFeatures: { feature: any, freshness: Date }[] = []; - for (const f of features) { - const feat = f.feature; - - if (layer.wayHandling === LayerConfig.WAYHANDLING_DEFAULT) { - newFeatures.push(f); - continue; - } - - if (feat.geometry.type === "Point") { - newFeatures.push(f); - // feature is a point, nothing to do here - continue; - } - - // Create the copy - const centerPoint = GeoOperations.centerpoint(feat); - - newFeatures.push({feature: centerPoint, freshness: f.freshness}); - if (layer.wayHandling === LayerConfig.WAYHANDLING_CENTER_AND_WAY) { - newFeatures.push(f); - } - } - return newFeatures; - } - ); - - } - -} \ No newline at end of file diff --git a/Logic/FeatureSource/TileFreshnessCalculator.ts b/Logic/FeatureSource/TileFreshnessCalculator.ts index 85ff8ae121..58a655151a 100644 --- a/Logic/FeatureSource/TileFreshnessCalculator.ts +++ b/Logic/FeatureSource/TileFreshnessCalculator.ts @@ -13,35 +13,35 @@ export default class TileFreshnessCalculator { * @param tileId * @param freshness */ - public addTileLoad(tileId: number, freshness: Date){ + public addTileLoad(tileId: number, freshness: Date) { const existingFreshness = this.freshnessFor(...Tiles.tile_from_index(tileId)) - if(existingFreshness >= freshness){ + if (existingFreshness >= freshness) { return; } this.freshnesses.set(tileId, freshness) - + // Do we have freshness for the neighbouring tiles? If so, we can mark the tile above as loaded too! let [z, x, y] = Tiles.tile_from_index(tileId) - if(z === 0){ + if (z === 0) { return; } x = x - (x % 2) // Make the tiles always even y = y - (y % 2) - + const ul = this.freshnessFor(z, x, y)?.getTime() - if(ul === undefined){ + if (ul === undefined) { return } const ur = this.freshnessFor(z, x + 1, y)?.getTime() - if(ur === undefined){ + if (ur === undefined) { return } const ll = this.freshnessFor(z, x, y + 1)?.getTime() - if(ll === undefined){ + if (ll === undefined) { return } const lr = this.freshnessFor(z, x + 1, y + 1)?.getTime() - if(lr === undefined){ + if (lr === undefined) { return } @@ -50,22 +50,22 @@ export default class TileFreshnessCalculator { date.setTime(leastFresh) this.addTileLoad( Tiles.tile_index(z - 1, Math.floor(x / 2), Math.floor(y / 2)), - date + date ) - + } - - public freshnessFor(z: number, x: number, y:number): Date { - if(z < 0){ + + public freshnessFor(z: number, x: number, y: number): Date { + if (z < 0) { return undefined } const tileId = Tiles.tile_index(z, x, y) - if(this.freshnesses.has(tileId)) { + if (this.freshnesses.has(tileId)) { return this.freshnesses.get(tileId) } // recurse up - return this.freshnessFor(z - 1, Math.floor(x /2), Math.floor(y / 2)) - + return this.freshnessFor(z - 1, Math.floor(x / 2), Math.floor(y / 2)) + } } \ No newline at end of file diff --git a/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts b/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts index faeb5869a5..dcc415f31e 100644 --- a/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts @@ -9,9 +9,8 @@ import {Tiles} from "../../../Models/TileRange"; * A tiled source which dynamically loads the required tiles at a fixed zoom level */ export default class DynamicTileSource implements TileHierarchy { - private readonly _loadedTiles = new Set(); - public readonly loadedTiles: Map; + private readonly _loadedTiles = new Set(); constructor( layer: FilteredLayer, @@ -24,7 +23,7 @@ export default class DynamicTileSource implements TileHierarchy() + this.loadedTiles = new Map() const neededTiles = state.locationControl.map( location => { if (!layer.isDisplayed.data) { @@ -54,14 +53,14 @@ export default class DynamicTileSource implements TileHierarchy { - console.log("Tiled geojson source ",layer.layerDef.id," needs", neededIndexes) + console.log("Tiled geojson source ", layer.layerDef.id, " needs", neededIndexes) if (neededIndexes === undefined) { return; } for (const neededIndex of neededIndexes) { self._loadedTiles.add(neededIndex) const src = constructTile(Tiles.tile_from_index(neededIndex)) - if(src !== undefined){ + if (src !== undefined) { self.loadedTiles.set(neededIndex, src) } } diff --git a/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts b/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts new file mode 100644 index 0000000000..d02ae5858a --- /dev/null +++ b/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts @@ -0,0 +1,67 @@ +import TileHierarchy from "./TileHierarchy"; +import FeatureSource, {FeatureSourceForLayer, Tiled} from "../FeatureSource"; +import {OsmNode, OsmObject, OsmWay} from "../../Osm/OsmObject"; +import SimpleFeatureSource from "../Sources/SimpleFeatureSource"; +import FilteredLayer from "../../../Models/FilteredLayer"; + + +export default class FullNodeDatabaseSource implements TileHierarchy { + public readonly loadedTiles = new Map() + private readonly onTileLoaded: (tile: (Tiled & FeatureSourceForLayer)) => void; + private readonly layer: FilteredLayer + + constructor( + layer: FilteredLayer, + onTileLoaded: ((tile: Tiled & FeatureSourceForLayer) => void)) { + this.onTileLoaded = onTileLoaded + this.layer = layer; + if (this.layer === undefined) { + throw "Layer is undefined" + } + } + + public handleOsmJson(osmJson: any, tileId: number) { + + const allObjects = OsmObject.ParseObjects(osmJson.elements) + const nodesById = new Map() + + for (const osmObj of allObjects) { + if (osmObj.type !== "node") { + continue + } + const osmNode = osmObj; + nodesById.set(osmNode.id, osmNode) + } + + const parentWaysByNodeId = new Map() + for (const osmObj of allObjects) { + if (osmObj.type !== "way") { + continue + } + const osmWay = osmObj; + for (const nodeId of osmWay.nodes) { + + if (!parentWaysByNodeId.has(nodeId)) { + parentWaysByNodeId.set(nodeId, []) + } + parentWaysByNodeId.get(nodeId).push(osmWay) + } + } + parentWaysByNodeId.forEach((allWays, nodeId) => { + nodesById.get(nodeId).tags["parent_ways"] = JSON.stringify(allWays.map(w => w.tags)) + }) + const now = new Date() + const asGeojsonFeatures = Array.from(nodesById.values()).map(osmNode => ({ + feature: osmNode.asGeoJson(), freshness: now + })) + + const featureSource = new SimpleFeatureSource(this.layer, tileId) + featureSource.features.setData(asGeojsonFeatures) + this.loadedTiles.set(tileId, featureSource) + this.onTileLoaded(featureSource) + + } + + +} + diff --git a/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts b/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts index a4bdc8ca58..b7e11e8345 100644 --- a/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts @@ -13,9 +13,10 @@ import {Or} from "../../Tags/Or"; import {TagsFilter} from "../../Tags/TagsFilter"; export default class OsmFeatureSource { - private readonly _backend: string; - public readonly isRunning: UIEventSource = new UIEventSource(false) + public readonly downloadedTiles = new Set() + public rawDataHandlers: ((osmJson: any, tileId: number) => void)[] = [] + private readonly _backend: string; private readonly filteredLayers: UIEventSource; private readonly handleTile: (fs: (FeatureSourceForLayer & Tiled)) => void; private isActive: UIEventSource; @@ -28,7 +29,6 @@ export default class OsmFeatureSource { }, markTileVisited?: (tileId: number) => void }; - public readonly downloadedTiles = new Set() private readonly allowedTags: TagsFilter; constructor(options: { @@ -52,13 +52,13 @@ export default class OsmFeatureSource { if (options.isActive?.data === false) { return; } - + neededTiles = neededTiles.filter(tile => !self.downloadedTiles.has(tile)) - if(neededTiles.length == 0){ + if (neededTiles.length == 0) { return; } - + self.isRunning.setData(true) try { @@ -66,12 +66,12 @@ export default class OsmFeatureSource { console.log("Tile download", Tiles.tile_from_index(neededTile).join("/"), "started") self.downloadedTiles.add(neededTile) self.LoadTile(...Tiles.tile_from_index(neededTile)).then(_ => { - console.log("Tile ", Tiles.tile_from_index(neededTile).join("/"), "loaded") + console.debug("Tile ", Tiles.tile_from_index(neededTile).join("/"), "loaded") }) } } catch (e) { console.error(e) - }finally { + } finally { console.log("Done") self.isRunning.setData(false) } @@ -94,11 +94,11 @@ export default class OsmFeatureSource { try { console.log("Attempting to get tile", z, x, y, "from the osm api") - const osmXml = await Utils.download(url, {"accept": "application/xml"}) + const osmJson = await Utils.downloadJson(url) try { - const parsed = new DOMParser().parseFromString(osmXml, "text/xml"); - console.log("Got tile", z, x, y, "from the osm api") - const geojson = OsmToGeoJson.default(parsed, + console.debug("Got tile", z, x, y, "from the osm api") + this.rawDataHandlers.forEach(handler => handler(osmJson, Tiles.tile_index(z, x, y))) + const geojson = OsmToGeoJson.default(osmJson, // @ts-ignore { flatProperties: true @@ -108,10 +108,8 @@ export default class OsmFeatureSource { // We only keep what is needed geojson.features = geojson.features.filter(feature => this.allowedTags.matchesProperties(feature.properties)) - geojson.features.forEach(f => f.properties["_backend"] = this._backend) - - console.log("Tile geojson:", z, x, y, "is", geojson) + const index = Tiles.tile_index(z, x, y); new PerLayerFeatureSourceSplitter(this.filteredLayers, this.handleTile, diff --git a/Logic/FeatureSource/TiledFeatureSource/README.md b/Logic/FeatureSource/TiledFeatureSource/README.md index 93b51c6ad6..914c1caf7d 100644 --- a/Logic/FeatureSource/TiledFeatureSource/README.md +++ b/Logic/FeatureSource/TiledFeatureSource/README.md @@ -11,17 +11,14 @@ Currently, they are: When the data enters from Overpass or from the OSM-API, they are first distributed per layer: OVERPASS | ---PerLayerFeatureSource---> FeatureSourceForLayer[] -OSM | +OSM | The GeoJSon files (not tiled) are then added to this list A single FeatureSourcePerLayer is then further handled by splitting it into a tile hierarchy. - - In order to keep thins snappy, they are distributed over a tiled database per layer. - ## Notes `cached-featuresbookcases` is the old key used `cahced-features{themeid}` and should be cleaned up \ No newline at end of file diff --git a/Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts b/Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts index 6fd3dae65c..716aefde00 100644 --- a/Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts +++ b/Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts @@ -8,9 +8,8 @@ import {BBox} from "../../BBox"; export class TileHierarchyMerger implements TileHierarchy { public readonly loadedTiles: Map = new Map(); - private readonly sources: Map> = new Map>(); - public readonly layer: FilteredLayer; + private readonly sources: Map> = new Map>(); private _handleTile: (src: FeatureSourceForLayer & IndexedFeatureSource, index: number) => void; constructor(layer: FilteredLayer, handleTile: (src: FeatureSourceForLayer & IndexedFeatureSource & Tiled, index: number) => void) { @@ -24,7 +23,7 @@ export class TileHierarchyMerger implements TileHierarchy> public readonly bbox: BBox; + public readonly tileIndex: number; private upper_left: TiledFeatureSource private upper_right: TiledFeatureSource private lower_left: TiledFeatureSource private lower_right: TiledFeatureSource private readonly maxzoom: number; private readonly options: TiledFeatureSourceOptions - public readonly tileIndex: number; private constructor(z: number, x: number, y: number, parent: TiledFeatureSource, options?: TiledFeatureSourceOptions) { this.z = z; @@ -92,25 +91,25 @@ export default class TiledFeatureSource implements Tiled, IndexedFeatureSource, return root; } - private isSplitNeeded(featureCount: number){ - if(this.upper_left !== undefined){ + private isSplitNeeded(featureCount: number) { + if (this.upper_left !== undefined) { // This tile has been split previously, so we keep on splitting return true; } - if(this.z >= this.maxzoom){ + if (this.z >= this.maxzoom) { // We are not allowed to split any further return false } - if(this.options.minZoomLevel !== undefined && this.z < this.options.minZoomLevel){ + if (this.options.minZoomLevel !== undefined && this.z < this.options.minZoomLevel) { // We must have at least this zoom level before we are allowed to start splitting return true } - + // To much features - we split return featureCount > this.maxFeatureCount - + } - + /*** * Adds the list of features to this hierarchy. * If there are too much features, the list will be broken down and distributed over the subtiles (only retaining features that don't fit a subtile on this level) @@ -121,7 +120,7 @@ export default class TiledFeatureSource implements Tiled, IndexedFeatureSource, if (features === undefined || features.length === 0) { return; } - + if (!this.isSplitNeeded(features.length)) { this.features.setData(features) return; @@ -155,7 +154,7 @@ export default class TiledFeatureSource implements Tiled, IndexedFeatureSource, } else { overlapsboundary.push(feature) } - }else if (this.options.minZoomLevel === undefined) { + } else if (this.options.minZoomLevel === undefined) { if (bbox.isContainedIn(this.upper_left.bbox)) { ulf.push(feature) } else if (bbox.isContainedIn(this.upper_right.bbox)) { diff --git a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts index 900393c1e4..c473491b26 100644 --- a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts @@ -13,44 +13,6 @@ export default class TiledFromLocalStorageSource implements TileHierarchy void; private readonly undefinedTiles: Set; - public static GetFreshnesses(layerId: string): Map { - const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layerId + "-" - const freshnesses = new Map() - for (const key of Object.keys(localStorage)) { - if (!(key.startsWith(prefix) && key.endsWith("-time"))) { - continue - } - const index = Number(key.substring(prefix.length, key.length - "-time".length)) - const time = Number(localStorage.getItem(key)) - const freshness = new Date() - freshness.setTime(time) - freshnesses.set(index, freshness) - } - return freshnesses - } - - - static cleanCacheForLayer(layer: LayerConfig) { - const now = new Date() - const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layer.id + "-" - console.log("Cleaning tiles of ", prefix, "with max age",layer.maxAgeOfCache) - for (const key of Object.keys(localStorage)) { - if (!(key.startsWith(prefix) && key.endsWith("-time"))) { - continue - } - const index = Number(key.substring(prefix.length, key.length - "-time".length)) - const time = Number(localStorage.getItem(key)) - const timeDiff = (now.getTime() - time) / 1000 - - if(timeDiff >= layer.maxAgeOfCache){ - const k = prefix+index; - localStorage.removeItem(k) - localStorage.removeItem(k+"-format") - localStorage.removeItem(k+"-time") - } - } - } - constructor(layer: FilteredLayer, handleFeatureSource: (src: FeatureSourceForLayer & Tiled, index: number) => void, state: { @@ -110,6 +72,43 @@ export default class TiledFromLocalStorageSource implements TileHierarchy { + const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layerId + "-" + const freshnesses = new Map() + for (const key of Object.keys(localStorage)) { + if (!(key.startsWith(prefix) && key.endsWith("-time"))) { + continue + } + const index = Number(key.substring(prefix.length, key.length - "-time".length)) + const time = Number(localStorage.getItem(key)) + const freshness = new Date() + freshness.setTime(time) + freshnesses.set(index, freshness) + } + return freshnesses + } + + static cleanCacheForLayer(layer: LayerConfig) { + const now = new Date() + const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layer.id + "-" + console.log("Cleaning tiles of ", prefix, "with max age", layer.maxAgeOfCache) + for (const key of Object.keys(localStorage)) { + if (!(key.startsWith(prefix) && key.endsWith("-time"))) { + continue + } + const index = Number(key.substring(prefix.length, key.length - "-time".length)) + const time = Number(localStorage.getItem(key)) + const timeDiff = (now.getTime() - time) / 1000 + + if (timeDiff >= layer.maxAgeOfCache) { + const k = prefix + index; + localStorage.removeItem(k) + localStorage.removeItem(k + "-format") + localStorage.removeItem(k + "-time") + } + } + } + private loadTile(neededIndex: number) { try { const key = SaveTileToLocalStorageActor.storageKey + "-" + this.layer.layerDef.id + "-" + neededIndex diff --git a/Logic/GeoOperations.ts b/Logic/GeoOperations.ts index 09a2881178..3f1c67d943 100644 --- a/Logic/GeoOperations.ts +++ b/Logic/GeoOperations.ts @@ -1,8 +1,14 @@ import * as turf from '@turf/turf' import {BBox} from "./BBox"; +import togpx from "togpx" +import Constants from "../Models/Constants"; +import LayerConfig from "../Models/ThemeConfig/LayerConfig"; export class GeoOperations { + private static readonly _earthRadius = 6378137; + private static readonly _originShift = 2 * Math.PI * GeoOperations._earthRadius / 2; + static surfaceAreaInSqMeters(feature: any) { return turf.area(feature); } @@ -37,8 +43,10 @@ export class GeoOperations { * The features with which 'feature' overlaps, are returned together with their overlap area in m² * * If 'feature' is a LineString, the features in which this feature is (partly) embedded is returned, the overlap length in meter is given + * If 'feature' is a Polygon, overlapping points and points within the polygon will be returned * * If 'feature' is a point, it will return every feature the point is embedded in. Overlap will be undefined + * */ static calculateOverlap(feature: any, otherFeatures: any[]): { feat: any, overlap: number }[] { @@ -235,6 +243,13 @@ export class GeoOperations { * @param point Point defined as [lon, lat] */ public static nearestPoint(way, point: [number, number]) { + if (way.geometry.type === "Polygon") { + way = {...way} + way.geometry = {...way.geometry} + way.geometry.type = "LineString" + way.geometry.coordinates = way.geometry.coordinates[0] + } + return turf.nearestPointOnLine(way, point, {units: "kilometers"}); } @@ -283,10 +298,6 @@ export class GeoOperations { return headerValuesOrdered.map(v => JSON.stringify(v)).join(",") + "\n" + lines.join("\n") } - - private static readonly _earthRadius = 6378137; - private static readonly _originShift = 2 * Math.PI * GeoOperations._earthRadius / 2; - //Converts given lat/lon in WGS84 Datum to XY in Spherical Mercator EPSG:900913 public static ConvertWgs84To900913(lonLat: [number, number]): [number, number] { const lon = lonLat[0]; @@ -297,7 +308,7 @@ export class GeoOperations { return [x, y]; } -//Converts XY point from (Spherical) Web Mercator EPSG:3785 (unofficially EPSG:900913) to lat/lon in WGS84 Datum + //Converts XY point from (Spherical) Web Mercator EPSG:3785 (unofficially EPSG:900913) to lat/lon in WGS84 Datum public static Convert900913ToWgs84(lonLat: [number, number]): [number, number] { const lon = lonLat[0] const lat = lonLat[1] @@ -306,11 +317,36 @@ export class GeoOperations { y = 180 / Math.PI * (2 * Math.atan(Math.exp(y * Math.PI / 180)) - Math.PI / 2); return [x, y]; } - - public static GeoJsonToWGS84(geojson){ + + public static GeoJsonToWGS84(geojson) { return turf.toWgs84(geojson) } + /** + * Tries to remove points which do not contribute much to the general outline. + * Points for which the angle is ~ 180° are removed + * @param coordinates + * @constructor + */ + public static SimplifyCoordinates(coordinates: [number, number][]) { + const newCoordinates = [] + for (let i = 1; i < coordinates.length - 1; i++) { + const coordinate = coordinates[i]; + const prev = coordinates[i - 1] + const next = coordinates[i + 1] + const b0 = turf.bearing(prev, coordinate, {final: true}) + const b1 = turf.bearing(coordinate, next) + + const diff = Math.abs(b1 - b0) + if (diff < 2) { + continue + } + newCoordinates.push(coordinate) + } + return newCoordinates + + } + /** * Calculates the intersection between two features. * Returns the length if intersecting a linestring and a (multi)polygon (in meters), returns a surface area (in m²) if intersecting two (multi)polygons @@ -403,6 +439,176 @@ export class GeoOperations { return undefined; } + public static AsGpx(feature, generatedWithLayer?: LayerConfig){ + + const metadata = {} + const tags = feature.properties + + if(generatedWithLayer !== undefined){ + + metadata["name"] = generatedWithLayer.title?.GetRenderValue(tags)?.Subs(tags)?.txt + metadata["desc"] = "Generated with MapComplete layer "+generatedWithLayer.id + if(tags._backend?.contains("openstreetmap")){ + metadata["copyright"]= "Data copyrighted by OpenStreetMap-contributors, freely available under ODbL. See https://www.openstreetmap.org/copyright" + metadata["author"] = tags["_last_edit:contributor"] + metadata["link"]= "https://www.openstreetmap.org/"+tags.id + metadata["time"] = tags["_last_edit:timestamp"] + }else{ + metadata["time"] = new Date().toISOString() + } + } + + return togpx(feature, { + creator: "MapComplete "+Constants.vNumber, + metadata + }) + } + + public static IdentifieCommonSegments(coordinatess: [number,number][][] ): { + originalIndex: number, + segmentShardWith: number[], + coordinates: [] + }[]{ + + // An edge. Note that the edge might be reversed to fix the sorting condition: start[0] < end[0] && (start[0] != end[0] || start[0] < end[1]) + type edge = {start: [number, number], end: [number, number], intermediate: [number,number][], members: {index:number, isReversed: boolean}[]} + + // The strategy: + // 1. Index _all_ edges from _every_ linestring. Index them by starting key, gather which relations run over them + // 2. Join these edges back together - as long as their membership groups are the same + // 3. Convert to results + + const allEdgesByKey = new Map() + + for (let index = 0; index < coordinatess.length; index++){ + const coordinates = coordinatess[index]; + for (let i = 0; i < coordinates.length - 1; i++){ + + const c0 = coordinates[i]; + const c1 = coordinates[i + 1] + const isReversed = (c0[0] > c1[0]) || (c0[0] == c1[0] && c0[1] > c1[1]) + + let key : string + if(isReversed){ + key = ""+c1+";"+c0 + }else{ + key = ""+c0+";"+c1 + } + const member = {index, isReversed} + if(allEdgesByKey.has(key)){ + allEdgesByKey.get(key).members.push(member) + continue + } + + let edge : edge; + if(!isReversed){ + edge = { + start : c0, + end: c1, + members: [member], + intermediate: [] + } + }else{ + edge = { + start : c1, + end: c0, + members: [member], + intermediate: [] + } + } + allEdgesByKey.set(key, edge) + + } + } + + // Lets merge them back together! + + let didMergeSomething = false; + let allMergedEdges = Array.from(allEdgesByKey.values()) + const allEdgesByStartPoint = new Map() + for (const edge of allMergedEdges) { + + edge.members.sort((m0, m1) => m0.index - m1.index) + + const kstart = edge.start+"" + if(!allEdgesByStartPoint.has(kstart)){ + allEdgesByStartPoint.set(kstart, []) + } + allEdgesByStartPoint.get(kstart).push(edge) + } + + + function membersAreCompatible(first:edge, second:edge): boolean{ + // There must be an exact match between the members + if(first.members === second.members){ + return true + } + + if(first.members.length !== second.members.length){ + return false + } + + // Members are sorted and have the same length, so we can check quickly + for (let i = 0; i < first.members.length; i++) { + const m0 = first.members[i] + const m1 = second.members[i] + if(m0.index !== m1.index || m0.isReversed !== m1.isReversed){ + return false + } + } + + // Allrigth, they are the same, lets mark this permanently + second.members = first.members + return true + + } + + do{ + didMergeSomething = false + // We use 'allMergedEdges' as our running list + const consumed = new Set() + for (const edge of allMergedEdges) { + // Can we make this edge longer at the end? + if(consumed.has(edge)){ + continue + } + + console.log("Considering edge", edge) + const matchingEndEdges = allEdgesByStartPoint.get(edge.end+"") + console.log("Matchign endpoints:", matchingEndEdges) + if(matchingEndEdges === undefined){ + continue + } + + + for (let i = 0; i < matchingEndEdges.length; i++){ + const endEdge = matchingEndEdges[i]; + + if(consumed.has(endEdge)){ + continue + } + + if(!membersAreCompatible(edge, endEdge)){ + continue + } + + // We can make the segment longer! + didMergeSomething = true + console.log("Merging ", edge, "with ", endEdge) + edge.intermediate.push(edge.end) + edge.end = endEdge.end + consumed.add(endEdge) + matchingEndEdges.splice(i, 1) + break; + } + } + + allMergedEdges = allMergedEdges.filter(edge => !consumed.has(edge)); + + }while(didMergeSomething) + + return [] + } } diff --git a/Logic/ImageProviders/AllImageProviders.ts b/Logic/ImageProviders/AllImageProviders.ts index 5d428f2628..3abdc49d09 100644 --- a/Logic/ImageProviders/AllImageProviders.ts +++ b/Logic/ImageProviders/AllImageProviders.ts @@ -19,9 +19,9 @@ export default class AllImageProviders { new GenericImageProvider( [].concat(...Imgur.defaultValuePrefix, ...WikimediaImageProvider.commonsPrefixes, ...Mapillary.valuePrefixes) ) - + ] - + public static defaultKeys = [].concat(AllImageProviders.ImageAttributionSource.map(provider => provider.defaultKeyPrefixes)) @@ -32,7 +32,7 @@ export default class AllImageProviders { return undefined; } - const cacheKey = tags.data.id+tagKey + const cacheKey = tags.data.id + tagKey const cached = this._cache.get(cacheKey) if (cached !== undefined) { return cached @@ -43,22 +43,22 @@ export default class AllImageProviders { this._cache.set(cacheKey, source) const allSources = [] for (const imageProvider of AllImageProviders.ImageAttributionSource) { - + let prefixes = imageProvider.defaultKeyPrefixes - if(tagKey !== undefined){ + if (tagKey !== undefined) { prefixes = tagKey } - + const singleSource = imageProvider.GetRelevantUrls(tags, { prefixes: prefixes }) allSources.push(singleSource) singleSource.addCallbackAndRunD(_ => { - const all : ProvidedImage[] = [].concat(...allSources.map(source => source.data)) + const all: ProvidedImage[] = [].concat(...allSources.map(source => source.data)) const uniq = [] const seen = new Set() for (const img of all) { - if(seen.has(img.url)){ + if (seen.has(img.url)) { continue } seen.add(img.url) diff --git a/Logic/ImageProviders/GenericImageProvider.ts b/Logic/ImageProviders/GenericImageProvider.ts index 2f2dab3224..02011687d1 100644 --- a/Logic/ImageProviders/GenericImageProvider.ts +++ b/Logic/ImageProviders/GenericImageProvider.ts @@ -10,24 +10,19 @@ export default class GenericImageProvider extends ImageProvider { this._valuePrefixBlacklist = valuePrefixBlacklist; } - - protected DownloadAttribution(url: string) { - return undefined - } - async ExtractUrls(key: string, value: string): Promise[]> { if (this._valuePrefixBlacklist.some(prefix => value.startsWith(prefix))) { return [] } - - try{ + + try { new URL(value) - }catch (_){ + } catch (_) { // Not a valid URL return [] } - + return [Promise.resolve({ key: key, url: value, @@ -39,5 +34,9 @@ export default class GenericImageProvider extends ImageProvider { return undefined; } + protected DownloadAttribution(url: string) { + return undefined + } + } \ No newline at end of file diff --git a/Logic/ImageProviders/ImageProvider.ts b/Logic/ImageProviders/ImageProvider.ts index 592f9a1f0c..c1d90578e4 100644 --- a/Logic/ImageProviders/ImageProvider.ts +++ b/Logic/ImageProviders/ImageProvider.ts @@ -14,7 +14,7 @@ export default abstract class ImageProvider { public abstract readonly defaultKeyPrefixes: string[] private _cache = new Map>() - + GetAttributionFor(url: string): UIEventSource { const cached = this._cache.get(url); if (cached !== undefined) { @@ -27,8 +27,6 @@ export default abstract class ImageProvider { public abstract SourceIcon(backlinkSource?: string): BaseUIElement; - protected abstract DownloadAttribution(url: string): Promise; - /** * Given a properies object, maps it onto _all_ the available pictures for this imageProvider */ @@ -77,4 +75,6 @@ export default abstract class ImageProvider { public abstract ExtractUrls(key: string, value: string): Promise[]>; + protected abstract DownloadAttribution(url: string): Promise; + } \ No newline at end of file diff --git a/Logic/ImageProviders/Imgur.ts b/Logic/ImageProviders/Imgur.ts index 289dad1f8a..b06b2a6c0e 100644 --- a/Logic/ImageProviders/Imgur.ts +++ b/Logic/ImageProviders/Imgur.ts @@ -7,10 +7,9 @@ import {LicenseInfo} from "./LicenseInfo"; export class Imgur extends ImageProvider { - public static readonly defaultValuePrefix = ["https://i.imgur.com"] - public readonly defaultKeyPrefixes: string[] = ["image"]; - + public static readonly defaultValuePrefix = ["https://i.imgur.com"] public static readonly singleton = new Imgur(); + public readonly defaultKeyPrefixes: string[] = ["image"]; private constructor() { super(); @@ -89,6 +88,17 @@ export class Imgur extends ImageProvider { return undefined; } + public async ExtractUrls(key: string, value: string): Promise[]> { + if (Imgur.defaultValuePrefix.some(prefix => value.startsWith(prefix))) { + return [Promise.resolve({ + url: value, + key: key, + provider: this + })] + } + return [] + } + protected DownloadAttribution: (url: string) => Promise = async (url: string) => { const hash = url.substr("https://i.imgur.com/".length).split(".jpg")[0]; @@ -112,16 +122,5 @@ export class Imgur extends ImageProvider { return licenseInfo } - public async ExtractUrls(key: string, value: string): Promise[]> { - if (Imgur.defaultValuePrefix.some(prefix => value.startsWith(prefix))) { - return [Promise.resolve({ - url: value, - key: key, - provider: this - })] - } - return [] - } - } \ No newline at end of file diff --git a/Logic/ImageProviders/ImgurUploader.ts b/Logic/ImageProviders/ImgurUploader.ts index 10bf436098..65cb8c9f0e 100644 --- a/Logic/ImageProviders/ImgurUploader.ts +++ b/Logic/ImageProviders/ImgurUploader.ts @@ -6,9 +6,8 @@ export default class ImgurUploader { public readonly queue: UIEventSource = new UIEventSource([]); public readonly failed: UIEventSource = new UIEventSource([]); public readonly success: UIEventSource = new UIEventSource([]); - private readonly _handleSuccessUrl: (string) => void; - public maxFileSizeInMegabytes = 10; + private readonly _handleSuccessUrl: (string) => void; constructor(handleSuccessUrl: (string) => void) { this._handleSuccessUrl = handleSuccessUrl; diff --git a/Logic/ImageProviders/Mapillary.ts b/Logic/ImageProviders/Mapillary.ts index 07e0473d4a..1486c73a21 100644 --- a/Logic/ImageProviders/Mapillary.ts +++ b/Logic/ImageProviders/Mapillary.ts @@ -7,48 +7,31 @@ import Constants from "../../Models/Constants"; export class Mapillary extends ImageProvider { - defaultKeyPrefixes = ["mapillary","image"] - public static readonly singleton = new Mapillary(); private static readonly valuePrefix = "https://a.mapillary.com" - public static readonly valuePrefixes = [Mapillary.valuePrefix, "http://mapillary.com","https://mapillary.com","http://www.mapillary.com","https://www.mapillary.com"] + public static readonly valuePrefixes = [Mapillary.valuePrefix, "http://mapillary.com", "https://mapillary.com", "http://www.mapillary.com", "https://www.mapillary.com"] + defaultKeyPrefixes = ["mapillary", "image"] + + /** + * Returns the correct key for API v4.0 + */ + private static ExtractKeyFromURL(value: string): number { + + let key: string; - private static ExtractKeyFromURL(value: string, failIfNoMath = false): { - key: string, - isApiv4?: boolean - } { - - if (value.startsWith(Mapillary.valuePrefix)) { - const key = value.substring(0, value.lastIndexOf("?")).substring(value.lastIndexOf("/") + 1) - return {key: key, isApiv4: !isNaN(Number(key))}; - } const newApiFormat = value.match(/https?:\/\/www.mapillary.com\/app\/\?pKey=([0-9]*)/) if (newApiFormat !== null) { - return {key: newApiFormat[1], isApiv4: true} + key = newApiFormat[1] + } else if (value.startsWith(Mapillary.valuePrefix)) { + key = value.substring(0, value.lastIndexOf("?")).substring(value.lastIndexOf("/") + 1) } - const mapview = value.match(/https?:\/\/www.mapillary.com\/map\/im\/(.*)/) - if (mapview !== null) { - const key = mapview[1] - return {key: key, isApiv4: !isNaN(Number(key))}; + const keyAsNumber = Number(key) + if (!isNaN(keyAsNumber)) { + return keyAsNumber } - - if (value.toLowerCase().startsWith("https://www.mapillary.com/map/im/")) { - // Extract the key of the image - value = value.substring("https://www.mapillary.com/map/im/".length); - } - - const matchApi = value.match(/https?:\/\/images.mapillary.com\/([^/]*)(&.*)?/) - if (matchApi !== null) { - return {key: matchApi[1]}; - } - - if(failIfNoMath){ - return undefined; - } - - return {key: value, isApiv4: !isNaN(Number(value))}; + return undefined } SourceIcon(backlinkSource?: string): BaseUIElement { @@ -59,55 +42,28 @@ export class Mapillary extends ImageProvider { return [this.PrepareUrlAsync(key, value)] } - private async PrepareUrlAsync(key: string, value: string): Promise { - const failIfNoMatch = key.indexOf("mapillary") < 0 - const keyV = Mapillary.ExtractKeyFromURL(value, failIfNoMatch) - if(keyV === undefined){ - return undefined; - } - - if (!keyV.isApiv4) { - const url = `https://images.mapillary.com/${keyV.key}/thumb-640.jpg?client_id=${Constants.mapillary_client_token_v3}` - return { - url: url, - provider: this, - key: key - } - } else { - const mapillaryId = keyV.key; - const metadataUrl = 'https://graph.mapillary.com/' + mapillaryId + '?fields=thumb_1024_url&&access_token=' + Constants.mapillary_client_token_v4; - const response = await Utils.downloadJson(metadataUrl) - const url = response["thumb_1024_url"]; - return { - url: url, - provider: this, - key: key - } - } - } - protected async DownloadAttribution(url: string): Promise { - - const keyV = Mapillary.ExtractKeyFromURL(url) - if (keyV.isApiv4) { - const license = new LicenseInfo() - license.artist = "Contributor name unavailable"; - license.license = "CC BY-SA 4.0"; - // license.license = "Creative Commons Attribution-ShareAlike 4.0 International License"; - license.attributionRequired = true; - return license - - } - const key = keyV.key - - const metadataURL = `https://a.mapillary.com/v3/images/${key}?client_id=TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2` - const data = await Utils.downloadJson(metadataURL) - const license = new LicenseInfo(); - license.artist = data.properties?.username; - license.licenseShortName = "CC BY-SA 4.0"; - license.license = "Creative Commons Attribution-ShareAlike 4.0 International License"; + const license = new LicenseInfo() + license.artist = "Contributor name unavailable"; + license.license = "CC BY-SA 4.0"; + // license.license = "Creative Commons Attribution-ShareAlike 4.0 International License"; license.attributionRequired = true; - return license } + + private async PrepareUrlAsync(key: string, value: string): Promise { + const mapillaryId = Mapillary.ExtractKeyFromURL(value) + if (mapillaryId === undefined) { + return undefined; + } + + const metadataUrl = 'https://graph.mapillary.com/' + mapillaryId + '?fields=thumb_1024_url&&access_token=' + Constants.mapillary_client_token_v4; + const response = await Utils.downloadJson(metadataUrl) + const url = response["thumb_1024_url"]; + return { + url: url, + provider: this, + key: key + } + } } \ No newline at end of file diff --git a/Logic/ImageProviders/WikidataImageProvider.ts b/Logic/ImageProviders/WikidataImageProvider.ts index 1392015781..c3d72d064d 100644 --- a/Logic/ImageProviders/WikidataImageProvider.ts +++ b/Logic/ImageProviders/WikidataImageProvider.ts @@ -1,4 +1,3 @@ -import {Utils} from "../../Utils"; import ImageProvider, {ProvidedImage} from "./ImageProvider"; import BaseUIElement from "../../UI/BaseUIElement"; import Svg from "../../Svg"; @@ -7,10 +6,6 @@ import Wikidata from "../Web/Wikidata"; export class WikidataImageProvider extends ImageProvider { - public SourceIcon(backlinkSource?: string): BaseUIElement { - throw Svg.wikidata_svg(); - } - public static readonly singleton = new WikidataImageProvider() public readonly defaultKeyPrefixes = ["wikidata"] @@ -18,17 +13,17 @@ export class WikidataImageProvider extends ImageProvider { super() } - protected DownloadAttribution(url: string): Promise { - throw new Error("Method not implemented; shouldn't be needed!"); + public SourceIcon(backlinkSource?: string): BaseUIElement { + throw Svg.wikidata_svg(); } public async ExtractUrls(key: string, value: string): Promise[]> { const entity = await Wikidata.LoadWikidataEntryAsync(value) - if(entity === undefined){ + if (entity === undefined) { return [] } - - const allImages : Promise[] = [] + + const allImages: Promise[] = [] // P18 is the claim 'depicted in this image' for (const img of Array.from(entity.claims.get("P18") ?? [])) { const promises = await WikimediaImageProvider.singleton.ExtractUrls(undefined, img) @@ -36,19 +31,23 @@ export class WikidataImageProvider extends ImageProvider { } // P373 is 'commons category' for (let cat of Array.from(entity.claims.get("P373") ?? [])) { - if(!cat.startsWith("Category:")){ - cat = "Category:"+cat + if (!cat.startsWith("Category:")) { + cat = "Category:" + cat } const promises = await WikimediaImageProvider.singleton.ExtractUrls(undefined, cat) allImages.push(...promises) } - + const commons = entity.commons if (commons !== undefined && (commons.startsWith("Category:") || commons.startsWith("File:"))) { - const promises = await WikimediaImageProvider.singleton.ExtractUrls(undefined , commons) + const promises = await WikimediaImageProvider.singleton.ExtractUrls(undefined, commons) allImages.push(...promises) } return allImages } + protected DownloadAttribution(url: string): Promise { + throw new Error("Method not implemented; shouldn't be needed!"); + } + } \ No newline at end of file diff --git a/Logic/ImageProviders/WikimediaImageProvider.ts b/Logic/ImageProviders/WikimediaImageProvider.ts index ea122f4919..ec9920640b 100644 --- a/Logic/ImageProviders/WikimediaImageProvider.ts +++ b/Logic/ImageProviders/WikimediaImageProvider.ts @@ -12,10 +12,10 @@ import Wikimedia from "../Web/Wikimedia"; export class WikimediaImageProvider extends ImageProvider { - private readonly commons_key = "wikimedia_commons" - public readonly defaultKeyPrefixes = [this.commons_key,"image"] public static readonly singleton = new WikimediaImageProvider(); public static readonly commonsPrefixes = ["https://commons.wikimedia.org/wiki/", "https://upload.wikimedia.org", "File:"] + private readonly commons_key = "wikimedia_commons" + public readonly defaultKeyPrefixes = [this.commons_key, "image"] private constructor() { super(); @@ -30,6 +30,40 @@ export class WikimediaImageProvider extends ImageProvider { } + private static PrepareUrl(value: string): string { + + if (value.toLowerCase().startsWith("https://commons.wikimedia.org/wiki/")) { + return value; + } + return (`https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(value)}?width=500&height=400`) + } + + private static startsWithCommonsPrefix(value: string): boolean { + return WikimediaImageProvider.commonsPrefixes.some(prefix => value.startsWith(prefix)) + } + + private static removeCommonsPrefix(value: string): string { + if (value.startsWith("https://upload.wikimedia.org/")) { + value = value.substring(value.lastIndexOf("/") + 1) + value = decodeURIComponent(value) + if (!value.startsWith("File:")) { + value = "File:" + value + } + return value; + } + + for (const prefix of WikimediaImageProvider.commonsPrefixes) { + if (value.startsWith(prefix)) { + let part = value.substr(prefix.length) + if (prefix.startsWith("http")) { + part = decodeURIComponent(part) + } + return part + } + } + return value; + } + SourceIcon(backlink: string): BaseUIElement { const img = Svg.wikimedia_commons_white_svg() .SetStyle("width:2em;height: 2em"); @@ -44,12 +78,38 @@ export class WikimediaImageProvider extends ImageProvider { } - private static PrepareUrl(value: string): string { + public PrepUrl(value: string): ProvidedImage { + const hasCommonsPrefix = WikimediaImageProvider.startsWithCommonsPrefix(value) + value = WikimediaImageProvider.removeCommonsPrefix(value) - if (value.toLowerCase().startsWith("https://commons.wikimedia.org/wiki/")) { - return value; + if (value.startsWith("File:")) { + return this.UrlForImage(value) } - return (`https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(value)}?width=500&height=400`) + + // We do a last effort and assume this is a file + return this.UrlForImage("File:" + value) + } + + public async ExtractUrls(key: string, value: string): Promise[]> { + const hasCommonsPrefix = WikimediaImageProvider.startsWithCommonsPrefix(value) + if (key !== undefined && key !== this.commons_key && !hasCommonsPrefix) { + return [] + } + + value = WikimediaImageProvider.removeCommonsPrefix(value) + if (value.startsWith("Category:")) { + const urls = await Wikimedia.GetCategoryContents(value) + return urls.filter(url => url.startsWith("File:")).map(image => Promise.resolve(this.UrlForImage(image))) + } + if (value.startsWith("File:")) { + return [Promise.resolve(this.UrlForImage(value))] + } + if (value.startsWith("http")) { + // PRobably an error + return [] + } + // We do a last effort and assume this is a file + return [Promise.resolve(this.UrlForImage("File:" + value))] } protected async DownloadAttribution(filename: string): Promise { @@ -66,24 +126,24 @@ export class WikimediaImageProvider extends ImageProvider { const data = await Utils.downloadJson(url) const licenseInfo = new LicenseInfo(); const pageInfo = data.query.pages[-1] - if(pageInfo === undefined){ + if (pageInfo === undefined) { return undefined; } - + const license = (pageInfo.imageinfo ?? [])[0]?.extmetadata; if (license === undefined) { - console.warn("The file", filename ,"has no usable metedata or license attached... Please fix the license info file yourself!") + console.warn("The file", filename, "has no usable metedata or license attached... Please fix the license info file yourself!") return undefined; } let title = pageInfo.title - if(title.startsWith("File:")){ - title= title.substr("File:".length) + if (title.startsWith("File:")) { + title = title.substr("File:".length) } - if(title.endsWith(".jpg") || title.endsWith(".png")){ + if (title.endsWith(".jpg") || title.endsWith(".png")) { title = title.substring(0, title.length - 4) } - + licenseInfo.title = title licenseInfo.artist = license.Artist?.value; licenseInfo.license = license.License?.value; @@ -103,66 +163,6 @@ export class WikimediaImageProvider extends ImageProvider { } return {url: WikimediaImageProvider.PrepareUrl(image), key: undefined, provider: this} } - - private static startsWithCommonsPrefix(value: string): boolean{ - return WikimediaImageProvider.commonsPrefixes.some(prefix => value.startsWith(prefix)) - } - - private static removeCommonsPrefix(value: string): string{ - if(value.startsWith("https://upload.wikimedia.org/")){ - value = value.substring(value.lastIndexOf("/") + 1) - value = decodeURIComponent(value) - if(!value.startsWith("File:")){ - value = "File:"+value - } - return value; - } - - for (const prefix of WikimediaImageProvider.commonsPrefixes) { - if(value.startsWith(prefix)){ - let part = value.substr(prefix.length) - if(prefix.startsWith("http")){ - part = decodeURIComponent(part) - } - return part - } - } - return value; - } - - public PrepUrl(value: string): ProvidedImage { - const hasCommonsPrefix = WikimediaImageProvider.startsWithCommonsPrefix(value) - value = WikimediaImageProvider.removeCommonsPrefix(value) - - if (value.startsWith("File:")) { - return this.UrlForImage(value) - } - - // We do a last effort and assume this is a file - return this.UrlForImage("File:" + value) - } - - public async ExtractUrls(key: string, value: string): Promise[]> { - const hasCommonsPrefix = WikimediaImageProvider.startsWithCommonsPrefix(value) - if(key !== undefined && key !== this.commons_key && !hasCommonsPrefix){ - return [] - } - - value = WikimediaImageProvider.removeCommonsPrefix(value) - if (value.startsWith("Category:")) { - const urls = await Wikimedia.GetCategoryContents(value) - return urls.filter(url => url.startsWith("File:")).map(image => Promise.resolve(this.UrlForImage(image))) - } - if (value.startsWith("File:")) { - return [Promise.resolve(this.UrlForImage(value))] - } - if (value.startsWith("http")) { - // PRobably an error - return [] - } - // We do a last effort and assume this is a file - return [Promise.resolve(this.UrlForImage("File:" + value))] - } } diff --git a/Logic/MetaTagging.ts b/Logic/MetaTagging.ts index 83b85f34a2..0ac9ba4e1e 100644 --- a/Logic/MetaTagging.ts +++ b/Logic/MetaTagging.ts @@ -18,6 +18,8 @@ export default class MetaTagging { /** * This method (re)calculates all metatags and calculated tags on every given object. * The given features should be part of the given layer + * + * Returns true if at least one feature has changed properties */ public static addMetatags(features: { feature: any; freshness: Date }[], params: ExtraFuncParams, @@ -25,7 +27,7 @@ export default class MetaTagging { options?: { includeDates?: true | boolean, includeNonDates?: true | boolean - }) { + }): boolean { if (features === undefined || features.length === 0) { return; @@ -48,6 +50,7 @@ export default class MetaTagging { // The calculated functions - per layer - which add the new keys const layerFuncs = this.createRetaggingFunc(layer) + let atLeastOneFeatureChanged = false; for (let i = 0; i < features.length; i++) { const ff = features[i]; @@ -60,15 +63,15 @@ export default class MetaTagging { // All keys are already defined, we probably already ran this one continue } - - if(metatag.isLazy){ + + if (metatag.isLazy) { somethingChanged = true; - + metatag.applyMetaTagsOnFeature(feature, freshness, layer) - - }else{ - - + + } else { + + const newValueAdded = metatag.applyMetaTagsOnFeature(feature, freshness, layer) /* Note that the expression: * `somethingChanged = newValueAdded || metatag.applyMetaTagsOnFeature(feature, freshness)` @@ -95,8 +98,10 @@ export default class MetaTagging { if (somethingChanged) { State.state?.allElements?.getEventSourceById(feature.properties.id)?.ping() + atLeastOneFeatureChanged = true } } + return atLeastOneFeatureChanged } @@ -141,12 +146,13 @@ export default class MetaTagging { } } } - - }} ) + + } + }) } - - + + functions.push(f) } return functions; diff --git a/Logic/Osm/Actions/ChangeDescription.ts b/Logic/Osm/Actions/ChangeDescription.ts index 44804bc327..0f03caf0b6 100644 --- a/Logic/Osm/Actions/ChangeDescription.ts +++ b/Logic/Osm/Actions/ChangeDescription.ts @@ -16,13 +16,17 @@ export interface ChangeDescription { /** * The type of the change */ - changeType: "answer" | "create" | "split" | "delete" | "move" | string + changeType: "answer" | "create" | "split" | "delete" | "move" | "import" | string | null /** * THe motivation for the change, e.g. 'deleted because does not exist anymore' */ - specialMotivation?: string + specialMotivation?: string, + /** + * Added by Changes.ts + */ + distanceToObject?: number }, - + /** * Identifier of the object */ @@ -32,11 +36,11 @@ export interface ChangeDescription { * Negative for new objects */ id: number, - + /** * All changes to tags * v = "" or v = undefined to erase this tag - * + * * Note that this list will only contain the _changes_ to the tags, not the full set of tags */ tags?: { k: string, v: string }[], @@ -51,7 +55,8 @@ export interface ChangeDescription { lat: number, lon: number } | { - // Coordinates are only used for rendering. They should be LAT, LON + /* Coordinates are only used for rendering. They should be LON, LAT + * */ coordinates: [number, number][] nodes: number[], } | { @@ -64,9 +69,9 @@ export interface ChangeDescription { doDelete?: boolean } -export class ChangeDescriptionTools{ - - public static getGeojsonGeometry(change: ChangeDescription): any{ +export class ChangeDescriptionTools { + + public static getGeojsonGeometry(change: ChangeDescription): any { switch (change.type) { case "node": const n = new OsmNode(change.id) diff --git a/Logic/Osm/Actions/ChangeLocationAction.ts b/Logic/Osm/Actions/ChangeLocationAction.ts index 9bb53b4274..54141d5489 100644 --- a/Logic/Osm/Actions/ChangeLocationAction.ts +++ b/Logic/Osm/Actions/ChangeLocationAction.ts @@ -11,7 +11,7 @@ export default class ChangeLocationAction extends OsmChangeAction { theme: string, reason: string }) { - super(); + super(id,true); if (!id.startsWith("node/")) { throw "Invalid ID: only 'node/number' is accepted" } @@ -19,7 +19,7 @@ export default class ChangeLocationAction extends OsmChangeAction { this._newLonLat = newLonLat; this._meta = meta; } - + protected async CreateChangeDescriptions(changes: Changes): Promise { const d: ChangeDescription = { diff --git a/Logic/Osm/Actions/ChangeTagAction.ts b/Logic/Osm/Actions/ChangeTagAction.ts index 00e9b001ed..013b90a461 100644 --- a/Logic/Osm/Actions/ChangeTagAction.ts +++ b/Logic/Osm/Actions/ChangeTagAction.ts @@ -7,19 +7,19 @@ export default class ChangeTagAction extends OsmChangeAction { private readonly _elementId: string; private readonly _tagsFilter: TagsFilter; private readonly _currentTags: any; - private readonly _meta: {theme: string, changeType: string}; + private readonly _meta: { theme: string, changeType: string }; constructor(elementId: string, tagsFilter: TagsFilter, currentTags: any, meta: { theme: string, - changeType: "answer" | "soft-delete" | "add-image" + changeType: "answer" | "soft-delete" | "add-image" | string }) { - super(); + super(elementId, true); this._elementId = elementId; this._tagsFilter = tagsFilter; this._currentTags = currentTags; this._meta = meta; } - + /** * Doublechecks that no stupid values are added */ @@ -27,11 +27,16 @@ export default class ChangeTagAction extends OsmChangeAction { const key = kv.k; const value = kv.v; if (key === undefined || key === null) { - console.log("Invalid key"); + console.error("Invalid key:", key); return undefined; } if (value === undefined || value === null) { - console.log("Invalid value for ", key); + console.error("Invalid value for ", key, ":", value); + return undefined; + } + + if (typeof value !== "string") { + console.error("Invalid value for ", key, "as it is not a string:", value) return undefined; } @@ -48,7 +53,7 @@ export default class ChangeTagAction extends OsmChangeAction { const type = typeId[0] const id = Number(typeId [1]) return [{ - type: <"node"|"way"|"relation"> type, + type: <"node" | "way" | "relation">type, id: id, tags: changedTags, meta: this._meta diff --git a/Logic/Osm/Actions/CreateNewNodeAction.ts b/Logic/Osm/Actions/CreateNewNodeAction.ts index e644eb2c65..79f64c14c1 100644 --- a/Logic/Osm/Actions/CreateNewNodeAction.ts +++ b/Logic/Osm/Actions/CreateNewNodeAction.ts @@ -8,21 +8,30 @@ import {GeoOperations} from "../../GeoOperations"; export default class CreateNewNodeAction extends OsmChangeAction { + /** + * Maps previously created points onto their assigned ID, to reuse the point if uplaoded + * "lat,lon" --> id + */ + private static readonly previouslyCreatedPoints = new Map() public newElementId: string = undefined + public newElementIdNumber: number = undefined private readonly _basicTags: Tag[]; private readonly _lat: number; private readonly _lon: number; private readonly _snapOnto: OsmWay; private readonly _reusePointDistance: number; private meta: { changeType: "create" | "import"; theme: string }; + private readonly _reusePreviouslyCreatedPoint: boolean; constructor(basicTags: Tag[], lat: number, lon: number, options: { - snapOnto?: OsmWay, - reusePointWithinMeters?: number, - theme: string, changeType: "create" | "import" }) { - super() + allowReuseOfPreviouslyCreatedPoints?: boolean, + snapOnto?: OsmWay, + reusePointWithinMeters?: number, + theme: string, changeType: "create" | "import" | null + }) { + super(null,basicTags !== undefined && basicTags.length > 0) this._basicTags = basicTags; this._lat = lat; this._lon = lon; @@ -31,18 +40,47 @@ export default class CreateNewNodeAction extends OsmChangeAction { } this._snapOnto = options?.snapOnto; this._reusePointDistance = options?.reusePointWithinMeters ?? 1 + this._reusePreviouslyCreatedPoint = options?.allowReuseOfPreviouslyCreatedPoints ?? (basicTags.length === 0) this.meta = { theme: options.theme, changeType: options.changeType } } + public static registerIdRewrites(mappings: Map) { + const toAdd: [string, number][] = [] + + this.previouslyCreatedPoints.forEach((oldId, key) => { + if (!mappings.has("node/" + oldId)) { + return; + } + + const newId = Number(mappings.get("node/" + oldId).substr("node/".length)) + toAdd.push([key, newId]) + }) + for (const [key, newId] of toAdd) { + CreateNewNodeAction.previouslyCreatedPoints.set(key, newId) + } + } + async CreateChangeDescriptions(changes: Changes): Promise { + if (this._reusePreviouslyCreatedPoint) { + + const key = this._lat + "," + this._lon + const prev = CreateNewNodeAction.previouslyCreatedPoints + if (prev.has(key)) { + this.newElementIdNumber = prev.get(key) + this.newElementId = "node/" + this.newElementIdNumber + return [] + } + } + + const id = changes.getNewID() const properties = { id: "node/" + id } - this.newElementId = "node/" + id + this.setElementId(id) for (const kv of this._basicTags) { if (typeof kv.value !== "string") { throw "Invalid value: don't use a regex in a preset" @@ -84,8 +122,7 @@ export default class CreateNewNodeAction extends OsmChangeAction { } if (reusedPointId !== undefined) { console.log("Reusing an existing point:", reusedPointId) - this.newElementId = "node/" + reusedPointId - + this.setElementId(reusedPointId) return [{ tags: new And(this._basicTags).asChange(properties), type: "node", @@ -112,10 +149,20 @@ export default class CreateNewNodeAction extends OsmChangeAction { coordinates: locations, nodes: ids }, - meta:this.meta + meta: this.meta } ] } + private setElementId(id: number) { + this.newElementIdNumber = id; + this.newElementId = "node/" + id + if (!this._reusePreviouslyCreatedPoint) { + return + } + const key = this._lat + "," + this._lon + CreateNewNodeAction.previouslyCreatedPoints.set(key, id) + } + } \ No newline at end of file diff --git a/Logic/Osm/Actions/CreateNewWayAction.ts b/Logic/Osm/Actions/CreateNewWayAction.ts new file mode 100644 index 0000000000..ef10d417fd --- /dev/null +++ b/Logic/Osm/Actions/CreateNewWayAction.ts @@ -0,0 +1,78 @@ +import {ChangeDescription} from "./ChangeDescription"; +import OsmChangeAction from "./OsmChangeAction"; +import {Changes} from "../Changes"; +import {Tag} from "../../Tags/Tag"; +import CreateNewNodeAction from "./CreateNewNodeAction"; +import {And} from "../../Tags/And"; + +export default class CreateNewWayAction extends OsmChangeAction { + public newElementId: string = undefined + private readonly coordinates: ({ nodeId?: number, lat: number, lon: number })[]; + private readonly tags: Tag[]; + private readonly _options: { + theme: string + }; + + + /*** + * Creates a new way to upload to OSM + * @param tags: the tags to apply to the way + * @param coordinates: the coordinates. Might have a nodeId, in this case, this node will be used + * @param options + */ + constructor(tags: Tag[], coordinates: ({ nodeId?: number, lat: number, lon: number })[], + options: { + theme: string + }) { + super(null,true) + this.coordinates = coordinates; + this.tags = tags; + this._options = options; + } + + public async CreateChangeDescriptions(changes: Changes): Promise { + + const newElements: ChangeDescription[] = [] + + const pointIds: number[] = [] + for (const coordinate of this.coordinates) { + if (coordinate.nodeId !== undefined) { + pointIds.push(coordinate.nodeId) + continue + } + + const newPoint = new CreateNewNodeAction([], coordinate.lat, coordinate.lon, { + allowReuseOfPreviouslyCreatedPoints: true, + changeType: null, + theme: this._options.theme + }) + newElements.push(...await newPoint.CreateChangeDescriptions(changes)) + pointIds.push(newPoint.newElementIdNumber) + } + + // We have all created (or reused) all the points! + // Time to create the actual way + + + const id = changes.getNewID() + + const newWay = { + id, + type: "way", + meta: { + theme: this._options.theme, + changeType: "import" + }, + tags: new And(this.tags).asChange({}), + changes: { + nodes: pointIds, + coordinates: this.coordinates.map(c => [c.lon, c.lat]) + } + } + newElements.push(newWay) + this.newElementId = "way/" + id + return newElements + } + + +} \ No newline at end of file diff --git a/Logic/Osm/Actions/CreateWayWithPointReuseAction.ts b/Logic/Osm/Actions/CreateWayWithPointReuseAction.ts new file mode 100644 index 0000000000..a0bc842415 --- /dev/null +++ b/Logic/Osm/Actions/CreateWayWithPointReuseAction.ts @@ -0,0 +1,313 @@ +import OsmChangeAction from "./OsmChangeAction"; +import {Tag} from "../../Tags/Tag"; +import {Changes} from "../Changes"; +import {ChangeDescription} from "./ChangeDescription"; +import FeaturePipelineState from "../../State/FeaturePipelineState"; +import {BBox} from "../../BBox"; +import {TagsFilter} from "../../Tags/TagsFilter"; +import {GeoOperations} from "../../GeoOperations"; +import FeatureSource from "../../FeatureSource/FeatureSource"; +import StaticFeatureSource from "../../FeatureSource/Sources/StaticFeatureSource"; +import CreateNewNodeAction from "./CreateNewNodeAction"; +import CreateNewWayAction from "./CreateNewWayAction"; + + +export interface MergePointConfig { + withinRangeOfM: number, + ifMatches: TagsFilter, + mode: "reuse_osm_point" | "move_osm_point" +} + +interface CoordinateInfo { + lngLat: [number, number], + identicalTo?: number, + closebyNodes?: { + d: number, + node: any, + config: MergePointConfig + }[] +} + +/** + * More or less the same as 'CreateNewWay', except that it'll try to reuse already existing points + */ +export default class CreateWayWithPointReuseAction extends OsmChangeAction { + private readonly _tags: Tag[]; + /** + * lngLat-coordinates + * @private + */ + private _coordinateInfo: CoordinateInfo[]; + private _state: FeaturePipelineState; + private _config: MergePointConfig[]; + + constructor(tags: Tag[], + coordinates: [number, number][], + state: FeaturePipelineState, + config: MergePointConfig[] + ) { + super(null,true); + this._tags = tags; + this._state = state; + this._config = config; + this._coordinateInfo = this.CalculateClosebyNodes(coordinates); + + } + + public async getPreview(): Promise { + + const features = [] + let geometryMoved = false; + for (let i = 0; i < this._coordinateInfo.length; i++) { + const coordinateInfo = this._coordinateInfo[i]; + if (coordinateInfo.identicalTo !== undefined) { + continue + } + if (coordinateInfo.closebyNodes === undefined || coordinateInfo.closebyNodes.length === 0) { + + const newPoint = { + type: "Feature", + properties: { + "newpoint": "yes", + id: "new-geometry-with-reuse-" + i + }, + geometry: { + type: "Point", + coordinates: coordinateInfo.lngLat + } + }; + features.push(newPoint) + continue + } + + const reusedPoint = coordinateInfo.closebyNodes[0] + if (reusedPoint.config.mode === "move_osm_point") { + const moveDescription = { + type: "Feature", + properties: { + "move": "yes", + "osm-id": reusedPoint.node.properties.id, + "id": "new-geometry-move-existing" + i + }, + geometry: { + type: "LineString", + coordinates: [reusedPoint.node.geometry.coordinates, coordinateInfo.lngLat] + } + } + features.push(moveDescription) + + } else { + // The geometry is moved + geometryMoved = true + } + } + + if (geometryMoved) { + + const coords: [number, number][] = [] + for (const info of this._coordinateInfo) { + if (info.identicalTo !== undefined) { + coords.push(coords[info.identicalTo]) + continue + } + + if (info.closebyNodes === undefined || info.closebyNodes.length === 0) { + coords.push(coords[info.identicalTo]) + continue + } + + const closest = info.closebyNodes[0] + if (closest.config.mode === "reuse_osm_point") { + coords.push(closest.node.geometry.coordinates) + } else { + coords.push(info.lngLat) + } + + } + const newGeometry = { + type: "Feature", + properties: { + "resulting-geometry": "yes", + "id": "new-geometry" + }, + geometry: { + type: "LineString", + coordinates: coords + } + } + features.push(newGeometry) + + } + console.log("Preview:", features) + return new StaticFeatureSource(features, false) + } + + protected async CreateChangeDescriptions(changes: Changes): Promise { + const theme = this._state.layoutToUse.id + const allChanges: ChangeDescription[] = [] + const nodeIdsToUse: { lat: number, lon: number, nodeId?: number }[] = [] + for (let i = 0; i < this._coordinateInfo.length; i++) { + const info = this._coordinateInfo[i] + const lat = info.lngLat[1] + const lon = info.lngLat[0] + + if (info.identicalTo !== undefined) { + nodeIdsToUse.push(nodeIdsToUse[info.identicalTo]) + continue + } + if (info.closebyNodes === undefined || info.closebyNodes[0] === undefined) { + const newNodeAction = new CreateNewNodeAction([], lat, lon, { + allowReuseOfPreviouslyCreatedPoints: true, + changeType: null, + theme + }) + + allChanges.push(...(await newNodeAction.CreateChangeDescriptions(changes))) + + nodeIdsToUse.push({ + lat, lon, + nodeId: newNodeAction.newElementIdNumber + }) + continue + + } + + const closestPoint = info.closebyNodes[0] + const id = Number(closestPoint.node.properties.id.split("/")[1]) + if (closestPoint.config.mode === "move_osm_point") { + allChanges.push({ + type: "node", + id, + changes: { + lat, lon + }, + meta: { + theme, + changeType: null + } + }) + } + nodeIdsToUse.push({lat, lon, nodeId: id}) + } + + + const newWay = new CreateNewWayAction(this._tags, nodeIdsToUse, { + theme + }) + + allChanges.push(...(await newWay.CreateChangeDescriptions(changes))) + return allChanges + } + + private CalculateClosebyNodes(coordinates: [number, number][]): CoordinateInfo[] { + + const bbox = new BBox(coordinates) + const state = this._state + const allNodes = [].concat(...state.featurePipeline.GetFeaturesWithin("type_node", bbox.pad(1.2))) + const maxDistance = Math.max(...this._config.map(c => c.withinRangeOfM)) + + const coordinateInfo: { + lngLat: [number, number], + identicalTo?: number, + closebyNodes?: { + d: number, + node: any, + config: MergePointConfig + }[] + }[] = coordinates.map(_ => undefined) + + for (let i = 0; i < coordinates.length; i++) { + + if (coordinateInfo[i] !== undefined) { + // Already seen, probably a duplicate coordinate + continue + } + const coor = coordinates[i] + // Check closeby (and probably identical) point further in the coordinate list, mark them as duplicate + for (let j = i + 1; j < coordinates.length; j++) { + if (1000 * GeoOperations.distanceBetween(coor, coordinates[j]) < 0.1) { + coordinateInfo[j] = { + lngLat: coor, + identicalTo: i + } + break; + } + } + + // Gather the actual info for this point + + // Lets search applicable points and determine the merge mode + const closebyNodes: { + d: number, + node: any, + config: MergePointConfig + }[] = [] + for (const node of allNodes) { + const center = node.geometry.coordinates + const d = 1000 * GeoOperations.distanceBetween(coor, center) + if (d > maxDistance) { + continue + } + + for (const config of this._config) { + if (d > config.withinRangeOfM) { + continue + } + if (!config.ifMatches.matchesProperties(node.properties)) { + continue + } + closebyNodes.push({node, d, config}) + } + } + + closebyNodes.sort((n0, n1) => { + return n0.d - n1.d + }) + + coordinateInfo[i] = { + identicalTo: undefined, + lngLat: coor, + closebyNodes + } + + } + + let conflictFree = true; + + do { + conflictFree = true; + for (let i = 0; i < coordinateInfo.length; i++) { + + const coorInfo = coordinateInfo[i] + if (coorInfo.identicalTo !== undefined) { + continue + } + if (coorInfo.closebyNodes === undefined || coorInfo.closebyNodes[0] === undefined) { + continue + } + + for (let j = i + 1; j < coordinates.length; j++) { + const other = coordinateInfo[j] + if (other.closebyNodes === undefined || other.closebyNodes[0] === undefined) { + continue + } + + if (other.closebyNodes[0].node === coorInfo.closebyNodes[0].node) { + conflictFree = false + // We have found a conflict! + // We only keep the closest point + if (other.closebyNodes[0].d > coorInfo.closebyNodes[0].d) { + other.closebyNodes.shift() + } else { + coorInfo.closebyNodes.shift() + } + } + } + } + } while (!conflictFree) + + + return coordinateInfo + } + +} \ No newline at end of file diff --git a/Logic/Osm/Actions/DeleteAction.ts b/Logic/Osm/Actions/DeleteAction.ts index 34adc50e74..a5be01448d 100644 --- a/Logic/Osm/Actions/DeleteAction.ts +++ b/Logic/Osm/Actions/DeleteAction.ts @@ -27,7 +27,7 @@ export default class DeleteAction extends OsmChangeAction { specialMotivation: string }, hardDelete: boolean) { - super() + super(id,true) this._id = id; this._hardDelete = hardDelete; this.meta = {...meta, changeType: "deletion"}; diff --git a/Logic/Osm/Actions/OsmChangeAction.ts b/Logic/Osm/Actions/OsmChangeAction.ts index 784b192ba1..13a31a76af 100644 --- a/Logic/Osm/Actions/OsmChangeAction.ts +++ b/Logic/Osm/Actions/OsmChangeAction.ts @@ -8,6 +8,18 @@ import {ChangeDescription} from "./ChangeDescription"; export default abstract class OsmChangeAction { private isUsed = false + public readonly trackStatistics: boolean; + /** + * The ID of the object that is the center of this change. + * Null if the action creates a new object + * Undefined if such an id does not make sense + */ + public readonly mainObjectId: string; + + constructor(mainObjectId: string, trackStatistics: boolean = true) { + this.trackStatistics = trackStatistics; + this.mainObjectId = mainObjectId + } public Perform(changes: Changes) { if (this.isUsed) { @@ -18,6 +30,4 @@ export default abstract class OsmChangeAction { } protected abstract CreateChangeDescriptions(changes: Changes): Promise - - } \ No newline at end of file diff --git a/Logic/Osm/Actions/RelationSplitHandler.ts b/Logic/Osm/Actions/RelationSplitHandler.ts index 4636743474..4cc5a0d0e8 100644 --- a/Logic/Osm/Actions/RelationSplitHandler.ts +++ b/Logic/Osm/Actions/RelationSplitHandler.ts @@ -10,16 +10,16 @@ export interface RelationSplitInput { originalNodes: number[], allWaysNodesInOrder: number[][] } + abstract class AbstractRelationSplitHandler extends OsmChangeAction { protected readonly _input: RelationSplitInput; protected readonly _theme: string; constructor(input: RelationSplitInput, theme: string) { - super() + super("relation/"+input.relation.id, false) this._input = input; this._theme = theme; } - /** * Returns which node should border the member at the given index */ @@ -57,11 +57,11 @@ export default class RelationSplitHandler extends AbstractRelationSplitHandler { } async CreateChangeDescriptions(changes: Changes): Promise { - if(this._input.relation.tags["type"] === "restriction"){ + if (this._input.relation.tags["type"] === "restriction") { // This is a turn restriction return new TurnRestrictionRSH(this._input, this._theme).CreateChangeDescriptions(changes) } - return new InPlaceReplacedmentRTSH(this._input, this._theme).CreateChangeDescriptions(changes) + return new InPlaceReplacedmentRTSH(this._input, this._theme).CreateChangeDescriptions(changes) } @@ -72,68 +72,71 @@ export class TurnRestrictionRSH extends AbstractRelationSplitHandler { constructor(input: RelationSplitInput, theme: string) { super(input, theme); } - + public async CreateChangeDescriptions(changes: Changes): Promise { const relation = this._input.relation const members = relation.members - + const selfMembers = members.filter(m => m.type === "way" && m.ref === this._input.originalWayId) - - if(selfMembers.length > 1){ + + if (selfMembers.length > 1) { console.warn("Detected a turn restriction where this way has multiple occurances. This is an error") } const selfMember = selfMembers[0] - - if(selfMember.role === "via"){ + + if (selfMember.role === "via") { // A via way can be replaced in place return new InPlaceReplacedmentRTSH(this._input, this._theme).CreateChangeDescriptions(changes); } - - + + // We have to keep only the way with a common point with the rest of the relation // Let's figure out which member is neighbouring our way - - let commonStartPoint : number = await this.targetNodeAt(members.indexOf(selfMember), true) - let commonEndPoint : number = await this.targetNodeAt(members.indexOf(selfMember), false) - + + let commonStartPoint: number = await this.targetNodeAt(members.indexOf(selfMember), true) + let commonEndPoint: number = await this.targetNodeAt(members.indexOf(selfMember), false) + // In normal circumstances, only one of those should be defined let commonPoint = commonStartPoint ?? commonEndPoint - + // Let's select the way to keep - const idToKeep : {id: number} = this._input.allWaysNodesInOrder.map((nodes, i) => ({nodes: nodes, id: this._input.allWayIdsInOrder[i]})) + const idToKeep: { id: number } = this._input.allWaysNodesInOrder.map((nodes, i) => ({ + nodes: nodes, + id: this._input.allWayIdsInOrder[i] + })) .filter(nodesId => { const nds = nodesId.nodes - return nds[0] == commonPoint || nds[nds.length - 1] == commonPoint + return nds[0] == commonPoint || nds[nds.length - 1] == commonPoint })[0] - - if(idToKeep === undefined){ + + if (idToKeep === undefined) { console.error("No common point found, this was a broken turn restriction!", relation.id) return [] } - + const originalWayId = this._input.originalWayId - if(idToKeep.id === originalWayId){ + if (idToKeep.id === originalWayId) { console.log("Turn_restriction fixer: the original ID can be kept, nothing to do") return [] } - - const newMembers : { - ref:number, - type:"way" | "node" | "relation", - role:string + + const newMembers: { + ref: number, + type: "way" | "node" | "relation", + role: string } [] = relation.members.map(m => { - if(m.type === "way" && m.ref === originalWayId){ + if (m.type === "way" && m.ref === originalWayId) { return { ref: idToKeep.id, - type:"way", + type: "way", role: m.role } } return m }) - - + + return [ { type: "relation", @@ -148,7 +151,7 @@ export class TurnRestrictionRSH extends AbstractRelationSplitHandler { } ]; } - + } /** @@ -184,8 +187,8 @@ export class InPlaceReplacedmentRTSH extends AbstractRelationSplitHandler { const nodeIdBefore = await this.targetNodeAt(i - 1, false) const nodeIdAfter = await this.targetNodeAt(i + 1, true) - const firstNodeMatches = nodeIdBefore === undefined || nodeIdBefore === firstNode - const lastNodeMatches =nodeIdAfter === undefined || nodeIdAfter === lastNode + const firstNodeMatches = nodeIdBefore === undefined || nodeIdBefore === firstNode + const lastNodeMatches = nodeIdAfter === undefined || nodeIdAfter === lastNode if (firstNodeMatches && lastNodeMatches) { // We have a classic situation, forward situation @@ -200,10 +203,10 @@ export class InPlaceReplacedmentRTSH extends AbstractRelationSplitHandler { } const firstNodeMatchesRev = nodeIdBefore === undefined || nodeIdBefore === lastNode - const lastNodeMatchesRev =nodeIdAfter === undefined || nodeIdAfter === firstNode + const lastNodeMatchesRev = nodeIdAfter === undefined || nodeIdAfter === firstNode if (firstNodeMatchesRev || lastNodeMatchesRev) { // We (probably) have a reversed situation, backward situation - for (let i1 = this._input.allWayIdsInOrder.length - 1; i1 >= 0; i1--){ + for (let i1 = this._input.allWayIdsInOrder.length - 1; i1 >= 0; i1--) { // Iterate BACKWARDS const wId = this._input.allWayIdsInOrder[i1]; newMembers.push({ @@ -214,7 +217,7 @@ export class InPlaceReplacedmentRTSH extends AbstractRelationSplitHandler { } continue; } - + // Euhm, allright... Something weird is going on, but let's not care too much // Lets pretend this is forward going for (const wId of this._input.allWayIdsInOrder) { @@ -231,7 +234,7 @@ export class InPlaceReplacedmentRTSH extends AbstractRelationSplitHandler { id: relation.id, type: "relation", changes: {members: newMembers}, - meta:{ + meta: { changeType: "relation-fix", theme: this._theme } diff --git a/Logic/Osm/Actions/ReplaceGeometryAction.ts b/Logic/Osm/Actions/ReplaceGeometryAction.ts new file mode 100644 index 0000000000..1bd90869e4 --- /dev/null +++ b/Logic/Osm/Actions/ReplaceGeometryAction.ts @@ -0,0 +1,278 @@ +import OsmChangeAction from "./OsmChangeAction"; +import {Changes} from "../Changes"; +import {ChangeDescription} from "./ChangeDescription"; +import {Tag} from "../../Tags/Tag"; +import FeatureSource from "../../FeatureSource/FeatureSource"; +import {OsmNode, OsmObject, OsmWay} from "../OsmObject"; +import {GeoOperations} from "../../GeoOperations"; +import StaticFeatureSource from "../../FeatureSource/Sources/StaticFeatureSource"; +import CreateNewNodeAction from "./CreateNewNodeAction"; +import ChangeTagAction from "./ChangeTagAction"; +import {And} from "../../Tags/And"; +import {Utils} from "../../../Utils"; +import {OsmConnection} from "../OsmConnection"; + +export default class ReplaceGeometryAction extends OsmChangeAction { + private readonly feature: any; + private readonly state: { + osmConnection: OsmConnection + }; + private readonly wayToReplaceId: string; + private readonly theme: string; + /** + * The target coordinates that should end up in OpenStreetMap + */ + private readonly targetCoordinates: [number, number][]; + /** + * If a target coordinate is close to another target coordinate, 'identicalTo' will point to the first index. + * @private + */ + private readonly identicalTo: number[] + private readonly newTags: Tag[] | undefined; + + constructor( + state: { + osmConnection: OsmConnection + }, + feature: any, + wayToReplaceId: string, + options: { + theme: string, + newTags?: Tag[] + } + ) { + super(wayToReplaceId, false); + this.state = state; + this.feature = feature; + this.wayToReplaceId = wayToReplaceId; + this.theme = options.theme; + + const geom = this.feature.geometry + let coordinates: [number, number][] + if (geom.type === "LineString") { + coordinates = geom.coordinates + } else if (geom.type === "Polygon") { + coordinates = geom.coordinates[0] + } + + this.identicalTo = coordinates.map(_ => undefined) + + for (let i = 0; i < coordinates.length; i++) { + if (this.identicalTo[i] !== undefined) { + continue + } + for (let j = i + 1; j < coordinates.length; j++) { + const d = 1000 * GeoOperations.distanceBetween(coordinates[i], coordinates[j]) + if (d < 0.1) { + console.log("Identical coordinates detected: ", i, " and ", j, ": ", coordinates[i], coordinates[j], "distance is", d) + this.identicalTo[j] = i + } + } + } + + + this.targetCoordinates = coordinates + this.newTags = options.newTags + } + + public async getPreview(): Promise { + const {closestIds, allNodesById} = await this.GetClosestIds(); + console.log("Generating preview, identicals are ",) + const preview = closestIds.map((newId, i) => { + if (this.identicalTo[i] !== undefined) { + return undefined + } + + + if (newId === undefined) { + return { + type: "Feature", + properties: { + "newpoint": "yes", + "id": "replace-geometry-move-" + i + }, + geometry: { + type: "Point", + coordinates: this.targetCoordinates[i] + } + }; + } + const origPoint = allNodesById.get(newId).centerpoint() + return { + type: "Feature", + properties: { + "move": "yes", + "osm-id": newId, + "id": "replace-geometry-move-" + i + }, + geometry: { + type: "LineString", + coordinates: [[origPoint[1], origPoint[0]], this.targetCoordinates[i]] + } + }; + }) + return new StaticFeatureSource(Utils.NoNull(preview), false) + + } + + protected async CreateChangeDescriptions(changes: Changes): Promise { + + const allChanges: ChangeDescription[] = [] + const actualIdsToUse: number[] = [] + + const {closestIds, osmWay} = await this.GetClosestIds() + + for (let i = 0; i < closestIds.length; i++) { + if (this.identicalTo[i] !== undefined) { + const j = this.identicalTo[i] + actualIdsToUse.push(actualIdsToUse[j]) + continue + } + const closestId = closestIds[i]; + const [lon, lat] = this.targetCoordinates[i] + if (closestId === undefined) { + + const newNodeAction = new CreateNewNodeAction( + [], + lat, lon, + { + allowReuseOfPreviouslyCreatedPoints: true, + theme: this.theme, changeType: null + }) + const changeDescr = await newNodeAction.CreateChangeDescriptions(changes) + allChanges.push(...changeDescr) + actualIdsToUse.push(newNodeAction.newElementIdNumber) + + } else { + const change = { + id: closestId, + type: "node", + meta: { + theme: this.theme, + changeType: "move" + }, + changes: {lon, lat} + } + actualIdsToUse.push(closestId) + allChanges.push(change) + } + } + + + if (this.newTags !== undefined && this.newTags.length > 0) { + const addExtraTags = new ChangeTagAction( + this.wayToReplaceId, + new And(this.newTags), + osmWay.tags, { + theme: this.theme, + changeType: "conflation" + } + ) + allChanges.push(...await addExtraTags.CreateChangeDescriptions(changes)) + } + + // AT the very last: actually change the nodes of the way! + allChanges.push({ + type: "way", + id: osmWay.id, + changes: { + nodes: actualIdsToUse, + coordinates: this.targetCoordinates + }, + meta: { + theme: this.theme, + changeType: "conflation" + } + }) + + + return allChanges + } + + /** + * For 'this.feature`, gets a corresponding closest node that alreay exsists + * @constructor + * @private + */ + private async GetClosestIds(): Promise<{ closestIds: number[], allNodesById: Map, osmWay: OsmWay }> { + // TODO FIXME: cap move length on points which are embedded into other ways (ev. disconnect them) + // TODO FIXME: if a new point has to be created, snap to already existing ways + // TODO FIXME: detect intersections with other ways if moved + const splitted = this.wayToReplaceId.split("/"); + const type = splitted[0]; + const idN = Number(splitted[1]); + if (idN < 0 || type !== "way") { + throw "Invalid ID to conflate: " + this.wayToReplaceId + } + const url = `${this.state.osmConnection._oauth_config.url}/api/0.6/${this.wayToReplaceId}/full`; + const rawData = await Utils.downloadJsonCached(url, 1000) + const parsed = OsmObject.ParseObjects(rawData.elements); + const allNodesById = new Map() + const allNodes = parsed.filter(o => o.type === "node") + for (const node of allNodes) { + allNodesById.set(node.id, node) + } + + + /** + * Allright! We know all the nodes of the original way and all the nodes of the target coordinates. + * For each of the target coordinates, we search the closest, already existing point and reuse this point + */ + + const closestIds = [] + const distances = [] + for (let i = 0; i < this.targetCoordinates.length; i++) { + const target = this.targetCoordinates[i]; + let closestDistance = undefined + let closestId = undefined; + for (const osmNode of allNodes) { + + const cp = osmNode.centerpoint() + const d = GeoOperations.distanceBetween(target, [cp[1], cp[0]]) + if (closestId === undefined || closestDistance > d) { + closestId = osmNode.id + closestDistance = d + } + } + closestIds.push(closestId) + distances.push(closestDistance) + } + + // Next step: every closestId can only occur once in the list + // We skip the ones which are identical + console.log("Erasing double ids") + for (let i = 0; i < closestIds.length; i++) { + if (this.identicalTo[i] !== undefined) { + closestIds[i] = closestIds[this.identicalTo[i]] + continue + } + const closestId = closestIds[i] + for (let j = i + 1; j < closestIds.length; j++) { + if (this.identicalTo[j] !== undefined) { + continue + } + const otherClosestId = closestIds[j] + if (closestId !== otherClosestId) { + continue + } + // We have two occurences of 'closestId' - we only keep the closest instance! + const di = distances[i] + const dj = distances[j] + if (di < dj) { + closestIds[j] = undefined + } else { + closestIds[i] = undefined + } + } + } + + + const osmWay = parsed[parsed.length - 1] + if (osmWay.type !== "way") { + throw "WEIRD: expected an OSM-way as last element here!" + } + return {closestIds, allNodesById, osmWay}; + } + + +} \ No newline at end of file diff --git a/Logic/Osm/Actions/SplitAction.ts b/Logic/Osm/Actions/SplitAction.ts index 682d6dc708..3928ed4055 100644 --- a/Logic/Osm/Actions/SplitAction.ts +++ b/Logic/Osm/Actions/SplitAction.ts @@ -25,8 +25,8 @@ export default class SplitAction extends OsmChangeAction { * @param meta * @param toleranceInMeters: if a splitpoint closer then this amount of meters to an existing point, the existing point will be used to split the line instead of a new point */ - constructor(wayId: string, splitPointCoordinates: [number, number][], meta: {theme: string}, toleranceInMeters = 5) { - super() + constructor(wayId: string, splitPointCoordinates: [number, number][], meta: { theme: string }, toleranceInMeters = 5) { + super(wayId,true) this.wayId = wayId; this._splitPointsCoordinates = splitPointCoordinates this._toleranceInMeters = toleranceInMeters; @@ -51,7 +51,7 @@ export default class SplitAction extends OsmChangeAction { } async CreateChangeDescriptions(changes: Changes): Promise { - const originalElement = await OsmObject.DownloadObjectAsync(this.wayId) + const originalElement = await OsmObject.DownloadObjectAsync(this.wayId) const originalNodes = originalElement.nodes; // First, calculate splitpoints and remove points close to one another @@ -180,7 +180,7 @@ export default class SplitAction extends OsmChangeAction { private CalculateSplitCoordinates(osmWay: OsmWay, toleranceInM = 5): SplitInfo[] { const wayGeoJson = osmWay.asGeoJson() // Should be [lon, lat][] - const originalPoints : [number, number][] = osmWay.coordinates.map(c => [c[1], c[0]]) + const originalPoints: [number, number][] = osmWay.coordinates.map(c => [c[1], c[0]]) const allPoints: { // lon, lat coordinates: [number, number], @@ -234,25 +234,25 @@ export default class SplitAction extends OsmChangeAction { // We keep the original points continue } - + // At this point, 'dist' told us the point is pretty close to an already existing point. // Lets see which (already existing) point is closer and mark it as splitpoint const nextPoint = allPoints[i + 1] const prevPoint = allPoints[i - 1] const distToNext = nextPoint.location - point.location const distToPrev = point.location - prevPoint.location - - if(distToNext * 1000 > toleranceInM && distToPrev * 1000 > toleranceInM){ + + if (distToNext * 1000 > toleranceInM && distToPrev * 1000 > toleranceInM) { // Both are too far away to mark them as the split point continue; } - + let closest = nextPoint if (distToNext > distToPrev) { closest = prevPoint } // Ok, we have a closest point! - if(closest.originalIndex === 0 || closest.originalIndex === originalPoints.length){ + if (closest.originalIndex === 0 || closest.originalIndex === originalPoints.length) { // We can not split on the first or last points... continue } diff --git a/Logic/Osm/Changes.ts b/Logic/Osm/Changes.ts index 7faa234947..3b68dee1df 100644 --- a/Logic/Osm/Changes.ts +++ b/Logic/Osm/Changes.ts @@ -6,6 +6,13 @@ import OsmChangeAction from "./Actions/OsmChangeAction"; import {ChangeDescription} from "./Actions/ChangeDescription"; import {Utils} from "../../Utils"; import {LocalStorageSource} from "../Web/LocalStorageSource"; +import SimpleMetaTagger from "../SimpleMetaTagger"; +import CreateNewNodeAction from "./Actions/CreateNewNodeAction"; +import FeatureSource from "../FeatureSource/FeatureSource"; +import {ElementStorage} from "../ElementStorage"; +import {GeoLocationPointProperties} from "../Actors/GeoLocationHandler"; +import {GeoOperations} from "../GeoOperations"; +import {ChangesetTag} from "./ChangesetHandler"; /** * Handles all changes made to OSM. @@ -13,21 +20,23 @@ import {LocalStorageSource} from "../Web/LocalStorageSource"; */ export class Changes { - - private _nextId: number = -1; // Newly assigned ID's are negative public readonly name = "Newly added features" /** * All the newly created features as featureSource + all the modified features */ public features = new UIEventSource<{ feature: any, freshness: Date }[]>([]); - public readonly pendingChanges: UIEventSource = LocalStorageSource.GetParsed("pending-changes", []) public readonly allChanges = new UIEventSource(undefined) + private _nextId: number = -1; // Newly assigned ID's are negative private readonly isUploading = new UIEventSource(false); private readonly previouslyCreated: OsmObject[] = [] + private readonly _leftRightSensitive: boolean; + + private _state : { allElements: ElementStorage; historicalUserLocations: FeatureSource } - constructor() { + constructor(leftRightSensitive: boolean = false) { + this._leftRightSensitive = leftRightSensitive; // We keep track of all changes just as well this.allChanges.setData([...this.pendingChanges.data]) // If a pending change contains a negative ID, we save that @@ -111,16 +120,104 @@ export class Changes { }) } + private calculateDistanceToChanges(change: OsmChangeAction, changeDescriptions: ChangeDescription[]){ + + if (this._state === undefined) { + // No state loaded -> we can't calculate... + return; + } + if(!change.trackStatistics){ + // Probably irrelevant, such as a new helper node + return; + } + const now = new Date() + const recentLocationPoints = this._state.historicalUserLocations.features.data.map(ff => ff.feature) + .filter(feat => feat.geometry.type === "Point") + .filter(feat => { + const visitTime = new Date((feat.properties).date) + // In seconds + const diff = (now.getTime() - visitTime.getTime()) / 1000 + return diff < Constants.nearbyVisitTime; + }) + if(recentLocationPoints.length === 0){ + // Probably no GPS enabled/no fix + return; + } + + // The applicable points, contain information in their properties about location, time and GPS accuracy + // They are all GeoLocationPointProperties + // We walk every change and determine the closest distance possible + // Only if the change itself does _not_ contain any coordinates, we fall back and search the original feature in the state + + const changedObjectCoordinates : [number, number][] = [] + + const feature = this._state.allElements.ContainingFeatures.get(change.mainObjectId) + if(feature !== undefined){ + changedObjectCoordinates.push(GeoOperations.centerpointCoordinates(feature)) + } + + for (const changeDescription of changeDescriptions) { + const chng : {lat: number, lon: number} | {coordinates : [number,number][]} | {members} = changeDescription.changes + if(chng === undefined){ + continue + } + if(chng["lat"] !== undefined){ + changedObjectCoordinates.push([chng["lat"],chng["lon"]]) + } + if(chng["coordinates"] !== undefined){ + changedObjectCoordinates.push(...chng["coordinates"]) + } + } + + return Math.min(...changedObjectCoordinates.map(coor => + Math.min(...recentLocationPoints.map(gpsPoint => { + const otherCoor = GeoOperations.centerpointCoordinates(gpsPoint) + return GeoOperations.distanceBetween(coor, otherCoor) * 1000 + })) + )) + } + + public async applyAction(action: OsmChangeAction): Promise { + const changeDescriptions = await action.Perform(this) + changeDescriptions[0].meta.distanceToObject = this.calculateDistanceToChanges(action, changeDescriptions) + this.applyChanges(changeDescriptions) + } + + public applyChanges(changes: ChangeDescription[]) { + console.log("Received changes:", changes) + this.pendingChanges.data.push(...changes); + this.pendingChanges.ping(); + this.allChanges.data.push(...changes) + this.allChanges.ping() + } + + public useLocationHistory(state: { + allElements: ElementStorage, + historicalUserLocations: FeatureSource + }){ + this._state= state + } + + public registerIdRewrites(mappings: Map): void { + CreateNewNodeAction.registerIdRewrites(mappings) + } + + /** * UPload the selected changes to OSM. * Returns 'true' if successfull and if they can be removed * @param pending * @private */ - private async flushSelectChanges(pending: ChangeDescription[]): Promise{ + private async flushSelectChanges(pending: ChangeDescription[]): Promise { const self = this; const neededIds = Changes.GetNeededIds(pending) const osmObjects = await Promise.all(neededIds.map(id => OsmObject.DownloadObjectAsync(id))); + + if (this._leftRightSensitive) { + osmObjects.forEach(obj => SimpleMetaTagger.removeBothTagging(obj.tags)) + } + console.log("Got the fresh objects!", osmObjects, "pending: ", pending) const changes: { newObjects: OsmObject[], @@ -129,35 +226,67 @@ export class Changes { } = self.CreateChangesetObjects(pending, osmObjects) if (changes.newObjects.length + changes.deletedObjects.length + changes.modifiedObjects.length === 0) { console.log("No changes to be made") - return true + return true } - const meta = pending[0].meta - - const perType = Array.from(Utils.Hist(pending.map(descr => descr.meta.changeType)), ([key, count]) => ({ - key: key, - value: count, - aggregate: true - })) + + const perType = Array.from( + Utils.Hist(pending.filter(descr => descr.meta.changeType !== undefined && descr.meta.changeType !== null) + .map(descr => descr.meta.changeType)), ([key, count]) => ( + { + key: key, + value: count, + aggregate: true + })) const motivations = pending.filter(descr => descr.meta.specialMotivation !== undefined) .map(descr => ({ - key: descr.meta.changeType+":"+descr.type+"/"+descr.id, - value: descr.meta.specialMotivation + key: descr.meta.changeType + ":" + descr.type + "/" + descr.id, + value: descr.meta.specialMotivation })) - const metatags = [{ + + const distances = Utils.NoNull(pending.map(descr => descr.meta.distanceToObject)); + distances.sort((a, b) => a - b) + const perBinCount = Constants.distanceToChangeObjectBins.map(_ => 0) + + let j = 0; + const maxDistances = Constants.distanceToChangeObjectBins + for (let i = 0; i < maxDistances.length; i++){ + const maxDistance = maxDistances[i]; + // distances is sorted in ascending order, so as soon as one is to big, all the resting elements will be bigger too + while(j < distances.length && distances[j] < maxDistance){ + perBinCount[i] ++ + j++ + } + } + + const perBinMessage = Utils.NoNull(perBinCount.map((count, i) => { + if(count === 0){ + return undefined + } + return { + key: "change_within_"+maxDistances[i]+"m", + value: count, + aggregate:true + } + })) + + // This method is only called with changedescriptions for this theme + const theme = pending[0].meta.theme + const metatags : ChangesetTag[] = [{ key: "comment", - value: "Adding data with #MapComplete for theme #"+meta.theme + value: "Adding data with #MapComplete for theme #" + theme }, { - key:"theme", - value:meta.theme + key: "theme", + value: theme }, ...perType, - ...motivations + ...motivations, + ...perBinMessage ] - + await State.state.osmConnection.changesetHandler.UploadChangeset( - (csId) => Changes.createChangesetFor(""+csId, changes), + (csId) => Changes.createChangesetFor("" + csId, changes), metatags ) @@ -170,27 +299,27 @@ export class Changes { try { // At last, we build the changeset and upload const pending = self.pendingChanges.data; - + const pendingPerTheme = new Map() for (const changeDescription of pending) { const theme = changeDescription.meta.theme - if(!pendingPerTheme.has(theme)){ + if (!pendingPerTheme.has(theme)) { pendingPerTheme.set(theme, []) } pendingPerTheme.get(theme).push(changeDescription) } - - const successes = await Promise.all(Array.from(pendingPerTheme, ([key , value]) => value) + + const successes = await Promise.all(Array.from(pendingPerTheme, ([_, value]) => value) .map(async pendingChanges => { - try{ + try { return await self.flushSelectChanges(pendingChanges); - }catch(e){ - console.error("Could not upload some changes:",e) + } catch (e) { + console.error("Could not upload some changes:", e) return false } })) - - if(!successes.some(s => s == false)){ + + if (!successes.some(s => s == false)) { // All changes successfull, we clear the data! this.pendingChanges.setData([]); } @@ -198,22 +327,13 @@ export class Changes { } catch (e) { console.error("Could not handle changes - probably an old, pending changeset in localstorage with an invalid format; erasing those", e) self.pendingChanges.setData([]) - }finally { + } finally { self.isUploading.setData(false) } } - public async applyAction(action: OsmChangeAction): Promise { - const changes = await action.Perform(this) - console.log("Received changes:", changes) - this.pendingChanges.data.push(...changes); - this.pendingChanges.ping(); - this.allChanges.data.push(...changes) - this.allChanges.ping() - } - private CreateChangesetObjects(changes: ChangeDescription[], downloadedOsmObjects: OsmObject[]): { newObjects: OsmObject[], modifiedObjects: OsmObject[] @@ -365,8 +485,4 @@ export class Changes { return result } - - public registerIdRewrites(mappings: Map): void { - - } } \ No newline at end of file diff --git a/Logic/Osm/ChangesetHandler.ts b/Logic/Osm/ChangesetHandler.ts index 4357fa0544..866c61faac 100644 --- a/Logic/Osm/ChangesetHandler.ts +++ b/Logic/Osm/ChangesetHandler.ts @@ -53,61 +53,6 @@ export class ChangesetHandler { } } - private handleIdRewrite(node: any, type: string): [string, string] { - const oldId = parseInt(node.attributes.old_id.value); - if (node.attributes.new_id === undefined) { - // We just removed this point! - const element = this.allElements.getEventSourceById("node/" + oldId); - element.data._deleted = "yes" - element.ping(); - return; - } - - const newId = parseInt(node.attributes.new_id.value); - const result: [string, string] = [type + "/" + oldId, type + "/" + newId] - if (!(oldId !== undefined && newId !== undefined && - !isNaN(oldId) && !isNaN(newId))) { - return undefined; - } - if (oldId == newId) { - return undefined; - } - console.log("Rewriting id: ", type + "/" + oldId, "-->", type + "/" + newId); - const element = this.allElements.getEventSourceById("node/" + oldId); - if(element === undefined){ - // Element to rewrite not found, probably a node or relation that is not rendered - return undefined - } - element.data.id = type + "/" + newId; - this.allElements.addElementById(type + "/" + newId, element); - this.allElements.ContainingFeatures.set(type + "/" + newId, this.allElements.ContainingFeatures.get(type + "/" + oldId)) - element.ping(); - return result; - } - - private parseUploadChangesetResponse(response: XMLDocument): void { - const nodes = response.getElementsByTagName("node"); - const mappings = new Map() - // @ts-ignore - for (const node of nodes) { - const mapping = this.handleIdRewrite(node, "node") - if (mapping !== undefined) { - mappings.set(mapping[0], mapping[1]) - } - } - - const ways = response.getElementsByTagName("way"); - // @ts-ignore - for (const way of ways) { - const mapping = this.handleIdRewrite(way, "way") - if (mapping !== undefined) { - mappings.set(mapping[0], mapping[1]) - } - } - this.changes.registerIdRewrites(mappings) - - } - /** * The full logic to upload a change to one or more elements. * @@ -133,6 +78,7 @@ export class ChangesetHandler { } if (this._dryRun) { const changesetXML = generateChangeXML(123456); + console.log("Metatags are", extraMetaTags) console.log(changesetXML); return; } @@ -191,7 +137,7 @@ export class ChangesetHandler { // The old value is overwritten, thus we drop } } - + await this.UpdateTags(csId, extraMetaTags.map(csTag => <[string, string]>[csTag.key, csTag.value])) @@ -207,6 +153,60 @@ export class ChangesetHandler { } } + private handleIdRewrite(node: any, type: string): [string, string] { + const oldId = parseInt(node.attributes.old_id.value); + if (node.attributes.new_id === undefined) { + // We just removed this point! + const element = this.allElements.getEventSourceById("node/" + oldId); + element.data._deleted = "yes" + element.ping(); + return; + } + + const newId = parseInt(node.attributes.new_id.value); + const result: [string, string] = [type + "/" + oldId, type + "/" + newId] + if (!(oldId !== undefined && newId !== undefined && + !isNaN(oldId) && !isNaN(newId))) { + return undefined; + } + if (oldId == newId) { + return undefined; + } + console.log("Rewriting id: ", type + "/" + oldId, "-->", type + "/" + newId); + const element = this.allElements.getEventSourceById("node/" + oldId); + if (element === undefined) { + // Element to rewrite not found, probably a node or relation that is not rendered + return undefined + } + element.data.id = type + "/" + newId; + this.allElements.addElementById(type + "/" + newId, element); + this.allElements.ContainingFeatures.set(type + "/" + newId, this.allElements.ContainingFeatures.get(type + "/" + oldId)) + element.ping(); + return result; + } + + private parseUploadChangesetResponse(response: XMLDocument): void { + const nodes = response.getElementsByTagName("node"); + const mappings = new Map() + // @ts-ignore + for (const node of nodes) { + const mapping = this.handleIdRewrite(node, "node") + if (mapping !== undefined) { + mappings.set(mapping[0], mapping[1]) + } + } + + const ways = response.getElementsByTagName("way"); + // @ts-ignore + for (const way of ways) { + const mapping = this.handleIdRewrite(way, "way") + if (mapping !== undefined) { + mappings.set(mapping[0], mapping[1]) + } + } + this.changes.registerIdRewrites(mappings) + + } private async CloseChangeset(changesetId: number = undefined): Promise { const self = this @@ -287,7 +287,7 @@ export class ChangesetHandler { ["language", Locale.language.data], ["host", window.location.host], ["path", path], - ["source", State.state.currentGPSLocation.data !== undefined ? "survey" : undefined], + ["source", State.state.currentUserLocation.features.data.length > 0 ? "survey" : undefined], ["imagery", State.state.backgroundLayer.data.id], ...changesetTags.map(cstag => [cstag.key, cstag.value]) ] diff --git a/Logic/Osm/OsmConnection.ts b/Logic/Osm/OsmConnection.ts index 7fd1078386..3ef0593c44 100644 --- a/Logic/Osm/OsmConnection.ts +++ b/Logic/Osm/OsmConnection.ts @@ -50,26 +50,28 @@ export class OsmConnection { _dryRun: boolean; public preferencesHandler: OsmPreferences; public changesetHandler: ChangesetHandler; - private fakeUser: boolean; - private _onLoggedIn: ((userDetails: UserDetails) => void)[] = []; - private readonly _iframeMode: Boolean | boolean; - private readonly _singlePage: boolean; public readonly _oauth_config: { oauth_consumer_key: string, oauth_secret: string, url: string }; + private fakeUser: boolean; + private _onLoggedIn: ((userDetails: UserDetails) => void)[] = []; + private readonly _iframeMode: Boolean | boolean; + private readonly _singlePage: boolean; private isChecking = false; - constructor(options:{dryRun?: false | boolean, - fakeUser?: false | boolean, - allElements: ElementStorage, - changes: Changes, - oauth_token?: UIEventSource, - // Used to keep multiple changesets open and to write to the correct changeset - layoutName: string, - singlePage?: boolean, - osmConfiguration?: "osm" | "osm-test" } + constructor(options: { + dryRun?: false | boolean, + fakeUser?: false | boolean, + allElements: ElementStorage, + changes: Changes, + oauth_token?: UIEventSource, + // Used to keep multiple changesets open and to write to the correct changeset + layoutName: string, + singlePage?: boolean, + osmConfiguration?: "osm" | "osm-test" + } ) { this.fakeUser = options.fakeUser ?? false; this._singlePage = options.singlePage ?? true; @@ -79,7 +81,7 @@ export class OsmConnection { this._iframeMode = Utils.runningFromConsole ? false : window !== window.top; this.userDetails = new UIEventSource(new UserDetails(this._oauth_config.url), "userDetails"); - this.userDetails.data.dryRun = (options.dryRun ?? false) || (options.fakeUser ?? false) ; + this.userDetails.data.dryRun = (options.dryRun ?? false) || (options.fakeUser ?? false); if (options.fakeUser) { const ud = this.userDetails.data; ud.csCount = 5678 @@ -112,7 +114,7 @@ export class OsmConnection { self.AttemptLogin(); }, this.auth); - options. oauth_token.setData(undefined); + options.oauth_token.setData(undefined); } if (this.auth.authenticated()) { diff --git a/Logic/Osm/OsmObject.ts b/Logic/Osm/OsmObject.ts index faf1ee79db..d28d8f165b 100644 --- a/Logic/Osm/OsmObject.ts +++ b/Logic/Osm/OsmObject.ts @@ -56,7 +56,7 @@ export abstract class OsmObject { OsmObject.objectCache.set(id, src); return src; } - + static async DownloadPropertiesOf(id: string): Promise { const splitted = id.split("/"); const idN = Number(splitted[1]); @@ -84,18 +84,18 @@ export abstract class OsmObject { const parsed = OsmObject.ParseObjects(rawData.elements); // Lets fetch the object we need for (const osmObject of parsed) { - if(osmObject.type !== type){ + if (osmObject.type !== type) { continue; } - if(osmObject.id !== idN){ + if (osmObject.id !== idN) { continue } // Found the one! return osmObject } throw "PANIC: requested object is not part of the response" - - + + } @@ -170,6 +170,43 @@ export abstract class OsmObject { const elements: any[] = data.elements; return OsmObject.ParseObjects(elements); } + + public static ParseObjects(elements: any[]): OsmObject[] { + const objects: OsmObject[] = []; + const allNodes: Map = new Map() + + for (const element of elements) { + const type = element.type; + const idN = element.id; + let osmObject: OsmObject = null + switch (type) { + case("node"): + const node = new OsmNode(idN); + allNodes.set(idN, node); + osmObject = node + node.SaveExtraData(element); + break; + case("way"): + osmObject = new OsmWay(idN); + const nodes = element.nodes.map(i => allNodes.get(i)); + osmObject.SaveExtraData(element, nodes) + break; + case("relation"): + osmObject = new OsmRelation(idN); + osmObject.SaveExtraData(element, []) + break; + } + + if (osmObject !== undefined && OsmObject.backendURL !== OsmObject.defaultBackend) { + osmObject.tags["_backend"] = OsmObject.backendURL + } + + osmObject?.LoadData(element) + objects.push(osmObject) + } + return objects; + } + protected static isPolygon(tags: any): boolean { for (const tagsKey in tags) { if (!tags.hasOwnProperty(tagsKey)) { @@ -206,42 +243,6 @@ export abstract class OsmObject { return result; } - private static ParseObjects(elements: any[]): OsmObject[] { - const objects: OsmObject[] = []; - const allNodes: Map = new Map() - - for (const element of elements) { - const type = element.type; - const idN = element.id; - let osmObject: OsmObject = null - switch (type) { - case("node"): - const node = new OsmNode(idN); - allNodes.set(idN, node); - osmObject = node - node.SaveExtraData(element); - break; - case("way"): - osmObject = new OsmWay(idN); - const nodes = element.nodes.map(i => allNodes.get(i)); - osmObject.SaveExtraData(element, nodes) - break; - case("relation"): - osmObject = new OsmRelation(idN); - osmObject.SaveExtraData(element, []) - break; - } - - if (osmObject !== undefined && OsmObject.backendURL !== OsmObject.defaultBackend) { - osmObject.tags["_backend"] = OsmObject.backendURL - } - - osmObject?.LoadData(element) - objects.push(osmObject) - } - return objects; - } - // The centerpoint of the feature, as [lat, lon] public abstract centerpoint(): [number, number]; diff --git a/Logic/Osm/Overpass.ts b/Logic/Osm/Overpass.ts index 257133307f..f13f7a29b4 100644 --- a/Logic/Osm/Overpass.ts +++ b/Logic/Osm/Overpass.ts @@ -42,13 +42,13 @@ export class Overpass { } const self = this; const json = await Utils.downloadJson(query) - + if (json.elements.length === 0 && json.remark !== undefined) { console.warn("Timeout or other runtime error while querying overpass", json.remark); throw `Runtime error (timeout or similar)${json.remark}` } - if(json.elements.length === 0){ - console.warn("No features for" ,json) + if (json.elements.length === 0) { + console.warn("No features for", json) } self._relationTracker.RegisterRelations(json) diff --git a/Logic/Osm/RelationsTracker.ts b/Logic/Osm/RelationsTracker.ts index f0528e77dc..eb776907b2 100644 --- a/Logic/Osm/RelationsTracker.ts +++ b/Logic/Osm/RelationsTracker.ts @@ -1,4 +1,3 @@ -import State from "../../State"; import {UIEventSource} from "../UIEventSource"; export interface Relation { @@ -21,10 +20,6 @@ export default class RelationsTracker { constructor() { } - public RegisterRelations(overpassJson: any): void { - this.UpdateMembershipTable(RelationsTracker.GetRelationElements(overpassJson)) - } - /** * Gets an overview of the relations - except for multipolygons. We don't care about those * @param overpassJson @@ -39,6 +34,10 @@ export default class RelationsTracker { return relations } + public RegisterRelations(overpassJson: any): void { + this.UpdateMembershipTable(RelationsTracker.GetRelationElements(overpassJson)) + } + /** * Build a mapping of {memberId --> {role in relation, id of relation} } * @param relations diff --git a/Logic/SimpleMetaTagger.ts b/Logic/SimpleMetaTagger.ts index 7d42e9d017..c27240cf9e 100644 --- a/Logic/SimpleMetaTagger.ts +++ b/Logic/SimpleMetaTagger.ts @@ -26,7 +26,7 @@ export default class SimpleMetaTagger { "_last_edit:changeset", "_last_edit:timestamp", "_version_number", - "_backend"], + "_backend"], doc: "Information about the last edit of this object." }, (feature) => {/*Note: also called by 'UpdateTagsFromOsmAPI'*/ @@ -49,6 +49,7 @@ export default class SimpleMetaTagger { return true; } ) + private static latlon = new SimpleMetaTagger({ keys: ["_lat", "_lon"], doc: "The latitude and longitude of the point (or centerpoint in the case of a way/area)" @@ -67,17 +68,33 @@ export default class SimpleMetaTagger { private static layerInfo = new SimpleMetaTagger( { doc: "The layer-id to which this feature belongs. Note that this might be return any applicable if `passAllFeatures` is defined.", - keys:["_layer"], + keys: ["_layer"], includesDates: false, }, (feature, freshness, layer) => { - if(feature.properties._layer === layer.id){ + if (feature.properties._layer === layer.id) { return false; } feature.properties._layer = layer.id return true; } ) + private static noBothButLeftRight = new SimpleMetaTagger( + { + keys: ["sidewalk:left", "sidewalk:right", "generic_key:left:property", "generic_key:right:property"], + doc: "Rewrites tags from 'generic_key:both:property' as 'generic_key:left:property' and 'generic_key:right:property' (and similar for sidewalk tagging). Note that this rewritten tags _will be reuploaded on a change_. To prevent to much unrelated retagging, this is only enabled if the layer has at least some lineRenderings with offset defined", + includesDates: false, + cleanupRetagger: true + }, + ((feature, state, layer) => { + + if (!layer.lineRendering.some(lr => lr.leftRightSensitive)) { + return; + } + + return SimpleMetaTagger.removeBothTagging(feature.properties) + }) + ) private static surfaceArea = new SimpleMetaTagger( { keys: ["_surface", "_surface:ha"], @@ -85,12 +102,12 @@ export default class SimpleMetaTagger { isLazy: true }, (feature => { - + Object.defineProperty(feature.properties, "_surface", { enumerable: false, configurable: true, get: () => { - const sqMeters = ""+ GeoOperations.surfaceAreaInSqMeters(feature); + const sqMeters = "" + GeoOperations.surfaceAreaInSqMeters(feature); delete feature.properties["_surface"] feature.properties["_surface"] = sqMeters; return sqMeters @@ -108,7 +125,7 @@ export default class SimpleMetaTagger { return sqMetersHa } }) - + return true; }) ); @@ -219,8 +236,8 @@ export default class SimpleMetaTagger { // isOpen is irrelevant return false } - - Object.defineProperty(feature.properties, "_isOpen",{ + + Object.defineProperty(feature.properties, "_isOpen", { enumerable: false, configurable: true, get: () => { @@ -247,7 +264,7 @@ export default class SimpleMetaTagger { if (oldNextChange > (new Date()).getTime() && tags["_isOpen:oldvalue"] === tags["opening_hours"] - && tags["_isOpen"] !== undefined) { + && tags["_isOpen"] !== undefined) { // Already calculated and should not yet be triggered return false; } @@ -354,37 +371,117 @@ export default class SimpleMetaTagger { SimpleMetaTagger.isOpen, SimpleMetaTagger.directionSimplified, SimpleMetaTagger.currentTime, - SimpleMetaTagger.objectMetaInfo + SimpleMetaTagger.objectMetaInfo, + SimpleMetaTagger.noBothButLeftRight ]; - public static readonly lazyTags: string[] = [].concat(...SimpleMetaTagger.metatags.filter(tagger => tagger.isLazy) - .map(tagger => tagger.keys)); - public readonly keys: string[]; public readonly doc: string; public readonly isLazy: boolean; public readonly includesDates: boolean public readonly applyMetaTagsOnFeature: (feature: any, freshness: Date, layer: LayerConfig) => boolean; + + public static readonly lazyTags: string[] = [].concat(...SimpleMetaTagger.metatags.filter(tagger => tagger.isLazy) + .map(tagger => tagger.keys)); /*** * A function that adds some extra data to a feature * @param docs: what does this extra data do? * @param f: apply the changes. Returns true if something changed */ - constructor(docs: { keys: string[], doc: string, includesDates?: boolean, isLazy?: boolean }, + constructor(docs: { keys: string[], doc: string, includesDates?: boolean, isLazy?: boolean, cleanupRetagger?: boolean }, f: ((feature: any, freshness: Date, layer: LayerConfig) => boolean)) { this.keys = docs.keys; this.doc = docs.doc; this.isLazy = docs.isLazy this.applyMetaTagsOnFeature = f; this.includesDates = docs.includesDates ?? false; - for (const key of docs.keys) { - if (!key.startsWith('_') && key.toLowerCase().indexOf("theme") < 0) { - throw `Incorrect metakey ${key}: it should start with underscore (_)` + if (!docs.cleanupRetagger) { + for (const key of docs.keys) { + if (!key.startsWith('_') && key.toLowerCase().indexOf("theme") < 0) { + throw `Incorrect metakey ${key}: it should start with underscore (_)` + } } } } + /** + * Edits the given object to rewrite 'both'-tagging into a 'left-right' tagging scheme. + * These changes are performed in-place. + * + * Returns 'true' is at least one change has been made + * @param tags + */ + public static removeBothTagging(tags: any): boolean { + let somethingChanged = false + + /** + * Sets the key onto the properties (but doesn't overwrite if already existing) + */ + function set(k, value) { + if (tags[k] === undefined || tags[k] === "") { + tags[k] = value + somethingChanged = true + } + } + + if (tags["sidewalk"]) { + + const v = tags["sidewalk"] + switch (v) { + case "none": + case "no": + set("sidewalk:left", "no"); + set("sidewalk:right", "no"); + break + case "both": + set("sidewalk:left", "yes"); + set("sidewalk:right", "yes"); + break; + case "left": + set("sidewalk:left", "yes"); + set("sidewalk:right", "no"); + break; + case "right": + set("sidewalk:left", "no"); + set("sidewalk:right", "yes"); + break; + default: + set("sidewalk:left", v); + set("sidewalk:right", v); + break; + } + delete tags["sidewalk"] + somethingChanged = true + } + + + const regex = /\([^:]*\):both:\(.*\)/ + for (const key in tags) { + const v = tags[key] + if (key.endsWith(":both")) { + const strippedKey = key.substring(0, key.length - ":both".length) + set(strippedKey + ":left", v) + set(strippedKey + ":right", v) + delete tags[key] + continue + } + + const match = key.match(regex) + if (match !== null) { + const strippedKey = match[1] + const property = match[1] + set(strippedKey + ":left:" + property, v) + set(strippedKey + ":right:" + property, v) + console.log("Left-right rewritten " + key) + delete tags[key] + } + } + + + return somethingChanged + } + public static HelpText(): BaseUIElement { const subElements: (string | BaseUIElement)[] = [ new Combine([ diff --git a/Logic/State/ElementsState.ts b/Logic/State/ElementsState.ts index 241badaa2b..345ada2443 100644 --- a/Logic/State/ElementsState.ts +++ b/Logic/State/ElementsState.ts @@ -11,11 +11,12 @@ import {Utils} from "../../Utils"; import ChangeToElementsActor from "../Actors/ChangeToElementsActor"; import PendingChangesUploader from "../Actors/PendingChangesUploader"; import TitleHandler from "../Actors/TitleHandler"; +import FeatureSource from "../FeatureSource/FeatureSource"; /** * The part of the state keeping track of where the elements, loading them, configuring the feature pipeline etc */ -export default class ElementsState extends FeatureSwitchState{ +export default class ElementsState extends FeatureSwitchState { /** The mapping from id -> UIEventSource @@ -24,7 +25,7 @@ export default class ElementsState extends FeatureSwitchState{ /** THe change handler */ - public changes: Changes = new Changes(); + public changes: Changes; /** The latest element that was selected @@ -34,7 +35,7 @@ export default class ElementsState extends FeatureSwitchState{ "Selected element" ); - + /** * The map location: currently centered lat, lon and zoom */ @@ -48,6 +49,8 @@ export default class ElementsState extends FeatureSwitchState{ constructor(layoutToUse: LayoutConfig) { super(layoutToUse); + + this.changes = new Changes(layoutToUse?.isLeftRightSensitive() ?? false) { // -- Location control initialization const zoom = UIEventSource.asFloat( @@ -84,10 +87,10 @@ export default class ElementsState extends FeatureSwitchState{ lon.setData(latlonz.lon); }); } - + new ChangeToElementsActor(this.changes, this.allElements) new PendingChangesUploader(this.changes, this.selectedElement); new TitleHandler(this); - + } } \ No newline at end of file diff --git a/Logic/State/FeaturePipelineState.ts b/Logic/State/FeaturePipelineState.ts index 53f21341b7..96a29beb6f 100644 --- a/Logic/State/FeaturePipelineState.ts +++ b/Logic/State/FeaturePipelineState.ts @@ -97,7 +97,7 @@ export default class FeaturePipelineState extends MapState { }, this ); new SelectedFeatureHandler(Hash.hash, this) - + this.AddClusteringToMap(this.leafletMap) } diff --git a/Logic/State/FeatureSwitchState.ts b/Logic/State/FeatureSwitchState.ts index 0f5df51f78..32aca82949 100644 --- a/Logic/State/FeatureSwitchState.ts +++ b/Logic/State/FeatureSwitchState.ts @@ -37,7 +37,7 @@ export default class FeatureSwitchState { public readonly osmApiTileSize: UIEventSource; public readonly backgroundLayerId: UIEventSource; - protected constructor(layoutToUse: LayoutConfig) { + public constructor(layoutToUse: LayoutConfig) { this.layoutToUse = layoutToUse; @@ -146,7 +146,7 @@ export default class FeatureSwitchState { this.featureSwitchIsTesting = QueryParameters.GetBooleanQueryParameter( "test", - ""+testingDefaultValue, + "" + testingDefaultValue, "If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org" ) @@ -158,7 +158,7 @@ export default class FeatureSwitchState { this.featureSwitchFakeUser = QueryParameters.GetBooleanQueryParameter("fake-user", "false", "If true, 'dryrun' mode is activated and a fake user account is loaded") - + this.overpassUrl = QueryParameters.GetQueryParameter("overpassUrl", (layoutToUse?.overpassUrl ?? Constants.defaultOverpassUrls).join(","), diff --git a/Logic/State/MapState.ts b/Logic/State/MapState.ts index 00a05dd61c..b57461699a 100644 --- a/Logic/State/MapState.ts +++ b/Logic/State/MapState.ts @@ -14,6 +14,8 @@ import {QueryParameters} from "../Web/QueryParameters"; import * as personal from "../../assets/themes/personal/personal.json"; import FilterConfig from "../../Models/ThemeConfig/FilterConfig"; import ShowOverlayLayer from "../../UI/ShowDataLayer/ShowOverlayLayer"; +import {FeatureSourceForLayer, Tiled} from "../FeatureSource/FeatureSource"; +import SimpleFeatureSource from "../FeatureSource/Sources/SimpleFeatureSource"; /** * Contains all the leaflet-map related state @@ -44,13 +46,17 @@ export default class MapState extends UserRelatedState { /** * The location as delivered by the GPS */ - public currentGPSLocation: UIEventSource<{ - latlng: { lat: number; lng: number }; - accuracy: number; - }> = new UIEventSource<{ - latlng: { lat: number; lng: number }; - accuracy: number; - }>(undefined); + public currentUserLocation: FeatureSourceForLayer & Tiled; + + /** + * All previously visited points + */ + public historicalUserLocations: FeatureSourceForLayer & Tiled; + + /** + * A feature source containing the current home location of the user + */ + public homeLocation: FeatureSourceForLayer & Tiled public readonly mainMapObject: BaseUIElement & MinimapObj; @@ -126,9 +132,27 @@ export default class MapState extends UserRelatedState { this.lockBounds() this.AddAllOverlaysToMap(this.leafletMap) + + this.initHomeLocation() + this.initGpsLocation() + this.initUserLocationTrail() } + public AddAllOverlaysToMap(leafletMap: UIEventSource) { + const initialized = new Set() + for (const overlayToggle of this.overlayToggles) { + new ShowOverlayLayer(overlayToggle.config, leafletMap, overlayToggle.isDisplayed) + initialized.add(overlayToggle.config) + } + for (const tileLayerSource of this.layoutToUse.tileLayerSources) { + if (initialized.has(tileLayerSource)) { + continue + } + new ShowOverlayLayer(tileLayerSource, leafletMap) + } + + } private lockBounds() { const layout = this.layoutToUse; @@ -156,9 +180,91 @@ export default class MapState extends UserRelatedState { }) } } + + private initGpsLocation(){ + // Initialize the gps layer data. This is emtpy for now, the actual writing happens in the Geolocationhandler + let gpsLayerDef: FilteredLayer = this.filteredLayers.data.filter(l => l.layerDef.id === "gps_location")[0] + this.currentUserLocation = new SimpleFeatureSource(gpsLayerDef, Tiles.tile_index(0, 0, 0)); + } + + private initUserLocationTrail(){ + const histCoordinates = [] + let lineFeature = { + type:"Feature", + geometry:{ + type: "LineString", + coordinates: histCoordinates + }, + properties:{ + "user:location":"yes", + "id":"gps_track" + } + } + const features = new UIEventSource<{feature: any, freshness: Date}[]>([], "gps_track") + let i = 0 + this.currentUserLocation.features.addCallbackAndRunD(([location]) => { + if(location === undefined){ + return; + } + const feature = JSON.parse(JSON.stringify(location.feature)) + feature.properties.id = "gps/"+i + i++ + features.data.push({feature, freshness: new Date()}) + histCoordinates.push(feature.geometry.coordinates) + + if(lineFeature !== undefined && lineFeature.geometry.coordinates.length >= 2){ + features.data.push({feature: lineFeature, freshness: new Date()}) + lineFeature = undefined + } + + features.ping() + }) + + + let gpsLayerDef: FilteredLayer = this.filteredLayers.data.filter(l => l.layerDef.id === "gps_track")[0] + this.historicalUserLocations = new SimpleFeatureSource(gpsLayerDef, Tiles.tile_index(0, 0, 0), features); + this.changes.useLocationHistory(this) + } + + private initHomeLocation() { + const empty = [] + const feature = UIEventSource.ListStabilized(this.osmConnection.userDetails.map(userDetails => { + + if (userDetails === undefined) { + return undefined; + } + const home = userDetails.home; + if (home === undefined) { + return undefined; + } + return [home.lon, home.lat] + })).map(homeLonLat => { + if (homeLonLat === undefined) { + return empty + } + return [{ + feature: { + "type": "Feature", + "properties": { + "id":"home", + "user:home": "yes", + "_lon": homeLonLat[0], + "_lat": homeLonLat[1] + }, + "geometry": { + "type": "Point", + "coordinates": homeLonLat + } + }, freshness: new Date() + }] + }) + + const flayer = this.filteredLayers.data.filter(l => l.layerDef.id === "home_location")[0] + this.homeLocation = new SimpleFeatureSource(flayer, Tiles.tile_index(0, 0, 0), feature) + + } private InitializeFilteredLayers() { - // Initialize the filtered layers state const layoutToUse = this.layoutToUse; const empty = [] @@ -206,21 +312,5 @@ export default class MapState extends UserRelatedState { return new UIEventSource(flayers); } - public AddAllOverlaysToMap(leafletMap: UIEventSource) { - const initialized = new Set() - for (const overlayToggle of this.overlayToggles) { - new ShowOverlayLayer(overlayToggle.config, leafletMap, overlayToggle.isDisplayed) - initialized.add(overlayToggle.config) - } - - for (const tileLayerSource of this.layoutToUse.tileLayerSources) { - if (initialized.has(tileLayerSource)) { - continue - } - new ShowOverlayLayer(tileLayerSource, leafletMap) - } - - } - } \ No newline at end of file diff --git a/Logic/State/UserRelatedState.ts b/Logic/State/UserRelatedState.ts index 68c32351aa..19d1eba858 100644 --- a/Logic/State/UserRelatedState.ts +++ b/Logic/State/UserRelatedState.ts @@ -11,6 +11,7 @@ import ElementsState from "./ElementsState"; import SelectedElementTagsUpdater from "../Actors/SelectedElementTagsUpdater"; import StaticFeatureSource from "../FeatureSource/Sources/StaticFeatureSource"; import FeatureSource from "../FeatureSource/FeatureSource"; +import {Feature} from "@turf/turf"; /** * The part of the state which keeps track of user-related stuff, e.g. the OSM-connection, @@ -36,10 +37,7 @@ export default class UserRelatedState extends ElementsState { * WHich other themes the user previously visited */ public installedThemes: UIEventSource<{ layout: LayoutConfig; definition: string }[]>; - /** - * A feature source containing the current home location of the user - */ - public homeLocation: FeatureSource + constructor(layoutToUse: LayoutConfig) { super(layoutToUse); @@ -64,7 +62,7 @@ export default class UserRelatedState extends ElementsState { if (layoutToUse?.hideFromOverview) { this.osmConnection.isLoggedIn.addCallbackAndRunD(loggedIn => { - if(loggedIn){ + if (loggedIn) { this.osmConnection .GetPreference("hidden-theme-" + layoutToUse?.id + "-enabled") .setData("true"); @@ -88,7 +86,6 @@ export default class UserRelatedState extends ElementsState { this.InitializeLanguage(); - this.initHomeLocation() new SelectedElementTagsUpdater(this) } @@ -116,37 +113,4 @@ export default class UserRelatedState extends ElementsState { .ping(); } - private initHomeLocation() { - const empty = [] - const feature = UIEventSource.ListStabilized(this.osmConnection.userDetails.map(userDetails => { - - if (userDetails === undefined) { - return undefined; - } - const home = userDetails.home; - if (home === undefined) { - return undefined; - } - return [home.lon, home.lat] - })).map(homeLonLat => { - if(homeLonLat === undefined){ - return empty - } - return [{ - "type": "Feature", - "properties": { - "user:home": "yes", - "_lon": homeLonLat[0], - "_lat": homeLonLat[1] - }, - "geometry": { - "type": "Point", - "coordinates": homeLonLat - } - }] - }) - - this.homeLocation = new StaticFeatureSource(feature, false) - } - } \ No newline at end of file diff --git a/Logic/Tags/RegexTag.ts b/Logic/Tags/RegexTag.ts index 68840188b3..8e120cb718 100644 --- a/Logic/Tags/RegexTag.ts +++ b/Logic/Tags/RegexTag.ts @@ -19,7 +19,7 @@ export class RegexTag extends TagsFilter { if (fromTag === undefined) { return; } - if(typeof fromTag === "number"){ + if (typeof fromTag === "number") { fromTag = "" + fromTag; } if (typeof possibleRegex === "string") { @@ -47,11 +47,11 @@ export class RegexTag extends TagsFilter { } matchesProperties(tags: any): boolean { - if(typeof this.key === "string"){ + if (typeof this.key === "string") { const value = tags[this.key] ?? "" return RegexTag.doesMatch(value, this.value) != this.invert; } - + for (const key in tags) { if (key === undefined) { continue; diff --git a/Logic/Tags/TagUtils.ts b/Logic/Tags/TagUtils.ts index 06949c570e..dd54d011a3 100644 --- a/Logic/Tags/TagUtils.ts +++ b/Logic/Tags/TagUtils.ts @@ -19,16 +19,6 @@ export class TagUtils { [">", (a, b) => a > b], ] - static ApplyTemplate(template: string, tags: any): string { - for (const k in tags) { - while (template.indexOf("{" + k + "}") >= 0) { - const escaped = tags[k].replace(//g, '>'); - template = template.replace("{" + k + "}", escaped); - } - } - return template; - } - static KVtoProperties(tags: Tag[]): any { const properties = {}; for (const tag of tags) { @@ -37,6 +27,14 @@ export class TagUtils { return properties; } + static changeAsProperties(kvs: { k: string, v: string }[]): any { + const tags = {} + for (const kv of kvs) { + tags[kv.k] = kv.v + } + return tags + } + /** * Given two hashes of {key --> values[]}, makes sure that every neededTag is present in availableTags */ diff --git a/Logic/UIEventSource.ts b/Logic/UIEventSource.ts index 571c74f8e3..bb862a94a8 100644 --- a/Logic/UIEventSource.ts +++ b/Logic/UIEventSource.ts @@ -1,5 +1,4 @@ import {Utils} from "../Utils"; -import * as Events from "events"; export class UIEventSource { @@ -75,27 +74,6 @@ export class UIEventSource { promise?.catch(err => console.warn("Promise failed:", err)) return src } - - public AsPromise(): Promise{ - const self = this; - return new Promise((resolve, reject) => { - if(self.data !== undefined){ - resolve(self.data) - }else{ - self.addCallbackD(data => { - resolve(data) - return true; // return true to unregister as we only need to be called once - }) - } - }) - } - - public WaitForPromise(promise: Promise, onFail: ((any) => void)): UIEventSource { - const self = this; - promise?.then(d => self.setData(d)) - promise?.catch(err =>onFail(err)) - return this - } /** * Converts a promise into a UIVentsource, sets the UIEVentSource when the result is calculated. @@ -154,6 +132,57 @@ export class UIEventSource { return stable } + public static asFloat(source: UIEventSource): UIEventSource { + return source.map( + (str) => { + let parsed = parseFloat(str); + return isNaN(parsed) ? undefined : parsed; + }, + [], + (fl) => { + if (fl === undefined || isNaN(fl)) { + return undefined; + } + return ("" + fl).substr(0, 8); + } + ) + } + + public AsPromise(): Promise { + const self = this; + return new Promise((resolve, reject) => { + if (self.data !== undefined) { + resolve(self.data) + } else { + self.addCallbackD(data => { + resolve(data) + return true; // return true to unregister as we only need to be called once + }) + } + }) + } + + public WaitForPromise(promise: Promise, onFail: ((any) => void)): UIEventSource { + const self = this; + promise?.then(d => self.setData(d)) + promise?.catch(err => onFail(err)) + return this + } + + public withEqualityStabilized(comparator: (t: T | undefined, t1: T | undefined) => boolean): UIEventSource { + let oldValue = undefined; + return this.map(v => { + if (v == oldValue) { + return oldValue + } + if (comparator(oldValue, v)) { + return oldValue + } + oldValue = v; + return v; + }) + } + /** * Adds a callback * @@ -220,14 +249,14 @@ export class UIEventSource { sink.setData(null) } else if (newEventSource === undefined) { sink.setData(undefined) - }else if (!seenEventSources.has(newEventSource)) { + } else if (!seenEventSources.has(newEventSource)) { seenEventSources.add(newEventSource) newEventSource.addCallbackAndRun(resultData => { if (mapped.data === newEventSource) { sink.setData(resultData); } }) - }else{ + } else { // Already seen, so we don't have to add a callback, just update the value sink.setData(newEventSource.data) } @@ -286,7 +315,7 @@ export class UIEventSource { } public stabilized(millisToStabilize): UIEventSource { - if(Utils.runningFromConsole){ + if (Utils.runningFromConsole) { return this; } @@ -321,20 +350,4 @@ export class UIEventSource { } }) } - - public static asFloat(source: UIEventSource): UIEventSource { - return source.map( - (str) => { - let parsed = parseFloat(str); - return isNaN(parsed) ? undefined : parsed; - }, - [], - (fl) => { - if (fl === undefined || isNaN(fl)) { - return undefined; - } - return ("" + fl).substr(0, 8); - } - ) - } } \ No newline at end of file diff --git a/Logic/Web/QueryParameters.ts b/Logic/Web/QueryParameters.ts index 8af95a69bd..6a34e46bbd 100644 --- a/Logic/Web/QueryParameters.ts +++ b/Logic/Web/QueryParameters.ts @@ -55,8 +55,8 @@ export class QueryParameters { return source; } - public static GetBooleanQueryParameter(key: string, deflt: string, documentation?: string): UIEventSource{ - return QueryParameters.GetQueryParameter(key, deflt, documentation).map(str => str === "true", [], b => ""+b) + public static GetBooleanQueryParameter(key: string, deflt: string, documentation?: string): UIEventSource { + return QueryParameters.GetQueryParameter(key, deflt, documentation).map(str => str === "true", [], b => "" + b) } public static GenerateQueryParameterDocs(): string { diff --git a/Logic/Web/Wikidata.ts b/Logic/Web/Wikidata.ts index 3a597a6fa2..376766472a 100644 --- a/Logic/Web/Wikidata.ts +++ b/Logic/Web/Wikidata.ts @@ -64,11 +64,11 @@ export class WikidataResponse { } static extractClaims(claimsJson: any): Map> { - - const simplified = wds.simplify.claims(claimsJson, { + + const simplified = wds.simplify.claims(claimsJson, { timeConverter: 'simple-day' }) - + const claims = new Map>(); for (const claimId in simplified) { const claimsList: any[] = simplified[claimId] @@ -98,11 +98,11 @@ export class WikidataLexeme { for (const sense of json.senses) { const glosses = sense.glosses for (const language in glosses) { - let previousSenses = this.senses.get(language) - if(previousSenses === undefined){ + let previousSenses = this.senses.get(language) + if (previousSenses === undefined) { previousSenses = "" - }else{ - previousSenses = previousSenses+"; " + } else { + previousSenses = previousSenses + "; " } this.senses.set(language, previousSenses + glosses[language].value ?? "") } @@ -172,7 +172,7 @@ export default class Wikidata { lang + "&type=item&origin=*" + "&props=";// props= removes some unused values in the result - const response = await Utils.downloadJson(url) + const response = await Utils.downloadJsonCached(url, 10000) const result: any[] = response.search @@ -192,6 +192,7 @@ export default class Wikidata { return result; } + public static async searchAndFetch( search: string, options?: WikidataSearchoptions @@ -247,7 +248,7 @@ export default class Wikidata { for (const identifierPrefix of Wikidata._identifierPrefixes) { if (value.startsWith(identifierPrefix)) { const trimmed = value.substring(identifierPrefix.length); - if(trimmed === ""){ + if (trimmed === "") { return undefined } const n = Number(trimmed) @@ -265,14 +266,14 @@ export default class Wikidata { return undefined; } - public static IdToArticle(id: string){ - if(id.startsWith("Q")){ - return "https://wikidata.org/wiki/"+id + public static IdToArticle(id: string) { + if (id.startsWith("Q")) { + return "https://wikidata.org/wiki/" + id } - if(id.startsWith("L")){ - return "https://wikidata.org/wiki/Lexeme:"+id + if (id.startsWith("L")) { + return "https://wikidata.org/wiki/Lexeme:" + id } - throw "Unknown id type: "+id + throw "Unknown id type: " + id } /** @@ -287,8 +288,8 @@ export default class Wikidata { } const url = "https://www.wikidata.org/wiki/Special:EntityData/" + id + ".json"; - const entities = (await Utils.downloadJson(url)).entities - const firstKey = Array.from(Object.keys(entities))[0] // Roundabout way to fetch the entity; it might have been a redirect + const entities = (await Utils.downloadJsonCached(url, 10000)).entities + const firstKey = Array.from(Object.keys(entities))[0] // Roundabout way to fetch the entity; it might have been a redirect const response = entities[firstKey] if (id.startsWith("L")) { diff --git a/Logic/Web/Wikimedia.ts b/Logic/Web/Wikimedia.ts index 8aa34068ec..56ad0596b1 100644 --- a/Logic/Web/Wikimedia.ts +++ b/Logic/Web/Wikimedia.ts @@ -9,8 +9,8 @@ export default class Wikimedia { * @param continueParameter: if the page indicates that more pages should be loaded, this uses a token to continue. Provided by wikimedia */ public static async GetCategoryContents(categoryName: string, - maxLoad = 10, - continueParameter: string = undefined): Promise { + maxLoad = 10, + continueParameter: string = undefined): Promise { if (categoryName === undefined || categoryName === null || categoryName === "") { return []; } diff --git a/Logic/Web/Wikipedia.ts b/Logic/Web/Wikipedia.ts index ede8e608d8..3a548ee57f 100644 --- a/Logic/Web/Wikipedia.ts +++ b/Logic/Web/Wikipedia.ts @@ -14,7 +14,7 @@ export default class Wikipedia { private static readonly classesToRemove = [ "shortdescription", "sidebar", - "infobox","infobox_v2", + "infobox", "infobox_v2", "noprint", "ambox", "mw-editsection", @@ -22,26 +22,27 @@ export default class Wikipedia { "mw-empty-elt", "hatnote" // Often redirects ] - + private static readonly idsToRemove = [ "sjabloon_zie" ] private static readonly _cache = new Map>() - + public static GetArticle(options: { pageName: string, - language?: "en" | string}): UIEventSource<{ success: string } | { error: any }>{ - const key = (options.language ?? "en")+":"+options.pageName + language?: "en" | string + }): UIEventSource<{ success: string } | { error: any }> { + const key = (options.language ?? "en") + ":" + options.pageName const cached = Wikipedia._cache.get(key) - if(cached !== undefined){ + if (cached !== undefined) { return cached } const v = UIEventSource.FromPromiseWithErr(Wikipedia.GetArticleAsync(options)) Wikipedia._cache.set(key, v) return v; } - + public static async GetArticleAsync(options: { pageName: string, language?: "en" | string @@ -57,24 +58,22 @@ export default class Wikipedia { const content = Array.from(div.children)[0] for (const forbiddenClass of Wikipedia.classesToRemove) { - const toRemove = content.getElementsByClassName(forbiddenClass) + const toRemove = content.getElementsByClassName(forbiddenClass) for (const toRemoveElement of Array.from(toRemove)) { toRemoveElement.parentElement?.removeChild(toRemoveElement) } } for (const forbiddenId of Wikipedia.idsToRemove) { - const toRemove = content.querySelector("#"+forbiddenId) + const toRemove = content.querySelector("#" + forbiddenId) toRemove?.parentElement?.removeChild(toRemove) } - - + const links = Array.from(content.getElementsByTagName("a")) // Rewrite relative links to absolute links + open them in a new tab - links.filter(link => link.getAttribute("href")?.startsWith("/") ?? false). - forEach(link => { + links.filter(link => link.getAttribute("href")?.startsWith("/") ?? false).forEach(link => { link.target = '_blank' // note: link.getAttribute("href") gets the textual value, link.href is the rewritten version which'll contain the host for relative paths link.href = `https://${language}.wikipedia.org${link.getAttribute("href")}`; diff --git a/Models/Constants.ts b/Models/Constants.ts index 59857d108b..79a55ca9bf 100644 --- a/Models/Constants.ts +++ b/Models/Constants.ts @@ -2,7 +2,7 @@ import {Utils} from "../Utils"; export default class Constants { - public static vNumber = "0.11.3"; + public static vNumber = "0.12.7"; public static ImgurApiKey = '7070e7167f0a25a' public static readonly mapillary_client_token_v3 = 'TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2' public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85" @@ -17,7 +17,6 @@ export default class Constants { // Doesn't support nwr: "https://overpass.openstreetmap.fr/api/interpreter" ] - // The user journey states thresholds when a new feature gets unlocked public static userJourney = { @@ -40,6 +39,19 @@ export default class Constants { * (Note that pendingChanges might upload sooner if the popup is closed or similar) */ static updateTimeoutSec: number = 30; + /** + * If the contributor has their GPS location enabled and makes a change, + * the points visited less then `nearbyVisitTime`-seconds ago will be inspected. + * The point closest to the changed feature will be considered and this distance will be tracked. + * ALl these distances are used to calculate a nearby-score + */ + static nearbyVisitTime: number= 30 * 60; + /** + * If a user makes a change, the distance to the changed object is calculated. + * If a user makes multiple changes, all these distances are put into multiple bins, depending on this distance. + * For every bin, the totals are uploaded as metadata + */ + static distanceToChangeObjectBins = [25,50,100,500,1000,5000] private static isRetina(): boolean { if (Utils.runningFromConsole) { diff --git a/Models/Denomination.ts b/Models/Denomination.ts index 04e4077d7a..d79118f519 100644 --- a/Models/Denomination.ts +++ b/Models/Denomination.ts @@ -44,13 +44,13 @@ export class Denomination { get human(): Translation { return this._human.Clone() } - + get humanSingular(): Translation { return (this._humanSingular ?? this._human).Clone() } - - getToggledHuman(isSingular: UIEventSource): BaseUIElement{ - if(this._humanSingular === undefined){ + + getToggledHuman(isSingular: UIEventSource): BaseUIElement { + if (this._humanSingular === undefined) { return this.human } return new Toggle( @@ -59,7 +59,7 @@ export class Denomination { isSingular ) } - + public canonicalValue(value: string, actAsDefault?: boolean) { if (value === undefined) { return undefined; @@ -68,12 +68,12 @@ export class Denomination { if (stripped === null) { return null; } - if(stripped === "1" && this._canonicalSingular !== undefined){ - return "1 "+this._canonicalSingular + if (stripped === "1" && this._canonicalSingular !== undefined) { + return "1 " + this._canonicalSingular } return stripped + " " + this.canonical; } - + /** * Returns the core value (without unit) if: * - the value ends with the canonical or an alternative value (or begins with if prefix is set) @@ -89,30 +89,31 @@ export class Denomination { value = value.toLowerCase() const self = this; - function startsWith(key){ - if(self.prefix){ + + function startsWith(key) { + if (self.prefix) { return value.startsWith(key) - }else{ + } else { return value.endsWith(key) } } - - function substr(key){ - if(self.prefix){ + + function substr(key) { + if (self.prefix) { return value.substr(key.length).trim() - }else{ + } else { return value.substring(0, value.length - key.length).trim() } } - - if(this.canonical !== "" && startsWith(this.canonical.toLowerCase())){ + + if (this.canonical !== "" && startsWith(this.canonical.toLowerCase())) { return substr(this.canonical) - } - - if(this._canonicalSingular !== undefined && this._canonicalSingular !== "" && startsWith(this._canonicalSingular)){ + } + + if (this._canonicalSingular !== undefined && this._canonicalSingular !== "" && startsWith(this._canonicalSingular)) { return substr(this._canonicalSingular) } - + for (const alternativeValue of this.alternativeDenominations) { if (startsWith(alternativeValue)) { return substr(alternativeValue); diff --git a/Models/FilteredLayer.ts b/Models/FilteredLayer.ts index 68ffb44832..f57cea8919 100644 --- a/Models/FilteredLayer.ts +++ b/Models/FilteredLayer.ts @@ -1,10 +1,9 @@ import {UIEventSource} from "../Logic/UIEventSource"; import LayerConfig from "./ThemeConfig/LayerConfig"; -import {And} from "../Logic/Tags/And"; import FilterConfig from "./ThemeConfig/FilterConfig"; export default interface FilteredLayer { readonly isDisplayed: UIEventSource; - readonly appliedFilters: UIEventSource<{filter: FilterConfig, selected: number}[]>; + readonly appliedFilters: UIEventSource<{ filter: FilterConfig, selected: number }[]>; readonly layerDef: LayerConfig; } \ No newline at end of file diff --git a/Models/ThemeConfig/FilterConfig.ts b/Models/ThemeConfig/FilterConfig.ts index 7a032c6de3..833ae50500 100644 --- a/Models/ThemeConfig/FilterConfig.ts +++ b/Models/ThemeConfig/FilterConfig.ts @@ -18,7 +18,7 @@ export default class FilterConfig { if (json.id === undefined) { throw `A filter without id was found at ${context}` } - if(json.id.match(/^[a-zA-Z0-9_-]*$/) === null){ + if (json.id.match(/^[a-zA-Z0-9_-]*$/) === null) { throw `A filter with invalid id was found at ${context}. Ids should only contain letters, numbers or - _` } @@ -42,9 +42,9 @@ export default class FilterConfig { return {question: question, osmTags: osmTags}; }); - - if(this.options.length > 1 && this.options[0].osmTags["and"]?.length !== 0){ - throw "Error in "+context+"."+this.id+": the first option of a multi-filter should always be the 'reset' option and not have any filters" + + if (this.options.length > 1 && this.options[0].osmTags["and"]?.length !== 0) { + throw "Error in " + context + "." + this.id + ": the first option of a multi-filter should always be the 'reset' option and not have any filters" } } } \ No newline at end of file diff --git a/Models/ThemeConfig/Json/LayerConfigJson.ts b/Models/ThemeConfig/Json/LayerConfigJson.ts index c15c90d4a1..c45548bb9c 100644 --- a/Models/ThemeConfig/Json/LayerConfigJson.ts +++ b/Models/ThemeConfig/Json/LayerConfigJson.ts @@ -4,6 +4,8 @@ import FilterConfigJson from "./FilterConfigJson"; import {DeleteConfigJson} from "./DeleteConfigJson"; import UnitConfigJson from "./UnitConfigJson"; import MoveConfigJson from "./MoveConfigJson"; +import PointRenderingConfigJson from "./PointRenderingConfigJson"; +import LineRenderingConfigJson from "./LineRenderingConfigJson"; /** * Configuration for a single layer @@ -62,14 +64,14 @@ export interface LayerConfigJson { * NOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: "key=value"} * While still supported, this is considered deprecated */ - source: ({ osmTags: AndOrTagConfigJson | string, overpassScript?: string } | + source: ({ osmTags: AndOrTagConfigJson | string, overpassScript?: string } | { osmTags: AndOrTagConfigJson | string, geoJson: string, geoJsonZoomLevel?: number, isOsmCache?: boolean, mercatorCrs?: boolean }) & ({ /** * The maximum amount of seconds that a tile is allowed to linger in the cache */ maxCacheAge?: number }) - + /** * * A list of extra tags to calculate, specified as "keyToAssignTo=javascript-expression". @@ -91,8 +93,8 @@ export interface LayerConfigJson { /** * This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view. - * This is useful to hide certain features from view. - * + * This is useful to hide certain features from view. + * * Important: hiding features does not work dynamically, but is only calculated when the data is first renders. * This implies that it is not possible to hide a feature after a tagging change * @@ -126,72 +128,8 @@ export interface LayerConfigJson { */ titleIcons?: (string | TagRenderingConfigJson)[]; - /** - * The icon for an element. - * Note that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets. - * - * The result of the icon is rendered as follows: - * the resulting string is interpreted as a _list_ of items, separated by ";". The bottommost layer is the first layer. - * As a result, on could use a generic pin, then overlay it with a specific icon. - * To make things even more practical, one can use all SVG's from the folder "assets/svg" and _substitute the color_ in it. - * E.g. to draw a red pin, use "pin:#f00", to have a green circle with your icon on top, use `circle:#0f0;` - * - */ - icon?: string | TagRenderingConfigJson; - /** - * IconsOverlays are a list of extra icons/badges to overlay over the icon. - * The 'badge'-toggle changes their behaviour. - * If badge is set, it will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout. - * If badges is false, it'll be a simple overlay - * - * Note: strings are interpreted as icons, so layering and substituting is supported - */ - iconOverlays?: { if: string | AndOrTagConfigJson, then: string | TagRenderingConfigJson, badge?: boolean }[] - - /** - * A string containing "width,height" or "width,height,anchorpoint" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ... - * Default is '40,40,center' - */ - iconSize?: string | TagRenderingConfigJson; - /** - * The rotation of an icon, useful for e.g. directions. - * Usage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)`` - */ - rotation?: string | TagRenderingConfigJson; - /** - * A HTML-fragment that is shown below the icon, for example: - *
{name}
- * - * If the icon is undefined, then the label is shown in the center of the feature. - * Note that, if the wayhandling hides the icon then no label is shown as well. - */ - label?: string | TagRenderingConfigJson; - - /** - * The color for way-elements and SVG-elements. - * If the value starts with "--", the style of the body element will be queried for the corresponding variable instead - */ - color?: string | TagRenderingConfigJson; - /** - * The stroke-width for way-elements - */ - width?: string | TagRenderingConfigJson; - - /** - * A dasharray, e.g. "5 6" - * The dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap', - * Default value: "" (empty string == full line) - */ - dashArray?: string | TagRenderingConfigJson - - /** - * Wayhandling: should a way/area be displayed as: - * 0) The way itself - * 1) Only the centerpoint - * 2) The centerpoint and the way - */ - wayHandling?: number; + mapRendering: (PointRenderingConfigJson | LineRenderingConfigJson)[] /** * If set, this layer will pass all the features it receives onto the next layer. @@ -265,8 +203,17 @@ export interface LayerConfigJson { * * A special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox. * + * At last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings. + * This is mainly create questions for a 'left' and a 'right' side of the road. + * These will be grouped and questions will be asked together */ - tagRenderings?: (string | {builtin: string, override: any} | TagRenderingConfigJson) [], + tagRenderings?: (string | { builtin: string, override: any } | TagRenderingConfigJson | { + rewrite: { + sourceString: string, + into: string[] + }[], + renderings: (string | { builtin: string, override: any } | TagRenderingConfigJson)[] + }) [], /** @@ -324,15 +271,15 @@ export interface LayerConfigJson { /** * Indicates if a point can be moved and configures the modalities. - * + * * A feature can be moved by MapComplete if: - * + * * - It is a point * - The point is _not_ part of a way or a a relation. - * + * * Off by default. Can be enabled by setting this flag or by configuring. */ - allowMove?: boolean | MoveConfigJson + allowMove?: boolean | MoveConfigJson /** * IF set, a 'split this road' button is shown diff --git a/Models/ThemeConfig/Json/LayoutConfigJson.ts b/Models/ThemeConfig/Json/LayoutConfigJson.ts index 2b355d5453..27d10823e3 100644 --- a/Models/ThemeConfig/Json/LayoutConfigJson.ts +++ b/Models/ThemeConfig/Json/LayoutConfigJson.ts @@ -1,4 +1,3 @@ -import {TagRenderingConfigJson} from "./TagRenderingConfigJson"; import {LayerConfigJson} from "./LayerConfigJson"; import TilesourceConfigJson from "./TilesourceConfigJson"; @@ -15,7 +14,7 @@ import TilesourceConfigJson from "./TilesourceConfigJson"; * General remark: a type (string | any) indicates either a fixed or a translatable string. */ export interface LayoutConfigJson { - + /** * The id of this layout. * @@ -118,18 +117,6 @@ export interface LayoutConfigJson { * Default: overpassMaxZoom + 1 */ osmApiTileSize?: number - - /** - * A tagrendering depicts how to show some tags or how to show a question for it. - * - * These tagrenderings are applied to _all_ the loaded layers and are a way to reuse tagrenderings. - * Note that if multiple themes are loaded (e.g. via the personal theme) - * that these roamingRenderings are applied to the layers of the OTHER themes too! - * - * In order to prevent them to do too much damage, all the overpass-tags of the layers are taken and combined as OR. - * These tag renderings will only show up if the object matches this filter. - */ - roamingRenderings?: (TagRenderingConfigJson | string)[], /** * An override applied on all layers of the theme. @@ -228,7 +215,7 @@ export interface LayoutConfigJson { */ maxZoom?: number, /** - * The number of elements per tile needed to start clustering + * The number of elements per tile needed to start clustering * If clustering is defined, defaults to 25 */ minNeededElements?: number diff --git a/Models/ThemeConfig/Json/LineRenderingConfigJson.ts b/Models/ThemeConfig/Json/LineRenderingConfigJson.ts new file mode 100644 index 0000000000..2b2606473c --- /dev/null +++ b/Models/ThemeConfig/Json/LineRenderingConfigJson.ts @@ -0,0 +1,54 @@ +import {TagRenderingConfigJson} from "./TagRenderingConfigJson"; + +/** + * The LineRenderingConfig gives all details onto how to render a single line of a feature. + * + * This can be used if: + * + * - The feature is a line + * - The feature is an area + */ +export default interface LineRenderingConfigJson { + + /** + * The color for way-elements and SVG-elements. + * If the value starts with "--", the style of the body element will be queried for the corresponding variable instead + */ + color?: string | TagRenderingConfigJson; + /** + * The stroke-width for way-elements + */ + width?: string | TagRenderingConfigJson; + + /** + * A dasharray, e.g. "5 6" + * The dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap', + * Default value: "" (empty string == full line) + */ + dashArray?: string | TagRenderingConfigJson + + /** + * The form at the end of a line + */ + lineCap?: "round" | "square" | "butt" | string | TagRenderingConfigJson + + /** + * Wehter or not to fill polygons + */ + fill?: "yes" | "no" | TagRenderingConfigJson + + /** + * The color to fill a polygon with. + * If undefined, this will be slightly more opaque version of the stroke line + */ + fillColor?: string | TagRenderingConfigJson + + /** + * The number of pixels this line should be moved. + * Use a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line). + * + * IMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right') + * This simplifies programming. Refer to the CalculatedTags.md-documentation for more details + */ + offset?: number | TagRenderingConfigJson +} \ No newline at end of file diff --git a/Models/ThemeConfig/Json/PointRenderingConfigJson.ts b/Models/ThemeConfig/Json/PointRenderingConfigJson.ts new file mode 100644 index 0000000000..75e6633618 --- /dev/null +++ b/Models/ThemeConfig/Json/PointRenderingConfigJson.ts @@ -0,0 +1,60 @@ +import {TagRenderingConfigJson} from "./TagRenderingConfigJson"; +import {AndOrTagConfigJson} from "./TagConfigJson"; + +/** + * The PointRenderingConfig gives all details onto how to render a single point of a feature. + * + * This can be used if: + * + * - The feature is a point + * - To render something at the centroid of an area, or at the start, end or projected centroid of a way + */ +export default interface PointRenderingConfigJson { + + /** + * All the locations that this point should be rendered at. + * Using `location: ["point", "centroid"] will always render centerpoint + */ + location: ("point" | "centroid" | "start" | "end")[] + + /** + * The icon for an element. + * Note that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets. + * + * The result of the icon is rendered as follows: + * the resulting string is interpreted as a _list_ of items, separated by ";". The bottommost layer is the first layer. + * As a result, on could use a generic pin, then overlay it with a specific icon. + * To make things even more practical, one can use all SVG's from the folder "assets/svg" and _substitute the color_ in it. + * E.g. to draw a red pin, use "pin:#f00", to have a green circle with your icon on top, use `circle:#0f0;` + * + */ + icon?: string | TagRenderingConfigJson; + + /** + * A list of extra badges to show next to the icon as small badge + * They will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout. + * + * Note: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle + */ + iconBadges?: { if: string | AndOrTagConfigJson, then: string | TagRenderingConfigJson }[] + + + /** + * A string containing "width,height" or "width,height,anchorpoint" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ... + * Default is '40,40,center' + */ + iconSize?: string | TagRenderingConfigJson; + /** + * The rotation of an icon, useful for e.g. directions. + * Usage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)`` + */ + rotation?: string | TagRenderingConfigJson; + /** + * A HTML-fragment that is shown below the icon, for example: + *
{name}
+ * + * If the icon is undefined, then the label is shown in the center of the feature. + * Note that, if the wayhandling hides the icon then no label is shown as well. + */ + label?: string | TagRenderingConfigJson; +} \ No newline at end of file diff --git a/Models/ThemeConfig/Json/TagRenderingConfigJson.ts b/Models/ThemeConfig/Json/TagRenderingConfigJson.ts index 58e112f4c8..75f91018cb 100644 --- a/Models/ThemeConfig/Json/TagRenderingConfigJson.ts +++ b/Models/ThemeConfig/Json/TagRenderingConfigJson.ts @@ -8,10 +8,18 @@ export interface TagRenderingConfigJson { /** * The id of the tagrendering, should be an unique string. - * Used to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise + * Used to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise. + * + * Use 'questions' to trigger the question box of this group (if a group is defined) */ id?: string, - + + /** + * If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well. + * The first tagRendering of a group will always be a sticky element. + */ + group?: string + /** * Renders this value. Note that "{key}"-parts are substituted by the corresponding values of the element. * If neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value. @@ -83,13 +91,13 @@ export interface TagRenderingConfigJson { * Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes */ mappings?: { - + /** * If this condition is met, then the text under `then` will be shown. * If no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM. - * + * * For example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'} - * + * * This can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'} */ if: AndOrTagConfigJson | string, @@ -169,7 +177,6 @@ export interface TagRenderingConfigJson { */ ifnot?: AndOrTagConfigJson | string - /** * If chosen as answer, these tags will be applied as well onto the object. * Not compatible with multiAnswer @@ -177,10 +184,4 @@ export interface TagRenderingConfigJson { addExtraTags?: string[] }[] - - /** - * If set to true, this tagRendering will escape the current layer and attach itself to all the other layers too. - * However, it will _only_ be shown if it matches the overpass-tags of the layer it was originally defined in. - */ - roaming?: boolean } \ No newline at end of file diff --git a/Models/ThemeConfig/Json/UnitConfigJson.ts b/Models/ThemeConfig/Json/UnitConfigJson.ts index c8c22afc0a..5eba5eaf49 100644 --- a/Models/ThemeConfig/Json/UnitConfigJson.ts +++ b/Models/ThemeConfig/Json/UnitConfigJson.ts @@ -12,12 +12,11 @@ export default interface UnitConfigJson { /** * The possible denominations */ - applicableUnits:ApplicableUnitJson[] + applicableUnits: ApplicableUnitJson[] } -export interface ApplicableUnitJson -{ +export interface ApplicableUnitJson { /** * The canonical value which will be added to the text. * e.g. "m" for meters @@ -28,8 +27,8 @@ export interface ApplicableUnitJson * The canonical denomination in the case that the unit is precisely '1' */ canonicalDenominationSingular?: string, - - + + /** * A list of alternative values which can occur in the OSM database - used for parsing. */ diff --git a/Models/ThemeConfig/LayerConfig.ts b/Models/ThemeConfig/LayerConfig.ts index 9f49a6c210..34245bd7b7 100644 --- a/Models/ThemeConfig/LayerConfig.ts +++ b/Models/ThemeConfig/LayerConfig.ts @@ -1,30 +1,30 @@ import {Translation} from "../../UI/i18n/Translation"; import SourceConfig from "./SourceConfig"; import TagRenderingConfig from "./TagRenderingConfig"; -import {TagsFilter} from "../../Logic/Tags/TagsFilter"; import PresetConfig from "./PresetConfig"; import {LayerConfigJson} from "./Json/LayerConfigJson"; import Translations from "../../UI/i18n/Translations"; import {TagUtils} from "../../Logic/Tags/TagUtils"; -import SharedTagRenderings from "../../Customizations/SharedTagRenderings"; -import {TagRenderingConfigJson} from "./Json/TagRenderingConfigJson"; -import {Utils} from "../../Utils"; -import {UIEventSource} from "../../Logic/UIEventSource"; -import BaseUIElement from "../../UI/BaseUIElement"; -import {FixedUiElement} from "../../UI/Base/FixedUiElement"; -import Combine from "../../UI/Base/Combine"; -import {VariableUiElement} from "../../UI/Base/VariableUIElement"; import FilterConfig from "./FilterConfig"; import {Unit} from "../Unit"; import DeleteConfig from "./DeleteConfig"; -import Svg from "../../Svg"; -import Img from "../../UI/Base/Img"; import MoveConfig from "./MoveConfig"; +import PointRenderingConfig from "./PointRenderingConfig"; +import WithContextLoader from "./WithContextLoader"; +import LineRenderingConfig from "./LineRenderingConfig"; +import PointRenderingConfigJson from "./Json/PointRenderingConfigJson"; +import LineRenderingConfigJson from "./Json/LineRenderingConfigJson"; +import {TagRenderingConfigJson} from "./Json/TagRenderingConfigJson"; +import {UIEventSource} from "../../Logic/UIEventSource"; +import BaseUIElement from "../../UI/BaseUIElement"; +import Combine from "../../UI/Base/Combine"; +import Title from "../../UI/Base/Title"; +import List from "../../UI/Base/List"; +import Link from "../../UI/Base/Link"; +import {Utils} from "../../Utils"; +import * as icons from "../../assets/tagRenderings/icons.json" -export default class LayerConfig { - static WAYHANDLING_DEFAULT = 0; - static WAYHANDLING_CENTER_ONLY = 1; - static WAYHANDLING_CENTER_AND_WAY = 2; +export default class LayerConfig extends WithContextLoader { id: string; name: Translation; @@ -39,15 +39,10 @@ export default class LayerConfig { maxzoom: number; title?: TagRenderingConfig; titleIcons: TagRenderingConfig[]; - icon: TagRenderingConfig; - iconOverlays: { if: TagsFilter; then: TagRenderingConfig; badge: boolean }[]; - iconSize: TagRenderingConfig; - label: TagRenderingConfig; - rotation: TagRenderingConfig; - color: TagRenderingConfig; - width: TagRenderingConfig; - dashArray: TagRenderingConfig; - wayHandling: number; + + public readonly mapRendering: PointRenderingConfig[] + public readonly lineRendering: LineRenderingConfig[] + public readonly units: Unit[]; public readonly deletion: DeleteConfig | null; public readonly allowMove: MoveConfig | null @@ -67,10 +62,47 @@ export default class LayerConfig { context?: string, official: boolean = true ) { - context = context + "." + json.id; - const self = this; + super(json, context) this.id = json.id; + + if (json.source === undefined) { + throw "Layer " + this.id + " does not define a source section (" + context + ")" + } + + if (json.source.osmTags === undefined) { + throw "Layer " + this.id + " does not define a osmTags in the source section - these should always be present, even for geojson layers (" + context + ")" + + } + + this.maxAgeOfCache = json.source.maxCacheAge ?? 24 * 60 * 60 * 30 + + const osmTags = TagUtils.Tag( + json.source.osmTags, + context + "source.osmTags" + ); + + if (json.source["geoJsonSource"] !== undefined) { + throw context + "Use 'geoJson' instead of 'geoJsonSource'"; + } + + if (json.source["geojson"] !== undefined) { + throw context + "Use 'geoJson' instead of 'geojson' (the J is a capital letter)"; + } + + this.source = new SourceConfig( + { + osmTags: osmTags, + geojsonSource: json.source["geoJson"], + geojsonSourceLevel: json.source["geoJsonZoomLevel"], + overpassScript: json.source["overpassScript"], + isOsmCache: json.source["isOsmCache"], + mercatorCrs: json.source["mercatorCrs"] + }, + json.id + ); + + this.allowSplit = json.allowSplit ?? false; this.name = Translations.T(json.name, context + ".name"); this.units = (json.units ?? []).map(((unitJson, i) => Unit.fromJson(unitJson, `${context}.unit[${i}]`))) @@ -86,54 +118,7 @@ export default class LayerConfig { context + ".description" ); - let legacy = undefined; - if (json["overpassTags"] !== undefined) { - // @ts-ignore - legacy = TagUtils.Tag(json["overpassTags"], context + ".overpasstags"); - } - if (json.source !== undefined) { - this.maxAgeOfCache = json.source.maxCacheAge ?? 24 * 60 * 60 * 30 - if (legacy !== undefined) { - throw ( - context + - "Both the legacy 'layer.overpasstags' and the new 'layer.source'-field are defined" - ); - } - - let osmTags: TagsFilter = legacy; - if (json.source["osmTags"]) { - osmTags = TagUtils.Tag( - json.source["osmTags"], - context + "source.osmTags" - ); - } - - if (json.source["geoJsonSource"] !== undefined) { - throw context + "Use 'geoJson' instead of 'geoJsonSource'"; - } - - if (json.source["geojson"] !== undefined) { - throw context + "Use 'geoJson' instead of 'geojson' (the J is a capital letter)"; - } - - this.source = new SourceConfig( - { - osmTags: osmTags, - geojsonSource: json.source["geoJson"], - geojsonSourceLevel: json.source["geoJsonZoomLevel"], - overpassScript: json.source["overpassScript"], - isOsmCache: json.source["isOsmCache"], - mercatorCrs: json.source["mercatorCrs"] - }, - this.id - ); - } else { - this.source = new SourceConfig({ - osmTags: legacy, - }); - } - this.calculatedTags = undefined; if (json.calculatedTags !== undefined) { if (!official) { @@ -148,7 +133,6 @@ export default class LayerConfig { const code = kv.substring(index + 1); try { - new Function("feat", "return " + code + ";"); } catch (e) { throw `Invalid function definition: code ${code} is invalid:${e} (at ${context})` @@ -163,7 +147,6 @@ export default class LayerConfig { this.passAllFeatures = json.passAllFeatures ?? false; this.minzoom = json.minzoom ?? 0; this.minzoomVisible = json.minzoomVisible ?? this.minzoom; - this.wayHandling = json.wayHandling ?? 0; if (json.presets !== undefined && json.presets?.map === undefined) { throw "Presets should be a list of items (at " + context + ")" } @@ -209,125 +192,69 @@ export default class LayerConfig { return config; }); - /** Given a key, gets the corresponding property from the json (or the default if not found - * - * The found value is interpreted as a tagrendering and fetched/parsed - * */ - function tr(key: string, deflt) { - const v = json[key]; - if (v === undefined || v === null) { - if (deflt === undefined) { - return undefined; - } - return new TagRenderingConfig( - deflt, - self.source.osmTags, - `${context}.${key}.default value` - ); - } - if (typeof v === "string") { - const shared = SharedTagRenderings.SharedTagRendering.get(v); - if (shared) { - return shared; - } - } - return new TagRenderingConfig( - v, - self.source.osmTags, - `${context}.${key}` - ); + if (json.mapRendering === undefined) { + throw "MapRendering is undefined in " + context } - /** - * Converts a list of tagRenderingCOnfigJSON in to TagRenderingConfig - * A string is interpreted as a name to call - */ - function trs( - tagRenderings?: (string | { builtin: string, override: any } | TagRenderingConfigJson)[], - readOnly = false - ) { - if (tagRenderings === undefined) { - return []; + if (json.mapRendering === null) { + this.mapRendering = [] + this.lineRendering = [] + } else { + this.mapRendering = Utils.NoNull(json.mapRendering) + .filter(r => r["location"] !== undefined) + .map((r, i) => new PointRenderingConfig(r, context + ".mapRendering[" + i + "]")) + + this.lineRendering = Utils.NoNull(json.mapRendering) + .filter(r => r["location"] === undefined) + .map((r, i) => new LineRenderingConfig(r, context + ".mapRendering[" + i + "]")) + + const hasCenterRendering = this.mapRendering.some(r => r.location.has("centroid") || r.location.has("start") || r.location.has("end")) + + if (this.lineRendering.length === 0 && this.mapRendering.length === 0) { + console.log(json.mapRendering) + throw("The layer " + this.id + " does not have any maprenderings defined and will thus not show up on the map at all. If this is intentional, set maprenderings to 'null' instead of '[]'") + } else if (!hasCenterRendering && this.lineRendering.length === 0) { + throw "The layer " + this.id + " might not render ways. This might result in dropped information" } - - return Utils.NoNull( - tagRenderings.map((renderingJson, i) => { - if (typeof renderingJson === "string") { - renderingJson = {builtin: renderingJson, override: undefined} - } - - if (renderingJson["builtin"] !== undefined) { - const renderingId = renderingJson["builtin"] - if (renderingId === "questions") { - if (readOnly) { - throw `A tagrendering has a question, but asking a question does not make sense here: is it a title icon or a geojson-layer? ${context}. The offending tagrendering is ${JSON.stringify( - renderingJson - )}`; - } - - return new TagRenderingConfig("questions", undefined, context); - } - - if (renderingJson["override"] !== undefined) { - const sharedJson = SharedTagRenderings.SharedTagRenderingJson.get(renderingId) - return new TagRenderingConfig( - Utils.Merge(renderingJson["override"], sharedJson), - self.source.osmTags, - `${context}.tagrendering[${i}]+override` - ); - } - - const shared = SharedTagRenderings.SharedTagRendering.get(renderingId); - - if (shared !== undefined) { - return shared; - } - if (Utils.runningFromConsole) { - return undefined; - } - - const keys = Array.from( - SharedTagRenderings.SharedTagRendering.keys() - ); - throw `Predefined tagRendering ${renderingId} not found in ${context}.\n Try one of ${keys.join( - ", " - )}\n If you intent to output this text literally, use {\"render\": } instead"}`; - } - - return new TagRenderingConfig( - renderingJson, - self.source.osmTags, - `${context}.tagrendering[${i}]` - ); - }) - ); } - this.tagRenderings = trs(json.tagRenderings, false); - - const missingIds = json.tagRenderings?.filter(tr => typeof tr !== "string" && tr["builtin"] === undefined && tr["id"] === undefined) ?? []; - - if (missingIds.length > 0 && official) { + const missingIds = json.tagRenderings?.filter(tr => typeof tr !== "string" && tr["builtin"] === undefined && tr["id"] === undefined && tr["rewrite"] === undefined) ?? []; + if (missingIds?.length > 0 && official) { console.error("Some tagRenderings of", this.id, "are missing an id:", missingIds) throw "Missing ids in tagrenderings" } + this.tagRenderings = this.ExtractLayerTagRenderings(json, official) + if (official) { + + const emptyIds = this.tagRenderings.filter(tr => tr.id === ""); + if (emptyIds.length > 0) { + throw `Some tagrendering-ids are empty or have an emtpy string; this is not allowed (at ${context})` + } + + const duplicateIds = Utils.Dupicates(this.tagRenderings.map(f => f.id).filter(id => id !== "questions")) + if (duplicateIds.length > 0) { + throw `Some tagRenderings have a duplicate id: ${duplicateIds} (at ${context}.tagRenderings)` + } + } + this.filters = (json.filter ?? []).map((option, i) => { return new FilterConfig(option, `${context}.filter-[${i}]`) }); + { + const duplicateIds = Utils.Dupicates(this.filters.map(f => f.id)) + if (duplicateIds.length > 0) { + throw `Some filters have a duplicate id: ${duplicateIds} (at ${context}.filters)` + } + } + if (json["filters"] !== undefined) { throw "Error in " + context + ": use 'filter' instead of 'filters'" } const titleIcons = []; - const defaultIcons = [ - "phonelink", - "emaillink", - "wikipedialink", - "osmlink", - "sharelink", - ]; + const defaultIcons = icons.defaultIcons; for (const icon of json.titleIcons ?? defaultIcons) { if (icon === "defaults") { titleIcons.push(...defaultIcons); @@ -336,43 +263,12 @@ export default class LayerConfig { } } - this.titleIcons = trs(titleIcons, true); - - this.title = tr("title", undefined); - this.icon = tr("icon", ""); - this.iconOverlays = (json.iconOverlays ?? []).map((overlay, i) => { - let tr = new TagRenderingConfig( - overlay.then, - self.source.osmTags, - `iconoverlays.${i}` - ); - if ( - typeof overlay.then === "string" && - SharedTagRenderings.SharedIcons.get(overlay.then) !== undefined - ) { - tr = SharedTagRenderings.SharedIcons.get(overlay.then); - } - return { - if: TagUtils.Tag(overlay.if), - then: tr, - badge: overlay.badge ?? false, - }; + this.titleIcons = this.ParseTagRenderings(titleIcons, { + readOnlyMode: true }); - const iconPath = this.icon.GetRenderValue({id: "node/-1"}).txt; - if (iconPath.startsWith(Utils.assets_path)) { - const iconKey = iconPath.substr(Utils.assets_path.length); - if (Svg.All[iconKey] === undefined) { - throw "Builtin SVG asset not found: " + iconPath; - } - } - this.isShown = tr("isShown", "yes"); - this.iconSize = tr("iconSize", "40,40,center"); - this.label = tr("label", ""); - this.color = tr("color", "#0000ff"); - this.width = tr("width", "7"); - this.rotation = tr("rotation", "0"); - this.dashArray = tr("dashArray", ""); + this.title = this.tr("title", undefined); + this.isShown = this.tr("isShown", "yes"); this.deletion = null; if (json.deletion === true) { @@ -401,258 +297,176 @@ export default class LayerConfig { } } + public defaultIcon(): BaseUIElement | undefined { + if (this.mapRendering === undefined || this.mapRendering === null) { + return undefined; + } + const mapRendering = this.mapRendering.filter(r => r.location.has("point"))[0] + if (mapRendering === undefined) { + return undefined + } + const defaultTags = new UIEventSource(TagUtils.changeAsProperties(this.source.osmTags.asChange({id: "node/-1"}))) + return mapRendering.GenerateLeafletStyle(defaultTags, false, {noSize: true}).html + } + + public ExtractLayerTagRenderings(json: LayerConfigJson, official: boolean): TagRenderingConfig[] { + + if (json.tagRenderings === undefined) { + return [] + } + + const normalTagRenderings: (string | { builtin: string, override: any } | TagRenderingConfigJson)[] = [] + + + const renderingsToRewrite: ({ + rewrite: { + sourceString: string, + into: string[] + }, renderings: (string | { builtin: string, override: any } | TagRenderingConfigJson)[] + })[] = [] + for (let i = 0; i < json.tagRenderings.length; i++) { + const tr = json.tagRenderings[i]; + const rewriteDefined = tr["rewrite"] !== undefined + const renderingsDefined = tr["renderings"] + + if (!rewriteDefined && !renderingsDefined) { + // @ts-ignore + normalTagRenderings.push(tr) + continue + } + if (rewriteDefined && renderingsDefined) { + // @ts-ignore + renderingsToRewrite.push(tr) + continue + } + throw `Error in ${this._context}.tagrenderings[${i}]: got a value which defines either \`rewrite\` or \`renderings\`, but not both. Either define both or move the \`renderings\` out of this scope` + } + + const allRenderings = this.ParseTagRenderings(normalTagRenderings, + { + requiresId: official + }); + + if (renderingsToRewrite.length === 0) { + return allRenderings + } + + /* Used for left|right group creation and replacement */ + function prepConfig(keyToRewrite: string, target: string, tr: TagRenderingConfigJson) { + + function replaceRecursive(transl: string | any) { + if (typeof transl === "string") { + return transl.replace(keyToRewrite, target) + } + if (transl.map !== undefined) { + return transl.map(o => replaceRecursive(o)) + } + transl = {...transl} + for (const key in transl) { + transl[key] = replaceRecursive(transl[key]) + } + return transl + } + + const orig = tr; + tr = replaceRecursive(tr) + + tr.id = target + "-" + orig.id + tr.group = target + return tr + } + + const rewriteGroups: Map = new Map() + for (const rewriteGroup of renderingsToRewrite) { + + const tagRenderings = rewriteGroup.renderings + const textToReplace = rewriteGroup.rewrite.sourceString + const targets = rewriteGroup.rewrite.into + for (const target of targets) { + const parsedRenderings = this.ParseTagRenderings(tagRenderings, { + prepConfig: tr => prepConfig(textToReplace, target, tr) + }) + + if (!rewriteGroups.has(target)) { + rewriteGroups.set(target, []) + } + rewriteGroups.get(target).push(...parsedRenderings) + } + } + + + rewriteGroups.forEach((group, groupName) => { + group.push(new TagRenderingConfig({ + id: "questions", + group: groupName + })) + }) + + rewriteGroups.forEach(group => { + allRenderings.push(...group) + }) + + + return allRenderings; + + } + + public GenerateDocumentation(usedInThemes: string[], addedByDefault = false, canBeIncluded = true): BaseUIElement { + const extraProps = [] + + if (canBeIncluded) { + if (addedByDefault) { + extraProps.push("**This layer is included automatically in every theme. This layer might contain no points**") + } + if (this.title === undefined) { + extraProps.push("Not clickable by default. If you import this layer in your theme, override `title` to make this clickable") + } + if (this.name === undefined) { + extraProps.push("Not visible in the layer selection by default. If you want to make this layer toggable, override `name`") + } + if (this.mapRendering.length === 0) { + extraProps.push("Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings`") + } + } else { + extraProps.push("This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing a minimap with custom data.") + } + + + let usingLayer: BaseUIElement[] = [] + if (usedInThemes?.length > 0 && !addedByDefault) { + usingLayer = [new Title("Themes using this layer", 4), + new List((usedInThemes ?? []).map(id => new Link(id, "https://mapcomplete.osm.be/" + id))) + ] + } + + return new Combine([ + new Title(this.id, 3), + this.description, + + new Link("Go to the source code", `../assets/layers/${this.id}/${this.id}.json`), + + new List(extraProps), + ...usingLayer + ]).SetClass("flex flex-col") + } + public CustomCodeSnippets(): string[] { if (this.calculatedTags === undefined) { return []; } - return this.calculatedTags.map((code) => code[1]); } - public AddRoamingRenderings(addAll: { - tagRenderings: TagRenderingConfig[]; - titleIcons: TagRenderingConfig[]; - iconOverlays: { - if: TagsFilter; - then: TagRenderingConfig; - badge: boolean; - }[]; - }): LayerConfig { - let insertionPoint = this.tagRenderings - .map((tr) => tr.IsQuestionBoxElement()) - .indexOf(true); - if (insertionPoint < 0) { - // No 'questions' defined - we just add them all to the end - insertionPoint = this.tagRenderings.length; - } - this.tagRenderings.splice(insertionPoint, 0, ...addAll.tagRenderings); - - this.iconOverlays.push(...addAll.iconOverlays); - for (const icon of addAll.titleIcons) { - this.titleIcons.splice(0, 0, icon); - } - return this; - } - - public GetRoamingRenderings(): { - tagRenderings: TagRenderingConfig[]; - titleIcons: TagRenderingConfig[]; - iconOverlays: { - if: TagsFilter; - then: TagRenderingConfig; - badge: boolean; - }[]; - } { - const tagRenderings = this.tagRenderings.filter((tr) => tr.roaming); - const titleIcons = this.titleIcons.filter((tr) => tr.roaming); - const iconOverlays = this.iconOverlays.filter((io) => io.then.roaming); - - return { - tagRenderings: tagRenderings, - titleIcons: titleIcons, - iconOverlays: iconOverlays, - }; - } - - public GenerateLeafletStyle( - tags: UIEventSource, - clickable: boolean - ): { - icon: { - html: BaseUIElement; - iconSize: [number, number]; - iconAnchor: [number, number]; - popupAnchor: [number, number]; - iconUrl: string; - className: string; - }; - color: string; - weight: number; - dashArray: number[]; - } { - function num(str, deflt = 40) { - const n = Number(str); - if (isNaN(n)) { - return deflt; - } - return n; - } - - function rendernum(tr: TagRenderingConfig, deflt: number) { - const str = Number(render(tr, "" + deflt)); - const n = Number(str); - if (isNaN(n)) { - return deflt; - } - return n; - } - - function render(tr: TagRenderingConfig, deflt?: string) { - if (tags === undefined) { - return deflt - } - const str = tr?.GetRenderValue(tags.data)?.txt ?? deflt; - return Utils.SubstituteKeys(str, tags.data).replace(/{.*}/g, ""); - } - - const iconSize = render(this.iconSize, "40,40,center").split(","); - const dashArray = render(this.dashArray)?.split(" ")?.map(Number); - let color = render(this.color, "#00f"); - - if (color.startsWith("--")) { - color = getComputedStyle(document.body).getPropertyValue( - "--catch-detail-color" - ); - } - - const weight = rendernum(this.width, 5); - - const iconW = num(iconSize[0]); - let iconH = num(iconSize[1]); - const mode = iconSize[2]?.trim()?.toLowerCase() ?? "center"; - - let anchorW = iconW / 2; - let anchorH = iconH / 2; - if (mode === "left") { - anchorW = 0; - } - if (mode === "right") { - anchorW = iconW; - } - - if (mode === "top") { - anchorH = 0; - } - if (mode === "bottom") { - anchorH = iconH; - } - - const iconUrlStatic = render(this.icon); - const self = this; - - function genHtmlFromString(sourcePart: string, rotation: string): BaseUIElement { - const style = `width:100%;height:100%;transform: rotate( ${rotation} );display:block;position: absolute; top: 0; left: 0`; - let html: BaseUIElement = new FixedUiElement( - `` - ); - const match = sourcePart.match(/([a-zA-Z0-9_]*):([^;]*)/); - if (match !== null && Svg.All[match[1] + ".svg"] !== undefined) { - html = new Img( - (Svg.All[match[1] + ".svg"] as string).replace( - /#000000/g, - match[2] - ), - true - ).SetStyle(style); - } - return html; - } - - - const mappedHtml = tags?.map((tgs) => { - // What do you mean, 'tgs' is never read? - // It is read implicitly in the 'render' method - const iconUrl = render(self.icon); - const rotation = render(self.rotation, "0deg"); - - let htmlParts: BaseUIElement[] = []; - let sourceParts = Utils.NoNull( - iconUrl.split(";").filter((prt) => prt != "") - ); - for (const sourcePart of sourceParts) { - htmlParts.push(genHtmlFromString(sourcePart, rotation)); - } - - let badges = []; - for (const iconOverlay of self.iconOverlays) { - if (!iconOverlay.if.matchesProperties(tgs)) { - continue; - } - if (iconOverlay.badge) { - const badgeParts: BaseUIElement[] = []; - const renderValue = iconOverlay - .then - .GetRenderValue(tgs) - - if (renderValue === undefined) { - continue; - } - - const partDefs = renderValue.txt.split(";") - .filter((prt) => prt != ""); - - for (const badgePartStr of partDefs) { - badgeParts.push(genHtmlFromString(badgePartStr, "0")); - } - - const badgeCompound = new Combine(badgeParts).SetStyle( - "display:flex;position:relative;width:100%;height:100%;" - ); - - badges.push(badgeCompound); - } else { - htmlParts.push( - genHtmlFromString(iconOverlay.then.GetRenderValue(tgs).txt, "0") - ); - } - } - - if (badges.length > 0) { - const badgesComponent = new Combine(badges).SetStyle( - "display:flex;height:50%;width:100%;position:absolute;top:50%;left:50%;" - ); - htmlParts.push(badgesComponent); - } - - if (sourceParts.length == 0) { - iconH = 0; - } - try { - const label = self.label - ?.GetRenderValue(tgs) - ?.Subs(tgs) - ?.SetClass("block text-center") - ?.SetStyle("margin-top: " + (iconH + 2) + "px"); - if (label !== undefined) { - htmlParts.push( - new Combine([label]).SetClass("flex flex-col items-center") - ); - } - } catch (e) { - console.error(e, tgs); - } - return new Combine(htmlParts); - }); - - return { - icon: { - html: mappedHtml === undefined ? new FixedUiElement(self.icon.render.txt) : new VariableUiElement(mappedHtml), - iconSize: [iconW, iconH], - iconAnchor: [anchorW, anchorH], - popupAnchor: [0, 3 - anchorH], - iconUrl: iconUrlStatic, - className: clickable - ? "leaflet-div-icon" - : "leaflet-div-icon unclickable", - }, - color: color, - weight: weight, - dashArray: dashArray, - }; - } - public ExtractImages(): Set { const parts: Set[] = []; parts.push(...this.tagRenderings?.map((tr) => tr.ExtractImages(false))); parts.push(...this.titleIcons?.map((tr) => tr.ExtractImages(true))); - parts.push(this.icon?.ExtractImages(true)); - parts.push( - ...this.iconOverlays?.map((overlay) => overlay.then.ExtractImages(true)) - ); for (const preset of this.presets) { parts.push(new Set(preset.description?.ExtractImages(false))); } - + for (const pointRenderingConfig of this.mapRendering) { + parts.push(pointRenderingConfig.ExtractImages()) + } const allIcons = new Set(); for (const part of parts) { part?.forEach(allIcons.add, allIcons); @@ -660,4 +474,8 @@ export default class LayerConfig { return allIcons; } + + public isLeftRightSensitive(): boolean { + return this.lineRendering.some(lr => lr.leftRightSensitive) + } } \ No newline at end of file diff --git a/Models/ThemeConfig/LayoutConfig.ts b/Models/ThemeConfig/LayoutConfig.ts index 54e2a64543..61efd85203 100644 --- a/Models/ThemeConfig/LayoutConfig.ts +++ b/Models/ThemeConfig/LayoutConfig.ts @@ -1,7 +1,5 @@ import {Translation} from "../../UI/i18n/Translation"; -import TagRenderingConfig from "./TagRenderingConfig"; import {LayoutConfigJson} from "./Json/LayoutConfigJson"; -import SharedTagRenderings from "../../Customizations/SharedTagRenderings"; import AllKnownLayers from "../../Customizations/AllKnownLayers"; import {Utils} from "../../Utils"; import LayerConfig from "./LayerConfig"; @@ -25,7 +23,6 @@ export default class LayoutConfig { public readonly startLat: number; public readonly startLon: number; public readonly widenFactor: number; - public readonly roamingRenderings: TagRenderingConfig[]; public readonly defaultBackgroundId?: string; public layers: LayerConfig[]; public tileLayerSources: TilesourceConfig[] @@ -55,7 +52,8 @@ export default class LayoutConfig { public readonly overpassMaxZoom: number public readonly osmApiTileSize: number public readonly official: boolean; - + public readonly trackAllNodes: boolean; + constructor(json: LayoutConfigJson, official = true, context?: string) { this.official = official; this.id = json.id; @@ -64,6 +62,8 @@ export default class LayoutConfig { this.credits = json.credits; this.version = json.version; this.language = []; + this.trackAllNodes = false + if (typeof json.language === "string") { this.language = [json.language]; } else { @@ -87,61 +87,32 @@ export default class LayoutConfig { this.startZoom = json.startZoom; this.startLat = json.startLat; this.startLon = json.startLon; - if(json.widenFactor <= 0){ - throw "Widenfactor too small, shoud be > 0" + if (json.widenFactor <= 0) { + throw "Widenfactor too small, shoud be > 0" } - if(json.widenFactor > 20){ - throw "Widenfactor is very big, use a value between 1 and 5 (current value is "+json.widenFactor+") at "+context + if (json.widenFactor > 20) { + throw "Widenfactor is very big, use a value between 1 and 5 (current value is " + json.widenFactor + ") at " + context } + this.widenFactor = json.widenFactor ?? 1.5; - this.roamingRenderings = (json.roamingRenderings ?? []).map((tr, i) => { - if (typeof tr === "string") { - if (SharedTagRenderings.SharedTagRendering.get(tr) !== undefined) { - return SharedTagRenderings.SharedTagRendering.get(tr); - } - } - return new TagRenderingConfig(tr, undefined, `${this.id}.roaming_renderings[${i}]`); - } - ); + this.defaultBackgroundId = json.defaultBackgroundId; - this.tileLayerSources = (json.tileLayerSources??[]).map((config, i) => new TilesourceConfig(config, `${this.id}.tileLayerSources[${i}]`)) - this.layers = LayoutConfig.ExtractLayers(json, official, context); + this.tileLayerSources = (json.tileLayerSources ?? []).map((config, i) => new TilesourceConfig(config, `${this.id}.tileLayerSources[${i}]`)) + const layerInfo = LayoutConfig.ExtractLayers(json, official, context); + this.layers = layerInfo.layers + this.trackAllNodes = layerInfo.extractAllNodes - // ALl the layers are constructed, let them share tagRenderings now! - const roaming: { r, source: LayerConfig }[] = [] - for (const layer of this.layers) { - roaming.push({r: layer.GetRoamingRenderings(), source: layer}); - } - - for (const layer of this.layers) { - for (const r of roaming) { - if (r.source == layer) { - continue; - } - layer.AddRoamingRenderings(r.r); - } - } - - for (const layer of this.layers) { - layer.AddRoamingRenderings( - { - titleIcons: [], - iconOverlays: [], - tagRenderings: this.roamingRenderings - } - ); - } this.clustering = { maxZoom: 16, minNeededElements: 25, }; - if(json.clustering === false){ + if (json.clustering === false) { this.clustering = { maxZoom: 0, minNeededElements: 100000, }; - }else if (json.clustering) { + } else if (json.clustering) { this.clustering = { maxZoom: json.clustering.maxZoom ?? 18, minNeededElements: json.clustering.minNeededElements ?? 25, @@ -153,7 +124,7 @@ export default class LayoutConfig { if (json.hideInOverview) { throw "The json for " + this.id + " contains a 'hideInOverview'. Did you mean hideFromOverview instead?" } - this.lockLocation = <[[number, number], [number, number]]> json.lockLocation ?? undefined; + this.lockLocation = <[[number, number], [number, number]]>json.lockLocation ?? undefined; this.enableUserBadge = json.enableUserBadge ?? true; this.enableShareScreen = json.enableShareScreen ?? true; this.enableMoreQuests = json.enableMoreQuests ?? true; @@ -168,10 +139,10 @@ export default class LayoutConfig { this.enableIframePopout = json.enableIframePopout ?? true this.customCss = json.customCss; this.overpassUrl = Constants.defaultOverpassUrls - if(json.overpassUrl !== undefined){ - if(typeof json.overpassUrl === "string"){ + if (json.overpassUrl !== undefined) { + if (typeof json.overpassUrl === "string") { this.overpassUrl = [json.overpassUrl] - }else{ + } else { this.overpassUrl = json.overpassUrl } } @@ -181,19 +152,24 @@ export default class LayoutConfig { } - private static ExtractLayers(json: LayoutConfigJson, official: boolean, context: string): LayerConfig[] { + private static ExtractLayers(json: LayoutConfigJson, official: boolean, context: string): { layers: LayerConfig[], extractAllNodes: boolean } { const result: LayerConfig[] = [] - + let exportAllNodes = false json.layers.forEach((layer, i) => { + if (typeof layer === "string") { if (AllKnownLayers.sharedLayersJson.get(layer) !== undefined) { if (json.overrideAll !== undefined) { - let lyr = JSON.parse(JSON.stringify(AllKnownLayers.sharedLayersJson[layer])); + let lyr = JSON.parse(JSON.stringify(AllKnownLayers.sharedLayersJson.get(layer))); const newLayer = new LayerConfig(Utils.Merge(json.overrideAll, lyr), `${json.id}+overrideAll.layers[${i}]`, official) result.push(newLayer) return } else { - result.push(AllKnownLayers.sharedLayers[layer]) + const shared = AllKnownLayers.sharedLayers.get(layer) + if(shared === undefined){ + throw `Shared layer ${layer} not found (at ${context}.layers[${i}])` + } + result.push(shared) return } } else { @@ -207,16 +183,22 @@ export default class LayoutConfig { layer = Utils.Merge(json.overrideAll, layer); } // @ts-ignore - const newLayer = new LayerConfig(layer, `${json.id}.layers[${i}]`, official) - result.push(newLayer) + result.push(new LayerConfig(layer, `${json.id}.layers[${i}]`, official)) return } + // @ts-ignore let names = layer.builtin; if (typeof names === "string") { names = [names] } names.forEach(name => { + + if (name === "type_node") { + // This is a very special layer which triggers special behaviour + exportAllNodes = true; + } + const shared = AllKnownLayers.sharedLayersJson.get(name); if (shared === undefined) { throw `Unknown shared/builtin layer ${name} at ${context}.layers[${i}]. Available layers are ${Array.from(AllKnownLayers.sharedLayersJson.keys()).join(", ")}`; @@ -225,15 +207,21 @@ export default class LayoutConfig { if (json.overrideAll !== undefined) { newLayer = Utils.Merge(json.overrideAll, newLayer); } - // @ts-ignore - const layerConfig = new LayerConfig(newLayer, `${json.id}.layers[${i}]`, official) - result.push(layerConfig) + result.push(new LayerConfig(newLayer, `${json.id}.layers[${i}]`, official)) return }) }); + + // Some special layers which are always included by default + for (const defaultLayer of AllKnownLayers.added_by_default) { + if(result.some(l => l?.id === defaultLayer)){ + continue; // Already added + } + result.push(AllKnownLayers.sharedLayers.get(defaultLayer)) + } - return result + return {layers: result, extractAllNodes: exportAllNodes} } public CustomCodeSnippets(): string[] { @@ -309,4 +297,20 @@ export default class LayoutConfig { return new LayoutConfig(JSON.parse(originalJson), false, "Layout rewriting") } + public isLeftRightSensitive() { + return this.layers.some(l => l.isLeftRightSensitive()) + } + + public getMatchingLayer(tags: any) : LayerConfig | undefined{ + if(tags === undefined){ + return undefined + } + for (const layer of this.layers) { + if (layer.source.osmTags.matchesProperties(tags)) { + return layer + } + } + return undefined + } + } \ No newline at end of file diff --git a/Models/ThemeConfig/LegacyJsonConvert.ts b/Models/ThemeConfig/LegacyJsonConvert.ts new file mode 100644 index 0000000000..5a691e0a29 --- /dev/null +++ b/Models/ThemeConfig/LegacyJsonConvert.ts @@ -0,0 +1,107 @@ +import LineRenderingConfigJson from "./Json/LineRenderingConfigJson"; + +export default class LegacyJsonConvert { + + /** + * Updates the config file in-place + * @param config + * @private + */ + public static fixLayerConfig(config: any): void { + if (config["overpassTags"]) { + config.source = config.source ?? {} + config.source.osmTags = config["overpassTags"] + delete config["overpassTags"] + } + + if (config.tagRenderings !== undefined) { + for (const tagRendering of config.tagRenderings) { + if (tagRendering["id"] === undefined) { + + if (tagRendering["#"] !== undefined) { + tagRendering["id"] = tagRendering["#"] + delete tagRendering["#"] + } else if (tagRendering["freeform"]?.key !== undefined) { + tagRendering["id"] = config.id + "-" + tagRendering["freeform"]["key"] + } + } + } + } + + if (config.mapRendering === undefined && config.id !== "sidewalks") { + // This is a legacy format, lets create a pointRendering + let location: ("point" | "centroid")[] = ["point"] + let wayHandling: number = config["wayHandling"] ?? 0 + if (wayHandling !== 0) { + location = ["point", "centroid"] + } + config.mapRendering = [ + { + icon: config["icon"], + iconBadges: config["iconOverlays"], + label: config["label"], + iconSize: config["iconSize"], + location, + rotation: config["rotation"] + } + ] + + if (wayHandling !== 1) { + const lineRenderConfig = { + color: config["color"], + width: config["width"], + dashArray: config["dashArray"] + } + if (Object.keys(lineRenderConfig).length > 0) { + config.mapRendering.push(lineRenderConfig) + } + } + + } + + delete config["color"] + delete config["width"] + delete config["dashArray"] + + delete config["icon"] + delete config["iconOverlays"] + delete config["label"] + delete config["iconSize"] + delete config["rotation"] + delete config["wayHandling"] + + for (const mapRenderingElement of config.mapRendering) { + if (mapRenderingElement["iconOverlays"] !== undefined) { + mapRenderingElement["iconBadges"] = mapRenderingElement["iconOverlays"] + } + for (const overlay of mapRenderingElement["iconBadges"] ?? []) { + if (overlay["badge"] !== true) { + console.log("Warning: non-overlay element for ", config.id) + } + delete overlay["badge"] + } + } + + } + + + /** + * Given an old (parsed) JSON-config, will (in place) fix some issues + * @param oldThemeConfig: the config to update to the latest format + */ + public static fixThemeConfig(oldThemeConfig: any): void { + for (const layerConfig of oldThemeConfig.layers ?? []) { + if (typeof layerConfig === "string" || layerConfig["builtin"] !== undefined) { + continue + } + // @ts-ignore + LegacyJsonConvert.fixLayerConfig(layerConfig) + } + + if (oldThemeConfig["roamingRenderings"] !== undefined && oldThemeConfig["roamingRenderings"].length == 0) { + delete oldThemeConfig["roamingRenderings"] + } + } + + +} \ No newline at end of file diff --git a/Models/ThemeConfig/LineRenderingConfig.ts b/Models/ThemeConfig/LineRenderingConfig.ts new file mode 100644 index 0000000000..f2eed60d14 --- /dev/null +++ b/Models/ThemeConfig/LineRenderingConfig.ts @@ -0,0 +1,85 @@ +import WithContextLoader from "./WithContextLoader"; +import TagRenderingConfig from "./TagRenderingConfig"; +import {Utils} from "../../Utils"; +import LineRenderingConfigJson from "./Json/LineRenderingConfigJson"; + +export default class LineRenderingConfig extends WithContextLoader { + + + public readonly color: TagRenderingConfig; + public readonly width: TagRenderingConfig; + public readonly dashArray: TagRenderingConfig; + public readonly lineCap: TagRenderingConfig; + public readonly offset: TagRenderingConfig; + public readonly fill: TagRenderingConfig; + public readonly fillColor: TagRenderingConfig; + public readonly leftRightSensitive: boolean + + constructor(json: LineRenderingConfigJson, context: string) { + super(json, context) + this.color = this.tr("color", "#0000ff"); + this.width = this.tr("width", "7"); + this.dashArray = this.tr("dashArray", ""); + this.lineCap = this.tr("lineCap", "round"); + this.fill = this.tr("fill", undefined); + this.fillColor = this.tr("fillColor", undefined); + + this.leftRightSensitive = json.offset !== undefined && json.offset !== 0 && json.offset !== "0" + + this.offset = this.tr("offset", "0"); + } + + public GenerateLeafletStyle(tags: {}): + { fillColor?: string; color: string; lineCap: string; offset: number; weight: number; dashArray: string; fill?: boolean } { + function rendernum(tr: TagRenderingConfig, deflt: number) { + const str = Number(render(tr, "" + deflt)); + const n = Number(str); + if (isNaN(n)) { + return deflt; + } + return n; + } + + function render(tr: TagRenderingConfig, deflt?: string) { + if (tags === undefined) { + return deflt + } + if(tr === undefined){return deflt} + const str = tr?.GetRenderValue(tags)?.txt ?? deflt; + if (str === "") { + return deflt + } + return Utils.SubstituteKeys(str, tags)?.replace(/{.*}/g, ""); + } + + const dashArray = render(this.dashArray); + let color = render(this.color, "#00f"); + if (color.startsWith("--")) { + color = getComputedStyle(document.body).getPropertyValue( + "--catch-detail-color" + ); + } + + const style = { + color, + dashArray, + weight: rendernum(this.width, 5), + lineCap: render(this.lineCap), + offset: rendernum(this.offset, 0) + } + + const fillStr = render(this.fill, undefined) + let fill: boolean = undefined; + if (fillStr !== undefined && fillStr !== "") { + style["fill"] = fillStr === "yes" || fillStr === "true" + } + + const fillColorStr = render(this.fillColor, undefined) + if(fillColorStr !== undefined){ + style["fillColor"] = fillColorStr + } + return style + + } + +} \ No newline at end of file diff --git a/Models/ThemeConfig/PointRenderingConfig.ts b/Models/ThemeConfig/PointRenderingConfig.ts new file mode 100644 index 0000000000..8e047c24bc --- /dev/null +++ b/Models/ThemeConfig/PointRenderingConfig.ts @@ -0,0 +1,266 @@ +import PointRenderingConfigJson from "./Json/PointRenderingConfigJson"; +import TagRenderingConfig from "./TagRenderingConfig"; +import {TagsFilter} from "../../Logic/Tags/TagsFilter"; +import SharedTagRenderings from "../../Customizations/SharedTagRenderings"; +import {TagUtils} from "../../Logic/Tags/TagUtils"; +import {Utils} from "../../Utils"; +import Svg from "../../Svg"; +import WithContextLoader from "./WithContextLoader"; +import {UIEventSource} from "../../Logic/UIEventSource"; +import BaseUIElement from "../../UI/BaseUIElement"; +import {FixedUiElement} from "../../UI/Base/FixedUiElement"; +import Img from "../../UI/Base/Img"; +import Combine from "../../UI/Base/Combine"; +import {VariableUiElement} from "../../UI/Base/VariableUIElement"; + +export default class PointRenderingConfig extends WithContextLoader { + + private static readonly allowed_location_codes = new Set(["point", "centroid", "start", "end"]) + public readonly location: Set<"point" | "centroid" | "start" | "end"> + + public readonly icon: TagRenderingConfig; + public readonly iconBadges: { if: TagsFilter; then: TagRenderingConfig }[]; + public readonly iconSize: TagRenderingConfig; + public readonly label: TagRenderingConfig; + public readonly rotation: TagRenderingConfig; + + constructor(json: PointRenderingConfigJson, context: string) { + super(json, context) + + if (typeof json.location === "string") { + json.location = [json.location] + } + + this.location = new Set(json.location) + + this.location.forEach(l => { + const allowed = PointRenderingConfig.allowed_location_codes + if (!allowed.has(l)) { + throw `A point rendering has an invalid location: '${l}' is not one of ${Array.from(allowed).join(", ")} (at ${context}.location)` + } + }) + + if (json.icon === undefined && json.label === undefined) { + throw `A point rendering should define at least an icon or a label` + } + + if (this.location.size == 0) { + throw "A pointRendering should have at least one 'location' to defined where it should be rendered. (At " + context + ".location)" + } + this.icon = this.tr("icon", ""); + this.iconBadges = (json.iconBadges ?? []).map((overlay, i) => { + let tr: TagRenderingConfig; + if (typeof overlay.then === "string" && + SharedTagRenderings.SharedIcons.get(overlay.then) !== undefined) { + tr = SharedTagRenderings.SharedIcons.get(overlay.then); + } else { + tr = new TagRenderingConfig( + overlay.then, + `iconBadges.${i}` + ); + } + return { + if: TagUtils.Tag(overlay.if), + then: tr + }; + }); + + const iconPath = this.icon.GetRenderValue({id: "node/-1"}).txt; + if (iconPath.startsWith(Utils.assets_path)) { + const iconKey = iconPath.substr(Utils.assets_path.length); + if (Svg.All[iconKey] === undefined) { + throw "Builtin SVG asset not found: " + iconPath; + } + } + this.iconSize = this.tr("iconSize", "40,40,center"); + this.label = this.tr("label", undefined); + this.rotation = this.tr("rotation", "0"); + } + + /** + * Given a single HTML spec (either a single image path OR "image_path_to_known_svg:fill-colour", returns a fixedUIElement containing that + * The element will fill 100% and be positioned absolutely with top:0 and left: 0 + */ + private static FromHtmlSpec(htmlSpec: string, style: string, isBadge = false): BaseUIElement { + if (htmlSpec === undefined) { + return undefined; + } + const match = htmlSpec.match(/([a-zA-Z0-9_]*):([^;]*)/); + if (match !== null && Svg.All[match[1] + ".svg"] !== undefined) { + const svg = (Svg.All[match[1] + ".svg"] as string) + const targetColor = match[2] + const img = new Img(svg.replace(/#000000/g, targetColor), true) + .SetStyle(style) + if (isBadge) { + img.SetClass("badge") + } + return img + } else { + return new FixedUiElement(``); + } + } + + private static FromHtmlMulti(multiSpec: string, rotation: string, isBadge: boolean, defaultElement: BaseUIElement = undefined) { + if (multiSpec === undefined) { + return defaultElement + } + const style = `width:100%;height:100%;transform: rotate( ${rotation} );display:block;position: absolute; top: 0; left: 0`; + + const htmlDefs = multiSpec.trim()?.split(";") ?? [] + const elements = Utils.NoEmpty(htmlDefs).map(def => PointRenderingConfig.FromHtmlSpec(def, style, isBadge)) + if (elements.length === 0) { + return defaultElement + } else { + return new Combine(elements).SetClass("relative block w-full h-full") + } + } + + public ExtractImages(): Set { + const parts: Set[] = []; + parts.push(this.icon?.ExtractImages(true)); + parts.push( + ...this.iconBadges?.map((overlay) => overlay.then.ExtractImages(true)) + ); + + const allIcons = new Set(); + for (const part of parts) { + part?.forEach(allIcons.add, allIcons); + } + return allIcons; + } + + public GetSimpleIcon(tags: UIEventSource): BaseUIElement { + const self = this; + if (this.icon === undefined) { + return undefined; + } + return new VariableUiElement(tags.map(tags => { + const rotation = Utils.SubstituteKeys(self.rotation?.GetRenderValue(tags)?.txt ?? "0deg", tags) + + const htmlDefs = Utils.SubstituteKeys(self.icon.GetRenderValue(tags)?.txt, tags) + let defaultPin: BaseUIElement = undefined + if (self.label === undefined) { + defaultPin = Svg.teardrop_with_hole_green_svg() + } + return PointRenderingConfig.FromHtmlMulti(htmlDefs, rotation, false, defaultPin) + })).SetClass("w-full h-full block") + } + + public GenerateLeafletStyle( + tags: UIEventSource, + clickable: boolean, + options?: { + noSize: false | boolean + } + ): + { + html: BaseUIElement; + iconSize: [number, number]; + iconAnchor: [number, number]; + popupAnchor: [number, number]; + iconUrl: string; + className: string; + } { + function num(str, deflt = 40) { + const n = Number(str); + if (isNaN(n)) { + return deflt; + } + return n; + } + + function render(tr: TagRenderingConfig, deflt?: string) { + if (tags === undefined) { + return deflt + } + const str = tr?.GetRenderValue(tags.data)?.txt ?? deflt; + return Utils.SubstituteKeys(str, tags.data).replace(/{.*}/g, ""); + } + + const iconSize = render(this.iconSize, "40,40,center").split(","); + + const iconW = num(iconSize[0]); + let iconH = num(iconSize[1]); + const mode = iconSize[2]?.trim()?.toLowerCase() ?? "center"; + + let anchorW = iconW / 2; + let anchorH = iconH / 2; + if (mode === "left") { + anchorW = 0; + } + if (mode === "right") { + anchorW = iconW; + } + + if (mode === "top") { + anchorH = 0; + } + if (mode === "bottom") { + anchorH = iconH; + } + + + const iconAndBadges = new Combine([this.GetSimpleIcon(tags), this.GetBadges(tags)]) + .SetClass("block relative") + + if (!options?.noSize) { + iconAndBadges.SetStyle(`width: ${iconW}px; height: ${iconH}px`) + } else { + iconAndBadges.SetClass("w-full h-full") + } + + return { + html: new Combine([iconAndBadges, this.GetLabel(tags)]).SetStyle("flex flex-col"), + iconSize: [iconW, iconH], + iconAnchor: [anchorW, anchorH], + popupAnchor: [0, 3 - anchorH], + iconUrl: undefined, + className: clickable + ? "leaflet-div-icon" + : "leaflet-div-icon unclickable", + }; + } + + private GetBadges(tags: UIEventSource): BaseUIElement { + if (this.iconBadges.length === 0) { + return undefined + } + return new VariableUiElement( + tags.map(tags => { + + const badgeElements = this.iconBadges.map(badge => { + + if (!badge.if.matchesProperties(tags)) { + // Doesn't match... + return undefined + } + + const htmlDefs = Utils.SubstituteKeys(badge.then.GetRenderValue(tags)?.txt, tags) + const badgeElement = PointRenderingConfig.FromHtmlMulti(htmlDefs, "0", true)?.SetClass("block relative") + if (badgeElement === undefined) { + return undefined; + } + return new Combine([badgeElement]).SetStyle("width: 1.5rem").SetClass("block") + + }) + + return new Combine(badgeElements).SetClass("inline-flex h-full") + })).SetClass("absolute bottom-0 right-1/3 h-1/2 w-0") + } + + private GetLabel(tags: UIEventSource): BaseUIElement { + if (this.label === undefined) { + return undefined; + } + const self = this; + return new VariableUiElement(tags.map(tags => { + const label = self.label + ?.GetRenderValue(tags) + ?.Subs(tags) + ?.SetClass("block text-center") + return new Combine([label]).SetClass("flex flex-col items-center mt-1") + })) + + } + +} \ No newline at end of file diff --git a/Models/ThemeConfig/SourceConfig.ts b/Models/ThemeConfig/SourceConfig.ts index b378d0acd3..7cb58124be 100644 --- a/Models/ThemeConfig/SourceConfig.ts +++ b/Models/ThemeConfig/SourceConfig.ts @@ -8,7 +8,7 @@ export default class SourceConfig { public readonly geojsonSource?: string; public readonly geojsonZoomLevel?: number; public readonly isOsmCacheLayer: boolean; - public readonly mercatorCrs: boolean; + public readonly mercatorCrs: boolean; constructor(params: { mercatorCrs?: boolean; @@ -36,11 +36,12 @@ export default class SourceConfig { console.error(params) throw `Source said it is a OSM-cached layer, but didn't define the actual source of the cache (in context ${context})` } - if(params.geojsonSource !== undefined && params.geojsonSourceLevel !== undefined){ - if(! ["x","y","x_min","x_max","y_min","Y_max"].some(toSearch => params.geojsonSource.indexOf(toSearch) > 0)){ + if (params.geojsonSource !== undefined && params.geojsonSourceLevel !== undefined) { + if (!["x", "y", "x_min", "x_max", "y_min", "Y_max"].some(toSearch => params.geojsonSource.indexOf(toSearch) > 0)) { throw `Source defines a geojson-zoomLevel, but does not specify {x} nor {y} (or equivalent), this is probably a bug (in context ${context})` - }} - this.osmTags = params.osmTags ?? new RegexTag("id",/.*/); + } + } + this.osmTags = params.osmTags ?? new RegexTag("id", /.*/); this.overpassScript = params.overpassScript; this.geojsonSource = params.geojsonSource; this.geojsonZoomLevel = params.geojsonSourceLevel; diff --git a/Models/ThemeConfig/TagRenderingConfig.ts b/Models/ThemeConfig/TagRenderingConfig.ts index 0b0e804376..c1374b7eef 100644 --- a/Models/ThemeConfig/TagRenderingConfig.ts +++ b/Models/ThemeConfig/TagRenderingConfig.ts @@ -15,6 +15,7 @@ import {Tag} from "../../Logic/Tags/Tag"; export default class TagRenderingConfig { readonly id: string; + readonly group: string; readonly render?: Translation; readonly question?: Translation; readonly condition?: TagsFilter; @@ -39,17 +40,26 @@ export default class TagRenderingConfig { readonly hideInAnswer: boolean | TagsFilter readonly addExtraTags: Tag[] }[] - readonly roaming: boolean; - constructor(json: string | TagRenderingConfigJson, conditionIfRoaming: TagsFilter, context?: string) { + constructor(json: string | TagRenderingConfigJson, context?: string) { if (json === "questions") { // Very special value this.render = null; this.question = null; this.condition = null; + this.id = "questions" + this.group = "" + return; } + + if (typeof json === "number") { + this.render = Translations.T("" + json, context + ".render") + return; + } + + if (json === undefined) { throw "Initing a TagRenderingConfig with undefined in " + context; } @@ -59,23 +69,19 @@ export default class TagRenderingConfig { return; } - + this.id = json.id ?? ""; + if(this.id.match(/^[a-zA-Z0-9 ()?\/=:;,_-]*$/) === null){ + throw "Invalid ID in "+context+": an id can only contain [a-zA-Z0-0_-] as characters. The offending id is: "+this.id + } + + this.group = json.group ?? ""; this.render = Translations.T(json.render, context + ".render"); this.question = Translations.T(json.question, context + ".question"); - this.roaming = json.roaming ?? false; - if(this.roaming){ - console.warn("Deprecation notice: roaming renderings will be scrapped.", this.id, context) - } - const condition = TagUtils.Tag(json.condition ?? {"and": []}, `${context}.condition`); - if (this.roaming && conditionIfRoaming !== undefined) { - this.condition = new And([condition, conditionIfRoaming]); - } else { - this.condition = condition; - } + this.condition = TagUtils.Tag(json.condition ?? {"and": []}, `${context}.condition`); if (json.freeform) { - if(json.freeform.addExtraTags !== undefined && json.freeform.addExtraTags.map === undefined){ + if (json.freeform.addExtraTags !== undefined && json.freeform.addExtraTags.map === undefined) { throw `Freeform.addExtraTags should be a list of strings - not a single string (at ${context})` } this.freeform = { @@ -98,6 +104,12 @@ export default class TagRenderingConfig { throw `Freeform.args is defined. This should probably be 'freeform.helperArgs' (at ${context})` } + + if(json.freeform.key === "questions"){ + if(this.id !== "questions"){ + throw `If you use a freeform key 'questions', the ID must be 'questions' too to trigger the special behaviour. The current id is '${this.id}' (at ${context})` + } + } if (ValidatedTextField.AllTypes[this.freeform.type] === undefined) { @@ -135,8 +147,8 @@ export default class TagRenderingConfig { if (typeof mapping.if !== "string" && mapping.if["length"] !== undefined) { throw `${ctx}: Invalid mapping: "if" is defined as an array. Use {"and": } or {"or": } instead` } - - if(mapping.addExtraTags !== undefined && this.multiAnswer){ + + if (mapping.addExtraTags !== undefined && this.multiAnswer) { throw `${ctx}: Invalid mapping: got a multi-Answer with addExtraTags; this is not allowed` } @@ -149,9 +161,9 @@ export default class TagRenderingConfig { const mp = { if: TagUtils.Tag(mapping.if, `${ctx}.if`), ifnot: (mapping.ifnot !== undefined ? TagUtils.Tag(mapping.ifnot, `${ctx}.ifnot`) : undefined), - then: Translations.T(mapping.then, `{mappingContext}.then`), + then: Translations.T(mapping.then, `${ctx}.then`), hideInAnswer: hideInAnswer, - addExtraTags: (mapping.addExtraTags??[]).map((str, j) => TagUtils.SimpleTag(str, `${ctx}.addExtraTags[${j}]`)) + addExtraTags: (mapping.addExtraTags ?? []).map((str, j) => TagUtils.SimpleTag(str, `${ctx}.addExtraTags[${j}]`)) }; if (this.question) { if (hideInAnswer !== true && mp.if !== undefined && !mp.if.isUsableAsAnswer()) { @@ -171,10 +183,55 @@ export default class TagRenderingConfig { throw `${context}: A question is defined, but no mappings nor freeform (key) are. The question is ${this.question.txt} at ${context}` } - if (this.freeform && this.render === undefined) { - throw `${context}: Detected a freeform key without rendering... Key: ${this.freeform.key} in ${context}` + if (this.id === "questions" && this.render !== undefined) { + for (const ln in this.render.translations) { + const txt :string = this.render.translations[ln] + if(txt.indexOf("{questions}") >= 0){ + continue + } + throw `${context}: The rendering for language ${ln} does not contain {questions}. This is a bug, as this rendering should include exactly this to trigger those questions to be shown!` + + } + if(this.freeform?.key !== undefined && this.freeform?.key !== "questions"){ + throw `${context}: If the ID is questions to trigger a question box, the only valid freeform value is 'questions' as well. Set freeform to questions or remove the freeform all together` + } } + + if (this.freeform) { + if(this.render === undefined){ + throw `${context}: Detected a freeform key without rendering... Key: ${this.freeform.key} in ${context}` + } + for (const ln in this.render.translations) { + const txt :string = this.render.translations[ln] + if(txt === ""){ + throw context+" Rendering for language "+ln+" is empty" + } + if(txt.indexOf("{"+this.freeform.key+"}") >= 0){ + continue + } + if(txt.indexOf("{"+this.freeform.key+":") >= 0){ + continue + } + if(txt.indexOf("{canonical("+this.freeform.key+")") >= 0){ + continue + } + if(this.freeform.type === "opening_hours" && txt.indexOf("{opening_hours_table(") >= 0){ + continue + } + if(this.freeform.type === "wikidata" && txt.indexOf("{wikipedia("+this.freeform.key) >= 0){ + continue + } + if(this.freeform.key === "wikidata" && txt.indexOf("{wikipedia()") >= 0){ + continue + } + throw `${context}: The rendering for language ${ln} does not contain the freeform key {${this.freeform.key}}. This is a bug, as this rendering should show exactly this freeform key!\nThe rendering is ${txt} ` + + } + } + + + if (this.render && this.question && this.freeform === undefined) { throw `${context}: Detected a tagrendering which takes input without freeform key in ${context}; the question is ${this.question.txt}` } @@ -229,7 +286,6 @@ export default class TagRenderingConfig { } } - /** * Returns true if it is known or not shown, false if the question should be asked * @constructor @@ -237,7 +293,7 @@ export default class TagRenderingConfig { public IsKnown(tags: any): boolean { if (this.condition && !this.condition.matchesProperties(tags)) { - // Filtered away by the condition + // Filtered away by the condition, so it is kindof known return true; } if (this.multiAnswer) { @@ -263,10 +319,6 @@ export default class TagRenderingConfig { return false; } - public IsQuestionBoxElement(): boolean { - return this.question === null && this.condition === null; - } - /** * Gets all the render values. Will return multiple render values if 'multianswer' is enabled. * The result will equal [GetRenderValue] if not 'multiAnswer' @@ -311,7 +363,7 @@ export default class TagRenderingConfig { * Not compatible with multiAnswer - use GetRenderValueS instead in that case * @constructor */ - public GetRenderValue(tags: any): Translation { + public GetRenderValue(tags: any, defltValue: any = undefined): Translation { if (this.mappings !== undefined && !this.multiAnswer) { for (const mapping of this.mappings) { if (mapping.if === undefined) { @@ -323,6 +375,9 @@ export default class TagRenderingConfig { } } + if(this.id === "questions"){ + return this.render + } if (this.freeform?.key === undefined) { return this.render; @@ -331,7 +386,7 @@ export default class TagRenderingConfig { if (tags[this.freeform.key] !== undefined) { return this.render; } - return undefined; + return defltValue; } public ExtractImages(isIcon: boolean): Set { diff --git a/Models/ThemeConfig/TilesourceConfig.ts b/Models/ThemeConfig/TilesourceConfig.ts index aed5b96040..661172bcff 100644 --- a/Models/ThemeConfig/TilesourceConfig.ts +++ b/Models/ThemeConfig/TilesourceConfig.ts @@ -19,7 +19,7 @@ export default class TilesourceConfig { this.minzoom = config.minZoom ?? 0 this.maxzoom = config.maxZoom ?? 999 this.defaultState = config.defaultState ?? true; - if(this.id === undefined){ + if (this.id === undefined) { throw "An id is obligated" } if (this.minzoom > this.maxzoom) { @@ -34,7 +34,7 @@ export default class TilesourceConfig { if (this.source.indexOf("{zoom}") >= 0) { throw "Invalid source url: use {z} instead of {zoom} (at " + ctx + ".source)" } - if(!this.defaultState && config.name === undefined){ + if (!this.defaultState && config.name === undefined) { throw "Disabling an overlay without a name is not possible" } } diff --git a/Models/ThemeConfig/WithContextLoader.ts b/Models/ThemeConfig/WithContextLoader.ts new file mode 100644 index 0000000000..ed9e2580a2 --- /dev/null +++ b/Models/ThemeConfig/WithContextLoader.ts @@ -0,0 +1,109 @@ +import TagRenderingConfig from "./TagRenderingConfig"; +import SharedTagRenderings from "../../Customizations/SharedTagRenderings"; +import {TagRenderingConfigJson} from "./Json/TagRenderingConfigJson"; +import {Utils} from "../../Utils"; + +export default class WithContextLoader { + protected readonly _context: string; + private readonly _json: any; + + public static getKnownTagRenderings : ((id: string) => TagRenderingConfigJson)= function(id) { + return SharedTagRenderings.SharedTagRenderingJson.get(id) +} + + constructor(json: any, context: string) { + this._json = json; + this._context = context; + } + + /** Given a key, gets the corresponding property from the json (or the default if not found + * + * The found value is interpreted as a tagrendering and fetched/parsed + * */ + public tr(key: string, deflt) { + const v = this._json[key]; + if (v === undefined || v === null) { + if (deflt === undefined) { + return undefined; + } + return new TagRenderingConfig( + deflt, + `${this._context}.${key}.default value` + ); + } + if (typeof v === "string") { + const shared = SharedTagRenderings.SharedTagRendering.get(v); + if (shared) { + return shared; + } + } + return new TagRenderingConfig( + v, + `${this._context}.${key}` + ); + } + + /** + * Converts a list of tagRenderingCOnfigJSON in to TagRenderingConfig + * A string is interpreted as a name to call + */ + public ParseTagRenderings( + tagRenderings: (string | { builtin: string, override: any } | TagRenderingConfigJson)[], + options?:{ + /** + * Throw an error if 'question' is defined + */ + readOnlyMode?: boolean, + requiresId?: boolean + prepConfig?: ((config: TagRenderingConfigJson) => TagRenderingConfigJson) + + } + ): TagRenderingConfig[] { + if (tagRenderings === undefined) { + return []; + } + + const context = this._context + const renderings: TagRenderingConfig[] = [] + options = options ?? {} + if (options.prepConfig === undefined) { + options.prepConfig = c => c + } + for (let i = 0; i < tagRenderings.length; i++) { + let renderingJson = tagRenderings[i] + if (typeof renderingJson === "string") { + renderingJson = {builtin: renderingJson, override: undefined} + } + + if (renderingJson["builtin"] !== undefined) { + const renderingId = renderingJson["builtin"] + let sharedJson = WithContextLoader.getKnownTagRenderings(renderingId) + if (sharedJson === undefined) { + const keys = Array.from(SharedTagRenderings.SharedTagRenderingJson.keys()); + throw `Predefined tagRendering ${renderingId} not found in ${context}.\n Try one of ${keys.join( + ", " + )}\n If you intent to output this text literally, use {\"render\": } instead"}`; + } + if (renderingJson["override"] !== undefined) { + sharedJson = Utils.Merge(renderingJson["override"], JSON.parse(JSON.stringify(sharedJson))) + } + renderingJson = sharedJson + } + + + const patchedConfig = options.prepConfig(renderingJson) + + const tr = new TagRenderingConfig(patchedConfig, `${context}.tagrendering[${i}]`); + if(options.readOnlyMode && tr.question !== undefined){ + throw "A question is defined for "+`${context}.tagrendering[${i}], but this is not allowed at this position - probably because this rendering is an icon, badge or label` + } + if(options.requiresId && tr.id === ""){ + throw `${context}.tagrendering[${i}] has an invalid ID - make sure it is defined and not empty` + } + + renderings.push(tr) + } + + return renderings; + } +} \ No newline at end of file diff --git a/Models/TileRange.ts b/Models/TileRange.ts index cccfe19643..9a585a30e5 100644 --- a/Models/TileRange.ts +++ b/Models/TileRange.ts @@ -1,5 +1,5 @@ import {control} from "leaflet"; -import zoom = control.zoom; + export interface TileRange { xstart: number, @@ -15,7 +15,7 @@ export class Tiles { public static MapRange(tileRange: TileRange, f: (x: number, y: number) => T): T[] { const result: T[] = [] const total = tileRange.total - if(total > 100000){ + if (total > 100000) { throw "Tilerange too big" } for (let x = tileRange.xstart; x <= tileRange.xend; x++) { @@ -27,24 +27,6 @@ export class Tiles { return result; } - - private static tile2long(x, z) { - return (x / Math.pow(2, z) * 360 - 180); - } - - private static tile2lat(y, z) { - const n = Math.PI - 2 * Math.PI * y / Math.pow(2, z); - return (180 / Math.PI * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)))); - } - - private static lon2tile(lon, zoom) { - return (Math.floor((lon + 180) / 360 * Math.pow(2, zoom))); - } - - private static lat2tile(lat, zoom) { - return (Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, zoom))); - } - /** * Calculates the tile bounds of the * @param z @@ -56,7 +38,6 @@ export class Tiles { return [[Tiles.tile2lat(y, z), Tiles.tile2long(x, z)], [Tiles.tile2lat(y + 1, z), Tiles.tile2long(x + 1, z)]] } - static tile_bounds_lon_lat(z: number, x: number, y: number): [[number, number], [number, number]] { return [[Tiles.tile2long(x, z), Tiles.tile2lat(y, z)], [Tiles.tile2long(x + 1, z), Tiles.tile2lat(y + 1, z)]] } @@ -67,13 +48,14 @@ export class Tiles { * @param x * @param y */ - static centerPointOf(z: number, x: number, y: number): [number, number]{ - return [(Tiles.tile2long(x, z) + Tiles.tile2long(x+1, z)) / 2, (Tiles.tile2lat(y, z) + Tiles.tile2lat(y+1, z)) / 2] + static centerPointOf(z: number, x: number, y: number): [number, number] { + return [(Tiles.tile2long(x, z) + Tiles.tile2long(x + 1, z)) / 2, (Tiles.tile2lat(y, z) + Tiles.tile2lat(y + 1, z)) / 2] } - + static tile_index(z: number, x: number, y: number): number { return ((x * (2 << z)) + y) * 100 + z } + /** * Given a tile index number, returns [z, x, y] * @param index @@ -93,7 +75,7 @@ export class Tiles { static embedded_tile(lat: number, lon: number, z: number): { x: number, y: number, z: number } { return {x: Tiles.lon2tile(lon, z), y: Tiles.lat2tile(lat, z), z: z} } - + static TileRangeBetween(zoomlevel: number, lat0: number, lon0: number, lat1: number, lon1: number): TileRange { const t0 = Tiles.embedded_tile(lat0, lon0, zoomlevel) const t1 = Tiles.embedded_tile(lat1, lon1, zoomlevel) @@ -114,5 +96,22 @@ export class Tiles { } } - + private static tile2long(x, z) { + return (x / Math.pow(2, z) * 360 - 180); + } + + private static tile2lat(y, z) { + const n = Math.PI - 2 * Math.PI * y / Math.pow(2, z); + return (180 / Math.PI * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)))); + } + + private static lon2tile(lon, zoom) { + return (Math.floor((lon + 180) / 360 * Math.pow(2, zoom))); + } + + private static lat2tile(lat, zoom) { + return (Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, zoom))); + } + + } \ No newline at end of file diff --git a/Models/Unit.ts b/Models/Unit.ts index 2512580bc2..88f41ee417 100644 --- a/Models/Unit.ts +++ b/Models/Unit.ts @@ -37,7 +37,9 @@ export class Unit { const possiblePostFixes = new Set() function addPostfixesOf(str) { - if(str === undefined){return} + if (str === undefined) { + return + } str = str.toLowerCase() for (let i = 0; i < str.length + 1; i++) { const substr = str.substring(0, i) @@ -54,8 +56,8 @@ export class Unit { this.possiblePostFixes.sort((a, b) => b.length - a.length) } - - static fromJson(json: UnitConfigJson, ctx: string){ + + static fromJson(json: UnitConfigJson, ctx: string) { const appliesTo = json.appliesToKey for (let i = 0; i < appliesTo.length; i++) { let key = appliesTo[i]; @@ -82,7 +84,7 @@ export class Unit { const applicable = json.applicableUnits.map((u, i) => new Denomination(u, `${ctx}.units[${i}]`)) return new Unit(appliesTo, applicable, json.eraseInvalidValues ?? false) } - + isApplicableToKey(key: string | undefined): boolean { if (key === undefined) { return false; @@ -112,7 +114,7 @@ export class Unit { return undefined; } const [stripped, denom] = this.findDenomination(value) - const human = stripped === "1" ? denom?.humanSingular : denom?.human + const human = stripped === "1" ? denom?.humanSingular : denom?.human if (human === undefined) { return new FixedUiElement(stripped ?? value); } diff --git a/README.md b/README.md index 566ab402a8..cd024056a1 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ > Let a thousand flowers bloom -**MapComplete is an OpenStreetMap viewer and editor.** It shows map features on a certain topic, and allows to see, edit and -add new features to the map. It can be seen as a +**MapComplete is an OpenStreetMap viewer and editor.** It shows map features on a certain topic, and allows to see, edit +and add new features to the map. It can be seen as a webversion [crossover of StreetComplete and MapContrib](Docs/MapComplete_vs_other_editors.md). It tries to be just as easy to use as StreetComplete, but it allows to focus on one single theme per instance (e.g. nature, bicycle infrastructure, ...) @@ -15,24 +15,28 @@ infrastructure, ...) - Easy to set up a custom theme - Easy to fall down the rabbit hole of OSM -**The basic functionality is** to download some map features from Overpass and then ask certain questions. An answer is sent -back to directly to OpenStreetMap. +**The basic functionality is** to download some map features from Overpass and then ask certain questions. An answer is +sent back to directly to OpenStreetMap. Furthermore, it shows images present in the `image` tag or, if a `wikidata` or `wikimedia_commons`-tag is present, it follows those to get these images too. -**An explicit non-goal** of MapComplete is to modify geometries of ways. Although adding a point to a way or splitting a way -in two parts might be added one day. +**An explicit non-goal** of MapComplete is to modify geometries of ways. Although adding a point to a way or splitting a +way in two parts might be added one day. -**More about MapComplete:** [Watch Pieter's talk on the 2021 State Of The Map Conference](https://media.ccc.de/v/sotm2021-9448-introduction-and-review-of-mapcomplete) ([YouTube](https://www.youtube.com/watch?v=zTtMn6fNbYY)) about the history, vision and future of MapComplete. +**More about +MapComplete:** [Watch Pieter's talk on the 2021 State Of The Map Conference](https://media.ccc.de/v/sotm2021-9448-introduction-and-review-of-mapcomplete) ([YouTube](https://www.youtube.com/watch?v=zTtMn6fNbYY)) +about the history, vision and future of MapComplete. # Creating your own theme It is possible to quickly make and distribute your own theme + - [please read the documentation on how to do this](Docs/Making_Your_Own_Theme.md). ## Examples +- [An overview of all official themes](https://pietervdvn.github.io/mc/develop/index.html). - [Buurtnatuur.be](http://buurtnatuur.be), developed for the Belgian [Green party](https://www.groen.be/). They also funded the initial development! - [Cyclofix](https://pietervdvn.github.io/MapComplete/index.html?layout=cyclofix), further development @@ -43,7 +47,7 @@ It is possible to quickly make and distribute your own theme - [Map of Maps](https://pietervdvn.github.io/MapComplete/index.html?layout=maps&z=14&lat=50.650&lon=4.2668#element), after a tweet -There are plenty more. Discover them in the app. +There are plenty more. [Discover them in the app](https://mapcomplete.osm.be/index.html). ### Statistics diff --git a/State.ts b/State.ts index f11113f4ae..9a0f478162 100644 --- a/State.ts +++ b/State.ts @@ -14,6 +14,5 @@ export default class State extends FeaturePipelineState { super(layoutToUse) } - } diff --git a/UI/AllThemesGui.ts b/UI/AllThemesGui.ts index e1a94a9fd7..0113ddbc1f 100644 --- a/UI/AllThemesGui.ts +++ b/UI/AllThemesGui.ts @@ -11,23 +11,30 @@ import FeaturedMessage from "./BigComponents/FeaturedMessage"; export default class AllThemesGui { constructor() { - new FixedUiElement("").AttachTo("centermessage") - const state = new UserRelatedState(undefined); - const intro = new Combine([ - LanguagePicker.CreateLanguagePicker(Translations.t.index.title.SupportedLanguages()) - .SetClass("absolute top-2 right-3"), - new IndexText() - ]); - new Combine([ - intro, - new FeaturedMessage(), - new MoreScreen(state, true), - Translations.t.general.aboutMapcomplete - .Subs({"osmcha_link": Utils.OsmChaLinkFor(7)}) - .SetClass("link-underline"), - new FixedUiElement("v" + Constants.vNumber) - ]).SetClass("block m-5 lg:w-3/4 lg:ml-40") - .SetStyle("pointer-events: all;") - .AttachTo("topleft-tools"); + + try { + + new FixedUiElement("").AttachTo("centermessage") + const state = new UserRelatedState(undefined, undefined); + const intro = new Combine([ + LanguagePicker.CreateLanguagePicker(Translations.t.index.title.SupportedLanguages()) + .SetClass("absolute top-2 right-3"), + new IndexText() + ]); + new Combine([ + intro, + new FeaturedMessage(), + new MoreScreen(state, true), + Translations.t.general.aboutMapcomplete + .Subs({"osmcha_link": Utils.OsmChaLinkFor(7)}) + .SetClass("link-underline"), + new FixedUiElement("v" + Constants.vNumber) + ]).SetClass("block m-5 lg:w-3/4 lg:ml-40") + .SetStyle("pointer-events: all;") + .AttachTo("topleft-tools"); + } catch (e) { + new FixedUiElement("Seems like no layers are compiled - check the output of `npm run generate:layeroverview`. Is this visible online? Contact pietervdvn immediately!").SetClass("alert") + .AttachTo("centermessage") + } } -} \ No newline at end of file +} diff --git a/UI/Base/AsyncLazy.ts b/UI/Base/AsyncLazy.ts new file mode 100644 index 0000000000..5d1eed9a96 --- /dev/null +++ b/UI/Base/AsyncLazy.ts @@ -0,0 +1,27 @@ +import BaseUIElement from "../BaseUIElement"; +import {VariableUiElement} from "./VariableUIElement"; +import {UIEventSource} from "../../Logic/UIEventSource"; +import Loading from "./Loading"; + +export default class AsyncLazy extends BaseUIElement { + private readonly _f: () => Promise; + + constructor(f: () => Promise) { + super(); + this._f = f; + } + + protected InnerConstructElement(): HTMLElement { + // The caching of the BaseUIElement will guarantee that _f will only be called once + + return new VariableUiElement( + UIEventSource.FromPromise(this._f()).map(el => { + if (el === undefined) { + return new Loading() + } + return el + }) + ).ConstructElement() + } + +} \ No newline at end of file diff --git a/UI/Base/Combine.ts b/UI/Base/Combine.ts index 2c64779a79..e714092f62 100644 --- a/UI/Base/Combine.ts +++ b/UI/Base/Combine.ts @@ -30,13 +30,13 @@ export default class Combine extends BaseUIElement { if (subEl === undefined || subEl === null) { continue; } - try{ - - const subHtml = subEl.ConstructElement() - if (subHtml !== undefined) { - el.appendChild(subHtml) - } - }catch(e){ + try { + + const subHtml = subEl.ConstructElement() + if (subHtml !== undefined) { + el.appendChild(subHtml) + } + } catch (e) { console.error("Could not generate subelement in combine due to ", e) } } diff --git a/UI/Base/Img.ts b/UI/Base/Img.ts index 876265b861..7104dfeb27 100644 --- a/UI/Base/Img.ts +++ b/UI/Base/Img.ts @@ -10,7 +10,7 @@ export default class Img extends BaseUIElement { fallbackImage?: string }) { super(); - if(src === undefined || src === "undefined"){ + if (src === undefined || src === "undefined") { throw "Undefined src for image" } this._src = src; @@ -44,7 +44,7 @@ export default class Img extends BaseUIElement { } el.onerror = () => { if (self._options?.fallbackImage) { - if(el.src === self._options.fallbackImage){ + if (el.src === self._options.fallbackImage) { // Sigh... nothing to be done anymore return; } diff --git a/UI/Base/Lazy.ts b/UI/Base/Lazy.ts index e2b846cd8b..1852099f83 100644 --- a/UI/Base/Lazy.ts +++ b/UI/Base/Lazy.ts @@ -1,16 +1,16 @@ import BaseUIElement from "../BaseUIElement"; -export default class Lazy extends BaseUIElement{ +export default class Lazy extends BaseUIElement { private readonly _f: () => BaseUIElement; - + constructor(f: () => BaseUIElement) { super(); this._f = f; } - + protected InnerConstructElement(): HTMLElement { // The caching of the BaseUIElement will guarantee that _f will only be called once return this._f().ConstructElement(); } - + } \ No newline at end of file diff --git a/UI/Base/Loading.ts b/UI/Base/Loading.ts index c2636c1f33..e577f28471 100644 --- a/UI/Base/Loading.ts +++ b/UI/Base/Loading.ts @@ -1,4 +1,3 @@ -import {FixedUiElement} from "./FixedUiElement"; import {Translation} from "../i18n/Translation"; import Combine from "./Combine"; import Svg from "../../Svg"; @@ -6,11 +5,11 @@ import Translations from "../i18n/Translations"; export default class Loading extends Combine { constructor(msg?: Translation | string) { - const t = Translations.T(msg ) ?? Translations.t.general.loading.Clone(); + const t = Translations.T(msg) ?? Translations.t.general.loading.Clone(); t.SetClass("pl-2") super([ Svg.loading_svg().SetClass("animate-spin").SetStyle("width: 1.5rem; height: 1.5rem;"), - t + t ]) this.SetClass("flex p-1") } diff --git a/UI/Base/Minimap.ts b/UI/Base/Minimap.ts index 32cdadbd63..1a0fd4c029 100644 --- a/UI/Base/Minimap.ts +++ b/UI/Base/Minimap.ts @@ -17,8 +17,11 @@ export interface MinimapOptions { } export interface MinimapObj { - readonly leafletMap: UIEventSource, - installBounds(factor: number | BBox, showRange?: boolean) : void + readonly leafletMap: UIEventSource, + + installBounds(factor: number | BBox, showRange?: boolean): void + + TakeScreenshot(): Promise; } export default class Minimap { diff --git a/UI/Base/MinimapImplementation.ts b/UI/Base/MinimapImplementation.ts index 9ec90bd313..3ade20f176 100644 --- a/UI/Base/MinimapImplementation.ts +++ b/UI/Base/MinimapImplementation.ts @@ -8,6 +8,8 @@ import * as L from "leaflet"; import {Map} from "leaflet"; import Minimap, {MinimapObj, MinimapOptions} from "./Minimap"; import {BBox} from "../../Logic/BBox"; +import 'leaflet-polylineoffset' +import {SimpleMapScreenshoter} from "leaflet-simple-map-screenshoter"; export default class MinimapImplementation extends BaseUIElement implements MinimapObj { private static _nextId = 0; @@ -101,6 +103,12 @@ export default class MinimapImplementation extends BaseUIElement implements Mini }) } + public async TakeScreenshot() { + const screenshotter = new SimpleMapScreenshoter(); + screenshotter.addTo(this.leafletMap.data); + return await screenshotter.takeScreen('image') + } + protected InnerConstructElement(): HTMLElement { const div = document.createElement("div") div.id = this._id; @@ -146,8 +154,8 @@ export default class MinimapImplementation extends BaseUIElement implements Mini const self = this; let currentLayer = this._background.data.layer() let latLon = <[number, number]>[location.data?.lat ?? 0, location.data?.lon ?? 0] - if(isNaN(latLon[0]) || isNaN(latLon[1])){ - latLon = [0,0] + if (isNaN(latLon[0]) || isNaN(latLon[1])) { + latLon = [0, 0] } const options = { center: latLon, diff --git a/UI/Base/ScrollableFullScreen.ts b/UI/Base/ScrollableFullScreen.ts index b9f134565b..b5b15229fc 100644 --- a/UI/Base/ScrollableFullScreen.ts +++ b/UI/Base/ScrollableFullScreen.ts @@ -20,6 +20,7 @@ export default class ScrollableFullScreen extends UIElement { private static readonly empty = new FixedUiElement(""); private static _currentlyOpen: ScrollableFullScreen; public isShown: UIEventSource; + private hashToShow: string; private _component: BaseUIElement; private _fullscreencomponent: BaseUIElement; @@ -28,6 +29,7 @@ export default class ScrollableFullScreen extends UIElement { isShown: UIEventSource = new UIEventSource(false) ) { super(); + this.hashToShow = hashToShow; this.isShown = isShown; if (hashToShow === undefined) { @@ -45,26 +47,20 @@ export default class ScrollableFullScreen extends UIElement { self.Activate(); Hash.hash.setData(hashToShow) } else { - ScrollableFullScreen.clear(); + self.clear(); } }) Hash.hash.addCallback(hash => { - if (hash === hashToShow) { - return + if (!isShown.data) { + return; + } + if (hash === undefined || hash === "" || hash !== hashToShow) { + isShown.setData(false) } - isShown.setData(false) }) } - private static clear() { - ScrollableFullScreen.empty.AttachTo("fullscreen") - const fs = document.getElementById("fullscreen"); - ScrollableFullScreen._currentlyOpen?.isShown?.setData(false); - fs.classList.add("hidden") - Hash.hash.setData(undefined); - } - InnerRender(): BaseUIElement { return this._component; } @@ -77,6 +73,13 @@ export default class ScrollableFullScreen extends UIElement { fs.classList.remove("hidden") } + private clear() { + ScrollableFullScreen.empty.AttachTo("fullscreen") + const fs = document.getElementById("fullscreen"); + ScrollableFullScreen._currentlyOpen?.isShown?.setData(false); + fs.classList.add("hidden") + } + private BuildComponent(title: BaseUIElement, content: BaseUIElement, isShown: UIEventSource) { const returnToTheMap = new Combine([ diff --git a/UI/Base/TabbedComponent.ts b/UI/Base/TabbedComponent.ts index f911c0b41c..d931cf4751 100644 --- a/UI/Base/TabbedComponent.ts +++ b/UI/Base/TabbedComponent.ts @@ -6,7 +6,7 @@ import {VariableUiElement} from "./VariableUIElement"; export class TabbedComponent extends Combine { - constructor(elements: { header: BaseUIElement | string, content: BaseUIElement | string }[], + constructor(elements: { header: BaseUIElement | string, content: BaseUIElement | string }[], openedTab: (UIEventSource | number) = 0, options?: { leftOfHeader?: BaseUIElement @@ -15,12 +15,15 @@ export class TabbedComponent extends Combine { const openedTabSrc = typeof (openedTab) === "number" ? new UIEventSource(openedTab) : (openedTab ?? new UIEventSource(0)) - const tabs: BaseUIElement[] = [options?.leftOfHeader ] + const tabs: BaseUIElement[] = [options?.leftOfHeader] const contentElements: BaseUIElement[] = []; for (let i = 0; i < elements.length; i++) { let element = elements[i]; const header = Translations.W(element.header).onClick(() => openedTabSrc.setData(i)) openedTabSrc.addCallbackAndRun(selected => { + if (selected >= elements.length) { + selected = 0 + } if (selected === i) { header.SetClass("tab-active") header.RemoveClass("tab-non-active") @@ -37,7 +40,7 @@ export class TabbedComponent extends Combine { } const header = new Combine(tabs).SetClass("tabs-header-bar") - if(options?.styleHeader){ + if (options?.styleHeader) { options.styleHeader(header) } const actualContent = new VariableUiElement( diff --git a/UI/Base/Title.ts b/UI/Base/Title.ts index d9b1c464c8..adf4b2dd73 100644 --- a/UI/Base/Title.ts +++ b/UI/Base/Title.ts @@ -7,9 +7,9 @@ export default class Title extends BaseUIElement { constructor(embedded: string | BaseUIElement, level: number = 3) { super() - if(typeof embedded === "string"){ - this._embedded = new FixedUiElement(embedded) - }else{ + if (typeof embedded === "string") { + this._embedded = new FixedUiElement(embedded) + } else { this._embedded = embedded } this._level = level; @@ -19,14 +19,14 @@ export default class Title extends BaseUIElement { const embedded = " " + this._embedded.AsMarkdown() + " "; if (this._level == 1) { - return "\n" + embedded + "\n" + "=".repeat(embedded.length) + "\n\n" + return "\n\n" + embedded + "\n" + "=".repeat(embedded.length) + "\n\n" } if (this._level == 2) { - return "\n" + embedded + "\n" + "-".repeat(embedded.length) + "\n\n" + return "\n\n" + embedded + "\n" + "-".repeat(embedded.length) + "\n\n" } - return "\n" + "#".repeat(this._level) + embedded + "\n\n"; + return "\n\n" + "#".repeat(this._level) + embedded + "\n\n"; } protected InnerConstructElement(): HTMLElement { diff --git a/UI/BaseUIElement.ts b/UI/BaseUIElement.ts index a18b259724..b9c085fa54 100644 --- a/UI/BaseUIElement.ts +++ b/UI/BaseUIElement.ts @@ -45,6 +45,9 @@ export default abstract class BaseUIElement { * Adds all the relevant classes, space separated */ public SetClass(clss: string) { + if (clss == undefined) { + return + } const all = clss.split(" ").map(clsName => clsName.trim()); let recordedChange = false; for (let c of all) { @@ -158,7 +161,7 @@ export default abstract class BaseUIElement { } public AsMarkdown(): string { - throw "AsMarkdown is not implemented by " + this.constructor.name + throw "AsMarkdown is not implemented by " + this.constructor.name+"; implement it in the subclass" } protected abstract InnerConstructElement(): HTMLElement; diff --git a/UI/BigComponents/AddNewMarker.ts b/UI/BigComponents/AddNewMarker.ts index 09210bb52a..e51152c7db 100644 --- a/UI/BigComponents/AddNewMarker.ts +++ b/UI/BigComponents/AddNewMarker.ts @@ -16,12 +16,12 @@ export default class AddNewMarker extends Combine { const layer = filteredLayer.layerDef; for (const preset of filteredLayer.layerDef.presets) { const tags = TagUtils.KVtoProperties(preset.tags) - const icon = layer.GenerateLeafletStyle(new UIEventSource(tags), false).icon.html + const icon = layer.mapRendering[0].GenerateLeafletStyle(new UIEventSource(tags), false).html .SetClass("block relative") .SetStyle("width: 42px; height: 42px;"); icons.push(icon) if (last === undefined) { - last = layer.GenerateLeafletStyle(new UIEventSource(tags), false).icon.html + last = layer.mapRendering[0].GenerateLeafletStyle(new UIEventSource(tags), false).html .SetClass("block relative") .SetStyle("width: 42px; height: 42px;"); } diff --git a/UI/BigComponents/Attribution.ts b/UI/BigComponents/Attribution.ts index 1bcdcbc9ea..e2f6b65629 100644 --- a/UI/BigComponents/Attribution.ts +++ b/UI/BigComponents/Attribution.ts @@ -15,7 +15,7 @@ import {Utils} from "../../Utils"; */ export default class Attribution extends Combine { - constructor(location: UIEventSource, + constructor(location: UIEventSource, userDetails: UIEventSource, layoutToUse: LayoutConfig, currentBounds: UIEventSource) { @@ -56,6 +56,7 @@ export default class Attribution extends Combine { ) ) super([mapComplete, reportBug, stats, editHere, editWithJosm, mapillary]); + this.SetClass("flex") } diff --git a/UI/BigComponents/AttributionPanel.ts b/UI/BigComponents/AttributionPanel.ts deleted file mode 100644 index c18c8d2875..0000000000 --- a/UI/BigComponents/AttributionPanel.ts +++ /dev/null @@ -1,140 +0,0 @@ -import Combine from "../Base/Combine"; -import Translations from "../i18n/Translations"; -import Attribution from "./Attribution"; -import State from "../../State"; -import {UIEventSource} from "../../Logic/UIEventSource"; -import {FixedUiElement} from "../Base/FixedUiElement"; -import * as licenses from "../../assets/generated/license_info.json" -import SmallLicense from "../../Models/smallLicense"; -import {Utils} from "../../Utils"; -import Link from "../Base/Link"; -import {VariableUiElement} from "../Base/VariableUIElement"; -import * as contributors from "../../assets/contributors.json" -import BaseUIElement from "../BaseUIElement"; -import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; - -/** - * The attribution panel shown on mobile - */ -export default class AttributionPanel extends Combine { - - private static LicenseObject = AttributionPanel.GenerateLicenses(); - - constructor(layoutToUse: LayoutConfig, contributions: UIEventSource>) { - super([ - Translations.t.general.attribution.attributionContent, - ((layoutToUse.maintainer ?? "") == "") ? "" : Translations.t.general.attribution.themeBy.Subs({author: layoutToUse.maintainer}), - layoutToUse.credits, - "
", - new Attribution(State.state.locationControl, State.state.osmConnection.userDetails, State.state.layoutToUse, State.state.currentBounds), - "
", - - new VariableUiElement(contributions.map(contributions => { - if(contributions === undefined){ - return "" - } - const sorted = Array.from(contributions, ([name, value]) => ({ - name, - value - })).filter(x => x.name !== undefined && x.name !== "undefined"); - if (sorted.length === 0) { - return ""; - } - sorted.sort((a, b) => b.value - a.value); - let hiddenCount = 0; - if (sorted.length > 10) { - hiddenCount = sorted.length - 10 - sorted.splice(10, sorted.length - 10) - } - const links = sorted.map(kv => `${kv.name}`) - const contribs = links.join(", ") - - if (hiddenCount <= 0) { - return Translations.t.general.attribution.mapContributionsBy.Subs({ - contributors: contribs - }) - } else { - return Translations.t.general.attribution.mapContributionsByAndHidden.Subs({ - contributors: contribs, - hiddenCount: hiddenCount - }); - } - - - })), - "
", - AttributionPanel.CodeContributors(), - "

", Translations.t.general.attribution.iconAttribution.title.Clone().SetClass("pt-6 pb-3"), "

", - ...Utils.NoNull(Array.from(layoutToUse.ExtractImages())) - .map(AttributionPanel.IconAttribution) - ]); - this.SetClass("flex flex-col link-underline overflow-hidden") - this.SetStyle("max-width: calc(100vw - 5em); width: 40rem;") - } - - private static CodeContributors(): BaseUIElement { - - const total = contributors.contributors.length; - let filtered = [...contributors.contributors] - - filtered.splice(10, total - 10); - - let contribsStr = filtered.map(c => c.contributor).join(", ") - - if (contribsStr === "") { - // Hmm, something went wrong loading the contributors list. Lets show nothing - return undefined; - } - - return Translations.t.general.attribution.codeContributionsBy.Subs({ - contributors: contribsStr, - hiddenCount: total - 10 - }); - } - - private static IconAttribution(iconPath: string): BaseUIElement { - if (iconPath.startsWith("http")) { - iconPath = "." + new URL(iconPath).pathname; - } - - const license: SmallLicense = AttributionPanel.LicenseObject[iconPath] - if (license == undefined) { - return undefined; - } - if (license.license.indexOf("trivial") >= 0) { - return undefined; - } - - const sources = Utils.NoNull(Utils.NoEmpty(license.sources)) - - return new Combine([ - ``, - new Combine([ - new FixedUiElement(license.authors.join("; ")).SetClass("font-bold"), - new Combine([license.license, - sources.length > 0 ? " - " : "", - ...sources.map(lnk => { - let sourceLinkContent = lnk; - try { - sourceLinkContent = new URL(lnk).hostname - } catch { - console.error("Not a valid URL:", lnk) - } - return new Link(sourceLinkContent, lnk, true); - }) - ] - ).SetClass("block m-2") - - ]).SetClass("flex flex-col").SetStyle("width: calc(100% - 50px - 0.5em); min-width: 12rem;") - ]).SetClass("flex flex-wrap border-b border-gray-300 m-2 border-box") - } - - private static GenerateLicenses() { - const allLicenses = {} - for (const key in licenses) { - const license: SmallLicense = licenses[key]; - allLicenses[license.path] = license - } - return allLicenses; - } -} \ No newline at end of file diff --git a/UI/BigComponents/CopyrightPanel.ts b/UI/BigComponents/CopyrightPanel.ts new file mode 100644 index 0000000000..ceef210e75 --- /dev/null +++ b/UI/BigComponents/CopyrightPanel.ts @@ -0,0 +1,217 @@ +import Combine from "../Base/Combine"; +import Translations from "../i18n/Translations"; +import Attribution from "./Attribution"; +import State from "../../State"; +import {UIEventSource} from "../../Logic/UIEventSource"; +import {FixedUiElement} from "../Base/FixedUiElement"; +import * as licenses from "../../assets/generated/license_info.json" +import SmallLicense from "../../Models/smallLicense"; +import {Utils} from "../../Utils"; +import Link from "../Base/Link"; +import {VariableUiElement} from "../Base/VariableUIElement"; +import * as contributors from "../../assets/contributors.json" +import BaseUIElement from "../BaseUIElement"; +import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; +import Title from "../Base/Title"; +import {SubtleButton} from "../Base/SubtleButton"; +import Svg from "../../Svg"; +import FeaturePipeline from "../../Logic/FeatureSource/FeaturePipeline"; +import {BBox} from "../../Logic/BBox"; +import Loc from "../../Models/Loc"; +import Toggle from "../Input/Toggle"; +import {OsmConnection} from "../../Logic/Osm/OsmConnection"; +import Constants from "../../Models/Constants"; + +/** + * The attribution panel shown on mobile + */ +export default class CopyrightPanel extends Combine { + + private static LicenseObject = CopyrightPanel.GenerateLicenses(); + + constructor(state: { + layoutToUse: LayoutConfig, + featurePipeline: FeaturePipeline, + currentBounds: UIEventSource, + locationControl: UIEventSource, + osmConnection: OsmConnection + }, contributions: UIEventSource>) { + + const t = Translations.t.general.attribution + const layoutToUse = state.layoutToUse + const josmState = new UIEventSource(undefined) + // Reset after 15s + josmState.stabilized(15000).addCallbackD(_ => josmState.setData(undefined)) + const iconStyle = "height: 1.5rem; width: auto" + const actionButtons = [ + new SubtleButton(Svg.liberapay_ui().SetStyle(iconStyle), t.donate, { + url: "https://liberapay.com/pietervdvn/", + newTab: true + }), + new SubtleButton(Svg.bug_ui().SetStyle(iconStyle), t.openIssueTracker, { + url: "https://github.com/pietervdvn/MapComplete/issues", + newTab: true + }), + new SubtleButton(Svg.statistics_ui().SetStyle(iconStyle), t.openOsmcha.Subs({theme: state.layoutToUse.title}), { + url: Utils.OsmChaLinkFor(31, state.layoutToUse.id), + newTab: true + }), + new VariableUiElement(state.locationControl.map(location => { + const idLink = `https://www.openstreetmap.org/edit?editor=id#map=${location?.zoom ?? 0}/${location?.lat ?? 0}/${location?.lon ?? 0}` + return new SubtleButton(Svg.pencil_ui().SetStyle(iconStyle), t.editId, {url: idLink, newTab: true}) + })), + + new VariableUiElement(state.locationControl.map(location => { + const mapillaryLink = `https://www.mapillary.com/app/?focus=map&lat=${location?.lat ?? 0}&lng=${location?.lon ?? 0}&z=${Math.max((location?.zoom ?? 2) - 1, 1)}` + return new SubtleButton(Svg.mapillary_black_ui().SetStyle(iconStyle), t.openMapillary, { + url: mapillaryLink, + newTab: true + }) + })), + new VariableUiElement(josmState.map(state => { + if (state === undefined) { + return undefined + } + state = state.toUpperCase() + if (state === "OK") { + return t.josmOpened.SetClass("thanks") + } + return t.josmNotOpened.SetClass("alert") + })), + new Toggle( + new SubtleButton(Svg.josm_logo_ui().SetStyle(iconStyle), t.editJosm).onClick(() => { + const bounds: any = state.currentBounds.data; + if (bounds === undefined) { + return undefined + } + const top = bounds.getNorth(); + const bottom = bounds.getSouth(); + const right = bounds.getEast(); + const left = bounds.getWest(); + const josmLink = `http://127.0.0.1:8111/load_and_zoom?left=${left}&right=${right}&top=${top}&bottom=${bottom}` + Utils.download(josmLink).then(answer => josmState.setData(answer.replace(/\n/g, '').trim())).catch(_ => josmState.setData("ERROR")) + }), undefined, state.osmConnection.userDetails.map(ud => ud.loggedIn && ud.csCount >= Constants.userJourney.historyLinkVisible)), + + ] + + const iconAttributions = Utils.NoNull(Array.from(layoutToUse.ExtractImages())) + .map(CopyrightPanel.IconAttribution) + + let maintainer: BaseUIElement = undefined + if (layoutToUse.maintainer !== undefined && layoutToUse.maintainer !== "" && layoutToUse.maintainer.toLowerCase() !== "mapcomplete") { + maintainer = Translations.t.general.attribution.themeBy.Subs({author: layoutToUse.maintainer}) + } + + super([ + Translations.t.general.attribution.attributionContent, + new FixedUiElement("MapComplete "+Constants.vNumber).SetClass("font-bold"), + maintainer, + new Combine(actionButtons).SetClass("block w-full"), + new FixedUiElement(layoutToUse.credits), + new VariableUiElement(contributions.map(contributions => { + if (contributions === undefined) { + return "" + } + const sorted = Array.from(contributions, ([name, value]) => ({ + name, + value + })).filter(x => x.name !== undefined && x.name !== "undefined"); + if (sorted.length === 0) { + return ""; + } + sorted.sort((a, b) => b.value - a.value); + let hiddenCount = 0; + if (sorted.length > 10) { + hiddenCount = sorted.length - 10 + sorted.splice(10, sorted.length - 10) + } + const links = sorted.map(kv => `${kv.name}`) + const contribs = links.join(", ") + + if (hiddenCount <= 0) { + return Translations.t.general.attribution.mapContributionsBy.Subs({ + contributors: contribs + }) + } else { + return Translations.t.general.attribution.mapContributionsByAndHidden.Subs({ + contributors: contribs, + hiddenCount: hiddenCount + }); + } + + + })), + CopyrightPanel.CodeContributors(), + new Title(t.iconAttribution.title, 3), + ...iconAttributions + ].map(e => e?.SetClass("mt-4"))); + this.SetClass("flex flex-col link-underline overflow-hidden") + this.SetStyle("max-width: calc(100vw - 3em); width: 40rem; margin-left: 0.75rem; margin-right: 0.5rem") + } + + private static CodeContributors(): BaseUIElement { + + const total = contributors.contributors.length; + let filtered = [...contributors.contributors] + + filtered.splice(10, total - 10); + + let contribsStr = filtered.map(c => c.contributor).join(", ") + + if (contribsStr === "") { + // Hmm, something went wrong loading the contributors list. Lets show nothing + return undefined; + } + + return Translations.t.general.attribution.codeContributionsBy.Subs({ + contributors: contribsStr, + hiddenCount: total - 10 + }); + } + + private static IconAttribution(iconPath: string): BaseUIElement { + if (iconPath.startsWith("http")) { + iconPath = "." + new URL(iconPath).pathname; + } + + const license: SmallLicense = CopyrightPanel.LicenseObject[iconPath] + if (license == undefined) { + return undefined; + } + if (license.license.indexOf("trivial") >= 0) { + return undefined; + } + + const sources = Utils.NoNull(Utils.NoEmpty(license.sources)) + + return new Combine([ + ``, + new Combine([ + new FixedUiElement(license.authors.join("; ")).SetClass("font-bold"), + new Combine([license.license, + sources.length > 0 ? " - " : "", + ...sources.map(lnk => { + let sourceLinkContent = lnk; + try { + sourceLinkContent = new URL(lnk).hostname + } catch { + console.error("Not a valid URL:", lnk) + } + return new Link(sourceLinkContent, lnk, true); + }) + ] + ).SetClass("block m-2") + + ]).SetClass("flex flex-col").SetStyle("width: calc(100% - 50px - 0.5em); min-width: 12rem;") + ]).SetClass("flex flex-wrap border-b border-gray-300 m-2 border-box") + } + + private static GenerateLicenses() { + const allLicenses = {} + for (const key in licenses) { + const license: SmallLicense = licenses[key]; + allLicenses[license.path] = license + } + return allLicenses; + } +} \ No newline at end of file diff --git a/UI/BigComponents/DownloadPanel.ts b/UI/BigComponents/DownloadPanel.ts index 552f6f3576..5204736258 100644 --- a/UI/BigComponents/DownloadPanel.ts +++ b/UI/BigComponents/DownloadPanel.ts @@ -12,26 +12,25 @@ import FeaturePipeline from "../../Logic/FeatureSource/FeaturePipeline"; import {UIEventSource} from "../../Logic/UIEventSource"; import SimpleMetaTagger from "../../Logic/SimpleMetaTagger"; import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; -import {meta} from "@turf/turf"; import {BBox} from "../../Logic/BBox"; export class DownloadPanel extends Toggle { - + constructor() { const state: { featurePipeline: FeaturePipeline, layoutToUse: LayoutConfig, currentBounds: UIEventSource } = State.state - + const t = Translations.t.general.download const name = State.state.layoutToUse.id; - + const includeMetaToggle = new CheckBoxes([t.includeMetaData.Clone()]) const metaisIncluded = includeMetaToggle.GetValue().map(selected => selected.length > 0) - + const buttonGeoJson = new SubtleButton(Svg.floppy_ui(), new Combine([t.downloadGeojson.Clone().SetClass("font-bold"), t.downloadGeoJsonHelper.Clone()]).SetClass("flex flex-col")) @@ -42,7 +41,7 @@ export class DownloadPanel extends Toggle { mimetype: "application/vnd.geo+json" }); }) - + const buttonCSV = new SubtleButton(Svg.floppy_ui(), new Combine( [t.downloadCSV.Clone().SetClass("font-bold"), @@ -59,9 +58,9 @@ export class DownloadPanel extends Toggle { const downloadButtons = new Combine( [new Title(t.title), - buttonGeoJson, + buttonGeoJson, buttonCSV, - includeMetaToggle, + includeMetaToggle, t.licenseInfo.Clone().SetClass("link-underline")]) .SetClass("w-full flex flex-col border-4 border-gray-300 rounded-3xl p-4") @@ -107,7 +106,7 @@ export class DownloadPanel extends Toggle { } return { - type:"FeatureCollection", + type: "FeatureCollection", features: resultFeatures } diff --git a/UI/BigComponents/FeaturedMessage.ts b/UI/BigComponents/FeaturedMessage.ts index 4c369b1756..aede8e4168 100644 --- a/UI/BigComponents/FeaturedMessage.ts +++ b/UI/BigComponents/FeaturedMessage.ts @@ -20,7 +20,7 @@ export default class FeaturedMessage extends Combine { if (wm.end_date <= now) { continue } - + if (welcome_message !== undefined) { console.warn("Multiple applicable messages today:", welcome_message.featured_theme) } @@ -62,7 +62,7 @@ export default class FeaturedMessage extends Combine { message: wm.message, featured_theme: wm.featured_theme }) - + } return all_messages } diff --git a/UI/BigComponents/FilterView.ts b/UI/BigComponents/FilterView.ts index 71506c398e..3bbfccb905 100644 --- a/UI/BigComponents/FilterView.ts +++ b/UI/BigComponents/FilterView.ts @@ -42,9 +42,8 @@ export default class FilterView extends VariableUiElement { ); const name: Translation = config.config.name; - const styledNameChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem"); - - const styledNameUnChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem"); + const styledNameChecked = name.Clone().SetStyle("font-size:large").SetClass("ml-2"); + const styledNameUnChecked = name.Clone().SetStyle("font-size:large").SetClass("ml-2"); const zoomStatus = new Toggle( @@ -82,6 +81,8 @@ export default class FilterView extends VariableUiElement { const iconStyle = "width:1.5rem;height:1.5rem;margin-left:1.25rem;flex-shrink: 0;"; const icon = new Combine([Svg.checkbox_filled]).SetStyle(iconStyle); + const layer = filteredLayer.layerDef + const iconUnselected = new Combine([Svg.checkbox_empty]).SetStyle( iconStyle ); @@ -95,9 +96,9 @@ export default class FilterView extends VariableUiElement { filteredLayer.layerDef.name ); - const styledNameChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem"); + const styledNameChecked = name.Clone().SetStyle("font-size:large").SetClass("ml-3"); - const styledNameUnChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem"); + const styledNameUnChecked = name.Clone().SetStyle("font-size:large").SetClass("ml-3"); const zoomStatus = new Toggle( @@ -111,11 +112,14 @@ export default class FilterView extends VariableUiElement { const style = "display:flex;align-items:center;padding:0.5rem 0;"; - const layerChecked = new Combine([icon, styledNameChecked, zoomStatus]) + const layerIcon = layer.defaultIcon()?.SetClass("w-8 h-8 ml-2") + const layerIconUnchecked = layer.defaultIcon()?.SetClass("opacity-50 w-8 h-8 ml-2") + + const layerChecked = new Combine([icon, layerIcon, styledNameChecked, zoomStatus]) .SetStyle(style) .onClick(() => filteredLayer.isDisplayed.setData(false)); - const layerNotChecked = new Combine([iconUnselected, styledNameUnChecked]) + const layerNotChecked = new Combine([iconUnselected, layerIconUnchecked, styledNameUnChecked]) .SetStyle(style) .onClick(() => filteredLayer.isDisplayed.setData(true)); diff --git a/UI/BigComponents/FullWelcomePaneWithTabs.ts b/UI/BigComponents/FullWelcomePaneWithTabs.ts index 59ca6e0c9e..38ad51ddb7 100644 --- a/UI/BigComponents/FullWelcomePaneWithTabs.ts +++ b/UI/BigComponents/FullWelcomePaneWithTabs.ts @@ -14,6 +14,9 @@ import Toggle from "../Input/Toggle"; import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; import {Utils} from "../../Utils"; import UserRelatedState from "../../Logic/State/UserRelatedState"; +import Loc from "../../Models/Loc"; +import BaseLayer from "../../Models/BaseLayer"; +import FilteredLayer from "../../Models/FilteredLayer"; export default class FullWelcomePaneWithTabs extends ScrollableFullScreen { @@ -24,7 +27,10 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen { layoutToUse: LayoutConfig, osmConnection: OsmConnection, featureSwitchShareScreen: UIEventSource, - featureSwitchMoreQuests: UIEventSource + featureSwitchMoreQuests: UIEventSource, + locationControl: UIEventSource, + backgroundLayer: UIEventSource, + filteredLayers: UIEventSource } & UserRelatedState) { const layoutToUse = state.layoutToUse; super( @@ -39,7 +45,8 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen { layoutToUse: LayoutConfig, osmConnection: OsmConnection, featureSwitchShareScreen: UIEventSource, - featureSwitchMoreQuests: UIEventSource + featureSwitchMoreQuests: UIEventSource, + locationControl: UIEventSource, backgroundLayer: UIEventSource, filteredLayers: UIEventSource } & UserRelatedState, isShown: UIEventSource): { header: string | BaseUIElement; content: BaseUIElement }[] { @@ -63,10 +70,10 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen { tabs.push({ header: Svg.add_img, content: - new Combine([ - Translations.t.general.morescreen.intro, - new MoreScreen(state) - ]).SetClass("flex flex-col") + new Combine([ + Translations.t.general.morescreen.intro, + new MoreScreen(state) + ]).SetClass("flex flex-col") }); } @@ -77,13 +84,14 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen { layoutToUse: LayoutConfig, osmConnection: OsmConnection, featureSwitchShareScreen: UIEventSource, - featureSwitchMoreQuests: UIEventSource + featureSwitchMoreQuests: UIEventSource, + locationControl: UIEventSource, backgroundLayer: UIEventSource, filteredLayers: UIEventSource } & UserRelatedState, currentTab: UIEventSource, isShown: UIEventSource) { const tabs = FullWelcomePaneWithTabs.ConstructBaseTabs(state, isShown) const tabsWithAboutMc = [...FullWelcomePaneWithTabs.ConstructBaseTabs(state, isShown)] - + tabsWithAboutMc.push({ header: Svg.help, content: new Combine([Translations.t.general.aboutMapcomplete diff --git a/UI/BigComponents/ImportButton.ts b/UI/BigComponents/ImportButton.ts index 197f1f1222..d03bfc45d2 100644 --- a/UI/BigComponents/ImportButton.ts +++ b/UI/BigComponents/ImportButton.ts @@ -4,27 +4,210 @@ import {UIEventSource} from "../../Logic/UIEventSource"; import Combine from "../Base/Combine"; import {VariableUiElement} from "../Base/VariableUIElement"; import Translations from "../i18n/Translations"; -import State from "../../State"; import Constants from "../../Models/Constants"; import Toggle from "../Input/Toggle"; import CreateNewNodeAction from "../../Logic/Osm/Actions/CreateNewNodeAction"; import {Tag} from "../../Logic/Tags/Tag"; import Loading from "../Base/Loading"; +import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; +import {OsmConnection} from "../../Logic/Osm/OsmConnection"; +import {Changes} from "../../Logic/Osm/Changes"; +import {ElementStorage} from "../../Logic/ElementStorage"; +import FeaturePipeline from "../../Logic/FeatureSource/FeaturePipeline"; +import Lazy from "../Base/Lazy"; +import ConfirmLocationOfPoint from "../NewPoint/ConfirmLocationOfPoint"; +import {PresetInfo} from "./SimpleAddUI"; +import Img from "../Base/Img"; +import {Translation} from "../i18n/Translation"; +import FilteredLayer from "../../Models/FilteredLayer"; +import SpecialVisualizations, {SpecialVisualization} from "../SpecialVisualizations"; +import {FixedUiElement} from "../Base/FixedUiElement"; +import Svg from "../../Svg"; +import {Utils} from "../../Utils"; +import Minimap from "../Base/Minimap"; +import ShowDataLayer from "../ShowDataLayer/ShowDataLayer"; +import AllKnownLayers from "../../Customizations/AllKnownLayers"; +import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeatureSource"; +import ShowDataMultiLayer from "../ShowDataLayer/ShowDataMultiLayer"; +import BaseLayer from "../../Models/BaseLayer"; +import ReplaceGeometryAction from "../../Logic/Osm/Actions/ReplaceGeometryAction"; +import CreateWayWithPointReuseAction from "../../Logic/Osm/Actions/CreateWayWithPointReuseAction"; +import OsmChangeAction from "../../Logic/Osm/Actions/OsmChangeAction"; +import FeatureSource from "../../Logic/FeatureSource/FeatureSource"; + + +export interface ImportButtonState { + description?: Translation; + image: () => BaseUIElement, + message: string | BaseUIElement, + originalTags: UIEventSource, + newTags: UIEventSource, + targetLayer: FilteredLayer, + feature: any, + minZoom: number, + state: { + backgroundLayer: UIEventSource; + filteredLayers: UIEventSource; + featureSwitchUserbadge: UIEventSource; + featurePipeline: FeaturePipeline; + allElements: ElementStorage; + selectedElement: UIEventSource; + layoutToUse: LayoutConfig, + osmConnection: OsmConnection, + changes: Changes, + locationControl: UIEventSource<{ zoom: number }> + }, + guiState: { filterViewIsOpened: UIEventSource }, + + snapSettings?: { + snapToLayers: string[], + snapToLayersMaxDist?: number + }, + conflationSettings?: { + conflateWayId: string + } +} + +export class ImportButtonSpecialViz implements SpecialVisualization { + funcName = "import_button" + docs = `This button will copy the data from an external dataset into OpenStreetMap. It is only functional in official themes but can be tested in unofficial themes. + +#### Importing a dataset into OpenStreetMap: requirements + +If you want to import a dataset, make sure that: + +1. The dataset to import has a suitable license +2. The community has been informed of the import +3. All other requirements of the [import guidelines](https://wiki.openstreetmap.org/wiki/Import/Guidelines) have been followed + +There are also some technicalities in your theme to keep in mind: + +1. The new feature will be added and will flow through the program as any other new point as if it came from OSM. + This means that there should be a layer which will match the new tags and which will display it. +2. The original feature from your geojson layer will gain the tag '_imported=yes'. + This should be used to change the appearance or even to hide it (eg by changing the icon size to zero) +3. There should be a way for the theme to detect previously imported points, even after reloading. + A reference number to the original dataset is an excellent way to do this +4. When importing ways, the theme creator is also responsible of avoiding overlapping ways. + +#### Disabled in unofficial themes + +The import button can be tested in an unofficial theme by adding \`test=true\` or \`backend=osm-test\` as [URL-paramter](URL_Parameters.md). +The import button will show up then. If in testmode, you can read the changeset-XML directly in the web console. +In the case that MapComplete is pointed to the testing grounds, the edit will be made on ${OsmConnection.oauth_configs["osm-test"].url} + + +#### Specifying which tags to copy or add + +The argument \`tags\` of the import button takes a \`;\`-seperated list of tags to add. + +${Utils.Special_visualizations_tagsToApplyHelpText} + + +` + args = [ + { + name: "targetLayer", + doc: "The id of the layer where this point should end up. This is not very strict, it will simply result in checking that this layer is shown preventing possible duplicate elements" + }, + { + name: "tags", + doc: "The tags to add onto the new object - see specification above" + }, + { + name: "text", + doc: "The text to show on the button", + defaultValue: "Import this data into OpenStreetMap" + }, + { + name: "icon", + doc: "A nice icon to show in the button", + defaultValue: "./assets/svg/addSmall.svg" + }, + { + name: "minzoom", + doc: "How far the contributor must zoom in before being able to import the point", + defaultValue: "18" + }, { + name: "Snap onto layer(s)/replace geometry with this other way", + doc: " - If the value corresponding with this key starts with 'way/' and the feature is a LineString or Polygon, the original OSM-way geometry will be changed to match the new geometry\n" + + " - If a way of the given layer(s) is closeby, will snap the new point onto this way (similar as preset might snap). To show multiple layers to snap onto, use a `;`-seperated list", + }, { + name: "snap max distance", + doc: "The maximum distance that this point will move to snap onto a layer (in meters)", + defaultValue: "5" + }] + + constr(state, tagSource, args, guiState) { + if (!state.layoutToUse.official && !(state.featureSwitchIsTesting.data || state.osmConnection._oauth_config.url === OsmConnection.oauth_configs["osm-test"].url)) { + return new Combine([new FixedUiElement("The import button is disabled for unofficial themes to prevent accidents.").SetClass("alert"), + new FixedUiElement("To test, add test=true or backend=osm-test to the URL. The changeset will be printed in the console. Please open a PR to officialize this theme to actually enable the import button.")]) + } + const newTags = SpecialVisualizations.generateTagsToApply(args[1], tagSource) + const id = tagSource.data.id; + const feature = state.allElements.ContainingFeatures.get(id) + let minZoom = args[4] == "" ? 18 : Number(args[4]) + if (isNaN(minZoom)) { + console.warn("Invalid minzoom:", minZoom) + minZoom = 18 + } + const message = args[2] + const imageUrl = args[3] + let img: () => BaseUIElement + const targetLayer: FilteredLayer = state.filteredLayers.data.filter(fl => fl.layerDef.id === args[0])[0] + + if (imageUrl !== undefined && imageUrl !== "") { + img = () => new Img(imageUrl) + } else { + img = () => Svg.add_ui() + } + + let snapSettings = undefined + let conflationSettings = undefined + const possibleWayId = tagSource.data[args[5]] + if (possibleWayId?.startsWith("way/")) { + // This is a conflation + conflationSettings = { + conflateWayId: possibleWayId + } + } else { + + + const snapToLayers = args[5]?.split(";").filter(s => s !== "") + const snapToLayersMaxDist = Number(args[6] ?? 6) + + if (targetLayer === undefined) { + const e = "Target layer not defined: error in import button for theme: " + state.layoutToUse.id + ": layer " + args[0] + " not found" + console.error(e) + return new FixedUiElement(e).SetClass("alert") + } + snapSettings = { + snapToLayers, + snapToLayersMaxDist + } + } + + return new ImportButton( + { + state, guiState, image: img, + feature, newTags, message, minZoom, + originalTags: tagSource, + targetLayer, + snapSettings, + conflationSettings + } + ); + } +} export default class ImportButton extends Toggle { - constructor(imageUrl: string | BaseUIElement, message: string | BaseUIElement, - originalTags: UIEventSource, - newTags: UIEventSource, - lat: number, lon: number, - minZoom: number, - state: { - locationControl: UIEventSource<{ zoom: number }> - }) { + + constructor(o: ImportButtonState) { const t = Translations.t.general.add; - const isImported = originalTags.map(tags => tags._imported === "yes") + const isImported = o.originalTags.map(tags => tags._imported === "yes") const appliedTags = new Toggle( new VariableUiElement( - newTags.map(tgs => { + o.newTags.map(tgs => { const parts = [] for (const tag of tgs) { parts.push(tag.key + "=" + tag.value) @@ -32,53 +215,232 @@ export default class ImportButton extends Toggle { const txt = parts.join(" & ") return t.presetInfo.Subs({tags: txt}).SetClass("subtle") })), undefined, - State.state.osmConnection.userDetails.map(ud => ud.csCount >= Constants.userJourney.tagsVisibleAt) + o.state.osmConnection.userDetails.map(ud => ud.csCount >= Constants.userJourney.tagsVisibleAt) ) - const button = new SubtleButton(imageUrl, message) + const button = new SubtleButton(o.image(), o.message) - minZoom = Math.max(16, minZoom ?? 19) + o.minZoom = Math.max(16, o.minZoom ?? 19) - button.onClick(async () => { - if (isImported.data) { - return - } - originalTags.data["_imported"] = "yes" - originalTags.ping() // will set isImported as per its definition - const newElementAction = new CreateNewNodeAction(newTags.data, lat, lon, { - theme: State.state.layoutToUse.id, - changeType: "import" - }) - await State.state.changes.applyAction(newElementAction) - State.state.selectedElement.setData(State.state.allElements.ContainingFeatures.get( - newElementAction.newElementId - )) - console.log("Did set selected element to", State.state.allElements.ContainingFeatures.get( - newElementAction.newElementId - )) - - - }) const withLoadingCheck = new Toggle(new Toggle( - new Loading(t.stillLoading.Clone()), - new Combine([button, appliedTags]).SetClass("flex flex-col"), - State.state.featurePipeline.runningQuery - ),t.zoomInFurther.Clone(), - state.locationControl.map(l => l.zoom >= minZoom) - ) + new Loading(t.stillLoading.Clone()), + new Combine([button, appliedTags]).SetClass("flex flex-col"), + o.state.featurePipeline.runningQuery + ), t.zoomInFurther.Clone(), + o.state.locationControl.map(l => l.zoom >= o.minZoom) + ) const importButton = new Toggle(t.hasBeenImported, withLoadingCheck, isImported) + + const importClicked = new UIEventSource(false); + const importFlow = new Toggle( + ImportButton.createConfirmPanel(o, isImported, importClicked), + importButton, + importClicked + ) + + button.onClick(() => { + importClicked.setData(true); + }) + + const pleaseLoginButton = new Toggle(t.pleaseLogin.Clone() - .onClick(() => State.state.osmConnection.AttemptLogin()) + .onClick(() => o.state.osmConnection.AttemptLogin()) .SetClass("login-button-friendly"), undefined, - State.state.featureSwitchUserbadge) - + o.state.featureSwitchUserbadge) - super(importButton, - pleaseLoginButton, - State.state.osmConnection.isLoggedIn + + super(new Toggle(importFlow, + pleaseLoginButton, + o.state.osmConnection.isLoggedIn + ), + t.wrongType, + new UIEventSource(ImportButton.canBeImported(o.feature)) ) } + + public static createConfirmPanel(o: ImportButtonState, + isImported: UIEventSource, + importClicked: UIEventSource) { + const geometry = o.feature.geometry + if (geometry.type === "Point") { + return new Lazy(() => ImportButton.createConfirmPanelForPoint(o, isImported, importClicked)) + } + + + if (geometry.type === "Polygon" || geometry.type == "LineString") { + return new Lazy(() => ImportButton.createConfirmForWay(o, isImported, importClicked)) + } + console.error("Invalid type to import", geometry.type) + return new FixedUiElement("Invalid geometry type:" + geometry.type).SetClass("alert") + + + } + + public static createConfirmForWay(o: ImportButtonState, + isImported: UIEventSource, + importClicked: UIEventSource): BaseUIElement { + + const confirmationMap = Minimap.createMiniMap({ + allowMoving: true, + background: o.state.backgroundLayer + }) + confirmationMap.SetStyle("height: 20rem; overflow: hidden").SetClass("rounded-xl") + + const relevantFeatures = Utils.NoNull([o.feature, o.state.allElements?.ContainingFeatures?.get(o.conflationSettings?.conflateWayId)]) + // SHow all relevant data - including (eventually) the way of which the geometry will be replaced + new ShowDataMultiLayer({ + leafletMap: confirmationMap.leafletMap, + enablePopups: false, + zoomToFeatures: true, + features: new StaticFeatureSource(relevantFeatures, false), + allElements: o.state.allElements, + layers: o.state.filteredLayers + }) + + let action: OsmChangeAction & { getPreview(): Promise } + + const theme = o.state.layoutToUse.id + const changes = o.state.changes + let confirm: () => Promise + if (o.conflationSettings !== undefined) { + + action = new ReplaceGeometryAction( + o.state, + o.feature, + o.conflationSettings.conflateWayId, + { + theme: o.state.layoutToUse.id, + newTags: o.newTags.data + } + ) + + confirm = async () => { + changes.applyAction(action) + return o.feature.properties.id + } + + } else { + const geom = o.feature.geometry + let coordinates: [number, number][] + if (geom.type === "LineString") { + coordinates = geom.coordinates + } else if (geom.type === "Polygon") { + coordinates = geom.coordinates[0] + } + + + action = new CreateWayWithPointReuseAction( + o.newTags.data, + coordinates, + // @ts-ignore + o.state, + [{ + withinRangeOfM: 1, + ifMatches: new Tag("_is_part_of_building", "true"), + mode: "move_osm_point" + + }] + ) + + + confirm = async () => { + changes.applyAction(action) + return undefined + } + } + + + action.getPreview().then(changePreview => { + new ShowDataLayer({ + leafletMap: confirmationMap.leafletMap, + enablePopups: false, + zoomToFeatures: false, + features: changePreview, + allElements: o.state.allElements, + layerToShow: AllKnownLayers.sharedLayers.get("conflation") + }) + }) + + const confirmButton = new SubtleButton(o.image(), o.message) + confirmButton.onClick(async () => { + { + if (isImported.data) { + return + } + o.originalTags.data["_imported"] = "yes" + o.originalTags.ping() // will set isImported as per its definition + + const idToSelect = await confirm() + + o.state.selectedElement.setData(o.state.allElements.ContainingFeatures.get(idToSelect)) + + } + }) + + const cancel = new SubtleButton(Svg.close_ui(), Translations.t.general.cancel).onClick(() => { + importClicked.setData(false) + }) + + + return new Combine([confirmationMap, confirmButton, cancel]).SetClass("flex flex-col") + } + + public static createConfirmPanelForPoint( + o: ImportButtonState, + isImported: UIEventSource, + importClicked: UIEventSource): BaseUIElement { + + async function confirm() { + if (isImported.data) { + return + } + o.originalTags.data["_imported"] = "yes" + o.originalTags.ping() // will set isImported as per its definition + const geometry = o.feature.geometry + const lat = geometry.coordinates[1] + const lon = geometry.coordinates[0]; + const newElementAction = new CreateNewNodeAction(o.newTags.data, lat, lon, { + theme: o.state.layoutToUse.id, + changeType: "import" + }) + + await o.state.changes.applyAction(newElementAction) + o.state.selectedElement.setData(o.state.allElements.ContainingFeatures.get( + newElementAction.newElementId + )) + } + + function cancel() { + importClicked.setData(false) + } + + const presetInfo = { + tags: o.newTags.data, + icon: o.image, + description: o.description, + layerToAddTo: o.targetLayer, + name: o.message, + title: o.message, + preciseInput: { + snapToLayers: o.snapSettings?.snapToLayers, + maxSnapDistance: o.snapSettings?.snapToLayersMaxDist + } + } + + const [lon, lat] = o.feature.geometry.coordinates + return new ConfirmLocationOfPoint(o.state, o.guiState.filterViewIsOpened, presetInfo, Translations.W(o.message), { + lon, + lat + }, confirm, cancel) + + } + + + private static canBeImported(feature: any) { + const type = feature.geometry.type + return type === "Point" || type === "LineString" || (type === "Polygon" && feature.geometry.coordinates.length === 1) + } } \ No newline at end of file diff --git a/UI/BigComponents/LeftControls.ts b/UI/BigComponents/LeftControls.ts index cc8b9e4c05..b0fc84da23 100644 --- a/UI/BigComponents/LeftControls.ts +++ b/UI/BigComponents/LeftControls.ts @@ -1,7 +1,7 @@ import Combine from "../Base/Combine"; import ScrollableFullScreen from "../Base/ScrollableFullScreen"; import Translations from "../i18n/Translations"; -import AttributionPanel from "./AttributionPanel"; +import CopyrightPanel from "./CopyrightPanel"; import ContributorCount from "../../Logic/ContributorCount"; import Toggle from "../Input/Toggle"; import MapControlButton from "../MapControlButton"; @@ -14,6 +14,8 @@ import Loc from "../../Models/Loc"; import {BBox} from "../../Logic/BBox"; import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; import FilteredLayer from "../../Models/FilteredLayer"; +import BaseLayer from "../../Models/BaseLayer"; +import {OsmConnection} from "../../Logic/Osm/OsmConnection"; export default class LeftControls extends Combine { @@ -26,7 +28,9 @@ export default class LeftControls extends Combine { featureSwitchEnableExport: UIEventSource, featureSwitchExportAsPdf: UIEventSource, filteredLayers: UIEventSource, - featureSwitchFilter: UIEventSource + featureSwitchFilter: UIEventSource, + backgroundLayer: UIEventSource, + osmConnection: OsmConnection }, guiState: { downloadControlIsOpened: UIEventSource, @@ -37,12 +41,12 @@ export default class LeftControls extends Combine { const toggledCopyright = new ScrollableFullScreen( () => Translations.t.general.attribution.attributionTitle.Clone(), () => - new AttributionPanel( - state.layoutToUse, + new CopyrightPanel( + state, new ContributorCount(state).Contributors ), - "copyright", - guiState.copyrightViewIsOpened + "copyright", + guiState.copyrightViewIsOpened ); const copyrightButton = new Toggle( diff --git a/UI/BigComponents/MoreScreen.ts b/UI/BigComponents/MoreScreen.ts index 84475d3bef..6e5cbd9889 100644 --- a/UI/BigComponents/MoreScreen.ts +++ b/UI/BigComponents/MoreScreen.ts @@ -39,110 +39,6 @@ export default class MoreScreen extends Combine { ]); } - - private static createUnofficialThemeList(buttonClass: string, state: UserRelatedState, themeListClasses): BaseUIElement { - return new VariableUiElement(state.installedThemes.map(customThemes => { - if (customThemes.length <= 0) { - return undefined; - } - const customThemeButtons = customThemes.map(theme => MoreScreen.createLinkButton(state, theme.layout, theme.definition)?.SetClass(buttonClass)) - return new Combine([ - Translations.t.general.customThemeIntro.Clone(), - new Combine(customThemeButtons).SetClass(themeListClasses) - ]); - })); - } - - private static createPreviouslyVistedHiddenList(state: UserRelatedState, buttonClass: string, themeListStyle: string) { - const t = Translations.t.general.morescreen - const prefix = "mapcomplete-hidden-theme-" - const hiddenTotal = AllKnownLayouts.layoutsList.filter(layout => layout.hideFromOverview).length - return new Toggle( - new VariableUiElement( - state.osmConnection.preferencesHandler.preferences.map(allPreferences => { - const knownThemes = Utils.NoNull(Object.keys(allPreferences) - .filter(key => key.startsWith(prefix)) - .map(key => key.substring(prefix.length, key.length - "-enabled".length)) - .map(theme => { - return AllKnownLayouts.allKnownLayouts.get(theme); - })) - if (knownThemes.length === 0) { - return undefined - } - - const knownLayouts = new Combine(knownThemes.map(layout => - MoreScreen.createLinkButton(state, layout)?.SetClass(buttonClass) - )).SetClass(themeListStyle) - - return new Combine([ - new Title(t.previouslyHiddenTitle), - t.hiddenExplanation.Subs({hidden_discovered: ""+knownThemes.length,total_hidden: ""+hiddenTotal}), - knownLayouts - ]) - - }) - ).SetClass("flex flex-col"), - undefined, - state.osmConnection.isLoggedIn - ) - - - } - - private static createOfficialThemesList(state: { osmConnection: OsmConnection, locationControl?: UIEventSource }, buttonClass: string): BaseUIElement { - let officialThemes = AllKnownLayouts.layoutsList - - let buttons = officialThemes.map((layout) => { - if (layout === undefined) { - console.trace("Layout is undefined") - return undefined - } - if(layout.hideFromOverview){ - return undefined; - } - const button = MoreScreen.createLinkButton(state, layout)?.SetClass(buttonClass); - if (layout.id === personal.id) { - return new VariableUiElement( - state.osmConnection.userDetails.map(userdetails => userdetails.csCount) - .map(csCount => { - if (csCount < Constants.userJourney.personalLayoutUnlock) { - return undefined - } else { - return button - } - }) - ) - } - return button; - }) - - let customGeneratorLink = MoreScreen.createCustomGeneratorButton(state) - buttons.splice(0, 0, customGeneratorLink); - - return new Combine(buttons) - } - - /* - * Returns either a link to the issue tracker or a link to the custom generator, depending on the achieved number of changesets - * */ - private static createCustomGeneratorButton(state: { osmConnection: OsmConnection }): VariableUiElement { - const tr = Translations.t.general.morescreen; - return new VariableUiElement( - state.osmConnection.userDetails.map(userDetails => { - if (userDetails.csCount < Constants.userJourney.themeGeneratorReadOnlyUnlock) { - return new SubtleButton(null, tr.requestATheme.Clone(), { - url: "https://github.com/pietervdvn/MapComplete/issues", - newTab: true - }); - } - return new SubtleButton(Svg.pencil_ui(), tr.createYourOwnTheme.Clone(), { - url: "https://pietervdvn.github.io/mc/legacy/070/customGenerator.html", - newTab: false - }); - }) - ) - } - /** * Creates a button linking to the given theme * @private @@ -161,7 +57,7 @@ export default class MoreScreen extends Combine { console.error("ID is undefined for layout", layout); return undefined; } - + if (layout.id === state?.layoutToUse?.id) { return undefined; } @@ -210,5 +106,110 @@ export default class MoreScreen extends Combine { ]), {url: linkText, newTab: false}); } + private static createUnofficialThemeList(buttonClass: string, state: UserRelatedState, themeListClasses): BaseUIElement { + return new VariableUiElement(state.installedThemes.map(customThemes => { + if (customThemes.length <= 0) { + return undefined; + } + const customThemeButtons = customThemes.map(theme => MoreScreen.createLinkButton(state, theme.layout, theme.definition)?.SetClass(buttonClass)) + return new Combine([ + Translations.t.general.customThemeIntro.Clone(), + new Combine(customThemeButtons).SetClass(themeListClasses) + ]); + })); + } + + private static createPreviouslyVistedHiddenList(state: UserRelatedState, buttonClass: string, themeListStyle: string) { + const t = Translations.t.general.morescreen + const prefix = "mapcomplete-hidden-theme-" + const hiddenTotal = AllKnownLayouts.layoutsList.filter(layout => layout.hideFromOverview).length + return new Toggle( + new VariableUiElement( + state.osmConnection.preferencesHandler.preferences.map(allPreferences => { + const knownThemes = Utils.NoNull(Object.keys(allPreferences) + .filter(key => key.startsWith(prefix)) + .map(key => key.substring(prefix.length, key.length - "-enabled".length)) + .map(theme => AllKnownLayouts.allKnownLayouts.get(theme))) + .filter(theme => theme?.hideFromOverview) + if (knownThemes.length === 0) { + return undefined + } + + const knownLayouts = new Combine(knownThemes.map(layout => + MoreScreen.createLinkButton(state, layout)?.SetClass(buttonClass) + )).SetClass(themeListStyle) + + return new Combine([ + new Title(t.previouslyHiddenTitle), + t.hiddenExplanation.Subs({ + hidden_discovered: "" + knownThemes.length, + total_hidden: "" + hiddenTotal + }), + knownLayouts + ]) + + }) + ).SetClass("flex flex-col"), + undefined, + state.osmConnection.isLoggedIn + ) + + + } + + private static createOfficialThemesList(state: { osmConnection: OsmConnection, locationControl?: UIEventSource }, buttonClass: string): BaseUIElement { + let officialThemes = AllKnownLayouts.layoutsList + + let buttons = officialThemes.map((layout) => { + if (layout === undefined) { + console.trace("Layout is undefined") + return undefined + } + if (layout.hideFromOverview) { + return undefined; + } + const button = MoreScreen.createLinkButton(state, layout)?.SetClass(buttonClass); + if (layout.id === personal.id) { + return new VariableUiElement( + state.osmConnection.userDetails.map(userdetails => userdetails.csCount) + .map(csCount => { + if (csCount < Constants.userJourney.personalLayoutUnlock) { + return undefined + } else { + return button + } + }) + ) + } + return button; + }) + + let customGeneratorLink = MoreScreen.createCustomGeneratorButton(state) + buttons.splice(0, 0, customGeneratorLink); + + return new Combine(buttons) + } + + /* + * Returns either a link to the issue tracker or a link to the custom generator, depending on the achieved number of changesets + * */ + private static createCustomGeneratorButton(state: { osmConnection: OsmConnection }): VariableUiElement { + const tr = Translations.t.general.morescreen; + return new VariableUiElement( + state.osmConnection.userDetails.map(userDetails => { + if (userDetails.csCount < Constants.userJourney.themeGeneratorReadOnlyUnlock) { + return new SubtleButton(null, tr.requestATheme.Clone(), { + url: "https://github.com/pietervdvn/MapComplete/issues", + newTab: true + }); + } + return new SubtleButton(Svg.pencil_ui(), tr.createYourOwnTheme.Clone(), { + url: "https://pietervdvn.github.io/mc/legacy/070/customGenerator.html", + newTab: false + }); + }) + ) + } + } \ No newline at end of file diff --git a/UI/BigComponents/RightControls.ts b/UI/BigComponents/RightControls.ts index a8853a54fa..470774786a 100644 --- a/UI/BigComponents/RightControls.ts +++ b/UI/BigComponents/RightControls.ts @@ -4,17 +4,21 @@ import MapControlButton from "../MapControlButton"; import GeoLocationHandler from "../../Logic/Actors/GeoLocationHandler"; import Svg from "../../Svg"; import MapState from "../../Logic/State/MapState"; +import ShowDataLayer from "../ShowDataLayer/ShowDataLayer"; +import AllKnownLayers from "../../Customizations/AllKnownLayers"; export default class RightControls extends Combine { - constructor(state:MapState) { + constructor(state: MapState) { + + const geolocatioHandler = new GeoLocationHandler( + state + ) + const geolocationButton = new Toggle( new MapControlButton( - new GeoLocationHandler( - state.currentGPSLocation, - state.leafletMap, - state.layoutToUse - ), { + geolocatioHandler + , { dontStyle: true } ), diff --git a/UI/BigComponents/ShareScreen.ts b/UI/BigComponents/ShareScreen.ts index b112b15b05..0f3bd5bae9 100644 --- a/UI/BigComponents/ShareScreen.ts +++ b/UI/BigComponents/ShareScreen.ts @@ -8,11 +8,14 @@ import Toggle from "../Input/Toggle"; import Translations from "../i18n/Translations"; import BaseUIElement from "../BaseUIElement"; import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; -import MapState from "../../Logic/State/MapState"; +import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; +import Loc from "../../Models/Loc"; +import BaseLayer from "../../Models/BaseLayer"; +import FilteredLayer from "../../Models/FilteredLayer"; export default class ShareScreen extends Combine { - constructor(state: MapState) { + constructor(state: { layoutToUse: LayoutConfig, locationControl: UIEventSource, backgroundLayer: UIEventSource, filteredLayers: UIEventSource }) { const layout = state?.layoutToUse; const tr = Translations.t.general.sharescreen; @@ -59,40 +62,39 @@ export default class ShareScreen extends Combine { } - - const currentLayer: UIEventSource<{ id: string, name: string, layer: any }> = state.backgroundLayer; - const currentBackground = new VariableUiElement(currentLayer.map(layer => { - return tr.fsIncludeCurrentBackgroundMap.Subs({name: layer?.name ?? ""}); - })); - const includeCurrentBackground = new Toggle( - new Combine([check(), currentBackground]), - new Combine([nocheck(), currentBackground]), - new UIEventSource(true) - ).ToggleOnClick() - optionCheckboxes.push(includeCurrentBackground); - optionParts.push(includeCurrentBackground.isEnabled.map((includeBG) => { - if (includeBG) { - return "background=" + currentLayer.data.id - } else { - return null - } - }, [currentLayer])); + const currentLayer: UIEventSource<{ id: string, name: string, layer: any }> = state.backgroundLayer; + const currentBackground = new VariableUiElement(currentLayer.map(layer => { + return tr.fsIncludeCurrentBackgroundMap.Subs({name: layer?.name ?? ""}); + })); + const includeCurrentBackground = new Toggle( + new Combine([check(), currentBackground]), + new Combine([nocheck(), currentBackground]), + new UIEventSource(true) + ).ToggleOnClick() + optionCheckboxes.push(includeCurrentBackground); + optionParts.push(includeCurrentBackground.isEnabled.map((includeBG) => { + if (includeBG) { + return "background=" + currentLayer.data.id + } else { + return null + } + }, [currentLayer])); - const includeLayerChoices = new Toggle( - new Combine([check(), tr.fsIncludeCurrentLayers.Clone()]), - new Combine([nocheck(), tr.fsIncludeCurrentLayers.Clone()]), - new UIEventSource(true) - ).ToggleOnClick() - optionCheckboxes.push(includeLayerChoices); + const includeLayerChoices = new Toggle( + new Combine([check(), tr.fsIncludeCurrentLayers.Clone()]), + new Combine([nocheck(), tr.fsIncludeCurrentLayers.Clone()]), + new UIEventSource(true) + ).ToggleOnClick() + optionCheckboxes.push(includeLayerChoices); - optionParts.push(includeLayerChoices.isEnabled.map((includeLayerSelection) => { - if (includeLayerSelection) { - return Utils.NoNull(state.filteredLayers.data.map(fLayerToParam)).join("&") - } else { - return null - } - }, state.filteredLayers.data.map((flayer) => flayer.isDisplayed))); + optionParts.push(includeLayerChoices.isEnabled.map((includeLayerSelection) => { + if (includeLayerSelection) { + return Utils.NoNull(state.filteredLayers.data.map(fLayerToParam)).join("&") + } else { + return null + } + }, state.filteredLayers.data.map((flayer) => flayer.isDisplayed))); const switches = [ diff --git a/UI/BigComponents/SimpleAddUI.ts b/UI/BigComponents/SimpleAddUI.ts index 84e14b6827..04a3aa3145 100644 --- a/UI/BigComponents/SimpleAddUI.ts +++ b/UI/BigComponents/SimpleAddUI.ts @@ -12,18 +12,16 @@ import BaseUIElement from "../BaseUIElement"; import {VariableUiElement} from "../Base/VariableUIElement"; import Toggle from "../Input/Toggle"; import UserDetails, {OsmConnection} from "../../Logic/Osm/OsmConnection"; -import LocationInput from "../Input/LocationInput"; -import AvailableBaseLayers from "../../Logic/Actors/AvailableBaseLayers"; import CreateNewNodeAction from "../../Logic/Osm/Actions/CreateNewNodeAction"; import {OsmObject, OsmWay} from "../../Logic/Osm/OsmObject"; import PresetConfig from "../../Models/ThemeConfig/PresetConfig"; import FilteredLayer from "../../Models/FilteredLayer"; -import {BBox} from "../../Logic/BBox"; import Loc from "../../Models/Loc"; import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; import {Changes} from "../../Logic/Osm/Changes"; import FeaturePipeline from "../../Logic/FeatureSource/FeaturePipeline"; import {ElementStorage} from "../../Logic/ElementStorage"; +import ConfirmLocationOfPoint from "../NewPoint/ConfirmLocationOfPoint"; /* * The SimpleAddUI is a single panel, which can have multiple states: @@ -33,8 +31,7 @@ import {ElementStorage} from "../../Logic/ElementStorage"; * - A 'read your unread messages before adding a point' */ -/*private*/ -interface PresetInfo extends PresetConfig { +export interface PresetInfo extends PresetConfig { name: string | BaseUIElement, icon: () => BaseUIElement, layerToAddTo: FilteredLayer @@ -91,20 +88,29 @@ export default class SimpleAddUI extends Toggle { if (preset === undefined) { return presetsOverview } - return SimpleAddUI.CreateConfirmButton(state, filterViewIsOpened, preset, - (tags, location, snapOntoWayId?: string) => { - if (snapOntoWayId === undefined) { - createNewPoint(tags, location, undefined) - } else { - OsmObject.DownloadObject(snapOntoWayId).addCallbackAndRunD(way => { - createNewPoint(tags, location, way) - return true; - }) - } - }, - () => { - selectedPreset.setData(undefined) - }) + + + function confirm(tags, location, snapOntoWayId?: string) { + if (snapOntoWayId === undefined) { + createNewPoint(tags, location, undefined) + } else { + OsmObject.DownloadObject(snapOntoWayId).addCallbackAndRunD(way => { + createNewPoint(tags, location, way) + return true; + }) + } + } + + function cancel() { + selectedPreset.setData(undefined) + } + + const message = Translations.t.general.add.addNew.Subs({category: preset.name}); + return new ConfirmLocationOfPoint(state, filterViewIsOpened, preset, + message, + state.LastClickLocation.data, + confirm, + cancel) } )) @@ -134,170 +140,7 @@ export default class SimpleAddUI extends Toggle { } - private static CreateConfirmButton( - state: { - LastClickLocation: UIEventSource<{ lat: number, lon: number }>, - osmConnection: OsmConnection, - featurePipeline: FeaturePipeline - }, - filterViewIsOpened: UIEventSource, - preset: PresetInfo, - confirm: (tags: any[], location: { lat: number, lon: number }, snapOntoWayId: string) => void, - cancel: () => void): BaseUIElement { - - let location = state.LastClickLocation; - let preciseInput: LocationInput = undefined - if (preset.preciseInput !== undefined) { - // We uncouple the event source - const locationSrc = new UIEventSource({ - lat: location.data.lat, - lon: location.data.lon, - zoom: 19 - }); - - let backgroundLayer = undefined; - if (preset.preciseInput.preferredBackground) { - backgroundLayer = AvailableBaseLayers.SelectBestLayerAccordingTo(locationSrc, new UIEventSource(preset.preciseInput.preferredBackground)) - } - - let snapToFeatures: UIEventSource<{ feature: any }[]> = undefined - let mapBounds: UIEventSource = undefined - if (preset.preciseInput.snapToLayers) { - snapToFeatures = new UIEventSource<{ feature: any }[]>([]) - mapBounds = new UIEventSource(undefined) - } - - - const tags = TagUtils.KVtoProperties(preset.tags ?? []); - preciseInput = new LocationInput({ - mapBackground: backgroundLayer, - centerLocation: locationSrc, - snapTo: snapToFeatures, - snappedPointTags: tags, - maxSnapDistance: preset.preciseInput.maxSnapDistance, - bounds: mapBounds - }) - preciseInput.installBounds(0.15, true) - preciseInput.SetClass("h-32 rounded-xl overflow-hidden border border-gray").SetStyle("height: 12rem;") - - - if (preset.preciseInput.snapToLayers) { - // We have to snap to certain layers. - // Lets fetch them - - let loadedBbox: BBox = undefined - mapBounds?.addCallbackAndRunD(bbox => { - if (loadedBbox !== undefined && bbox.isContainedIn(loadedBbox)) { - // All is already there - // return; - } - - bbox = bbox.pad(2); - loadedBbox = bbox; - const allFeatures: { feature: any }[] = [] - preset.preciseInput.snapToLayers.forEach(layerId => { - state.featurePipeline.GetFeaturesWithin(layerId, bbox).forEach(feats => allFeatures.push(...feats.map(f => ({feature: f})))) - }) - snapToFeatures.setData(allFeatures) - }) - } - - } - - - let confirmButton: BaseUIElement = new SubtleButton(preset.icon(), - new Combine([ - Translations.t.general.add.addNew.Subs({category: preset.name}), - Translations.t.general.add.warnVisibleForEveryone.Clone().SetClass("alert") - ]).SetClass("flex flex-col") - ).SetClass("font-bold break-words") - .onClick(() => { - confirm(preset.tags, (preciseInput?.GetValue() ?? location).data, preciseInput?.snappedOnto?.data?.properties?.id); - }); - - if (preciseInput !== undefined) { - confirmButton = new Combine([preciseInput, confirmButton]) - } - - const openLayerControl = - new SubtleButton( - Svg.layers_ui(), - new Combine([ - Translations.t.general.add.layerNotEnabled - .Subs({layer: preset.layerToAddTo.layerDef.name}) - .SetClass("alert"), - Translations.t.general.add.openLayerControl - ]) - ) - .onClick(() => filterViewIsOpened.setData(true)) - - - const openLayerOrConfirm = new Toggle( - confirmButton, - openLayerControl, - preset.layerToAddTo.isDisplayed - ) - - const disableFilter = new SubtleButton( - new Combine([ - Svg.filter_ui().SetClass("absolute w-full"), - Svg.cross_bottom_right_svg().SetClass("absolute red-svg") - ]).SetClass("relative"), - new Combine( - [ - Translations.t.general.add.disableFiltersExplanation.Clone(), - Translations.t.general.add.disableFilters.Clone().SetClass("text-xl") - ] - ).SetClass("flex flex-col") - ).onClick(() => { - preset.layerToAddTo.appliedFilters.setData([]) - cancel() - }) - - const disableFiltersOrConfirm = new Toggle( - openLayerOrConfirm, - disableFilter, - preset.layerToAddTo.appliedFilters.map(filters => { - if (filters === undefined || filters.length === 0) { - return true; - } - for (const filter of filters) { - if (filter.selected === 0 && filter.filter.options.length === 1) { - return false; - } - if (filter.selected !== undefined) { - const tags = filter.filter.options[filter.selected].osmTags - if (tags !== undefined && tags["and"]?.length !== 0) { - // This actually doesn't filter anything at all - return false; - } - } - } - return true - - }) - ) - - - const tagInfo = SimpleAddUI.CreateTagInfoFor(preset, state.osmConnection); - - const cancelButton = new SubtleButton(Svg.close_ui(), - Translations.t.general.cancel - ).onClick(cancel) - - return new Combine([ - state.osmConnection.userDetails.data.dryRun ? - Translations.t.general.testing.Clone().SetClass("alert") : undefined, - disableFiltersOrConfirm, - cancelButton, - preset.description, - tagInfo - - ]).SetClass("flex flex-col") - - } - - private static CreateTagInfoFor(preset: PresetInfo, osmConnection: OsmConnection, optionallyLinkToWiki = true) { + public static CreateTagInfoFor(preset: PresetInfo, osmConnection: OsmConnection, optionallyLinkToWiki = true) { const csCount = osmConnection.userDetails.data.csCount; return new Toggle( Translations.t.general.add.presetInfo.Subs({ @@ -329,7 +172,7 @@ export default class SimpleAddUI extends Toggle { private static CreatePresetSelectButton(preset: PresetInfo, osmConnection: OsmConnection) { - const tagInfo = SimpleAddUI.CreateTagInfoFor(preset, osmConnection ,false); + const tagInfo = SimpleAddUI.CreateTagInfoFor(preset, osmConnection, false); return new SubtleButton( preset.icon(), new Combine([ @@ -368,7 +211,7 @@ export default class SimpleAddUI extends Toggle { for (const preset of presets) { const tags = TagUtils.KVtoProperties(preset.tags ?? []); - let icon: () => BaseUIElement = () => layer.layerDef.GenerateLeafletStyle(new UIEventSource(tags), false).icon.html + let icon: () => BaseUIElement = () => layer.layerDef.mapRendering[0].GenerateLeafletStyle(new UIEventSource(tags), false).html .SetClass("w-12 h-12 block relative"); const presetInfo: PresetInfo = { tags: preset.tags, diff --git a/UI/DefaultGUI.ts b/UI/DefaultGUI.ts index e259b4f2e3..a4ac2ddee0 100644 --- a/UI/DefaultGUI.ts +++ b/UI/DefaultGUI.ts @@ -6,9 +6,6 @@ import FullWelcomePaneWithTabs from "./BigComponents/FullWelcomePaneWithTabs"; import MapControlButton from "./MapControlButton"; import Svg from "../Svg"; import Toggle from "./Input/Toggle"; -import Hash from "../Logic/Web/Hash"; -import {QueryParameters} from "../Logic/Web/QueryParameters"; -import Constants from "../Models/Constants"; import UserBadge from "./BigComponents/UserBadge"; import SearchAndGo from "./BigComponents/SearchAndGo"; import Link from "./Base/Link"; @@ -24,76 +21,7 @@ import Translations from "./i18n/Translations"; import SimpleAddUI from "./BigComponents/SimpleAddUI"; import StrayClickHandler from "../Logic/Actors/StrayClickHandler"; import Lazy from "./Base/Lazy"; - -export class DefaultGuiState { - public readonly welcomeMessageIsOpened : UIEventSource; - public readonly downloadControlIsOpened: UIEventSource; - public readonly filterViewIsOpened: UIEventSource; - public readonly copyrightViewIsOpened: UIEventSource; - public readonly welcomeMessageOpenedTab: UIEventSource - public readonly allFullScreenStates: UIEventSource[] = [] - - constructor() { - - - - this.welcomeMessageOpenedTab = UIEventSource.asFloat(QueryParameters.GetQueryParameter( - "tab", - "0", - `The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >${Constants.userJourney.mapCompleteHelpUnlock} changesets)` - )); - this.welcomeMessageIsOpened = QueryParameters.GetBooleanQueryParameter( - "welcome-control-toggle", - "false", - "Whether or not the welcome panel is shown" - ) - this.downloadControlIsOpened = QueryParameters.GetBooleanQueryParameter( - "download-control-toggle", - "false", - "Whether or not the download panel is shown" - ) - this.filterViewIsOpened = QueryParameters.GetBooleanQueryParameter( - "filter-toggle", - "false", - "Whether or not the filter view is shown" - ) - this.copyrightViewIsOpened = QueryParameters.GetBooleanQueryParameter( - "copyright-toggle", - "false", - "Whether or not the copyright view is shown" - ) - if(Hash.hash.data === "download"){ - this.downloadControlIsOpened.setData(true) - } - if(Hash.hash.data === "filter"){ - this.filterViewIsOpened.setData(true) - } - if(Hash.hash.data === "copyright"){ - this.copyrightViewIsOpened.setData(true) - } - if(Hash.hash.data === "" || Hash.hash.data === undefined || Hash.hash.data === "welcome"){ - this.welcomeMessageIsOpened.setData(true) - } - - this.allFullScreenStates.push(this.downloadControlIsOpened, this.filterViewIsOpened, this.copyrightViewIsOpened, this.welcomeMessageIsOpened) - - for (let i = 0; i < this.allFullScreenStates.length; i++){ - const fullScreenState = this.allFullScreenStates[i]; - for (let j = 0; j < this.allFullScreenStates.length; j++){ - if(i == j){ - continue - } - const otherState = this.allFullScreenStates[j]; - fullScreenState.addCallbackAndRunD(isOpened => { - if(isOpened){ - otherState.setData(false) - } - }) - } - } - - } -} +import {DefaultGuiState} from "./DefaultGuiState"; /** @@ -114,127 +42,13 @@ export default class DefaultGUI { Utils.LoadCustomCss(state.layoutToUse.customCss); } - this.SetupUIElements(); this.SetupMap() - - } - - - private SetupMap(){ - const state = this.state; - const guiState = this._guiState; - - // Attach the map - state.mainMapObject.SetClass("w-full h-full") - .AttachTo("leafletDiv") - - this.setupClickDialogOnMap( - guiState.filterViewIsOpened, - state - ) - - - new ShowDataLayer({ - leafletMap: state.leafletMap, - layerToShow: AllKnownLayers.sharedLayers.get("home_location"), - features: state.homeLocation, - enablePopups: false, - }) - - state.leafletMap.addCallbackAndRunD(_ => { - // Lets assume that all showDataLayers are initialized at this point - state.selectedElement.ping() - State.state.locationControl.ping(); - return true; - }) - - } - - private SetupUIElements(){ - const state = this.state; - const guiState = this._guiState; - - const self =this - Toggle.If(state.featureSwitchUserbadge, - () => new UserBadge(state) - ).AttachTo("userbadge") - - Toggle.If(state.featureSwitchSearch, - () => new SearchAndGo(state)) - .AttachTo("searchbox"); - - - let iframePopout: () => BaseUIElement = undefined; - - if (window !== window.top) { - // MapComplete is running in an iframe - iframePopout = () => new VariableUiElement(state.locationControl.map(loc => { - const url = `${window.location.origin}${window.location.pathname}?z=${loc.zoom ?? 0}&lat=${loc.lat ?? 0}&lon=${loc.lon ?? 0}`; - const link = new Link(Svg.pop_out_img, url, true).SetClass("block w-full h-full p-1.5") - return new MapControlButton(link) - })) - - } - - new Toggle(new Lazy(() => self.InitWelcomeMessage()), - Toggle.If(state.featureSwitchIframePopoutEnabled, iframePopout), - state.featureSwitchWelcomeMessage - ).AttachTo("messagesbox"); - - new LeftControls(state, guiState).AttachTo("bottom-left"); - new RightControls(state).AttachTo("bottom-right"); - - new CenterMessageBox(state).AttachTo("centermessage"); - document - .getElementById("centermessage") - .classList.add("pointer-events-none"); - - // We have to ping the welcomeMessageIsOpened and other isOpened-stuff to activate the FullScreenMessage if needed - for (const state of guiState.allFullScreenStates) { - if(state.data){ - state.ping() - } + + if(state.layoutToUse.customCss !== undefined && window.location.pathname.indexOf("index") >= 0){ + Utils.LoadCustomCss(state.layoutToUse.customCss) } - - /** - * At last, if the map moves or an element is selected, we close all the panels just as well - */ - - state.selectedElement.addCallbackAndRunD((_) => { - guiState.allFullScreenStates.forEach(s => s.setData(false)) - }); - } - - private InitWelcomeMessage() : BaseUIElement{ - const isOpened = this._guiState.welcomeMessageIsOpened - const fullOptions = new FullWelcomePaneWithTabs(isOpened, this._guiState.welcomeMessageOpenedTab, this.state); - - // ?-Button on Desktop, opens panel with close-X. - const help = new MapControlButton(Svg.help_svg()); - help.onClick(() => isOpened.setData(true)); - - - const openedTime = new Date().getTime(); - this.state.locationControl.addCallback(() => { - if (new Date().getTime() - openedTime < 15 * 1000) { - // Don't autoclose the first 15 secs when the map is moving - return; - } - isOpened.setData(false); - }); - - this.state.selectedElement.addCallbackAndRunD((_) => { - isOpened.setData(false); - }); - - return new Toggle( - fullOptions.SetClass("welcomeMessage pointer-events-auto"), - help.SetClass("pointer-events-auto"), - isOpened - ) - } public setupClickDialogOnMap(filterViewIsOpened: UIEventSource, state: FeaturePipelineState) { @@ -281,4 +95,120 @@ export default class DefaultGUI { } + private SetupMap() { + const state = this.state; + const guiState = this._guiState; + + // Attach the map + state.mainMapObject.SetClass("w-full h-full") + .AttachTo("leafletDiv") + + this.setupClickDialogOnMap( + guiState.filterViewIsOpened, + state + ) + + + new ShowDataLayer({ + leafletMap: state.leafletMap, + layerToShow: AllKnownLayers.sharedLayers.get("home_location"), + features: state.homeLocation, + enablePopups: false, + }) + + state.leafletMap.addCallbackAndRunD(_ => { + // Lets assume that all showDataLayers are initialized at this point + state.selectedElement.ping() + State.state.locationControl.ping(); + return true; + }) + + } + + private SetupUIElements() { + const state = this.state; + const guiState = this._guiState; + + const self = this + Toggle.If(state.featureSwitchUserbadge, + () => new UserBadge(state) + ).AttachTo("userbadge") + + Toggle.If(state.featureSwitchSearch, + () => new SearchAndGo(state)) + .AttachTo("searchbox"); + + + let iframePopout: () => BaseUIElement = undefined; + + if (window !== window.top) { + // MapComplete is running in an iframe + iframePopout = () => new VariableUiElement(state.locationControl.map(loc => { + const url = `${window.location.origin}${window.location.pathname}?z=${loc.zoom ?? 0}&lat=${loc.lat ?? 0}&lon=${loc.lon ?? 0}`; + const link = new Link(Svg.pop_out_img, url, true).SetClass("block w-full h-full p-1.5") + return new MapControlButton(link) + })) + + } + + new Toggle(new Lazy(() => self.InitWelcomeMessage()), + Toggle.If(state.featureSwitchIframePopoutEnabled, iframePopout), + state.featureSwitchWelcomeMessage + ).AttachTo("messagesbox"); + + + new LeftControls(state, guiState).AttachTo("bottom-left"); + new RightControls(state).AttachTo("bottom-right"); + + new CenterMessageBox(state).AttachTo("centermessage"); + document + .getElementById("centermessage") + .classList.add("pointer-events-none"); + + // We have to ping the welcomeMessageIsOpened and other isOpened-stuff to activate the FullScreenMessage if needed + for (const state of guiState.allFullScreenStates) { + if (state.data) { + state.ping() + } + } + + /** + * At last, if the map moves or an element is selected, we close all the panels just as well + */ + + state.selectedElement.addCallbackAndRunD((_) => { + guiState.allFullScreenStates.forEach(s => s.setData(false)) + }); + } + + private InitWelcomeMessage(): BaseUIElement { + const isOpened = this._guiState.welcomeMessageIsOpened + const fullOptions = new FullWelcomePaneWithTabs(isOpened, this._guiState.welcomeMessageOpenedTab, this.state); + + // ?-Button on Desktop, opens panel with close-X. + const help = new MapControlButton(Svg.help_svg()); + help.onClick(() => isOpened.setData(true)); + + + const openedTime = new Date().getTime(); + this.state.locationControl.addCallback(() => { + if (new Date().getTime() - openedTime < 15 * 1000) { + // Don't autoclose the first 15 secs when the map is moving + return; + } + isOpened.setData(false); + }); + + this.state.selectedElement.addCallbackAndRunD((_) => { + isOpened.setData(false); + }); + + return new Toggle( + fullOptions.SetClass("welcomeMessage pointer-events-auto"), + help.SetClass("pointer-events-auto"), + isOpened + ) + + } + } \ No newline at end of file diff --git a/UI/DefaultGuiState.ts b/UI/DefaultGuiState.ts new file mode 100644 index 0000000000..537eb4b70b --- /dev/null +++ b/UI/DefaultGuiState.ts @@ -0,0 +1,74 @@ +import {UIEventSource} from "../Logic/UIEventSource"; +import {QueryParameters} from "../Logic/Web/QueryParameters"; +import Constants from "../Models/Constants"; +import Hash from "../Logic/Web/Hash"; + +export class DefaultGuiState { + static state: DefaultGuiState; + public readonly welcomeMessageIsOpened: UIEventSource; + public readonly downloadControlIsOpened: UIEventSource; + public readonly filterViewIsOpened: UIEventSource; + public readonly copyrightViewIsOpened: UIEventSource; + public readonly welcomeMessageOpenedTab: UIEventSource + public readonly allFullScreenStates: UIEventSource[] = [] + + constructor() { + + + this.welcomeMessageOpenedTab = UIEventSource.asFloat(QueryParameters.GetQueryParameter( + "tab", + "0", + `The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >${Constants.userJourney.mapCompleteHelpUnlock} changesets)` + )); + this.welcomeMessageIsOpened = QueryParameters.GetBooleanQueryParameter( + "welcome-control-toggle", + "false", + "Whether or not the welcome panel is shown" + ) + this.downloadControlIsOpened = QueryParameters.GetBooleanQueryParameter( + "download-control-toggle", + "false", + "Whether or not the download panel is shown" + ) + this.filterViewIsOpened = QueryParameters.GetBooleanQueryParameter( + "filter-toggle", + "false", + "Whether or not the filter view is shown" + ) + this.copyrightViewIsOpened = QueryParameters.GetBooleanQueryParameter( + "copyright-toggle", + "false", + "Whether or not the copyright view is shown" + ) + if (Hash.hash.data === "download") { + this.downloadControlIsOpened.setData(true) + } + if (Hash.hash.data === "filters") { + this.filterViewIsOpened.setData(true) + } + if (Hash.hash.data === "copyright") { + this.copyrightViewIsOpened.setData(true) + } + if (Hash.hash.data === "" || Hash.hash.data === undefined || Hash.hash.data === "welcome") { + this.welcomeMessageIsOpened.setData(true) + } + + this.allFullScreenStates.push(this.downloadControlIsOpened, this.filterViewIsOpened, this.copyrightViewIsOpened, this.welcomeMessageIsOpened) + + for (let i = 0; i < this.allFullScreenStates.length; i++) { + const fullScreenState = this.allFullScreenStates[i]; + for (let j = 0; j < this.allFullScreenStates.length; j++) { + if (i == j) { + continue + } + const otherState = this.allFullScreenStates[j]; + fullScreenState.addCallbackAndRunD(isOpened => { + if (isOpened) { + otherState.setData(false) + } + }) + } + } + + } +} \ No newline at end of file diff --git a/UI/ExportPDF.ts b/UI/ExportPDF.ts index e030e30b49..6f27794f85 100644 --- a/UI/ExportPDF.ts +++ b/UI/ExportPDF.ts @@ -1,9 +1,6 @@ - - import jsPDF from "jspdf"; -import {SimpleMapScreenshoter} from "leaflet-simple-map-screenshoter"; import {UIEventSource} from "../Logic/UIEventSource"; -import Minimap from "./Base/Minimap"; +import Minimap, {MinimapObj} from "./Base/Minimap"; import Loc from "../Models/Loc"; import BaseLayer from "../Models/BaseLayer"; import {FixedUiElement} from "./Base/FixedUiElement"; @@ -14,7 +11,7 @@ import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; import FeaturePipeline from "../Logic/FeatureSource/FeaturePipeline"; import ShowDataLayer from "./ShowDataLayer/ShowDataLayer"; import {BBox} from "../Logic/BBox"; -import ShowOverlayLayer from "./ShowDataLayer/ShowOverlayLayer"; + /** * Creates screenshoter to take png screenshot * Creates jspdf and downloads it @@ -63,14 +60,12 @@ export default class ExportPDF { location: new UIEventSource(loc), // We remove the link between the old and the new UI-event source as moving the map while the export is running fucks up the screenshot background: options.background, allowMoving: false, - - - onFullyLoaded: leaflet => window.setTimeout(() => { + onFullyLoaded: _ => window.setTimeout(() => { if (self._screenhotTaken) { return; } try { - self.CreatePdf(leaflet) + self.CreatePdf(minimap) .then(() => self.cleanup()) .catch(() => self.cleanup()) } catch (e) { @@ -85,10 +80,10 @@ export default class ExportPDF { minimap.AttachTo(options.freeDivId) // Next: we prepare the features. Only fully contained features are shown - minimap.leafletMap .addCallbackAndRunD(leaflet => { + minimap.leafletMap.addCallbackAndRunD(leaflet => { const bounds = BBox.fromLeafletBounds(leaflet.getBounds().pad(0.2)) options.features.GetTilesPerLayerWithin(bounds, tile => { - if(tile.layer.layerDef.minzoom > l.zoom){ + if (tile.layer.layerDef.minzoom > l.zoom) { return } new ShowDataLayer( @@ -101,7 +96,7 @@ export default class ExportPDF { } ) }) - + }) State.state.AddAllOverlaysToMap(minimap.leafletMap) @@ -112,20 +107,16 @@ export default class ExportPDF { this._screenhotTaken = true; } - private async CreatePdf(leaflet: L.Map) { + private async CreatePdf(minimap: MinimapObj) { + + console.log("PDF creation started") const t = Translations.t.general.pdf; const layout = this._layout - const screenshotter = new SimpleMapScreenshoter(); - //minimap op index.html -> hidden daar alles op doen en dan weg - //minimap - leaflet map ophalen - boundaries ophalen - State.state.featurePipeline - screenshotter.addTo(leaflet); - let doc = new jsPDF('landscape'); - - const image = (await screenshotter.takeScreen('image')) + const image = await minimap.TakeScreenshot() // @ts-ignore doc.addImage(image, 'PNG', 0, 0, this.mapW, this.mapH); diff --git a/UI/Image/AttributedImage.ts b/UI/Image/AttributedImage.ts index b0bb60d804..031f81cedb 100644 --- a/UI/Image/AttributedImage.ts +++ b/UI/Image/AttributedImage.ts @@ -12,10 +12,10 @@ export class AttributedImage extends Combine { let img: BaseUIElement; let attr: BaseUIElement img = new Img(imageInfo.url, false, { - fallbackImage: imageInfo.provider === Mapillary.singleton ? "./assets/svg/blocked.svg" : undefined + fallbackImage: imageInfo.provider === Mapillary.singleton ? "./assets/svg/blocked.svg" : undefined }); attr = new Attribution(imageInfo.provider.GetAttributionFor(imageInfo.url), - imageInfo.provider.SourceIcon(), + imageInfo.provider.SourceIcon(), ) diff --git a/UI/Image/Attribution.ts b/UI/Image/Attribution.ts index 713b228c61..3db016da0d 100644 --- a/UI/Image/Attribution.ts +++ b/UI/Image/Attribution.ts @@ -13,10 +13,10 @@ export default class Attribution extends VariableUiElement { } super( license.map((license: LicenseInfo) => { - if(license === undefined){ + if (license === undefined) { return undefined } - + return new Combine([ icon?.SetClass("block left").SetStyle("height: 2em; width: 2em; padding-right: 0.5em;"), diff --git a/UI/Image/DeleteImage.ts b/UI/Image/DeleteImage.ts index 68afbb3fc5..eca3dc7381 100644 --- a/UI/Image/DeleteImage.ts +++ b/UI/Image/DeleteImage.ts @@ -15,19 +15,19 @@ export default class DeleteImage extends Toggle { const isDeletedBadge = Translations.t.image.isDeleted.Clone() .SetClass("rounded-full p-1") .SetStyle("color:white;background:#ff8c8c") - .onClick(async() => { - await State.state?.changes?.applyAction(new ChangeTagAction(tags.data.id, new Tag(key, oldValue), tags.data, { - changeType: "answer", - theme: "test" - })) + .onClick(async () => { + await State.state?.changes?.applyAction(new ChangeTagAction(tags.data.id, new Tag(key, oldValue), tags.data, { + changeType: "answer", + theme: "test" + })) }); const deleteButton = Translations.t.image.doDelete.Clone() .SetClass("block w-full pl-4 pr-4") .SetStyle("color:white;background:#ff8c8c; border-top-left-radius:30rem; border-top-right-radius: 30rem;") - .onClick( async() => { - await State.state?.changes?.applyAction( - new ChangeTagAction(tags.data.id, new Tag(key, ""), tags.data,{ + .onClick(async () => { + await State.state?.changes?.applyAction( + new ChangeTagAction(tags.data.id, new Tag(key, ""), tags.data, { changeType: "answer", theme: "test" }) diff --git a/UI/Image/ImageCarousel.ts b/UI/Image/ImageCarousel.ts index 43ce326821..c0fc52eda0 100644 --- a/UI/Image/ImageCarousel.ts +++ b/UI/Image/ImageCarousel.ts @@ -9,7 +9,7 @@ import ImageProvider from "../../Logic/ImageProviders/ImageProvider"; export class ImageCarousel extends Toggle { - constructor(images: UIEventSource<{ key: string, url: string, provider: ImageProvider }[]>, + constructor(images: UIEventSource<{ key: string, url: string, provider: ImageProvider }[]>, tags: UIEventSource, keys: string[]) { const uiElements = images.map((imageURLS: { key: string, url: string, provider: ImageProvider }[]) => { diff --git a/UI/Image/ImageUploadFlow.ts b/UI/Image/ImageUploadFlow.ts index c0407c2089..5a49d8d723 100644 --- a/UI/Image/ImageUploadFlow.ts +++ b/UI/Image/ImageUploadFlow.ts @@ -16,13 +16,13 @@ import {VariableUiElement} from "../Base/VariableUIElement"; export class ImageUploadFlow extends Toggle { - + private static readonly uploadCountsPerId = new Map>() - + constructor(tagsSource: UIEventSource, imagePrefix: string = "image", text: string = undefined) { const perId = ImageUploadFlow.uploadCountsPerId const id = tagsSource.data.id - if(!perId.has(id)){ + if (!perId.has(id)) { perId.set(id, new UIEventSource(0)) } const uploadedCount = perId.get(id) @@ -39,7 +39,7 @@ export class ImageUploadFlow extends Toggle { key = imagePrefix + ":" + freeIndex; } console.log("Adding image:" + key, url); - uploadedCount.data ++ + uploadedCount.data++ uploadedCount.ping() Promise.resolve(State.state.changes .applyAction(new ChangeTagAction( @@ -50,17 +50,17 @@ export class ImageUploadFlow extends Toggle { } ))) }) - + const licensePicker = new LicensePicker() const t = Translations.t.image; - - let labelContent : BaseUIElement - if(text === undefined) { - labelContent = Translations.t.image.addPicture.Clone().SetClass("block align-middle mt-1 ml-3 text-4xl ") - }else{ - labelContent = new FixedUiElement(text).SetClass("block align-middle mt-1 ml-3 text-2xl ") - } + + let labelContent: BaseUIElement + if (text === undefined) { + labelContent = Translations.t.image.addPicture.Clone().SetClass("block align-middle mt-1 ml-3 text-4xl ") + } else { + labelContent = new FixedUiElement(text).SetClass("block align-middle mt-1 ml-3 text-2xl ") + } const label = new Combine([ Svg.camera_plus_ui().SetClass("block w-12 h-12 p-1 text-4xl "), labelContent @@ -74,17 +74,17 @@ export class ImageUploadFlow extends Toggle { for (var i = 0; i < filelist.length; i++) { - const sizeInBytes= filelist[i].size + const sizeInBytes = filelist[i].size console.log(filelist[i].name + " has a size of " + sizeInBytes + " Bytes"); - if(sizeInBytes > uploader.maxFileSizeInMegabytes * 1000000){ + if (sizeInBytes > uploader.maxFileSizeInMegabytes * 1000000) { alert(Translations.t.image.toBig.Subs({ actual_size: (Math.floor(sizeInBytes / 1000000)) + "MB", - max_size: uploader.maxFileSizeInMegabytes+"MB" + max_size: uploader.maxFileSizeInMegabytes + "MB" }).txt) return; } } - + console.log("Received images from the user, starting upload") const license = licensePicker.GetValue()?.data ?? "CC0" @@ -114,31 +114,31 @@ export class ImageUploadFlow extends Toggle { const uploadFlow: BaseUIElement = new Combine([ new VariableUiElement(uploader.queue.map(q => q.length).map(l => { - if(l == 0){ + if (l == 0) { return undefined; } - if(l == 1){ - return t.uploadingPicture.Clone().SetClass("alert") - }else{ + if (l == 1) { + return t.uploadingPicture.Clone().SetClass("alert") + } else { return t.uploadingMultiple.Subs({count: "" + l}).SetClass("alert") } })), new VariableUiElement(uploader.failed.map(q => q.length).map(l => { - if(l==0){ + if (l == 0) { return undefined } return t.uploadFailed.Clone().SetClass("alert"); })), new VariableUiElement(uploadedCount.map(l => { - if(l == 0){ - return undefined; + if (l == 0) { + return undefined; } - if(l == 1){ + if (l == 1) { return t.uploadDone.Clone().SetClass("thanks"); } return t.uploadMultipleDone.Subs({count: l}).SetClass("thanks") })), - + fileSelector, Translations.t.image.respectPrivacy.Clone().SetStyle("font-size:small;"), licensePicker diff --git a/UI/Input/FixedInputElement.ts b/UI/Input/FixedInputElement.ts index 479aba16cb..37e025b799 100644 --- a/UI/Input/FixedInputElement.ts +++ b/UI/Input/FixedInputElement.ts @@ -15,9 +15,9 @@ export class FixedInputElement extends InputElement { comparator: ((t0: T, t1: T) => boolean) = undefined) { super(); this._comparator = comparator ?? ((t0, t1) => t0 == t1); - if(value instanceof UIEventSource){ + if (value instanceof UIEventSource) { this.value = value - }else{ + } else { this.value = new UIEventSource(value); } diff --git a/UI/Input/InputElementMap.ts b/UI/Input/InputElementMap.ts index 548e50363e..a2a50f9d38 100644 --- a/UI/Input/InputElementMap.ts +++ b/UI/Input/InputElementMap.ts @@ -25,8 +25,8 @@ export default class InputElementMap extends InputElement { const self = this; this._value = inputElement.GetValue().map( (t => { - const currentX = self.GetValue()?.data; const newX = toX(t); + const currentX = self.GetValue()?.data; if (isSame(currentX, newX)) { return currentX; } diff --git a/UI/Input/LengthInput.ts b/UI/Input/LengthInput.ts index 4eb39d7e95..7935cde357 100644 --- a/UI/Input/LengthInput.ts +++ b/UI/Input/LengthInput.ts @@ -45,6 +45,7 @@ export default class LengthInput extends InputElement { background: this.background, allowMoving: false, location: this._location, + attribution: true, leafletOptions: { tap: true } diff --git a/UI/Input/LocationInput.ts b/UI/Input/LocationInput.ts index 8e5474c330..df7958de72 100644 --- a/UI/Input/LocationInput.ts +++ b/UI/Input/LocationInput.ts @@ -6,7 +6,6 @@ import BaseLayer from "../../Models/BaseLayer"; import Combine from "../Base/Combine"; import Svg from "../../Svg"; import State from "../../State"; -import AvailableBaseLayers from "../../Logic/Actors/AvailableBaseLayers"; import {GeoOperations} from "../../Logic/GeoOperations"; import ShowDataMultiLayer from "../ShowDataLayer/ShowDataMultiLayer"; import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeatureSource"; @@ -16,7 +15,6 @@ import {FixedUiElement} from "../Base/FixedUiElement"; import ShowDataLayer from "../ShowDataLayer/ShowDataLayer"; import BaseUIElement from "../BaseUIElement"; import Toggle from "./Toggle"; -import {start} from "repl"; export default class LocationInput extends InputElement implements MinimapObj { @@ -25,12 +23,17 @@ export default class LocationInput extends InputElement implements MinimapO id: "matchpoint", source: { osmTags: {and: []} }, - icon: "./assets/svg/crosshair-empty.svg" + mapRendering: [{ + location: ["point","centroid"], + icon: "./assets/svg/crosshair-empty.svg" + }] }, "matchpoint icon", true ) - + IsSelected: UIEventSource = new UIEventSource(false); public readonly snappedOnto: UIEventSource = new UIEventSource(undefined) + public readonly _matching_layer: LayerConfig; + public readonly leafletMap: UIEventSource private _centerLocation: UIEventSource; private readonly mapBackground: UIEventSource; /** @@ -43,10 +46,7 @@ export default class LocationInput extends InputElement implements MinimapO private readonly _maxSnapDistance: number private readonly _snappedPointTags: any; private readonly _bounds: UIEventSource; - public readonly _matching_layer: LayerConfig; private readonly map: BaseUIElement & MinimapObj; - public readonly leafletMap: UIEventSource - private readonly clickLocation: UIEventSource; private readonly _minZoom: number; @@ -83,7 +83,7 @@ export default class LocationInput extends InputElement implements MinimapO } this._matching_layer = matchingLayer; } else { - this._matching_layer = LocationInput.matchLayer + this._matching_layer = LocationInput.matchLayer } this._snappedPoint = options.centerLocation.map(loc => { @@ -96,17 +96,22 @@ export default class LocationInput extends InputElement implements MinimapO let min = undefined; let matchedWay = undefined; for (const feature of self._snapTo.data ?? []) { - const nearestPointOnLine = GeoOperations.nearestPoint(feature.feature, [loc.lon, loc.lat]) - if (min === undefined) { - min = nearestPointOnLine - matchedWay = feature.feature; - continue; - } + try { - if (min.properties.dist > nearestPointOnLine.properties.dist) { - min = nearestPointOnLine - matchedWay = feature.feature; + const nearestPointOnLine = GeoOperations.nearestPoint(feature.feature, [loc.lon, loc.lat]) + if (min === undefined) { + min = nearestPointOnLine + matchedWay = feature.feature; + continue; + } + if (min.properties.dist > nearestPointOnLine.properties.dist) { + min = nearestPointOnLine + matchedWay = feature.feature; + + } + } catch (e) { + console.log("Snapping to a nearest point failed for ", feature.feature, "due to ", e) } } @@ -158,25 +163,33 @@ export default class LocationInput extends InputElement implements MinimapO IsValid(t: Loc): boolean { return t !== undefined; } - + + installBounds(factor: number | BBox, showRange?: boolean): void { + this.map.installBounds(factor, showRange) + } + + TakeScreenshot(): Promise { + return this.map.TakeScreenshot() + } + protected InnerConstructElement(): HTMLElement { try { const self = this; const hasMoved = new UIEventSource(false) - const startLocation = { ...this._centerLocation.data } - this._centerLocation. addCallbackD(newLocation => { + const startLocation = {...this._centerLocation.data} + this._centerLocation.addCallbackD(newLocation => { const f = 100000 console.log(newLocation.lon, startLocation.lon) - const diff = (Math.abs(newLocation.lon * f - startLocation.lon* f ) + Math.abs(newLocation.lat* f - startLocation.lat* f )) - if(diff < 1){ + const diff = (Math.abs(newLocation.lon * f - startLocation.lon * f) + Math.abs(newLocation.lat * f - startLocation.lat * f)) + if (diff < 1) { return; } hasMoved.setData(true) return true; }) this.clickLocation.addCallbackAndRunD(location => this._centerLocation.setData(location)) - if (this._snapTo !== undefined) { - + if (this._snapTo !== undefined) { + // Show the lines to snap to new ShowDataMultiLayer({ features: new StaticFeatureSource(this._snapTo, true), @@ -184,7 +197,7 @@ export default class LocationInput extends InputElement implements MinimapO zoomToFeatures: false, leafletMap: this.map.leafletMap, layers: State.state.filteredLayers, - allElements: State.state.allElements + allElements: State.state.allElements } ) // Show the central point @@ -194,16 +207,16 @@ export default class LocationInput extends InputElement implements MinimapO } return [{feature: loc}]; }) - new ShowDataLayer({ - features: new StaticFeatureSource(matchPoint, true), - enablePopups: false, - zoomToFeatures: false, - leafletMap: this.map.leafletMap, - layerToShow: this._matching_layer, - allElements: State.state.allElements, - selectedElement: State.state.selectedElement - }) - + new ShowDataLayer({ + features: new StaticFeatureSource(matchPoint, true), + enablePopups: false, + zoomToFeatures: false, + leafletMap: this.map.leafletMap, + layerToShow: this._matching_layer, + allElements: State.state.allElements, + selectedElement: State.state.selectedElement + }) + } this.mapBackground.map(layer => { const leaflet = this.map.leafletMap.data @@ -216,19 +229,19 @@ export default class LocationInput extends InputElement implements MinimapO leaflet.setZoom(layer.max_zoom - 1) }, [this.map.leafletMap]) - + const animatedHand = Svg.hand_ui() .SetStyle("width: 2rem; height: unset;") .SetClass("hand-drag-animation block pointer-events-none") - + return new Combine([ new Combine([ Svg.move_arrows_ui() .SetClass("block relative pointer-events-none") .SetStyle("left: -2.5rem; top: -2.5rem; width: 5rem; height: 5rem") - ]).SetClass("block w-0 h-0 z-10 relative") + ]).SetClass("block w-0 h-0 z-10 relative") .SetStyle("background: rgba(255, 128, 128, 0.21); left: 50%; top: 50%; opacity: 0.5"), - + new Toggle(undefined, animatedHand, hasMoved) .SetClass("block w-0 h-0 z-10 relative") @@ -244,9 +257,4 @@ export default class LocationInput extends InputElement implements MinimapO } } - - installBounds(factor: number | BBox, showRange?: boolean): void { - this.map.installBounds(factor, showRange) - } - } \ No newline at end of file diff --git a/UI/Input/Toggle.ts b/UI/Input/Toggle.ts index 886412352f..f62298601b 100644 --- a/UI/Input/Toggle.ts +++ b/UI/Input/Toggle.ts @@ -18,16 +18,8 @@ export default class Toggle extends VariableUiElement { this.isEnabled = isEnabled } - public ToggleOnClick(): Toggle { - const self = this; - this.onClick(() => { - self.isEnabled.setData(!self.isEnabled.data); - }) - return this; - } - - public static If(condition: UIEventSource, constructor: () => BaseUIElement): BaseUIElement { - if(constructor === undefined){ + public static If(condition: UIEventSource, constructor: () => BaseUIElement): BaseUIElement { + if (constructor === undefined) { return undefined } return new Toggle( @@ -35,6 +27,14 @@ export default class Toggle extends VariableUiElement { undefined, condition ) - + + } + + public ToggleOnClick(): Toggle { + const self = this; + this.onClick(() => { + self.isEnabled.setData(!self.isEnabled.data); + }) + return this; } } \ No newline at end of file diff --git a/UI/Input/ValidatedTextField.ts b/UI/Input/ValidatedTextField.ts index ad55543462..181cd5ea61 100644 --- a/UI/Input/ValidatedTextField.ts +++ b/UI/Input/ValidatedTextField.ts @@ -19,6 +19,9 @@ import {FixedInputElement} from "./FixedInputElement"; import WikidataSearchBox from "../Wikipedia/WikidataSearchBox"; import Wikidata from "../../Logic/Web/Wikidata"; import AvailableBaseLayers from "../../Logic/Actors/AvailableBaseLayers"; +import Table from "../Base/Table"; +import Combine from "../Base/Combine"; +import Title from "../Base/Title"; interface TextFieldDef { name: string, @@ -28,21 +31,172 @@ interface TextFieldDef { inputHelper?: (value: UIEventSource, options?: { location: [number, number], mapBackgroundLayer?: UIEventSource, - args: (string | number | boolean)[] + args: (string | number | boolean | any)[] feature?: any }) => InputElement, inputmode?: string } +class WikidataTextField implements TextFieldDef { + name = "wikidata" + explanation = + new Combine([ + "A wikidata identifier, e.g. Q42.", + new Title("Helper arguments"), + new Table(["name", "doc"], + [ + ["key", "the value of this tag will initialize search (default: name)"], + ["options", new Combine(["A JSON-object of type `{ removePrefixes: string[], removePostfixes: string[] }`.", + new Table( + ["subarg", "doc"], + [["removePrefixes", "remove these snippets of text from the start of the passed string to search"], + ["removePostfixes", "remove these snippets of text from the end of the passed string to search"], + ] + )]) + ]]), + new Title("Example usage"), + `The following is the 'freeform'-part of a layer config which will trigger a search for the wikidata item corresponding with the name of the selected feature. It will also remove '-street', '-square', ... if found at the end of the name + +\`\`\` +"freeform": { + "key": "name:etymology:wikidata", + "type": "wikidata", + "helperArgs": [ + "name", + { + "removePostfixes": [ + "street", + "boulevard", + "path", + "square", + "plaza", + ] + } + ] +} +\`\`\`` + ]).AsMarkdown() + + + public isValid(str) { + + if (str === undefined) { + return false; + } + if (str.length <= 2) { + return false; + } + return !str.split(";").some(str => Wikidata.ExtractKey(str) === undefined) + } + + public reformat(str) { + if (str === undefined) { + return undefined; + } + let out = str.split(";").map(str => Wikidata.ExtractKey(str)).join("; ") + if (str.endsWith(";")) { + out = out + ";" + } + return out; + } + + public inputHelper(currentValue, inputHelperOptions) { + const args = inputHelperOptions.args ?? [] + const searchKey = args[0] ?? "name" + + let searchFor = inputHelperOptions.feature?.properties[searchKey]?.toLowerCase() + + const options = args[1] + if (searchFor !== undefined && options !== undefined) { + const prefixes = options["removePrefixes"] + const postfixes = options["removePostfixes"] + for (const postfix of postfixes ?? []) { + if (searchFor.endsWith(postfix)) { + searchFor = searchFor.substring(0, searchFor.length - postfix.length) + break; + } + } + + for (const prefix of prefixes ?? []) { + if (searchFor.startsWith(prefix)) { + searchFor = searchFor.substring(prefix.length) + break; + } + } + + } + + return new WikidataSearchBox({ + value: currentValue, + searchText: new UIEventSource(searchFor) + }) + } +} + +class OpeningHoursTextField implements TextFieldDef { + name = "opening_hours" + explanation = + new Combine([ + "Has extra elements to easily input when a POI is opened.", + new Title("Helper arguments"), + new Table(["name", "doc"], + [ + ["options", new Combine([ + "A JSON-object of type `{ prefix: string, postfix: string }`. ", + new Table(["subarg", "doc"], + [ + ["prefix", "Piece of text that will always be added to the front of the generated opening hours. If the OSM-data does not start with this, it will fail to parse"], + ["postfix", "Piece of text that will always be added to the end of the generated opening hours"], + ]) + + ]) + ] + ]), + new Title("Example usage"), + "To add a conditional (based on time) access restriction:\n\n```\n" + ` +"freeform": { + "key": "access:conditional", + "type": "opening_hours", + "helperArgs": [ + { + "prefix":"no @ (", + "postfix":")" + } + ] +}` + "\n```\n\n*Don't forget to pass the prefix and postfix in the rendering as well*: `{opening_hours_table(opening_hours,yes @ &LPARENS, &RPARENS )`"]).AsMarkdown() + + + isValid() { + return true + } + + reformat(str) { + return str + } + + inputHelper(value: UIEventSource, inputHelperOptions: { + location: [number, number], + mapBackgroundLayer?: UIEventSource, + args: (string | number | boolean | any)[] + feature?: any + }) { + const args = (inputHelperOptions.args ?? [])[0] + const prefix = args?.prefix ?? "" + const postfix = args?.postfix ?? "" + + return new OpeningHoursInput(value, prefix, postfix) + } +} export default class ValidatedTextField { public static tpList: TextFieldDef[] = [ + ValidatedTextField.tp( "string", "A basic string"), ValidatedTextField.tp( "text", - "A string, but allows input of longer strings more comfortably (a text area)", + "A string, but allows input of longer strings more comfortably and supports newlines (a text area)", undefined, undefined, undefined, @@ -117,7 +271,8 @@ export default class ValidatedTextField { if (args[0]) { zoom = Number(args[0]) if (isNaN(zoom)) { - throw "Invalid zoom level for argument at 'length'-input" + console.error("Invalid zoom level for argument at 'length'-input. The offending argument is: ", args[0], " (using 19 instead)") + zoom = 19 } } @@ -146,60 +301,7 @@ export default class ValidatedTextField { }, "decimal" ), - ValidatedTextField.tp( - "wikidata", - "A wikidata identifier, e.g. Q42. Input helper arguments: [ key: the value of this tag will initialize search (default: name), options: { removePrefixes: string[], removePostfixes: string[] } these prefixes and postfixes will be removed from the initial search value]", - (str) => { - if (str === undefined) { - return false; - } - if(str.length <= 2){ - return false; - } - return !str.split(";").some(str => Wikidata.ExtractKey(str) === undefined) - }, - (str) => { - if (str === undefined) { - return undefined; - } - let out = str.split(";").map(str => Wikidata.ExtractKey(str)).join("; ") - if(str.endsWith(";")){ - out = out + ";" - } - return out; - }, - (currentValue, inputHelperOptions) => { - const args = inputHelperOptions.args ?? [] - const searchKey = args[0] ?? "name" - - let searchFor = inputHelperOptions.feature?.properties[searchKey]?.toLowerCase() - - const options = args[1] - if (searchFor !== undefined && options !== undefined) { - const prefixes = options["removePrefixes"] - const postfixes = options["removePostfixes"] - for (const postfix of postfixes ?? []) { - if (searchFor.endsWith(postfix)) { - searchFor = searchFor.substring(0, searchFor.length - postfix.length) - break; - } - } - - for (const prefix of prefixes ?? []) { - if (searchFor.startsWith(prefix)) { - searchFor = searchFor.substring(prefix.length) - break; - } - } - - } - - return new WikidataSearchBox({ - value: currentValue, - searchText: new UIEventSource(searchFor) - }) - } - ), + new WikidataTextField(), ValidatedTextField.tp( "int", @@ -299,15 +401,7 @@ export default class ValidatedTextField { undefined, "tel" ), - ValidatedTextField.tp( - "opening_hours", - "Has extra elements to easily input when a POI is opened", - () => true, - str => str, - (value) => { - return new OpeningHoursInput(value); - } - ), + new OpeningHoursTextField(), ValidatedTextField.tp( "color", "Shows a color picker", @@ -379,6 +473,9 @@ export default class ValidatedTextField { options.inputMode = tp.inputmode; + if(tp.inputmode === "text") { + options.htmlType = "area" + } let input: InputElement = new TextField(options); @@ -458,7 +555,11 @@ export default class ValidatedTextField { public static HelpText(): string { const explanations = ValidatedTextField.tpList.map(type => ["## " + type.name, "", type.explanation].join("\n")).join("\n\n") - return "# Available types for text fields\n\nThe listed types here trigger a special input element. Use them in `tagrendering.freeform.type` of your tagrendering to activate them\n\n" + explanations + return new Combine([ + new Title("Available types for text fields", 1), + "The listed types here trigger a special input element. Use them in `tagrendering.freeform.type` of your tagrendering to activate them", + explanations + ]).SetClass("flex flex-col").AsMarkdown() } private static tp(name: string, diff --git a/UI/Input/VariableInputElement.ts b/UI/Input/VariableInputElement.ts index 1918dfe9a3..f7bb2d8f8f 100644 --- a/UI/Input/VariableInputElement.ts +++ b/UI/Input/VariableInputElement.ts @@ -5,9 +5,9 @@ import {VariableUiElement} from "../Base/VariableUIElement"; export default class VariableInputElement extends InputElement { + public readonly IsSelected: UIEventSource; private readonly value: UIEventSource; private readonly element: BaseUIElement - public readonly IsSelected: UIEventSource; private readonly upstream: UIEventSource>; constructor(upstream: UIEventSource>) { @@ -23,13 +23,12 @@ export default class VariableInputElement extends InputElement { return this.value; } - protected InnerConstructElement(): HTMLElement { - return this.element.ConstructElement(); - } - - IsValid(t: T): boolean { return this.upstream.data.IsValid(t); } + protected InnerConstructElement(): HTMLElement { + return this.element.ConstructElement(); + } + } \ No newline at end of file diff --git a/UI/NewPoint/ConfirmLocationOfPoint.ts b/UI/NewPoint/ConfirmLocationOfPoint.ts new file mode 100644 index 0000000000..68e380997a --- /dev/null +++ b/UI/NewPoint/ConfirmLocationOfPoint.ts @@ -0,0 +1,184 @@ +import {UIEventSource} from "../../Logic/UIEventSource"; +import {OsmConnection} from "../../Logic/Osm/OsmConnection"; +import FeaturePipeline from "../../Logic/FeatureSource/FeaturePipeline"; +import BaseUIElement from "../BaseUIElement"; +import LocationInput from "../Input/LocationInput"; +import AvailableBaseLayers from "../../Logic/Actors/AvailableBaseLayers"; +import {BBox} from "../../Logic/BBox"; +import {TagUtils} from "../../Logic/Tags/TagUtils"; +import {SubtleButton} from "../Base/SubtleButton"; +import Combine from "../Base/Combine"; +import Translations from "../i18n/Translations"; +import Svg from "../../Svg"; +import Toggle from "../Input/Toggle"; +import SimpleAddUI, {PresetInfo} from "../BigComponents/SimpleAddUI"; + +export default class ConfirmLocationOfPoint extends Combine { + + + constructor( + state: { + osmConnection: OsmConnection, + featurePipeline: FeaturePipeline + }, + filterViewIsOpened: UIEventSource, + preset: PresetInfo, + confirmText: BaseUIElement, + loc: { lon: number, lat: number }, + confirm: (tags: any[], location: { lat: number, lon: number }, snapOntoWayId: string) => void, + cancel: () => void, + ) { + + let preciseInput: LocationInput = undefined + if (preset.preciseInput !== undefined) { + // We uncouple the event source + const zloc = {...loc, zoom: 19} + const locationSrc = new UIEventSource(zloc); + + let backgroundLayer = undefined; + if (preset.preciseInput.preferredBackground) { + backgroundLayer = AvailableBaseLayers.SelectBestLayerAccordingTo(locationSrc, new UIEventSource(preset.preciseInput.preferredBackground)) + } + + let snapToFeatures: UIEventSource<{ feature: any }[]> = undefined + let mapBounds: UIEventSource = undefined + if (preset.preciseInput.snapToLayers && preset.preciseInput.snapToLayers.length > 0) { + snapToFeatures = new UIEventSource<{ feature: any }[]>([]) + mapBounds = new UIEventSource(undefined) + } + + + const tags = TagUtils.KVtoProperties(preset.tags ?? []); + preciseInput = new LocationInput({ + mapBackground: backgroundLayer, + centerLocation: locationSrc, + snapTo: snapToFeatures, + snappedPointTags: tags, + maxSnapDistance: preset.preciseInput.maxSnapDistance, + bounds: mapBounds + }) + preciseInput.installBounds(0.15, true) + preciseInput.SetClass("h-32 rounded-xl overflow-hidden border border-gray").SetStyle("height: 12rem;") + + + if (preset.preciseInput.snapToLayers && preset.preciseInput.snapToLayers.length > 0) { + // We have to snap to certain layers. + // Lets fetch them + + let loadedBbox: BBox = undefined + mapBounds?.addCallbackAndRunD(bbox => { + if (loadedBbox !== undefined && bbox.isContainedIn(loadedBbox)) { + // All is already there + // return; + } + + bbox = bbox.pad(2); + loadedBbox = bbox; + const allFeatures: { feature: any }[] = [] + preset.preciseInput.snapToLayers.forEach(layerId => { + console.log("Snapping to", layerId) + state.featurePipeline.GetFeaturesWithin(layerId, bbox)?.forEach(feats => allFeatures.push(...feats.map(f => ({feature: f})))) + }) + console.log("Snapping to", allFeatures) + snapToFeatures.setData(allFeatures) + }) + } + + } + + + let confirmButton: BaseUIElement = new SubtleButton(preset.icon(), + new Combine([ + confirmText, + Translations.t.general.add.warnVisibleForEveryone.Clone().SetClass("alert") + ]).SetClass("flex flex-col") + ).SetClass("font-bold break-words") + .onClick(() => { + confirm(preset.tags, (preciseInput?.GetValue()?.data ?? loc), preciseInput?.snappedOnto?.data?.properties?.id); + }); + + if (preciseInput !== undefined) { + confirmButton = new Combine([preciseInput, confirmButton]) + } + + const openLayerControl = + new SubtleButton( + Svg.layers_ui(), + new Combine([ + Translations.t.general.add.layerNotEnabled + .Subs({layer: preset.layerToAddTo.layerDef.name}) + .SetClass("alert"), + Translations.t.general.add.openLayerControl + ]) + ) + .onClick(() => filterViewIsOpened.setData(true)) + + + const openLayerOrConfirm = new Toggle( + confirmButton, + openLayerControl, + preset.layerToAddTo.isDisplayed + ) + + const disableFilter = new SubtleButton( + new Combine([ + Svg.filter_ui().SetClass("absolute w-full"), + Svg.cross_bottom_right_svg().SetClass("absolute red-svg") + ]).SetClass("relative"), + new Combine( + [ + Translations.t.general.add.disableFiltersExplanation.Clone(), + Translations.t.general.add.disableFilters.Clone().SetClass("text-xl") + ] + ).SetClass("flex flex-col") + ).onClick(() => { + preset.layerToAddTo.appliedFilters.setData([]) + cancel() + }) + + const disableFiltersOrConfirm = new Toggle( + openLayerOrConfirm, + disableFilter, + preset.layerToAddTo.appliedFilters.map(filters => { + if (filters === undefined || filters.length === 0) { + return true; + } + for (const filter of filters) { + if (filter.selected === 0 && filter.filter.options.length === 1) { + return false; + } + if (filter.selected !== undefined) { + const tags = filter.filter.options[filter.selected].osmTags + if (tags !== undefined && tags["and"]?.length !== 0) { + // This actually doesn't filter anything at all + return false; + } + } + } + return true + + }) + ) + + + const tagInfo = SimpleAddUI.CreateTagInfoFor(preset, state.osmConnection); + + const cancelButton = new SubtleButton(Svg.close_ui(), + Translations.t.general.cancel + ).onClick(cancel) + + super([ + state.osmConnection.userDetails.data.dryRun ? + Translations.t.general.testing.Clone().SetClass("alert") : undefined, + disableFiltersOrConfirm, + cancelButton, + preset.description, + tagInfo + + ]) + + this.SetClass("flex flex-col") + + } + +} \ No newline at end of file diff --git a/UI/OpeningHours/OpeningHoursInput.ts b/UI/OpeningHours/OpeningHoursInput.ts index d8d5ce16bd..50aa52cf47 100644 --- a/UI/OpeningHours/OpeningHoursInput.ts +++ b/UI/OpeningHours/OpeningHoursInput.ts @@ -23,11 +23,39 @@ export default class OpeningHoursInput extends InputElement { private readonly _value: UIEventSource; private readonly _element: BaseUIElement; - constructor(value: UIEventSource = new UIEventSource("")) { + constructor(value: UIEventSource = new UIEventSource(""), prefix = "", postfix = "") { super(); this._value = value; + let valueWithoutPrefix = value + if (prefix !== "" && postfix !== "") { - const leftoverRules = value.map(str => { + valueWithoutPrefix = value.map(str => { + if (str === undefined) { + return undefined; + } + if (str === "") { + return "" + } + if (str.startsWith(prefix) && str.endsWith(postfix)) { + return str.substring(prefix.length, str.length - postfix.length) + } + return str + }, [], noPrefix => { + if (noPrefix === undefined) { + return undefined; + } + if (noPrefix === "") { + return "" + } + if (noPrefix.startsWith(prefix) && noPrefix.endsWith(postfix)) { + return noPrefix + } + + return prefix + noPrefix + postfix + }) + } + + const leftoverRules = valueWithoutPrefix.map(str => { if (str === undefined) { return [] } @@ -45,9 +73,9 @@ export default class OpeningHoursInput extends InputElement { return leftOvers; }) // Note: MUST be bound AFTER the leftover rules! - const rulesFromOhPicker = value.map(OH.Parse); + const rulesFromOhPicker = valueWithoutPrefix.map(OH.Parse); - const ph = value.map(str => { + const ph = valueWithoutPrefix.map(str => { if (str === undefined) { return "" } @@ -68,7 +96,7 @@ export default class OpeningHoursInput extends InputElement { ...leftoverRules.data, ph.data ] - value.setData(Utils.NoEmpty(rules).join(";")); + valueWithoutPrefix.setData(Utils.NoEmpty(rules).join(";")); } rulesFromOhPicker.addCallback(update); diff --git a/UI/OpeningHours/OpeningHoursVisualization.ts b/UI/OpeningHours/OpeningHoursVisualization.ts index 785d046a91..9a2a30800a 100644 --- a/UI/OpeningHours/OpeningHoursVisualization.ts +++ b/UI/OpeningHours/OpeningHoursVisualization.ts @@ -23,11 +23,23 @@ export default class OpeningHoursVisualization extends Toggle { Translations.t.general.weekdays.abbreviations.sunday, ] - constructor(tags: UIEventSource, key: string) { + constructor(tags: UIEventSource, key: string, prefix = "", postfix = "") { const tagsDirect = tags.data; const ohTable = new VariableUiElement(tags - .map(tags => tags[key]) // This mapping will absorb all other changes to tags in order to prevent regeneration + .map(tags => { + const value: string = tags[key]; + if (value === undefined) { + return undefined + } + if (value.startsWith(prefix) && value.endsWith(postfix)) { + return value.substring(prefix.length, value.length - postfix.length).trim() + } + return value; + }) // This mapping will absorb all other changes to tags in order to prevent regeneration .map(ohtext => { + if (ohtext === undefined) { + return new FixedUiElement("No opening hours defined with key " + key).SetClass("alert") + } try { // noinspection JSPotentiallyInvalidConstructorUsage const oh = new opening_hours(ohtext, { @@ -35,12 +47,12 @@ export default class OpeningHoursVisualization extends Toggle { lon: tagsDirect._lon, address: { country_code: tagsDirect._country - } - }, {tag_key: key}); + }, + }, {tag_key: "opening_hours"}); return OpeningHoursVisualization.CreateFullVisualisation(oh) } catch (e) { - console.log(e); + console.warn(e, e.stack); return new Combine([Translations.t.general.opening_hours.error_loading, new Toggle( new FixedUiElement(e).SetClass("subtle"), diff --git a/UI/Popup/DeleteWizard.ts b/UI/Popup/DeleteWizard.ts index 478737a9ed..b0981f78bc 100644 --- a/UI/Popup/DeleteWizard.ts +++ b/UI/Popup/DeleteWizard.ts @@ -264,7 +264,7 @@ export default class DeleteWizard extends Toggle { ] - }, undefined, "Delete wizard" + }, "Delete wizard" ) } diff --git a/UI/Popup/EditableTagRendering.ts b/UI/Popup/EditableTagRendering.ts index 2be62b01be..48cd669efc 100644 --- a/UI/Popup/EditableTagRendering.ts +++ b/UI/Popup/EditableTagRendering.ts @@ -16,7 +16,10 @@ export default class EditableTagRendering extends Toggle { constructor(tags: UIEventSource, configuration: TagRenderingConfig, units: Unit [], - editMode = new UIEventSource(false) + options: { + editMode?: UIEventSource, + innerElementClasses?: string + } ) { // The tagrendering is hidden if: @@ -25,15 +28,20 @@ export default class EditableTagRendering extends Toggle { const renderingIsShown = tags.map(tags => configuration.IsKnown(tags) && (configuration?.condition?.matchesProperties(tags) ?? true)) - + super( - new Lazy(() => EditableTagRendering.CreateRendering(tags, configuration, units, editMode)), + new Lazy(() => { + const editMode = options.editMode ?? new UIEventSource(false) + const rendering = EditableTagRendering.CreateRendering(tags, configuration, units, editMode); + rendering.SetClass(options.innerElementClasses) + return rendering + }), undefined, renderingIsShown ) } - - private static CreateRendering(tags: UIEventSource, configuration: TagRenderingConfig, units: Unit[], editMode: UIEventSource) : BaseUIElement{ + + private static CreateRendering(tags: UIEventSource, configuration: TagRenderingConfig, units: Unit[], editMode: UIEventSource): BaseUIElement { const answer: BaseUIElement = new TagRenderingAnswer(tags, configuration) answer.SetClass("w-full") let rendering = answer; @@ -71,7 +79,6 @@ export default class EditableTagRendering extends Toggle { editMode ) } - rendering.SetClass("block w-full break-word text-default m-1 p-1 border-b border-gray-200 mb-2 pb-2") return rendering; } diff --git a/UI/Popup/FeatureInfoBox.ts b/UI/Popup/FeatureInfoBox.ts index 1f13262462..b6d79abd59 100644 --- a/UI/Popup/FeatureInfoBox.ts +++ b/UI/Popup/FeatureInfoBox.ts @@ -5,7 +5,6 @@ import Combine from "../Base/Combine"; import TagRenderingAnswer from "./TagRenderingAnswer"; import State from "../../State"; import ScrollableFullScreen from "../Base/ScrollableFullScreen"; -import {Tag} from "../../Logic/Tags/Tag"; import Constants from "../../Models/Constants"; import SharedTagRenderings from "../../Customizations/SharedTagRenderings"; import BaseUIElement from "../BaseUIElement"; @@ -18,6 +17,8 @@ import {Translation} from "../i18n/Translation"; import {Utils} from "../../Utils"; import {SubstitutedTranslation} from "../SubstitutedTranslation"; import MoveWizard from "./MoveWizard"; +import Toggle from "../Input/Toggle"; +import {FixedUiElement} from "../Base/FixedUiElement"; export default class FeatureInfoBox extends ScrollableFullScreen { @@ -37,7 +38,7 @@ export default class FeatureInfoBox extends ScrollableFullScreen { private static GenerateTitleBar(tags: UIEventSource, layerConfig: LayerConfig): BaseUIElement { - const title = new TagRenderingAnswer(tags, layerConfig.title ?? new TagRenderingConfig("POI", undefined)) + const title = new TagRenderingAnswer(tags, layerConfig.title ?? new TagRenderingConfig("POI")) .SetClass("break-words font-bold sm:p-0.5 md:p-1 sm:p-1.5 md:p-2"); const titleIcons = new Combine( layerConfig.titleIcons.map(icon => new TagRenderingAnswer(tags, icon, @@ -52,26 +53,79 @@ export default class FeatureInfoBox extends ScrollableFullScreen { private static GenerateContent(tags: UIEventSource, layerConfig: LayerConfig): BaseUIElement { - let questionBox: BaseUIElement = undefined; + let questionBoxes: Map = new Map(); + const allGroupNames = Utils.Dedup(layerConfig.tagRenderings.map(tr => tr.group)) if (State.state.featureSwitchUserbadge.data) { - questionBox = new QuestionBox(tags, layerConfig.tagRenderings, layerConfig.units); + const questionSpecs = layerConfig.tagRenderings.filter(tr => tr.id === "questions") + for (const groupName of allGroupNames) { + const questions = layerConfig.tagRenderings.filter(tr => tr.group === groupName) + const questionSpec = questionSpecs.filter(tr => tr.group === groupName)[0] + const questionBox = new QuestionBox({ + tagsSource: tags, + tagRenderings: questions, + units: layerConfig.units, + showAllQuestionsAtOnce: questionSpec?.freeform?.helperArgs["showAllQuestions"] ?? State.state.featureSwitchShowAllQuestions + }); + questionBoxes.set(groupName, questionBox) + } } - let questionBoxIsUsed = false; - const renderings: BaseUIElement[] = layerConfig.tagRenderings.map(tr => { - if (tr.question === null) { - // This is the question box! - questionBoxIsUsed = true; - return questionBox; + const allRenderings = [] + for (let i = 0; i < allGroupNames.length; i++) { + const groupName = allGroupNames[i]; + + const trs = layerConfig.tagRenderings.filter(tr => tr.group === groupName) + const renderingsForGroup: (EditableTagRendering | BaseUIElement)[] = [] + const innerClasses = "block w-full break-word text-default m-1 p-1 border-b border-gray-200 mb-2 pb-2"; + for (const tr of trs) { + if (tr.question === null || tr.id === "questions") { + // This is a question box! + const questionBox = questionBoxes.get(tr.group) + questionBoxes.delete(tr.group) + + if (tr.render !== undefined) { + questionBox.SetClass("text-sm") + const renderedQuestion = new TagRenderingAnswer(tags, tr, tr.group + " questions", "", { + specialViz: new Map([["questions", questionBox]]) + }) + const possiblyHidden = new Toggle( + renderedQuestion, + undefined, + questionBox.restingQuestions.map(ls => ls?.length > 0) + ) + renderingsForGroup.push(possiblyHidden) + } else { + renderingsForGroup.push(questionBox) + } + + } else { + let classes = innerClasses + let isHeader = renderingsForGroup.length === 0 && i > 0 + if (isHeader) { + // This is the first element of a group! + // It should act as header and be sticky + classes = "" + } + + const etr = new EditableTagRendering(tags, tr, layerConfig.units, { + innerElementClasses: innerClasses + }) + if (isHeader) { + etr.SetClass("sticky top-0") + } + renderingsForGroup.push(etr) + } } - return new EditableTagRendering(tags, tr, layerConfig.units); - }); + + allRenderings.push(...renderingsForGroup) + } + let editElements: BaseUIElement[] = [] - if (!questionBoxIsUsed) { + questionBoxes.forEach(questionBox => { editElements.push(questionBox); - } + }) if (layerConfig.allowMove) { editElements.push( @@ -107,7 +161,7 @@ export default class FeatureInfoBox extends ScrollableFullScreen { const hasMinimap = layerConfig.tagRenderings.some(tr => FeatureInfoBox.hasMinimap(tr)) if (!hasMinimap) { - renderings.push(new TagRenderingAnswer(tags, SharedTagRenderings.SharedTagRendering.get("minimap"))) + allRenderings.push(new TagRenderingAnswer(tags, SharedTagRenderings.SharedTagRendering.get("minimap"))) } editElements.push( @@ -132,7 +186,7 @@ export default class FeatureInfoBox extends ScrollableFullScreen { new VariableUiElement( State.state.featureSwitchIsDebugging.map(isDebugging => { if (isDebugging) { - const config: TagRenderingConfig = new TagRenderingConfig({render: "{all_tags()}"}, new Tag("id", ""), ""); + const config: TagRenderingConfig = new TagRenderingConfig({render: "{all_tags()}"}, ""); return new TagRenderingAnswer(tags, config, "all_tags") } }) @@ -147,10 +201,9 @@ export default class FeatureInfoBox extends ScrollableFullScreen { return new Combine(editElements).SetClass("flex flex-col") } )) - renderings.push(editors) + allRenderings.push(editors) - - return new Combine(renderings).SetClass("block") + return new Combine(allRenderings).SetClass("block") } /** diff --git a/UI/Popup/MoveWizard.ts b/UI/Popup/MoveWizard.ts index 254c7a0ca7..b86a559376 100644 --- a/UI/Popup/MoveWizard.ts +++ b/UI/Popup/MoveWizard.ts @@ -42,7 +42,7 @@ export default class MoveWizard extends Toggle { changes: Changes, layoutToUse: LayoutConfig, allElements: ElementStorage - }, options : MoveConfig) { + }, options: MoveConfig) { const t = Translations.t.move const loginButton = new Toggle( @@ -64,7 +64,7 @@ export default class MoveWizard extends Toggle { minZoom: 6 }) } - if(options.enableImproveAccuracy){ + if (options.enableImproveAccuracy) { reasons.push({ text: t.reasons.reasonInaccurate, invitingText: t.inviteToMove.reasonInaccurate, @@ -79,8 +79,8 @@ export default class MoveWizard extends Toggle { const currentStep = new UIEventSource<"start" | "reason" | "pick_location" | "moved">("start") const moveReason = new UIEventSource(undefined) - let moveButton : BaseUIElement; - if(reasons.length === 1){ + let moveButton: BaseUIElement; + if (reasons.length === 1) { const reason = reasons[0] moveReason.setData(reason) moveButton = new SubtleButton( @@ -89,7 +89,7 @@ export default class MoveWizard extends Toggle { ).onClick(() => { currentStep.setData("pick_location") }) - }else{ + } else { moveButton = new SubtleButton( Svg.move_ui().SetStyle("height: 1.5rem; width: auto"), t.inviteToMove.generic @@ -97,7 +97,7 @@ export default class MoveWizard extends Toggle { currentStep.setData("reason") }) } - + const moveAgainButton = new SubtleButton( Svg.move_ui(), @@ -107,8 +107,6 @@ export default class MoveWizard extends Toggle { }) - - const selectReason = new Combine(reasons.map(r => new SubtleButton(r.icon, r.text).onClick(() => { moveReason.setData(r) currentStep.setData("pick_location") @@ -129,16 +127,16 @@ export default class MoveWizard extends Toggle { }) let background: string[] - if(typeof reason.background == "string"){ + if (typeof reason.background == "string") { background = [reason.background] - }else{ + } else { background = reason.background } - + const locationInput = new LocationInput({ minZoom: reason.minZoom, centerLocation: loc, - mapBackground:AvailableBaseLayers.SelectBestLayerAccordingTo(loc, new UIEventSource(background)) + mapBackground: AvailableBaseLayers.SelectBestLayerAccordingTo(loc, new UIEventSource(background)) }) if (reason.lockBounds) { @@ -198,8 +196,8 @@ export default class MoveWizard extends Toggle { moveDisallowedReason.setData(t.isWay) } else if (id.startsWith("relation")) { moveDisallowedReason.setData(t.isRelation) - } else if(id.indexOf("-") < 0) { - + } else if (id.indexOf("-") < 0) { + OsmObject.DownloadReferencingWays(id).then(referencing => { if (referencing.length > 0) { console.log("Got a referencing way, move not allowed") @@ -207,7 +205,7 @@ export default class MoveWizard extends Toggle { } }) OsmObject.DownloadReferencingRelations(id).then(partOf => { - if(partOf.length > 0){ + if (partOf.length > 0) { moveDisallowedReason.setData(t.partOfRelation) } }) diff --git a/UI/Popup/MultiApply.ts b/UI/Popup/MultiApply.ts index 159bdd3210..1f13f7d024 100644 --- a/UI/Popup/MultiApply.ts +++ b/UI/Popup/MultiApply.ts @@ -32,6 +32,7 @@ export interface MultiApplyParams { class MultiApplyExecutor { + private static executorCache = new Map() private readonly originalValues = new Map() private readonly params: MultiApplyParams; @@ -48,7 +49,7 @@ class MultiApplyExecutor { const self = this; const relevantValues = p.tagsSource.map(tags => { const currentValues = p.keysToApply.map(key => tags[key]) - // By stringifying, we have a very clear ping when they changec + // By stringifying, we have a very clear ping when they changec return JSON.stringify(currentValues); }) relevantValues.addCallbackD(_ => { @@ -57,6 +58,15 @@ class MultiApplyExecutor { } } + public static GetApplicator(id: string, params: MultiApplyParams): MultiApplyExecutor { + if (MultiApplyExecutor.executorCache.has(id)) { + return MultiApplyExecutor.executorCache.get(id) + } + const applicator = new MultiApplyExecutor(params) + MultiApplyExecutor.executorCache.set(id, applicator) + return applicator + } + public applyTaggingOnOtherFeatures() { console.log("Multi-applying changes...") const featuresToChange = this.params.featureIds.data @@ -103,17 +113,6 @@ class MultiApplyExecutor { } } - private static executorCache = new Map() - - public static GetApplicator(id: string, params: MultiApplyParams): MultiApplyExecutor { - if (MultiApplyExecutor.executorCache.has(id)) { - return MultiApplyExecutor.executorCache.get(id) - } - const applicator = new MultiApplyExecutor(params) - MultiApplyExecutor.executorCache.set(id, applicator) - return applicator - } - } export default class MultiApply extends Toggle { diff --git a/UI/Popup/QuestionBox.ts b/UI/Popup/QuestionBox.ts index 1192ff8ee6..5a857eef20 100644 --- a/UI/Popup/QuestionBox.ts +++ b/UI/Popup/QuestionBox.ts @@ -1,7 +1,6 @@ import {UIEventSource} from "../../Logic/UIEventSource"; import TagRenderingQuestion from "./TagRenderingQuestion"; import Translations from "../i18n/Translations"; -import State from "../../State"; import Combine from "../Base/Combine"; import BaseUIElement from "../BaseUIElement"; import {VariableUiElement} from "../Base/VariableUIElement"; @@ -14,70 +13,119 @@ import Lazy from "../Base/Lazy"; * Generates all the questions, one by one */ export default class QuestionBox extends VariableUiElement { + public readonly skippedQuestions: UIEventSource; + public readonly restingQuestions: UIEventSource; + + constructor(options: { + tagsSource: UIEventSource, + tagRenderings: TagRenderingConfig[], units: Unit[], + showAllQuestionsAtOnce?: boolean | UIEventSource + }) { - constructor(tagsSource: UIEventSource, tagRenderings: TagRenderingConfig[], units: Unit[]) { const skippedQuestions: UIEventSource = new UIEventSource([]) - tagRenderings = tagRenderings + const tagsSource = options.tagsSource + const units = options.units + options.showAllQuestionsAtOnce = options.showAllQuestionsAtOnce ?? false + const tagRenderings = options.tagRenderings .filter(tr => tr.question !== undefined) - .filter(tr => tr.question !== null); + .filter(tr => tr.question !== null) - super(tagsSource.map(tags => { - if (tags === undefined) { - return undefined; + + const tagRenderingQuestions = tagRenderings + .map((tagRendering, i) => + new Lazy(() => new TagRenderingQuestion(tagsSource, tagRendering, + { + units: units, + afterSave: () => { + // We save and indicate progress by pinging and recalculating + skippedQuestions.ping(); + }, + cancelButton: Translations.t.general.skip.Clone() + .SetClass("btn btn-secondary mr-3") + .onClick(() => { + skippedQuestions.data.push(i); + skippedQuestions.ping(); + }) + } + ))); + + + const skippedQuestionsButton = Translations.t.general.skippedQuestions + .onClick(() => { + skippedQuestions.setData([]); + }) + tagsSource.map(tags => { + if (tags === undefined) { + return undefined; + } + for (let i = 0; i < tagRenderingQuestions.length; i++) { + let tagRendering = tagRenderings[i]; + + if (skippedQuestions.data.indexOf(i) >= 0) { + continue; + } + if (tagRendering.IsKnown(tags)) { + continue; + } + if (tagRendering.condition && + !tagRendering.condition.matchesProperties(tags)) { + // Filtered away by the condition, so it is kindof known + continue; } - const tagRenderingQuestions = tagRenderings - .map((tagRendering, i) => - new Lazy(() => new TagRenderingQuestion(tagsSource, tagRendering, - { - units: units, - afterSave: () => { - // We save - skippedQuestions.ping(); - }, - cancelButton: Translations.t.general.skip.Clone() - .SetClass("btn btn-secondary mr-3") - .onClick(() => { - skippedQuestions.data.push(i); - skippedQuestions.ping(); - }) - } - ))); + // this value is NOT known - this is the question we have to show! + return i + } + return undefined; // The questions are depleted + }, [skippedQuestions]); + + const questionsToAsk: UIEventSource = tagsSource.map(tags => { + if (tags === undefined) { + return []; + } + const qs = [] + for (let i = 0; i < tagRenderingQuestions.length; i++) { + let tagRendering = tagRenderings[i]; - const skippedQuestionsButton = Translations.t.general.skippedQuestions.Clone() - .onClick(() => { - skippedQuestions.setData([]); - }) + if (skippedQuestions.data.indexOf(i) >= 0) { + continue; + } + if (tagRendering.IsKnown(tags)) { + continue; + } + if (tagRendering.condition && + !tagRendering.condition.matchesProperties(tags)) { + // Filtered away by the condition, so it is kindof known + continue; + } + // this value is NOT known - this is the question we have to show! + qs.push(tagRenderingQuestions[i]) + } + return qs + }, [skippedQuestions]) - const allQuestions: BaseUIElement[] = [] - for (let i = 0; i < tagRenderingQuestions.length; i++) { - let tagRendering = tagRenderings[i]; - - if (tagRendering.IsKnown(tags)) { - continue; - } - - if (skippedQuestions.data.indexOf(i) >= 0) { - continue; - } - // this value is NOT known - we show the questions for it - if (State.state.featureSwitchShowAllQuestions.data || allQuestions.length == 0) { - allQuestions.push(tagRenderingQuestions[i]) - } - + super(questionsToAsk.map(allQuestions => { + const els: BaseUIElement[] = [] + if (options.showAllQuestionsAtOnce === true || options.showAllQuestionsAtOnce["data"]) { + els.push(...questionsToAsk.data) + } else { + els.push(allQuestions[0]) } if (skippedQuestions.data.length > 0) { - allQuestions.push(skippedQuestionsButton) + els.push(skippedQuestionsButton) } - - return new Combine(allQuestions).SetClass("block mb-8") - }, [skippedQuestions]) + return new Combine(els).SetClass("block mb-8") + }) ) + this.skippedQuestions = skippedQuestions; + this.restingQuestions = questionsToAsk + + } } \ No newline at end of file diff --git a/UI/Popup/SplitRoadWizard.ts b/UI/Popup/SplitRoadWizard.ts index 9c321d8b92..e95d895738 100644 --- a/UI/Popup/SplitRoadWizard.ts +++ b/UI/Popup/SplitRoadWizard.ts @@ -21,8 +21,13 @@ export default class SplitRoadWizard extends Toggle { private static splitLayerStyling = new LayerConfig({ id: "splitpositions", source: {osmTags: "_cutposition=yes"}, - icon: {render: "circle:white;./assets/svg/scissors.svg"}, - iconSize: {render: "30,30,center"}, + mapRendering: [ + { + location: ["point", "centroid"], + icon: {render: "circle:white;./assets/svg/scissors.svg"}, + iconSize: {render: "30,30,center"} + } + ], }, "(BUILTIN) SplitRoadWizard.ts", true) public dialogIsOpened: UIEventSource @@ -61,7 +66,7 @@ export default class SplitRoadWizard extends Toggle { miniMap.installBounds(BBox.get(roadElement).pad(0.25), false) // Define how a cut is displayed on the map - + // Datalayer displaying the road and the cut points (if any) new ShowDataLayer({ features: new StaticFeatureSource(splitPoints, true), @@ -90,7 +95,7 @@ export default class SplitRoadWizard extends Toggle { const points = splitPoints.data.map((f, i) => [f.feature, i]) .filter(p => GeoOperations.distanceBetween(p[0].geometry.coordinates, coordinates) * 1000 < 5) .map(p => p[1]) - .sort() + .sort((a, b) => a - b) .reverse() if (points.length > 0) { for (const point of points) { diff --git a/UI/Popup/TagRenderingAnswer.ts b/UI/Popup/TagRenderingAnswer.ts index 3567ec70d5..c7724b5389 100644 --- a/UI/Popup/TagRenderingAnswer.ts +++ b/UI/Popup/TagRenderingAnswer.ts @@ -11,10 +11,16 @@ import TagRenderingConfig from "../../Models/ThemeConfig/TagRenderingConfig"; */ export default class TagRenderingAnswer extends VariableUiElement { - constructor(tagsSource: UIEventSource, configuration: TagRenderingConfig, contentClasses: string = "", contentStyle: string = "") { + constructor(tagsSource: UIEventSource, configuration: TagRenderingConfig, + contentClasses: string = "", contentStyle: string = "", options?:{ + specialViz: Map + }) { if (configuration === undefined) { throw "Trying to generate a tagRenderingAnswer without configuration..." } + if (tagsSource === undefined) { + throw "Trying to generate a tagRenderingAnswer without tagSource..." + } super(tagsSource.map(tags => { if (tags === undefined) { return undefined; @@ -31,7 +37,7 @@ export default class TagRenderingAnswer extends VariableUiElement { return undefined; } - const valuesToRender: BaseUIElement[] = trs.map(tr => new SubstitutedTranslation(tr, tagsSource)) + const valuesToRender: BaseUIElement[] = trs.map(tr => new SubstitutedTranslation(tr, tagsSource, options?.specialViz)) if (valuesToRender.length === 1) { return valuesToRender[0]; } else if (valuesToRender.length > 1) { diff --git a/UI/Popup/TagRenderingQuestion.ts b/UI/Popup/TagRenderingQuestion.ts index 533017447f..9c0c530ab6 100644 --- a/UI/Popup/TagRenderingQuestion.ts +++ b/UI/Popup/TagRenderingQuestion.ts @@ -9,7 +9,6 @@ import CheckBoxes from "../Input/Checkboxes"; import InputElementMap from "../Input/InputElementMap"; import {SaveButton} from "./SaveButton"; import State from "../../State"; -import {Changes} from "../../Logic/Osm/Changes"; import {VariableUiElement} from "../Base/VariableUIElement"; import Translations from "../i18n/Translations"; import {FixedUiElement} from "../Base/FixedUiElement"; @@ -85,7 +84,7 @@ export default class TagRenderingQuestion extends Combine { const save = () => { const selection = inputElement.GetValue().data; if (selection) { - (State.state?.changes ?? new Changes()) + (State.state?.changes) .applyAction(new ChangeTagAction( tags.data.id, selection, tags.data, { theme: State.state?.layoutToUse?.id ?? "unkown", diff --git a/UI/ShowDataLayer/ShowDataLayer.ts b/UI/ShowDataLayer/ShowDataLayer.ts index 2f957ed15a..f306cadf23 100644 --- a/UI/ShowDataLayer/ShowDataLayer.ts +++ b/UI/ShowDataLayer/ShowDataLayer.ts @@ -1,25 +1,35 @@ -/** - * The data layer shows all the given geojson elements with the appropriate icon etc - */ import {UIEventSource} from "../../Logic/UIEventSource"; import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; import FeatureInfoBox from "../Popup/FeatureInfoBox"; import {ShowDataLayerOptions} from "./ShowDataLayerOptions"; import {ElementStorage} from "../../Logic/ElementStorage"; +import RenderingMultiPlexerFeatureSource from "../../Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource"; +/* +// import 'leaflet-polylineoffset'; +We don't actually import it here. It is imported in the 'MinimapImplementation'-class, which'll result in a patched 'L' object. + Even though actually importing this here would seem cleaner, we don't do this as this breaks some scripts: + - Scripts are ran in ts-node + - ts-node doesn't define the 'window'-object + - Importing this will execute some code which needs the window object + */ + +/** + * The data layer shows all the given geojson elements with the appropriate icon etc + */ export default class ShowDataLayer { + private static dataLayerIds = 0 private readonly _leafletMap: UIEventSource; private readonly _enablePopups: boolean; - private readonly _features: UIEventSource<{ feature: any }[]> + private readonly _features: RenderingMultiPlexerFeatureSource private readonly _layerToShow: LayerConfig; private readonly _selectedElement: UIEventSource - private readonly allElements : ElementStorage + private readonly allElements: ElementStorage // Used to generate a fresh ID when needed private _cleanCount = 0; private geoLayer = undefined; private isDirty = false; - /** * If the selected element triggers, this is used to lookup the correct layer and to open the popup * Used to avoid a lot of callbacks on the selected element @@ -28,9 +38,7 @@ export default class ShowDataLayer { * @private */ private readonly leafletLayersPerId = new Map() - - private readonly showDataLayerid : number; - private static dataLayerIds = 0 + private readonly showDataLayerid: number; constructor(options: ShowDataLayerOptions & { layerToShow: LayerConfig }) { this._leafletMap = options.leafletMap; @@ -41,8 +49,7 @@ export default class ShowDataLayer { console.error("Invalid ShowDataLayer invocation: options.features is undefed") throw "Invalid ShowDataLayer invocation: options.features is undefed" } - const features = options.features.features.map(featFreshes => featFreshes.map(ff => ff.feature)); - this._features = features; + this._features = new RenderingMultiPlexerFeatureSource(options.features, options.layerToShow); this._layerToShow = options.layerToShow; this._selectedElement = options.selectedElement this.allElements = options.allElements; @@ -53,7 +60,7 @@ export default class ShowDataLayer { } ); - features.addCallback(_ => self.update(options)); + this._features.features.addCallback(_ => self.update(options)); options.doShowLayer?.addCallback(doShow => { const mp = options.leafletMap.data; if (mp == undefined) { @@ -103,13 +110,13 @@ export default class ShowDataLayer { leafletLayer.openPopup() } }) - + this.update(options) } private update(options: ShowDataLayerOptions) { - if (this._features.data === undefined) { + if (this._features.features.data === undefined) { return; } this.isDirty = true; @@ -139,13 +146,40 @@ export default class ShowDataLayer { onEachFeature: (feature, leafletLayer) => self.postProcessFeature(feature, leafletLayer) }); - const allFeats = this._features.data; + const allFeats = this._features.features.data; for (const feat of allFeats) { if (feat === undefined) { continue } try { - this.geoLayer.addData(feat); + if (feat.geometry.type === "LineString") { + const self = this; + const coords = L.GeoJSON.coordsToLatLngs(feat.geometry.coordinates) + const tagsSource = this.allElements?.addOrGetElement(feat) ?? new UIEventSource(feat.properties); + let offsettedLine; + tagsSource + .map(tags => this._layerToShow.lineRendering[feat.lineRenderingIndex].GenerateLeafletStyle(tags)) + .withEqualityStabilized((a, b) => { + if (a === b) { + return true + } + if (a === undefined || b === undefined) { + return false + } + return a.offset === b.offset && a.color === b.color && a.weight === b.weight && a.dashArray === b.dashArray + }) + .addCallbackAndRunD(lineStyle => { + if (offsettedLine !== undefined) { + self.geoLayer.removeLayer(offsettedLine) + } + // @ts-ignore + offsettedLine = L.polyline(coords, lineStyle); + this.postProcessFeature(feat, offsettedLine) + offsettedLine.addTo(this.geoLayer) + }) + } else { + this.geoLayer.addData(feat); + } } catch (e) { console.error("Could not add ", feat, "to the geojson layer in leaflet due to", e, e.stack) } @@ -153,9 +187,10 @@ export default class ShowDataLayer { if (options.zoomToFeatures ?? false) { try { - mp.fitBounds(this.geoLayer.getBounds(), {animate: false}) + const bounds = this.geoLayer.getBounds() + mp.fitBounds(bounds, {animate: false}) } catch (e) { - console.error(e) + console.debug("Invalid bounds", e) } } @@ -170,7 +205,21 @@ export default class ShowDataLayer { const tagsSource = this.allElements?.addOrGetElement(feature) ?? new UIEventSource(feature.properties); // Every object is tied to exactly one layer const layer = this._layerToShow - return layer?.GenerateLeafletStyle(tagsSource, true); + + const pointRenderingIndex = feature.pointRenderingIndex + const lineRenderingIndex = feature.lineRenderingIndex + + if (pointRenderingIndex !== undefined) { + const style = layer.mapRendering[pointRenderingIndex].GenerateLeafletStyle(tagsSource, this._enablePopups) + return { + icon: style + } + } + if (lineRenderingIndex !== undefined) { + return layer.lineRendering[lineRenderingIndex].GenerateLeafletStyle(tagsSource.data) + } + + throw "Neither lineRendering nor mapRendering defined for " + feature } private pointToLayer(feature, latLng): L.Layer { @@ -182,23 +231,16 @@ export default class ShowDataLayer { if (layer === undefined) { return; } - let tagSource = this.allElements?.getEventSourceById(feature.properties.id) ?? new UIEventSource(feature.properties) - const clickable = !(layer.title === undefined && (layer.tagRenderings ?? []).length === 0) - const style = layer.GenerateLeafletStyle(tagSource, clickable); - const baseElement = style.icon.html; + const clickable = !(layer.title === undefined && (layer.tagRenderings ?? []).length === 0) && this._enablePopups + let style: any = layer.mapRendering[feature.pointRenderingIndex].GenerateLeafletStyle(tagSource, clickable); + const baseElement = style.html; if (!this._enablePopups) { baseElement.SetStyle("cursor: initial !important") } + style.html = style.html.ConstructElement() return L.marker(latLng, { - icon: L.divIcon({ - html: baseElement.ConstructElement(), - className: style.icon.className, - iconAnchor: style.icon.iconAnchor, - iconUrl: style.icon.iconUrl ?? "./assets/svg/bug.svg", - popupAnchor: style.icon.popupAnchor, - iconSize: style.icon.iconSize - }) + icon: L.divIcon(style) }); } @@ -228,7 +270,7 @@ export default class ShowDataLayer { let infobox: FeatureInfoBox = undefined; - const id = `popup-${feature.properties.id}-${feature.geometry.type}-${this.showDataLayerid}-${this._cleanCount}` + const id = `popup-${feature.properties.id}-${feature.geometry.type}-${this.showDataLayerid}-${this._cleanCount}-${feature.pointRenderingIndex ?? feature.lineRenderingIndex}-${feature.multiLineStringIndex ?? ""}` popup.setContent(`
Popup for ${feature.properties.id} ${feature.geometry.type} ${id} is loading
`) leafletLayer.on("popupopen", () => { if (infobox === undefined) { @@ -237,7 +279,6 @@ export default class ShowDataLayer { infobox.isShown.addCallback(isShown => { if (!isShown) { - this._selectedElement?.setData(undefined); leafletLayer.closePopup() } }); @@ -256,7 +297,7 @@ export default class ShowDataLayer { feature: feature, leafletlayer: leafletLayer }) - + } diff --git a/UI/ShowDataLayer/ShowOverlayLayer.ts b/UI/ShowDataLayer/ShowOverlayLayer.ts index e75d263906..8d9a49784d 100644 --- a/UI/ShowDataLayer/ShowOverlayLayer.ts +++ b/UI/ShowDataLayer/ShowOverlayLayer.ts @@ -1,19 +1,18 @@ import TilesourceConfig from "../../Models/ThemeConfig/TilesourceConfig"; import {UIEventSource} from "../../Logic/UIEventSource"; -import * as L from "leaflet"; export default class ShowOverlayLayer { public static implementation: (config: TilesourceConfig, leafletMap: UIEventSource, isShown?: UIEventSource) => void; - + constructor(config: TilesourceConfig, leafletMap: UIEventSource, isShown: UIEventSource = undefined) { - if(ShowOverlayLayer.implementation === undefined){ + if (ShowOverlayLayer.implementation === undefined) { throw "Call ShowOverlayLayerImplemenation.initialize() first before using this" } - ShowOverlayLayer.implementation(config, leafletMap, isShown) + ShowOverlayLayer.implementation(config, leafletMap, isShown) } } \ No newline at end of file diff --git a/UI/ShowDataLayer/ShowOverlayLayerImplementation.ts b/UI/ShowDataLayer/ShowOverlayLayerImplementation.ts index ef92aef4eb..d9201fec52 100644 --- a/UI/ShowDataLayer/ShowOverlayLayerImplementation.ts +++ b/UI/ShowDataLayer/ShowOverlayLayerImplementation.ts @@ -4,14 +4,14 @@ import {UIEventSource} from "../../Logic/UIEventSource"; import ShowOverlayLayer from "./ShowOverlayLayer"; export default class ShowOverlayLayerImplementation { - - public static Implement(){ + + public static Implement() { ShowOverlayLayer.implementation = ShowOverlayLayerImplementation.AddToMap } - + public static AddToMap(config: TilesourceConfig, leafletMap: UIEventSource, - isShown: UIEventSource = undefined){ + isShown: UIEventSource = undefined) { leafletMap.map(leaflet => { if (leaflet === undefined) { return; @@ -41,5 +41,5 @@ export default class ShowOverlayLayerImplementation { }) } - + } \ No newline at end of file diff --git a/UI/ShowDataLayer/ShowTileInfo.ts b/UI/ShowDataLayer/ShowTileInfo.ts index 1bb6367277..e2ba01adf3 100644 --- a/UI/ShowDataLayer/ShowTileInfo.ts +++ b/UI/ShowDataLayer/ShowTileInfo.ts @@ -6,6 +6,7 @@ import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeature import {GeoOperations} from "../../Logic/GeoOperations"; import {Tiles} from "../../Models/TileRange"; import * as clusterstyle from "../../assets/layers/cluster_style/cluster_style.json" + export default class ShowTileInfo { public static readonly styling = new LayerConfig( clusterstyle, "tileinfo", true) diff --git a/UI/ShowDataLayer/TileHierarchyAggregator.ts b/UI/ShowDataLayer/TileHierarchyAggregator.ts index 42878131c4..49007a78ab 100644 --- a/UI/ShowDataLayer/TileHierarchyAggregator.ts +++ b/UI/ShowDataLayer/TileHierarchyAggregator.ts @@ -10,6 +10,12 @@ import FilteredLayer from "../../Models/FilteredLayer"; * A feature source containing but a single feature, which keeps stats about a tile */ export class TileHierarchyAggregator implements FeatureSource { + private static readonly empty = [] + public totalValue: number = 0 + public showCount: number = 0 + public hiddenCount: number = 0 + public readonly features = new UIEventSource<{ feature: any, freshness: Date }[]>(TileHierarchyAggregator.empty) + public readonly name; private _parent: TileHierarchyAggregator; private _root: TileHierarchyAggregator; private _z: number; @@ -17,21 +23,12 @@ export class TileHierarchyAggregator implements FeatureSource { private _y: number; private _tileIndex: number private _counter: SingleTileCounter - private _subtiles: [TileHierarchyAggregator, TileHierarchyAggregator, TileHierarchyAggregator, TileHierarchyAggregator] = [undefined, undefined, undefined, undefined] - public totalValue: number = 0 - public showCount: number = 0 - public hiddenCount: number = 0 - - private static readonly empty = [] - public readonly features = new UIEventSource<{ feature: any, freshness: Date }[]>(TileHierarchyAggregator.empty) - public readonly name; - private readonly featuresStatic = [] private readonly featureProperties: { count: string, kilocount: string, tileId: string, id: string, showCount: string, totalCount: string }; private readonly _state: { filteredLayers: UIEventSource }; private readonly updateSignal = new UIEventSource(undefined) - + private constructor(parent: TileHierarchyAggregator, state: { filteredLayers: UIEventSource @@ -45,7 +42,7 @@ export class TileHierarchyAggregator implements FeatureSource { this._y = y; this._tileIndex = Tiles.tile_index(z, x, y) this.name = "Count(" + this._tileIndex + ")" - + const totals = { id: "" + this._tileIndex, tileId: "" + this._tileIndex, @@ -87,6 +84,10 @@ export class TileHierarchyAggregator implements FeatureSource { this.featuresStatic.push({feature: box, freshness: now}) } + public static createHierarchy(state: { filteredLayers: UIEventSource }) { + return new TileHierarchyAggregator(undefined, state, 0, 0, 0) + } + public getTile(tileIndex): TileHierarchyAggregator { if (tileIndex === this._tileIndex) { return this; @@ -103,6 +104,61 @@ export class TileHierarchyAggregator implements FeatureSource { return this._subtiles[subtileIndex]?.getTile(tileIndex) } + public addTile(source: FeatureSourceForLayer & Tiled) { + const self = this; + if (source.tileIndex === this._tileIndex) { + if (this._counter === undefined) { + this._counter = new SingleTileCounter(this._tileIndex) + this._counter.countsPerLayer.addCallbackAndRun(_ => self.update()) + } + this._counter.addTileCount(source) + } else { + + // We have to give it to one of the subtiles + let [tileZ, tileX, tileY] = Tiles.tile_from_index(source.tileIndex) + while (tileZ - 1 > this._z) { + tileX = Math.floor(tileX / 2) + tileY = Math.floor(tileY / 2) + tileZ-- + } + const xDiff = tileX - (2 * this._x) + const yDiff = tileY - (2 * this._y) + + const subtileIndex = yDiff * 2 + xDiff; + if (this._subtiles[subtileIndex] === undefined) { + this._subtiles[subtileIndex] = new TileHierarchyAggregator(this, this._state, tileZ, tileX, tileY) + } + this._subtiles[subtileIndex].addTile(source) + } + this.updateSignal.setData(source) + } + + getCountsForZoom(clusteringConfig: { maxZoom: number }, locationControl: UIEventSource<{ zoom: number }>, cutoff: number = 0): FeatureSource { + const self = this + const empty = [] + const features = locationControl.map(loc => loc.zoom).map(targetZoom => { + if (targetZoom - 1 > clusteringConfig.maxZoom) { + return empty + } + + const features = [] + self.visitSubTiles(aggr => { + if (aggr.showCount < cutoff) { + return false + } + if (aggr._z === targetZoom) { + features.push(...aggr.features.data) + return false + } + return aggr._z <= targetZoom; + }) + + return features + }, [this.updateSignal.stabilized(500)]) + + return new StaticFeatureSource(features, true); + } + private update() { const newMap = new Map() let total = 0 @@ -162,71 +218,12 @@ export class TileHierarchyAggregator implements FeatureSource { } } - public addTile(source: FeatureSourceForLayer & Tiled) { - const self = this; - if (source.tileIndex === this._tileIndex) { - if (this._counter === undefined) { - this._counter = new SingleTileCounter(this._tileIndex) - this._counter.countsPerLayer.addCallbackAndRun(_ => self.update()) - } - this._counter.addTileCount(source) - } else { - - // We have to give it to one of the subtiles - let [tileZ, tileX, tileY] = Tiles.tile_from_index(source.tileIndex) - while (tileZ - 1 > this._z) { - tileX = Math.floor(tileX / 2) - tileY = Math.floor(tileY / 2) - tileZ-- - } - const xDiff = tileX - (2 * this._x) - const yDiff = tileY - (2 * this._y) - - const subtileIndex = yDiff * 2 + xDiff; - if (this._subtiles[subtileIndex] === undefined) { - this._subtiles[subtileIndex] = new TileHierarchyAggregator(this, this._state, tileZ, tileX, tileY) - } - this._subtiles[subtileIndex].addTile(source) - } - this.updateSignal.setData(source) - } - - public static createHierarchy(state: { filteredLayers: UIEventSource }) { - return new TileHierarchyAggregator(undefined, state, 0, 0, 0) - } - private visitSubTiles(f: (aggr: TileHierarchyAggregator) => boolean) { const visitFurther = f(this) if (visitFurther) { this._subtiles.forEach(tile => tile?.visitSubTiles(f)) } } - - getCountsForZoom(clusteringConfig: { maxZoom: number }, locationControl: UIEventSource<{ zoom: number }>, cutoff: number = 0): FeatureSource { - const self = this - const empty = [] - const features = locationControl.map(loc => loc.zoom).map(targetZoom => { - if (targetZoom - 1 > clusteringConfig.maxZoom) { - return empty - } - - const features = [] - self.visitSubTiles(aggr => { - if (aggr.showCount < cutoff) { - return false - } - if (aggr._z === targetZoom) { - features.push(...aggr.features.data) - return false - } - return aggr._z <= targetZoom; - }) - - return features - }, [this.updateSignal.stabilized(500)]) - - return new StaticFeatureSource(features, true); - } } /** @@ -236,11 +233,10 @@ class SingleTileCounter implements Tiled { public readonly bbox: BBox; public readonly tileIndex: number; public readonly countsPerLayer: UIEventSource> = new UIEventSource>(new Map()) - private readonly registeredLayers: Map = new Map(); public readonly z: number public readonly x: number public readonly y: number - + private readonly registeredLayers: Map = new Map(); constructor(tileIndex: number) { this.tileIndex = tileIndex diff --git a/UI/SpecialVisualizations.ts b/UI/SpecialVisualizations.ts index 680b3e571c..bc8575ec66 100644 --- a/UI/SpecialVisualizations.ts +++ b/UI/SpecialVisualizations.ts @@ -20,7 +20,7 @@ import Histogram from "./BigComponents/Histogram"; import Loc from "../Models/Loc"; import {Utils} from "../Utils"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; -import ImportButton from "./BigComponents/ImportButton"; +import {ImportButtonSpecialViz} from "./BigComponents/ImportButton"; import {Tag} from "../Logic/Tags/Tag"; import StaticFeatureSource from "../Logic/FeatureSource/Sources/StaticFeatureSource"; import ShowDataMultiLayer from "./ShowDataLayer/ShowDataMultiLayer"; @@ -29,10 +29,20 @@ import AllImageProviders from "../Logic/ImageProviders/AllImageProviders"; import WikipediaBox from "./Wikipedia/WikipediaBox"; import SimpleMetaTagger from "../Logic/SimpleMetaTagger"; import MultiApply from "./Popup/MultiApply"; +import AllKnownLayers from "../Customizations/AllKnownLayers"; +import ShowDataLayer from "./ShowDataLayer/ShowDataLayer"; +import Link from "./Base/Link"; +import List from "./Base/List"; +import {SubtleButton} from "./Base/SubtleButton"; +import ChangeTagAction from "../Logic/Osm/Actions/ChangeTagAction"; +import {And} from "../Logic/Tags/And"; +import Toggle from "./Input/Toggle"; +import {DefaultGuiState} from "./DefaultGuiState"; +import {GeoOperations} from "../Logic/GeoOperations"; export interface SpecialVisualization { funcName: string, - constr: ((state: State, tagSource: UIEventSource, argument: string[]) => BaseUIElement), + constr: ((state: State, tagSource: UIEventSource, argument: string[], guistate: DefaultGuiState, ) => BaseUIElement), docs: string, example?: string, args: { name: string, defaultValue?: string, doc: string }[] @@ -40,6 +50,7 @@ export interface SpecialVisualization { export default class SpecialVisualizations { + static tagsToApplyHelpText = Utils.Special_visualizations_tagsToApplyHelpText public static specialVisualizations: SpecialVisualization[] = [ { @@ -49,7 +60,7 @@ export default class SpecialVisualizations { constr: ((state: State, tags: UIEventSource) => { const calculatedTags = [].concat( SimpleMetaTagger.lazyTags, - ... state.layoutToUse.layers.map(l => l.calculatedTags?.map(c => c[0]) ?? [])) + ...state.layoutToUse.layers.map(l => l.calculatedTags?.map(c => c[0]) ?? [])) return new VariableUiElement(tags.map(tags => { const parts = []; for (const key in tags) { @@ -57,20 +68,20 @@ export default class SpecialVisualizations { continue } let v = tags[key] - if(v === ""){ + if (v === "") { v = "empty string" } parts.push([key, v ?? "undefined"]); } - - for(const key of calculatedTags){ + + for (const key of calculatedTags) { const value = tags[key] - if(value === undefined){ + if (value === undefined) { continue } - parts.push([ ""+key+"", value ]) + parts.push(["" + key + "", value]) } - + return new Table( ["key", "value"], parts @@ -88,7 +99,7 @@ export default class SpecialVisualizations { }], constr: (state: State, tags, args) => { let imagePrefixes: string[] = undefined; - if(args.length > 0){ + if (args.length > 0) { imagePrefixes = [].concat(...args.map(a => a.split(","))); } return new ImageCarousel(AllImageProviders.LoadImagesFor(tags, imagePrefixes), tags, imagePrefixes); @@ -101,9 +112,9 @@ export default class SpecialVisualizations { name: "image-key", doc: "Image tag to add the URL to (or image-tag:0, image-tag:1 when multiple images are added)", defaultValue: "image" - },{ - name:"label", - doc:"The text to show on the button", + }, { + name: "label", + doc: "The text to show on the button", defaultValue: "Add image" }], constr: (state: State, tags, args) => { @@ -125,17 +136,16 @@ export default class SpecialVisualizations { new VariableUiElement( tagsSource.map(tags => tags[args[0]]) .map(wikidata => { - const wikidatas : string[] = + const wikidatas: string[] = Utils.NoEmpty(wikidata?.split(";")?.map(wd => wd.trim()) ?? []) return new WikipediaBox(wikidatas) }) - ) - + }, { funcName: "minimap", - docs: "A small map showing the selected feature. Note that no styling is applied, wrap this in a div", + docs: "A small map showing the selected feature.", args: [ { doc: "The (maximum) zoomlevel: the target zoomlevel after fitting the entire feature. The minimap will fit the entire feature, then zoom out to this zoom level. The higher, the more zoomed in with 1 being the entire world and 19 being really close", @@ -149,7 +159,7 @@ export default class SpecialVisualizations { } ], example: "`{minimap()}`, `{minimap(17, id, _list_of_embedded_feature_ids_calculated_by_calculated_tag):height:10rem; border: 2px solid black}`", - constr: (state, tagSource, args) => { + constr: (state, tagSource, args, defaultGuiState) => { const keys = [...args] keys.splice(0, 1) @@ -164,6 +174,7 @@ export default class SpecialVisualizations { idList = JSON.parse(value) } + for (const id of idList) { features.push({ freshness: new Date(), @@ -214,6 +225,53 @@ export default class SpecialVisualizations { ) + minimap.SetStyle("overflow: hidden; pointer-events: none;") + return minimap; + } + }, + { + funcName: "sided_minimap", + docs: "A small map showing _only one side_ the selected feature. *This features requires to have linerenderings with offset* as only linerenderings with a postive or negative offset will be shown. Note: in most cases, this map will be automatically introduced", + args: [ + { + doc: "The side to show, either `left` or `right`", + name: "side", + } + ], + example: "`{sided_minimap(left)}`", + constr: (state, tagSource, args) => { + + const properties = tagSource.data; + const locationSource = new UIEventSource({ + lat: Number(properties._lat), + lon: Number(properties._lon), + zoom: 18 + }) + const minimap = Minimap.createMiniMap( + { + background: state.backgroundLayer, + location: locationSource, + allowMoving: false + } + ) + const side = args[0] + const feature = state.allElements.ContainingFeatures.get(tagSource.data.id) + const copy = {...feature} + copy.properties = { + id: side + } + new ShowDataLayer( + { + leafletMap: minimap["leafletMap"], + enablePopups: false, + zoomToFeatures: true, + layerToShow: AllKnownLayers.sharedLayers.get("left_right_style"), + features: new StaticFeatureSource([copy], false), + allElements: State.state.allElements + } + ) + + minimap.SetStyle("overflow: hidden; pointer-events: none;") return minimap; } @@ -253,9 +311,18 @@ export default class SpecialVisualizations { name: "key", defaultValue: "opening_hours", doc: "The tagkey from which the table is constructed." + }, { + name: "prefix", + defaultValue: "", + doc: "Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__" + }, { + name: "postfix", + defaultValue: "", + doc: "Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__" }], + example: "A normal opening hours table can be invoked with `{opening_hours_table()}`. A table for e.g. conditional access with opening hours can be `{opening_hours_table(access:conditional, no @ &LPARENS, &RPARENS)}`", constr: (state: State, tagSource: UIEventSource, args) => { - return new OpeningHoursVisualization(tagSource, args[0]) + return new OpeningHoursVisualization(tagSource, args[0], args[1], args[2]) } }, { @@ -359,12 +426,7 @@ export default class SpecialVisualizations { const title = state?.layoutToUse?.title?.txt ?? "MapComplete"; - let matchingLayer: LayerConfig = undefined; - for (const layer of (state?.layoutToUse?.layers ?? [])) { - if (layer.source.osmTags.matchesProperties(tagSource?.data)) { - matchingLayer = layer - } - } + let matchingLayer: LayerConfig = state?.layoutToUse?.getMatchingLayer(tagSource?.data); let name = matchingLayer?.title?.GetRenderValue(tagSource.data)?.txt ?? tagSource.data?.name ?? "POI"; if (name) { name = `${name} (${title})` @@ -415,86 +477,25 @@ export default class SpecialVisualizations { ) } }, + new ImportButtonSpecialViz(), { - funcName: "import_button", - args: [ - { - name: "tags", - doc: "Tags to copy-specification. This contains one or more pairs (seperated by a `;`), e.g. `amenity=fast_food; addr:housenumber=$number`. This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. (Hint: prepare these values, e.g. with calculatedTags)" - }, - { - name: "text", - doc: "The text to show on the button", - defaultValue: "Import this data into OpenStreetMap" - }, - { - name: "icon", - doc: "A nice icon to show in the button", - defaultValue: "./assets/svg/addSmall.svg" - }, - {name:"minzoom", - doc: "How far the contributor must zoom in before being able to import the point", - defaultValue: "18"}], - docs: `This button will copy the data from an external dataset into OpenStreetMap. It is only functional in official themes but can be tested in unofficial themes. - -If you want to import a dataset, make sure that: - -1. The dataset to import has a suitable license -2. The community has been informed of the import -3. All other requirements of the [import guidelines](https://wiki.openstreetmap.org/wiki/Import/Guidelines) have been followed - -There are also some technicalities in your theme to keep in mind: - -1. The new point will be added and will flow through the program as any other new point as if it came from OSM. - This means that there should be a layer which will match the new tags and which will display it. -2. The original point from your geojson layer will gain the tag '_imported=yes'. - This should be used to change the appearance or even to hide it (eg by changing the icon size to zero) -3. There should be a way for the theme to detect previously imported points, even after reloading. - A reference number to the original dataset is an excellen way to do this -`, - constr: (state, tagSource, args) => { - if (!state.layoutToUse.official && !state.featureSwitchIsTesting.data) { - return new Combine([new FixedUiElement("The import button is disabled for unofficial themes to prevent accidents.").SetClass("alert"), - new FixedUiElement("To test, add 'test=true' to the URL. The changeset will be printed in the console. Please open a PR to officialize this theme to actually enable the import button.")]) - } - const tgsSpec = args[0].split(";").map(spec => { - const kv = spec.split("=").map(s => s.trim()); - if (kv.length != 2) { - throw "Invalid key spec: multiple '=' found in " + spec - } - return kv - }) - const rewrittenTags: UIEventSource = tagSource.map(tags => { - const newTags: Tag [] = [] - for (const [key, value] of tgsSpec) { - if (value.startsWith('$')) { - const origKey = value.substring(1) - newTags.push(new Tag(key, tags[origKey])) - } else { - newTags.push(new Tag(key, value)) - } - } - return newTags - }) - const id = tagSource.data.id; - const feature = state.allElements.ContainingFeatures.get(id) - if (feature.geometry.type !== "Point") { - return new FixedUiElement("Error: can only import point objects").SetClass("alert") - } - const [lon, lat] = feature.geometry.coordinates; - return new ImportButton( - args[2], args[1], tagSource, rewrittenTags, lat, lon, Number(args[3]), state - ) - } - }, - {funcName: "multi_apply", + funcName: "multi_apply", docs: "A button to apply the tagging of this object onto a list of other features. This is an advanced feature for which you'll need calculatedTags", - args:[ + args: [ {name: "feature_ids", doc: "A JSOn-serialized list of IDs of features to apply the tagging on"}, - {name: "keys", doc: "One key (or multiple keys, seperated by ';') of the attribute that should be copied onto the other features." }, + { + name: "keys", + doc: "One key (or multiple keys, seperated by ';') of the attribute that should be copied onto the other features." + }, {name: "text", doc: "The text to show on the button"}, - {name:"autoapply",doc:"A boolean indicating wether this tagging should be applied automatically if the relevant tags on this object are changed. A visual element indicating the multi_apply is still shown"}, - {name:"overwrite",doc:"If set to 'true', the tags on the other objects will always be overwritten. The default behaviour will be to only change the tags on other objects if they are either undefined or had the same value before the change"} + { + name: "autoapply", + doc: "A boolean indicating wether this tagging should be applied automatically if the relevant tags on this object are changed. A visual element indicating the multi_apply is still shown" + }, + { + name: "overwrite", + doc: "If set to 'true', the tags on the other objects will always be overwritten. The default behaviour will be to only change the tags on other objects if they are either undefined or had the same value before the change" + } ], example: "{multi_apply(_features_with_the_same_name_within_100m, name:etymology:wikidata;name:etymology, Apply etymology information on all nearby objects with the same name)}", constr: (state, tagsSource, args) => { @@ -503,14 +504,14 @@ There are also some technicalities in your theme to keep in mind: const text = args[2] const autoapply = args[3]?.toLowerCase() === "true" const overwrite = args[4]?.toLowerCase() === "true" - const featureIds : UIEventSource = tagsSource.map(tags => { - const ids = tags[featureIdsKey] - try{ - if(ids === undefined){ + const featureIds: UIEventSource = tagsSource.map(tags => { + const ids = tags[featureIdsKey] + try { + if (ids === undefined) { return [] } return JSON.parse(ids); - }catch(e){ + } catch (e) { console.warn("Could not parse ", ids, "as JSON to extract IDS which should be shown on the map.") return [] } @@ -526,14 +527,140 @@ There are also some technicalities in your theme to keep in mind: state } ); - + + } + }, + { + funcName: "tag_apply", + docs: "Shows a big button; clicking this button will apply certain tags onto the feature.\n\nThe first argument takes a specification of which tags to add.\n" + SpecialVisualizations.tagsToApplyHelpText, + args: [ + { + name: "tags_to_apply", + doc: "A specification of the tags to apply" + }, + { + name: "message", + doc: "The text to show to the contributor" + }, + { + name: "image", + doc: "An image to show to the contributor on the button" + }, + { + name: "id_of_object_to_apply_this_one", + defaultValue: undefined, + doc: "If specified, applies the the tags onto _another_ object. The id will be read from properties[id_of_object_to_apply_this_one] of the selected object. The tags are still calculated based on the tags of the _selected_ element" + } + ], + example: "`{tag_apply(survey_date:=$_now:date, Surveyed today!)}`", + constr: (state, tags, args) => { + const tagsToApply = SpecialVisualizations.generateTagsToApply(args[0], tags) + const msg = args[1] + let image = args[2]?.trim() + if (image === "" || image === "undefined") { + image = undefined + } + const targetIdKey = args[3] + const t = Translations.t.general.apply_button + + const tagsExplanation = new VariableUiElement(tagsToApply.map(tagsToApply => { + const tagsStr = tagsToApply.map(t => t.asHumanString(false, true)).join("&"); + let el: BaseUIElement = new FixedUiElement(tagsStr) + if (targetIdKey !== undefined) { + const targetId = tags.data[targetIdKey] ?? tags.data.id + el = t.appliedOnAnotherObject.Subs({tags: tagsStr, id: targetId}) + } + return el; + } + )).SetClass("subtle") + + const applied = new UIEventSource(false) + const applyButton = new SubtleButton(image, new Combine([msg, tagsExplanation]).SetClass("flex flex-col")) + .onClick(() => { + const targetId = tags.data[targetIdKey] ?? tags.data.id + const changeAction = new ChangeTagAction(targetId, + new And(tagsToApply.data), + tags.data, // We pass in the tags of the selected element, not the tags of the target element! + { + theme: state.layoutToUse.id, + changeType: "answer" + } + ) + state.changes.applyAction(changeAction) + applied.setData(true) + }) + + + return new Toggle( + new Toggle( + t.isApplied.SetClass("thanks"), + applyButton, + applied + ) + , undefined, state.osmConnection.isLoggedIn) + } + }, + { + funcName: "export_as_gpx", + docs: "Exports the selected feature as GPX-file", + args: [], + constr: (state, tagSource, args) => { + const t = Translations.t.general.download; + + return new SubtleButton(Svg.download_ui(), + new Combine([t.downloadGpx.SetClass("font-bold text-lg"), + t.downloadGpxHelper.SetClass("subtle")]).SetClass("flex flex-col") + ).onClick(() => { + console.log("Exporting as GPX!") + const tags = tagSource.data + const feature = state.allElements.ContainingFeatures.get(tags.id) + const matchingLayer = state?.layoutToUse?.getMatchingLayer(tags) + const gpx = GeoOperations.AsGpx(feature, matchingLayer) + const title = matchingLayer.title?.GetRenderValue(tags)?.Subs(tags)?.txt ?? "gpx_track" + Utils.offerContentsAsDownloadableFile(gpx, title+"_mapcomplete_export.gpx", { + mimetype: "{gpx=application/gpx+xml}" + }) + + + }) } } ] - static HelpMessage: BaseUIElement = SpecialVisualizations.GenHelpMessage(); + static generateTagsToApply(spec: string, tagSource: UIEventSource): UIEventSource { - private static GenHelpMessage() { + const tgsSpec = spec.split(";").map(spec => { + const kv = spec.split("=").map(s => s.trim()); + if (kv.length != 2) { + throw "Invalid key spec: multiple '=' found in " + spec + } + return kv + }) + return tagSource.map(tags => { + const newTags: Tag [] = [] + for (const [key, value] of tgsSpec) { + if (value.indexOf('$') >= 0) { + + let parts = value.split("$") + // THe first of the split won't start with a '$', so no substitution needed + let actualValue = parts[0] + parts.shift() + + for (const part of parts) { + const [_, varName, leftOver] = part.match(/([a-zA-Z0-9_:]*)(.*)/) + actualValue += (tags[varName] ?? "") + leftOver + } + newTags.push(new Tag(key, actualValue)) + } else { + newTags.push(new Tag(key, value)) + } + } + return newTags + }) + + } + + public static HelpMessage() { const helpTexts = SpecialVisualizations.specialVisualizations.map(viz => new Combine( @@ -541,7 +668,13 @@ There are also some technicalities in your theme to keep in mind: new Title(viz.funcName, 3), viz.docs, viz.args.length > 0 ? new Table(["name", "default", "description"], - viz.args.map(arg => [arg.name, arg.defaultValue ?? "undefined", arg.doc]) + viz.args.map(arg => { + let defaultArg = arg.defaultValue ?? "_undefined_" + if (defaultArg == "") { + defaultArg = "_empty string_" + } + return [arg.name, defaultArg, arg.doc]; + }) ) : undefined, new Title("Example usage", 4), new FixedUiElement( @@ -552,12 +685,18 @@ There are also some technicalities in your theme to keep in mind: )); + const toc = new List( + SpecialVisualizations.specialVisualizations.map(viz => new Link(viz.funcName, "#" + viz.funcName)) + ) + return new Combine([ new Title("Special tag renderings", 3), "In a tagrendering, some special values are substituted by an advanced UI-element. This allows advanced features and visualizations to be reused by custom themes or even to query third-party API's.", - "General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do not_fcs need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a comma in your args", + "General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do not_ need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a comma in your args", + toc, ...helpTexts ] - ); + ).SetClass("flex flex-col"); } + } \ No newline at end of file diff --git a/UI/SubstitutedTranslation.ts b/UI/SubstitutedTranslation.ts index 361540e65f..69f57683f5 100644 --- a/UI/SubstitutedTranslation.ts +++ b/UI/SubstitutedTranslation.ts @@ -8,6 +8,7 @@ import {Utils} from "../Utils"; import {VariableUiElement} from "./Base/VariableUIElement"; import Combine from "./Base/Combine"; import BaseUIElement from "./BaseUIElement"; +import {DefaultGuiState} from "./DefaultGuiState"; export class SubstitutedTranslation extends VariableUiElement { @@ -49,7 +50,7 @@ export class SubstitutedTranslation extends VariableUiElement { } const viz = proto.special; try { - return viz.func.constr(State.state, tagsSource, proto.special.args).SetStyle(proto.special.style); + return viz.func.constr(State.state, tagsSource, proto.special.args, DefaultGuiState.state).SetStyle(proto.special.style); } catch (e) { console.error("SPECIALRENDERING FAILED for", tagsSource.data?.id, e) return new FixedUiElement(`Could not generate special rendering for ${viz.func}(${viz.args.join(", ")}) ${e}`).SetStyle("alert") @@ -62,7 +63,6 @@ export class SubstitutedTranslation extends VariableUiElement { this.SetClass("w-full") } - public static ExtractSpecialComponents(template: string, extraMappings: SpecialVisualization[] = []): { fixed?: string, special?: { @@ -85,7 +85,9 @@ export class SubstitutedTranslation extends VariableUiElement { const partAfter = SubstitutedTranslation.ExtractSpecialComponents(matched[4], extraMappings); const args = knownSpecial.args.map(arg => arg.defaultValue ?? ""); if (argument.length > 0) { - const realArgs = argument.split(",").map(str => str.trim()); + const realArgs = argument.split(",").map(str => str.trim() + .replace(/&LPARENS/g, '(') + .replace(/&RPARENS/g, ')')); for (let i = 0; i < realArgs.length; i++) { if (args.length <= i) { args.push(realArgs[i]); diff --git a/UI/Wikipedia/WikidataPreviewBox.ts b/UI/Wikipedia/WikidataPreviewBox.ts index 1d7595e6d0..525e102b55 100644 --- a/UI/Wikipedia/WikidataPreviewBox.ts +++ b/UI/Wikipedia/WikidataPreviewBox.ts @@ -4,7 +4,6 @@ import Wikidata, {WikidataResponse} from "../../Logic/Web/Wikidata"; import {Translation} from "../i18n/Translation"; import {FixedUiElement} from "../Base/FixedUiElement"; import Loading from "../Base/Loading"; -import {Transform} from "stream"; import Translations from "../i18n/Translations"; import Combine from "../Base/Combine"; import Img from "../Base/Img"; @@ -16,6 +15,43 @@ import {Utils} from "../../Utils"; export default class WikidataPreviewBox extends VariableUiElement { + private static isHuman = [ + {p: 31/*is a*/, q: 5 /* human */}, + ] + // @ts-ignore + private static extraProperties: { + requires?: { p: number, q?: number }[], + property: string, + display: Translation | Map BaseUIElement) /*If translation: Subs({value: * }) */> + }[] = [ + { + requires: WikidataPreviewBox.isHuman, + property: "P21", + display: new Map([ + ['Q6581097', () => Svg.gender_male_ui().SetStyle("width: 1rem; height: auto")], + ['Q6581072', () => Svg.gender_female_ui().SetStyle("width: 1rem; height: auto")], + ['Q1097630', () => Svg.gender_inter_ui().SetStyle("width: 1rem; height: auto")], + ['Q1052281', () => Svg.gender_trans_ui().SetStyle("width: 1rem; height: auto")/*'transwomen'*/], + ['Q2449503', () => Svg.gender_trans_ui().SetStyle("width: 1rem; height: auto")/*'transmen'*/], + ['Q48270', () => Svg.gender_queer_ui().SetStyle("width: 1rem; height: auto")] + ]) + }, + { + property: "P569", + requires: WikidataPreviewBox.isHuman, + display: new Translation({ + "*": "Born: {value}" + }) + }, + { + property: "P570", + requires: WikidataPreviewBox.isHuman, + display: new Translation({ + "*": "Died: {value}" + }) + } + ] + constructor(wikidataId: UIEventSource) { let inited = false; const wikidata = wikidataId @@ -45,6 +81,7 @@ export default class WikidataPreviewBox extends VariableUiElement { })) } + // @ts-ignore public static WikidataResponsePreview(wikidata: WikidataResponse): BaseUIElement { let link = new Link( @@ -57,7 +94,7 @@ export default class WikidataPreviewBox extends VariableUiElement { let info = new Combine([ new Combine( [Translation.fromMap(wikidata.labels)?.SetClass("font-bold"), - link]).SetClass("flex justify-between"), + link]).SetClass("flex justify-between"), Translation.fromMap(wikidata.descriptions), WikidataPreviewBox.QuickFacts(wikidata) ]).SetClass("flex flex-col link-underline") @@ -80,87 +117,49 @@ export default class WikidataPreviewBox extends VariableUiElement { return info } - private static isHuman = [ - {p: 31/*is a*/, q: 5 /* human */}, - ] - // @ts-ignore - // @ts-ignore - private static extraProperties: { - requires?: { p: number, q?: number }[], - property: string, - display: Translation | Map BaseUIElement) /*If translation: Subs({value: * }) */> - }[] = [ - { - requires: WikidataPreviewBox.isHuman, - property: "P21", - display: new Map([ - ['Q6581097', () => Svg.gender_male_ui().SetStyle("width: 1rem; height: auto")], - ['Q6581072', () => Svg.gender_female_ui().SetStyle("width: 1rem; height: auto")], - ['Q1097630',() => Svg.gender_inter_ui().SetStyle("width: 1rem; height: auto")], - ['Q1052281',() => Svg.gender_trans_ui().SetStyle("width: 1rem; height: auto")/*'transwomen'*/], - ['Q2449503',() => Svg.gender_trans_ui().SetStyle("width: 1rem; height: auto")/*'transmen'*/], - ['Q48270',() => Svg.gender_queer_ui().SetStyle("width: 1rem; height: auto")] - ]) - }, - { - property: "P569", - requires: WikidataPreviewBox.isHuman, - display: new Translation({ - "*":"Born: {value}" - }) - }, - { - property: "P570", - requires: WikidataPreviewBox.isHuman, - display: new Translation({ - "*":"Died: {value}" - }) - } - ] - public static QuickFacts(wikidata: WikidataResponse): BaseUIElement { - - const els : BaseUIElement[] = [] + + const els: BaseUIElement[] = [] for (const extraProperty of WikidataPreviewBox.extraProperties) { let hasAllRequirements = true for (const requirement of extraProperty.requires) { - if(!wikidata.claims?.has("P"+requirement.p)){ + if (!wikidata.claims?.has("P" + requirement.p)) { hasAllRequirements = false; break } - if(!wikidata.claims?.get("P"+requirement.p).has("Q"+requirement.q)){ + if (!wikidata.claims?.get("P" + requirement.p).has("Q" + requirement.q)) { hasAllRequirements = false; break } } - if(!hasAllRequirements){ + if (!hasAllRequirements) { continue } - + const key = extraProperty.property const display = extraProperty.display const value: string[] = Array.from(wikidata.claims.get(key)) - if(value === undefined){ + if (value === undefined) { continue } - if(display instanceof Translation){ + if (display instanceof Translation) { els.push(display.Subs({value: value.join(", ")}).SetClass("m-2")) continue } const constructors = Utils.NoNull(value.map(property => display.get(property))) const elems = constructors.map(v => { - if(typeof v === "string"){ + if (typeof v === "string") { return new FixedUiElement(v) - }else{ + } else { return v(); } }) els.push(new Combine(elems).SetClass("flex m-2")) } - if(els.length === 0){ + if (els.length === 0) { return undefined; } - + return new Combine(els).SetClass("flex") } diff --git a/UI/Wikipedia/WikidataSearchBox.ts b/UI/Wikipedia/WikidataSearchBox.ts index da0c90ebce..c3df838cdd 100644 --- a/UI/Wikipedia/WikidataSearchBox.ts +++ b/UI/Wikipedia/WikidataSearchBox.ts @@ -13,6 +13,8 @@ import Svg from "../../Svg"; export default class WikidataSearchBox extends InputElement { + private static readonly _searchCache = new Map>() + IsSelected: UIEventSource = new UIEventSource(false); private readonly wikidataId: UIEventSource private readonly searchText: UIEventSource @@ -29,6 +31,10 @@ export default class WikidataSearchBox extends InputElement { return this.wikidataId; } + IsValid(t: string): boolean { + return t.startsWith("Q") && !isNaN(Number(t.substring(1))); + } + protected InnerConstructElement(): HTMLElement { const searchField = new TextField({ @@ -46,12 +52,20 @@ export default class WikidataSearchBox extends InputElement { return; } searchFailMessage.setData(undefined) - lastSearchResults.WaitForPromise( - Wikidata.searchAndFetch(searchText, { - lang: Locale.language.data, + + const lang = Locale.language.data + const key = lang + ":" + searchText + let promise = WikidataSearchBox._searchCache.get(key) + if (promise === undefined) { + promise = Wikidata.searchAndFetch(searchText, { + lang, maxCount: 5 } - ), err => searchFailMessage.setData(err)) + ) + WikidataSearchBox._searchCache.set(key, promise) + } + + lastSearchResults.WaitForPromise(promise, err => searchFailMessage.setData(err)) }) @@ -61,10 +75,10 @@ export default class WikidataSearchBox extends InputElement { return new Combine([Translations.t.general.wikipedia.failed.Clone().SetClass("alert"), searchFailMessage.data]) } - if(searchResults.length === 0){ + if (searchResults.length === 0) { return Translations.t.general.wikipedia.noResults.Subs({search: searchField.GetValue().data ?? ""}) } - + if (searchResults.length === 0) { return Translations.t.general.wikipedia.doSearch } @@ -88,7 +102,6 @@ export default class WikidataSearchBox extends InputElement { }, [searchFailMessage])) - // const full = new Combine([ new Title(Translations.t.general.wikipedia.searchWikidata, 3).SetClass("m-2"), new Combine([ @@ -108,10 +121,4 @@ export default class WikidataSearchBox extends InputElement { ]).ConstructElement(); } - IsSelected: UIEventSource = new UIEventSource(false); - - IsValid(t: string): boolean { - return t.startsWith("Q") && !isNaN(Number(t.substring(1))); - } - } \ No newline at end of file diff --git a/UI/Wikipedia/WikipediaBox.ts b/UI/Wikipedia/WikipediaBox.ts index 28fd62dc7e..b1a28fd465 100644 --- a/UI/Wikipedia/WikipediaBox.ts +++ b/UI/Wikipedia/WikipediaBox.ts @@ -88,7 +88,7 @@ export default class WikipediaBox extends Combine { } const wikidata = maybewikidata["success"] - if(wikidata === undefined){ + if (wikidata === undefined) { return "failed" } if (wikidata.wikisites.size === 0) { @@ -118,13 +118,13 @@ export default class WikipediaBox extends Combine { return wp.failed.Clone().SetClass("alert p-4") } if (status[0] == "no page") { - const [_, wd] = <[string, WikidataResponse]> status + const [_, wd] = <[string, WikidataResponse]>status return new Combine([ WikidataPreviewBox.WikidataResponsePreview(wd), wp.noWikipediaPage.Clone().SetClass("subtle")]).SetClass("flex flex-col p-4") } - const [pagetitle, language, wd] = <[string, string, WikidataResponse]> status + const [pagetitle, language, wd] = <[string, string, WikidataResponse]>status return WikipediaBox.createContents(pagetitle, language, wd) }) @@ -134,27 +134,27 @@ export default class WikipediaBox extends Combine { const titleElement = new VariableUiElement(wikiLink.map(state => { if (typeof state !== "string") { const [pagetitle, _] = state - if(pagetitle === "no page"){ - const wd = state[1] - return new Title( Translation.fromMap(wd.labels),3) + if (pagetitle === "no page") { + const wd = state[1] + return new Title(Translation.fromMap(wd.labels), 3) } return new Title(pagetitle, 3) } //return new Title(Translations.t.general.wikipedia.wikipediaboxTitle.Clone(), 2) - return new Title(wikidataId,3) + return new Title(wikidataId, 3) })) const linkElement = new VariableUiElement(wikiLink.map(state => { if (typeof state !== "string") { const [pagetitle, language] = state - if(pagetitle === "no page"){ - const wd = state[1] - return new Link(Svg.pop_out_ui().SetStyle("width: 1.2rem").SetClass("block "), - "https://www.wikidata.org/wiki/"+wd.id + if (pagetitle === "no page") { + const wd = state[1] + return new Link(Svg.pop_out_ui().SetStyle("width: 1.2rem").SetClass("block "), + "https://www.wikidata.org/wiki/" + wd.id , true) } - + const url = `https://${language}.wikipedia.org/wiki/${pagetitle}` return new Link(Svg.pop_out_ui().SetStyle("width: 1.2rem").SetClass("block "), url, true) } @@ -202,7 +202,7 @@ export default class WikipediaBox extends Combine { return new Combine([ quickFacts?.SetClass("border-2 border-grey rounded-lg m-1 mb-0"), new VariableUiElement(contents) - .SetClass("block pl-6 pt-2")]) + .SetClass("block pl-6 pt-2")]) } } \ No newline at end of file diff --git a/UI/i18n/Translation.ts b/UI/i18n/Translation.ts index 87dddde40d..f3966508f7 100644 --- a/UI/i18n/Translation.ts +++ b/UI/i18n/Translation.ts @@ -34,6 +34,38 @@ export class Translation extends BaseUIElement { return this.textFor(Translation.forcedLanguage ?? Locale.language.data) } + static ExtractAllTranslationsFrom(object: any, context = ""): { context: string, tr: Translation }[] { + const allTranslations: { context: string, tr: Translation }[] = [] + for (const key in object) { + const v = object[key] + if (v === undefined || v === null) { + continue + } + if (v instanceof Translation) { + allTranslations.push({context: context + "." + key, tr: v}) + continue + } + if (typeof v === "object") { + allTranslations.push(...Translation.ExtractAllTranslationsFrom(v, context + "." + key)) + + } + } + return allTranslations + } + + static fromMap(transl: Map) { + const translations = {} + let hasTranslation = false; + transl?.forEach((value, key) => { + translations[key] = value + hasTranslation = true + }) + if (!hasTranslation) { + return undefined + } + return new Translation(translations); + } + public textFor(language: string): string { if (this.translations["*"]) { return this.translations["*"]; @@ -195,36 +227,8 @@ export class Translation extends BaseUIElement { } return allIcons.filter(icon => icon != undefined) } - - static ExtractAllTranslationsFrom(object: any, context = ""): { context: string, tr: Translation }[] { - const allTranslations: { context: string, tr: Translation }[] = [] - for (const key in object) { - const v = object[key] - if (v === undefined || v === null) { - continue - } - if (v instanceof Translation) { - allTranslations.push({context: context +"." + key, tr: v}) - continue - } - if (typeof v === "object") { - allTranslations.push(...Translation.ExtractAllTranslationsFrom(v, context + "." + key)) - continue - } - } - return allTranslations - } - - static fromMap(transl: Map) { - const translations = {} - let hasTranslation = false; - transl?.forEach((value, key) => { - translations[key] = value - hasTranslation = true - }) - if(!hasTranslation){ - return undefined - } - return new Translation(translations); + + AsMarkdown(): string { + return this.txt } } \ No newline at end of file diff --git a/UI/i18n/Translations.ts b/UI/i18n/Translations.ts index d9e9d6e2db..6052d8b287 100644 --- a/UI/i18n/Translations.ts +++ b/UI/i18n/Translations.ts @@ -25,6 +25,9 @@ export default class Translations { if (t === undefined || t === null) { return undefined; } + if (typeof t === "number") { + t = "" + t + } if (typeof t === "string") { return new Translation({"*": t}, context); } @@ -44,7 +47,7 @@ export default class Translations { return undefined; } if (typeof (s) === "string") { - return new Translation({en: s}); + return new Translation({'*': s}); } if (s instanceof Translation) { return s.Clone() /* MUST CLONE HERE! */; diff --git a/Utils.ts b/Utils.ts index a732f1ab88..7736ab225a 100644 --- a/Utils.ts +++ b/Utils.ts @@ -10,6 +10,17 @@ export class Utils { public static runningFromConsole = typeof window === "undefined"; public static readonly assets_path = "./assets/svg/"; public static externalDownloadFunction: (url: string, headers?: any) => Promise; + public static Special_visualizations_tagsToApplyHelpText = `These can either be a tag to add, such as \`amenity=fast_food\` or can use a substitution, e.g. \`addr:housenumber=$number\`. +This new point will then have the tags \`amenity=fast_food\` and \`addr:housenumber\` with the value that was saved in \`number\` in the original feature. + +If a value to substitute is undefined, empty string will be used instead. + +This supports multiple values, e.g. \`ref=$source:geometry:type/$source:geometry:ref\` + +Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name (matched with \`[a-zA-Z0-9_:]*\`). Sadly, delimiting with \`{}\` as these already mark the boundaries of the special rendering... + +Note that these values can be prepare with javascript in the theme by using a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) + ` private static knownKeys = ["addExtraTags", "and", "calculatedTags", "changesetmessage", "clustering", "color", "condition", "customCss", "dashArray", "defaultBackgroundId", "description", "descriptionTail", "doNotDownload", "enableAddNewPoints", "enableBackgroundLayerSelection", "enableGeolocation", "enableLayers", "enableMoreQuests", "enableSearch", "enableShareScreen", "enableUserBadge", "freeform", "hideFromOverview", "hideInAnswer", "icon", "iconOverlays", "iconSize", "id", "if", "ifnot", "isShown", "key", "language", "layers", "lockLocation", "maintainer", "mappings", "maxzoom", "maxZoom", "minNeededElements", "minzoom", "multiAnswer", "name", "or", "osmTags", "passAllFeatures", "presets", "question", "render", "roaming", "roamingRenderings", "rotation", "shortDescription", "socialImage", "source", "startLat", "startLon", "startZoom", "tagRenderings", "tags", "then", "title", "titleIcons", "type", "version", "wayHandling", "widenFactor", "width"] private static extraKeys = ["nl", "en", "fr", "de", "pt", "es", "name", "phone", "email", "amenity", "leisure", "highway", "building", "yes", "no", "true", "false"] private static injectedDownloads = {} @@ -133,6 +144,21 @@ export class Utils { return newArr; } + public static Dupicates(arr: string[]): string[] { + if (arr === undefined) { + return undefined; + } + const newArr = []; + const seen = new Set(); + for (const string of arr) { + if(seen.has(string)){ + newArr.push(string) + } + seen.add(string) + } + return newArr; + } + public static Identical(t1: T[], t2: T[], eq?: (t: T, t0: T) => boolean): boolean { if (t1.length !== t2.length) { return false @@ -165,18 +191,27 @@ export class Utils { return [a.substr(0, index), a.substr(index + sep.length)]; } - public static SubstituteKeys(txt: string, tags: any) { - + public static SubstituteKeys(txt: string | undefined, tags: any): string | undefined { + if (txt === undefined) { + return undefined + } const regex = /.*{([^}]*)}.*/ let match = txt.match(regex) while (match) { const key = match[1] - txt = txt.replace("{" + key + "}", tags[key] ?? "") + let v = tags[key] + if(v !== undefined ){ + if(typeof v !== "string"){ + v = ""+v + } + v = v.replace(/\n/g, "
") + } + txt = txt.replace("{" + key + "}", v ?? "") match = txt.match(regex) } - + return txt; } @@ -189,7 +224,7 @@ export class Utils { link.href = location; link.media = 'all'; head.appendChild(link); - console.log("Added custom layout ", location) + console.log("Added custom css file ", location) } /** @@ -222,6 +257,9 @@ export class Utils { } const sourceV = source[key]; + if(target === null){ + return source + } const targetV = target[key] if (typeof sourceV === "object") { if (sourceV === null) { @@ -455,11 +493,11 @@ export class Utils { const now = new Date() const lastWeek = new Date(now.getTime() - daysInThePast * 24 * 60 * 60 * 1000) const date = lastWeek.getFullYear() + "-" + Utils.TwoDigits(lastWeek.getMonth() + 1) + "-" + Utils.TwoDigits(lastWeek.getDate()) - let osmcha_link = `{"date__gte":[{"label":"${date}","value":"${date}"}],"editor":[{"label":"mapcomplete","value":"mapcomplete"}]}` + let osmcha_link = `"date__gte":[{"label":"${date}","value":"${date}"}],"editor":[{"label":"mapcomplete","value":"mapcomplete"}]` if (theme !== undefined) { - osmcha_link = osmcha_link + "," + `{"comment":[{"label":"#${theme}","value":"#${theme}"}]` + osmcha_link = osmcha_link + "," + `"comment":[{"label":"#${theme}","value":"#${theme}"}]` } - return "https://osmcha.org/?filters=" + encodeURIComponent(osmcha_link) + return "https://osmcha.org/?filters=" + encodeURIComponent("{" + osmcha_link + "}") } private static colorDiff(c0: { r: number, g: number, b: number }, c1: { r: number, g: number, b: number }) { diff --git a/assets/layers/artwork/artwork.json b/assets/layers/artwork/artwork.json index c26544d4e2..3969e0e2dc 100644 --- a/assets/layers/artwork/artwork.json +++ b/assets/layers/artwork/artwork.json @@ -1,421 +1,447 @@ { - "id": "artwork", - "name": { - "en": "Artworks", - "nl": "Kunstwerken", - "fr": "Œuvres d'art", - "de": "Kunstwerke", - "id": "Karya seni", - "it": "Opere d’arte", - "ru": "Произведения искусства", - "es": "Obras de arte", - "ja": "美術品", + "id": "artwork", + "name": { + "en": "Artworks", + "nl": "Kunstwerken", + "fr": "Œuvres d'art", + "de": "Kunstwerke", + "id": "Karya seni", + "it": "Opere d’arte", + "ru": "Произведения искусства", + "es": "Obras de arte", + "ja": "美術品", + "zh_Hant": "藝術品", + "nb_NO": "Kunstverk" + }, + "source": { + "osmTags": "tourism=artwork" + }, + "title": { + "render": { + "en": "Artwork", + "nl": "Kunstwerk", + "fr": "Œuvre d'art", + "de": "Kunstwerk", + "id": "Karya Seni", + "it": "Opera d’arte", + "ru": "Художественная работа", + "es": "Obra de arte", + "ja": "アートワーク", + "zh_Hant": "藝術品", + "nb_NO": "Kunstverk", + "fi": "Taideteos", + "gl": "Obra de arte", + "hu": "Műalkotás", + "pl": "Dzieło sztuki", + "pt": "Obra de arte", + "pt_BR": "Obra de arte", + "sv": "Konstverk" + }, + "mappings": [ + { + "if": "name~*", + "then": { + "en": "Artwork {name}", + "nl": "Kunstwerk {name}", + "fr": "Œuvre d'art {name}", + "de": "Kunstwerk {name}", + "id": "Karya Seni {name}", + "it": "Opera {name}", + "ru": "Художественная работа {name}", + "es": "Obra de arte {nombre}", + "ja": "アートワーク {name}", + "zh_Hant": "藝術品{name}", + "fi": "Taideteos {name}", + "gl": "Obra de arte {name}", + "hu": "Műalkotás {name}", + "nb_NO": "Kunstverk {name}", + "pl": "Dzieło sztuki {name}", + "pt": "Obra de arte {name}", + "pt_BR": "Obra de arte {name}", + "sv": "Konstverk {name}" + } + } + ] + }, + "description": { + "en": "Diverse pieces of artwork", + "nl": "Verschillende soorten kunstwerken", + "fr": "Diverses œuvres d'art", + "de": "Verschiedene Kunstwerke", + "it": "Diverse opere d’arte", + "ru": "Разнообразные произведения искусства", + "es": "Diversas piezas de obras de arte", + "ja": "多様な作品", + "zh_Hant": "不同類型的藝術品", + "id": "Beragam karya seni" + }, + "minzoom": 12, + "presets": [ + { + "tags": [ + "tourism=artwork" + ], + "title": { + "en": "Artwork", + "nl": "Kunstwerk", + "fr": "Œuvre d'art", + "de": "Kunstwerk", + "it": "Opera d’arte", + "ru": "Художественная работа", + "es": "Obra de arte", + "ja": "アートワーク", "zh_Hant": "藝術品", - "nb_NO": "Kunstverk" - }, - "source": { - "osmTags": "tourism=artwork" - }, - "title": { - "render": { - "en": "Artwork", - "nl": "Kunstwerk", - "fr": "Œuvre d'art", - "de": "Kunstwerk", - "id": "Karya Seni", - "it": "Opera d’arte", - "ru": "Художественная работа", - "es": "Obra de arte", - "ja": "アートワーク", - "zh_Hant": "藝術品", - "nb_NO": "Kunstverk", - "fi": "Taideteos", - "gl": "Obra de arte", - "hu": "Műalkotás", - "pl": "Dzieło sztuki", - "pt": "Obra de arte", - "pt_BR": "Obra de arte", - "sv": "Konstverk" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "en": "Artwork {name}", - "nl": "Kunstwerk {name}", - "fr": "Œuvre d'art {name}", - "de": "Kunstwerk {name}", - "id": "Karya Seni {name}", - "it": "Opera {name}", - "ru": "Художественная работа {name}", - "es": "Obra de arte {nombre}", - "ja": "アートワーク {name}", - "zh_Hant": "藝術品{name}", - "fi": "Taideteos {name}", - "gl": "Obra de arte {name}", - "hu": "Műalkotás {name}", - "nb_NO": "Kunstverk {name}", - "pl": "Dzieło sztuki {name}", - "pt": "Obra de arte {name}", - "pt_BR": "Obra de arte {name}", - "sv": "Konstverk {name}" - } - } - ] - }, - "icon": { - "render": "./assets/themes/artwork/artwork.svg" - }, - "color": { - "render": "#0000ff" - }, - "width": { - "render": "10" - }, - "description": { - "en": "Diverse pieces of artwork", - "nl": "Verschillende soorten kunstwerken", - "fr": "Diverses œuvres d'art", - "de": "Verschiedene Kunstwerke", - "it": "Diverse opere d’arte", - "ru": "Разнообразные произведения искусства", - "es": "Diversas piezas de obras de arte", - "ja": "多様な作品", - "zh_Hant": "不同類型的藝術品" - }, - "minzoom": 12, - "wayHandling": 2, - "presets": [ - { - "tags": [ - "tourism=artwork" - ], - "title": { - "en": "Artwork", - "nl": "Kunstwerk", - "fr": "Œuvre d'art", - "de": "Kunstwerk", - "it": "Opera d’arte", - "ru": "Художественная работа", - "es": "Obra de arte", - "ja": "アートワーク", - "zh_Hant": "藝術品", - "nb_NO": "Kunstverk", - "fi": "Taideteos", - "gl": "Obra de arte", - "hu": "Műalkotás", - "id": "Karya Seni", - "pl": "Dzieło sztuki", - "pt": "Obra de arte", - "pt_BR": "Obra de arte", - "sv": "Konstverk" - } - } - ], - "tagRenderings": [ - "images", - { - "render": { - "en": "This is a {artwork_type}", - "nl": "Dit is een {artwork_type}", - "fr": "Type d'œuvre : {artwork_type}", - "de": "Dies ist ein {artwork_type}", - "it": "Si tratta di un {artwork_type}", - "ru": "Это {artwork_type}", - "es": "Esta es un {artwork_type}", - "ja": "これは{artwork_type}です", - "zh_Hant": "這是 {artwork_type}", - "nb_NO": "Dette er et kunstverk av typen {artwork_type}" - }, - "question": { - "en": "What is the type of this artwork?", - "nl": "Wat voor soort kunstwerk is dit?", - "fr": "Quel est le type de cette œuvre d'art?", - "de": "Was ist die Art dieses Kunstwerks?", - "it": "Che tipo di opera d’arte è questo?", - "ru": "К какому типу относится эта работа?", - "es": "Cuál es el tipo de esta obra de arte?", - "ja": "この作品の種類は何ですか?", - "zh_Hant": "這是什麼類型的藝術品?", - "nb_NO": "Hvilken type kunstverk er dette?" - }, - "freeform": { - "key": "artwork_type", - "addExtraTags": [ - "fixme=Artowrk type was added with the freeform, might need another check" - ] - }, - "mappings": [ - { - "if": "artwork_type=architecture", - "then": { - "en": "Architecture", - "nl": "Architectuur", - "fr": "Architecture", - "de": "Architektur", - "it": "Architettura", - "ru": "Архитектура", - "ja": "建物", - "zh_Hant": "建築物", - "nb_NO": "Arkitektur" - } - }, - { - "if": "artwork_type=mural", - "then": { - "en": "Mural", - "nl": "Muurschildering", - "fr": "Peinture murale", - "de": "Wandbild", - "it": "Murale", - "ru": "Фреска", - "ja": "壁画", - "zh_Hant": "壁畫", - "nb_NO": "Veggmaleri" - } - }, - { - "if": "artwork_type=painting", - "then": { - "en": "Painting", - "nl": "Schilderij", - "fr": "Peinture", - "de": "Malerei", - "it": "Dipinto", - "ru": "Живопись", - "ja": "絵画", - "zh_Hant": "繪畫", - "nb_NO": "Maleri" - } - }, - { - "if": "artwork_type=sculpture", - "then": { - "en": "Sculpture", - "nl": "Beeldhouwwerk", - "fr": "Sculpture", - "de": "Skulptur", - "it": "Scultura", - "ru": "Скульптура", - "ja": "彫刻", - "zh_Hant": "雕塑", - "nb_NO": "Skulptur" - } - }, - { - "if": "artwork_type=statue", - "then": { - "en": "Statue", - "nl": "Standbeeld", - "fr": "Statue", - "de": "Statue", - "it": "Statua", - "ru": "Статуя", - "ja": "彫像", - "zh_Hant": "雕像", - "nb_NO": "Statue" - } - }, - { - "if": "artwork_type=bust", - "then": { - "en": "Bust", - "nl": "Buste", - "fr": "Buste", - "de": "Büste", - "it": "Busto", - "ru": "Бюст", - "ja": "胸像", - "zh_Hant": "半身像", - "nb_NO": "Byste" - } - }, - { - "if": "artwork_type=stone", - "then": { - "en": "Stone", - "nl": "Steen", - "fr": "Rocher", - "de": "Stein", - "it": "Masso", - "ru": "Камень", - "ja": "石", - "zh_Hant": "石頭", - "nb_NO": "Stein" - } - }, - { - "if": "artwork_type=installation", - "then": { - "en": "Installation", - "nl": "Installatie", - "fr": "Installation", - "de": "Installation", - "it": "Istallazione", - "ru": "Инсталляция", - "ja": "インスタレーション", - "zh_Hant": "安裝", - "nb_NO": "Installasjon" - } - }, - { - "if": "artwork_type=graffiti", - "then": { - "en": "Graffiti", - "nl": "Graffiti", - "fr": "Graffiti", - "de": "Graffiti", - "it": "Graffiti", - "ru": "Граффити", - "ja": "落書き", - "zh_Hant": "塗鴨", - "nb_NO": "Graffiti" - } - }, - { - "if": "artwork_type=relief", - "then": { - "en": "Relief", - "nl": "Reliëf", - "fr": "Relief", - "de": "Relief", - "it": "Rilievo", - "ru": "Рельеф", - "ja": "レリーフ", - "zh_Hant": "寬慰", - "nb_NO": "Relieff" - } - }, - { - "if": "artwork_type=azulejo", - "then": { - "en": "Azulejo (Spanish decorative tilework)", - "nl": "Azulejo (Spaanse siertegels)", - "fr": "Azulejo (faïence latine)", - "de": "Azulejo (spanische dekorative Fliesenarbeit)", - "it": "Azulejo (ornamento decorativo piastrellato spagnolo)", - "ru": "Азуле́жу (испанская роспись глазурованной керамической плитки)", - "ja": "Azulejo (スペインの装飾タイル)", - "zh_Hant": "Azulejo (西班牙雕塑作品名稱)", - "nb_NO": "Azulejo (Spansk dekorativt flisverk)" - } - }, - { - "if": "artwork_type=tilework", - "then": { - "en": "Tilework", - "nl": "Tegelwerk", - "fr": "Carrelage", - "de": "Fliesenarbeit", - "it": "Mosaico di piastrelle", - "ru": "Плитка (мозаика)", - "ja": "タイルワーク", - "zh_Hant": "瓷磚", - "nb_NO": "Flisarbeid" - } - } - ], - "id": "artwork-artwork_type" - }, - { - "question": { - "en": "Which artist created this?", - "nl": "Welke kunstenaar creëerde dit kunstwerk?", - "fr": "Quel artiste a créé cette œuvre ?", - "de": "Welcher Künstler hat das geschaffen?", - "it": "Quale artista ha creato quest’opera?", - "ru": "Какой художник создал это?", - "ja": "どのアーティストが作ったんですか?", - "zh_Hant": "創造這個的藝術家是誰?", - "nb_NO": "Hvilken artist lagde dette?" - }, - "render": { - "en": "Created by {artist_name}", - "nl": "Gecreëerd door {artist_name}", - "fr": "Créé par {artist_name}", - "de": "Erstellt von {artist_name}", - "it": "Creato da {artist_name}", - "ru": "Создано {artist_name}", - "ja": "作成者:{artist_name}", - "zh_Hant": "{artist_name} 創作", - "nb_NO": "Laget av {artist_name}" - }, - "freeform": { - "key": "artist_name" - }, - "id": "artwork-artist_name" - }, - { - "question": { - "en": "Is there a website with more information about this artwork?", - "nl": "Is er een website met meer informatie over dit kunstwerk?", - "fr": "Existe-t-il un site web où trouver plus d'informations sur cette œuvre d'art ?", - "de": "Gibt es eine Website mit weiteren Informationen über dieses Kunstwerk?", - "it": "Esiste un sito web con maggiori informazioni su quest’opera?", - "ru": "Есть ли сайт с более подробной информацией об этой работе?", - "ja": "この作品についての詳しい情報はどのウェブサイトにありますか?", - "zh_Hant": "在那個網站能夠找到更多藝術品的資訊?", - "nb_NO": "Finnes det en nettside med mer info om dette kunstverket?" - }, - "render": { - "en": "More information on this website", - "nl": "Meer informatie op deze website", - "fr": "Plus d'info sûr ce site web", - "de": "Weitere Informationen auf dieser Webseite", - "id": "Info lanjut tersedia di laman web ini.", - "it": "Ulteriori informazioni su questo sito web", - "ru": "Больше информации на этом сайте", - "ja": "Webサイトに詳細情報がある", - "zh_Hant": "這個網站有更多資訊", - "nb_NO": "Mer info er å finne på denne nettsiden" - }, - "freeform": { - "key": "website", - "type": "url" - }, - "id": "artwork-website" - }, - { - "question": { - "en": "Which Wikidata-entry corresponds with this artwork?", - "nl": "Welk Wikidata-item beschrijft dit kunstwerk?", - "fr": "Quelle entrée Wikidata correspond à cette œuvre d'art ?", - "de": "Welcher Wikidata-Eintrag entspricht diesem Kunstwerk?", - "it": "Quale elemento Wikidata corrisponde a quest’opera d’arte?", - "ru": "Какая запись в Wikidata соответсвует этой работе?", - "ja": "このアートワークに関するWikidataのエントリーはどれですか?", - "zh_Hant": "這個藝術品有那個對應的 Wikidata 項目?", - "nb_NO": "Hvilken Wikipedia-oppføring samsvarer med dette kunstverket?" - }, - "render": { - "en": "Corresponds with {wikidata}", - "nl": "Komt overeen met {wikidata}", - "fr": "Correspond à {wikidata}", - "de": "Entspricht {wikidata}", - "it": "Corrisponde a {wikidata}", - "ru": "Запись об этой работе в wikidata: {wikidata}", - "ja": "{wikidata}に関連する", - "zh_Hant": "與 {wikidata}對應", - "nb_NO": "Samsvarer med {wikidata}" - }, - "freeform": { - "key": "wikidata", - "type": "wikidata" - }, - "id": "artwork-wikidata" - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "razed:tourism=artwork", - "tourism=" - ] - }, - "neededChangesets": 5 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + "nb_NO": "Kunstverk", + "fi": "Taideteos", + "gl": "Obra de arte", + "hu": "Műalkotás", + "id": "Karya Seni", + "pl": "Dzieło sztuki", + "pt": "Obra de arte", + "pt_BR": "Obra de arte", + "sv": "Konstverk" + } } + ], + "tagRenderings": [ + "images", + { + "render": { + "en": "This is a {artwork_type}", + "nl": "Dit is een {artwork_type}", + "fr": "Type d'œuvre : {artwork_type}", + "de": "Dies ist ein {artwork_type}", + "it": "Si tratta di un {artwork_type}", + "ru": "Это {artwork_type}", + "es": "Esta es un {artwork_type}", + "ja": "これは{artwork_type}です", + "zh_Hant": "這是 {artwork_type}", + "nb_NO": "Dette er et kunstverk av typen {artwork_type}", + "id": "Ini adalah {artwork_type}" + }, + "question": { + "en": "What is the type of this artwork?", + "nl": "Wat voor soort kunstwerk is dit?", + "fr": "Quel est le type de cette œuvre d'art?", + "de": "Was ist die Art dieses Kunstwerks?", + "it": "Che tipo di opera d’arte è questo?", + "ru": "К какому типу относится эта работа?", + "es": "Cuál es el tipo de esta obra de arte?", + "ja": "この作品の種類は何ですか?", + "zh_Hant": "這是什麼類型的藝術品?", + "nb_NO": "Hvilken type kunstverk er dette?", + "id": "Apa jenis karya seni ini?" + }, + "freeform": { + "key": "artwork_type", + "addExtraTags": [ + "fixme=Artowrk type was added with the freeform, might need another check" + ] + }, + "mappings": [ + { + "if": "artwork_type=architecture", + "then": { + "en": "Architecture", + "nl": "Architectuur", + "fr": "Architecture", + "de": "Architektur", + "it": "Architettura", + "ru": "Архитектура", + "ja": "建物", + "zh_Hant": "建築物", + "nb_NO": "Arkitektur", + "id": "Arsitektur" + } + }, + { + "if": "artwork_type=mural", + "then": { + "en": "Mural", + "nl": "Muurschildering", + "fr": "Peinture murale", + "de": "Wandbild", + "it": "Murale", + "ru": "Фреска", + "ja": "壁画", + "zh_Hant": "壁畫", + "nb_NO": "Veggmaleri", + "id": "Mural" + } + }, + { + "if": "artwork_type=painting", + "then": { + "en": "Painting", + "nl": "Schilderij", + "fr": "Peinture", + "de": "Malerei", + "it": "Dipinto", + "ru": "Живопись", + "ja": "絵画", + "zh_Hant": "繪畫", + "nb_NO": "Maleri", + "id": "Lukisan" + } + }, + { + "if": "artwork_type=sculpture", + "then": { + "en": "Sculpture", + "nl": "Beeldhouwwerk", + "fr": "Sculpture", + "de": "Skulptur", + "it": "Scultura", + "ru": "Скульптура", + "ja": "彫刻", + "zh_Hant": "雕塑", + "nb_NO": "Skulptur", + "id": "Patung" + } + }, + { + "if": "artwork_type=statue", + "then": { + "en": "Statue", + "nl": "Standbeeld", + "fr": "Statue", + "de": "Statue", + "it": "Statua", + "ru": "Статуя", + "ja": "彫像", + "zh_Hant": "雕像", + "nb_NO": "Statue" + } + }, + { + "if": "artwork_type=bust", + "then": { + "en": "Bust", + "nl": "Buste", + "fr": "Buste", + "de": "Büste", + "it": "Busto", + "ru": "Бюст", + "ja": "胸像", + "zh_Hant": "半身像", + "nb_NO": "Byste" + } + }, + { + "if": "artwork_type=stone", + "then": { + "en": "Stone", + "nl": "Steen", + "fr": "Rocher", + "de": "Stein", + "it": "Masso", + "ru": "Камень", + "ja": "石", + "zh_Hant": "石頭", + "nb_NO": "Stein", + "id": "Batu" + } + }, + { + "if": "artwork_type=installation", + "then": { + "en": "Installation", + "nl": "Installatie", + "fr": "Installation", + "de": "Installation", + "it": "Istallazione", + "ru": "Инсталляция", + "ja": "インスタレーション", + "zh_Hant": "安裝", + "nb_NO": "Installasjon", + "id": "Instalasi" + } + }, + { + "if": "artwork_type=graffiti", + "then": { + "en": "Graffiti", + "nl": "Graffiti", + "fr": "Graffiti", + "de": "Graffiti", + "it": "Graffiti", + "ru": "Граффити", + "ja": "落書き", + "zh_Hant": "塗鴨", + "nb_NO": "Graffiti", + "id": "Graffiti" + } + }, + { + "if": "artwork_type=relief", + "then": { + "en": "Relief", + "nl": "Reliëf", + "fr": "Relief", + "de": "Relief", + "it": "Rilievo", + "ru": "Рельеф", + "ja": "レリーフ", + "zh_Hant": "寬慰", + "nb_NO": "Relieff", + "id": "Relief" + } + }, + { + "if": "artwork_type=azulejo", + "then": { + "en": "Azulejo (Spanish decorative tilework)", + "nl": "Azulejo (Spaanse siertegels)", + "fr": "Azulejo (faïence latine)", + "de": "Azulejo (spanische dekorative Fliesenarbeit)", + "it": "Azulejo (ornamento decorativo piastrellato spagnolo)", + "ru": "Азуле́жу (испанская роспись глазурованной керамической плитки)", + "ja": "Azulejo (スペインの装飾タイル)", + "zh_Hant": "Azulejo (西班牙雕塑作品名稱)", + "nb_NO": "Azulejo (Spansk dekorativt flisverk)", + "id": "Azulejo (ubin dekoratif Spanyol)" + } + }, + { + "if": "artwork_type=tilework", + "then": { + "en": "Tilework", + "nl": "Tegelwerk", + "fr": "Carrelage", + "de": "Fliesenarbeit", + "it": "Mosaico di piastrelle", + "ru": "Плитка (мозаика)", + "ja": "タイルワーク", + "zh_Hant": "瓷磚", + "nb_NO": "Flisarbeid" + } + } + ], + "id": "artwork-artwork_type" + }, + { + "question": { + "en": "Which artist created this?", + "nl": "Welke kunstenaar creëerde dit kunstwerk?", + "fr": "Quel artiste a créé cette œuvre ?", + "de": "Welcher Künstler hat das geschaffen?", + "it": "Quale artista ha creato quest’opera?", + "ru": "Какой художник создал это?", + "ja": "どのアーティストが作ったんですか?", + "zh_Hant": "創造這個的藝術家是誰?", + "nb_NO": "Hvilken artist lagde dette?", + "id": "Seniman mana yang menciptakan ini?" + }, + "render": { + "en": "Created by {artist_name}", + "nl": "Gecreëerd door {artist_name}", + "fr": "Créé par {artist_name}", + "de": "Erstellt von {artist_name}", + "it": "Creato da {artist_name}", + "ru": "Создано {artist_name}", + "ja": "作成者:{artist_name}", + "zh_Hant": "{artist_name} 創作", + "nb_NO": "Laget av {artist_name}", + "id": "Dibuat oleh {artist_name}" + }, + "freeform": { + "key": "artist_name" + }, + "id": "artwork-artist_name" + }, + { + "question": { + "en": "Is there a website with more information about this artwork?", + "nl": "Is er een website met meer informatie over dit kunstwerk?", + "fr": "Existe-t-il un site web où trouver plus d'informations sur cette œuvre d'art ?", + "de": "Gibt es eine Website mit weiteren Informationen über dieses Kunstwerk?", + "it": "Esiste un sito web con maggiori informazioni su quest’opera?", + "ru": "Есть ли сайт с более подробной информацией об этой работе?", + "ja": "この作品についての詳しい情報はどのウェブサイトにありますか?", + "zh_Hant": "在那個網站能夠找到更多藝術品的資訊?", + "nb_NO": "Finnes det en nettside med mer info om dette kunstverket?", + "id": "Adakah situs web mengenai informasi lebih lanjut tentang karya seni ini?" + }, + "render": { + "en": "More information on this website", + "nl": "Meer informatie op deze website", + "fr": "Plus d'info sûr ce site web", + "de": "Weitere Informationen auf dieser Webseite", + "id": "Info lanjut tersedia di laman web ini", + "it": "Ulteriori informazioni su questo sito web", + "ru": "Больше информации на этом сайте", + "ja": "Webサイトに詳細情報がある", + "zh_Hant": "這個網站有更多資訊", + "nb_NO": "Mer info er å finne på denne nettsiden" + }, + "freeform": { + "key": "website", + "type": "url" + }, + "id": "artwork-website" + }, + { + "question": { + "en": "Which Wikidata-entry corresponds with this artwork?", + "nl": "Welk Wikidata-item beschrijft dit kunstwerk?", + "fr": "Quelle entrée Wikidata correspond à cette œuvre d'art ?", + "de": "Welcher Wikidata-Eintrag entspricht diesem Kunstwerk?", + "it": "Quale elemento Wikidata corrisponde a quest’opera d’arte?", + "ru": "Какая запись в Wikidata соответсвует этой работе?", + "ja": "このアートワークに関するWikidataのエントリーはどれですか?", + "zh_Hant": "這個藝術品有那個對應的 Wikidata 項目?", + "nb_NO": "Hvilken Wikipedia-oppføring samsvarer med dette kunstverket?", + "id": "Entri Wikidata mana yang sesuai dengan karya seni ini?" + }, + "render": { + "en": "Corresponds with {wikidata}", + "nl": "Komt overeen met {wikidata}", + "fr": "Correspond à {wikidata}", + "de": "Entspricht {wikidata}", + "it": "Corrisponde a {wikidata}", + "ru": "Запись об этой работе в wikidata: {wikidata}", + "ja": "{wikidata}に関連する", + "zh_Hant": "與 {wikidata}對應", + "nb_NO": "Samsvarer med {wikidata}", + "id": "Sesuai dengan {wikidata}" + }, + "freeform": { + "key": "wikidata", + "type": "wikidata" + }, + "id": "artwork-wikidata" + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "razed:tourism=artwork", + "tourism=" + ] + }, + "neededChangesets": 5 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/artwork/artwork.svg" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#0000ff" + }, + "width": { + "render": "10" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/barrier/barrier.json b/assets/layers/barrier/barrier.json index 666c290e04..b481674b81 100644 --- a/assets/layers/barrier/barrier.json +++ b/assets/layers/barrier/barrier.json @@ -1,328 +1,337 @@ { - "id": "barrier", - "name": { - "en": "Barriers", - "nl": "Barrières", - "de": "Hindernisse", - "ru": "Препятствия" + "id": "barrier", + "name": { + "en": "Barriers", + "nl": "Barrières", + "de": "Hindernisse", + "ru": "Препятствия" + }, + "description": { + "en": "Obstacles while cycling, such as bollards and cycle barriers", + "nl": "Hindernissen tijdens het fietsen, zoals paaltjes en fietshekjes", + "de": "Hindernisse beim Fahrradfahren, wie zum Beispiel Poller und Fahrrad Barrieren" + }, + "source": { + "osmTags": { + "or": [ + "barrier=bollard", + "barrier=cycle_barrier" + ] + } + }, + "minzoom": 17, + "title": { + "render": { + "en": "Barrier", + "nl": "Barrière", + "de": "Hindernis", + "ru": "Препятствие" }, - "description": { - "en": "Obstacles while cycling, such as bollards and cycle barriers", - "nl": "Hindernissen tijdens het fietsen, zoals paaltjes en fietshekjes", - "de": "Hindernisse beim Fahrradfahren, wie zum Beispiel Poller und Fahrrad Barrieren" - }, - "source": { - "osmTags": { - "or": [ - "barrier=bollard", - "barrier=cycle_barrier" - ] + "mappings": [ + { + "if": "barrier=bollard", + "then": { + "en": "Bollard", + "nl": "Paaltje", + "de": "Poller", + "ru": "Прикол" } - }, - "minzoom": 17, - "title": { - "render": { - "en": "Barrier", - "nl": "Barrière", - "de": "Hindernis", - "ru": "Препятствие" - }, - "mappings": [ - { - "if": "barrier=bollard", - "then": { - "en": "Bollard", - "nl": "Paaltje", - "de": "Poller", - "ru": "Прикол" - } - }, - { - "if": "barrier=cycle_barrier", - "then": { - "en": "Cycling Barrier", - "nl": "Fietshekjes", - "de": "Barriere für Radfahrer" - } - } - ] - }, - "icon": "./assets/layers/barrier/barrier.svg", - "width": "5", - "presets": [ - { - "title": { - "en": "Bollard", - "nl": "Paaltje", - "de": "Poller", - "ru": "Прикол" - }, - "tags": [ - "barrier=bollard" - ], - "description": { - "en": "A bollard in the road", - "nl": "Een paaltje in de weg", - "de": "Ein Poller auf der Straße" - }, - "preciseInput": { - "preferredBackground": [ - "photo" - ], - "snapToLayer": "cycleways_and_roads", - "maxSnapDistance": 25 - } - }, - { - "title": { - "en": "Cycle barrier", - "nl": "Fietshekjes", - "de": "Fahrradhindernis" - }, - "tags": [ - "barrier=bollard" - ], - "description": { - "en": "Cycle barrier, slowing down cyclists", - "nl": "Fietshekjes, voor het afremmen van fietsers", - "de": "Fahrradhindernis, das Radfahrer abbremst" - }, - "preciseInput": { - "preferredBackground": [ - "photo" - ], - "snapToLayer": "cycleways_and_roads", - "maxSnapDistance": 25 - } - } - ], - "tagRenderings": [ - { - "question": { - "en": "Can a bicycle go past this barrier?", - "nl": "Kan een fietser langs deze barrière?", - "de": "Kann ein Radfahrer das Hindernis passieren?" - }, - "mappings": [ - { - "if": "bicycle=yes", - "then": { - "en": "A cyclist can go past this.", - "nl": "Een fietser kan hier langs.", - "de": "Ein Radfahrer kann hindurchfahren." - } - }, - { - "if": "bicycle=no", - "then": { - "en": "A cyclist can not go past this.", - "nl": "Een fietser kan hier niet langs.", - "de": "Ein Radfahrer kann nicht hindurchfahren." - } - } - ], - "id": "bicycle=yes/no" - }, - { - "question": { - "en": "What kind of bollard is this?", - "nl": "Wat voor soort paal is dit?", - "de": "Um was für einen Poller handelt es sich?" - }, - "condition": "barrier=bollard", - "mappings": [ - { - "if": "bollard=removable", - "then": { - "en": "Removable bollard", - "nl": "Verwijderbare paal", - "de": "Entfernbarer Poller" - } - }, - { - "if": "bollard=fixed", - "then": { - "en": "Fixed bollard", - "nl": "Vaste paal", - "de": "Feststehender Poller" - } - }, - { - "if": "bollard=foldable", - "then": { - "en": "Bollard that can be folded down", - "nl": "Paal die platgevouwen kan worden", - "de": "Umlegbarer Poller" - } - }, - { - "if": "bollard=flexible", - "then": { - "en": "Flexible bollard, usually plastic", - "nl": "Flexibele paal, meestal plastic", - "de": "Flexibler Poller, meist aus Kunststoff" - } - }, - { - "if": "bollard=rising", - "then": { - "en": "Rising bollard", - "nl": "Verzonken poller", - "de": "Ausfahrender Poller" - } - } - ], - "id": "Bollard type" - }, - { - "question": { - "en": "What kind of cycling barrier is this?", - "nl": "Wat voor fietshekjes zijn dit?", - "de": "Um welche Art Fahrradhindernis handelt es sich?" - }, - "condition": "barrier=cycle_barrier", - "mappings": [ - { - "if": "cycle_barrier:type=single", - "then": { - "en": "Single, just two barriers with a space inbetween ", - "nl": "Enkelvoudig, slechts twee hekjes met ruimte ertussen ", - "de": "Einfach, nur zwei Barrieren mit einem Zwischenraum " - } - }, - { - "if": "cycle_barrier:type=double", - "then": { - "en": "Double, two barriers behind each other ", - "nl": "Dubbel, twee hekjes achter elkaar ", - "de": "Doppelt, zwei Barrieren hintereinander " - } - }, - { - "if": "cycle_barrier:type=triple", - "then": { - "en": "Triple, three barriers behind each other ", - "nl": "Drievoudig, drie hekjes achter elkaar ", - "de": "Dreifach, drei Barrieren hintereinander " - } - }, - { - "if": "cycle_barrier:type=squeeze", - "then": { - "en": "Squeeze gate, gap is smaller at top, than at the bottom ", - "nl": "Knijppoort, ruimte is smaller aan de top, dan aan de bodem ", - "de": "Eine Durchfahrtsbeschränkung, Durchfahrtsbreite ist oben kleiner als unten " - } - } - ], - "id": "Cycle barrier type" - }, - { - "render": { - "en": "Maximum width: {maxwidth:physical} m", - "nl": "Maximumbreedte: {maxwidth:physical} m", - "de": "Maximale Durchfahrtsbreite: {maxwidth:physical} m" - }, - "question": { - "en": "How wide is the gap left over besides the barrier?", - "nl": "Hoe breed is de ruimte naast de barrière?", - "de": "Welche Durchfahrtsbreite hat das Hindernis?" - }, - "condition": { - "and": [ - "cycle_barrier:type!=double", - "cycle_barrier:type!=triple" - ] - }, - "freeform": { - "key": "maxwidth:physical", - "type": "length", - "helperArgs": [ - "20", - "map" - ] - }, - "id": "MaxWidth" - }, - { - "render": { - "en": "Space between barriers (along the length of the road): {width:separation} m", - "nl": "Ruimte tussen barrières (langs de lengte van de weg): {width:separation} m", - "de": "Abstand zwischen den Barrieren (entlang der Straße): {width:separation} m" - }, - "question": { - "en": "How much space is there between the barriers (along the length of the road)?", - "nl": "Hoeveel ruimte is er tussen de barrières (langs de lengte van de weg)?", - "de": "Wie groß ist der Abstand zwischen den Barrieren (entlang der Straße)?" - }, - "condition": { - "or": [ - "cycle_barrier:type=double", - "cycle_barrier:type=triple" - ] - }, - "freeform": { - "key": "width:separation", - "type": "length", - "helperArgs": [ - "21", - "map" - ] - }, - "id": "Space between barrier (cyclebarrier)" - }, - { - "render": { - "en": "Width of opening: {width:opening} m", - "nl": "Breedte van de opening: {width:opening} m", - "de": "Breite der Öffnung: {width:opening} m" - }, - "question": { - "en": "How wide is the smallest opening next to the barriers?", - "nl": "Hoe breed is de smalste opening naast de barrières?", - "de": "Wie breit ist die kleinste Öffnung neben den Barrieren?" - }, - "condition": { - "or": [ - "cycle_barrier:type=double", - "cycle_barrier:type=triple" - ] - }, - "freeform": { - "key": "width:opening", - "type": "length", - "helperArgs": [ - "21", - "map" - ] - }, - "id": "Width of opening (cyclebarrier)" - }, - { - "render": { - "en": "Overlap: {overlap} m", - "de": "Überschneidung: {overlap} m" - }, - "question": { - "en": "How much overlap do the barriers have?", - "nl": "Hoeveel overlappen de barrières?", - "de": "Wie stark überschneiden sich die Barrieren?" - }, - "condition": { - "or": [ - "cycle_barrier:type=double", - "cycle_barrier:type=triple" - ] - }, - "freeform": { - "key": "overlap", - "type": "length", - "helperArgs": [ - "21", - "map" - ] - }, - "id": "Overlap (cyclebarrier)" + }, + { + "if": "barrier=cycle_barrier", + "then": { + "en": "Cycling Barrier", + "nl": "Fietshekjes", + "de": "Barriere für Radfahrer" } + } ] + }, + "presets": [ + { + "title": { + "en": "Bollard", + "nl": "Paaltje", + "de": "Poller", + "ru": "Прикол" + }, + "tags": [ + "barrier=bollard" + ], + "description": { + "en": "A bollard in the road", + "nl": "Een paaltje in de weg", + "de": "Ein Poller auf der Straße" + }, + "preciseInput": { + "preferredBackground": [ + "photo" + ], + "snapToLayer": "cycleways_and_roads", + "maxSnapDistance": 25 + } + }, + { + "title": { + "en": "Cycle barrier", + "nl": "Fietshekjes", + "de": "Fahrradhindernis" + }, + "tags": [ + "barrier=bollard" + ], + "description": { + "en": "Cycle barrier, slowing down cyclists", + "nl": "Fietshekjes, voor het afremmen van fietsers", + "de": "Fahrradhindernis, das Radfahrer abbremst" + }, + "preciseInput": { + "preferredBackground": [ + "photo" + ], + "snapToLayer": "cycleways_and_roads", + "maxSnapDistance": 25 + } + } + ], + "tagRenderings": [ + { + "question": { + "en": "Can a bicycle go past this barrier?", + "nl": "Kan een fietser langs deze barrière?", + "de": "Kann ein Radfahrer das Hindernis passieren?" + }, + "mappings": [ + { + "if": "bicycle=yes", + "then": { + "en": "A cyclist can go past this.", + "nl": "Een fietser kan hier langs.", + "de": "Ein Radfahrer kann hindurchfahren." + } + }, + { + "if": "bicycle=no", + "then": { + "en": "A cyclist can not go past this.", + "nl": "Een fietser kan hier niet langs.", + "de": "Ein Radfahrer kann nicht hindurchfahren." + } + } + ], + "id": "bicycle=yes/no" + }, + { + "question": { + "en": "What kind of bollard is this?", + "nl": "Wat voor soort paal is dit?", + "de": "Um was für einen Poller handelt es sich?" + }, + "condition": "barrier=bollard", + "mappings": [ + { + "if": "bollard=removable", + "then": { + "en": "Removable bollard", + "nl": "Verwijderbare paal", + "de": "Entfernbarer Poller" + } + }, + { + "if": "bollard=fixed", + "then": { + "en": "Fixed bollard", + "nl": "Vaste paal", + "de": "Feststehender Poller" + } + }, + { + "if": "bollard=foldable", + "then": { + "en": "Bollard that can be folded down", + "nl": "Paal die platgevouwen kan worden", + "de": "Umlegbarer Poller" + } + }, + { + "if": "bollard=flexible", + "then": { + "en": "Flexible bollard, usually plastic", + "nl": "Flexibele paal, meestal plastic", + "de": "Flexibler Poller, meist aus Kunststoff" + } + }, + { + "if": "bollard=rising", + "then": { + "en": "Rising bollard", + "nl": "Verzonken poller", + "de": "Ausfahrender Poller" + } + } + ], + "id": "Bollard type" + }, + { + "question": { + "en": "What kind of cycling barrier is this?", + "nl": "Wat voor fietshekjes zijn dit?", + "de": "Um welche Art Fahrradhindernis handelt es sich?" + }, + "condition": "barrier=cycle_barrier", + "mappings": [ + { + "if": "cycle_barrier:type=single", + "then": { + "en": "Single, just two barriers with a space inbetween ", + "nl": "Enkelvoudig, slechts twee hekjes met ruimte ertussen ", + "de": "Einfach, nur zwei Barrieren mit einem Zwischenraum " + } + }, + { + "if": "cycle_barrier:type=double", + "then": { + "en": "Double, two barriers behind each other ", + "nl": "Dubbel, twee hekjes achter elkaar ", + "de": "Doppelt, zwei Barrieren hintereinander " + } + }, + { + "if": "cycle_barrier:type=triple", + "then": { + "en": "Triple, three barriers behind each other ", + "nl": "Drievoudig, drie hekjes achter elkaar ", + "de": "Dreifach, drei Barrieren hintereinander " + } + }, + { + "if": "cycle_barrier:type=squeeze", + "then": { + "en": "Squeeze gate, gap is smaller at top, than at the bottom ", + "nl": "Knijppoort, ruimte is smaller aan de top, dan aan de bodem ", + "de": "Eine Durchfahrtsbeschränkung, Durchfahrtsbreite ist oben kleiner als unten " + } + } + ], + "id": "Cycle barrier type" + }, + { + "render": { + "en": "Maximum width: {maxwidth:physical} m", + "nl": "Maximumbreedte: {maxwidth:physical} m", + "de": "Maximale Durchfahrtsbreite: {maxwidth:physical} m" + }, + "question": { + "en": "How wide is the gap left over besides the barrier?", + "nl": "Hoe breed is de ruimte naast de barrière?", + "de": "Welche Durchfahrtsbreite hat das Hindernis?" + }, + "condition": { + "and": [ + "cycle_barrier:type!=double", + "cycle_barrier:type!=triple" + ] + }, + "freeform": { + "key": "maxwidth:physical", + "type": "length", + "helperArgs": [ + "20", + "map" + ] + }, + "id": "MaxWidth" + }, + { + "render": { + "en": "Space between barriers (along the length of the road): {width:separation} m", + "nl": "Ruimte tussen barrières (langs de lengte van de weg): {width:separation} m", + "de": "Abstand zwischen den Barrieren (entlang der Straße): {width:separation} m" + }, + "question": { + "en": "How much space is there between the barriers (along the length of the road)?", + "nl": "Hoeveel ruimte is er tussen de barrières (langs de lengte van de weg)?", + "de": "Wie groß ist der Abstand zwischen den Barrieren (entlang der Straße)?" + }, + "condition": { + "or": [ + "cycle_barrier:type=double", + "cycle_barrier:type=triple" + ] + }, + "freeform": { + "key": "width:separation", + "type": "length", + "helperArgs": [ + "21", + "map" + ] + }, + "id": "Space between barrier (cyclebarrier)" + }, + { + "render": { + "en": "Width of opening: {width:opening} m", + "nl": "Breedte van de opening: {width:opening} m", + "de": "Breite der Öffnung: {width:opening} m" + }, + "question": { + "en": "How wide is the smallest opening next to the barriers?", + "nl": "Hoe breed is de smalste opening naast de barrières?", + "de": "Wie breit ist die kleinste Öffnung neben den Barrieren?" + }, + "condition": { + "or": [ + "cycle_barrier:type=double", + "cycle_barrier:type=triple" + ] + }, + "freeform": { + "key": "width:opening", + "type": "length", + "helperArgs": [ + "21", + "map" + ] + }, + "id": "Width of opening (cyclebarrier)" + }, + { + "render": { + "en": "Overlap: {overlap} m", + "de": "Überschneidung: {overlap} m" + }, + "question": { + "en": "How much overlap do the barriers have?", + "nl": "Hoeveel overlappen de barrières?", + "de": "Wie stark überschneiden sich die Barrieren?" + }, + "condition": { + "or": [ + "cycle_barrier:type=double", + "cycle_barrier:type=triple" + ] + }, + "freeform": { + "key": "overlap", + "type": "length", + "helperArgs": [ + "21", + "map" + ] + }, + "id": "Overlap (cyclebarrier)" + } + ], + "mapRendering": [ + { + "icon": "./assets/layers/barrier/barrier.svg", + "location": [ + "point" + ] + }, + { + "width": "5" + } + ] } \ No newline at end of file diff --git a/assets/layers/bench/bench.json b/assets/layers/bench/bench.json index b1d36cbcc0..833ba00d99 100644 --- a/assets/layers/bench/bench.json +++ b/assets/layers/bench/bench.json @@ -1,664 +1,647 @@ { - "id": "bench", - "name": { - "en": "Benches", - "de": "Sitzbänke", - "fr": "Bancs", - "nl": "Zitbanken", - "es": "Bancos", - "hu": "Padok", - "id": "Bangku", - "it": "Panchine", - "ru": "Скамейки", - "zh_Hans": "长椅", - "zh_Hant": "長椅", - "nb_NO": "Benker", - "fi": "Penkit", - "pl": "Ławki", - "pt_BR": "Bancos", - "pt": "Bancos" - }, - "minzoom": 17, - "source": { - "osmTags": "amenity=bench" - }, - "wayHandling": 1, - "title": { - "render": { - "en": "Bench", - "de": "Sitzbank", - "fr": "Banc", - "nl": "Zitbank", - "es": "Banco", - "hu": "Pad", - "id": "Bangku", - "it": "Panchina", - "ru": "Скамейка", - "zh_Hans": "长椅", - "zh_Hant": "長椅", - "nb_NO": "Benk", - "fi": "Penkki", - "pl": "Ławka", - "pt_BR": "Banco", - "pt": "Banco" - } - }, - "tagRenderings": [ - "images", - { - "render": { - "en": "Backrest", - "de": "Rückenlehne", - "fr": "Dossier", - "nl": "Rugleuning", - "es": "Respaldo", - "hu": "Háttámla", - "id": "Sandaran", - "it": "Schienale", - "ru": "Спинка", - "zh_Hans": "靠背", - "zh_Hant": "靠背", - "nb_NO": "Rygglene", - "fi": "Selkänoja", - "pl": "Oparcie", - "pt_BR": "Encosto", - "pt": "Encosto" - }, - "freeform": { - "key": "backrest" - }, - "mappings": [ - { - "if": "backrest=yes", - "then": { - "en": "Backrest: Yes", - "de": "Rückenlehne: Ja", - "fr": "Dossier : Oui", - "nl": "Heeft een rugleuning", - "es": "Respaldo: Si", - "hu": "Háttámla: Igen", - "id": "Sandaran: Ya", - "it": "Schienale: Sì", - "ru": "Со спинкой", - "zh_Hans": "靠背:有", - "zh_Hant": "靠背:有", - "nb_NO": "Rygglene: Ja", - "fi": "Selkänoja: kyllä", - "pl": "Oparcie: Tak", - "pt_BR": "Encosto: Sim", - "pt": "Encosto: Sim" - } - }, - { - "if": "backrest=no", - "then": { - "en": "Backrest: No", - "de": "Rückenlehne: Nein", - "fr": "Dossier : Non", - "nl": "Rugleuning ontbreekt", - "es": "Respaldo: No", - "hu": "Háttámla: Nem", - "id": "Sandaran: Tidak", - "it": "Schienale: No", - "ru": "Без спинки", - "zh_Hans": "靠背:无", - "zh_Hant": "靠背:無", - "nb_NO": "Rygglene: Nei", - "fi": "Selkänoja: ei", - "pl": "Oparcie: Nie", - "pt_BR": "Encosto: Não", - "pt": "Encosto: Não" - } - } - ], - "question": { - "en": "Does this bench have a backrest?", - "de": "Hat diese Bank eine Rückenlehne?", - "fr": "Ce banc dispose-t-il d'un dossier ?", - "nl": "Heeft deze zitbank een rugleuning?", - "es": "¿Este banco tiene un respaldo?", - "hu": "Van háttámlája ennek a padnak?", - "id": "Apakah bangku ini memiliki sandaran?", - "it": "Questa panchina ha lo schienale?", - "ru": "Есть ли у этой скамейки спинка?", - "zh_Hans": "这个长椅有靠背吗?", - "zh_Hant": "這個長椅是否有靠背?", - "nb_NO": "Har denne beken et rygglene?", - "pl": "Czy ta ławka ma oparcie?", - "pt_BR": "Este assento tem um escosto?", - "pt": "Este assento tem um escosto?" - }, - "id": "bench-backrest" - }, - { - "render": { - "en": "{seats} seats", - "de": "{seats} Sitzplätze", - "fr": "{seats} places", - "nl": "{seats} zitplaatsen", - "es": "{seats} asientos", - "hu": "{seats} ülőhely", - "id": "{seats} kursi", - "it": "{seats} posti", - "ru": "{seats} мест", - "zh_Hant": "{seats} 座位數", - "nb_NO": "{seats} seter", - "pl": "{seats} siedzeń", - "pt_BR": "{seats} assentos", - "pt": "{seats} assentos" - }, - "freeform": { - "key": "seats", - "type": "nat" - }, - "question": { - "en": "How many seats does this bench have?", - "de": "Wie viele Sitzplätze hat diese Bank?", - "fr": "De combien de places dispose ce banc ?", - "nl": "Hoeveel zitplaatsen heeft deze bank?", - "es": "¿Cuántos asientos tiene este banco?", - "hu": "Hány ülőhely van ezen a padon?", - "it": "Quanti posti ha questa panchina?", - "ru": "Сколько мест на этой скамейке?", - "zh_Hans": "这个长椅有几个座位?", - "zh_Hant": "這個長椅有幾個位子?", - "nb_NO": "Hvor mange sitteplasser har denne benken?", - "pl": "Ile siedzeń ma ta ławka?", - "pt_BR": "Quantos assentos este banco tem?", - "pt": "Quantos assentos este banco tem?" - }, - "id": "bench-seats" - }, - { - "render": { - "en": "Material: {material}", - "de": "Material: {material}", - "fr": "Matériau : {material}", - "nl": "Gemaakt van {material}", - "es": "Material: {material}", - "hu": "Anyag: {material}", - "it": "Materiale: {material}", - "ru": "Материал: {material}", - "zh_Hanå¨s": "材质: {material}", - "zh_Hant": "材質:{material}", - "nb_NO": "Materiale: {material}", - "fi": "Materiaali: {material}", - "zh_Hans": "材质: {material}", - "pl": "Materiał: {material}", - "pt_BR": "Material: {material}", - "pt": "Material: {material}", - "eo": "Materialo: {material}" - }, - "freeform": { - "key": "material", - "addExtraTags": [] - }, - "mappings": [ - { - "if": "material=wood", - "then": { - "en": "Material: wood", - "de": "Material: Holz", - "fr": "Matériau : bois", - "nl": "Gemaakt uit hout", - "es": "Material: madera", - "hu": "Anyag: fa", - "it": "Materiale: legno", - "ru": "Материал: дерево", - "zh_Hans": "材质:木", - "nb_NO": "Materiale: tre", - "zh_Hant": "材質:木頭", - "pt_BR": "Material: madeira", - "fi": "Materiaali: puu", - "pl": "Materiał: drewno", - "pt": "Material: madeira", - "eo": "Materialo: ligna" - } - }, - { - "if": "material=metal", - "then": { - "en": "Material: metal", - "de": "Material: Metall", - "fr": "Matériau : métal", - "nl": "Gemaakt uit metaal", - "es": "Material: metal", - "hu": "Anyag: fém", - "it": "Materiale: metallo", - "ru": "Материал: металл", - "zh_Hans": "材质:金属", - "nb_NO": "Materiale: metall", - "zh_Hant": "材質:金屬", - "pl": "Materiał: metal", - "pt_BR": "Material: metal", - "pt": "Material: metal", - "eo": "Materialo: metala" - } - }, - { - "if": "material=stone", - "then": { - "en": "Material: stone", - "de": "Material: Stein", - "fr": "Matériau : pierre", - "nl": "Gemaakt uit steen", - "es": "Material: piedra", - "hu": "Anyag: kő", - "it": "Materiale: pietra", - "ru": "Материал: камень", - "zh_Hans": "材质:石头", - "nb_NO": "Materiale: stein", - "zh_Hant": "材質:石頭", - "pt_BR": "Material: pedra", - "fi": "Materiaali: kivi", - "pl": "Materiał: kamień", - "pt": "Material: pedra", - "eo": "Materialo: ŝtona" - } - }, - { - "if": "material=concrete", - "then": { - "en": "Material: concrete", - "de": "Material: Beton", - "fr": "Matériau : béton", - "nl": "Gemaakt uit beton", - "es": "Material: concreto", - "hu": "Anyag: beton", - "it": "Materiale: cemento", - "ru": "Материал: бетон", - "zh_Hans": "材质:混凝土", - "nb_NO": "Materiale: betong", - "zh_Hant": "材質:水泥", - "pt_BR": "Material: concreto", - "fi": "Materiaali: betoni", - "pl": "Materiał: beton", - "pt": "Material: concreto", - "eo": "Materialo: betona" - } - }, - { - "if": "material=plastic", - "then": { - "en": "Material: plastic", - "de": "Material: Kunststoff", - "fr": "Matériau : plastique", - "nl": "Gemaakt uit plastiek", - "es": "Material: plastico", - "hu": "Anyag: műanyag", - "it": "Materiale: plastica", - "ru": "Материал: пластик", - "zh_Hans": "材质:塑料", - "nb_NO": "Materiale: plastikk", - "zh_Hant": "材質:塑膠", - "pt_BR": "Material: plástico", - "fi": "Materiaali: muovi", - "pl": "Materiał: plastik", - "pt": "Material: plástico", - "eo": "Materialo: plasta" - } - }, - { - "if": "material=steel", - "then": { - "en": "Material: steel", - "de": "Material: Stahl", - "fr": "Matériau : acier", - "nl": "Gemaakt uit staal", - "es": "Material: acero", - "hu": "Anyag: acél", - "it": "Materiale: acciaio", - "ru": "Материал: сталь", - "zh_Hans": "材质:不锈钢", - "nb_NO": "Materiale: stål", - "zh_Hant": "材質:鋼鐵", - "pt_BR": "Material: aço", - "fi": "Materiaali: teräs", - "pl": "Materiał: stal", - "pt": "Material: aço", - "eo": "Materialo: ŝtala" - } - } - ], - "question": { - "en": "What is the bench (seating) made from?", - "de": "Aus welchem Material besteht die Sitzbank (Sitzfläche)?", - "fr": "De quel matériau ce banc est-il fait ?", - "nl": "Uit welk materiaal is het zitgedeelte van deze zitbank gemaakt?", - "hu": "Miből van a pad (ülő része)?", - "it": "Di che materiale è fatta questa panchina?", - "zh_Hans": "这个长椅(或座椅)是用什么材料做的?", - "ru": "Из какого материала сделана скамейка?", - "zh_Hant": "這個長椅 (座位) 是什麼做的?", - "pt_BR": "De que é feito o banco (assento)?", - "pl": "Z czego wykonana jest ławka (siedzisko)?", - "pt": "De que é feito o banco (assento)?" - }, - "id": "bench-material" - }, - { - "question": { - "en": "In which direction are you looking when sitting on the bench?", - "de": "In welche Richtung schaut man, wenn man auf der Bank sitzt?", - "nl": "In welke richting kijk je wanneer je op deze zitbank zit?", - "fr": "Dans quelle direction regardez-vous quand vous êtes assis sur le banc ?", - "hu": "Milyen irányba néz a pad?", - "it": "In che direzione si guarda quando si è seduti su questa panchina?", - "ru": "В каком направлении вы смотрите, когда сидите на скамейке?", - "zh_Hans": "坐在长椅上的时候你目视的方向是哪边?", - "zh_Hant": "坐在長椅時是面對那個方向?", - "pt_BR": "Em que direção você olha quando está sentado no banco?", - "pl": "W jakim kierunku patrzysz siedząc na ławce?", - "pt": "Em que direção olha quando está sentado no banco?" - }, - "render": { - "en": "When sitting on the bench, one looks towards {direction}°.", - "de": "Wenn man auf der Bank sitzt, schaut man in Richtung {direction}°.", - "nl": "Wanneer je op deze bank zit, dan kijk je in {direction}°.", - "fr": "Assis sur le banc, on regarde vers {direction}°.", - "hu": "A pad {direction}° felé néz.", - "it": "Quando si è seduti su questa panchina, si guarda verso {direction}°.", - "zh_Hans": "坐在长椅上的时候目视方向为 {direction}°方位。", - "ru": "Сидя на скамейке, вы смотрите в сторону {direction}°.", - "zh_Hant": "當坐在長椅時,那個人朝向 {direction}°。", - "pl": "Siedząc na ławce, patrzy się w kierunku {direction}°.", - "pt_BR": "Ao sentar-se no banco, olha-se para {direction} °.", - "pt": "Ao sentar-se no banco, olha-se para {direction} °." - }, - "freeform": { - "key": "direction", - "type": "direction" - }, - "id": "bench-direction" - }, - { - "render": { - "en": "Colour: {colour}", - "de": "Farbe: {colour}", - "fr": "Couleur : {colour}", - "nl": "Kleur: {colour}", - "hu": "Szín: {colour}", - "it": "Colore: {colour}", - "ru": "Цвет: {colour}", - "id": "Warna: {colour}", - "zh_Hans": "颜色: {colour}", - "zh_Hant": "顏色:{colour}", - "nb_NO": "Farge: {colour}", - "pt_BR": "Cor: {colour}", - "fi": "Väri: {colour}", - "pl": "Kolor: {colour}", - "pt": "Cor: {colour}", - "eo": "Koloro: {colour}" - }, - "question": { - "en": "Which colour does this bench have?", - "de": "Welche Farbe hat diese Sitzbank?", - "fr": "Quelle est la couleur de ce banc ?", - "nl": "Welke kleur heeft deze zitbank?", - "hu": "Milyen színű a pad?", - "it": "Di che colore è questa panchina?", - "ru": "Какого цвета скамейка?", - "zh_Hans": "这个长椅是什么颜色的?", - "zh_Hant": "這個長椅是什麼顏色的?", - "pt_BR": "Qual a cor dessa bancada?", - "pl": "Jaki kolor ma ta ławka?", - "pt": "Qual a cor dessa bancada?" - }, - "freeform": { - "key": "colour", - "type": "color" - }, - "mappings": [ - { - "if": "colour=brown", - "then": { - "en": "Colour: brown", - "de": "Farbe: braun", - "fr": "Couleur : marron", - "nl": "De kleur is bruin", - "hu": "Szín: barna", - "it": "Colore: marrone", - "ru": "Цвет: коричневый", - "zh_Hans": "颜色:棕", - "zh_Hant": "顏色:棕色", - "nb_NO": "Farge: brun", - "pt_BR": "Cor: marrom", - "fi": "Väri: ruskea", - "pl": "Kolor: brązowy", - "pt": "Cor: castanho", - "eo": "Koloro: bruna" - } - }, - { - "if": "colour=green", - "then": { - "en": "Colour: green", - "de": "Farbe: grün", - "fr": "Couleur : verte", - "nl": "De kleur is groen", - "hu": "Szín: zöld", - "it": "Colore: verde", - "ru": "Цвет: зеленый", - "zh_Hans": "颜色:绿", - "zh_Hant": "顏色:綠色", - "nb_NO": "Farge: grønn", - "pt_BR": "Cor: verde", - "fi": "Väri: vihreä", - "pl": "Kolor: zielony", - "pt": "Cor: verde", - "eo": "Koloro: verda" - } - }, - { - "if": "colour=gray", - "then": { - "en": "Colour: gray", - "de": "Farbe: grau", - "fr": "Couleur : gris", - "nl": "De kleur is grijs", - "hu": "Szín: szürke", - "it": "Colore: grigio", - "ru": "Цвет: серый", - "zh_Hans": "颜色:灰", - "zh_Hant": "顏色:灰色", - "nb_NO": "Farge: grå", - "pt_BR": "Cor: cinza", - "fi": "Väri: harmaa", - "pl": "Kolor: szary", - "pt": "Cor: cinzento", - "eo": "Koloro: griza" - } - }, - { - "if": "colour=white", - "then": { - "en": "Colour: white", - "de": "Farbe: weiß", - "fr": "Couleur : blanc", - "nl": "De kleur is wit", - "hu": "Szín: fehér", - "it": "Colore: bianco", - "ru": "Цвет: белый", - "zh_Hans": "颜色:白", - "zh_Hant": "顏色:白色", - "nb_NO": "Farge: hvit", - "pt_BR": "Cor: branco", - "fi": "Väri: valkoinen", - "pl": "Kolor: biały", - "pt": "Cor: branco", - "eo": "Koloro: blanka" - } - }, - { - "if": "colour=red", - "then": { - "en": "Colour: red", - "de": "Farbe: rot", - "fr": "Couleur : rouge", - "nl": "De kleur is rood", - "hu": "Szín: piros", - "it": "Colore: rosso", - "ru": "Цвет: красный", - "zh_Hans": "颜色:红", - "zh_Hant": "顏色:紅色", - "nb_NO": "Farge: rød", - "pt_BR": "Cor: vermelho", - "fi": "Väri: punainen", - "pl": "Kolor: czerwony", - "pt": "Cor: vermelho", - "eo": "Koloro: ruĝa" - } - }, - { - "if": "colour=black", - "then": { - "en": "Colour: black", - "de": "Farbe: schwarz", - "fr": "Couleur : noire", - "nl": "De kleur is zwart", - "hu": "Szín: fekete", - "it": "Colore: nero", - "ru": "Цвет: чёрный", - "zh_Hans": "颜色:黑", - "zh_Hant": "顏色:黑色", - "nb_NO": "Farge: svart", - "pt_BR": "Cor: preto", - "fi": "Väri: musta", - "pl": "Kolor: czarny", - "pt": "Cor: preto", - "eo": "Koloro: nigra" - } - }, - { - "if": "colour=blue", - "then": { - "en": "Colour: blue", - "de": "Farbe: blau", - "fr": "Couleur : bleu", - "nl": "De kleur is blauw", - "hu": "Szín: kék", - "it": "Colore: blu", - "ru": "Цвет: синий", - "zh_Hans": "颜色:蓝", - "zh_Hant": "顏色:藍色", - "nb_NO": "Farge: blå", - "pt_BR": "Cor: azul", - "fi": "Väri: sininen", - "pl": "Kolor: niebieski", - "pt": "Cor: azul", - "eo": "Koloro: blua" - } - }, - { - "if": "colour=yellow", - "then": { - "en": "Colour: yellow", - "de": "Farbe: gelb", - "fr": "Couleur : jaune", - "nl": "De kleur is geel", - "hu": "Szín: sárga", - "it": "Colore: giallo", - "ru": "Цвет: желтый", - "zh_Hans": "颜色:黄", - "zh_Hant": "顏色:黃色", - "nb_NO": "Farge: gul", - "pt_BR": "Cor: amarelo", - "fi": "Väri: keltainen", - "pl": "Kolor: żółty", - "pt": "Cor: amarelo", - "eo": "Koloro: flava" - } - } - ], - "id": "bench-colour" - }, - { - "question": { - "en": "When was this bench last surveyed?", - "nl": "Wanneer is deze laatste bank laatst gesurveyed?", - "fr": "Quand ce banc a-t-il été contrôlé pour la dernière fois ?", - "it": "Quando è stata verificata l’ultima volta questa panchina?", - "zh_Hans": "上次对这个长椅实地调查是什么时候?", - "de": "Wann wurde diese Bank zuletzt überprüft?", - "ru": "Когда последний раз обследовали эту скамейку?", - "zh_Hant": "上一次探察長椅是什麼時候?", - "pt_BR": "Quando esta bancada foi pesquisada pela última vez?", - "pl": "Kiedy ostatnio badano tę ławkę?", - "pt": "Quando esta bancada foi pesquisada pela última vez?" - }, - "render": { - "en": "This bench was last surveyed on {survey:date}", - "nl": "Deze bank is laatst gesurveyd op {survey:date}", - "fr": "Ce banc a été contrôlé pour la dernière fois le {survey:date}", - "it": "Questa panchina è stata controllata l’ultima volta in data {survey:date}", - "zh_Hans": "这个长椅于 {survey:date}最后一次实地调查", - "de": "Diese Bank wurde zuletzt überprüft am {survey:date}", - "ru": "Последний раз обследование этой скамейки проводилось {survey:date}", - "zh_Hant": "這個長椅最後是在 {survey:date} 探查的", - "pt_BR": "Esta bancada foi pesquisada pela última vez em {survey:date}", - "pl": "Ławka ta była ostatnio badana w dniu {survey:date}", - "pt": "Esta bancada foi pesquisada pela última vez em {survey:date}" - }, - "freeform": { - "key": "survey:date", - "type": "date" - }, - "mappings": [ - { - "if": "survey:date:={_now:date}", - "then": "Surveyed today!" - } - ], - "id": "bench-survey:date" - } - ], - "icon": { - "render": "circle:#FE6F32;./assets/layers/bench/bench.svg" - }, - "iconSize": { - "render": "35,35,center" - }, - "color": { - "render": "#00f" - }, - "presets": [ - { - "tags": [ - "amenity=bench" - ], - "title": { - "en": "bench", - "de": "sitzbank", - "fr": "banc", - "nl": "zitbank", - "es": "banco", - "it": "panchina", - "ru": "cкамейка", - "id": "bangku", - "zh_Hans": "长椅", - "nb_NO": "benk", - "zh_Hant": "長椅", - "pt_BR": "banco", - "fi": "penkki", - "pl": "Ławka", - "pt": "banco" - }, - "presiceInput": { - "preferredBackground": "photo" - } - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity=bench", - "amenity=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + "id": "bench", + "name": { + "en": "Benches", + "de": "Sitzbänke", + "fr": "Bancs", + "nl": "Zitbanken", + "es": "Bancos", + "hu": "Padok", + "id": "Bangku", + "it": "Panchine", + "ru": "Скамейки", + "zh_Hans": "长椅", + "zh_Hant": "長椅", + "nb_NO": "Benker", + "fi": "Penkit", + "pl": "Ławki", + "pt_BR": "Bancos", + "pt": "Bancos" + }, + "minzoom": 17, + "source": { + "osmTags": "amenity=bench" + }, + "title": { + "render": { + "en": "Bench", + "de": "Sitzbank", + "fr": "Banc", + "nl": "Zitbank", + "es": "Banco", + "hu": "Pad", + "id": "Bangku", + "it": "Panchina", + "ru": "Скамейка", + "zh_Hans": "长椅", + "zh_Hant": "長椅", + "nb_NO": "Benk", + "fi": "Penkki", + "pl": "Ławka", + "pt_BR": "Banco", + "pt": "Banco" } + }, + "tagRenderings": [ + "images", + { + "mappings": [ + { + "if": "backrest=yes", + "then": { + "en": "Backrest: Yes", + "de": "Rückenlehne: Ja", + "fr": "Dossier : Oui", + "nl": "Heeft een rugleuning", + "es": "Respaldo: Si", + "hu": "Háttámla: Igen", + "id": "Sandaran: Ya", + "it": "Schienale: Sì", + "ru": "Со спинкой", + "zh_Hans": "靠背:有", + "zh_Hant": "靠背:有", + "nb_NO": "Rygglene: Ja", + "fi": "Selkänoja: kyllä", + "pl": "Oparcie: Tak", + "pt_BR": "Encosto: Sim", + "pt": "Encosto: Sim" + } + }, + { + "if": "backrest=no", + "then": { + "en": "Backrest: No", + "de": "Rückenlehne: Nein", + "fr": "Dossier : Non", + "nl": "Rugleuning ontbreekt", + "es": "Respaldo: No", + "hu": "Háttámla: Nem", + "id": "Sandaran: Tidak", + "it": "Schienale: No", + "ru": "Без спинки", + "zh_Hans": "靠背:无", + "zh_Hant": "靠背:無", + "nb_NO": "Rygglene: Nei", + "fi": "Selkänoja: ei", + "pl": "Oparcie: Nie", + "pt_BR": "Encosto: Não", + "pt": "Encosto: Não" + } + } + ], + "question": { + "en": "Does this bench have a backrest?", + "de": "Hat diese Bank eine Rückenlehne?", + "fr": "Ce banc dispose-t-il d'un dossier ?", + "nl": "Heeft deze zitbank een rugleuning?", + "es": "¿Este banco tiene un respaldo?", + "hu": "Van háttámlája ennek a padnak?", + "id": "Apakah bangku ini memiliki sandaran?", + "it": "Questa panchina ha lo schienale?", + "ru": "Есть ли у этой скамейки спинка?", + "zh_Hans": "这个长椅有靠背吗?", + "zh_Hant": "這個長椅是否有靠背?", + "nb_NO": "Har denne beken et rygglene?", + "pl": "Czy ta ławka ma oparcie?", + "pt_BR": "Este assento tem um escosto?", + "pt": "Este assento tem um escosto?" + }, + "id": "bench-backrest" + }, + { + "render": { + "en": "{seats} seats", + "de": "{seats} Sitzplätze", + "fr": "{seats} places", + "nl": "{seats} zitplaatsen", + "es": "{seats} asientos", + "hu": "{seats} ülőhely", + "id": "{seats} kursi", + "it": "{seats} posti", + "ru": "{seats} мест", + "zh_Hant": "{seats} 座位數", + "nb_NO": "{seats} seter", + "pl": "{seats} siedzeń", + "pt_BR": "{seats} assentos", + "pt": "{seats} assentos" + }, + "freeform": { + "key": "seats", + "type": "nat" + }, + "question": { + "en": "How many seats does this bench have?", + "de": "Wie viele Sitzplätze hat diese Bank?", + "fr": "De combien de places dispose ce banc ?", + "nl": "Hoeveel zitplaatsen heeft deze bank?", + "es": "¿Cuántos asientos tiene este banco?", + "hu": "Hány ülőhely van ezen a padon?", + "it": "Quanti posti ha questa panchina?", + "ru": "Сколько мест на этой скамейке?", + "zh_Hans": "这个长椅有几个座位?", + "zh_Hant": "這個長椅有幾個位子?", + "nb_NO": "Hvor mange sitteplasser har denne benken?", + "pl": "Ile siedzeń ma ta ławka?", + "pt_BR": "Quantos assentos este banco tem?", + "pt": "Quantos assentos este banco tem?" + }, + "id": "bench-seats" + }, + { + "render": { + "en": "Material: {material}", + "de": "Material: {material}", + "fr": "Matériau : {material}", + "nl": "Gemaakt van {material}", + "es": "Material: {material}", + "hu": "Anyag: {material}", + "it": "Materiale: {material}", + "ru": "Материал: {material}", + "zh_Hanå¨s": "材质: {material}", + "zh_Hant": "材質:{material}", + "nb_NO": "Materiale: {material}", + "fi": "Materiaali: {material}", + "zh_Hans": "材质: {material}", + "pl": "Materiał: {material}", + "pt_BR": "Material: {material}", + "pt": "Material: {material}", + "eo": "Materialo: {material}" + }, + "freeform": { + "key": "material", + "addExtraTags": [] + }, + "mappings": [ + { + "if": "material=wood", + "then": { + "en": "Material: wood", + "de": "Material: Holz", + "fr": "Matériau : bois", + "nl": "Gemaakt uit hout", + "es": "Material: madera", + "hu": "Anyag: fa", + "it": "Materiale: legno", + "ru": "Материал: дерево", + "zh_Hans": "材质:木", + "nb_NO": "Materiale: tre", + "zh_Hant": "材質:木頭", + "pt_BR": "Material: madeira", + "fi": "Materiaali: puu", + "pl": "Materiał: drewno", + "pt": "Material: madeira", + "eo": "Materialo: ligna" + } + }, + { + "if": "material=metal", + "then": { + "en": "Material: metal", + "de": "Material: Metall", + "fr": "Matériau : métal", + "nl": "Gemaakt uit metaal", + "es": "Material: metal", + "hu": "Anyag: fém", + "it": "Materiale: metallo", + "ru": "Материал: металл", + "zh_Hans": "材质:金属", + "nb_NO": "Materiale: metall", + "zh_Hant": "材質:金屬", + "pl": "Materiał: metal", + "pt_BR": "Material: metal", + "pt": "Material: metal", + "eo": "Materialo: metala" + } + }, + { + "if": "material=stone", + "then": { + "en": "Material: stone", + "de": "Material: Stein", + "fr": "Matériau : pierre", + "nl": "Gemaakt uit steen", + "es": "Material: piedra", + "hu": "Anyag: kő", + "it": "Materiale: pietra", + "ru": "Материал: камень", + "zh_Hans": "材质:石头", + "nb_NO": "Materiale: stein", + "zh_Hant": "材質:石頭", + "pt_BR": "Material: pedra", + "fi": "Materiaali: kivi", + "pl": "Materiał: kamień", + "pt": "Material: pedra", + "eo": "Materialo: ŝtona" + } + }, + { + "if": "material=concrete", + "then": { + "en": "Material: concrete", + "de": "Material: Beton", + "fr": "Matériau : béton", + "nl": "Gemaakt uit beton", + "es": "Material: concreto", + "hu": "Anyag: beton", + "it": "Materiale: cemento", + "ru": "Материал: бетон", + "zh_Hans": "材质:混凝土", + "nb_NO": "Materiale: betong", + "zh_Hant": "材質:水泥", + "pt_BR": "Material: concreto", + "fi": "Materiaali: betoni", + "pl": "Materiał: beton", + "pt": "Material: concreto", + "eo": "Materialo: betona" + } + }, + { + "if": "material=plastic", + "then": { + "en": "Material: plastic", + "de": "Material: Kunststoff", + "fr": "Matériau : plastique", + "nl": "Gemaakt uit plastiek", + "es": "Material: plastico", + "hu": "Anyag: műanyag", + "it": "Materiale: plastica", + "ru": "Материал: пластик", + "zh_Hans": "材质:塑料", + "nb_NO": "Materiale: plastikk", + "zh_Hant": "材質:塑膠", + "pt_BR": "Material: plástico", + "fi": "Materiaali: muovi", + "pl": "Materiał: plastik", + "pt": "Material: plástico", + "eo": "Materialo: plasta" + } + }, + { + "if": "material=steel", + "then": { + "en": "Material: steel", + "de": "Material: Stahl", + "fr": "Matériau : acier", + "nl": "Gemaakt uit staal", + "es": "Material: acero", + "hu": "Anyag: acél", + "it": "Materiale: acciaio", + "ru": "Материал: сталь", + "zh_Hans": "材质:不锈钢", + "nb_NO": "Materiale: stål", + "zh_Hant": "材質:鋼鐵", + "pt_BR": "Material: aço", + "fi": "Materiaali: teräs", + "pl": "Materiał: stal", + "pt": "Material: aço", + "eo": "Materialo: ŝtala" + } + } + ], + "question": { + "en": "What is the bench (seating) made from?", + "de": "Aus welchem Material besteht die Sitzbank (Sitzfläche)?", + "fr": "De quel matériau ce banc est-il fait ?", + "nl": "Uit welk materiaal is het zitgedeelte van deze zitbank gemaakt?", + "hu": "Miből van a pad (ülő része)?", + "it": "Di che materiale è fatta questa panchina?", + "zh_Hans": "这个长椅(或座椅)是用什么材料做的?", + "ru": "Из какого материала сделана скамейка?", + "zh_Hant": "這個長椅 (座位) 是什麼做的?", + "pt_BR": "De que é feito o banco (assento)?", + "pl": "Z czego wykonana jest ławka (siedzisko)?", + "pt": "De que é feito o banco (assento)?" + }, + "id": "bench-material" + }, + { + "question": { + "en": "In which direction are you looking when sitting on the bench?", + "de": "In welche Richtung schaut man, wenn man auf der Bank sitzt?", + "nl": "In welke richting kijk je wanneer je op deze zitbank zit?", + "fr": "Dans quelle direction regardez-vous quand vous êtes assis sur le banc ?", + "hu": "Milyen irányba néz a pad?", + "it": "In che direzione si guarda quando si è seduti su questa panchina?", + "ru": "В каком направлении вы смотрите, когда сидите на скамейке?", + "zh_Hans": "坐在长椅上的时候你目视的方向是哪边?", + "zh_Hant": "坐在長椅時是面對那個方向?", + "pt_BR": "Em que direção você olha quando está sentado no banco?", + "pl": "W jakim kierunku patrzysz siedząc na ławce?", + "pt": "Em que direção olha quando está sentado no banco?" + }, + "render": { + "en": "When sitting on the bench, one looks towards {direction}°.", + "de": "Wenn man auf der Bank sitzt, schaut man in Richtung {direction}°.", + "nl": "Wanneer je op deze bank zit, dan kijk je in {direction}°.", + "fr": "Assis sur le banc, on regarde vers {direction}°.", + "hu": "A pad {direction}° felé néz.", + "it": "Quando si è seduti su questa panchina, si guarda verso {direction}°.", + "zh_Hans": "坐在长椅上的时候目视方向为 {direction}°方位。", + "ru": "Сидя на скамейке, вы смотрите в сторону {direction}°.", + "zh_Hant": "當坐在長椅時,那個人朝向 {direction}°。", + "pl": "Siedząc na ławce, patrzy się w kierunku {direction}°.", + "pt_BR": "Ao sentar-se no banco, olha-se para {direction} °.", + "pt": "Ao sentar-se no banco, olha-se para {direction} °." + }, + "freeform": { + "key": "direction", + "type": "direction" + }, + "id": "bench-direction" + }, + { + "render": { + "en": "Colour: {colour}", + "de": "Farbe: {colour}", + "fr": "Couleur : {colour}", + "nl": "Kleur: {colour}", + "hu": "Szín: {colour}", + "it": "Colore: {colour}", + "ru": "Цвет: {colour}", + "id": "Warna: {colour}", + "zh_Hans": "颜色: {colour}", + "zh_Hant": "顏色:{colour}", + "nb_NO": "Farge: {colour}", + "pt_BR": "Cor: {colour}", + "fi": "Väri: {colour}", + "pl": "Kolor: {colour}", + "pt": "Cor: {colour}", + "eo": "Koloro: {colour}" + }, + "question": { + "en": "Which colour does this bench have?", + "de": "Welche Farbe hat diese Sitzbank?", + "fr": "Quelle est la couleur de ce banc ?", + "nl": "Welke kleur heeft deze zitbank?", + "hu": "Milyen színű a pad?", + "it": "Di che colore è questa panchina?", + "ru": "Какого цвета скамейка?", + "zh_Hans": "这个长椅是什么颜色的?", + "zh_Hant": "這個長椅是什麼顏色的?", + "pt_BR": "Qual a cor dessa bancada?", + "pl": "Jaki kolor ma ta ławka?", + "pt": "Qual a cor dessa bancada?" + }, + "freeform": { + "key": "colour", + "type": "color" + }, + "mappings": [ + { + "if": "colour=brown", + "then": { + "en": "Colour: brown", + "de": "Farbe: braun", + "fr": "Couleur : marron", + "nl": "De kleur is bruin", + "hu": "Szín: barna", + "it": "Colore: marrone", + "ru": "Цвет: коричневый", + "zh_Hans": "颜色:棕", + "zh_Hant": "顏色:棕色", + "nb_NO": "Farge: brun", + "pt_BR": "Cor: marrom", + "fi": "Väri: ruskea", + "pl": "Kolor: brązowy", + "pt": "Cor: castanho", + "eo": "Koloro: bruna" + } + }, + { + "if": "colour=green", + "then": { + "en": "Colour: green", + "de": "Farbe: grün", + "fr": "Couleur : verte", + "nl": "De kleur is groen", + "hu": "Szín: zöld", + "it": "Colore: verde", + "ru": "Цвет: зеленый", + "zh_Hans": "颜色:绿", + "zh_Hant": "顏色:綠色", + "nb_NO": "Farge: grønn", + "pt_BR": "Cor: verde", + "fi": "Väri: vihreä", + "pl": "Kolor: zielony", + "pt": "Cor: verde", + "eo": "Koloro: verda" + } + }, + { + "if": "colour=gray", + "then": { + "en": "Colour: gray", + "de": "Farbe: grau", + "fr": "Couleur : gris", + "nl": "De kleur is grijs", + "hu": "Szín: szürke", + "it": "Colore: grigio", + "ru": "Цвет: серый", + "zh_Hans": "颜色:灰", + "zh_Hant": "顏色:灰色", + "nb_NO": "Farge: grå", + "pt_BR": "Cor: cinza", + "fi": "Väri: harmaa", + "pl": "Kolor: szary", + "pt": "Cor: cinzento", + "eo": "Koloro: griza" + } + }, + { + "if": "colour=white", + "then": { + "en": "Colour: white", + "de": "Farbe: weiß", + "fr": "Couleur : blanc", + "nl": "De kleur is wit", + "hu": "Szín: fehér", + "it": "Colore: bianco", + "ru": "Цвет: белый", + "zh_Hans": "颜色:白", + "zh_Hant": "顏色:白色", + "nb_NO": "Farge: hvit", + "pt_BR": "Cor: branco", + "fi": "Väri: valkoinen", + "pl": "Kolor: biały", + "pt": "Cor: branco", + "eo": "Koloro: blanka" + } + }, + { + "if": "colour=red", + "then": { + "en": "Colour: red", + "de": "Farbe: rot", + "fr": "Couleur : rouge", + "nl": "De kleur is rood", + "hu": "Szín: piros", + "it": "Colore: rosso", + "ru": "Цвет: красный", + "zh_Hans": "颜色:红", + "zh_Hant": "顏色:紅色", + "nb_NO": "Farge: rød", + "pt_BR": "Cor: vermelho", + "fi": "Väri: punainen", + "pl": "Kolor: czerwony", + "pt": "Cor: vermelho", + "eo": "Koloro: ruĝa" + } + }, + { + "if": "colour=black", + "then": { + "en": "Colour: black", + "de": "Farbe: schwarz", + "fr": "Couleur : noire", + "nl": "De kleur is zwart", + "hu": "Szín: fekete", + "it": "Colore: nero", + "ru": "Цвет: чёрный", + "zh_Hans": "颜色:黑", + "zh_Hant": "顏色:黑色", + "nb_NO": "Farge: svart", + "pt_BR": "Cor: preto", + "fi": "Väri: musta", + "pl": "Kolor: czarny", + "pt": "Cor: preto", + "eo": "Koloro: nigra" + } + }, + { + "if": "colour=blue", + "then": { + "en": "Colour: blue", + "de": "Farbe: blau", + "fr": "Couleur : bleu", + "nl": "De kleur is blauw", + "hu": "Szín: kék", + "it": "Colore: blu", + "ru": "Цвет: синий", + "zh_Hans": "颜色:蓝", + "zh_Hant": "顏色:藍色", + "nb_NO": "Farge: blå", + "pt_BR": "Cor: azul", + "fi": "Väri: sininen", + "pl": "Kolor: niebieski", + "pt": "Cor: azul", + "eo": "Koloro: blua" + } + }, + { + "if": "colour=yellow", + "then": { + "en": "Colour: yellow", + "de": "Farbe: gelb", + "fr": "Couleur : jaune", + "nl": "De kleur is geel", + "hu": "Szín: sárga", + "it": "Colore: giallo", + "ru": "Цвет: желтый", + "zh_Hans": "颜色:黄", + "zh_Hant": "顏色:黃色", + "nb_NO": "Farge: gul", + "pt_BR": "Cor: amarelo", + "fi": "Väri: keltainen", + "pl": "Kolor: żółty", + "pt": "Cor: amarelo", + "eo": "Koloro: flava" + } + } + ], + "id": "bench-colour" + }, + { + "question": { + "en": "When was this bench last surveyed?", + "nl": "Wanneer is deze laatste bank laatst gesurveyed?", + "fr": "Quand ce banc a-t-il été contrôlé pour la dernière fois ?", + "it": "Quando è stata verificata l’ultima volta questa panchina?", + "zh_Hans": "上次对这个长椅实地调查是什么时候?", + "de": "Wann wurde diese Bank zuletzt überprüft?", + "ru": "Когда последний раз обследовали эту скамейку?", + "zh_Hant": "上一次探察長椅是什麼時候?", + "pt_BR": "Quando esta bancada foi pesquisada pela última vez?", + "pl": "Kiedy ostatnio badano tę ławkę?", + "pt": "Quando esta bancada foi pesquisada pela última vez?" + }, + "render": { + "en": "This bench was last surveyed on {survey:date}", + "nl": "Deze bank is laatst gesurveyd op {survey:date}", + "fr": "Ce banc a été contrôlé pour la dernière fois le {survey:date}", + "it": "Questa panchina è stata controllata l’ultima volta in data {survey:date}", + "zh_Hans": "这个长椅于 {survey:date}最后一次实地调查", + "de": "Diese Bank wurde zuletzt überprüft am {survey:date}", + "ru": "Последний раз обследование этой скамейки проводилось {survey:date}", + "zh_Hant": "這個長椅最後是在 {survey:date} 探查的", + "pt_BR": "Esta bancada foi pesquisada pela última vez em {survey:date}", + "pl": "Ławka ta była ostatnio badana w dniu {survey:date}", + "pt": "Esta bancada foi pesquisada pela última vez em {survey:date}" + }, + "freeform": { + "key": "survey:date", + "type": "date" + }, + "mappings": [ + { + "if": "survey:date:={_now:date}", + "then": "Surveyed today!" + } + ], + "id": "bench-survey:date" + } + ], + "presets": [ + { + "tags": [ + "amenity=bench" + ], + "title": { + "en": "bench", + "de": "sitzbank", + "fr": "banc", + "nl": "zitbank", + "es": "banco", + "it": "panchina", + "ru": "cкамейка", + "id": "bangku", + "zh_Hans": "长椅", + "nb_NO": "benk", + "zh_Hant": "長椅", + "pt_BR": "banco", + "fi": "penkki", + "pl": "Ławka", + "pt": "banco" + }, + "presiceInput": { + "preferredBackground": "photo" + } + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity=bench", + "amenity=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/layers/bench/bench.svg" + }, + "iconSize": { + "render": "35,35,center" + }, + "location": [ + "point", + "centroid" + ] + } + ] } \ No newline at end of file diff --git a/assets/layers/bench_at_pt/bench_at_pt.json b/assets/layers/bench_at_pt/bench_at_pt.json index 845106a711..681aff3ad6 100644 --- a/assets/layers/bench_at_pt/bench_at_pt.json +++ b/assets/layers/bench_at_pt/bench_at_pt.json @@ -1,153 +1,174 @@ { - "id": "bench_at_pt", - "name": { - "en": "Benches at public transport stops", - "de": "Sitzbänke bei Haltestellen", - "fr": "Bancs des arrêts de transport en commun", - "nl": "Zitbanken aan bushaltes", - "es": "Bancos en una parada de transporte público", - "hu": "Padok megállókban", - "it": "Panchine alle fermate del trasporto pubblico", - "ru": "Скамейки на остановках общественного транспорта", - "zh_Hans": "在公交站点的长椅", - "nb_NO": "Benker", - "zh_Hant": "大眾運輸站點的長椅", - "pt_BR": "Bancos em pontos de transporte público", - "pl": "Ławki na przystankach komunikacji miejskiej", - "pt": "Bancos em pontos de transporte público" - }, - "minzoom": 14, - "source": { - "osmTags": { - "or": [ - "bench=yes", - "bench=stand_up_bench" - ] - } - }, - "title": { - "render": { - "en": "Bench", - "de": "Sitzbank", - "fr": "Banc", - "nl": "Zitbank", - "es": "Banco", - "hu": "Pad", - "it": "Panchina", - "ru": "Скамейка", - "id": "Bangku", - "zh_Hans": "长椅", - "nb_NO": "Benk", - "zh_Hant": "長椅", - "pt_BR": "Banco", - "fi": "Penkki", - "pl": "Ławka", - "pt": "Banco" - }, - "mappings": [ - { - "if": { - "or": [ - "public_transport=platform", - "railway=platform", - "highway=bus_stop" - ] - }, - "then": { - "en": "Bench at public transport stop", - "de": "Sitzbank bei Haltestelle", - "fr": "Banc d'un arrêt de transport en commun", - "nl": "Zitbank aan een bushalte", - "hu": "Pad megállóban", - "it": "Panchina alla fermata del trasporto pubblico", - "ru": "Скамейка на остановке общественного транспорта", - "zh_Hans": "在公交站点的长椅", - "zh_Hant": "大眾運輸站點的長椅", - "pt_BR": "Banco em ponto de transporte público", - "pl": "Ławka na przystanku komunikacji miejskiej", - "pt": "Banco em ponto de transporte público" - } - }, - { - "if": { - "and": [ - "amenity=shelter" - ] - }, - "then": { - "en": "Bench in shelter", - "de": "Sitzbank in Unterstand", - "fr": "Banc dans un abri", - "nl": "Zitbank in een schuilhokje", - "hu": "Pad fedett helyen", - "it": "Panchina in un riparo", - "zh_Hans": "在庇护所的长椅", - "ru": "Скамейка в укрытии", - "zh_Hant": "涼亭內的長椅", - "pt_BR": "Banco em abrigo", - "pt": "Banco em abrigo" - } - } - ] - }, - "tagRenderings": [ - "images", - { - "render": { - "en": "{name}", - "de": "{name}", - "fr": "{name}", - "nl": "{name}", - "hu": "{name}", - "it": "{name}", - "ru": "{name}", - "id": "{name}", - "zh_Hans": "{name}", - "zh_Hant": "{name}", - "pt_BR": "{name}", - "fi": "{name}", - "pl": "{name}", - "pt": "{name}", - "eo": "{name}" - }, - "freeform": { - "key": "name" - }, - "id": "bench_at_pt-name" - }, - { - "render": { - "en": "Stand up bench", - "de": "Stehbank", - "fr": "Banc assis debout", - "nl": "Leunbank", - "it": "Panca in piedi", - "zh_Hans": "站立长凳", - "ru": "Встаньте на скамейке", - "zh_Hant": "站立長椅" - }, - "freeform": { - "key": "bench", - "addExtraTags": [] - }, - "condition": { - "and": [ - "bench=stand_up_bench" - ] - }, - "id": "bench_at_pt-bench" - } - ], - "icon": { - "render": "./assets/themes/benches/bench_public_transport.svg" - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "35,35,center" - }, - "color": { - "render": "#00f" + "id": "bench_at_pt", + "name": { + "en": "Benches at public transport stops", + "de": "Sitzbänke bei Haltestellen", + "fr": "Bancs des arrêts de transport en commun", + "nl": "Zitbanken aan bushaltes", + "es": "Bancos en una parada de transporte público", + "hu": "Padok megállókban", + "it": "Panchine alle fermate del trasporto pubblico", + "ru": "Скамейки на остановках общественного транспорта", + "zh_Hans": "在公交站点的长椅", + "nb_NO": "Benker", + "zh_Hant": "大眾運輸站點的長椅", + "pt_BR": "Bancos em pontos de transporte público", + "pl": "Ławki na przystankach komunikacji miejskiej", + "pt": "Bancos em pontos de transporte público" + }, + "minzoom": 14, + "source": { + "osmTags": { + "or": [ + "bench=yes", + "bench=stand_up_bench" + ] } + }, + "title": { + "render": { + "en": "Bench", + "de": "Sitzbank", + "fr": "Banc", + "nl": "Zitbank", + "es": "Banco", + "hu": "Pad", + "it": "Panchina", + "ru": "Скамейка", + "id": "Bangku", + "zh_Hans": "长椅", + "nb_NO": "Benk", + "zh_Hant": "長椅", + "pt_BR": "Banco", + "fi": "Penkki", + "pl": "Ławka", + "pt": "Banco" + }, + "mappings": [ + { + "if": { + "or": [ + "public_transport=platform", + "railway=platform", + "highway=bus_stop" + ] + }, + "then": { + "en": "Bench at public transport stop", + "de": "Sitzbank bei Haltestelle", + "fr": "Banc d'un arrêt de transport en commun", + "nl": "Zitbank aan een bushalte", + "hu": "Pad megállóban", + "it": "Panchina alla fermata del trasporto pubblico", + "ru": "Скамейка на остановке общественного транспорта", + "zh_Hans": "在公交站点的长椅", + "zh_Hant": "大眾運輸站點的長椅", + "pt_BR": "Banco em ponto de transporte público", + "pl": "Ławka na przystanku komunikacji miejskiej", + "pt": "Banco em ponto de transporte público" + } + }, + { + "if": { + "and": [ + "amenity=shelter" + ] + }, + "then": { + "en": "Bench in shelter", + "de": "Sitzbank in Unterstand", + "fr": "Banc dans un abri", + "nl": "Zitbank in een schuilhokje", + "hu": "Pad fedett helyen", + "it": "Panchina in un riparo", + "zh_Hans": "在庇护所的长椅", + "ru": "Скамейка в укрытии", + "zh_Hant": "涼亭內的長椅", + "pt_BR": "Banco em abrigo", + "pt": "Banco em abrigo" + } + } + ] + }, + "tagRenderings": [ + "images", + { + "render": { + "en": "{name}", + "de": "{name}", + "fr": "{name}", + "nl": "{name}", + "hu": "{name}", + "it": "{name}", + "ru": "{name}", + "id": "{name}", + "zh_Hans": "{name}", + "zh_Hant": "{name}", + "pt_BR": "{name}", + "fi": "{name}", + "pl": "{name}", + "pt": "{name}", + "eo": "{name}" + }, + "freeform": { + "key": "name" + }, + "id": "bench_at_pt-name" + }, + { + "id": "bench_at_pt-bench_type", + "question": { + "en": "What kind of bench is this?", + "nl": "Wat voor soort bank is dit?" + }, + "mappings": [ + { + "if": "bench=yes", + "then": { + "en": "There is a normal, sit-down bench here" + } + }, + { + "if": "bench=stand_up_bench", + "then": { + "en": "Stand up bench", + "de": "Stehbank", + "fr": "Banc assis debout", + "nl": "Leunbank", + "it": "Panca in piedi", + "zh_Hans": "站立长凳", + "ru": "Встаньте на скамейке", + "zh_Hant": "站立長椅" + } + }, + { + "if": "bench=no", + "then": { + "en": "There is no bench here" + } + } + ] + } + ], + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/benches/bench_public_transport.svg" + }, + "iconSize": { + "render": "35,35,center" + }, + "location": [ + "point" + ] + }, + { + "color": { + "render": "#00f" + }, + "width": { + "render": "8" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/bicycle_library/bicycle_library.json b/assets/layers/bicycle_library/bicycle_library.json index 678924b393..a4c78a05a1 100644 --- a/assets/layers/bicycle_library/bicycle_library.json +++ b/assets/layers/bicycle_library/bicycle_library.json @@ -1,292 +1,299 @@ { - "id": "bicycle_library", - "name": { - "en": "Bicycle library", - "nl": "Fietsbibliotheek", - "fr": "Vélothèque", - "it": "Bici in prestito", - "ru": "Велосипедная библиотека", - "zh_Hant": "單車圖書館", - "pt_BR": "Biblioteca de bicicleta", - "de": "Fahrradbibliothek", - "pt": "Biblioteca de bicicleta" + "id": "bicycle_library", + "name": { + "en": "Bicycle library", + "nl": "Fietsbibliotheek", + "fr": "Vélothèque", + "it": "Bici in prestito", + "ru": "Велосипедная библиотека", + "zh_Hant": "單車圖書館", + "pt_BR": "Biblioteca de bicicleta", + "de": "Fahrradbibliothek", + "pt": "Biblioteca de bicicleta" + }, + "minzoom": 8, + "source": { + "osmTags": "amenity=bicycle_library" + }, + "title": { + "render": { + "en": "Bicycle library", + "nl": "Fietsbibliotheek", + "fr": "Vélothèque", + "it": "Bici in prestito", + "ru": "Велосипедная библиотека", + "zh_Hant": "單車圖書館", + "pt_BR": "Biblioteca de bicicleta", + "de": "Fahrradbibliothek", + "pt": "Biblioteca de bicicleta" }, - "minzoom": 8, - "source": { - "osmTags": "amenity=bicycle_library" - }, - "title": { - "render": { - "en": "Bicycle library", - "nl": "Fietsbibliotheek", - "fr": "Vélothèque", - "it": "Bici in prestito", - "ru": "Велосипедная библиотека", - "zh_Hant": "單車圖書館", - "pt_BR": "Biblioteca de bicicleta", - "de": "Fahrradbibliothek", - "pt": "Biblioteca de bicicleta" - }, - "mappings": [ - { - "if": "name~*", - "then": "{name}" - } + "mappings": [ + { + "if": "name~*", + "then": "{name}" + } + ] + }, + "titleIcons": [ + { + "condition": { + "or": [ + "service:bicycle:pump=yes", + "service:bicycle:pump=separate" ] + }, + "render": "" }, - "titleIcons": [ - { - "condition": { - "or": [ - "service:bicycle:pump=yes", - "service:bicycle:pump=separate" - ] - }, - "render": "" - }, - "defaults" - ], - "description": { - "en": "A facility where bicycles can be lent for longer period of times", - "nl": "Een plaats waar men voor langere tijd een fiets kan lenen", - "fr": "Un lieu où des vélos peuvent être empruntés pour un temps plus long", - "hu": "Létesítmény, ahonnan kerékpár kölcsönözhető hosszabb időre", - "it": "Una struttura dove le biciclette possono essere prestate per periodi di tempo più lunghi", - "de": "Eine Einrichtung, in der Fahrräder für längere Zeit geliehen werden können", - "ru": "Учреждение, где велосипед может быть арендован на более длительный срок", - "zh_Hant": "能夠長期租用單車的設施", - "pt_BR": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos", - "pl": "Obiekt, w którym rowery można wypożyczyć na dłuższy okres", - "pt": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos" + "defaults" + ], + "description": { + "en": "A facility where bicycles can be lent for longer period of times", + "nl": "Een plaats waar men voor langere tijd een fiets kan lenen", + "fr": "Un lieu où des vélos peuvent être empruntés pour un temps plus long", + "hu": "Létesítmény, ahonnan kerékpár kölcsönözhető hosszabb időre", + "it": "Una struttura dove le biciclette possono essere prestate per periodi di tempo più lunghi", + "de": "Eine Einrichtung, in der Fahrräder für längere Zeit geliehen werden können", + "ru": "Учреждение, где велосипед может быть арендован на более длительный срок", + "zh_Hant": "能夠長期租用單車的設施", + "pt_BR": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos", + "pl": "Obiekt, w którym rowery można wypożyczyć na dłuższy okres", + "pt": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos" + }, + "tagRenderings": [ + "images", + { + "question": { + "en": "What is the name of this bicycle library?", + "nl": "Wat is de naam van deze fietsbieb?", + "fr": "Quel est le nom de cette vélothèque ?", + "it": "Qual è il nome di questo “bici in prestito”?", + "ru": "Как называется эта велосипедная библиотека?", + "nb_NO": "Hva heter dette sykkelbiblioteket?", + "zh_Hant": "這個單車圖書館的名稱是?", + "pt_BR": "Qual o nome desta biblioteca de bicicleta?", + "de": "Wie lautet der Name dieser Fahrradbibliothek?", + "pt": "Qual o nome desta biblioteca de bicicleta?" + }, + "render": { + "en": "This bicycle library is called {name}", + "nl": "Deze fietsbieb heet {name}", + "fr": "Cette vélothèque s'appelle {name}", + "it": "Il “bici in prestito” è chiamato {name}", + "ru": "Эта велосипедная библиотека называется {name}", + "nb_NO": "Dette sykkelbiblioteket heter {name}", + "zh_Hant": "這個單車圖書館叫做 {name}", + "pt_BR": "Esta biblioteca de bicicleta é chamada de {name}", + "de": "Diese Fahrradbibliothek heißt {name}", + "pt": "Esta biblioteca de bicicleta é chamada de {name}" + }, + "freeform": { + "key": "name" + }, + "id": "bicycle_library-name" }, - "tagRenderings": [ - "images", + "website", + "phone", + "email", + "opening_hours", + { + "question": { + "en": "How much does lending a bicycle cost?", + "nl": "Hoeveel kost het huren van een fiets?", + "fr": "Combien coûte l'emprunt d'un vélo ?", + "hu": "Mennyibe kerül egy kerékpár kölcsönzése?", + "it": "Quanto costa il prestito di una bicicletta?", + "ru": "Сколько стоит прокат велосипеда?", + "de": "Wie viel kostet das Ausleihen eines Fahrrads?", + "nb_NO": "Hvor mye koster det å leie en sykkel?", + "zh_Hant": "租用單車的費用多少?", + "pt_BR": "Quanto custa um empréstimo de bicicleta?", + "pt": "Quanto custa um empréstimo de bicicleta?" + }, + "render": { + "en": "Lending a bicycle costs {charge}", + "nl": "Een fiets huren kost {charge}", + "fr": "Emprunter un vélo coûte {charge}", + "hu": "Egy kerékpár kölcsönzése {charge}", + "it": "Il prestito di una bicicletta costa {charge}", + "ru": "Стоимость аренды велосипеда {charge}", + "de": "Das Ausleihen eines Fahrrads kostet {charge}", + "nb_NO": "Sykkelleie koster {charge}", + "zh_Hant": "租借單車需要 {charge}", + "pt_BR": "Custos de empréstimo de bicicleta {charge}", + "pt": "Custos de empréstimo de bicicleta {charge}" + }, + "freeform": { + "key": "charge", + "addExtraTags": [ + "fee=yes" + ] + }, + "mappings": [ { - "question": { - "en": "What is the name of this bicycle library?", - "nl": "Wat is de naam van deze fietsbieb?", - "fr": "Quel est le nom de cette vélothèque ?", - "it": "Qual è il nome di questo “bici in prestito”?", - "ru": "Как называется эта велосипедная библиотека?", - "nb_NO": "Hva heter dette sykkelbiblioteket?", - "zh_Hant": "這個單車圖書館的名稱是?", - "pt_BR": "Qual o nome desta biblioteca de bicicleta?", - "de": "Wie lautet der Name dieser Fahrradbibliothek?", - "pt": "Qual o nome desta biblioteca de bicicleta?" - }, - "render": { - "en": "This bicycle library is called {name}", - "nl": "Deze fietsbieb heet {name}", - "fr": "Cette vélothèque s'appelle {name}", - "it": "Il “bici in prestito” è chiamato {name}", - "ru": "Эта велосипедная библиотека называется {name}", - "nb_NO": "Dette sykkelbiblioteket heter {name}", - "zh_Hant": "這個單車圖書館叫做 {name}", - "pt_BR": "Esta biblioteca de bicicleta é chamada de {name}", - "de": "Diese Fahrradbibliothek heißt {name}", - "pt": "Esta biblioteca de bicicleta é chamada de {name}" - }, - "freeform": { - "key": "name" - }, - "id": "bicycle_library-name" - }, - "website", - "phone", - "email", - "opening_hours", - { - "question": { - "en": "How much does lending a bicycle cost?", - "nl": "Hoeveel kost het huren van een fiets?", - "fr": "Combien coûte l'emprunt d'un vélo ?", - "hu": "Mennyibe kerül egy kerékpár kölcsönzése?", - "it": "Quanto costa il prestito di una bicicletta?", - "ru": "Сколько стоит прокат велосипеда?", - "de": "Wie viel kostet das Ausleihen eines Fahrrads?", - "nb_NO": "Hvor mye koster det å leie en sykkel?", - "zh_Hant": "租用單車的費用多少?", - "pt_BR": "Quanto custa um empréstimo de bicicleta?", - "pt": "Quanto custa um empréstimo de bicicleta?" - }, - "render": { - "en": "Lending a bicycle costs {charge}", - "nl": "Een fiets huren kost {charge}", - "fr": "Emprunter un vélo coûte {charge}", - "hu": "Egy kerékpár kölcsönzése {charge}", - "it": "Il prestito di una bicicletta costa {charge}", - "ru": "Стоимость аренды велосипеда {charge}", - "de": "Das Ausleihen eines Fahrrads kostet {charge}", - "nb_NO": "Sykkelleie koster {charge}", - "zh_Hant": "租借單車需要 {charge}", - "pt_BR": "Custos de empréstimo de bicicleta {charge}", - "pt": "Custos de empréstimo de bicicleta {charge}" - }, - "freeform": { - "key": "charge", - "addExtraTags": [ - "fee=yes" - ] - }, - "mappings": [ - { - "if": { - "and": [ - "fee=no", - "charge=" - ] - }, - "then": { - "en": "Lending a bicycle is free", - "nl": "Een fiets huren is gratis", - "fr": "L'emprunt de vélo est gratuit", - "hu": "A kerékpárkölcsönzés ingyenes", - "it": "Il prestito di una bicicletta è gratuito", - "de": "Das Ausleihen eines Fahrrads ist kostenlos", - "ru": "Прокат велосипедов бесплатен", - "nb_NO": "Det er gratis å leie en sykkel", - "zh_Hant": "租借單車免費", - "pt_BR": "Emprestar uma bicicleta é grátis", - "pt": "Emprestar uma bicicleta é grátis" - } - }, - { - "if": { - "and": [ - "fee=yes", - "charge=€20warranty + €20/year" - ] - }, - "then": { - "en": "Lending a bicycle costs €20/year and €20 warranty", - "nl": "Een fiets huren kost €20/jaar en €20 waarborg", - "fr": "Emprunter un vélo coûte 20 €/an et 20 € de garantie", - "it": "Il prestito di una bicicletta costa 20 €/anno più 20 € di garanzia", - "de": "Das Ausleihen eines Fahrrads kostet 20€ pro Jahr und 20€ Gebühr", - "zh_Hant": "租借單車價錢 €20/year 與 €20 保證金", - "ru": "Прокат велосипеда стоит €20/год и €20 залог", - "pt_BR": "Emprestar uma bicicleta custa €20/ano e €20 de garantia", - "pt": "Emprestar uma bicicleta custa €20/ano e €20 de garantia" - } - } - ], - "id": "bicycle_library-charge" - }, - { - "id": "bicycle-library-target-group", - "question": { - "en": "Who can lend bicycles here?", - "nl": "Voor wie worden hier fietsen aangeboden?", - "fr": "Qui peut emprunter des vélos ici ?", - "hu": "Ki kölcsönözhet itt kerékpárt?", - "it": "Chi può prendere in prestito le biciclette qua?", - "zh_Hans": "谁可以从这里借自行车?", - "de": "Wer kann hier Fahrräder ausleihen?", - "ru": "Кто здесь может арендовать велосипед?", - "zh_Hant": "誰可以在這裡租單車?", - "pt_BR": "Quem pode emprestar bicicletas aqui?", - "pt": "Quem pode emprestar bicicletas aqui?" - }, - "multiAnswer": true, - "mappings": [ - { - "if": "bicycle_library:for=child", - "then": { - "nl": "Aanbod voor kinderen", - "en": "Bikes for children available", - "fr": "Vélos pour enfants disponibles", - "hu": "", - "it": "Sono disponibili biciclette per bambini", - "de": "Fahrräder für Kinder verfügbar", - "ru": "Доступны детские велосипеды", - "zh_Hant": "提供兒童單車", - "pt_BR": "Bicicletas para crianças disponíveis", - "pt": "Bicicletas para crianças disponíveis" - } - }, - { - "if": "bicycle_library:for=adult", - "then": { - "nl": "Aanbod voor volwassenen", - "en": "Bikes for adult available", - "fr": "Vélos pour adultes disponibles", - "it": "Sono disponibili biciclette per adulti", - "de": "Fahrräder für Erwachsene verfügbar", - "ru": "Доступны велосипеды для взрослых", - "zh_Hant": "有提供成人單車", - "pt_BR": "Bicicletas para adulto disponíveis", - "pt": "Bicicletas para adulto disponíveis" - } - }, - { - "if": "bicycle_library:for=disabled", - "then": { - "nl": "Aanbod voor personen met een handicap", - "en": "Bikes for disabled persons available", - "fr": "Vélos pour personnes handicapées disponibles", - "it": "Sono disponibili biciclette per disabili", - "de": "Fahrräder für Behinderte verfügbar", - "ru": "Доступны велосипеды для людей с ограниченными возможностями", - "zh_Hant": "有提供行動不便人士的單車", - "pt_BR": "Bicicletas para deficientes físicos disponíveis", - "pt": "Bicicletas para deficientes físicos disponíveis" - } - } + "if": { + "and": [ + "fee=no", + "charge=" ] + }, + "then": { + "en": "Lending a bicycle is free", + "nl": "Een fiets huren is gratis", + "fr": "L'emprunt de vélo est gratuit", + "hu": "A kerékpárkölcsönzés ingyenes", + "it": "Il prestito di una bicicletta è gratuito", + "de": "Das Ausleihen eines Fahrrads ist kostenlos", + "ru": "Прокат велосипедов бесплатен", + "nb_NO": "Det er gratis å leie en sykkel", + "zh_Hant": "租借單車免費", + "pt_BR": "Emprestar uma bicicleta é grátis", + "pt": "Emprestar uma bicicleta é grátis" + } }, - "description" - ], - "presets": [ { - "title": { - "en": "Fietsbibliotheek", - "nl": "Bicycle library", - "ru": "Велосипедная библиотека", - "zh_Hant": "自行車圖書館 ( Fietsbibliotheek)", - "it": "Bici in prestito", - "fr": "Vélothèque", - "pt_BR": "Biblioteca de bicicletas", - "de": "Fahrradbibliothek", - "pt": "Biblioteca de bicicletas", - "eo": "Fietsbibliotheek" - }, - "tags": [ - "amenity=bicycle_library" - ], - "description": { - "nl": "Een fietsbieb heeft een collectie fietsen die leden mogen lenen", - "en": "A bicycle library has a collection of bikes which can be lent", - "fr": "Une vélothèque a une flotte de vélos qui peuvent être empruntés", - "it": "Una ciclo-teca o «bici in prestito» ha una collezione di bici che possno essere prestate", - "ru": "В велосипедной библиотеке есть велосипеды для аренды", - "zh_Hant": "單車圖書館有一大批單車供人租借", - "de": "Eine Fahrradbibliothek verfügt über eine Sammlung von Fahrrädern, die ausgeliehen werden können" - } + "if": { + "and": [ + "fee=yes", + "charge=€20warranty + €20/year" + ] + }, + "then": { + "en": "Lending a bicycle costs €20/year and €20 warranty", + "nl": "Een fiets huren kost €20/jaar en €20 waarborg", + "fr": "Emprunter un vélo coûte 20 €/an et 20 € de garantie", + "it": "Il prestito di una bicicletta costa 20 €/anno più 20 € di garanzia", + "de": "Das Ausleihen eines Fahrrads kostet 20€ pro Jahr und 20€ Gebühr", + "zh_Hant": "租借單車價錢 €20/year 與 €20 保證金", + "ru": "Прокат велосипеда стоит €20/год и €20 залог", + "pt_BR": "Emprestar uma bicicleta custa €20/ano e €20 de garantia", + "pt": "Emprestar uma bicicleta custa €20/ano e €20 de garantia" + } } - ], - "icon": { + ], + "id": "bicycle_library-charge" + }, + { + "id": "bicycle-library-target-group", + "question": { + "en": "Who can lend bicycles here?", + "nl": "Voor wie worden hier fietsen aangeboden?", + "fr": "Qui peut emprunter des vélos ici ?", + "hu": "Ki kölcsönözhet itt kerékpárt?", + "it": "Chi può prendere in prestito le biciclette qua?", + "zh_Hans": "谁可以从这里借自行车?", + "de": "Wer kann hier Fahrräder ausleihen?", + "ru": "Кто здесь может арендовать велосипед?", + "zh_Hant": "誰可以在這裡租單車?", + "pt_BR": "Quem pode emprestar bicicletas aqui?", + "pt": "Quem pode emprestar bicicletas aqui?" + }, + "multiAnswer": true, + "mappings": [ + { + "if": "bicycle_library:for=child", + "then": { + "nl": "Aanbod voor kinderen", + "en": "Bikes for children available", + "fr": "Vélos pour enfants disponibles", + "hu": "", + "it": "Sono disponibili biciclette per bambini", + "de": "Fahrräder für Kinder verfügbar", + "ru": "Доступны детские велосипеды", + "zh_Hant": "提供兒童單車", + "pt_BR": "Bicicletas para crianças disponíveis", + "pt": "Bicicletas para crianças disponíveis" + } + }, + { + "if": "bicycle_library:for=adult", + "then": { + "nl": "Aanbod voor volwassenen", + "en": "Bikes for adult available", + "fr": "Vélos pour adultes disponibles", + "it": "Sono disponibili biciclette per adulti", + "de": "Fahrräder für Erwachsene verfügbar", + "ru": "Доступны велосипеды для взрослых", + "zh_Hant": "有提供成人單車", + "pt_BR": "Bicicletas para adulto disponíveis", + "pt": "Bicicletas para adulto disponíveis" + } + }, + { + "if": "bicycle_library:for=disabled", + "then": { + "nl": "Aanbod voor personen met een handicap", + "en": "Bikes for disabled persons available", + "fr": "Vélos pour personnes handicapées disponibles", + "it": "Sono disponibili biciclette per disabili", + "de": "Fahrräder für Behinderte verfügbar", + "ru": "Доступны велосипеды для людей с ограниченными возможностями", + "zh_Hant": "有提供行動不便人士的單車", + "pt_BR": "Bicicletas para deficientes físicos disponíveis", + "pt": "Bicicletas para deficientes físicos disponíveis" + } + } + ] + }, + "description" + ], + "presets": [ + { + "title": { + "en": "Fietsbibliotheek", + "nl": "Bicycle library", + "ru": "Велосипедная библиотека", + "zh_Hant": "自行車圖書館 ( Fietsbibliotheek)", + "it": "Bici in prestito", + "fr": "Vélothèque", + "pt_BR": "Biblioteca de bicicletas", + "de": "Fahrradbibliothek", + "pt": "Biblioteca de bicicletas", + "eo": "Fietsbibliotheek" + }, + "tags": [ + "amenity=bicycle_library" + ], + "description": { + "nl": "Een fietsbieb heeft een collectie fietsen die leden mogen lenen", + "en": "A bicycle library has a collection of bikes which can be lent", + "fr": "Une vélothèque a une flotte de vélos qui peuvent être empruntés", + "it": "Una ciclo-teca o «bici in prestito» ha una collezione di bici che possno essere prestate", + "ru": "В велосипедной библиотеке есть велосипеды для аренды", + "zh_Hant": "單車圖書館有一大批單車供人租借", + "de": "Eine Fahrradbibliothek verfügt über eine Sammlung von Fahrrädern, die ausgeliehen werden können" + } + } + ], + "mapRendering": [ + { + "icon": { "render": "pin:#22ff55;./assets/layers/bicycle_library/bicycle_library.svg" - }, - "iconOverlays": [ + }, + "iconBadges": [ { - "if": "opening_hours~*", - "then": "isOpen", - "badge": true + "if": "opening_hours~*", + "then": "isOpen" }, { - "if": "service:bicycle:pump=yes", - "then": "circle:#e2783d;./assets/layers/bike_repair_station/pump.svg", - "badge": true + "if": "service:bicycle:pump=yes", + "then": "circle:#e2783d;./assets/layers/bike_repair_station/pump.svg" } - ], - "width": { - "render": "1" - }, - "iconSize": { + ], + "iconSize": { "render": "50,50,bottom" + }, + "location": [ + "point", + "centroid" + ] }, - "color": { + { + "color": { "render": "#c00" - }, - "wayHandling": 2 + }, + "width": { + "render": "1" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json b/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json index 6f069aacf8..4fb0991ad7 100644 --- a/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json +++ b/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json @@ -1,6 +1,54 @@ { - "id": "bicycle_tube_vending_machine", - "name": { + "id": "bicycle_tube_vending_machine", + "name": { + "en": "Bicycle tube vending machine", + "nl": "Fietsbanden-verkoopsautomaat", + "fr": "Distributeur automatique de chambre à air de vélo", + "it": "Distributore automatico di camere d’aria per bici", + "de": "Fahrradschlauch-Automat", + "ru": "Торговый автомат для велосипедистов", + "zh_Hant": "自行車內胎自動售貨機", + "pt_BR": "Máquina de venda automática de tubos de bicicleta", + "pt": "Máquina de venda automática de tubos de bicicleta" + }, + "title": { + "render": { + "en": "Bicycle tube vending machine", + "nl": "Fietsbanden-verkoopsautomaat", + "fr": "Distributeur automatique de chambre à air de vélo", + "it": "Distributore automatico di camere d’aria per bici", + "de": "Fahrradschlauch-Automat", + "ru": "Торговый автомат для велосипедистов", + "zh_Hant": "自行車內胎自動售貨機", + "pt_BR": "Máquina de venda automática de tubos de bicicleta", + "pt": "Máquina de venda automática de tubos de bicicleta" + }, + "mappings": [ + { + "if": "name~*", + "then": "Bicycle tube vending machine {name}" + } + ] + }, + "titleIcons": [ + { + "render": "", + "condition": "operator=De Fietsambassade Gent" + }, + "defaults" + ], + "source": { + "osmTags": { + "and": [ + "amenity=vending_machine", + "vending~.*bicycle_tube.*" + ] + } + }, + "minzoom": 13, + "presets": [ + { + "title": { "en": "Bicycle tube vending machine", "nl": "Fietsbanden-verkoopsautomaat", "fr": "Distributeur automatique de chambre à air de vélo", @@ -10,271 +58,231 @@ "zh_Hant": "自行車內胎自動售貨機", "pt_BR": "Máquina de venda automática de tubos de bicicleta", "pt": "Máquina de venda automática de tubos de bicicleta" - }, - "title": { - "render": { - "en": "Bicycle tube vending machine", - "nl": "Fietsbanden-verkoopsautomaat", - "fr": "Distributeur automatique de chambre à air de vélo", - "it": "Distributore automatico di camere d’aria per bici", - "de": "Fahrradschlauch-Automat", - "ru": "Торговый автомат для велосипедистов", - "zh_Hant": "自行車內胎自動售貨機", - "pt_BR": "Máquina de venda automática de tubos de bicicleta", - "pt": "Máquina de venda automática de tubos de bicicleta" - }, - "mappings": [ - { - "if": "name~*", - "then": "Bicycle tube vending machine {name}" - } - ] - }, - "titleIcons": [ - { - "render": "", - "condition": "operator=De Fietsambassade Gent" - }, - "defaults" - ], - "icon": { - "render": "pin:#ffffff;./assets/layers/bicycle_tube_vending_machine/pinIcon.svg" - }, - "iconOverlays": [ - { - "if": { - "or": [ - "operational_status=broken", - "operational_status=closed" - ] - }, - "then": "close:#c33", - "badge": true - } - ], - "iconSize": "50,50,bottom", - "source": { - "osmTags": { - "and": [ - "amenity=vending_machine", - "vending~.*bicycle_tube.*" - ] - } - }, - "minzoom": 13, - "wayHandling": 2, - "presets": [ - { - "title": { - "en": "Bicycle tube vending machine", - "nl": "Fietsbanden-verkoopsautomaat", - "fr": "Distributeur automatique de chambre à air de vélo", - "it": "Distributore automatico di camere d’aria per bici", - "de": "Fahrradschlauch-Automat", - "ru": "Торговый автомат для велосипедистов", - "zh_Hant": "自行車內胎自動售貨機", - "pt_BR": "Máquina de venda automática de tubos de bicicleta", - "pt": "Máquina de venda automática de tubos de bicicleta" - }, - "tags": [ - "amenity=vending_machine", - "vending=bicycle_tube", - "vending:bicycle_tube=yes" - ] - } - ], - "color": "#6bc4f7", - "tagRenderings": [ - "images", - { - "question": { - "en": "Is this vending machine still operational?", - "nl": "Is deze verkoopsautomaat nog steeds werkende?", - "fr": "Cette machine est-elle encore opérationelle ?", - "it": "Questo distributore automatico funziona ancora?", - "ru": "Этот торговый автомат все еще работает?", - "de": "Ist dieser Automat noch in Betrieb?", - "zh_Hant": "這個自動販賣機仍有運作嗎?", - "pt_BR": "Esta máquina de venda automática ainda está operacional?", - "pt": "Esta máquina de venda automática ainda está operacional?" - }, - "render": { - "en": "The operational status is {operational_status", - "nl": "Deze verkoopsautomaat is {operational_status}", - "fr": "L'état opérationnel est {operational_status}", - "it": "Lo stato operativo è {operational_status}", - "de": "Der Betriebszustand ist {operational_status", - "ru": "Рабочий статус: {operational_status", - "zh_Hant": "運作狀態是 {operational_status", - "pt_BR": "O estado operacional é: {operational_status", - "pt": "O estado operacional é: {operational_status" - }, - "freeform": { - "key": "operational_status" - }, - "mappings": [ - { - "if": "operational_status=", - "then": { - "en": "This vending machine works", - "nl": "Deze verkoopsautomaat werkt", - "fr": "Le distributeur automatique fonctionne", - "hu": "Az automata működik", - "it": "Il distributore automatico funziona", - "ru": "Этот торговый автомат работает", - "zh_Hans": "这个借还机正常工作", - "de": "Dieser Automat funktioniert", - "zh_Hant": "這個自動販賣機仍運作", - "pt_BR": "Esta máquina de venda automática funciona", - "pt": "Esta máquina de venda automática funciona" - } - }, - { - "if": "operational_status=broken", - "then": { - "en": "This vending machine is broken", - "nl": "Deze verkoopsautomaat is kapot", - "fr": "Le distributeur automatique est en panne", - "hu": "Az automata elromlott", - "it": "Il distributore automatico è guasto", - "ru": "Этот торговый автомат сломан", - "zh_Hans": "这个借还机已经损坏", - "de": "Dieser Automat ist kaputt", - "zh_Hant": "這個自動販賣機沒有運作了", - "pt_BR": "Esta máquina de venda automática está quebrada", - "pt": "Esta máquina de venda automática está quebrada" - } - }, - { - "if": "operational_status=closed", - "then": { - "en": "This vending machine is closed", - "nl": "Deze verkoopsautomaat is uitgeschakeld", - "fr": "Le distributeur automatique est fermé", - "hu": "Az automata zárva van", - "it": "Il distributore automatico è spento", - "ru": "Этот торговый автомат закрыт", - "zh_Hans": "这个借还机被关闭了", - "de": "Dieser Automat ist geschlossen", - "zh_Hant": "這個自動販賣機已經關閉了", - "pt_BR": "Esta máquina de venda automática está fechada", - "pt": "Esta máquina de venda automática está fechada" - } - } - ], - "id": "Still in use?" - }, - { - "question": "How much does a bicycle tube cost?", - "render": "A bicycle tube costs {charge}", - "freeform": { - "key": "charge" - }, - "id": "bicycle_tube_vending_machine-charge" - }, - { - "id": "vending-machine-payment-methods", - "question": "How can one pay at this tube vending machine?", - "mappings": [ - { - "if": "payment:coins=yes", - "ifnot": "payment:coins=no", - "then": "Payment with coins is possible" - }, - { - "if": "payment:notes=yes", - "ifnot": "payment:notes=no", - "then": "Payment with notes is possible" - }, - { - "if": "payment:cards=yes", - "ifnot": "payment:cards=no", - "then": "Payment with cards is possible" - } - ], - "multiAnswer": true - }, - { - "question": "Which brand of tubes are sold here?", - "freeform": { - "key": "brand" - }, - "render": "{brand} tubes are sold here", - "mappings": [ - { - "if": "brand=Continental", - "then": "Continental tubes are sold here" - }, - { - "if": "brand=Schwalbe", - "then": "Schwalbe tubes are sold here" - } - ], - "multiAnswer": true, - "id": "bicycle_tube_vending_machine-brand" - }, - { - "question": "Who maintains this vending machine?", - "render": "This vending machine is maintained by {operator}", - "mappings": [ - { - "if": "operator=Schwalbe", - "then": "Maintained by Schwalbe" - }, - { - "if": "operator=Continental", - "then": "Maintained by Continental" - } - ], - "freeform": { - "key": "operator" - }, - "id": "bicycle_tube_vending_machine-operator" - }, - { - "id": "bicycle_tube_vending_maching-other-items", - "question": "Are other bicycle bicycle accessories sold here?", - "mappings": [ - { - "if": "vending:bicycle_light=yes", - "ifnot": "vending:bicycle_light=no", - "then": "Bicycle lights are sold here" - }, - { - "if": "vending:gloves=yes", - "ifnot": "vending:gloves=no", - "then": "Gloves are sold here" - }, - { - "if": "vending:bicycle_repair_kit=yes", - "ifnot": "vending:bicycle_repair_kit=no", - "then": "Bicycle repair kits are sold here" - }, - { - "if": "vending:bicycle_pump=yes", - "ifnot": "vending:bicycle_pump=no", - "then": "Bicycle pumps are sold here" - }, - { - "if": "vending:bicycle_lock=yes", - "ifnot": "vending:bicycle_lock=no", - "then": "Bicycle locks are sold here" - } - ], - "multiAnswer": true - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity:={amenity}", - "amenity=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + }, + "tags": [ + "amenity=vending_machine", + "vending=bicycle_tube", + "vending:bicycle_tube=yes" + ] } + ], + "tagRenderings": [ + "images", + { + "question": { + "en": "Is this vending machine still operational?", + "nl": "Is deze verkoopsautomaat nog steeds werkende?", + "fr": "Cette machine est-elle encore opérationelle ?", + "it": "Questo distributore automatico funziona ancora?", + "ru": "Этот торговый автомат все еще работает?", + "de": "Ist dieser Automat noch in Betrieb?", + "zh_Hant": "這個自動販賣機仍有運作嗎?", + "pt_BR": "Esta máquina de venda automática ainda está operacional?", + "pt": "Esta máquina de venda automática ainda está operacional?" + }, + "render": { + "en": "The operational status is {operational_status}", + "nl": "Deze verkoopsautomaat is {operational_status}", + "fr": "L'état opérationnel est {operational_status}", + "it": "Lo stato operativo è {operational_status}", + "de": "Der Betriebszustand ist {operational_status}", + "ru": "Рабочий статус: {operational_status}", + "zh_Hant": "運作狀態是 {operational_status}", + "pt_BR": "O estado operacional é: {operational_status}", + "pt": "O estado operacional é: {operational_status}" + }, + "freeform": { + "key": "operational_status" + }, + "mappings": [ + { + "if": "operational_status=", + "then": { + "en": "This vending machine works", + "nl": "Deze verkoopsautomaat werkt", + "fr": "Le distributeur automatique fonctionne", + "hu": "Az automata működik", + "it": "Il distributore automatico funziona", + "ru": "Этот торговый автомат работает", + "zh_Hans": "这个借还机正常工作", + "de": "Dieser Automat funktioniert", + "zh_Hant": "這個自動販賣機仍運作", + "pt_BR": "Esta máquina de venda automática funciona", + "pt": "Esta máquina de venda automática funciona" + } + }, + { + "if": "operational_status=broken", + "then": { + "en": "This vending machine is broken", + "nl": "Deze verkoopsautomaat is kapot", + "fr": "Le distributeur automatique est en panne", + "hu": "Az automata elromlott", + "it": "Il distributore automatico è guasto", + "ru": "Этот торговый автомат сломан", + "zh_Hans": "这个借还机已经损坏", + "de": "Dieser Automat ist kaputt", + "zh_Hant": "這個自動販賣機沒有運作了", + "pt_BR": "Esta máquina de venda automática está quebrada", + "pt": "Esta máquina de venda automática está quebrada" + } + }, + { + "if": "operational_status=closed", + "then": { + "en": "This vending machine is closed", + "nl": "Deze verkoopsautomaat is uitgeschakeld", + "fr": "Le distributeur automatique est fermé", + "hu": "Az automata zárva van", + "it": "Il distributore automatico è spento", + "ru": "Этот торговый автомат закрыт", + "zh_Hans": "这个借还机被关闭了", + "de": "Dieser Automat ist geschlossen", + "zh_Hant": "這個自動販賣機已經關閉了", + "pt_BR": "Esta máquina de venda automática está fechada", + "pt": "Esta máquina de venda automática está fechada" + } + } + ], + "id": "Still in use?" + }, + { + "question": "How much does a bicycle tube cost?", + "render": "A bicycle tube costs {charge}", + "freeform": { + "key": "charge" + }, + "id": "bicycle_tube_vending_machine-charge" + }, + { + "id": "vending-machine-payment-methods", + "question": "How can one pay at this tube vending machine?", + "mappings": [ + { + "if": "payment:coins=yes", + "ifnot": "payment:coins=no", + "then": "Payment with coins is possible" + }, + { + "if": "payment:notes=yes", + "ifnot": "payment:notes=no", + "then": "Payment with notes is possible" + }, + { + "if": "payment:cards=yes", + "ifnot": "payment:cards=no", + "then": "Payment with cards is possible" + } + ], + "multiAnswer": true + }, + { + "question": "Which brand of tubes are sold here?", + "freeform": { + "key": "brand" + }, + "render": "{brand} tubes are sold here", + "mappings": [ + { + "if": "brand=Continental", + "then": "Continental tubes are sold here" + }, + { + "if": "brand=Schwalbe", + "then": "Schwalbe tubes are sold here" + } + ], + "multiAnswer": true, + "id": "bicycle_tube_vending_machine-brand" + }, + { + "question": "Who maintains this vending machine?", + "render": "This vending machine is maintained by {operator}", + "mappings": [ + { + "if": "operator=Schwalbe", + "then": "Maintained by Schwalbe" + }, + { + "if": "operator=Continental", + "then": "Maintained by Continental" + } + ], + "freeform": { + "key": "operator" + }, + "id": "bicycle_tube_vending_machine-operator" + }, + { + "id": "bicycle_tube_vending_maching-other-items", + "question": "Are other bicycle bicycle accessories sold here?", + "mappings": [ + { + "if": "vending:bicycle_light=yes", + "ifnot": "vending:bicycle_light=no", + "then": "Bicycle lights are sold here" + }, + { + "if": "vending:gloves=yes", + "ifnot": "vending:gloves=no", + "then": "Gloves are sold here" + }, + { + "if": "vending:bicycle_repair_kit=yes", + "ifnot": "vending:bicycle_repair_kit=no", + "then": "Bicycle repair kits are sold here" + }, + { + "if": "vending:bicycle_pump=yes", + "ifnot": "vending:bicycle_pump=no", + "then": "Bicycle pumps are sold here" + }, + { + "if": "vending:bicycle_lock=yes", + "ifnot": "vending:bicycle_lock=no", + "then": "Bicycle locks are sold here" + } + ], + "multiAnswer": true + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity:={amenity}", + "amenity=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { + "render": "pin:#ffffff;./assets/layers/bicycle_tube_vending_machine/pinIcon.svg" + }, + "iconBadges": [ + { + "if": { + "or": [ + "operational_status=broken", + "operational_status=closed" + ] + }, + "then": "close:#c33" + } + ], + "iconSize": "50,50,bottom", + "location": [ + "point", + "centroid" + ] + }, + { + "color": "#6bc4f7" + } + ] } \ No newline at end of file diff --git a/assets/layers/bike_cafe/bike_cafe.json b/assets/layers/bike_cafe/bike_cafe.json index c3b328beb8..62fb4c4f6b 100644 --- a/assets/layers/bike_cafe/bike_cafe.json +++ b/assets/layers/bike_cafe/bike_cafe.json @@ -1,369 +1,378 @@ { - "id": "bike_cafe", - "name": { + "id": "bike_cafe", + "name": { + "en": "Bike cafe", + "nl": "Fietscafé", + "fr": "Café vélo", + "gl": "Café de ciclistas", + "de": "Fahrrad-Café", + "it": "Caffè in bici", + "zh_Hans": "自行车咖啡", + "ru": "Велосипедное кафе", + "zh_Hant": "單車咖啡廳", + "pt_BR": "Café de bicicletas", + "pt": "Café de bicicletas" + }, + "minzoom": 13, + "source": { + "osmTags": { + "and": [ + { + "or": [ + "amenity=pub", + "amenity=bar", + "amenity=cafe", + "amenity=restaurant" + ] + }, + { + "#": "Note the double tilde in 'service:bicycle' which interprets the key as regex too", + "or": [ + "pub=cycling", + "pub=bicycle", + "theme=cycling", + "theme=bicycle", + "service:bicycle:.*~~*" + ] + } + ] + } + }, + "title": { + "render": { + "en": "Bike cafe", + "nl": "Fietscafé", + "fr": "Café Vélo", + "gl": "Café de ciclistas", + "de": "Fahrrad-Café", + "it": "Caffè in bici", + "zh_Hans": "自行车咖啡", + "ru": "Велосипедное кафе", + "zh_Hant": "單車咖啡廳", + "pt_BR": "Café de bicicleta", + "pt": "Café de bicicleta" + }, + "mappings": [ + { + "if": "name~*", + "then": { + "en": "Bike cafe {name}", + "nl": "Fietscafé {name}", + "fr": "Café Vélo {name}", + "gl": "Café de ciclistas {name}", + "de": "Fahrrad-Café {name}", + "it": "Caffè in bici {name}", + "zh_Hans": "自行车咖啡 {name}", + "ru": "Велосипедное кафе {name}", + "zh_Hant": "單車咖啡廳{name}", + "pt_BR": "Café de bicicleta {name}", + "pt": "Café de bicicleta {name}" + } + } + ] + }, + "tagRenderings": [ + "images", + { + "question": { + "en": "What is the name of this bike cafe?", + "nl": "Wat is de naam van dit fietscafé?", + "fr": "Quel est le nom de ce Café vélo ?", + "gl": "Cal é o nome deste café de ciclistas?", + "de": "Wie heißt dieses Fahrrad-Café?", + "it": "Qual è il nome di questo caffè in bici?", + "zh_Hans": "这个自行车咖啡的名字是什么?", + "ru": "Как называется это байк-кафе?", + "zh_Hant": "這個單車咖啡廳的名稱是?", + "pt_BR": "Qual o nome deste café de bicicleta?", + "pt": "Qual o nome deste café de bicicleta?" + }, + "render": { + "en": "This bike cafe is called {name}", + "nl": "Dit fietscafé heet {name}", + "fr": "Ce Café vélo s'appelle {name}", + "gl": "Este café de ciclistas chámase {name}", + "de": "Dieses Fahrrad-Café heißt {name}", + "it": "Questo caffè in bici è chiamato {name}", + "zh_Hans": "这家自行车咖啡叫做 {name}", + "ru": "Это велосипедное кафе называется {name}", + "zh_Hant": "這個單車咖啡廳叫做 {name}", + "pt_BR": "Este café de bicicleta se chama {name}", + "pt": "Este café de bicicleta se chama {name}" + }, + "freeform": { + "key": "name" + }, + "id": "bike_cafe-name" + }, + { + "id": "bike_cafe-bike-pump", + "question": { + "en": "Does this bike cafe offer a bike pump for use by anyone?", + "nl": "Biedt dit fietscafé een fietspomp aan voor iedereen?", + "fr": "Est-ce que ce Café vélo propose une pompe en libre accès ?", + "gl": "Este café de ciclistas ofrece unha bomba de ar para que calquera persoa poida usala?", + "de": "Bietet dieses Fahrrad-Café eine Fahrradpumpe an, die von jedem benutzt werden kann?", + "it": "Questo caffè in bici offre una pompa per bici che chiunque può utilizzare?", + "zh_Hans": "这家自行车咖啡为每个使用者提供打气筒吗?", + "ru": "Есть ли в этом велосипедном кафе велосипедный насос для всеобщего использования?", + "zh_Hant": "這個單車咖啡廳有提供給任何人都能使用的單車打氣甬嗎?" + }, + "mappings": [ + { + "if": "service:bicycle:pump=yes", + "then": { + "en": "This bike cafe offers a bike pump for anyone", + "nl": "Dit fietscafé biedt een fietspomp aan voor eender wie", + "fr": "Ce Café vélo offre une pompe en libre accès", + "gl": "Este café de ciclistas ofrece unha bomba de ar", + "de": "Dieses Fahrrad-Café bietet eine Fahrradpumpe an, die von jedem benutzt werden kann", + "it": "Questo caffè in bici offre una pompa per bici liberamente utilizzabile", + "zh_Hans": "这家自行车咖啡为每个人提供打气筒", + "zh_Hant": "這個單車咖啡廳有提供給任何人都能使用的單車打氣甬", + "ru": "В этом велосипедном кафе есть велосипедный насос для всеобщего использования" + } + }, + { + "if": "service:bicycle:pump=no", + "then": { + "en": "This bike cafe doesn't offer a bike pump for anyone", + "nl": "Dit fietscafé biedt geen fietspomp aan voor iedereen", + "fr": "Ce Café vélo n'offre pas de pompe en libre accès", + "gl": "Este café de ciclistas non ofrece unha bomba de ar", + "de": "Dieses Fahrrad-Café bietet keine Fahrradpumpe an, die von jedem benutzt werden kann", + "it": "Questo caffè in bici non offre una pompa per bici liberamente utilizzabile", + "zh_Hans": "这家自行车咖啡不为每个人提供打气筒", + "zh_Hant": "這個單車咖啡廳並沒有為所有人提供單車打氣甬", + "ru": "В этом велосипедном кафе нет велосипедного насоса для всеобщего использования" + } + } + ] + }, + { + "id": "bike_cafe-repair-tools", + "question": { + "en": "Are there tools here to repair your own bike?", + "nl": "Biedt dit fietscafé gereedschap aan om je fiets zelf te herstellen?", + "fr": "Est-ce qu'il y a des outils pour réparer soi-même son vélo ?", + "gl": "Hai ferramentas aquí para arranxar a túa propia bicicleta?", + "de": "Gibt es hier Werkzeuge, um das eigene Fahrrad zu reparieren?", + "it": "Ci sono degli strumenti per riparare la propria bicicletta?", + "zh_Hans": "这里有供你修车用的工具吗?", + "zh_Hant": "這裡是否有工具修理你的單車嗎?", + "ru": "Есть ли здесь инструменты для починки вашего велосипеда?", + "pt_BR": "Há ferramentas aqui para consertar sua bicicleta?", + "pt": "Há ferramentas aqui para consertar a sua própria bicicleta?" + }, + "mappings": [ + { + "if": "service:bicycle:diy=yes", + "then": { + "en": "This bike cafe offers tools for DIY repair", + "nl": "Dit fietscafé biedt gereedschap aan om je fiets zelf te herstellen", + "fr": "Ce Café vélo propose des outils pour réparer son vélo soi-même", + "gl": "Hai ferramentas aquí para arranxar a túa propia bicicleta", + "de": "Dieses Fahrrad-Café bietet Werkzeuge für die selbständige Reparatur an", + "it": "Questo caffè in bici fornisce degli attrezzi per la riparazione fai-da-te", + "zh_Hans": "这家自行车咖啡为DIY修理者提供工具", + "zh_Hant": "這個單車咖啡廳提供工具讓你修理", + "ru": "В этом велосипедном кафе есть инструменты для починки своего велосипеда", + "pt_BR": "Este café de bicicleta oferece ferramentas de reparo faça você mesmo", + "pt": "Este café de bicicleta oferece ferramentas de reparo faça você mesmo" + } + }, + { + "if": "service:bicycle:diy=no", + "then": { + "en": "This bike cafe doesn't offer tools for DIY repair", + "nl": "Dit fietscafé biedt geen gereedschap aan om je fiets zelf te herstellen", + "fr": "Ce Café vélo ne propose pas d'outils pour réparer son vélo soi-même", + "gl": "Non hai ferramentas aquí para arranxar a túa propia bicicleta", + "de": "Dieses Fahrrad-Café bietet keine Werkzeuge für die selbständige Reparatur an", + "it": "Questo caffè in bici non fornisce degli attrezzi per la riparazione fai-da-te", + "zh_Hans": "这家自行车咖啡不为DIY修理者提供工具", + "zh_Hant": "這個單車咖啡廳並沒有提供工具讓你修理", + "ru": "В этом велосипедном кафе нет инструментов для починки своего велосипеда", + "pt_BR": "Este café de bicicleta não oferece ferramentas de reparo faça você mesmo", + "pt": "Este café de bicicleta não oferece ferramentas de reparo faça você mesmo" + } + } + ] + }, + { + "id": "bike_cafe-repair-service", + "question": { + "en": "Does this bike cafe repair bikes?", + "nl": "Herstelt dit fietscafé fietsen?", + "fr": "Est-ce que ce Café vélo répare les vélos ?", + "gl": "Este café de ciclistas arranxa bicicletas?", + "de": "Repariert dieses Fahrrad-Café Fahrräder?", + "it": "Questo caffè in bici ripara le bici?", + "zh_Hans": "这家自行车咖啡t提供修车服务吗?", + "zh_Hant": "這個單車咖啡廳是否能修理單車?", + "ru": "Есть ли услуги ремонта велосипедов в этом велосипедном кафе?", + "pt_BR": "Este café de bicicleta conserta bicicletas?", + "pt": "Este café de bicicleta conserta bicicletas?" + }, + "mappings": [ + { + "if": "service:bicycle:repair=yes", + "then": { + "en": "This bike cafe repairs bikes", + "nl": "Dit fietscafé herstelt fietsen", + "fr": "Ce Café vélo répare les vélos", + "gl": "Este café de ciclistas arranxa bicicletas", + "de": "Dieses Fahrrad-Café repariert Fahrräder", + "it": "Questo caffè in bici ripara le bici", + "zh_Hans": "这家自行车咖啡可以修车", + "zh_Hant": "這個單車咖啡廳修理單車", + "ru": "В этом велосипедном кафе есть услуги ремонта велосипедов", + "pt_BR": "Este café de bicicleta conserta bicicletas", + "pt": "Este café de bicicleta conserta bicicletas" + } + }, + { + "if": "service:bicycle:repair=no", + "then": { + "en": "This bike cafe doesn't repair bikes", + "nl": "Dit fietscafé herstelt geen fietsen", + "fr": "Ce Café vélo ne répare pas les vélos", + "gl": "Este café de ciclistas non arranxa bicicletas", + "de": "Dieses Fahrrad-Café repariert keine Fahrräder", + "it": "Questo caffè in bici non ripara le bici", + "zh_Hans": "这家自行车咖啡不能修车", + "zh_Hant": "這個單車咖啡廳並不修理單車", + "ru": "В этом велосипедном кафе нет услуг ремонта велосипедов", + "pt_BR": "Este café de bicicleta não conserta bicicletas", + "pt": "Este café de bicicleta não conserta bicicletas" + } + } + ] + }, + { + "question": { + "en": "What is the website of {name}?", + "nl": "Wat is de website van {name}?", + "fr": "Quel est le site web de {name} ?", + "gl": "Cal é a páxina web de {name}?", + "de": "Was ist die Webseite von {name}?", + "it": "Qual è il sito web di {name}?", + "ru": "Какой сайт у {name}?", + "zh_Hans": "{name}的网站是什么?", + "zh_Hant": "{name} 的網站是?", + "pt_BR": "Qual o website de {name}?", + "pt": "Qual o website de {name}?" + }, + "render": "{website}", + "freeform": { + "key": "website" + }, + "id": "bike_cafe-website" + }, + { + "question": { + "en": "What is the phone number of {name}?", + "nl": "Wat is het telefoonnummer van {name}?", + "fr": "Quel est le numéro de téléphone de {name} ?", + "gl": "Cal é o número de teléfono de {name}?", + "de": "Wie lautet die Telefonnummer von {name}?", + "it": "Qual è il numero di telefono di {name}?", + "ru": "Какой номер телефона у {name}?", + "zh_Hans": "{name}的电话号码是什么?", + "zh_Hant": "{name} 的電話號碼是?", + "pt_BR": "Qual o número de telefone de {name}?", + "pt": "Qual é o número de telefone de {name}?" + }, + "render": "{phone}", + "freeform": { + "key": "phone", + "type": "phone" + }, + "id": "bike_cafe-phone" + }, + { + "question": { + "en": "What is the email address of {name}?", + "nl": "Wat is het email-adres van {name}?", + "fr": "Quelle est l'adresse électronique de {name} ?", + "gl": "Cal é o enderezo de correo electrónico de {name}?", + "de": "Wie lautet die E-Mail-Adresse von {name}?", + "it": "Qual è l’indirizzo email di {name}?", + "ru": "Какой адрес электронной почты у {name}?", + "zh_Hans": "{name}的电子邮箱是什么?", + "zh_Hant": "{name} 的電子郵件地址是?", + "pt_BR": "Qual o endereço de email de {name}?", + "pt": "Qual o endereço de email de {name}?" + }, + "render": "{email}", + "freeform": { + "key": "email", + "type": "email" + }, + "id": "bike_cafe-email" + }, + { + "question": { + "en": "When it this bike café opened?", + "nl": "Wanneer is dit fietscafé geopend?", + "fr": "Quand ce Café vélo est-t-il ouvert ?", + "it": "Quando è aperto questo caffè in bici?", + "zh_Hans": "这家自行车咖啡什么时候开门营业?", + "zh_Hant": "何時這個單車咖啡廳營運?", + "ru": "Каков режим работы этого велосипедного кафе?", + "pt_BR": "Quando este café de bicicleta abre?", + "de": "Wann ist dieses Fahrradcafé geöffnet?", + "pt": "Quando este café de bicicleta abre?" + }, + "render": "{opening_hours_table(opening_hours)}", + "freeform": { + "key": "opening_hours", + "type": "opening_hours" + }, + "id": "bike_cafe-opening_hours" + } + ], + "presets": [ + { + "title": { "en": "Bike cafe", "nl": "Fietscafé", - "fr": "Café vélo", + "fr": "Café Vélo", "gl": "Café de ciclistas", "de": "Fahrrad-Café", "it": "Caffè in bici", "zh_Hans": "自行车咖啡", - "ru": "Велосипедное кафе", "zh_Hant": "單車咖啡廳", - "pt_BR": "Café de bicicletas", - "pt": "Café de bicicletas" - }, - "minzoom": 13, - "source": { - "osmTags": { - "and": [ - { - "or": [ - "amenity=pub", - "amenity=bar", - "amenity=cafe", - "amenity=restaurant" - ] - }, - { - "#": "Note the double tilde in 'service:bicycle' which interprets the key as regex too", - "or": [ - "pub=cycling", - "pub=bicycle", - "theme=cycling", - "theme=bicycle", - "service:bicycle:.*~~*" - ] - } - ] - } - }, - "title": { - "render": { - "en": "Bike cafe", - "nl": "Fietscafé", - "fr": "Café Vélo", - "gl": "Café de ciclistas", - "de": "Fahrrad-Café", - "it": "Caffè in bici", - "zh_Hans": "自行车咖啡", - "ru": "Велосипедное кафе", - "zh_Hant": "單車咖啡廳", - "pt_BR": "Café de bicicleta", - "pt": "Café de bicicleta" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "en": "Bike cafe {name}", - "nl": "Fietscafé {name}", - "fr": "Café Vélo {name}", - "gl": "Café de ciclistas {name}", - "de": "Fahrrad-Café {name}", - "it": "Caffè in bici {name}", - "zh_Hans": "自行车咖啡 {name}", - "ru": "Велосипедное кафе {name}", - "zh_Hant": "單車咖啡廳{name}", - "pt_BR": "Café de bicicleta {name}", - "pt": "Café de bicicleta {name}" - } - } - ] - }, - "tagRenderings": [ - "images", - { - "question": { - "en": "What is the name of this bike cafe?", - "nl": "Wat is de naam van dit fietscafé?", - "fr": "Quel est le nom de ce Café vélo ?", - "gl": "Cal é o nome deste café de ciclistas?", - "de": "Wie heißt dieses Fahrrad-Café?", - "it": "Qual è il nome di questo caffè in bici?", - "zh_Hans": "这个自行车咖啡的名字是什么?", - "ru": "Как называется это байк-кафе?", - "zh_Hant": "這個單車咖啡廳的名稱是?", - "pt_BR": "Qual o nome deste café de bicicleta?", - "pt": "Qual o nome deste café de bicicleta?" - }, - "render": { - "en": "This bike cafe is called {name}", - "nl": "Dit fietscafé heet {name}", - "fr": "Ce Café vélo s'appelle {name}", - "gl": "Este café de ciclistas chámase {name}", - "de": "Dieses Fahrrad-Café heißt {name}", - "it": "Questo caffè in bici è chiamato {name}", - "zh_Hans": "这家自行车咖啡叫做 {name}", - "ru": "Это велосипедное кафе называется {name}", - "zh_Hant": "這個單車咖啡廳叫做 {name}", - "pt_BR": "Este café de bicicleta se chama {name}", - "pt": "Este café de bicicleta se chama {name}" - }, - "freeform": { - "key": "name" - }, - "id": "bike_cafe-name" - }, - { - "id": "bike_cafe-bike-pump", - "question": { - "en": "Does this bike cafe offer a bike pump for use by anyone?", - "nl": "Biedt dit fietscafé een fietspomp aan voor iedereen?", - "fr": "Est-ce que ce Café vélo propose une pompe en libre accès ?", - "gl": "Este café de ciclistas ofrece unha bomba de ar para que calquera persoa poida usala?", - "de": "Bietet dieses Fahrrad-Café eine Fahrradpumpe an, die von jedem benutzt werden kann?", - "it": "Questo caffè in bici offre una pompa per bici che chiunque può utilizzare?", - "zh_Hans": "这家自行车咖啡为每个使用者提供打气筒吗?", - "ru": "Есть ли в этом велосипедном кафе велосипедный насос для всеобщего использования?", - "zh_Hant": "這個單車咖啡廳有提供給任何人都能使用的單車打氣甬嗎?" - }, - "mappings": [ - { - "if": "service:bicycle:pump=yes", - "then": { - "en": "This bike cafe offers a bike pump for anyone", - "nl": "Dit fietscafé biedt een fietspomp aan voor eender wie", - "fr": "Ce Café vélo offre une pompe en libre accès", - "gl": "Este café de ciclistas ofrece unha bomba de ar", - "de": "Dieses Fahrrad-Café bietet eine Fahrradpumpe an, die von jedem benutzt werden kann", - "it": "Questo caffè in bici offre una pompa per bici liberamente utilizzabile", - "zh_Hans": "这家自行车咖啡为每个人提供打气筒", - "zh_Hant": "這個單車咖啡廳有提供給任何人都能使用的單車打氣甬", - "ru": "В этом велосипедном кафе есть велосипедный насос для всеобщего использования" - } - }, - { - "if": "service:bicycle:pump=no", - "then": { - "en": "This bike cafe doesn't offer a bike pump for anyone", - "nl": "Dit fietscafé biedt geen fietspomp aan voor iedereen", - "fr": "Ce Café vélo n'offre pas de pompe en libre accès", - "gl": "Este café de ciclistas non ofrece unha bomba de ar", - "de": "Dieses Fahrrad-Café bietet keine Fahrradpumpe an, die von jedem benutzt werden kann", - "it": "Questo caffè in bici non offre una pompa per bici liberamente utilizzabile", - "zh_Hans": "这家自行车咖啡不为每个人提供打气筒", - "zh_Hant": "這個單車咖啡廳並沒有為所有人提供單車打氣甬", - "ru": "В этом велосипедном кафе нет велосипедного насоса для всеобщего использования" - } - } - ] - }, - { - "id": "bike_cafe-repair-tools", - "question": { - "en": "Are there tools here to repair your own bike?", - "nl": "Biedt dit fietscafé gereedschap aan om je fiets zelf te herstellen?", - "fr": "Est-ce qu'il y a des outils pour réparer soi-même son vélo ?", - "gl": "Hai ferramentas aquí para arranxar a túa propia bicicleta?", - "de": "Gibt es hier Werkzeuge, um das eigene Fahrrad zu reparieren?", - "it": "Ci sono degli strumenti per riparare la propria bicicletta?", - "zh_Hans": "这里有供你修车用的工具吗?", - "zh_Hant": "這裡是否有工具修理你的單車嗎?", - "ru": "Есть ли здесь инструменты для починки вашего велосипеда?", - "pt_BR": "Há ferramentas aqui para consertar sua bicicleta?", - "pt": "Há ferramentas aqui para consertar a sua própria bicicleta?" - }, - "mappings": [ - { - "if": "service:bicycle:diy=yes", - "then": { - "en": "This bike cafe offers tools for DIY repair", - "nl": "Dit fietscafé biedt gereedschap aan om je fiets zelf te herstellen", - "fr": "Ce Café vélo propose des outils pour réparer son vélo soi-même", - "gl": "Hai ferramentas aquí para arranxar a túa propia bicicleta", - "de": "Dieses Fahrrad-Café bietet Werkzeuge für die selbständige Reparatur an", - "it": "Questo caffè in bici fornisce degli attrezzi per la riparazione fai-da-te", - "zh_Hans": "这家自行车咖啡为DIY修理者提供工具", - "zh_Hant": "這個單車咖啡廳提供工具讓你修理", - "ru": "В этом велосипедном кафе есть инструменты для починки своего велосипеда", - "pt_BR": "Este café de bicicleta oferece ferramentas de reparo faça você mesmo", - "pt": "Este café de bicicleta oferece ferramentas de reparo faça você mesmo" - } - }, - { - "if": "service:bicycle:diy=no", - "then": { - "en": "This bike cafe doesn't offer tools for DIY repair", - "nl": "Dit fietscafé biedt geen gereedschap aan om je fiets zelf te herstellen", - "fr": "Ce Café vélo ne propose pas d'outils pour réparer son vélo soi-même", - "gl": "Non hai ferramentas aquí para arranxar a túa propia bicicleta", - "de": "Dieses Fahrrad-Café bietet keine Werkzeuge für die selbständige Reparatur an", - "it": "Questo caffè in bici non fornisce degli attrezzi per la riparazione fai-da-te", - "zh_Hans": "这家自行车咖啡不为DIY修理者提供工具", - "zh_Hant": "這個單車咖啡廳並沒有提供工具讓你修理", - "ru": "В этом велосипедном кафе нет инструментов для починки своего велосипеда", - "pt_BR": "Este café de bicicleta não oferece ferramentas de reparo faça você mesmo", - "pt": "Este café de bicicleta não oferece ferramentas de reparo faça você mesmo" - } - } - ] - }, - { - "id": "bike_cafe-repair-service", - "question": { - "en": "Does this bike cafe repair bikes?", - "nl": "Herstelt dit fietscafé fietsen?", - "fr": "Est-ce que ce Café vélo répare les vélos ?", - "gl": "Este café de ciclistas arranxa bicicletas?", - "de": "Repariert dieses Fahrrad-Café Fahrräder?", - "it": "Questo caffè in bici ripara le bici?", - "zh_Hans": "这家自行车咖啡t提供修车服务吗?", - "zh_Hant": "這個單車咖啡廳是否能修理單車?", - "ru": "Есть ли услуги ремонта велосипедов в этом велосипедном кафе?", - "pt_BR": "Este café de bicicleta conserta bicicletas?", - "pt": "Este café de bicicleta conserta bicicletas?" - }, - "mappings": [ - { - "if": "service:bicycle:repair=yes", - "then": { - "en": "This bike cafe repairs bikes", - "nl": "Dit fietscafé herstelt fietsen", - "fr": "Ce Café vélo répare les vélos", - "gl": "Este café de ciclistas arranxa bicicletas", - "de": "Dieses Fahrrad-Café repariert Fahrräder", - "it": "Questo caffè in bici ripara le bici", - "zh_Hans": "这家自行车咖啡可以修车", - "zh_Hant": "這個單車咖啡廳修理單車", - "ru": "В этом велосипедном кафе есть услуги ремонта велосипедов", - "pt_BR": "Este café de bicicleta conserta bicicletas", - "pt": "Este café de bicicleta conserta bicicletas" - } - }, - { - "if": "service:bicycle:repair=no", - "then": { - "en": "This bike cafe doesn't repair bikes", - "nl": "Dit fietscafé herstelt geen fietsen", - "fr": "Ce Café vélo ne répare pas les vélos", - "gl": "Este café de ciclistas non arranxa bicicletas", - "de": "Dieses Fahrrad-Café repariert keine Fahrräder", - "it": "Questo caffè in bici non ripara le bici", - "zh_Hans": "这家自行车咖啡不能修车", - "zh_Hant": "這個單車咖啡廳並不修理單車", - "ru": "В этом велосипедном кафе нет услуг ремонта велосипедов", - "pt_BR": "Este café de bicicleta não conserta bicicletas", - "pt": "Este café de bicicleta não conserta bicicletas" - } - } - ] - }, - { - "question": { - "en": "What is the website of {name}?", - "nl": "Wat is de website van {name}?", - "fr": "Quel est le site web de {name} ?", - "gl": "Cal é a páxina web de {name}?", - "de": "Was ist die Webseite von {name}?", - "it": "Qual è il sito web di {name}?", - "ru": "Какой сайт у {name}?", - "zh_Hans": "{name}的网站是什么?", - "zh_Hant": "{name} 的網站是?", - "pt_BR": "Qual o website de {name}?", - "pt": "Qual o website de {name}?" - }, - "render": "{website}", - "freeform": { - "key": "website" - }, - "id": "bike_cafe-website" - }, - { - "question": { - "en": "What is the phone number of {name}?", - "nl": "Wat is het telefoonnummer van {name}?", - "fr": "Quel est le numéro de téléphone de {name} ?", - "gl": "Cal é o número de teléfono de {name}?", - "de": "Wie lautet die Telefonnummer von {name}?", - "it": "Qual è il numero di telefono di {name}?", - "ru": "Какой номер телефона у {name}?", - "zh_Hans": "{name}的电话号码是什么?", - "zh_Hant": "{name} 的電話號碼是?", - "pt_BR": "Qual o número de telefone de {name}?", - "pt": "Qual é o número de telefone de {name}?" - }, - "render": "{phone}", - "freeform": { - "key": "phone", - "type": "phone" - }, - "id": "bike_cafe-phone" - }, - { - "question": { - "en": "What is the email address of {name}?", - "nl": "Wat is het email-adres van {name}?", - "fr": "Quelle est l'adresse électronique de {name} ?", - "gl": "Cal é o enderezo de correo electrónico de {name}?", - "de": "Wie lautet die E-Mail-Adresse von {name}?", - "it": "Qual è l’indirizzo email di {name}?", - "ru": "Какой адрес электронной почты у {name}?", - "zh_Hans": "{name}的电子邮箱是什么?", - "zh_Hant": "{name} 的電子郵件地址是?", - "pt_BR": "Qual o endereço de email de {name}?", - "pt": "Qual o endereço de email de {name}?" - }, - "render": "{email}", - "freeform": { - "key": "email", - "type": "email" - }, - "id": "bike_cafe-email" - }, - { - "question": { - "en": "When it this bike café opened?", - "nl": "Wanneer is dit fietscafé geopend?", - "fr": "Quand ce Café vélo est-t-il ouvert ?", - "it": "Quando è aperto questo caffè in bici?", - "zh_Hans": "这家自行车咖啡什么时候开门营业?", - "zh_Hant": "何時這個單車咖啡廳營運?", - "ru": "Каков режим работы этого велосипедного кафе?", - "pt_BR": "Quando este café de bicicleta abre?", - "de": "Wann ist dieses Fahrradcafé geöffnet?", - "pt": "Quando este café de bicicleta abre?" - }, - "render": "{opening_hours_table(opening_hours)}", - "freeform": { - "key": "opening_hours", - "type": "opening_hours" - }, - "id": "bike_cafe-opening_hours" - } - ], - "icon": { + "ru": "Велосипедное кафе", + "pt_BR": "Café de bicicleta", + "pt": "Café de bicicleta" + }, + "tags": [ + "amenity=pub", + "pub=cycling" + ] + } + ], + "mapRendering": [ + { + "icon": { "render": "./assets/layers/bike_cafe/bike_cafe.svg" - }, - "width": { - "render": "2" - }, - "iconSize": { + }, + "iconSize": { "render": "50,50,bottom" + }, + "location": [ + "point", + "centroid" + ] }, - "color": { + { + "color": { "render": "#694E2D" - }, - "presets": [ - { - "title": { - "en": "Bike cafe", - "nl": "Fietscafé", - "fr": "Café Vélo", - "gl": "Café de ciclistas", - "de": "Fahrrad-Café", - "it": "Caffè in bici", - "zh_Hans": "自行车咖啡", - "zh_Hant": "單車咖啡廳", - "ru": "Велосипедное кафе", - "pt_BR": "Café de bicicleta", - "pt": "Café de bicicleta" - }, - "tags": [ - "amenity=pub", - "pub=cycling" - ] - } - ], - "wayHandling": 2 + }, + "width": { + "render": "2" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/bike_cleaning/bike_cleaning.json b/assets/layers/bike_cleaning/bike_cleaning.json index 9e39755c77..9c32e7fb6b 100644 --- a/assets/layers/bike_cleaning/bike_cleaning.json +++ b/assets/layers/bike_cleaning/bike_cleaning.json @@ -1,6 +1,55 @@ { - "id": "bike_cleaning", - "name": { + "id": "bike_cleaning", + "name": { + "en": "Bike cleaning service", + "nl": "Fietsschoonmaakpunt", + "fr": "Service de nettoyage de vélo", + "it": "Servizio lavaggio bici", + "de": "Fahrrad-Reinigungsdienst", + "zh_Hant": "單車清理服務", + "pt_BR": "Serviço de limpeza de bicicletas", + "pt": "Serviço de limpeza de bicicletas" + }, + "title": { + "render": { + "en": "Bike cleaning service", + "nl": "Fietsschoonmaakpunt", + "fr": "Service de nettoyage de vélo", + "it": "Servizio lavaggio bici", + "de": "Fahrrad-Reinigungsdienst", + "zh_Hant": "單車清理服務", + "pt_BR": "Serviço de limpeza de bicicletas", + "pt": "Serviço de limpeza de bicicletas" + }, + "mappings": [ + { + "if": "name~*", + "then": { + "en": "Bike cleaning service {name}", + "nl": "Fietsschoonmaakpunt {name}", + "fr": "Service de nettoyage de vélo {name}", + "it": "Servizio lavaggio bici {name}", + "de": "Fahrrad-Reinigungsdienst{name}", + "zh_Hant": "單車清理服務 {name}", + "pt_BR": "Serviço de limpeza de bicicletas {name}", + "pt": "Serviço de limpeza de bicicletas {name}" + } + } + ] + }, + "source": { + "osmTags": { + "or": [ + "service:bicycle:cleaning=yes", + "service:bicycle:cleaning=diy", + "amenity=bicycle_wash" + ] + } + }, + "minzoom": 13, + "presets": [ + { + "title": { "en": "Bike cleaning service", "nl": "Fietsschoonmaakpunt", "fr": "Service de nettoyage de vélo", @@ -9,153 +58,132 @@ "zh_Hant": "單車清理服務", "pt_BR": "Serviço de limpeza de bicicletas", "pt": "Serviço de limpeza de bicicletas" - }, - "title": { - "render": { - "en": "Bike cleaning service", - "nl": "Fietsschoonmaakpunt", - "fr": "Service de nettoyage de vélo", - "it": "Servizio lavaggio bici", - "de": "Fahrrad-Reinigungsdienst", - "zh_Hant": "單車清理服務", - "pt_BR": "Serviço de limpeza de bicicletas", - "pt": "Serviço de limpeza de bicicletas" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "en": "Bike cleaning service {name}", - "nl": "Fietsschoonmaakpunt {name}", - "fr": "Service de nettoyage de vélo {name}", - "it": "Servizio lavaggio bici {name}", - "de": "Fahrrad-Reinigungsdienst{name}", - "zh_Hant": "單車清理服務 {name}", - "pt_BR": "Serviço de limpeza de bicicletas {name}", - "pt": "Serviço de limpeza de bicicletas {name}" - } - } - ] - }, - "icon": { - "render": "./assets/layers/bike_cleaning/bike_cleaning.svg" - }, - "iconSize": "50,50,bottom", - "source": { - "osmTags": { - "or": [ - "service:bicycle:cleaning=yes", - "service:bicycle:cleaning=diy", - "amenity=bicycle_wash" - ] - } - }, - "minzoom": 13, - "wayHandling": 1, - "presets": [ - { - "title": { - "en": "Bike cleaning service", - "nl": "Fietsschoonmaakpunt", - "fr": "Service de nettoyage de vélo", - "it": "Servizio lavaggio bici", - "de": "Fahrrad-Reinigungsdienst", - "zh_Hant": "單車清理服務", - "pt_BR": "Serviço de limpeza de bicicletas", - "pt": "Serviço de limpeza de bicicletas" - }, - "tags": [ - "amenity=bicycle_wash" - ] - } - ], - "color": "#6bc4f7", - "iconOverlays": [ - { - "if": { - "and": [ - "service:bicycle:cleaning~*", - "amenity!=bike_wash" - ] - }, - "then": { - "render": "./assets/layers/bike_cleaning/bike_cleaning_icon.svg" - } - } - ], - "titleIcons": [ - { - "render": "" - } - ], - "tagRenderings": [ - "images", - { - "question": "How much does it cost to use the cleaning service?", - "render": "Using the cleaning service costs {charge}", - "condition": "amenity!=bike_wash", - "freeform": { - "key": "service:bicycle:cleaning:charge", - "addExtraTags": [ - "service:bicycle:cleaning:fee=yes" - ] - }, - "mappings": [ - { - "if": "service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge=", - "then": "The cleaning service is free to use" - }, - { - "if": "service:bicycle:cleaning:fee=no&", - "then": "Free to use", - "hideInAnswer": true - }, - { - "if": "service:bicycle:cleaning:fee=yes", - "then": "The cleaning service has a fee" - } - ], - "id": "bike_cleaning-service:bicycle:cleaning:charge" - }, - { - "question": "How much does it cost to use the cleaning service?", - "render": "Using the cleaning service costs {charge}", - "condition": "amenity=bike_wash", - "freeform": { - "key": "charge", - "addExtraTags": [ - "fee=yes" - ] - }, - "mappings": [ - { - "if": "fee=no&charge=", - "then": "Free to use cleaning service" - }, - { - "if": "fee=no&", - "then": "Free to use", - "hideInAnswer": true - }, - { - "if": "fee=yes", - "then": "The cleaning service has a fee" - } - ], - "id": "bike_cleaning-charge" - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity:={amenity}", - "amenity=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + }, + "tags": [ + "amenity=bicycle_wash" + ] } + ], + "titleIcons": [ + { + "render": "" + } + ], + "tagRenderings": [ + "images", + { + "question": { + "en": "How much does it cost to use the cleaning service?" + }, + "render": { + "en": "Using the cleaning service costs {service:bicycle:cleaning:charge}" + }, + "condition": "amenity!=bike_wash", + "freeform": { + "key": "service:bicycle:cleaning:charge", + "addExtraTags": [ + "service:bicycle:cleaning:fee=yes" + ], + "inline": true + }, + "mappings": [ + { + "if": "service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge=", + "then": { + "en": "The cleaning service is free to use" + } + }, + { + "if": "service:bicycle:cleaning:fee=no", + "then": { + "en": "Free to use" + }, + "hideInAnswer": true + }, + { + "if": "service:bicycle:cleaning:fee=yes", + "then": { + "en": "The cleaning service has a fee, but the amount is not known" + } + } + ], + "id": "bike_cleaning-service:bicycle:cleaning:charge" + }, + { + "question": { + "en": "How much does it cost to use the cleaning service?" + }, + "render": { + "en": "Using the cleaning service costs {charge}" + }, + "condition": "amenity=bike_wash", + "freeform": { + "key": "charge", + "addExtraTags": [ + "fee=yes" + ] + }, + "mappings": [ + { + "if": "fee=no&charge=", + "then": { + "en": "Free to use cleaning service" + } + }, + { + "if": "fee=no", + "then": { + "en": "Free to use" + }, + "hideInAnswer": true + }, + { + "if": "fee=yes", + "then": { + "en": "The cleaning service has a fee" + } + } + ], + "id": "bike_cleaning-charge" + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity:={amenity}", + "amenity=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { + "render": "./assets/layers/bike_cleaning/bike_cleaning.svg" + }, + "iconBadges": [ + { + "if": { + "and": [ + "service:bicycle:cleaning~*", + "amenity!=bike_wash" + ] + }, + "then": { + "render": "./assets/layers/bike_cleaning/bike_cleaning_icon.svg", + "roaming": true + } + } + ], + "iconSize": "50,50,bottom", + "location": [ + "point", + "centroid" + ] + } + ] } \ No newline at end of file diff --git a/assets/layers/bike_parking/bike_parking.json b/assets/layers/bike_parking/bike_parking.json index 2f6557eeae..a66a84fa2c 100644 --- a/assets/layers/bike_parking/bike_parking.json +++ b/assets/layers/bike_parking/bike_parking.json @@ -1,6 +1,30 @@ { - "id": "bike_parking", - "name": { + "id": "bike_parking", + "name": { + "en": "Bike parking", + "nl": "Fietsparking", + "fr": "Parking à vélo", + "gl": "Aparcadoiro de bicicletas", + "de": "Fahrrad-Parkplätze", + "hu": "Kerékpáros parkoló", + "it": "Parcheggio bici", + "zh_Hant": "單車停車場", + "ru": "Велопарковка", + "pl": "Parking dla rowerów", + "pt_BR": "Estacionamento de bicicletas", + "pt": "Estacionamento de bicicletas" + }, + "minzoom": 17, + "source": { + "osmTags": { + "and": [ + "amenity=bicycle_parking" + ] + } + }, + "presets": [ + { + "title": { "en": "Bike parking", "nl": "Fietsparking", "fr": "Parking à vélo", @@ -13,544 +37,531 @@ "pl": "Parking dla rowerów", "pt_BR": "Estacionamento de bicicletas", "pt": "Estacionamento de bicicletas" - }, - "minzoom": 17, - "source": { - "osmTags": { - "and": [ - "amenity=bicycle_parking" - ] - } - }, - "icon": { - "render": "./assets/layers/bike_parking/parking.svg" - }, - "iconSize": "40,40,bottom", - "color": "#00f", - "width": "1", - "wayHandling": 2, - "presets": [ - { - "title": { - "en": "Bike parking", - "nl": "Fietsparking", - "fr": "Parking à vélo", - "gl": "Aparcadoiro de bicicletas", - "de": "Fahrrad-Parkplätze", - "hu": "Kerékpáros parkoló", - "it": "Parcheggio bici", - "zh_Hant": "單車停車場", - "ru": "Велопарковка", - "pl": "Parking dla rowerów", - "pt_BR": "Estacionamento de bicicletas", - "pt": "Estacionamento de bicicletas" - }, - "tags": [ - "amenity=bicycle_parking" - ] - } - ], - "title": { - "render": { - "en": "Bike parking", - "nl": "Fietsparking", - "fr": "Parking à vélo", - "gl": "Aparcadoiro de bicicletas", - "de": "Fahrrad-Parkplätze", - "hu": "Kerékpáros parkoló", - "it": "Parcheggio bici", - "zh_Hant": "單車停車場", - "ru": "Велопарковка", - "pl": "Parking dla rowerów", - "pt_BR": "Estacionamento de bicicletas", - "pt": "Estacionamento de bicicletas" - } - }, - "tagRenderings": [ - "images", - { - "question": { - "en": "What is the type of this bicycle parking?", - "nl": "Van welk type is deze fietsparking?", - "fr": "Quel type de parking à vélos est-ce ?", - "gl": "Que tipo de aparcadoiro de bicicletas é?", - "de": "Was ist die Art dieses Fahrrad-Parkplatzes?", - "hu": "Milyen típusú ez a kerékpáros parkoló?", - "it": "Di che tipo di parcheggio bici si tratta?", - "ru": "К какому типу относится эта велопарковка?", - "zh_Hant": "這是那種類型的單車停車場?", - "pl": "Jaki jest typ tego parkingu dla rowerów?", - "pt_BR": "Qual o tipo deste estacionamento de bicicletas?", - "pt": "Qual o tipo deste estacionamento de bicicletas?" - }, - "render": { - "en": "This is a bicycle parking of the type: {bicycle_parking}", - "nl": "Dit is een fietsparking van het type: {bicycle_parking}", - "fr": "Ceci est un parking à vélo de type {bicycle_parking}", - "gl": "Este é un aparcadoiro de bicicletas do tipo: {bicycle_parking}", - "de": "Dies ist ein Fahrrad-Parkplatz der Art: {bicycle_parking}", - "hu": "Ez egy {bicycle_parking} típusú kerékpáros parkoló", - "it": "È un parcheggio bici del tipo: {bicycle_parking}", - "zh_Hant": "這個單車停車場的類型是:{bicycle_parking}", - "ru": "Это велопарковка типа {bicycle_parking}", - "pl": "Jest to parking rowerowy typu: {bicycle_parking}", - "pt_BR": "Este é um estacionamento de bicicletas do tipo: {bicycle_parking}", - "pt": "Este é um estacionamento de bicicletas do tipo: {bicycle_parking}" - }, - "freeform": { - "key": "bicycle_parking", - "addExtraTags": [ - "fixme=Freeform used on 'bicycle_parking'-tag: possibly a wrong value" - ] - }, - "mappings": [ - { - "if": "bicycle_parking=stands", - "then": { - "en": "Staple racks ", - "nl": "Nietjes ", - "fr": "Arceaux ", - "gl": "De roda (Stands) ", - "de": "Fahrradbügel ", - "hu": "\"U\" ", - "it": "Archetti ", - "zh_Hant": "單車架 " - } - }, - { - "if": "bicycle_parking=wall_loops", - "then": { - "en": "Wheel rack/loops ", - "nl": "Wielrek/lussen ", - "fr": "Pinces-roues ", - "gl": "Aros ", - "de": "Metallgestänge ", - "hu": "Kengyeles ", - "it": "Scolapiatti ", - "zh_Hant": "車輪架/圓圈 " - } - }, - { - "if": "bicycle_parking=handlebar_holder", - "then": { - "en": "Handlebar holder ", - "nl": "Stuurhouder ", - "fr": "Support guidon ", - "gl": "Cadeado para guiador ", - "de": "Halter für Fahrradlenker ", - "it": "Blocca manubrio ", - "zh_Hant": "車把架 " - } - }, - { - "if": "bicycle_parking=rack", - "then": { - "en": "Rack ", - "nl": "Rek ", - "fr": "Râtelier ", - "gl": "Cremalleira ", - "de": "Gestell ", - "zh_Hant": "車架", - "it": "Rastrelliera ", - "ru": "Стойка " - } - }, - { - "if": "bicycle_parking=two_tier", - "then": { - "en": "Two-tiered ", - "nl": "Dubbel (twee verdiepingen) ", - "fr": "Superposé ", - "gl": "Dobre cremalleira ", - "de": "Zweistufig ", - "hu": "Kétszintű ", - "zh_Hant": "兩層", - "it": "A due piani ", - "ru": "Двухуровневая " - } - }, - { - "if": "bicycle_parking=shed", - "then": { - "en": "Shed ", - "nl": "Schuur ", - "fr": "Abri ", - "gl": "Abeiro ", - "de": "Schuppen ", - "hu": "Fészer ", - "zh_Hant": "車棚 ", - "it": "Rimessa ", - "ru": "Навес " - } - }, - { - "if": "bicycle_parking=bollard", - "then": { - "en": "Bollard ", - "nl": "Paal met ring ", - "fr": "Potelet ", - "it": "Colonnina ", - "de": "Poller ", - "zh_Hant": "柱子 " - } - }, - { - "if": "bicycle_parking=floor", - "then": { - "en": "An area on the floor which is marked for bicycle parking", - "nl": "Een oppervlakte die gemarkeerd is om fietsen te parkeren", - "fr": "Zone au sol qui est marquée pour le stationnement des vélos", - "it": "Una zona del pavimento che è marcata per il parcheggio delle bici", - "de": "Ein Bereich auf dem Boden, der für das Abstellen von Fahrrädern gekennzeichnet ist", - "zh_Hant": "樓層當中標示為單車停車場的區域" - } - } - ], - "id": "Bicycle parking type" - }, - { - "question": { - "en": "What is the relative location of this bicycle parking?", - "nl": "Wat is de relatieve locatie van deze parking??", - "fr": "Quelle est la position relative de ce parking à vélo ?", - "it": "Qual è la posizione relativa di questo parcheggio bici?", - "zh_Hant": "這個單車停車場的相對位置是?", - "pl": "Jaka jest względna lokalizacja tego parkingu rowerowego?", - "pt_BR": "Qual a localização relativa deste estacionamento de bicicletas?", - "de": "Wo befinden sich diese Fahrradabstellplätze?", - "pt": "Qual a localização relativa deste estacionamento de bicicletas?" - }, - "mappings": [ - { - "if": "location=underground", - "then": { - "en": "Underground parking", - "nl": "Ondergrondse parking", - "fr": "Parking souterrain", - "it": "Parcheggio sotterraneo", - "ru": "Подземная парковка", - "de": "Tiefgarage", - "zh_Hant": "地下停車場", - "pt_BR": "Estacionamento subterrâneo", - "pt": "Estacionamento subterrâneo" - } - }, - { - "if": "location=underground", - "then": { - "en": "Underground parking", - "nl": "Ondergrondse parking", - "fr": "Parking souterrain", - "it": "Parcheggio sotterraneo", - "ru": "Подземная парковка", - "de": "Tiefgarage", - "zh_Hant": "地下停車場", - "pt_BR": "Estacionamento subterrâneo", - "pt": "Estacionamento subterrâneo" - } - }, - { - "if": "location=surface", - "then": { - "en": "Surface level parking", - "nl": "Parking op de begane grond", - "fr": "Parking en surface", - "hu": "Felszíni parkoló", - "it": "Parcheggio in superficie", - "de": "Ebenerdiges Parken", - "zh_Hant": "地面停車場", - "pt_BR": "Estacionamento de superfície", - "pt": "Estacionamento de superfície" - } - }, - { - "if": "location=", - "then": { - "en": "Surface level parking", - "nl": "Parking op de begane grond", - "fr": "Parking en surface", - "hu": "Felszíni parkoló", - "it": "Parcheggio in superficie", - "de": "Ebenerdiges Parken", - "zh_Hant": "地面層停車場", - "pt_BR": "Estacionamento ao nível da superfície", - "pt": "Estacionamento ao nível da superfície" - }, - "hideInAnwser": true - }, - { - "if": "location=rooftop", - "then": { - "en": "Rooftop parking", - "nl": "Dakparking", - "fr": "Parking sur un toit", - "hu": "Tetőparkoló", - "it": "Parcheggio sul tetto", - "ru": "Парковка на крыше", - "zh_Hant": "屋頂停車場", - "pt_BR": "Estacionamento no telhado", - "de": "Parkplatz auf dem Dach", - "pt": "Estacionamento no telhado" - } - } - ], - "id": "Underground?" - }, - { - "question": { - "en": "Is this parking covered? Also select \"covered\" for indoor parkings.", - "nl": "Is deze parking overdekt? Selecteer ook \"overdekt\" voor fietsparkings binnen een gebouw.", - "gl": "Este aparcadoiro está cuberto? Tamén escolle \"cuberto\" para aparcadoiros interiores.", - "de": "Ist dieser Parkplatz überdacht? Wählen Sie auch \"überdacht\" für Innenparkplätze.", - "fr": "Ce parking est-il couvert ? Sélectionnez aussi \"couvert\" pour les parkings en intérieur.", - "hu": "Fedett ez a parkoló? (Beltéri parkoló esetén is válaszd a \"fedett\" opciót.)", - "it": "È un parcheggio coperto? Indicare “coperto” per parcheggi all’interno.", - "zh_Hant": "這個停車場是否有車棚?如果是室內停車場也請選擇\"遮蔽\"。", - "pt_BR": "Este estacionamento é coberto? Também selecione \"coberto\" para estacionamentos internos.", - "pt": "Este estacionamento é coberto? Também selecione \"coberto\" para estacionamentos internos." - }, - "condition": { - "and": [ - "bicycle_parking!=shed", - "location!=underground" - ] - }, - "mappings": [ - { - "if": "covered=yes", - "then": { - "en": "This parking is covered (it has a roof)", - "nl": "Deze parking is overdekt (er is een afdak)", - "gl": "Este aparcadoiro está cuberto (ten un teito)", - "de": "Dieser Parkplatz ist überdacht (er hat ein Dach)", - "fr": "Ce parking est couvert (il a un toit)", - "hu": "A parkoló fedett", - "it": "È un parcheggio coperto (ha un tetto)", - "zh_Hant": "這個停車場有遮蔽 (有屋頂)", - "ru": "Это крытая парковка (есть крыша/навес)", - "pt_BR": "Este estacionamento é coberto (tem um telhado)", - "pt": "Este estacionamento é coberto (tem um telhado)" - } - }, - { - "if": "covered=no", - "then": { - "en": "This parking is not covered", - "nl": "Deze parking is niet overdekt", - "gl": "Este aparcadoiro non está cuberto", - "de": "Dieser Parkplatz ist nicht überdacht", - "fr": "Ce parking n'est pas couvert", - "hu": "A parkoló nem fedett", - "it": "Non è un parcheggio coperto", - "zh_Hant": "這個停車場沒有遮蔽", - "ru": "Это открытая парковка", - "pt_BR": "Este estacionamento não é coberto", - "pt": "Este estacionamento não é coberto" - } - } - ], - "id": "Is covered?" - }, - { - "question": { - "en": "How many bicycles fit in this bicycle parking (including possible cargo bicycles)?", - "fr": "Combien de vélos entrent dans ce parking à vélos (y compris les éventuels vélos de transport) ?", - "nl": "Hoeveel fietsen kunnen in deze fietsparking (inclusief potentiëel bakfietsen)?", - "gl": "Cantas bicicletas caben neste aparcadoiro de bicicletas (incluídas as posíbeis bicicletas de carga)?", - "de": "Wie viele Fahrräder passen auf diesen Fahrrad-Parkplatz (einschließlich möglicher Lastenfahrräder)?", - "it": "Quante biciclette entrano in questo parcheggio per bici (incluse le eventuali bici da trasporto)?", - "zh_Hant": "這個單車停車場能放幾台單車 (包括裝箱單車)?" - }, - "render": { - "en": "Place for {capacity} bikes", - "fr": "Place pour {capacity} vélos", - "nl": "Plaats voor {capacity} fietsen", - "gl": "Lugar para {capacity} bicicletas", - "de": "Platz für {capacity} Fahrräder", - "it": "Posti per {capacity} bici", - "zh_Hant": "{capacity} 單車的地方", - "ru": "Место для {capacity} велосипеда(ов)", - "pt_BR": "Lugar para {capacity} bicicletas", - "pt": "Lugar para {capacity} bicicletas" - }, - "freeform": { - "key": "capacity", - "type": "nat" - }, - "id": "Capacity" - }, - { - "question": { - "en": "Who can use this bicycle parking?", - "nl": "Wie mag er deze fietsenstalling gebruiken?", - "fr": "Qui peut utiliser ce parking à vélo ?", - "it": "Chi può usare questo parcheggio bici?", - "de": "Wer kann diesen Fahrradparplatz nutzen?", - "zh_Hant": "誰可以使用這個單車停車場?", - "ru": "Кто может пользоваться этой велопарковкой?", - "pt_BR": "Quem pode usar este estacionamento de bicicletas?", - "pt": "Quem pode usar este estacionamento de bicicletas?" - }, - "render": { - "en": "{access}", - "de": "{access}", - "fr": "{access}", - "nl": "{access}", - "it": "{access}", - "ru": "{access}", - "id": "{access}", - "zh_Hant": "{access}", - "fi": "{access}", - "pt_BR": "{access}", - "pt": "{access}", - "eo": "{access}" - }, - "freeform": { - "key": "access", - "addExtraTags": [ - "fixme=Freeform used on 'access'-tag: possibly a wrong value" - ] - }, - "mappings": [ - { - "if": "access=yes", - "then": { - "en": "Publicly accessible", - "nl": "Publiek toegankelijke fietsenstalling", - "fr": "Accessible publiquement", - "it": "Accessibile pubblicamente", - "de": "Öffentlich zugänglich", - "zh_Hant": "公開可用", - "pt_BR": "Acessível ao público", - "pt": "Acessível ao público" - } - }, - { - "if": "access=customers", - "then": { - "en": "Access is primarily for visitors to a business", - "nl": "Klanten van de zaak of winkel", - "fr": "Accès destiné principalement aux visiteurs d'un lieu", - "it": "Accesso destinato principalmente ai visitatori di un’attività", - "zh_Hant": "通行性主要是為了企業的顧客", - "pt_BR": "Acesso é principalmente para visitantes de uma empresa", - "de": "Der Zugang ist in erster Linie für Besucher eines Unternehmens bestimmt", - "pt": "Acesso é principalmente para visitantes de uma empresa" - } - }, - { - "if": "access=private", - "then": { - "en": "Access is limited to members of a school, company or organisation", - "nl": "Private fietsenstalling van een school, een bedrijf, ...", - "fr": "Accès limité aux membres d'une école, entreprise ou organisation", - "it": "Accesso limitato ai membri di una scuola, una compagnia o un’organizzazione", - "zh_Hant": "通行性僅限學校、公司或組織的成員", - "pt_BR": "Acesso é limitado aos membros de uma escola, companhia ou organização", - "de": "Der Zugang ist beschränkt auf Mitglieder einer Schule, eines Unternehmens oder einer Organisation", - "pt": "Acesso é limitado aos membros de uma escola, companhia ou organização" - } - } - ], - "id": "Access" - }, - { - "question": { - "en": "Does this bicycle parking have spots for cargo bikes?", - "nl": "Heeft deze fietsparking plaats voor bakfietsen?", - "gl": "Este aparcadoiro de bicicletas ten espazo para bicicletas de carga?", - "de": "Gibt es auf diesem Fahrrad-Parkplatz Plätze für Lastenfahrräder?", - "fr": "Est-ce que ce parking à vélo a des emplacements pour des vélos cargo ?", - "it": "Questo parcheggio dispone di posti specifici per le bici da trasporto?", - "zh_Hant": "這個單車停車場有地方放裝箱的單車嗎?", - "pt_BR": "O estacionamento de bicicletas tem vagas para bicicletas de carga?", - "pt": "O estacionamento de bicicletas tem vagas para bicicletas de carga?" - }, - "mappings": [ - { - "if": "cargo_bike=yes", - "then": { - "en": "This parking has room for cargo bikes", - "nl": "Deze parking heeft plaats voor bakfietsen", - "gl": "Este aparcadoiro ten espazo para bicicletas de carga.", - "de": "Dieser Parkplatz bietet Platz für Lastenfahrräder", - "fr": "Ce parking a de la place pour les vélos cargo", - "it": "Questo parcheggio ha posto per bici da trasporto", - "zh_Hant": "這個停車場有地方可以放裝箱單車", - "pt_BR": "Este estacionamento tem vagas para bicicletas de carga", - "pt": "Este estacionamento tem vagas para bicicletas de carga" - } - }, - { - "if": "cargo_bike=designated", - "then": { - "en": "This parking has designated (official) spots for cargo bikes.", - "nl": "Er zijn speciale plaatsen voorzien voor bakfietsen", - "gl": "Este aparcadoiro ten espazos designados (oficiais) para bicicletas de carga.", - "de": "Dieser Parkplatz verfügt über ausgewiesene (offizielle) Plätze für Lastenfahrräder.", - "fr": "Ce parking a des emplacements (officiellement) destinés aux vélos cargo.", - "it": "Questo parcheggio ha posti destinati (ufficialmente) alle bici da trasporto.", - "zh_Hant": "這停車場有設計 (官方) 空間給裝箱的單車。", - "pt_BR": "Este estacionamento tem vagas (oficiais) projetadas para bicicletas de carga.", - "pt": "Este estacionamento tem vagas (oficiais) projetadas para bicicletas de carga." - } - }, - { - "if": "cargo_bike=no", - "then": { - "en": "You're not allowed to park cargo bikes", - "nl": "Je mag hier geen bakfietsen parkeren", - "gl": "Non está permitido aparcar bicicletas de carga", - "de": "Es ist nicht erlaubt, Lastenfahrräder zu parken", - "fr": "Il est interdit de garer des vélos cargo", - "it": "Il parcheggio delle bici da trasporto è proibito", - "pt_BR": "Você não tem permissão para estacionar bicicletas de carga", - "pt": "Não tem permissão para estacionar bicicletas de carga" - } - } - ], - "id": "Cargo bike spaces?" - }, - { - "question": { - "en": "How many cargo bicycles fit in this bicycle parking?", - "nl": "Voor hoeveel bakfietsen heeft deze fietsparking plaats?", - "fr": "Combien de vélos de transport entrent dans ce parking à vélos ?", - "gl": "Cantas bicicletas de carga caben neste aparcadoiro de bicicletas?", - "de": "Wie viele Lastenfahrräder passen auf diesen Fahrrad-Parkplatz?", - "it": "Quante bici da trasporto entrano in questo parcheggio per bici?", - "pt_BR": "Quantas bicicletas de carga cabem neste estacionamento de bicicletas?", - "pt": "Quantas bicicletas de carga cabem neste estacionamento de bicicletas?" - }, - "render": { - "en": "This parking fits {capacity:cargo_bike} cargo bikes", - "nl": "Deze parking heeft plaats voor {capacity:cargo_bike} fietsen", - "fr": "Ce parking a de la place pour {capacity:cargo_bike} vélos de transport", - "gl": "Neste aparcadoiro caben {capacity:cargo_bike} bicicletas de carga", - "de": "Auf diesen Parkplatz passen {capacity:cargo_bike} Lastenfahrräder", - "it": "Questo parcheggio può contenere {capacity:cargo_bike} bici da trasporto", - "pt_BR": "Neste estacionamento cabem {capacity:cargo_bike} bicicletas de carga", - "pt": "Neste estacionamento cabem {capacity:cargo_bike} bicicletas de carga" - }, - "condition": "cargo_bike~designated|yes", - "freeform": { - "key": "capacity:cargo_bike", - "type": "nat" - }, - "id": "Cargo bike capacity?" - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity:={amenity}", - "amenity=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + }, + "tags": [ + "amenity=bicycle_parking" + ] } + ], + "title": { + "render": { + "en": "Bike parking", + "nl": "Fietsparking", + "fr": "Parking à vélo", + "gl": "Aparcadoiro de bicicletas", + "de": "Fahrrad-Parkplätze", + "hu": "Kerékpáros parkoló", + "it": "Parcheggio bici", + "zh_Hant": "單車停車場", + "ru": "Велопарковка", + "pl": "Parking dla rowerów", + "pt_BR": "Estacionamento de bicicletas", + "pt": "Estacionamento de bicicletas" + } + }, + "tagRenderings": [ + "images", + { + "question": { + "en": "What is the type of this bicycle parking?", + "nl": "Van welk type is deze fietsparking?", + "fr": "Quel type de parking à vélos est-ce ?", + "gl": "Que tipo de aparcadoiro de bicicletas é?", + "de": "Was ist die Art dieses Fahrrad-Parkplatzes?", + "hu": "Milyen típusú ez a kerékpáros parkoló?", + "it": "Di che tipo di parcheggio bici si tratta?", + "ru": "К какому типу относится эта велопарковка?", + "zh_Hant": "這是那種類型的單車停車場?", + "pl": "Jaki jest typ tego parkingu dla rowerów?", + "pt_BR": "Qual o tipo deste estacionamento de bicicletas?", + "pt": "Qual o tipo deste estacionamento de bicicletas?" + }, + "render": { + "en": "This is a bicycle parking of the type: {bicycle_parking}", + "nl": "Dit is een fietsparking van het type: {bicycle_parking}", + "fr": "Ceci est un parking à vélo de type {bicycle_parking}", + "gl": "Este é un aparcadoiro de bicicletas do tipo: {bicycle_parking}", + "de": "Dies ist ein Fahrrad-Parkplatz der Art: {bicycle_parking}", + "hu": "Ez egy {bicycle_parking} típusú kerékpáros parkoló", + "it": "È un parcheggio bici del tipo: {bicycle_parking}", + "zh_Hant": "這個單車停車場的類型是:{bicycle_parking}", + "ru": "Это велопарковка типа {bicycle_parking}", + "pl": "Jest to parking rowerowy typu: {bicycle_parking}", + "pt_BR": "Este é um estacionamento de bicicletas do tipo: {bicycle_parking}", + "pt": "Este é um estacionamento de bicicletas do tipo: {bicycle_parking}" + }, + "freeform": { + "key": "bicycle_parking", + "addExtraTags": [ + "fixme=Freeform used on 'bicycle_parking'-tag: possibly a wrong value" + ] + }, + "mappings": [ + { + "if": "bicycle_parking=stands", + "then": { + "en": "Staple racks ", + "nl": "Nietjes ", + "fr": "Arceaux ", + "gl": "De roda (Stands) ", + "de": "Fahrradbügel ", + "hu": "\"U\" ", + "it": "Archetti ", + "zh_Hant": "單車架 " + } + }, + { + "if": "bicycle_parking=wall_loops", + "then": { + "en": "Wheel rack/loops ", + "nl": "Wielrek/lussen ", + "fr": "Pinces-roues ", + "gl": "Aros ", + "de": "Metallgestänge ", + "hu": "Kengyeles ", + "it": "Scolapiatti ", + "zh_Hant": "車輪架/圓圈 " + } + }, + { + "if": "bicycle_parking=handlebar_holder", + "then": { + "en": "Handlebar holder ", + "nl": "Stuurhouder ", + "fr": "Support guidon ", + "gl": "Cadeado para guiador ", + "de": "Halter für Fahrradlenker ", + "it": "Blocca manubrio ", + "zh_Hant": "車把架 " + } + }, + { + "if": "bicycle_parking=rack", + "then": { + "en": "Rack ", + "nl": "Rek ", + "fr": "Râtelier ", + "gl": "Cremalleira ", + "de": "Gestell ", + "zh_Hant": "車架", + "it": "Rastrelliera ", + "ru": "Стойка " + } + }, + { + "if": "bicycle_parking=two_tier", + "then": { + "en": "Two-tiered ", + "nl": "Dubbel (twee verdiepingen) ", + "fr": "Superposé ", + "gl": "Dobre cremalleira ", + "de": "Zweistufig ", + "hu": "Kétszintű ", + "zh_Hant": "兩層", + "it": "A due piani ", + "ru": "Двухуровневая " + } + }, + { + "if": "bicycle_parking=shed", + "then": { + "en": "Shed ", + "nl": "Schuur ", + "fr": "Abri ", + "gl": "Abeiro ", + "de": "Schuppen ", + "hu": "Fészer ", + "zh_Hant": "車棚 ", + "it": "Rimessa ", + "ru": "Навес " + } + }, + { + "if": "bicycle_parking=bollard", + "then": { + "en": "Bollard ", + "nl": "Paal met ring ", + "fr": "Potelet ", + "it": "Colonnina ", + "de": "Poller ", + "zh_Hant": "柱子 " + } + }, + { + "if": "bicycle_parking=floor", + "then": { + "en": "An area on the floor which is marked for bicycle parking", + "nl": "Een oppervlakte die gemarkeerd is om fietsen te parkeren", + "fr": "Zone au sol qui est marquée pour le stationnement des vélos", + "it": "Una zona del pavimento che è marcata per il parcheggio delle bici", + "de": "Ein Bereich auf dem Boden, der für das Abstellen von Fahrrädern gekennzeichnet ist", + "zh_Hant": "樓層當中標示為單車停車場的區域" + } + } + ], + "id": "Bicycle parking type" + }, + { + "question": { + "en": "What is the relative location of this bicycle parking?", + "nl": "Wat is de relatieve locatie van deze parking??", + "fr": "Quelle est la position relative de ce parking à vélo ?", + "it": "Qual è la posizione relativa di questo parcheggio bici?", + "zh_Hant": "這個單車停車場的相對位置是?", + "pl": "Jaka jest względna lokalizacja tego parkingu rowerowego?", + "pt_BR": "Qual a localização relativa deste estacionamento de bicicletas?", + "de": "Wo befinden sich diese Fahrradabstellplätze?", + "pt": "Qual a localização relativa deste estacionamento de bicicletas?" + }, + "mappings": [ + { + "if": "location=underground", + "then": { + "en": "Underground parking", + "nl": "Ondergrondse parking", + "fr": "Parking souterrain", + "it": "Parcheggio sotterraneo", + "ru": "Подземная парковка", + "de": "Tiefgarage", + "zh_Hant": "地下停車場", + "pt_BR": "Estacionamento subterrâneo", + "pt": "Estacionamento subterrâneo" + } + }, + { + "if": "location=surface", + "then": { + "en": "Surface level parking", + "nl": "Parking op de begane grond", + "fr": "Parking en surface", + "it": "Parcheggio in superficie", + "ru": "Подземная парковка", + "de": "Ebenerdiges Parken", + "zh_Hant": "地面停車場", + "pt_BR": "Estacionamento de superfície", + "pt": "Estacionamento de superfície", + "hu": "Felszíni parkoló" + } + }, + { + "if": "location=rooftop", + "then": { + "en": "Rooftop parking", + "nl": "Dakparking", + "fr": "Parking sur un toit", + "hu": "Tetőparkoló", + "it": "Parcheggio sul tetto", + "de": "Parkplatz auf dem Dach", + "zh_Hant": "屋頂停車場", + "pt_BR": "Estacionamento no telhado", + "pt": "Estacionamento no telhado", + "ru": "Парковка на крыше" + } + }, + { + "if": "location=", + "then": { + "en": "Surface level parking", + "nl": "Parking op de begane grond", + "fr": "Parking en surface", + "hu": "Felszíni parkoló", + "it": "Parcheggio in superficie", + "de": "Ebenerdiges Parken", + "zh_Hant": "地面層停車場", + "pt_BR": "Estacionamento ao nível da superfície", + "pt": "Estacionamento ao nível da superfície" + }, + "hideInAnwser": true + }, + { + "if": "location=rooftop", + "then": { + "en": "Rooftop parking", + "nl": "Dakparking", + "fr": "Parking sur un toit", + "hu": "Tetőparkoló", + "it": "Parcheggio sul tetto", + "ru": "Парковка на крыше", + "zh_Hant": "屋頂停車場", + "pt_BR": "Estacionamento no telhado", + "de": "Parkplatz auf dem Dach", + "pt": "Estacionamento no telhado" + } + } + ], + "id": "Underground?" + }, + { + "question": { + "en": "Is this parking covered? Also select \"covered\" for indoor parkings.", + "nl": "Is deze parking overdekt? Selecteer ook \"overdekt\" voor fietsparkings binnen een gebouw.", + "gl": "Este aparcadoiro está cuberto? Tamén escolle \"cuberto\" para aparcadoiros interiores.", + "de": "Ist dieser Parkplatz überdacht? Wählen Sie auch \"überdacht\" für Innenparkplätze.", + "fr": "Ce parking est-il couvert ? Sélectionnez aussi \"couvert\" pour les parkings en intérieur.", + "hu": "Fedett ez a parkoló? (Beltéri parkoló esetén is válaszd a \"fedett\" opciót.)", + "it": "È un parcheggio coperto? Indicare “coperto” per parcheggi all’interno.", + "zh_Hant": "這個停車場是否有車棚?如果是室內停車場也請選擇\"遮蔽\"。", + "pt_BR": "Este estacionamento é coberto? Também selecione \"coberto\" para estacionamentos internos.", + "pt": "Este estacionamento é coberto? Também selecione \"coberto\" para estacionamentos internos." + }, + "condition": { + "and": [ + "bicycle_parking!=shed", + "location!=underground" + ] + }, + "mappings": [ + { + "if": "covered=yes", + "then": { + "en": "This parking is covered (it has a roof)", + "nl": "Deze parking is overdekt (er is een afdak)", + "gl": "Este aparcadoiro está cuberto (ten un teito)", + "de": "Dieser Parkplatz ist überdacht (er hat ein Dach)", + "fr": "Ce parking est couvert (il a un toit)", + "hu": "A parkoló fedett", + "it": "È un parcheggio coperto (ha un tetto)", + "zh_Hant": "這個停車場有遮蔽 (有屋頂)", + "ru": "Это крытая парковка (есть крыша/навес)", + "pt_BR": "Este estacionamento é coberto (tem um telhado)", + "pt": "Este estacionamento é coberto (tem um telhado)" + } + }, + { + "if": "covered=no", + "then": { + "en": "This parking is not covered", + "nl": "Deze parking is niet overdekt", + "gl": "Este aparcadoiro non está cuberto", + "de": "Dieser Parkplatz ist nicht überdacht", + "fr": "Ce parking n'est pas couvert", + "hu": "A parkoló nem fedett", + "it": "Non è un parcheggio coperto", + "zh_Hant": "這個停車場沒有遮蔽", + "ru": "Это открытая парковка", + "pt_BR": "Este estacionamento não é coberto", + "pt": "Este estacionamento não é coberto" + } + } + ], + "id": "Is covered?" + }, + { + "question": { + "en": "How many bicycles fit in this bicycle parking (including possible cargo bicycles)?", + "fr": "Combien de vélos entrent dans ce parking à vélos (y compris les éventuels vélos de transport) ?", + "nl": "Hoeveel fietsen kunnen in deze fietsparking (inclusief potentiëel bakfietsen)?", + "gl": "Cantas bicicletas caben neste aparcadoiro de bicicletas (incluídas as posíbeis bicicletas de carga)?", + "de": "Wie viele Fahrräder passen auf diesen Fahrrad-Parkplatz (einschließlich möglicher Lastenfahrräder)?", + "it": "Quante biciclette entrano in questo parcheggio per bici (incluse le eventuali bici da trasporto)?", + "zh_Hant": "這個單車停車場能放幾台單車 (包括裝箱單車)?" + }, + "render": { + "en": "Place for {capacity} bikes", + "fr": "Place pour {capacity} vélos", + "nl": "Plaats voor {capacity} fietsen", + "gl": "Lugar para {capacity} bicicletas", + "de": "Platz für {capacity} Fahrräder", + "it": "Posti per {capacity} bici", + "zh_Hant": "{capacity} 單車的地方", + "ru": "Место для {capacity} велосипеда(ов)", + "pt_BR": "Lugar para {capacity} bicicletas", + "pt": "Lugar para {capacity} bicicletas" + }, + "freeform": { + "key": "capacity", + "type": "nat" + }, + "id": "Capacity" + }, + { + "question": { + "en": "Who can use this bicycle parking?", + "nl": "Wie mag er deze fietsenstalling gebruiken?", + "fr": "Qui peut utiliser ce parking à vélo ?", + "it": "Chi può usare questo parcheggio bici?", + "de": "Wer kann diesen Fahrradparplatz nutzen?", + "zh_Hant": "誰可以使用這個單車停車場?", + "ru": "Кто может пользоваться этой велопарковкой?", + "pt_BR": "Quem pode usar este estacionamento de bicicletas?", + "pt": "Quem pode usar este estacionamento de bicicletas?" + }, + "render": { + "en": "{access}", + "de": "{access}", + "fr": "{access}", + "nl": "{access}", + "it": "{access}", + "ru": "{access}", + "id": "{access}", + "zh_Hant": "{access}", + "fi": "{access}", + "pt_BR": "{access}", + "pt": "{access}", + "eo": "{access}" + }, + "freeform": { + "key": "access", + "addExtraTags": [ + "fixme=Freeform used on 'access'-tag: possibly a wrong value" + ] + }, + "mappings": [ + { + "if": "access=yes", + "then": { + "en": "Publicly accessible", + "nl": "Publiek toegankelijke fietsenstalling", + "fr": "Accessible publiquement", + "it": "Accessibile pubblicamente", + "de": "Öffentlich zugänglich", + "zh_Hant": "公開可用", + "pt_BR": "Acessível ao público", + "pt": "Acessível ao público" + } + }, + { + "if": "access=customers", + "then": { + "en": "Access is primarily for visitors to a business", + "nl": "Klanten van de zaak of winkel", + "fr": "Accès destiné principalement aux visiteurs d'un lieu", + "it": "Accesso destinato principalmente ai visitatori di un’attività", + "zh_Hant": "通行性主要是為了企業的顧客", + "pt_BR": "Acesso é principalmente para visitantes de uma empresa", + "de": "Der Zugang ist in erster Linie für Besucher eines Unternehmens bestimmt", + "pt": "Acesso é principalmente para visitantes de uma empresa" + } + }, + { + "if": "access=private", + "then": { + "en": "Access is limited to members of a school, company or organisation", + "nl": "Private fietsenstalling van een school, een bedrijf, ...", + "fr": "Accès limité aux membres d'une école, entreprise ou organisation", + "it": "Accesso limitato ai membri di una scuola, una compagnia o un’organizzazione", + "zh_Hant": "通行性僅限學校、公司或組織的成員", + "pt_BR": "Acesso é limitado aos membros de uma escola, companhia ou organização", + "de": "Der Zugang ist beschränkt auf Mitglieder einer Schule, eines Unternehmens oder einer Organisation", + "pt": "Acesso é limitado aos membros de uma escola, companhia ou organização" + } + } + ], + "id": "Access" + }, + { + "question": { + "en": "Does this bicycle parking have spots for cargo bikes?", + "nl": "Heeft deze fietsparking plaats voor bakfietsen?", + "gl": "Este aparcadoiro de bicicletas ten espazo para bicicletas de carga?", + "de": "Gibt es auf diesem Fahrrad-Parkplatz Plätze für Lastenfahrräder?", + "fr": "Est-ce que ce parking à vélo a des emplacements pour des vélos cargo ?", + "it": "Questo parcheggio dispone di posti specifici per le bici da trasporto?", + "zh_Hant": "這個單車停車場有地方放裝箱的單車嗎?", + "pt_BR": "O estacionamento de bicicletas tem vagas para bicicletas de carga?", + "pt": "O estacionamento de bicicletas tem vagas para bicicletas de carga?" + }, + "mappings": [ + { + "if": "cargo_bike=yes", + "then": { + "en": "This parking has room for cargo bikes", + "nl": "Deze parking heeft plaats voor bakfietsen", + "gl": "Este aparcadoiro ten espazo para bicicletas de carga.", + "de": "Dieser Parkplatz bietet Platz für Lastenfahrräder", + "fr": "Ce parking a de la place pour les vélos cargo", + "it": "Questo parcheggio ha posto per bici da trasporto", + "zh_Hant": "這個停車場有地方可以放裝箱單車", + "pt_BR": "Este estacionamento tem vagas para bicicletas de carga", + "pt": "Este estacionamento tem vagas para bicicletas de carga" + } + }, + { + "if": "cargo_bike=designated", + "then": { + "en": "This parking has designated (official) spots for cargo bikes.", + "nl": "Er zijn speciale plaatsen voorzien voor bakfietsen", + "gl": "Este aparcadoiro ten espazos designados (oficiais) para bicicletas de carga.", + "de": "Dieser Parkplatz verfügt über ausgewiesene (offizielle) Plätze für Lastenfahrräder.", + "fr": "Ce parking a des emplacements (officiellement) destinés aux vélos cargo.", + "it": "Questo parcheggio ha posti destinati (ufficialmente) alle bici da trasporto.", + "zh_Hant": "這停車場有設計 (官方) 空間給裝箱的單車。", + "pt_BR": "Este estacionamento tem vagas (oficiais) projetadas para bicicletas de carga.", + "pt": "Este estacionamento tem vagas (oficiais) projetadas para bicicletas de carga." + } + }, + { + "if": "cargo_bike=no", + "then": { + "en": "You're not allowed to park cargo bikes", + "nl": "Je mag hier geen bakfietsen parkeren", + "gl": "Non está permitido aparcar bicicletas de carga", + "de": "Es ist nicht erlaubt, Lastenfahrräder zu parken", + "fr": "Il est interdit de garer des vélos cargo", + "it": "Il parcheggio delle bici da trasporto è proibito", + "pt_BR": "Você não tem permissão para estacionar bicicletas de carga", + "pt": "Não tem permissão para estacionar bicicletas de carga" + } + } + ], + "id": "Cargo bike spaces?" + }, + { + "question": { + "en": "How many cargo bicycles fit in this bicycle parking?", + "nl": "Voor hoeveel bakfietsen heeft deze fietsparking plaats?", + "fr": "Combien de vélos de transport entrent dans ce parking à vélos ?", + "gl": "Cantas bicicletas de carga caben neste aparcadoiro de bicicletas?", + "de": "Wie viele Lastenfahrräder passen auf diesen Fahrrad-Parkplatz?", + "it": "Quante bici da trasporto entrano in questo parcheggio per bici?", + "pt_BR": "Quantas bicicletas de carga cabem neste estacionamento de bicicletas?", + "pt": "Quantas bicicletas de carga cabem neste estacionamento de bicicletas?" + }, + "render": { + "en": "This parking fits {capacity:cargo_bike} cargo bikes", + "nl": "Deze parking heeft plaats voor {capacity:cargo_bike} fietsen", + "fr": "Ce parking a de la place pour {capacity:cargo_bike} vélos de transport", + "gl": "Neste aparcadoiro caben {capacity:cargo_bike} bicicletas de carga", + "de": "Auf diesen Parkplatz passen {capacity:cargo_bike} Lastenfahrräder", + "it": "Questo parcheggio può contenere {capacity:cargo_bike} bici da trasporto", + "pt_BR": "Neste estacionamento cabem {capacity:cargo_bike} bicicletas de carga", + "pt": "Neste estacionamento cabem {capacity:cargo_bike} bicicletas de carga" + }, + "condition": "cargo_bike~designated|yes", + "freeform": { + "key": "capacity:cargo_bike", + "type": "nat" + }, + "id": "Cargo bike capacity?" + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity:={amenity}", + "amenity=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { + "render": "./assets/layers/bike_parking/parking.svg" + }, + "iconSize": "40,40,bottom", + "location": [ + "point", + "centroid" + ] + }, + { + "color": "#00f", + "width": "1" + } + ] } \ No newline at end of file diff --git a/assets/layers/bike_repair_station/bike_repair_station.json b/assets/layers/bike_repair_station/bike_repair_station.json index a166727c42..0e37ac26ad 100644 --- a/assets/layers/bike_repair_station/bike_repair_station.json +++ b/assets/layers/bike_repair_station/bike_repair_station.json @@ -1,763 +1,771 @@ { - "id": "bike_repair_station", - "name": { - "en": "Bike stations (repair, pump or both)", - "nl": "Fietspunten (herstel, pomp of allebei)", - "fr": "Station velo (réparation, pompe à vélo)", - "gl": "Estación de bicicletas (arranxo, bomba de ar ou ambos)", - "de": "Fahrradstationen (Reparatur, Pumpe oder beides)", - "it": "Stazioni bici (riparazione, gonfiaggio o entrambi)", - "pt_BR": "Estações de bicicletas (reparo, bomba ou ambos)" + "id": "bike_repair_station", + "name": { + "en": "Bike stations (repair, pump or both)", + "nl": "Fietspunten (herstel, pomp of allebei)", + "fr": "Station velo (réparation, pompe à vélo)", + "gl": "Estación de bicicletas (arranxo, bomba de ar ou ambos)", + "de": "Fahrradstationen (Reparatur, Pumpe oder beides)", + "it": "Stazioni bici (riparazione, gonfiaggio o entrambi)", + "pt_BR": "Estações de bicicletas (reparo, bomba ou ambos)" + }, + "minzoom": 13, + "source": { + "osmTags": { + "and": [ + "amenity=bicycle_repair_station" + ] + } + }, + "title": { + "render": { + "en": "Bike station (pump & repair)", + "nl": "Herstelpunt met pomp", + "fr": "Point station velo avec pompe", + "gl": "Estación de bicicletas (arranxo e bomba de ar)", + "de": "Fahrradstation (Pumpe & Reparatur)", + "it": "Stazione bici (gonfiaggio & riparazione)", + "pt_BR": "Estação de bicicletas (bomba e reparo)" }, - "minzoom": 13, - "source": { - "osmTags": { - "and": [ - "amenity=bicycle_repair_station" - ] + "mappings": [ + { + "if": { + "or": [ + "service:bicycle:pump=no", + "service:bicycle:pump:operational_status=broken" + ] + }, + "then": { + "en": "Bike repair station", + "nl": "Herstelpunt", + "fr": "Point de réparation velo", + "gl": "Estación de arranxo de bicicletas", + "de": "Fahrrad-Reparaturstation", + "it": "Stazione riparazione bici", + "pt_BR": "Estação de reparo de bicicletas", + "pt": "Estação de reparo de bicicletas" } - }, - "title": { - "render": { - "en": "Bike station (pump & repair)", - "nl": "Herstelpunt met pomp", - "fr": "Point station velo avec pompe", - "gl": "Estación de bicicletas (arranxo e bomba de ar)", - "de": "Fahrradstation (Pumpe & Reparatur)", - "it": "Stazione bici (gonfiaggio & riparazione)", - "pt_BR": "Estação de bicicletas (bomba e reparo)" + }, + { + "if": { + "and": [ + "service:bicycle:pump=yes", + "service:bicycle:tools=yes" + ] }, - "mappings": [ + "then": { + "en": "Bike repair station", + "nl": "Herstelpunt", + "fr": "Point de réparation", + "gl": "Estación de arranxo de bicicletas", + "de": "Fahrrad-Reparaturstation", + "it": "Stazione riparazione bici", + "pt_BR": "Estação de reparo de bicicletas", + "pt": "Estação de reparo de bicicletas" + } + }, + { + "if": { + "and": [ + "service:bicycle:pump:operational_status=broken", { - "if": { - "or": [ - "service:bicycle:pump=no", - "service:bicycle:pump:operational_status=broken" - ] - }, - "then": { - "en": "Bike repair station", - "nl": "Herstelpunt", - "fr": "Point de réparation velo", - "gl": "Estación de arranxo de bicicletas", - "de": "Fahrrad-Reparaturstation", - "it": "Stazione riparazione bici", - "pt_BR": "Estação de reparo de bicicletas", - "pt": "Estação de reparo de bicicletas" - } - }, - { - "if": { - "and": [ - "service:bicycle:pump=yes", - "service:bicycle:tools=yes" - ] - }, - "then": { - "en": "Bike repair station", - "nl": "Herstelpunt", - "fr": "Point de réparation", - "gl": "Estación de arranxo de bicicletas", - "de": "Fahrrad-Reparaturstation", - "it": "Stazione riparazione bici", - "pt_BR": "Estação de reparo de bicicletas", - "pt": "Estação de reparo de bicicletas" - } - }, - { - "if": { - "and": [ - "service:bicycle:pump:operational_status=broken", - { - "or": [ - "service:bicycle:tools=no", - "service:bicycle:tools=" - ] - } - ] - }, - "then": { - "en": "Broken pump", - "nl": "Kapotte fietspomp", - "fr": "Pompe cassée", - "gl": "Bomba de ar estragada", - "de": "Kaputte Pumpe", - "it": "Pompa rotta", - "ru": "Сломанный насос", - "pt_BR": "Bomba quebrada" - } - }, - { - "if": { - "and": [ - "service:bicycle:pump=yes", - "service:bicycle:tools=no", - "name~*" - ] - }, - "then": { - "en": "Bicycle pump {name}", - "nl": "Fietspomp {name}", - "fr": "Pompe de vélo {name}", - "gl": "Bomba de ar {name}", - "de": "Fahrradpumpe {name}", - "it": "Pompa per bici {name}", - "ru": "Велосипедный насос {name}", - "pt_BR": "Bomba de bicicleta {name}" - } - }, - { - "if": { - "and": [ - "service:bicycle:pump=yes", - "service:bicycle:tools=no" - ] - }, - "then": { - "en": "Bicycle pump", - "nl": "Fietspomp", - "fr": "Pompe de vélo", - "gl": "Bomba de ar", - "de": "Fahrradpumpe", - "it": "Pompa per bici", - "ru": "Велосипедный насос", - "pt_BR": "Bomba de bicicleta" - } + "or": [ + "service:bicycle:tools=no", + "service:bicycle:tools=" + ] } - ] + ] + }, + "then": { + "en": "Broken pump", + "nl": "Kapotte fietspomp", + "fr": "Pompe cassée", + "gl": "Bomba de ar estragada", + "de": "Kaputte Pumpe", + "it": "Pompa rotta", + "ru": "Сломанный насос", + "pt_BR": "Bomba quebrada" + } + }, + { + "if": { + "and": [ + "service:bicycle:pump=yes", + "service:bicycle:tools=no", + "name~*" + ] + }, + "then": { + "en": "Bicycle pump {name}", + "nl": "Fietspomp {name}", + "fr": "Pompe de vélo {name}", + "gl": "Bomba de ar {name}", + "de": "Fahrradpumpe {name}", + "it": "Pompa per bici {name}", + "ru": "Велосипедный насос {name}", + "pt_BR": "Bomba de bicicleta {name}" + } + }, + { + "if": { + "and": [ + "service:bicycle:pump=yes", + "service:bicycle:tools=no" + ] + }, + "then": { + "en": "Bicycle pump", + "nl": "Fietspomp", + "fr": "Pompe de vélo", + "gl": "Bomba de ar", + "de": "Fahrradpumpe", + "it": "Pompa per bici", + "ru": "Велосипедный насос", + "pt_BR": "Bomba de bicicleta" + } + } + ] + }, + "titleIcons": [ + { + "render": "", + "condition": "operator=De Fietsambassade Gent" }, - "titleIcons": [ + "defaults" + ], + "tagRenderings": [ + "images", + { + "id": "bike_repair_station-available-services", + "question": { + "en": "Which services are available at this bike station?", + "nl": "Welke functies biedt dit fietspunt?", + "fr": "Quels services sont valables à cette station vélo ?", + "gl": "Que servizos están dispoñíbeis nesta estación de bicicletas?", + "de": "Welche Einrichtungen stehen an dieser Fahrradstation zur Verfügung?", + "it": "Quali servizi sono disponibili in questa stazione per bici?", + "pt_BR": "Quais serviços estão disponíveis nesta estação de bicicletas?", + "pt": "Quais serviços estão disponíveis nesta estação de bicicletas?" + }, + "mappings": [ { - "render": "", - "condition": "operator=De Fietsambassade Gent" - }, - "defaults" - ], - "tagRenderings": [ - "images", - { - "id": "bike_repair_station-available-services", - "question": { - "en": "Which services are available at this bike station?", - "nl": "Welke functies biedt dit fietspunt?", - "fr": "Quels services sont valables à cette station vélo ?", - "gl": "Que servizos están dispoñíbeis nesta estación de bicicletas?", - "de": "Welche Einrichtungen stehen an dieser Fahrradstation zur Verfügung?", - "it": "Quali servizi sono disponibili in questa stazione per bici?", - "pt_BR": "Quais serviços estão disponíveis nesta estação de bicicletas?", - "pt": "Quais serviços estão disponíveis nesta estação de bicicletas?" - }, - "mappings": [ - { - "if": { - "and": [ - "service:bicycle:tools=no", - "service:bicycle:pump=yes" - ] - }, - "then": { - "en": "There is only a pump present", - "nl": "Er is enkel een pomp aanwezig", - "fr": "Il y a seulement une pompe", - "gl": "Só hai unha bomba de ar presente", - "de": "Es ist nur eine Pumpe vorhanden", - "it": "C’è solamente una pompa presente", - "pt_BR": "Há somente uma bomba presente", - "pt": "Há somente uma bomba presente" - } - }, - { - "if": { - "and": [ - "service:bicycle:tools=yes", - "service:bicycle:pump=no" - ] - }, - "then": { - "en": "There are only tools (screwdrivers, pliers...) present", - "nl": "Er is enkel gereedschap aanwezig (schroevendraaier, tang...)", - "fr": "Il y a seulement des outils (tournevis, pinces...)", - "gl": "Só hai ferramentas (desaparafusadores, alicates...) presentes", - "de": "Es sind nur Werkzeuge (Schraubenzieher, Zangen...) vorhanden", - "it": "Ci sono solo degli attrezzi (cacciaviti, pinze…) presenti", - "pt_BR": "Há somente ferramentas (chaves de fenda, alicates...) presentes", - "pt": "Há somente ferramentas (chaves de fenda, alicates...) presentes" - } - }, - { - "if": { - "and": [ - "service:bicycle:tools=yes", - "service:bicycle:pump=yes" - ] - }, - "then": { - "en": "There are both tools and a pump present", - "nl": "Er is zowel een pomp als gereedschap aanwezig", - "fr": "Il y a des outils et une pompe", - "gl": "Hai ferramentas e unha bomba de ar presentes", - "de": "Es sind sowohl Werkzeuge als auch eine Pumpe vorhanden", - "it": "Ci sono sia attrezzi che pompa presenti", - "pt_BR": "Há tanto ferramentas e uma bomba presente", - "pt": "Há tanto ferramentas e uma bomba presente" - } - } + "if": { + "and": [ + "service:bicycle:tools=no", + "service:bicycle:pump=yes" ] + }, + "then": { + "en": "There is only a pump present", + "nl": "Er is enkel een pomp aanwezig", + "fr": "Il y a seulement une pompe", + "gl": "Só hai unha bomba de ar presente", + "de": "Es ist nur eine Pumpe vorhanden", + "it": "C’è solamente una pompa presente", + "pt_BR": "Há somente uma bomba presente", + "pt": "Há somente uma bomba presente" + } }, { - "question": { - "en": "Who maintains this cycle pump?", - "nl": "Wie beheert deze fietspomp?", - "fr": "Qui maintient cette pompe à vélo ?", - "it": "Chi gestisce questa pompa per bici?", - "de": "Wer wartet diese Fahrradpumpe?", - "pt_BR": "Quem faz a manutenção desta bomba de ciclo?", - "pt": "Quem faz a manutenção desta bomba de ciclo?" - }, - "render": { - "nl": "Beheer door {operator}", - "en": "Maintained by {operator}", - "fr": "Mantenue par {operator}", - "it": "Manutenuta da {operator}", - "de": "Gewartet von {operator}", - "pt_BR": "Mantida por {operator}", - "pt": "Mantida por {operator}" - }, - "freeform": { - "key": "operator" - }, - "mappings": [ - { - "if": "operator=De Fietsambassade Gent", - "then": "De Fietsambassade Gent", - "hideInAnswer": "_country!=be" - } - ], - "id": "bike_repair_station-operator" - }, - { - "question": { - "en": "What is the email address of the maintainer?", - "nl": "Wat is het email-adres van de beheerder?", - "de": "Wie lautet die E-Mail-Adresse des Betreuers?" - }, - "freeform": { - "key": "email", - "type": "email" - }, - "render": "{email}", - "id": "bike_repair_station-email" - }, - { - "question": { - "en": "What is the phone number of the maintainer?", - "nl": "Wat is het telefoonnummer van de beheerder?", - "de": "Wie lautet die Telefonnummer des Betreibers?" - }, - "freeform": { - "key": "phone", - "type": "phone" - }, - "render": "{phone}", - "id": "bike_repair_station-phone" - }, - { - "question": { - "nl": "Wanneer is dit fietsherstelpunt open?", - "en": "When is this bicycle repair point open?", - "fr": "Quand ce point de réparation de vélo est-il ouvert ?", - "it": "Quando è aperto questo punto riparazione bici?", - "de": "Wann ist diese Fahrradreparaturstelle geöffnet?", - "ru": "Когда работает эта точка обслуживания велосипедов?" - }, - "render": "{opening_hours_table()}", - "freeform": { - "key": "opening_hours", - "type": "opening_hours" - }, - "mappings": [ - { - "if": "opening_hours=24/7", - "then": { - "nl": "Dag en nacht open", - "en": "Always open", - "fr": "Ouvert en permanence", - "it": "Sempre aperto", - "de": "Immer geöffnet", - "ru": "Всегда открыто", - "pt_BR": "Sempre aberto", - "pt": "Sempre aberto" - } - }, - { - "if": "opening_hours=", - "then": { - "nl": "Dag en nacht open", - "en": "Always open", - "fr": "Ouvert en permanence", - "it": "Sempre aperto", - "de": "Immer geöffnet", - "pt_BR": "Sempre aberto", - "pt": "Sempre aberto" - }, - "hideInAnswer": true - } - ], - "id": "bike_repair_station-opening_hours" - }, - { - "id": "bike_repair_station-bike-chain-tool", - "question": { - "en": "Does this bike repair station have a special tool to repair your bike chain?", - "nl": "Heeft dit herstelpunt een speciale reparatieset voor je ketting?", - "fr": "Est-ce que cette station vélo a un outil specifique pour réparer la chaîne du vélo ?", - "gl": "Esta estación de arranxo de bicicletas ten unha ferramenta especial para arranxar a cadea da túa bicicleta?", - "de": "Verfügt diese Fahrrad-Reparaturstation über Spezialwerkzeug zur Reparatur von Fahrradketten?", - "it": "Questa stazione di riparazione bici ha un attrezzo speciale per riparare la catena della bici?" - }, - "condition": "service:bicycle:tools=yes", - "mappings": [ - { - "if": "service:bicycle:chain_tool=yes", - "then": { - "en": "There is a chain tool", - "nl": "Er is een reparatieset voor je ketting", - "fr": "Il y a un outil pour réparer la chaine", - "gl": "Hai unha ferramenta para a cadea", - "de": "Es gibt ein Kettenwerkzeug", - "it": "È presente un utensile per riparare la catena", - "pt_BR": "Há uma ferramenta de corrente", - "pt": "Há uma ferramenta de corrente" - } - }, - { - "if": "service:bicycle:chain_tool=no", - "then": { - "en": "There is no chain tool", - "nl": "Er is geen reparatieset voor je ketting", - "fr": "Il n'y a pas d'outil pour réparer la chaine", - "gl": "Non hai unha ferramenta para a cadea", - "de": "Es gibt kein Kettenwerkzeug", - "it": "Non è presente un utensile per riparare la catena", - "pt_BR": "Não há uma ferramenta de corrente", - "pt": "Não há uma ferramenta de corrente" - } - } + "if": { + "and": [ + "service:bicycle:tools=yes", + "service:bicycle:pump=no" ] + }, + "then": { + "en": "There are only tools (screwdrivers, pliers...) present", + "nl": "Er is enkel gereedschap aanwezig (schroevendraaier, tang...)", + "fr": "Il y a seulement des outils (tournevis, pinces...)", + "gl": "Só hai ferramentas (desaparafusadores, alicates...) presentes", + "de": "Es sind nur Werkzeuge (Schraubenzieher, Zangen...) vorhanden", + "it": "Ci sono solo degli attrezzi (cacciaviti, pinze…) presenti", + "pt_BR": "Há somente ferramentas (chaves de fenda, alicates...) presentes", + "pt": "Há somente ferramentas (chaves de fenda, alicates...) presentes" + } }, { - "id": "bike_repair_station-bike-stand", - "question": { - "en": "Does this bike station have a hook to hang your bike on or a stand to raise it?", - "nl": "Heeft dit herstelpunt een haak of standaard om je fiets op te hangen/zetten?", - "fr": "Est-ce que cette station vélo à un crochet pour suspendre son vélo ou une accroche pour l'élevé ?", - "gl": "Esta estación de bicicletas ten un guindastre para pendurar a túa bicicleta ou un soporte para elevala?", - "de": "Hat diese Fahrradstation einen Haken, an dem Sie Ihr Fahrrad aufhängen können, oder einen Ständer, um es anzuheben?", - "it": "Questa stazione bici ha un gancio per tenere sospesa la bici o un supporto per alzarla?" - }, - "condition": "service:bicycle:tools=yes", - "mappings": [ - { - "if": "service:bicycle:stand=yes", - "then": { - "en": "There is a hook or stand", - "nl": "Er is een haak of standaard", - "fr": "Il y a un crochet ou une accroche", - "gl": "Hai un guindastre ou soporte", - "de": "Es gibt einen Haken oder Ständer", - "it": "C’è un gancio o un supporto", - "pt_BR": "Há um gancho ou um suporte", - "pt": "Há um gancho ou um suporte" - } - }, - { - "if": "service:bicycle:stand=no", - "then": { - "en": "There is no hook or stand", - "nl": "Er is geen haak of standaard", - "fr": "Il n'y pas de crochet ou d'accroche", - "gl": "Non hai un guindastre ou soporte", - "de": "Es gibt keinen Haken oder Ständer", - "it": "Non c’è né un gancio né un supporto", - "pt_BR": "Não há um gancho ou um suporte", - "pt": "Não há um gancho ou um suporte" - } - } + "if": { + "and": [ + "service:bicycle:tools=yes", + "service:bicycle:pump=yes" ] + }, + "then": { + "en": "There are both tools and a pump present", + "nl": "Er is zowel een pomp als gereedschap aanwezig", + "fr": "Il y a des outils et une pompe", + "gl": "Hai ferramentas e unha bomba de ar presentes", + "de": "Es sind sowohl Werkzeuge als auch eine Pumpe vorhanden", + "it": "Ci sono sia attrezzi che pompa presenti", + "pt_BR": "Há tanto ferramentas e uma bomba presente", + "pt": "Há tanto ferramentas e uma bomba presente" + } + } + ] + }, + { + "question": { + "en": "Who maintains this cycle pump?", + "nl": "Wie beheert deze fietspomp?", + "fr": "Qui maintient cette pompe à vélo ?", + "it": "Chi gestisce questa pompa per bici?", + "de": "Wer wartet diese Fahrradpumpe?", + "pt_BR": "Quem faz a manutenção desta bomba de ciclo?", + "pt": "Quem faz a manutenção desta bomba de ciclo?" + }, + "render": { + "nl": "Beheer door {operator}", + "en": "Maintained by {operator}", + "fr": "Mantenue par {operator}", + "it": "Manutenuta da {operator}", + "de": "Gewartet von {operator}", + "pt_BR": "Mantida por {operator}", + "pt": "Mantida por {operator}" + }, + "freeform": { + "key": "operator" + }, + "mappings": [ + { + "if": "operator=De Fietsambassade Gent", + "then": "De Fietsambassade Gent", + "hideInAnswer": "_country!=be" + } + ], + "id": "bike_repair_station-operator" + }, + { + "question": { + "en": "What is the email address of the maintainer?", + "nl": "Wat is het email-adres van de beheerder?", + "de": "Wie lautet die E-Mail-Adresse des Betreuers?" + }, + "freeform": { + "key": "email", + "type": "email" + }, + "render": "{email}", + "id": "bike_repair_station-email" + }, + { + "question": { + "en": "What is the phone number of the maintainer?", + "nl": "Wat is het telefoonnummer van de beheerder?", + "de": "Wie lautet die Telefonnummer des Betreibers?" + }, + "freeform": { + "key": "phone", + "type": "phone" + }, + "render": "{phone}", + "id": "bike_repair_station-phone" + }, + { + "question": { + "nl": "Wanneer is dit fietsherstelpunt open?", + "en": "When is this bicycle repair point open?", + "fr": "Quand ce point de réparation de vélo est-il ouvert ?", + "it": "Quando è aperto questo punto riparazione bici?", + "de": "Wann ist diese Fahrradreparaturstelle geöffnet?", + "ru": "Когда работает эта точка обслуживания велосипедов?" + }, + "render": "{opening_hours_table()}", + "freeform": { + "key": "opening_hours", + "type": "opening_hours" + }, + "mappings": [ + { + "if": "opening_hours=24/7", + "then": { + "nl": "Dag en nacht open", + "en": "Always open", + "fr": "Ouvert en permanence", + "it": "Sempre aperto", + "de": "Immer geöffnet", + "ru": "Всегда открыто", + "pt_BR": "Sempre aberto", + "pt": "Sempre aberto" + } }, { - "question": { - "en": "Is the bike pump still operational?", - "nl": "Werkt de fietspomp nog?", - "fr": "La pompe à vélo fonctionne-t-elle toujours ?", - "gl": "Segue a funcionar a bomba de ar?", - "de": "Ist die Fahrradpumpe noch funktionstüchtig?", - "it": "La pompa per bici è sempre funzionante?", - "ru": "Велосипедный насос все еще работает?", - "pl": "Czy pompka rowerowa jest nadal sprawna?" - }, - "condition": "service:bicycle:pump=yes", - "mappings": [ - { - "if": "service:bicycle:pump:operational_status=broken", - "then": { - "en": "The bike pump is broken", - "nl": "De fietspomp is kapot", - "fr": "La pompe à vélo est cassée", - "gl": "A bomba de ar está estragada", - "de": "Die Fahrradpumpe ist kaputt", - "it": "La pompa per bici è guasta", - "ru": "Велосипедный насос сломан", - "pl": "Pompka rowerowa jest zepsuta" - } - }, - { - "if": "service:bicycle:pump:operational_status=", - "then": { - "en": "The bike pump is operational", - "nl": "De fietspomp werkt nog", - "fr": "La pompe est opérationnelle", - "gl": "A bomba de ar está operativa", - "de": "Die Fahrradpumpe ist betriebsbereit", - "it": "La pompa per bici funziona", - "ru": "Велосипедный насос работает", - "pl": "Pompka rowerowa jest sprawna" - } - } - ], - "id": "Operational status" + "if": "opening_hours=", + "then": { + "nl": "Dag en nacht open", + "en": "Always open", + "fr": "Ouvert en permanence", + "it": "Sempre aperto", + "de": "Immer geöffnet", + "pt_BR": "Sempre aberto", + "pt": "Sempre aberto" + }, + "hideInAnswer": true + } + ], + "id": "bike_repair_station-opening_hours" + }, + { + "id": "bike_repair_station-bike-chain-tool", + "question": { + "en": "Does this bike repair station have a special tool to repair your bike chain?", + "nl": "Heeft dit herstelpunt een speciale reparatieset voor je ketting?", + "fr": "Est-ce que cette station vélo a un outil specifique pour réparer la chaîne du vélo ?", + "gl": "Esta estación de arranxo de bicicletas ten unha ferramenta especial para arranxar a cadea da túa bicicleta?", + "de": "Verfügt diese Fahrrad-Reparaturstation über Spezialwerkzeug zur Reparatur von Fahrradketten?", + "it": "Questa stazione di riparazione bici ha un attrezzo speciale per riparare la catena della bici?" + }, + "condition": "service:bicycle:tools=yes", + "mappings": [ + { + "if": "service:bicycle:chain_tool=yes", + "then": { + "en": "There is a chain tool", + "nl": "Er is een reparatieset voor je ketting", + "fr": "Il y a un outil pour réparer la chaine", + "gl": "Hai unha ferramenta para a cadea", + "de": "Es gibt ein Kettenwerkzeug", + "it": "È presente un utensile per riparare la catena", + "pt_BR": "Há uma ferramenta de corrente", + "pt": "Há uma ferramenta de corrente" + } }, { - "condition": { - "and": [ - "email~*", - "service:bicycle:pump:operational_status=broken" - ] - }, - "render": { - "en": "Report this bicycle pump as broken", - "nl": "Rapporteer deze fietspomp als kapot", - "de": "Melde diese Fahrradpumpe als kaputt" - }, - "id": "Email maintainer" + "if": "service:bicycle:chain_tool=no", + "then": { + "en": "There is no chain tool", + "nl": "Er is geen reparatieset voor je ketting", + "fr": "Il n'y a pas d'outil pour réparer la chaine", + "gl": "Non hai unha ferramenta para a cadea", + "de": "Es gibt kein Kettenwerkzeug", + "it": "Non è presente un utensile per riparare la catena", + "pt_BR": "Não há uma ferramenta de corrente", + "pt": "Não há uma ferramenta de corrente" + } + } + ] + }, + { + "id": "bike_repair_station-bike-stand", + "question": { + "en": "Does this bike station have a hook to hang your bike on or a stand to raise it?", + "nl": "Heeft dit herstelpunt een haak of standaard om je fiets op te hangen/zetten?", + "fr": "Est-ce que cette station vélo à un crochet pour suspendre son vélo ou une accroche pour l'élevé ?", + "gl": "Esta estación de bicicletas ten un guindastre para pendurar a túa bicicleta ou un soporte para elevala?", + "de": "Hat diese Fahrradstation einen Haken, an dem Sie Ihr Fahrrad aufhängen können, oder einen Ständer, um es anzuheben?", + "it": "Questa stazione bici ha un gancio per tenere sospesa la bici o un supporto per alzarla?" + }, + "condition": "service:bicycle:tools=yes", + "mappings": [ + { + "if": "service:bicycle:stand=yes", + "then": { + "en": "There is a hook or stand", + "nl": "Er is een haak of standaard", + "fr": "Il y a un crochet ou une accroche", + "gl": "Hai un guindastre ou soporte", + "de": "Es gibt einen Haken oder Ständer", + "it": "C’è un gancio o un supporto", + "pt_BR": "Há um gancho ou um suporte", + "pt": "Há um gancho ou um suporte" + } }, { - "question": { - "en": "What valves are supported?", - "nl": "Welke ventielen werken er met de pomp?", - "fr": "Quelles valves sont compatibles ?", - "gl": "Que válvulas son compatíbeis?", - "de": "Welche Ventile werden unterstützt?", - "it": "Quali valvole sono supportate?", - "pl": "Jakie zawory są obsługiwane?" - }, - "render": { - "en": "This pump supports the following valves: {valves}", - "nl": "Deze pomp werkt met de volgende ventielen: {valves}", - "fr": "Cette pompe est compatible avec les valves suivantes : {valves}", - "gl": "Esta bomba de ar admite as seguintes válvulas: {valves}", - "de": "Diese Pumpe unterstützt die folgenden Ventile: {valves}", - "it": "Questa pompa è compatibile con le seguenti valvole: {valves}", - "ru": "Этот насос поддерживает следующие клапаны: {valves}", - "pl": "Ta pompka obsługuje następujące zawory: {valves}" - }, - "freeform": { - "#addExtraTags": [ - "fixme=Freeform 'valves'-tag used: possibly a wrong value" - ], - "key": "valves" - }, - "multiAnswer": true, - "mappings": [ - { - "if": "valves=sclaverand", - "then": { - "en": "Sclaverand (also known as Presta)", - "nl": "Sclaverand (ook gekend als Presta)", - "fr": "Sclaverand (aussi appelé Presta)", - "gl": "Sclaverand (tamén coñecido como Presta)", - "de": "Sklaverand (auch bekannt als Presta)", - "it": "Sclaverand (detta anche Presta)", - "ru": "Клапан Presta (также известный как французский клапан)" - } - }, - { - "if": "valves=dunlop", - "then": { - "en": "Dunlop", - "nl": "Dunlop", - "fr": "Dunlop", - "gl": "Dunlop", - "de": "Dunlop", - "it": "Dunlop", - "ru": "Клапан Dunlop" - } - }, - { - "if": "valves=schrader", - "then": { - "en": "Schrader (cars)", - "nl": "Schrader (auto's)", - "fr": "Schrader (les valves de voitures)", - "gl": "Schrader (para automóbiles)", - "de": "Schrader (Autos)", - "it": "Schrader (valvola delle auto)" - } - } - ], - "id": "bike_repair_station-valves" + "if": "service:bicycle:stand=no", + "then": { + "en": "There is no hook or stand", + "nl": "Er is geen haak of standaard", + "fr": "Il n'y pas de crochet ou d'accroche", + "gl": "Non hai un guindastre ou soporte", + "de": "Es gibt keinen Haken oder Ständer", + "it": "Non c’è né un gancio né un supporto", + "pt_BR": "Não há um gancho ou um suporte", + "pt": "Não há um gancho ou um suporte" + } + } + ] + }, + { + "question": { + "en": "Is the bike pump still operational?", + "nl": "Werkt de fietspomp nog?", + "fr": "La pompe à vélo fonctionne-t-elle toujours ?", + "gl": "Segue a funcionar a bomba de ar?", + "de": "Ist die Fahrradpumpe noch funktionstüchtig?", + "it": "La pompa per bici è sempre funzionante?", + "ru": "Велосипедный насос все еще работает?", + "pl": "Czy pompka rowerowa jest nadal sprawna?" + }, + "condition": "service:bicycle:pump=yes", + "mappings": [ + { + "if": "service:bicycle:pump:operational_status=broken", + "then": { + "en": "The bike pump is broken", + "nl": "De fietspomp is kapot", + "fr": "La pompe à vélo est cassée", + "gl": "A bomba de ar está estragada", + "de": "Die Fahrradpumpe ist kaputt", + "it": "La pompa per bici è guasta", + "ru": "Велосипедный насос сломан", + "pl": "Pompka rowerowa jest zepsuta" + } }, { - "id": "bike_repair_station-electrical_pump", - "question": { - "en": "Is this an electric bike pump?", - "nl": "Is dit een electrische fietspomp?", - "fr": "Est-ce que cette pompe est électrique ?", - "gl": "Esta é unha bomba de ar eléctrica?", - "de": "Ist dies eine elektrische Fahrradpumpe?", - "it": "Questa pompa per bici è elettrica?", - "ru": "Это электрический велосипедный насос?", - "pl": "Czy jest to elektryczna pompka do roweru?" - }, - "condition": "service:bicycle:pump=yes", - "mappings": [ - { - "if": "manual=yes", - "then": { - "en": "Manual pump", - "nl": "Manuele pomp", - "fr": "Pompe manuelle", - "gl": "Bomba de ar manual", - "de": "Manuelle Pumpe", - "it": "Pompa manuale", - "ru": "Ручной насос", - "pl": "Pompa ręczna", - "pt_BR": "Bomba manual", - "pt": "Bomba manual" - } - }, - { - "if": "manual=no", - "then": { - "en": "Electrical pump", - "nl": "Electrische pomp", - "fr": "Pompe électrique", - "gl": "Bomba de ar eléctrica", - "de": "Elektrische Pumpe", - "it": "Pompa elettrica", - "ru": "Электрический насос", - "pl": "Pompka elektryczna", - "pt_BR": "Bomba elétrica", - "pt": "Bomba elétrica" - } - } - ] + "if": "service:bicycle:pump:operational_status=", + "then": { + "en": "The bike pump is operational", + "nl": "De fietspomp werkt nog", + "fr": "La pompe est opérationnelle", + "gl": "A bomba de ar está operativa", + "de": "Die Fahrradpumpe ist betriebsbereit", + "it": "La pompa per bici funziona", + "ru": "Велосипедный насос работает", + "pl": "Pompka rowerowa jest sprawna" + } + } + ], + "id": "Operational status" + }, + { + "condition": { + "and": [ + "email~*", + "service:bicycle:pump:operational_status=broken" + ] + }, + "render": { + "en": "Report this bicycle pump as broken", + "nl": "Rapporteer deze fietspomp als kapot", + "de": "Melde diese Fahrradpumpe als kaputt" + }, + "id": "Email maintainer" + }, + { + "question": { + "en": "What valves are supported?", + "nl": "Welke ventielen werken er met de pomp?", + "fr": "Quelles valves sont compatibles ?", + "gl": "Que válvulas son compatíbeis?", + "de": "Welche Ventile werden unterstützt?", + "it": "Quali valvole sono supportate?", + "pl": "Jakie zawory są obsługiwane?" + }, + "render": { + "en": "This pump supports the following valves: {valves}", + "nl": "Deze pomp werkt met de volgende ventielen: {valves}", + "fr": "Cette pompe est compatible avec les valves suivantes : {valves}", + "gl": "Esta bomba de ar admite as seguintes válvulas: {valves}", + "de": "Diese Pumpe unterstützt die folgenden Ventile: {valves}", + "it": "Questa pompa è compatibile con le seguenti valvole: {valves}", + "ru": "Этот насос поддерживает следующие клапаны: {valves}", + "pl": "Ta pompka obsługuje następujące zawory: {valves}" + }, + "freeform": { + "#addExtraTags": [ + "fixme=Freeform 'valves'-tag used: possibly a wrong value" + ], + "key": "valves" + }, + "multiAnswer": true, + "mappings": [ + { + "if": "valves=sclaverand", + "then": { + "en": "Sclaverand (also known as Presta)", + "nl": "Sclaverand (ook gekend als Presta)", + "fr": "Sclaverand (aussi appelé Presta)", + "gl": "Sclaverand (tamén coñecido como Presta)", + "de": "Sklaverand (auch bekannt als Presta)", + "it": "Sclaverand (detta anche Presta)", + "ru": "Клапан Presta (также известный как французский клапан)" + } }, { - "id": "bike_repair_station-manometer", - "question": { - "en": "Does the pump have a pressure indicator or manometer?", - "nl": "Heeft deze pomp een luchtdrukmeter?", - "fr": "Est-ce que la pompe à un manomètre integré ?", - "gl": "Ten a bomba de ar un indicador de presión ou un manómetro?", - "de": "Verfügt die Pumpe über einen Druckanzeiger oder ein Manometer?", - "it": "Questa pompa ha l’indicatore della pressione o il manometro?", - "pl": "Czy pompka posiada wskaźnik ciśnienia lub manometr?" - }, - "condition": "service:bicycle:pump=yes", - "mappings": [ - { - "if": "manometer=yes", - "then": { - "en": "There is a manometer", - "nl": "Er is een luchtdrukmeter", - "fr": "Il y a un manomètre", - "gl": "Hai manómetro", - "de": "Es gibt ein Manometer", - "it": "C’è un manometro", - "ru": "Есть манометр", - "pl": "Jest manometr", - "pt_BR": "Há um manômetro", - "pt": "Há um manômetro" - } - }, - { - "if": "manometer=no", - "then": { - "en": "There is no manometer", - "nl": "Er is geen luchtdrukmeter", - "fr": "Il n'y a pas de manomètre", - "gl": "Non hai manómetro", - "de": "Es gibt kein Manometer", - "it": "Non c’è un manometro", - "ru": "Нет манометра", - "pl": "Nie ma manometru", - "pt_BR": "Não há um manômetro", - "pt": "Não há um manômetro" - } - }, - { - "if": "manometer=broken", - "then": { - "en": "There is manometer but it is broken", - "nl": "Er is een luchtdrukmeter maar die is momenteel defect", - "fr": "Il y a un manomètre mais il est cassé", - "gl": "Hai manómetro pero está estragado", - "de": "Es gibt ein Manometer, aber es ist kaputt", - "it": "C’è un manometro ma è rotto", - "ru": "Есть манометр, но он сломан", - "pl": "Jest manometr, ale jest uszkodzony", - "pt_BR": "Há um manômetro mas está quebrado", - "pt": "Há um manômetro mas está quebrado" - } - } - ] + "if": "valves=dunlop", + "then": { + "en": "Dunlop", + "nl": "Dunlop", + "fr": "Dunlop", + "gl": "Dunlop", + "de": "Dunlop", + "it": "Dunlop", + "ru": "Клапан Dunlop" + } }, - "level" - ], - "icon": { + { + "if": "valves=schrader", + "then": { + "en": "Schrader (cars)", + "nl": "Schrader (auto's)", + "fr": "Schrader (les valves de voitures)", + "gl": "Schrader (para automóbiles)", + "de": "Schrader (Autos)", + "it": "Schrader (valvola delle auto)" + } + } + ], + "id": "bike_repair_station-valves" + }, + { + "id": "bike_repair_station-electrical_pump", + "question": { + "en": "Is this an electric bike pump?", + "nl": "Is dit een electrische fietspomp?", + "fr": "Est-ce que cette pompe est électrique ?", + "gl": "Esta é unha bomba de ar eléctrica?", + "de": "Ist dies eine elektrische Fahrradpumpe?", + "it": "Questa pompa per bici è elettrica?", + "ru": "Это электрический велосипедный насос?", + "pl": "Czy jest to elektryczna pompka do roweru?" + }, + "condition": "service:bicycle:pump=yes", + "mappings": [ + { + "if": "manual=yes", + "then": { + "en": "Manual pump", + "nl": "Manuele pomp", + "fr": "Pompe manuelle", + "gl": "Bomba de ar manual", + "de": "Manuelle Pumpe", + "it": "Pompa manuale", + "ru": "Ручной насос", + "pl": "Pompa ręczna", + "pt_BR": "Bomba manual", + "pt": "Bomba manual" + } + }, + { + "if": "manual=no", + "then": { + "en": "Electrical pump", + "nl": "Electrische pomp", + "fr": "Pompe électrique", + "gl": "Bomba de ar eléctrica", + "de": "Elektrische Pumpe", + "it": "Pompa elettrica", + "ru": "Электрический насос", + "pl": "Pompka elektryczna", + "pt_BR": "Bomba elétrica", + "pt": "Bomba elétrica" + } + } + ] + }, + { + "id": "bike_repair_station-manometer", + "question": { + "en": "Does the pump have a pressure indicator or manometer?", + "nl": "Heeft deze pomp een luchtdrukmeter?", + "fr": "Est-ce que la pompe à un manomètre integré ?", + "gl": "Ten a bomba de ar un indicador de presión ou un manómetro?", + "de": "Verfügt die Pumpe über einen Druckanzeiger oder ein Manometer?", + "it": "Questa pompa ha l’indicatore della pressione o il manometro?", + "pl": "Czy pompka posiada wskaźnik ciśnienia lub manometr?" + }, + "condition": "service:bicycle:pump=yes", + "mappings": [ + { + "if": "manometer=yes", + "then": { + "en": "There is a manometer", + "nl": "Er is een luchtdrukmeter", + "fr": "Il y a un manomètre", + "gl": "Hai manómetro", + "de": "Es gibt ein Manometer", + "it": "C’è un manometro", + "ru": "Есть манометр", + "pl": "Jest manometr", + "pt_BR": "Há um manômetro", + "pt": "Há um manômetro" + } + }, + { + "if": "manometer=no", + "then": { + "en": "There is no manometer", + "nl": "Er is geen luchtdrukmeter", + "fr": "Il n'y a pas de manomètre", + "gl": "Non hai manómetro", + "de": "Es gibt kein Manometer", + "it": "Non c’è un manometro", + "ru": "Нет манометра", + "pl": "Nie ma manometru", + "pt_BR": "Não há um manômetro", + "pt": "Não há um manômetro" + } + }, + { + "if": "manometer=broken", + "then": { + "en": "There is manometer but it is broken", + "nl": "Er is een luchtdrukmeter maar die is momenteel defect", + "fr": "Il y a un manomètre mais il est cassé", + "gl": "Hai manómetro pero está estragado", + "de": "Es gibt ein Manometer, aber es ist kaputt", + "it": "C’è un manometro ma è rotto", + "ru": "Есть манометр, но он сломан", + "pl": "Jest manometr, ale jest uszkodzony", + "pt_BR": "Há um manômetro mas está quebrado", + "pt": "Há um manômetro mas está quebrado" + } + } + ] + }, + "level" + ], + "presets": [ + { + "title": { + "en": "Bike pump", + "nl": "Fietspomp", + "fr": "Pompe à vélo", + "gl": "Bomba de ar", + "de": "Fahrradpumpe", + "it": "Pompa per bici", + "ru": "Велосипедный насос", + "fi": "Pyöräpumppu", + "pl": "Pompka do roweru", + "pt_BR": "Bomba de bicicleta" + }, + "tags": [ + "amenity=bicycle_repair_station", + "service:bicycle:tools=no", + "service:bicycle:pump=yes" + ], + "description": { + "en": "A device to inflate your tires on a fixed location in the public space.

Examples of bicycle pumps

", + "nl": "Een apparaat waar je je fietsbanden kan oppompen, beschikbaar in de publieke ruimte. De fietspomp in je kelder telt dus niet.

Voorbeelden

Examples of bicycle pumps

", + "it": "Un dispositivo per gonfiare le proprie gomme in un luogo fisso pubblicamente accessibile.

Esempi di pompe per biciclette

", + "fr": "Un dispositif pour gonfler vos pneus sur un emplacement fixe dans l'espace public.

Exemples de pompes à vélo

", + "de": "Ein Gerät zum Aufpumpen von Reifen an einem festen Standort im öffentlichen Raum.

Beispiele für Fahrradpumpen

", + "pl": "Urządzenie do pompowania opon w stałym miejscu w przestrzeni publicznej.

Przykłady pompek rowerowych

", + "pt_BR": "Um dispositivo para encher seus pneus em um local fixa no espaço público

Exemplos de bombas de bicicletas

", + "pt": "Um aparelho para encher os seus pneus num local fixa no espaço público

Exemplos de bombas de bicicletas

" + } + }, + { + "title": { + "en": "Bike repair station and pump", + "nl": "Herstelpunt en pomp", + "fr": "Point de réparation vélo avec pompe", + "gl": "Estación de arranxo de bicicletas con bomba de ar", + "de": "Fahrrad-Reparaturstation und Pumpe", + "it": "Stazione di riparazione bici e pompa", + "pl": "Stacja naprawy rowerów i pompka" + }, + "tags": [ + "amenity=bicycle_repair_station", + "service:bicycle:tools=yes", + "service:bicycle:pump=yes" + ], + "description": { + "en": "A device with tools to repair your bike combined with a pump at a fixed location. The tools are often secured with chains against theft.

Example

", + "nl": "Een apparaat met zowel gereedschap om je fiets te herstellen, met een pomp. Deze zijn op een vastgemaakt op een plaats in de publieke ruimte, bv. aan een paal.

Voorbeeld

", + "fr": "Un dispositif avec des outils pour réparer votre vélo combiné à une pompe a un emplacement fixe. Les outils sont souvent attachés par une chaîne pour empêcher le vol.

Exemple

", + "it": "Un dispositivo con attrezzi per riparare la tua bici e una pompa in un luogo fisso. Gli attrezzi sono spesso attaccati ad una catena per prevenire il furto.

Esempio

", + "de": "Ein Gerät mit Werkzeugen zur Reparatur von Fahrrädern kombiniert mit einer Pumpe an einem festen Standort. Die Werkzeuge sind oft mit Ketten gegen Diebstahl gesichert.

Beispiel

" + } + }, + { + "title": { + "en": "Bike repair station without pump", + "nl": "Herstelpunt zonder pomp", + "fr": "Point de réparation vélo sans pompe", + "gl": "Estación de arranxo de bicicletas sin bomba de ar", + "de": "Fahrrad-Reparaturstation ohne Pumpe", + "it": "Stazione di riparazione bici senza pompa" + }, + "tags": [ + "amenity=bicycle_repair_station", + "service:bicycle:tools=yes", + "service:bicycle:pump=no" + ] + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity:={amenity}", + "amenity=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { "render": "./assets/layers/bike_repair_station/repair_station.svg", "mappings": [ - { - "if": { - "and": [ - "service:bicycle:pump=no", - "service:bicycle:pump:operational_status=broken" - ] - }, - "then": "./assets/layers/bike_repair_station/repair_station.svg" + { + "if": { + "and": [ + "service:bicycle:pump=no", + "service:bicycle:pump:operational_status=broken" + ] }, - { - "if": { - "and": [ - "service:bicycle:pump=yes", - "service:bicycle:tools=yes" - ] - }, - "then": "./assets/layers/bike_repair_station/repair_station_pump.svg" + "then": "./assets/layers/bike_repair_station/repair_station.svg" + }, + { + "if": { + "and": [ + "service:bicycle:pump=yes", + "service:bicycle:tools=yes" + ] }, - { - "if": { - "and": [ - "service:bicycle:pump:operational_status=broken", - "service:bicycle:tools=no" - ] - }, - "then": "./assets/layers/bike_repair_station/broken_pump_2.svg" + "then": "./assets/layers/bike_repair_station/repair_station_pump.svg" + }, + { + "if": { + "and": [ + "service:bicycle:pump:operational_status=broken", + "service:bicycle:tools=no" + ] }, - { - "if": { - "and": [ - "service:bicycle:pump=yes", - { - "or": [ - "service:bicycle:tools=no", - "service:bicycle:tools=" - ] - } - ] - }, - "then": "./assets/layers/bike_repair_station/pump.svg" - } + "then": "./assets/layers/bike_repair_station/broken_pump_2.svg" + }, + { + "if": { + "and": [ + "service:bicycle:pump=yes", + { + "or": [ + "service:bicycle:tools=no", + "service:bicycle:tools=" + ] + } + ] + }, + "then": "./assets/layers/bike_repair_station/pump.svg" + } ] - }, - "iconOverlays": [ + }, + "iconBadges": [ { - "if": "operator=De Fietsambassade Gent", - "then": "./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg", - "badge": true + "if": "operator=De Fietsambassade Gent", + "then": "./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg" } - ], - "iconSize": { + ], + "iconSize": { "render": "50,50,bottom" + }, + "location": [ + "point", + "centroid" + ] }, - "color": { + { + "color": { "render": "#00f" - }, - "width": { + }, + "width": { "render": "1" - }, - "wayHandling": 2, - "presets": [ - { - "title": { - "en": "Bike pump", - "nl": "Fietspomp", - "fr": "Pompe à vélo", - "gl": "Bomba de ar", - "de": "Fahrradpumpe", - "it": "Pompa per bici", - "ru": "Велосипедный насос", - "fi": "Pyöräpumppu", - "pl": "Pompka do roweru", - "pt_BR": "Bomba de bicicleta" - }, - "tags": [ - "amenity=bicycle_repair_station", - "service:bicycle:tools=no", - "service:bicycle:pump=yes" - ], - "description": { - "en": "A device to inflate your tires on a fixed location in the public space.

Examples of bicycle pumps

", - "nl": "Een apparaat waar je je fietsbanden kan oppompen, beschikbaar in de publieke ruimte. De fietspomp in je kelder telt dus niet.

Voorbeelden

Examples of bicycle pumps

", - "it": "Un dispositivo per gonfiare le proprie gomme in un luogo fisso pubblicamente accessibile.

Esempi di pompe per biciclette

", - "fr": "Un dispositif pour gonfler vos pneus sur un emplacement fixe dans l'espace public.

Exemples de pompes à vélo

", - "de": "Ein Gerät zum Aufpumpen von Reifen an einem festen Standort im öffentlichen Raum.

Beispiele für Fahrradpumpen

", - "pl": "Urządzenie do pompowania opon w stałym miejscu w przestrzeni publicznej.

Przykłady pompek rowerowych

", - "pt_BR": "Um dispositivo para encher seus pneus em um local fixa no espaço público

Exemplos de bombas de bicicletas

", - "pt": "Um aparelho para encher os seus pneus num local fixa no espaço público

Exemplos de bombas de bicicletas

" - } - }, - { - "title": { - "en": "Bike repair station and pump", - "nl": "Herstelpunt en pomp", - "fr": "Point de réparation vélo avec pompe", - "gl": "Estación de arranxo de bicicletas con bomba de ar", - "de": "Fahrrad-Reparaturstation und Pumpe", - "it": "Stazione di riparazione bici e pompa", - "pl": "Stacja naprawy rowerów i pompka" - }, - "tags": [ - "amenity=bicycle_repair_station", - "service:bicycle:tools=yes", - "service:bicycle:pump=yes" - ], - "description": { - "en": "A device with tools to repair your bike combined with a pump at a fixed location. The tools are often secured with chains against theft.

Example

", - "nl": "Een apparaat met zowel gereedschap om je fiets te herstellen, met een pomp. Deze zijn op een vastgemaakt op een plaats in de publieke ruimte, bv. aan een paal.

Voorbeeld

", - "fr": "Un dispositif avec des outils pour réparer votre vélo combiné à une pompe a un emplacement fixe. Les outils sont souvent attachés par une chaîne pour empêcher le vol.

Exemple

", - "it": "Un dispositivo con attrezzi per riparare la tua bici e una pompa in un luogo fisso. Gli attrezzi sono spesso attaccati ad una catena per prevenire il furto.

Esempio

", - "de": "Ein Gerät mit Werkzeugen zur Reparatur von Fahrrädern kombiniert mit einer Pumpe an einem festen Standort. Die Werkzeuge sind oft mit Ketten gegen Diebstahl gesichert.

Beispiel

" - } - }, - { - "title": { - "en": "Bike repair station without pump", - "nl": "Herstelpunt zonder pomp", - "fr": "Point de réparation vélo sans pompe", - "gl": "Estación de arranxo de bicicletas sin bomba de ar", - "de": "Fahrrad-Reparaturstation ohne Pumpe", - "it": "Stazione di riparazione bici senza pompa" - }, - "tags": [ - "amenity=bicycle_repair_station", - "service:bicycle:tools=yes", - "service:bicycle:pump=no" - ] - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity:={amenity}", - "amenity=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + } } + ] } \ No newline at end of file diff --git a/assets/layers/bike_shop/bike_shop.json b/assets/layers/bike_shop/bike_shop.json index 6cd8890c31..2f4bf3e0ec 100644 --- a/assets/layers/bike_shop/bike_shop.json +++ b/assets/layers/bike_shop/bike_shop.json @@ -1,756 +1,737 @@ { - "id": "bike_shop", - "name": { + "id": "bike_shop", + "name": { + "en": "Bike repair/shop", + "nl": "Fietszaak", + "fr": "Magasin ou réparateur de vélo", + "gl": "Tenda/arranxo de bicicletas", + "de": "Fahrradwerkstatt/geschäft", + "it": "Venditore/riparatore bici", + "ru": "Обслуживание велосипедов/магазин", + "pt_BR": "Reparo/loja de bicicletas", + "pt": "Reparo/loja de bicicletas" + }, + "minzoom": 13, + "source": { + "osmTags": { + "#": "We select all bicycle shops, sport shops (but we try to weed out non-bicycle related shops), and any shop with a bicycle related tag", + "or": [ + "shop=bicycle", + { + "#": "A bicycle rental with a network is something such as villo, bluebike, ... We don't want them", + "and": [ + "amenity=bicycle_rental", + "network=" + ] + }, + { + "#": "if sport is defined and is not bicycle, it is not matched; if bicycle retail/repair is marked as 'no', it is not shown to too.", + "##": "There will be a few false-positives with this. They will get filtered out by people marking both 'not selling bikes' and 'not repairing bikes'. Furthermore, the OSMers will add a sports-subcategory on it", + "and": [ + "shop=sports", + "service:bicycle:retail!=no", + "service:bicycle:repair!=no", + { + "or": [ + "sport=bicycle", + "sport=cycling", + "sport=" + ] + } + ] + } + ] + } + }, + "title": { + "render": { + "en": "Bike repair/shop", + "nl": "Fietszaak", + "fr": "Magasin ou réparateur de vélo", + "gl": "Tenda/arranxo de bicicletas", + "de": "Fahrradwerkstatt/geschäft", + "it": "Venditore/riparatore bici", + "ru": "Обслуживание велосипедов/магазин", + "pt_BR": "Reparo/loja de bicicletas", + "pt": "Reparo/loja de bicicletas" + }, + "mappings": [ + { + "if": { + "and": [ + "shop=sports" + ] + }, + "then": { + "en": "Sport gear shop {name}", + "nl": "Sportwinkel {name}", + "fr": "Magasin de sport {name}", + "it": "Negozio di articoli sportivi {name}", + "ru": "Магазин спортивного инвентаря {name}", + "de": "Sportartikelgeschäft {name}", + "pt_BR": "Loja de equipamentos esportivos {name}", + "pt": "Loja de equipamentos desportivos {name}" + } + }, + { + "if": { + "and": [ + "shop!~.*bicycle.*", + "shop~*" + ] + }, + "then": "Other shop" + }, + { + "if": { + "and": [ + { + "or": [ + "service:bicycle:rental=yes", + "amenity=bicycle_rental" + ] + } + ] + }, + "then": { + "nl": "Fietsverhuur {name}", + "en": "Bicycle rental {name}", + "fr": "Location de vélo {name}", + "it": "Noleggio di biciclette {name}", + "ru": "Прокат велосипедов {name}", + "de": "Fahrradverleih{name}", + "pt_BR": "Aluguel de bicicletas {name}", + "pt": "Aluguel de bicicletas {name}" + } + }, + { + "if": { + "and": [ + "service:bicycle:retail!~yes", + "service:bicycle:repair=yes" + ] + }, + "then": { + "en": "Bike repair {name}", + "nl": "Fietsenmaker {name}", + "fr": "Réparateur de vélo {name}", + "gl": "Arranxo de bicicletas {name}", + "de": "Fahrradwerkstatt {name}", + "it": "Riparazione biciclette {name", + "ru": "Ремонт велосипедов {name}", + "pt_BR": "Reparo de bicicletas {name}", + "pt": "Reparo de bicicletas {name}" + } + }, + { + "if": { + "and": [ + "service:bicycle:repair!~yes" + ] + }, + "then": { + "en": "Bike shop {name}", + "nl": "Fietswinkel {name}", + "fr": "Magasin de vélo {name}", + "gl": "Tenda de bicicletas {name}", + "de": "Fahrradgeschäft {name}", + "it": "Negozio di biciclette {name}", + "ru": "Магазин велосипедов {name}", + "pt_BR": "Loja de bicicletas {name}", + "pt": "Loja de bicicletas {name}" + } + }, + { + "if": "name~*", + "then": { + "en": "Bike repair/shop {name}", + "nl": "Fietszaak {name}", + "fr": "Magasin ou réparateur de vélo {name}", + "gl": "Tenda/arranxo de bicicletas {name}", + "de": "Fahrradwerkstatt/geschäft {name}", + "it": "Venditore/riparatore bici {name}", + "pt_BR": "Loja/reparo de bicicletas {name}", + "pt": "Loja/reparo de bicicletas {name}" + } + } + ] + }, + "titleIcons": [ + { + "render": "", + "condition": "operator=De Fietsambassade Gent" + }, + { + "condition": { + "or": [ + "service:bicycle:pump=yes", + "service:bicycle:pump=separate" + ] + }, + "render": "" + }, + { + "condition": "service:bicycle:diy=yes", + "render": "" + }, + { + "condition": "service:bicycle:cleaning=yes", + "render": "" + }, + "defaults" + ], + "description": { + "en": "A shop specifically selling bicycles or related items", + "nl": "Een winkel die hoofdzakelijk fietsen en fietstoebehoren verkoopt", + "fr": "Un magasin vendant spécifiquement des vélos ou des objets en lien", + "it": "Un negozio che vende specificatamente biciclette o articoli similari", + "ru": "Магазин, специализирующийся на продаже велосипедов или сопутствующих товаров", + "pt_BR": "Uma loja que vende especificamente bicicletas ou itens relacionados", + "de": "Ein Geschäft, das speziell Fahrräder oder verwandte Artikel verkauft", + "pt": "Uma loja que vende especificamente bicicletas ou itens relacionados" + }, + "tagRenderings": [ + "images", + { + "id": "bike_shop-is-bicycle_shop", + "condition": { + "and": [ + "shop~*", + "shop!~bicycle", + "shop!~sports" + ] + }, + "render": { + "en": "This shop is specialized in selling {shop} and does bicycle related activities", + "nl": "Deze winkel verkoopt {shop} en heeft fiets-gerelateerde activiteiten.", + "fr": "Ce magasin est spécialisé dans la vente de {shop} et a des activités liées au vélo", + "it": "Questo negozio è specializzato nella vendita di {shop} ed effettua attività relative alle biciclette", + "pt_BR": "Esta loja é especializada em vender {shop} e faz atividades relacionadas à bicicletas", + "de": "Dieses Geschäft ist auf den Verkauf von {shop} spezialisiert und im Bereich Fahrrad tätig", + "pt": "Esta loja é especializada em vender {shop} e faz atividades relacionadas à bicicletas" + } + }, + { + "question": { + "en": "What is the name of this bicycle shop?", + "nl": "Wat is de naam van deze fietszaak?", + "fr": "Quel est le nom du magasin de vélos ?", + "gl": "Cal é o nome desta tenda de bicicletas?", + "de": "Wie heißt dieser Fahrradladen?", + "it": "Qual è il nome di questo negozio di biciclette?", + "ru": "Как называется магазин велосипедов?", + "pt_BR": "Qual o nome desta loja de bicicletas?", + "pt": "Qual o nome desta loja de bicicletas?" + }, + "render": { + "en": "This bicycle shop is called {name}", + "nl": "Deze fietszaak heet {name}", + "fr": "Ce magasin s'appelle {name}", + "gl": "Esta tenda de bicicletas chámase {name}", + "de": "Dieses Fahrradgeschäft heißt {name}", + "it": "Questo negozio di biciclette è chiamato {name}", + "ru": "Этот магазин велосипедов называется {name}", + "pt_BR": "Esta loja de bicicletas se chama {name}", + "pt": "Esta loja de bicicletas se chama {name}" + }, + "freeform": { + "key": "name" + }, + "id": "bike_shop-name" + }, + { + "question": { + "en": "What is the website of {name}?", + "nl": "Wat is de website van {name}?", + "fr": "Quel est le site web de {name} ?", + "gl": "Cal é a páxina web de {name}?", + "it": "Qual è il sito web di {name}?", + "ru": "Какой сайт у {name}?", + "id": "URL {name} apa?", + "de": "Was ist die Webseite von {name}?", + "pt_BR": "Qual o website de {name}?", + "pt": "Qual o website de {name}?" + }, + "render": "{website}", + "freeform": { + "key": "website", + "type": "url" + }, + "id": "bike_shop-website" + }, + { + "question": { + "en": "What is the phone number of {name}?", + "nl": "Wat is het telefoonnummer van {name}?", + "fr": "Quel est le numéro de téléphone de {name} ?", + "gl": "Cal é o número de teléfono de {name}?", + "it": "Qual è il numero di telefono di {name}?", + "ru": "Какой номер телефона у {name}?", + "de": "Wie lautet die Telefonnummer von {name}?", + "pt_BR": "Qual o número de telefone de {name}?", + "pt": "Qual é o número de telefone de {name}?" + }, + "render": "{phone}", + "freeform": { + "key": "phone", + "type": "phone" + }, + "id": "bike_shop-phone" + }, + { + "question": { + "en": "What is the email address of {name}?", + "nl": "Wat is het email-adres van {name}?", + "fr": "Quelle est l'adresse électronique de {name} ?", + "gl": "Cal é o enderezo de correo electrónico de {name}?", + "it": "Qual è l’indirizzo email di {name}?", + "ru": "Какой адрес электронной почты у {name}?", + "de": "Wie lautet die E-Mail-Adresse von {name}?", + "pt_BR": "Qual o endereço de email de {name}?", + "pt": "Qual o endereço de email de {name}?" + }, + "render": "{email}", + "freeform": { + "key": "email", + "type": "email" + }, + "id": "bike_shop-email" + }, + { + "render": "{opening_hours_table(opening_hours)}", + "question": "When is this shop opened?", + "freeform": { + "key": "opening_hours", + "type": "opening_hours" + }, + "id": "bike_shop-opening_hours" + }, + "description", + { + "render": "Enkel voor {access}", + "freeform": { + "key": "access" + }, + "id": "bike_shop-access" + }, + { + "id": "bike_repair_sells-bikes", + "question": { + "en": "Does this shop sell bikes?", + "nl": "Verkoopt deze fietszaak fietsen?", + "fr": "Est-ce que ce magasin vend des vélos ?", + "gl": "Esta tenda vende bicicletas?", + "de": "Verkauft dieser Laden Fahrräder?", + "it": "Questo negozio vende bici?", + "ru": "Продаются ли велосипеды в этом магазине?", + "pt_BR": "Esta loja vende bicicletas?", + "pt": "Esta loja vende bicicletas?" + }, + "mappings": [ + { + "if": "service:bicycle:retail=yes", + "then": { + "en": "This shop sells bikes", + "nl": "Deze winkel verkoopt fietsen", + "fr": "Ce magasin vend des vélos", + "gl": "Esta tenda vende bicicletas", + "de": "Dieses Geschäft verkauft Fahrräder", + "it": "Questo negozio vende bici", + "ru": "В этом магазине продаются велосипеды", + "pt_BR": "Esta loja vende bicicletas", + "pt": "Esta loja vende bicicletas" + } + }, + { + "if": "service:bicycle:retail=no", + "then": { + "en": "This shop doesn't sell bikes", + "nl": "Deze winkel verkoopt geen fietsen", + "fr": "Ce magasin ne vend pas de vélo", + "gl": "Esta tenda non vende bicicletas", + "de": "Dieses Geschäft verkauft keine Fahrräder", + "it": "Questo negozio non vende bici", + "ru": "В этом магазине не продают велосипеды", + "pt_BR": "Esta loja não vende bicicletas", + "pt": "Esta loja não vende bicicletas" + } + } + ] + }, + { + "id": "bike_repair_repairs-bikes", + "question": { + "en": "Does this shop repair bikes?", + "nl": "Herstelt deze winkel fietsen?", + "fr": "Est-ce que ce magasin répare des vélos ?", + "gl": "Esta tenda arranxa bicicletas?", + "de": "Repariert dieses Geschäft Fahrräder?", + "it": "Questo negozio ripara bici?", + "ru": "В этом магазине ремонтируют велосипеды?", + "pt_BR": "Esta loja conserta bicicletas?", + "pt": "Esta loja conserta bicicletas?" + }, + "mappings": [ + { + "if": "service:bicycle:repair=yes", + "then": { + "en": "This shop repairs bikes", + "nl": "Deze winkel herstelt fietsen", + "fr": "Ce magasin répare des vélos", + "gl": "Esta tenda arranxa bicicletas", + "de": "Dieses Geschäft repariert Fahrräder", + "it": "Questo negozio ripara bici", + "ru": "Этот магазин ремонтирует велосипеды", + "pt_BR": "Esta loja conserta bicicletas", + "pt": "Esta loja conserta bicicletas" + } + }, + { + "if": "service:bicycle:repair=no", + "then": { + "en": "This shop doesn't repair bikes", + "nl": "Deze winkel herstelt geen fietsen", + "fr": "Ce magasin ne répare pas les vélos", + "gl": "Esta tenda non arranxa bicicletas", + "de": "Dieses Geschäft repariert keine Fahrräder", + "it": "Questo negozio non ripara bici", + "ru": "Этот магазин не ремонтирует велосипеды", + "pt_BR": "Esta loja não conserta bicicletas", + "pt": "Esta loja não conserta bicicletas" + } + }, + { + "if": "service:bicycle:repair=only_sold", + "then": { + "en": "This shop only repairs bikes bought here", + "nl": "Deze winkel herstelt enkel fietsen die hier werden gekocht", + "fr": "Ce magasin ne répare seulement les vélos achetés là-bas", + "gl": "Esta tenda só arranxa bicicletas mercadas aquí", + "de": "Dieses Geschäft repariert nur hier gekaufte Fahrräder", + "it": "Questo negozio ripara solo le bici che sono state acquistate qua", + "ru": "Этот магазин ремонтирует только велосипеды, купленные здесь", + "pt_BR": "Esta loja conserta bicicletas compradas aqui", + "pt": "Esta loja conserta bicicletas compradas aqui" + } + }, + { + "if": "service:bicycle:repair=brand", + "then": { + "en": "This shop only repairs bikes of a certain brand", + "nl": "Deze winkel herstelt enkel fietsen van een bepaald merk", + "fr": "Ce magasin ne répare seulement des marques spécifiques", + "gl": "Esta tenda só arranxa bicicletas dunha certa marca", + "de": "Dieses Geschäft repariert nur Fahrräder einer bestimmten Marke", + "it": "Questo negozio ripara solo le biciclette di una certa marca", + "ru": "В этом магазине обслуживают велосипеды определённого бренда", + "pt_BR": "Esta loja conserta bicicletas de uma certa marca", + "pt": "Esta loja conserta bicicletas de uma certa marca" + } + } + ] + }, + { + "id": "bike_repair_rents-bikes", + "question": { + "en": "Does this shop rent out bikes?", + "nl": "Verhuurt deze winkel fietsen?", + "fr": "Est-ce ce magasin loue des vélos ?", + "gl": "Esta tenda aluga bicicletas?", + "de": "Vermietet dieser Laden Fahrräder?", + "it": "Questo negozio noleggia le bici?", + "ru": "Этот магазин сдает велосипеды в аренду?", + "pt_BR": "Esta loja aluga bicicletas?", + "pt": "Esta loja aluga bicicletas?" + }, + "mappings": [ + { + "if": "service:bicycle:rental=yes", + "then": { + "en": "This shop rents out bikes", + "nl": "Deze winkel verhuurt fietsen", + "fr": "Ce magasin loue des vélos", + "gl": "Esta tenda aluga bicicletas", + "de": "Dieses Geschäft vermietet Fahrräder", + "it": "Questo negozio noleggia le bici", + "ru": "Этот магазин сдает велосипеды в аренду", + "pt_BR": "Esta loja aluga bicicletas", + "pt": "Esta loja aluga bicicletas" + } + }, + { + "if": "service:bicycle:rental=no", + "then": { + "en": "This shop doesn't rent out bikes", + "nl": "Deze winkel verhuurt geen fietsen", + "fr": "Ce magasin ne loue pas de vélos", + "gl": "Esta tenda non aluga bicicletas", + "de": "Dieses Geschäft vermietet keine Fahrräder", + "it": "Questo negozio non noleggia le bici", + "ru": "Этот магазин не сдает велосипеды напрокат", + "pt_BR": "Esta loja não aluga bicicletas", + "pt": "Esta loja não aluga bicicletas" + } + } + ] + }, + { + "id": "bike_repair_second-hand-bikes", + "question": { + "en": "Does this shop sell second-hand bikes?", + "nl": "Verkoopt deze winkel tweedehands fietsen?", + "fr": "Est-ce ce magasin vend des vélos d'occasion ?", + "gl": "Esta tenda vende bicicletas de segunda man?", + "de": "Verkauft dieses Geschäft gebrauchte Fahrräder?", + "it": "Questo negozio vende bici usate?", + "ru": "В этом магазине продаются подержанные велосипеды?" + }, + "mappings": [ + { + "if": "service:bicycle:second_hand=yes", + "then": { + "en": "This shop sells second-hand bikes", + "nl": "Deze winkel verkoopt tweedehands fietsen", + "fr": "Ce magasin vend des vélos d'occasion", + "gl": "Esta tenda vende bicicletas de segunda man", + "de": "Dieses Geschäft verkauft gebrauchte Fahrräder", + "it": "Questo negozio vende bici usate", + "ru": "В этом магазине продаются подержанные велосипеды" + } + }, + { + "if": "service:bicycle:second_hand=no", + "then": { + "en": "This shop doesn't sell second-hand bikes", + "nl": "Deze winkel verkoopt geen tweedehands fietsen", + "fr": "Ce magasin ne vend pas de vélos d'occasion", + "gl": "Esta tenda non vende bicicletas de segunda man", + "de": "Dieses Geschäft verkauft keine gebrauchten Fahrräder", + "it": "Questo negozio non vende bici usate", + "ru": "В этом магазине не продаются подержанные велосипеды" + } + }, + { + "if": "service:bicycle:second_hand=only", + "then": { + "en": "This shop only sells second-hand bikes", + "nl": "Deze winkel verkoopt enkel tweedehands fietsen", + "fr": "Ce magasin vend seulement des vélos d'occasion", + "gl": "Esta tenda só vende bicicletas de segunda man", + "de": "Dieses Geschäft verkauft nur gebrauchte Fahrräder", + "it": "Questo negozio vende solamente bici usate", + "ru": "В этом магазине продаются только подержанные велосипеды" + } + } + ] + }, + { + "id": "bike_repair_bike-pump-service", + "question": { + "en": "Does this shop offer a bike pump for use by anyone?", + "nl": "Biedt deze winkel een fietspomp aan voor iedereen?", + "fr": "Est-ce que ce magasin offre une pompe en accès libre ?", + "gl": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa?", + "de": "Bietet dieses Geschäft eine Fahrradpumpe zur Benutzung für alle an?", + "it": "Questo negozio offre l’uso a chiunque di una pompa per bici?", + "ru": "Предлагается ли в этом магазине велосипедный насос для всеобщего пользования?" + }, + "mappings": [ + { + "if": "service:bicycle:pump=yes", + "then": { + "en": "This shop offers a bike pump for anyone", + "nl": "Deze winkel biedt een fietspomp aan voor iedereen", + "fr": "Ce magasin offre une pompe en acces libre", + "gl": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa", + "de": "Dieses Geschäft bietet eine Fahrradpumpe für alle an", + "it": "Questo negozio offre l’uso pubblico di una pompa per bici", + "ru": "В этом магазине есть велосипедный насос для всеобщего пользования" + } + }, + { + "if": "service:bicycle:pump=no", + "then": { + "en": "This shop doesn't offer a bike pump for anyone", + "nl": "Deze winkel biedt geen fietspomp aan voor eender wie", + "fr": "Ce magasin n'offre pas de pompe en libre accès", + "gl": "Esta tenda non ofrece unha bomba de ar para uso de calquera persoa", + "de": "Dieses Geschäft bietet für niemanden eine Fahrradpumpe an", + "it": "Questo negozio non offre l’uso pubblico di una pompa per bici", + "ru": "В этом магазине нет велосипедного насоса для всеобщего пользования" + } + }, + { + "if": "service:bicycle:pump=separate", + "then": { + "en": "There is bicycle pump, it is shown as a separate point ", + "nl": "Er is een fietspomp, deze is apart aangeduid", + "fr": "Il y a une pompe à vélo, c'est indiqué comme un point séparé ", + "it": "C’è una pompa per bici, è mostrata come punto separato ", + "de": "Es gibt eine Fahrradpumpe, sie wird als separater Punkt angezeigt " + } + } + ] + }, + { + "id": "bike_repair_tools-service", + "question": { + "en": "Are there tools here to repair your own bike?", + "nl": "Biedt deze winkel gereedschap aan om je fiets zelf te herstellen?", + "fr": "Est-ce qu'il y a des outils pour réparer son vélo dans ce magasin ?", + "gl": "Hai ferramentas aquí para arranxar a túa propia bicicleta?", + "de": "Gibt es hier Werkzeuge, um das eigene Fahrrad zu reparieren?", + "it": "Sono presenti degli attrezzi per riparare la propria bici?", + "ru": "Есть ли здесь инструменты для починки собственного велосипеда?" + }, + "mappings": [ + { + "if": "service:bicycle:diy=yes", + "then": { + "en": "This shop offers tools for DIY repair", + "nl": "Deze winkel biedt gereedschap aan om je fiets zelf te herstellen", + "fr": "Ce magasin offre des outils pour réparer son vélo soi-même", + "gl": "Hai ferramentas aquí para arranxar a túa propia bicicleta", + "de": "Dieses Geschäft bietet Werkzeuge für die Heimwerkerreparatur an", + "it": "Questo negozio offre degli attrezzi per la riparazione fai-da-te" + } + }, + { + "if": "service:bicycle:diy=no", + "then": { + "en": "This shop doesn't offer tools for DIY repair", + "nl": "Deze winkel biedt geen gereedschap aan om je fiets zelf te herstellen", + "fr": "Ce magasin n'offre pas des outils pour réparer son vélo soi-même", + "gl": "Non hai ferramentas aquí para arranxar a túa propia bicicleta", + "de": "Dieses Geschäft bietet keine Werkzeuge für Heimwerkerreparaturen an", + "it": "Questo negozio non offre degli attrezzi per la riparazione fai-da-te" + } + }, + { + "if": "service:bicycle:diy=only_sold", + "then": { + "en": "Tools for DIY repair are only available if you bought/hire the bike in the shop", + "nl": "Het gereedschap aan om je fiets zelf te herstellen is enkel voor als je de fiets er kocht of huurt", + "fr": "Des outils d'auto-réparation sont disponibles uniquement si vous avez acheté ou loué le vélo dans ce magasin", + "it": "Gli attrezzi per la riparazione fai-da-te sono disponibili solamente se hai acquistato/noleggiato la bici nel negozio", + "de": "Werkzeuge für die Selbstreparatur sind nur verfügbar, wenn Sie das Fahrrad im Laden gekauft/gemietet haben", + "ru": "Инструменты для починки доступны только при покупке/аренде велосипеда в магазине" + } + } + ] + }, + { + "id": "bike_repair_bike-wash", + "question": { + "en": "Are bicycles washed here?", + "nl": "Biedt deze winkel een fietsschoonmaak aan?", + "fr": "Lave-t-on les vélos ici ?", + "it": "Vengono lavate le bici qua?", + "ru": "Здесь моют велосипеды?", + "de": "Werden hier Fahrräder gewaschen?" + }, + "mappings": [ + { + "if": "service:bicycle:cleaning=yes", + "then": { + "en": "This shop cleans bicycles", + "nl": "Deze winkel biedt fietsschoonmaak aan", + "fr": "Ce magasin lave les vélos", + "it": "Questo negozio lava le biciclette", + "de": "Dieses Geschäft reinigt Fahrräder", + "ru": "В этом магазине оказываются услуги мойки/чистки велосипедов" + } + }, + { + "if": "service:bicycle:cleaning=diy", + "then": { + "en": "This shop has an installation where one can clean bicycles themselves", + "nl": "Deze winkel biedt een installatie aan om zelf je fiets schoon te maken", + "fr": "Ce magasin a une installation pour laver soi même des vélos", + "it": "Questo negozio ha una struttura dove è possibile pulire la propria bici", + "de": "Dieser Laden hat eine Anlage, in der man Fahrräder selbst reinigen kann" + } + }, + { + "if": "service:bicycle:cleaning=no", + "then": { + "en": "This shop doesn't offer bicycle cleaning", + "nl": "Deze winkel biedt geen fietsschoonmaak aan", + "fr": "Ce magasin ne fait pas le nettoyage de vélo", + "it": "Questo negozio non offre la pulizia della bicicletta", + "de": "Dieser Laden bietet keine Fahrradreinigung an", + "ru": "В этом магазине нет услуг мойки/чистки велосипедов" + } + } + ] + }, + "bike_cleaning.bike_cleaning-service:bicycle:cleaning:charge" + ], + "presets": [ + { + "title": { "en": "Bike repair/shop", "nl": "Fietszaak", - "fr": "Magasin ou réparateur de vélo", + "fr": "Magasin et réparateur de vélo", "gl": "Tenda/arranxo de bicicletas", "de": "Fahrradwerkstatt/geschäft", - "it": "Venditore/riparatore bici", - "ru": "Обслуживание велосипедов/магазин", - "pt_BR": "Reparo/loja de bicicletas", - "pt": "Reparo/loja de bicicletas" - }, - "minzoom": 13, - "source": { - "osmTags": { - "#": "We select all bicycle shops, sport shops (but we try to weed out non-bicycle related shops), and any shop with a bicycle related tag", - "or": [ - "shop=bicycle", - { - "#": "A bicycle rental with a network is something such as villo, bluebike, ... We don't want them", - "and": [ - "amenity=bicycle_rental", - "network=" - ] - }, - { - "#": "if sport is defined and is not bicycle, it is not matched; if bicycle retail/repair is marked as 'no', it is not shown to too.", - "##": "There will be a few false-positives with this. They will get filtered out by people marking both 'not selling bikes' and 'not repairing bikes'. Furthermore, the OSMers will add a sports-subcategory on it", - "and": [ - "shop=sports", - "service:bicycle:retail!=no", - "service:bicycle:repair!=no", - { - "or": [ - "sport=bicycle", - "sport=cycling", - "sport=" - ] - } - ] - } - ] - } - }, - "title": { - "render": { - "en": "Bike repair/shop", - "nl": "Fietszaak", - "fr": "Magasin ou réparateur de vélo", - "gl": "Tenda/arranxo de bicicletas", - "de": "Fahrradwerkstatt/geschäft", - "it": "Venditore/riparatore bici", - "ru": "Обслуживание велосипедов/магазин", - "pt_BR": "Reparo/loja de bicicletas", - "pt": "Reparo/loja de bicicletas" - }, - "mappings": [ - { - "if": { - "and": [ - "shop=sports" - ] - }, - "then": { - "en": "Sport gear shop {name}", - "nl": "Sportwinkel {name}", - "fr": "Magasin de sport {name}", - "it": "Negozio di articoli sportivi {name}", - "ru": "Магазин спортивного инвентаря {name}", - "de": "Sportartikelgeschäft {name}", - "pt_BR": "Loja de equipamentos esportivos {name}", - "pt": "Loja de equipamentos desportivos {name}" - } - }, - { - "if": { - "and": [ - "shop!~.*bicycle.*", - "shop~*" - ] - }, - "then": "Other shop" - }, - { - "if": { - "and": [ - { - "or": [ - "service:bicycle:rental=yes", - "amenity=bicycle_rental" - ] - } - ] - }, - "then": { - "nl": "Fietsverhuur {name}", - "en": "Bicycle rental {name}", - "fr": "Location de vélo {name}", - "it": "Noleggio di biciclette {name}", - "ru": "Прокат велосипедов {name}", - "de": "Fahrradverleih{name}", - "pt_BR": "Aluguel de bicicletas {name}", - "pt": "Aluguel de bicicletas {name}" - } - }, - { - "if": { - "and": [ - "service:bicycle:retail!~yes", - "service:bicycle:repair=yes" - ] - }, - "then": { - "en": "Bike repair {name}", - "nl": "Fietsenmaker {name}", - "fr": "Réparateur de vélo {name}", - "gl": "Arranxo de bicicletas {name}", - "de": "Fahrradwerkstatt {name}", - "it": "Riparazione biciclette {name", - "ru": "Ремонт велосипедов {name}", - "pt_BR": "Reparo de bicicletas {name}", - "pt": "Reparo de bicicletas {name}" - } - }, - { - "if": { - "and": [ - "service:bicycle:repair!~yes" - ] - }, - "then": { - "en": "Bike shop {name}", - "nl": "Fietswinkel {name}", - "fr": "Magasin de vélo {name}", - "gl": "Tenda de bicicletas {name}", - "de": "Fahrradgeschäft {name}", - "it": "Negozio di biciclette {name}", - "ru": "Магазин велосипедов {name}", - "pt_BR": "Loja de bicicletas {name}", - "pt": "Loja de bicicletas {name}" - } - }, - { - "if": "name~*", - "then": { - "en": "Bike repair/shop {name}", - "nl": "Fietszaak {name}", - "fr": "Magasin ou réparateur de vélo {name}", - "gl": "Tenda/arranxo de bicicletas {name}", - "de": "Fahrradwerkstatt/geschäft {name}", - "it": "Venditore/riparatore bici {name}", - "pt_BR": "Loja/reparo de bicicletas {name}", - "pt": "Loja/reparo de bicicletas {name}" - } - } - ] - }, - "titleIcons": [ - { - "render": "", - "condition": "operator=De Fietsambassade Gent" - }, - { - "condition": { - "or": [ - "service:bicycle:pump=yes", - "service:bicycle:pump=separate" - ] - }, - "render": "" - }, - { - "condition": "service:bicycle:diy=yes", - "render": "" - }, - { - "condition": "service:bicycle:cleaning=yes", - "render": "" - }, - "defaults" - ], - "description": { - "en": "A shop specifically selling bicycles or related items", - "nl": "Een winkel die hoofdzakelijk fietsen en fietstoebehoren verkoopt", - "fr": "Un magasin vendant spécifiquement des vélos ou des objets en lien", - "it": "Un negozio che vende specificatamente biciclette o articoli similari", - "ru": "Магазин, специализирующийся на продаже велосипедов или сопутствующих товаров", - "pt_BR": "Uma loja que vende especificamente bicicletas ou itens relacionados", - "de": "Ein Geschäft, das speziell Fahrräder oder verwandte Artikel verkauft", - "pt": "Uma loja que vende especificamente bicicletas ou itens relacionados" - }, - "tagRenderings": [ - "images", - { - "id": "bike_shop-is-bicycle_shop", - "condition": { - "and": [ - "shop~*", - "shop!~bicycle", - "shop!~sports" - ] - }, - "render": { - "en": "This shop is specialized in selling {shop} and does bicycle related activities", - "nl": "Deze winkel verkoopt {shop} en heeft fiets-gerelateerde activiteiten.", - "fr": "Ce magasin est spécialisé dans la vente de {shop} et a des activités liées au vélo", - "it": "Questo negozio è specializzato nella vendita di {shop} ed effettua attività relative alle biciclette", - "pt_BR": "Esta loja é especializada em vender {shop} e faz atividades relacionadas à bicicletas", - "de": "Dieses Geschäft ist auf den Verkauf von {shop} spezialisiert und im Bereich Fahrrad tätig", - "pt": "Esta loja é especializada em vender {shop} e faz atividades relacionadas à bicicletas" - } - }, - { - "question": { - "en": "What is the name of this bicycle shop?", - "nl": "Wat is de naam van deze fietszaak?", - "fr": "Quel est le nom du magasin de vélos ?", - "gl": "Cal é o nome desta tenda de bicicletas?", - "de": "Wie heißt dieser Fahrradladen?", - "it": "Qual è il nome di questo negozio di biciclette?", - "ru": "Как называется магазин велосипедов?", - "pt_BR": "Qual o nome desta loja de bicicletas?", - "pt": "Qual o nome desta loja de bicicletas?" - }, - "render": { - "en": "This bicycle shop is called {name}", - "nl": "Deze fietszaak heet {name}", - "fr": "Ce magasin s'appelle {name}", - "gl": "Esta tenda de bicicletas chámase {name}", - "de": "Dieses Fahrradgeschäft heißt {name}", - "it": "Questo negozio di biciclette è chiamato {name}", - "ru": "Этот магазин велосипедов называется {name}", - "pt_BR": "Esta loja de bicicletas se chama {nome}", - "pt": "Esta loja de bicicletas se chama {nome}" - }, - "freeform": { - "key": "name" - }, - "id": "bike_shop-name" - }, - { - "question": { - "en": "What is the website of {name}?", - "nl": "Wat is de website van {name}?", - "fr": "Quel est le site web de {name} ?", - "gl": "Cal é a páxina web de {name}?", - "it": "Qual è il sito web di {name}?", - "ru": "Какой сайт у {name}?", - "id": "URL {name} apa?", - "de": "Was ist die Webseite von {name}?", - "pt_BR": "Qual o website de {name}?", - "pt": "Qual o website de {name}?" - }, - "render": "{website}", - "freeform": { - "key": "website", - "type": "url" - }, - "id": "bike_shop-website" - }, - { - "question": { - "en": "What is the phone number of {name}?", - "nl": "Wat is het telefoonnummer van {name}?", - "fr": "Quel est le numéro de téléphone de {name} ?", - "gl": "Cal é o número de teléfono de {name}?", - "it": "Qual è il numero di telefono di {name}?", - "ru": "Какой номер телефона у {name}?", - "de": "Wie lautet die Telefonnummer von {name}?", - "pt_BR": "Qual o número de telefone de {name}?", - "pt": "Qual é o número de telefone de {name}?" - }, - "render": "{phone}", - "freeform": { - "key": "phone", - "type": "phone" - }, - "id": "bike_shop-phone" - }, - { - "question": { - "en": "What is the email address of {name}?", - "nl": "Wat is het email-adres van {name}?", - "fr": "Quelle est l'adresse électronique de {name} ?", - "gl": "Cal é o enderezo de correo electrónico de {name}?", - "it": "Qual è l’indirizzo email di {name}?", - "ru": "Какой адрес электронной почты у {name}?", - "de": "Wie lautet die E-Mail-Adresse von {name}?", - "pt_BR": "Qual o endereço de email de {name}?", - "pt": "Qual o endereço de email de {name}?" - }, - "render": "{email}", - "freeform": { - "key": "email", - "type": "email" - }, - "id": "bike_shop-email" - }, - { - "render": "{opening_hours_table(opening_hours)}", - "question": "When is this shop opened?", - "freeform": { - "key": "opening_hours", - "type": "opening_hours" - }, - "id": "bike_shop-opening_hours" - }, - "description", - { - "render": "Enkel voor {access}", - "freeform": { - "key": "access" - }, - "id": "bike_shop-access" - }, - { - "id": "bike_repair_sells-bikes", - "question": { - "en": "Does this shop sell bikes?", - "nl": "Verkoopt deze fietszaak fietsen?", - "fr": "Est-ce que ce magasin vend des vélos ?", - "gl": "Esta tenda vende bicicletas?", - "de": "Verkauft dieser Laden Fahrräder?", - "it": "Questo negozio vende bici?", - "ru": "Продаются ли велосипеды в этом магазине?", - "pt_BR": "Esta loja vende bicicletas?", - "pt": "Esta loja vende bicicletas?" - }, - "mappings": [ - { - "if": "service:bicycle:retail=yes", - "then": { - "en": "This shop sells bikes", - "nl": "Deze winkel verkoopt fietsen", - "fr": "Ce magasin vend des vélos", - "gl": "Esta tenda vende bicicletas", - "de": "Dieses Geschäft verkauft Fahrräder", - "it": "Questo negozio vende bici", - "ru": "В этом магазине продаются велосипеды", - "pt_BR": "Esta loja vende bicicletas", - "pt": "Esta loja vende bicicletas" - } - }, - { - "if": "service:bicycle:retail=no", - "then": { - "en": "This shop doesn't sell bikes", - "nl": "Deze winkel verkoopt geen fietsen", - "fr": "Ce magasin ne vend pas de vélo", - "gl": "Esta tenda non vende bicicletas", - "de": "Dieses Geschäft verkauft keine Fahrräder", - "it": "Questo negozio non vende bici", - "ru": "В этом магазине не продают велосипеды", - "pt_BR": "Esta loja não vende bicicletas", - "pt": "Esta loja não vende bicicletas" - } - } - ] - }, - { - "id": "bike_repair_repairs-bikes", - "question": { - "en": "Does this shop repair bikes?", - "nl": "Herstelt deze winkel fietsen?", - "fr": "Est-ce que ce magasin répare des vélos ?", - "gl": "Esta tenda arranxa bicicletas?", - "de": "Repariert dieses Geschäft Fahrräder?", - "it": "Questo negozio ripara bici?", - "ru": "В этом магазине ремонтируют велосипеды?", - "pt_BR": "Esta loja conserta bicicletas?", - "pt": "Esta loja conserta bicicletas?" - }, - "mappings": [ - { - "if": "service:bicycle:repair=yes", - "then": { - "en": "This shop repairs bikes", - "nl": "Deze winkel herstelt fietsen", - "fr": "Ce magasin répare des vélos", - "gl": "Esta tenda arranxa bicicletas", - "de": "Dieses Geschäft repariert Fahrräder", - "it": "Questo negozio ripara bici", - "ru": "Этот магазин ремонтирует велосипеды", - "pt_BR": "Esta loja conserta bicicletas", - "pt": "Esta loja conserta bicicletas" - } - }, - { - "if": "service:bicycle:repair=no", - "then": { - "en": "This shop doesn't repair bikes", - "nl": "Deze winkel herstelt geen fietsen", - "fr": "Ce magasin ne répare pas les vélos", - "gl": "Esta tenda non arranxa bicicletas", - "de": "Dieses Geschäft repariert keine Fahrräder", - "it": "Questo negozio non ripara bici", - "ru": "Этот магазин не ремонтирует велосипеды", - "pt_BR": "Esta loja não conserta bicicletas", - "pt": "Esta loja não conserta bicicletas" - } - }, - { - "if": "service:bicycle:repair=only_sold", - "then": { - "en": "This shop only repairs bikes bought here", - "nl": "Deze winkel herstelt enkel fietsen die hier werden gekocht", - "fr": "Ce magasin ne répare seulement les vélos achetés là-bas", - "gl": "Esta tenda só arranxa bicicletas mercadas aquí", - "de": "Dieses Geschäft repariert nur hier gekaufte Fahrräder", - "it": "Questo negozio ripara solo le bici che sono state acquistate qua", - "ru": "Этот магазин ремонтирует только велосипеды, купленные здесь", - "pt_BR": "Esta loja conserta bicicletas compradas aqui", - "pt": "Esta loja conserta bicicletas compradas aqui" - } - }, - { - "if": "service:bicycle:repair=brand", - "then": { - "en": "This shop only repairs bikes of a certain brand", - "nl": "Deze winkel herstelt enkel fietsen van een bepaald merk", - "fr": "Ce magasin ne répare seulement des marques spécifiques", - "gl": "Esta tenda só arranxa bicicletas dunha certa marca", - "de": "Dieses Geschäft repariert nur Fahrräder einer bestimmten Marke", - "it": "Questo negozio ripara solo le biciclette di una certa marca", - "ru": "В этом магазине обслуживают велосипеды определённого бренда", - "pt_BR": "Esta loja conserta bicicletas de uma certa marca", - "pt": "Esta loja conserta bicicletas de uma certa marca" - } - } - ] - }, - { - "id": "bike_repair_rents-bikes", - "question": { - "en": "Does this shop rent out bikes?", - "nl": "Verhuurt deze winkel fietsen?", - "fr": "Est-ce ce magasin loue des vélos ?", - "gl": "Esta tenda aluga bicicletas?", - "de": "Vermietet dieser Laden Fahrräder?", - "it": "Questo negozio noleggia le bici?", - "ru": "Этот магазин сдает велосипеды в аренду?", - "pt_BR": "Esta loja aluga bicicletas?", - "pt": "Esta loja aluga bicicletas?" - }, - "mappings": [ - { - "if": "service:bicycle:rental=yes", - "then": { - "en": "This shop rents out bikes", - "nl": "Deze winkel verhuurt fietsen", - "fr": "Ce magasin loue des vélos", - "gl": "Esta tenda aluga bicicletas", - "de": "Dieses Geschäft vermietet Fahrräder", - "it": "Questo negozio noleggia le bici", - "ru": "Этот магазин сдает велосипеды в аренду", - "pt_BR": "Esta loja aluga bicicletas", - "pt": "Esta loja aluga bicicletas" - } - }, - { - "if": "service:bicycle:rental=no", - "then": { - "en": "This shop doesn't rent out bikes", - "nl": "Deze winkel verhuurt geen fietsen", - "fr": "Ce magasin ne loue pas de vélos", - "gl": "Esta tenda non aluga bicicletas", - "de": "Dieses Geschäft vermietet keine Fahrräder", - "it": "Questo negozio non noleggia le bici", - "ru": "Этот магазин не сдает велосипеды напрокат", - "pt_BR": "Esta loja não aluga bicicletas", - "pt": "Esta loja não aluga bicicletas" - } - } - ] - }, - { - "id": "bike_repair_second-hand-bikes", - "question": { - "en": "Does this shop sell second-hand bikes?", - "nl": "Verkoopt deze winkel tweedehands fietsen?", - "fr": "Est-ce ce magasin vend des vélos d'occasion ?", - "gl": "Esta tenda vende bicicletas de segunda man?", - "de": "Verkauft dieses Geschäft gebrauchte Fahrräder?", - "it": "Questo negozio vende bici usate?", - "ru": "В этом магазине продаются подержанные велосипеды?" - }, - "mappings": [ - { - "if": "service:bicycle:second_hand=yes", - "then": { - "en": "This shop sells second-hand bikes", - "nl": "Deze winkel verkoopt tweedehands fietsen", - "fr": "Ce magasin vend des vélos d'occasion", - "gl": "Esta tenda vende bicicletas de segunda man", - "de": "Dieses Geschäft verkauft gebrauchte Fahrräder", - "it": "Questo negozio vende bici usate", - "ru": "В этом магазине продаются подержанные велосипеды" - } - }, - { - "if": "service:bicycle:second_hand=no", - "then": { - "en": "This shop doesn't sell second-hand bikes", - "nl": "Deze winkel verkoopt geen tweedehands fietsen", - "fr": "Ce magasin ne vend pas de vélos d'occasion", - "gl": "Esta tenda non vende bicicletas de segunda man", - "de": "Dieses Geschäft verkauft keine gebrauchten Fahrräder", - "it": "Questo negozio non vende bici usate", - "ru": "В этом магазине не продаются подержанные велосипеды" - } - }, - { - "if": "service:bicycle:second_hand=only", - "then": { - "en": "This shop only sells second-hand bikes", - "nl": "Deze winkel verkoopt enkel tweedehands fietsen", - "fr": "Ce magasin vend seulement des vélos d'occasion", - "gl": "Esta tenda só vende bicicletas de segunda man", - "de": "Dieses Geschäft verkauft nur gebrauchte Fahrräder", - "it": "Questo negozio vende solamente bici usate", - "ru": "В этом магазине продаются только подержанные велосипеды" - } - } - ] - }, - { - "id": "bike_repair_bike-pump-service", - "question": { - "en": "Does this shop offer a bike pump for use by anyone?", - "nl": "Biedt deze winkel een fietspomp aan voor iedereen?", - "fr": "Est-ce que ce magasin offre une pompe en accès libre ?", - "gl": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa?", - "de": "Bietet dieses Geschäft eine Fahrradpumpe zur Benutzung für alle an?", - "it": "Questo negozio offre l’uso a chiunque di una pompa per bici?", - "ru": "Предлагается ли в этом магазине велосипедный насос для всеобщего пользования?" - }, - "mappings": [ - { - "if": "service:bicycle:pump=yes", - "then": { - "en": "This shop offers a bike pump for anyone", - "nl": "Deze winkel biedt een fietspomp aan voor iedereen", - "fr": "Ce magasin offre une pompe en acces libre", - "gl": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa", - "de": "Dieses Geschäft bietet eine Fahrradpumpe für alle an", - "it": "Questo negozio offre l’uso pubblico di una pompa per bici", - "ru": "В этом магазине есть велосипедный насос для всеобщего пользования" - } - }, - { - "if": "service:bicycle:pump=no", - "then": { - "en": "This shop doesn't offer a bike pump for anyone", - "nl": "Deze winkel biedt geen fietspomp aan voor eender wie", - "fr": "Ce magasin n'offre pas de pompe en libre accès", - "gl": "Esta tenda non ofrece unha bomba de ar para uso de calquera persoa", - "de": "Dieses Geschäft bietet für niemanden eine Fahrradpumpe an", - "it": "Questo negozio non offre l’uso pubblico di una pompa per bici", - "ru": "В этом магазине нет велосипедного насоса для всеобщего пользования" - } - }, - { - "if": "service:bicycle:pump=separate", - "then": { - "en": "There is bicycle pump, it is shown as a separate point ", - "nl": "Er is een fietspomp, deze is apart aangeduid", - "fr": "Il y a une pompe à vélo, c'est indiqué comme un point séparé ", - "it": "C’è una pompa per bici, è mostrata come punto separato ", - "de": "Es gibt eine Fahrradpumpe, sie wird als separater Punkt angezeigt " - } - } - ] - }, - { - "id": "bike_repair_tools-service", - "question": { - "en": "Are there tools here to repair your own bike?", - "nl": "Biedt deze winkel gereedschap aan om je fiets zelf te herstellen?", - "fr": "Est-ce qu'il y a des outils pour réparer son vélo dans ce magasin ?", - "gl": "Hai ferramentas aquí para arranxar a túa propia bicicleta?", - "de": "Gibt es hier Werkzeuge, um das eigene Fahrrad zu reparieren?", - "it": "Sono presenti degli attrezzi per riparare la propria bici?", - "ru": "Есть ли здесь инструменты для починки собственного велосипеда?" - }, - "mappings": [ - { - "if": "service:bicycle:diy=yes", - "then": { - "en": "This shop offers tools for DIY repair", - "nl": "Deze winkel biedt gereedschap aan om je fiets zelf te herstellen", - "fr": "Ce magasin offre des outils pour réparer son vélo soi-même", - "gl": "Hai ferramentas aquí para arranxar a túa propia bicicleta", - "de": "Dieses Geschäft bietet Werkzeuge für die Heimwerkerreparatur an", - "it": "Questo negozio offre degli attrezzi per la riparazione fai-da-te" - } - }, - { - "if": "service:bicycle:diy=no", - "then": { - "en": "This shop doesn't offer tools for DIY repair", - "nl": "Deze winkel biedt geen gereedschap aan om je fiets zelf te herstellen", - "fr": "Ce magasin n'offre pas des outils pour réparer son vélo soi-même", - "gl": "Non hai ferramentas aquí para arranxar a túa propia bicicleta", - "de": "Dieses Geschäft bietet keine Werkzeuge für Heimwerkerreparaturen an", - "it": "Questo negozio non offre degli attrezzi per la riparazione fai-da-te" - } - }, - { - "if": "service:bicycle:diy=only_sold", - "then": { - "en": "Tools for DIY repair are only available if you bought/hire the bike in the shop", - "nl": "Het gereedschap aan om je fiets zelf te herstellen is enkel voor als je de fiets er kocht of huurt", - "fr": "Des outils d'auto-réparation sont disponibles uniquement si vous avez acheté ou loué le vélo dans ce magasin", - "it": "Gli attrezzi per la riparazione fai-da-te sono disponibili solamente se hai acquistato/noleggiato la bici nel negozio", - "de": "Werkzeuge für die Selbstreparatur sind nur verfügbar, wenn Sie das Fahrrad im Laden gekauft/gemietet haben", - "ru": "Инструменты для починки доступны только при покупке/аренде велосипеда в магазине" - } - } - ] - }, - { - "id": "bike_repair_bike-wash", - "question": { - "en": "Are bicycles washed here?", - "nl": "Biedt deze winkel een fietsschoonmaak aan?", - "fr": "Lave-t-on les vélos ici ?", - "it": "Vengono lavate le bici qua?", - "ru": "Здесь моют велосипеды?", - "de": "Werden hier Fahrräder gewaschen?" - }, - "mappings": [ - { - "if": "service:bicycle:cleaning=yes", - "then": { - "en": "This shop cleans bicycles", - "nl": "Deze winkel biedt fietsschoonmaak aan", - "fr": "Ce magasin lave les vélos", - "it": "Questo negozio lava le biciclette", - "de": "Dieses Geschäft reinigt Fahrräder", - "ru": "В этом магазине оказываются услуги мойки/чистки велосипедов" - } - }, - { - "if": "service:bicycle:cleaning=diy", - "then": { - "en": "This shop has an installation where one can clean bicycles themselves", - "nl": "Deze winkel biedt een installatie aan om zelf je fiets schoon te maken", - "fr": "Ce magasin a une installation pour laver soi même des vélos", - "it": "Questo negozio ha una struttura dove è possibile pulire la propria bici", - "de": "Dieser Laden hat eine Anlage, in der man Fahrräder selbst reinigen kann" - } - }, - { - "if": "service:bicycle:cleaning=no", - "then": { - "en": "This shop doesn't offer bicycle cleaning", - "nl": "Deze winkel biedt geen fietsschoonmaak aan", - "fr": "Ce magasin ne fait pas le nettoyage de vélo", - "it": "Questo negozio non offre la pulizia della bicicletta", - "de": "Dieser Laden bietet keine Fahrradreinigung an", - "ru": "В этом магазине нет услуг мойки/чистки велосипедов" - } - } - ] - }, - { - "question": "How much does it cost to use the cleaning service?", - "render": "Using the cleaning service costs {charge}", - "freeform": { - "key": "service:bicycle:cleaning:charge", - "addExtraTags": [ - "service:bicycle:cleaning:fee=yes" - ] - }, - "mappings": [ - { - "if": "service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge=", - "then": "The cleaning service is free to use" - }, - { - "if": "service:bicycle:cleaning:fee=no&", - "then": "Free to use", - "hideInAnswer": true - }, - { - "if": "service:bicycle:cleaning:fee=yes", - "then": "The cleaning service has a fee" - } - ], - "id": "bike_cleaning-service:bicycle:cleaning:charge" - } - ], - "presets": [ - { - "title": { - "en": "Bike repair/shop", - "nl": "Fietszaak", - "fr": "Magasin et réparateur de vélo", - "gl": "Tenda/arranxo de bicicletas", - "de": "Fahrradwerkstatt/geschäft", - "it": "Negozio/riparatore di bici", - "ru": "Обслуживание велосипедов/магазин" - }, - "tags": [ - "shop=bicycle" - ] - } - ], - "icon": { + "it": "Negozio/riparatore di bici", + "ru": "Обслуживание велосипедов/магазин" + }, + "tags": [ + "shop=bicycle" + ] + } + ], + "mapRendering": [ + { + "icon": { "render": "./assets/layers/bike_shop/repair_shop.svg", "mappings": [ - { - "if": "operator=De Fietsambassade Gent", - "then": "./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg" - }, - { - "if": "service:bicycle:retail=yes", - "then": "./assets/layers/bike_shop/shop.svg" - } + { + "if": "operator=De Fietsambassade Gent", + "then": "./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg" + }, + { + "if": "service:bicycle:retail=yes", + "then": "./assets/layers/bike_shop/shop.svg" + } ] - }, - "iconOverlays": [ + }, + "iconBadges": [ { - "if": "opening_hours~*", - "then": "isOpen", - "badge": true + "if": "opening_hours~*", + "then": "isOpen" }, { - "if": "service:bicycle:pump=yes", - "then": "circle:#e2783d;./assets/layers/bike_repair_station/pump.svg", - "badge": true + "if": "service:bicycle:pump=yes", + "then": "circle:#e2783d;./assets/layers/bike_repair_station/pump.svg" }, { - "if": { - "and": [ - "service:bicycle:cleaning~*" - ] - }, - "then": { - "render": "./assets/layers/bike_cleaning/bike_cleaning_icon.svg" - }, - "badge": true + "if": { + "and": [ + "service:bicycle:cleaning~*" + ] + }, + "then": { + "render": "./assets/layers/bike_cleaning/bike_cleaning_icon.svg" + } } - ], - "width": { - "render": "1" - }, - "iconSize": { + ], + "iconSize": { "render": "50,50,bottom" + }, + "location": [ + "point", + "centroid" + ] }, - "color": { + { + "color": { "render": "#c00" - }, - "wayHandling": 2 + }, + "width": { + "render": "1" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/bike_themed_object/bike_themed_object.json b/assets/layers/bike_themed_object/bike_themed_object.json index 527376742d..cc704319e9 100644 --- a/assets/layers/bike_themed_object/bike_themed_object.json +++ b/assets/layers/bike_themed_object/bike_themed_object.json @@ -1,73 +1,82 @@ { - "id": "bike_themed_object", - "name": { - "en": "Bike related object", - "nl": "Fietsgerelateerd object", - "fr": "Objet cycliste", - "de": "Mit Fahrrad zusammenhängendes Objekt", - "it": "Oggetto relativo alle bici" + "id": "bike_themed_object", + "name": { + "en": "Bike related object", + "nl": "Fietsgerelateerd object", + "fr": "Objet cycliste", + "de": "Mit Fahrrad zusammenhängendes Objekt", + "it": "Oggetto relativo alle bici" + }, + "minzoom": 13, + "source": { + "osmTags": { + "or": [ + "theme=bicycle", + "theme=cycling", + "sport=cycling", + "association=cycling", + "association=bicycle", + "ngo=cycling", + "ngo=bicycle", + "club=bicycle", + "club=cycling" + ] + } + }, + "title": { + "render": { + "en": "Bike related object", + "nl": "Fietsgerelateerd object", + "fr": "Objet cycliste", + "de": "Mit Fahrrad zusammenhängendes Objekt", + "it": "Oggetto relativo alle bici" }, - "minzoom": 13, - "source": { - "osmTags": { - "or": [ - "theme=bicycle", - "theme=cycling", - "sport=cycling", - "association=cycling", - "association=bicycle", - "ngo=cycling", - "ngo=bicycle", - "club=bicycle", - "club=cycling" - ] + "mappings": [ + { + "if": "name~*", + "then": "{name}" + }, + { + "if": "leisure=track", + "then": { + "nl": "Wielerpiste", + "en": "Cycle track", + "fr": "Piste cyclable", + "it": "Pista ciclabile", + "de": "Radweg" } - }, - "title": { - "render": { - "en": "Bike related object", - "nl": "Fietsgerelateerd object", - "fr": "Objet cycliste", - "de": "Mit Fahrrad zusammenhängendes Objekt", - "it": "Oggetto relativo alle bici" - }, - "mappings": [ - { - "if": "name~*", - "then": "{name}" - }, - { - "if": "leisure=track", - "then": { - "nl": "Wielerpiste", - "en": "Cycle track", - "fr": "Piste cyclable", - "it": "Pista ciclabile", - "de": "Radweg" - } - } - ] - }, - "tagRenderings": [ - "images", - "description", - "website", - "email", - "phone", - "opening_hours" - ], - "icon": { + } + ] + }, + "tagRenderings": [ + "images", + "description", + "website", + "email", + "phone", + "opening_hours" + ], + "presets": [], + "mapRendering": [ + { + "icon": { "render": "./assets/layers/bike_themed_object/other_services.svg" - }, - "width": { - "render": "2" - }, - "iconSize": { + }, + "iconSize": { "render": "50,50,bottom" + }, + "location": [ + "point", + "centroid" + ] }, - "color": { + { + "color": { "render": "#AB76D5" - }, - "presets": [], - "wayHandling": 2 + }, + "width": { + "render": "2" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/binocular/binocular.json b/assets/layers/binocular/binocular.json index 5b84365e28..2ad39b353f 100644 --- a/assets/layers/binocular/binocular.json +++ b/assets/layers/binocular/binocular.json @@ -1,131 +1,140 @@ { - "id": "binocular", - "name": { - "en": "Binoculars", - "nl": "Verrekijkers", - "de": "Ferngläser", - "ru": "Бинокль" - }, - "minzoom": 0, - "title": { - "render": { - "en": "Binoculars", - "nl": "Verrekijker", - "de": "Ferngläser", - "ru": "Бинокль" - } - }, - "description": { - "en": "Binoculas", - "nl": "Verrekijkers", - "de": "Fernglas", - "ru": "Бинокли" - }, - "tagRenderings": [ - "images", - { - "mappings": [ - { - "if": { - "and": [ - "fee=no", - "charge=" - ] - }, - "then": { - "en": "Free to use", - "nl": "Gratis te gebruiken", - "de": "Kostenlose Nutzung" - } - } - ], - "freeform": { - "key": "charge", - "addExtraTags": [ - "fee=yes" - ] - }, - "render": { - "en": "Using these binoculars costs {charge}", - "nl": "Deze verrekijker gebruiken kost {charge}", - "de": "Die Benutzung dieses Fernglases kostet {charge}" - }, - "question": { - "en": "How much does one have to pay to use these binoculars?", - "nl": "Hoeveel moet men betalen om deze verrekijker te gebruiken?", - "de": "Wie viel muss man für die Nutzung dieser Ferngläser bezahlen?" - }, - "id": "binocular-charge" - }, - { - "question": { - "en": "When looking through this binocular, in what direction does one look?", - "nl": "Welke richting kijkt men uit als men door deze verrekijker kijkt?", - "de": "In welche Richtung blickt man, wenn man durch dieses Fernglas schaut?" - }, - "render": { - "en": "Looks towards {direction}°", - "nl": "Kijkt richting {direction}°", - "de": "Blick in Richtung {direction}°" - }, - "freeform": { - "key": "direction", - "type": "direction" - }, - "id": "binocular-direction" - } - ], - "icon": { - "render": "circle:white;./assets/layers/binocular/telescope.svg" - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#00f" - }, - "presets": [ - { - "tags": [ - "amenity=binoculars" - ], - "title": { - "en": "binoculars", - "nl": "verrekijker", - "de": "Ferngläser", - "ru": "бинокль" - }, - "description": { - "en": "A telescope or pair of binoculars mounted on a pole, available to the public to look around. ", - "nl": "Een telescoop of verrekijker die op een vaste plaats gemonteerd staat waar iedereen door mag kijken. ", - "de": "Ein fest installiertes Teleskop oder Fernglas, für die öffentliche Nutzung. " - }, - "preciseInput": { - "preferredBackground": "photo" - } - } - ], - "source": { - "osmTags": { - "and": [ - "amenity=binoculars" - ] - } - }, - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity:={amenity}", - "amenity=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + "id": "binocular", + "name": { + "en": "Binoculars", + "nl": "Verrekijkers", + "de": "Ferngläser", + "ru": "Бинокль" + }, + "minzoom": 0, + "title": { + "render": { + "en": "Binoculars", + "nl": "Verrekijker", + "de": "Ferngläser", + "ru": "Бинокль" } + }, + "description": { + "en": "Binoculas", + "nl": "Verrekijkers", + "de": "Fernglas", + "ru": "Бинокли" + }, + "tagRenderings": [ + "images", + { + "mappings": [ + { + "if": { + "and": [ + "fee=no", + "charge=" + ] + }, + "then": { + "en": "Free to use", + "nl": "Gratis te gebruiken", + "de": "Kostenlose Nutzung" + } + } + ], + "freeform": { + "key": "charge", + "addExtraTags": [ + "fee=yes" + ] + }, + "render": { + "en": "Using these binoculars costs {charge}", + "nl": "Deze verrekijker gebruiken kost {charge}", + "de": "Die Benutzung dieses Fernglases kostet {charge}" + }, + "question": { + "en": "How much does one have to pay to use these binoculars?", + "nl": "Hoeveel moet men betalen om deze verrekijker te gebruiken?", + "de": "Wie viel muss man für die Nutzung dieser Ferngläser bezahlen?" + }, + "id": "binocular-charge" + }, + { + "question": { + "en": "When looking through this binocular, in what direction does one look?", + "nl": "Welke richting kijkt men uit als men door deze verrekijker kijkt?", + "de": "In welche Richtung blickt man, wenn man durch dieses Fernglas schaut?" + }, + "render": { + "en": "Looks towards {direction}°", + "nl": "Kijkt richting {direction}°", + "de": "Blick in Richtung {direction}°" + }, + "freeform": { + "key": "direction", + "type": "direction" + }, + "id": "binocular-direction" + } + ], + "presets": [ + { + "tags": [ + "amenity=binoculars" + ], + "title": { + "en": "binoculars", + "nl": "verrekijker", + "de": "Ferngläser", + "ru": "бинокль" + }, + "description": { + "en": "A telescope or pair of binoculars mounted on a pole, available to the public to look around. ", + "nl": "Een telescoop of verrekijker die op een vaste plaats gemonteerd staat waar iedereen door mag kijken. ", + "de": "Ein fest installiertes Teleskop oder Fernglas, für die öffentliche Nutzung. " + }, + "preciseInput": { + "preferredBackground": "photo" + } + } + ], + "source": { + "osmTags": { + "and": [ + "amenity=binoculars" + ] + } + }, + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity:={amenity}", + "amenity=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { + "render": "circle:white;./assets/layers/binocular/telescope.svg" + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point" + ] + }, + { + "color": { + "render": "#00f" + }, + "width": { + "render": "8" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/binocular/telescope.svg b/assets/layers/binocular/telescope.svg index 2fea44f0e0..b334566069 100644 --- a/assets/layers/binocular/telescope.svg +++ b/assets/layers/binocular/telescope.svg @@ -1,8 +1,8 @@ - + - - diff --git a/assets/layers/birdhide/birdhide.json b/assets/layers/birdhide/birdhide.json index c8015e5f44..b0d0bbb854 100644 --- a/assets/layers/birdhide/birdhide.json +++ b/assets/layers/birdhide/birdhide.json @@ -1,313 +1,315 @@ { - "id": "birdhide", - "name": { - "nl": "Vogelkijkhutten" + "id": "birdhide", + "name": { + "nl": "Vogelkijkhutten" + }, + "minzoom": 14, + "source": { + "osmTags": { + "and": [ + "leisure=bird_hide" + ] + } + }, + "title": { + "render": { + "nl": "Vogelkijkplaats" }, - "minzoom": 14, - "source": { - "osmTags": { + "mappings": [ + { + "if": { + "and": [ + "name~((V|v)ogel.*).*" + ] + }, + "then": { + "nl": "{name}" + } + }, + { + "if": { + "and": [ + "name~*", + { + "or": [ + "building!~no", + "shelter=yes" + ] + } + ] + }, + "then": { + "nl": "Vogelkijkhut {name}" + } + }, + { + "if": { + "and": [ + "name~*" + ] + }, + "then": { + "nl": "Vogelkijkwand {name}" + } + } + ] + }, + "description": { + "nl": "Een vogelkijkhut" + }, + "tagRenderings": [ + "images", + { + "id": "bird-hide-shelter-or-wall", + "question": { + "nl": "Is dit een kijkwand of kijkhut?" + }, + "mappings": [ + { + "if": { "and": [ - "leisure=bird_hide" + "shelter=no", + "building=", + "amenity=" ] + }, + "then": { + "nl": "Vogelkijkwand" + } + }, + { + "if": { + "and": [ + "amenity=shelter", + "building=yes", + "shelter=yes" + ] + }, + "then": { + "nl": "Vogelkijkhut" + } + }, + { + "if": { + "and": [ + "building=tower", + "bird_hide=tower" + ] + }, + "then": { + "nl": "Vogelkijktoren" + } + }, + { + "if": { + "or": [ + "amenity=shelter", + "building=yes", + "shelter=yes" + ] + }, + "then": { + "nl": "Vogelkijkhut" + }, + "hideInAnswer": true } + ] }, - "title": { + { + "id": "bird-hide-wheelchair", + "question": { + "nl": "Is deze vogelkijkplaats rolstoeltoegankelijk?" + }, + "mappings": [ + { + "if": { + "and": [ + "wheelchair=designated" + ] + }, + "then": { + "nl": "Er zijn speciale voorzieningen voor rolstoelen" + } + }, + { + "if": { + "and": [ + "wheelchair=yes" + ] + }, + "then": { + "nl": "Een rolstoel raakt er vlot" + } + }, + { + "if": { + "and": [ + "wheelchair=limited" + ] + }, + "then": { + "nl": "Je kan er raken met een rolstoel, maar het is niet makkelijk" + } + }, + { + "if": { + "and": [ + "wheelchair=no" + ] + }, + "then": { + "nl": "Niet rolstoeltoegankelijk" + } + } + ] + }, + { + "render": { + "nl": "Beheer door {operator}" + }, + "freeform": { + "key": "operator" + }, + "question": { + "nl": "Wie beheert deze vogelkijkplaats?" + }, + "mappings": [ + { + "if": "operator=Natuurpunt", + "then": { + "nl": "Beheer door Natuurpunt" + } + }, + { + "if": "operator=Agentschap Natuur en Bos", + "then": { + "nl": "Beheer door het Agentschap Natuur en Bos " + } + } + ], + "id": "birdhide-operator" + } + ], + "size": { + "freeform": { + "addExtraTags": [] + }, + "render": { + "nl": "40,40,center" + }, + "mappings": [] + }, + "stroke": { + "render": { + "nl": "3" + } + }, + "presets": [ + { + "tags": [ + "leisure=bird_hide", + "building=yes", + "shelter=yes", + "amenity=shelter" + ], + "title": { + "nl": "vogelkijkhut" + }, + "description": { + "nl": "Een overdekte hut waarbinnen er warm en droog naar vogels gekeken kan worden" + } + }, + { + "tags": [ + "leisure=bird_hide", + "building=no", + "shelter=no" + ], + "title": { + "nl": "vogelkijkwand" + }, + "description": { + "nl": "Een vogelkijkwand waarachter men kan staan om vogels te kijken" + } + } + ], + "filter": [ + { + "id": "wheelchair", + "options": [ + { + "question": { + "nl": "Rolstoeltoegankelijk", + "en": "Wheelchair accessible", + "de": "Zugänglich für Rollstuhlfahrer" + }, + "osmTags": { + "or": [ + "wheelchair=yes", + "wheelchair=designated", + "wheelchair=permissive" + ] + } + } + ] + }, + { + "id": "shelter", + "options": [ + { + "question": { + "nl": "Enkel overdekte kijkhutten" + }, + "osmTags": { + "and": [ + { + "or": [ + "shelter=yes", + "building~*" + ] + }, + "covered!=no" + ] + } + } + ] + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity:={amenity}", + "amenity=" + ] + } + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { "render": { - "nl": "Vogelkijkplaats" + "nl": "./assets/layers/birdhide/birdhide.svg" }, "mappings": [ - { - "if": { - "and": [ - "name~((V|v)ogel.*).*" - ] - }, - "then": { - "nl": "{name}" - } - }, - { - "if": { - "and": [ - "name~*", - { - "or": [ - "building!~no", - "shelter=yes" - ] - } - ] - }, - "then": { - "nl": "Vogelkijkhut {name}" - } - }, - { - "if": { - "and": [ - "name~*" - ] - }, - "then": { - "nl": "Vogelkijkwand {name}" - } - } - ] - }, - "description": { - "nl": "Een vogelkijkhut" - }, - "tagRenderings": [ - "images", - { - "id": "bird-hide-shelter-or-wall", - "question": { - "nl": "Is dit een kijkwand of kijkhut?" - }, - "mappings": [ - { - "if": { - "and": [ - "shelter=no", - "building=", - "amenity=" - ] - }, - "then": { - "nl": "Vogelkijkwand" - } - }, - { - "if": { - "and": [ - "amenity=shelter", - "building=yes", - "shelter=yes" - ] - }, - "then": { - "nl": "Vogelkijkhut" - } - }, - { - "if": { - "and": [ - "building=tower", - "bird_hide=tower" - ] - }, - "then": { - "nl": "Vogelkijktoren" - } - }, - { - "if": { - "or": [ - "amenity=shelter", - "building=yes", - "shelter=yes" - ] - }, - "then": { - "nl": "Vogelkijkhut" - }, - "hideInAnswer": true - } - ] - }, - { - "id": "bird-hide-wheelchair", - "question": { - "nl": "Is deze vogelkijkplaats rolstoeltoegankelijk?" - }, - "mappings": [ - { - "if": { - "and": [ - "wheelchair=designated" - ] - }, - "then": { - "nl": "Er zijn speciale voorzieningen voor rolstoelen" - } - }, - { - "if": { - "and": [ - "wheelchair=yes" - ] - }, - "then": { - "nl": "Een rolstoel raakt er vlot" - } - }, - { - "if": { - "and": [ - "wheelchair=limited" - ] - }, - "then": { - "nl": "Je kan er raken met een rolstoel, maar het is niet makkelijk" - } - }, - { - "if": { - "and": [ - "wheelchair=no" - ] - }, - "then": { - "nl": "Niet rolstoeltoegankelijk" - } - } - ] - }, - { - "render": { - "nl": "Beheer door {operator}" - }, - "freeform": { - "key": "operator" - }, - "question": { - "nl": "Wie beheert deze vogelkijkplaats?" - }, - "mappings": [ - { - "if": "operator=Natuurpunt", - "then": { - "nl": "Beheer door Natuurpunt" - } - }, - { - "if": "operator=Agentschap Natuur en Bos", - "then": { - "nl": "Beheer door het Agentschap Natuur en Bos " - } - } - ], - "id": "birdhide-operator" - } - ], - "icon": { - "render": { - "nl": "./assets/layers/birdhide/birdhide.svg" - }, - "mappings": [ - { - "if": { - "or": [ - "building=yes", - "shelter=yes", - "amenity=shelter" - ] - }, - "then": "./assets/layers/birdhide/birdshelter.svg" - } - ] - }, - "size": { - "freeform": { - "addExtraTags": [] - }, - "render": { - "nl": "40,40,center" - }, - "mappings": [] - }, - "color": { - "render": { - "nl": "#94bb28" - } - }, - "stroke": { - "render": { - "nl": "3" - } - }, - "presets": [ - { - "tags": [ - "leisure=bird_hide", + { + "if": { + "or": [ "building=yes", "shelter=yes", "amenity=shelter" - ], - "title": { - "nl": "vogelkijkhut" + ] }, - "description": { - "nl": "Een overdekte hut waarbinnen er warm en droog naar vogels gekeken kan worden" - } - }, - { - "tags": [ - "leisure=bird_hide", - "building=no", - "shelter=no" - ], - "title": { - "nl": "vogelkijkwand" - }, - "description": { - "nl": "Een vogelkijkwand waarachter men kan staan om vogels te kijken" - } - } - ], - "wayHandling": 1, - "filter": [ - { - "id": "wheelchair", - "options": [ - { - "question": { - "nl": "Rolstoeltoegankelijk", - "en": "Wheelchair accessible", - "de": "Zugänglich für Rollstuhlfahrer" - }, - "osmTags": { - "or": [ - "wheelchair=yes", - "wheelchair=designated", - "wheelchair=permissive" - ] - } - } - ] - }, - { - "id": "shelter", - "options": [ - { - "question": { - "nl": "Enkel overdekte kijkhutten" - }, - "osmTags": { - "and": [ - { - "or": [ - "shelter=yes", - "building~*" - ] - }, - "covered!=no" - ] - } - } - ] - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity:={amenity}", - "amenity=" - ] - } - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + "then": "./assets/layers/birdhide/birdshelter.svg" + } + ] + }, + "location": [ + "point", + "centroid" + ] } + ] } \ No newline at end of file diff --git a/assets/layers/cafe_pub/cafe_pub.json b/assets/layers/cafe_pub/cafe_pub.json index cd5f6de2e5..9b6ab97a3e 100644 --- a/assets/layers/cafe_pub/cafe_pub.json +++ b/assets/layers/cafe_pub/cafe_pub.json @@ -1,207 +1,214 @@ { - "id": "cafe_pub", - "name": { - "nl": "Cafés", - "en": "Cafés and pubs", - "de": "Cafés und Kneipen" + "id": "cafe_pub", + "name": { + "nl": "Cafés", + "en": "Cafés and pubs", + "de": "Cafés und Kneipen" + }, + "source": { + "osmTags": { + "or": [ + "amenity=bar", + "amenity=pub", + "amenity=cafe", + "amenity=biergarten" + ] + } + }, + "presets": [ + { + "tags": [ + "amenity=pub" + ], + "title": { + "en": "pub", + "nl": "bruin cafe of kroeg", + "de": "Kneipe", + "ru": "паб" + }, + "description": { + "nl": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk " + }, + "preciseInput": { + "preferredBackground": "map" + } }, - "source": { - "osmTags": { - "or": [ - "amenity=bar", - "amenity=pub", - "amenity=cafe", - "amenity=biergarten" - ] + { + "tags": [ + "amenity=bar" + ], + "title": { + "en": "bar", + "nl": "bar", + "de": "Bar", + "ru": "бар" + }, + "description": { + "nl": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek" + }, + "preciseInput": { + "preferredBackground": "map" + } + }, + { + "tags": [ + "amenity=cafe" + ], + "title": { + "en": "cafe", + "nl": "cafe", + "de": "Café", + "ru": "кафе" + }, + "description": { + "nl": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen." + }, + "preciseInput": { + "preferredBackground": "map" + } + } + ], + "title": { + "render": { + "nl": "Café" + }, + "mappings": [ + { + "if": { + "and": [ + "name~*" + ] + }, + "then": { + "nl": "{name}", + "en": "{name}", + "de": "{name}", + "ru": "{name}" } + } + ] + }, + "tagRenderings": [ + "images", + { + "question": { + "nl": "Wat is de naam van dit café?", + "en": "What is the name of this pub?", + "de": "Wie heißt diese Kneipe?" + }, + "render": { + "nl": "De naam van dit café is {name}", + "en": "This pub is named {name}", + "de": "Diese Kneipe heißt {name}" + }, + "freeform": { + "key": "name" + }, + "id": "Name" }, - "wayHandling": 1, - "icon": { + { + "question": { + "en": "What kind of cafe is this", + "nl": "Welk soort café is dit?", + "de": "Was ist das für ein Café" + }, + "mappings": [ + { + "if": "amenity=pub", + "then": { + "nl": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk " + } + }, + { + "if": "amenity=bar", + "then": { + "nl": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek" + } + }, + { + "if": "amenity=cafe", + "then": { + "nl": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen." + } + }, + { + "if": "amenity=restaurant", + "then": { + "nl": "Dit is een restaurant waar men een maaltijd geserveerd krijgt" + } + }, + { + "if": "amenity=biergarten", + "then": { + "nl": "Een open ruimte waar bier geserveerd wordt. Typisch in Duitsland" + }, + "hideInAnswer": "_country!=de" + } + ], + "id": "Classification" + }, + "opening_hours", + "website", + "email", + "phone", + "payment-options", + "wheelchair-access", + "service:electricity", + "dog-access" + ], + "filter": [ + { + "id": "opened-now", + "options": [ + { + "question": { + "en": "Opened now", + "nl": "Nu geopened", + "de": "Jetzt geöffnet" + }, + "osmTags": "_isOpen=yes" + } + ] + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "amenity=", + "disused:amenity:={amenity}" + ] + } + }, + "allowMove": true, + "mapRendering": [ + { + "icon": { "render": "circle:white;./assets/layers/cafe_pub/pub.svg", "mappings": [ - { - "if": "amenity=cafe", - "then": "circle:white;./assets/layers/cafe_pub/cafe.svg" - } + { + "if": "amenity=cafe", + "then": "circle:white;./assets/layers/cafe_pub/cafe.svg" + } ] - }, - "iconOverlays": [ + }, + "iconBadges": [ { - "if": "opening_hours~*", - "then": "isOpen", - "badge": true + "if": "opening_hours~*", + "then": "isOpen" } - ], - "label": { + ], + "label": { "mappings": [ - { - "if": "name~*", - "then": "
{name}
" - } + { + "if": "name~*", + "then": "
{name}
" + } ] - }, - "presets": [ - { - "tags": [ - "amenity=pub" - ], - "title": { - "en": "pub", - "nl": "bruin cafe of kroeg", - "de": "Kneipe", - "ru": "паб" - }, - "description": { - "nl": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk " - }, - "preciseInput": { - "preferredBackground": "map" - } - }, - { - "tags": [ - "amenity=bar" - ], - "title": { - "en": "bar", - "nl": "bar", - "de": "Bar", - "ru": "бар" - }, - "description": { - "nl": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek" - }, - "preciseInput": { - "preferredBackground": "map" - } - }, - { - "tags": [ - "amenity=cafe" - ], - "title": { - "en": "cafe", - "nl": "cafe", - "de": "Café", - "ru": "кафе" - }, - "description": { - "nl": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen." - }, - "preciseInput": { - "preferredBackground": "map" - } - } - ], - "title": { - "render": { - "nl": "Café" - }, - "mappings": [ - { - "if": { - "and": [ - "name~*" - ] - }, - "then": { - "nl": "{name}", - "en": "{name}", - "de": "{name}", - "ru": "{name}" - } - } - ] - }, - "tagRenderings": [ - "images", - { - "question": { - "nl": "Wat is de naam van dit café?", - "en": "What is the name of this pub?", - "de": "Wie heißt diese Kneipe?" - }, - "render": { - "nl": "De naam van dit café is {name}", - "en": "This pub is named {name}", - "de": "Diese Kneipe heißt {name}" - }, - "freeform": { - "key": "name" - }, - "id": "Name" - }, - { - "question": { - "en": "What kind of cafe is this", - "nl": "Welk soort café is dit?", - "de": "Was ist das für ein Café" - }, - "mappings": [ - { - "if": "amenity=pub", - "then": { - "nl": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk " - } - }, - { - "if": "amenity=bar", - "then": { - "nl": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek" - } - }, - { - "if": "amenity=cafe", - "then": { - "nl": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen." - } - }, - { - "if": "amenity=restaurant", - "then": { - "nl": "Dit is een restaurant waar men een maaltijd geserveerd krijgt" - } - }, - { - "if": "amenity=biergarten", - "then": { - "nl": "Een open ruimte waar bier geserveerd wordt. Typisch in Duitsland" - }, - "hideInAnswer": "_country!=de" - } - ], - "id": "Classification" - }, - "opening_hours", - "website", - "email", - "phone", - "payment-options", - "wheelchair-access", - "dog-access" - ], - "filter": [ - { - "id": "opened-now", - "options": [ - { - "question": { - "en": "Opened now", - "nl": "Nu geopened", - "de": "Jetzt geöffnet" - }, - "osmTags": "_isOpen=yes" - } - ] - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "amenity=", - "disused:amenity:={amenity}" - ] - } - }, - "allowMove": true + }, + "location": [ + "point", + "centroid" + ] + } + ] } \ No newline at end of file diff --git a/assets/layers/charging_station/README.md b/assets/layers/charging_station/README.md index bc88af2d72..4c57a9c150 100644 --- a/assets/layers/charging_station/README.md +++ b/assets/layers/charging_station/README.md @@ -9,12 +9,15 @@ If you want to add a missing socket type, then: - Add all the properties in 'types.csv' - Add an icon. (Note: icons are way better as pictures as they are perceived more abstractly) -- Update license_info.json with the copyright info of the new icon. Note that we strive to have Creative-commons icons only (though there are exceptions) +- Update license_info.json with the copyright info of the new icon. Note that we strive to have Creative-commons icons + only (though there are exceptions) -AT this point, most of the work should be done; feel free to send a PR. If you would like to test it locally first (which is recommended) and have a working dev environment, then run: +AT this point, most of the work should be done; feel free to send a PR. If you would like to test it locally first ( +which is recommended) and have a working dev environment, then run: - Run 'ts-node csvToJson.ts' which will generate a new charging_station.json based on the protojson -- Run`npm run query:licenses` to get an interactive program to add the license of your artwork, followed by `npm run generate:licenses` +- Run`npm run query:licenses` to get an interactive program to add the license of your artwork, followed + by `npm run generate:licenses` - Run `npm run generate:layeroverview` to generate the layer files - Run `npm run start` to run the instance @@ -30,6 +33,6 @@ The columns in the CSV file are: - countryWhiteList: Only show this plug type in these countries - countryBlackList: Don't show this plug type in these countries. NOt compatibel with the whiteList - commonVoltages, commonCurrents, commonOutputs: common values for these tags -- associatedVehicleTypes and neverAssociatedWith: these work in tandem to hide options. - If every associated vehicle type is `no`, then the option is hidden - If at least one `neverAssociatedVehicleType` is `yes` and none of the associated types is yes, then the option is hidden too +- associatedVehicleTypes and neverAssociatedWith: these work in tandem to hide options. If every associated vehicle type + is `no`, then the option is hidden If at least one `neverAssociatedVehicleType` is `yes` and none of the associated + types is yes, then the option is hidden too diff --git a/assets/layers/charging_station/bosch-3pin.svg b/assets/layers/charging_station/bosch-3pin.svg index 266bc34f4e..515136803e 100644 --- a/assets/layers/charging_station/bosch-3pin.svg +++ b/assets/layers/charging_station/bosch-3pin.svg @@ -2,111 +2,110 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="46.74284mm" + height="36.190933mm" + viewBox="0 0 46.74284 36.190933" + version="1.1" + id="svg8" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="bosch-3pin.svg"> + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/assets/layers/charging_station/bosch-5pin.svg b/assets/layers/charging_station/bosch-5pin.svg index aa81686298..1a29624221 100644 --- a/assets/layers/charging_station/bosch-5pin.svg +++ b/assets/layers/charging_station/bosch-5pin.svg @@ -2,127 +2,126 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="46.74284mm" + height="36.190933mm" + viewBox="0 0 46.74284 36.190933" + version="1.1" + id="svg8" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="bosch-5pin.svg"> + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json index 1dca157204..b96c4ae41b 100644 --- a/assets/layers/charging_station/charging_station.json +++ b/assets/layers/charging_station/charging_station.json @@ -1180,6 +1180,1677 @@ ] } }, + { + "id": "voltage-0", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Schuko wall plug without ground pin (CEE7/4 type F)
offer?", + "nl": "Welke spanning levert de stekker van type
Schuko stekker zonder aardingspin (CEE7/4 type F)
" + }, + "render": { + "en": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs {socket:schuko:voltage} volt", + "nl": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
heeft een spanning van {socket:schuko:voltage} volt" + }, + "freeform": { + "key": "socket:schuko:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:schuko:voltage=230 V", + "then": { + "en": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs 230 volt", + "nl": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
heeft een spanning van 230 volt" + } + } + ], + "condition": { + "and": [ + "socket:schuko~*", + "socket:schuko!=0" + ] + } + }, + { + "id": "current-0", + "group": "technical", + "question": { + "en": "What current do the plugs with
Schuko wall plug without ground pin (CEE7/4 type F)
offer?", + "nl": "Welke stroom levert de stekker van type
Schuko stekker zonder aardingspin (CEE7/4 type F)
?" + }, + "render": { + "en": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most {socket:schuko:current}A", + "nl": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
levert een stroom van maximaal {socket:schuko:current}A" + }, + "freeform": { + "key": "socket:schuko:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:schuko:current=16 A", + "then": { + "en": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most 16 A", + "nl": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
levert een stroom van maximaal 16 A" + } + } + ], + "condition": { + "and": [ + "socket:schuko~*", + "socket:schuko!=0" + ] + } + }, + { + "id": "power-output-0", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Schuko wall plug without ground pin (CEE7/4 type F)
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Schuko stekker zonder aardingspin (CEE7/4 type F)
?" + }, + "render": { + "en": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most {socket:schuko:output}", + "nl": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
levert een vermogen van maximaal {socket:schuko:output}" + }, + "freeform": { + "key": "socket:schuko:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:schuko:output=3.6 kw", + "then": { + "en": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most 3.6 kw", + "nl": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
levert een vermogen van maximaal 3.6 kw" + } + } + ], + "condition": { + "and": [ + "socket:schuko~*", + "socket:schuko!=0" + ] + } + }, + { + "id": "voltage-1", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
European wall plug with ground pin (CEE7/4 type E)
offer?", + "nl": "Welke spanning levert de stekker van type
Europese stekker met aardingspin (CEE7/4 type E)
" + }, + "render": { + "en": "
European wall plug with ground pin (CEE7/4 type E)
outputs {socket:typee:voltage} volt", + "nl": "
Europese stekker met aardingspin (CEE7/4 type E)
heeft een spanning van {socket:typee:voltage} volt" + }, + "freeform": { + "key": "socket:typee:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:typee:voltage=230 V", + "then": { + "en": "
European wall plug with ground pin (CEE7/4 type E)
outputs 230 volt", + "nl": "
Europese stekker met aardingspin (CEE7/4 type E)
heeft een spanning van 230 volt" + } + } + ], + "condition": { + "and": [ + "socket:typee~*", + "socket:typee!=0" + ] + } + }, + { + "id": "current-1", + "group": "technical", + "question": { + "en": "What current do the plugs with
European wall plug with ground pin (CEE7/4 type E)
offer?", + "nl": "Welke stroom levert de stekker van type
Europese stekker met aardingspin (CEE7/4 type E)
?" + }, + "render": { + "en": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most {socket:typee:current}A", + "nl": "
Europese stekker met aardingspin (CEE7/4 type E)
levert een stroom van maximaal {socket:typee:current}A" + }, + "freeform": { + "key": "socket:typee:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:typee:current=16 A", + "then": { + "en": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most 16 A", + "nl": "
Europese stekker met aardingspin (CEE7/4 type E)
levert een stroom van maximaal 16 A" + } + } + ], + "condition": { + "and": [ + "socket:typee~*", + "socket:typee!=0" + ] + } + }, + { + "id": "power-output-1", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
European wall plug with ground pin (CEE7/4 type E)
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Europese stekker met aardingspin (CEE7/4 type E)
?" + }, + "render": { + "en": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most {socket:typee:output}", + "nl": "
Europese stekker met aardingspin (CEE7/4 type E)
levert een vermogen van maximaal {socket:typee:output}" + }, + "freeform": { + "key": "socket:typee:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:typee:output=3 kw", + "then": { + "en": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most 3 kw", + "nl": "
Europese stekker met aardingspin (CEE7/4 type E)
levert een vermogen van maximaal 3 kw" + } + }, + { + "if": "socket:socket:typee:output=22 kw", + "then": { + "en": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most 22 kw", + "nl": "
Europese stekker met aardingspin (CEE7/4 type E)
levert een vermogen van maximaal 22 kw" + } + } + ], + "condition": { + "and": [ + "socket:typee~*", + "socket:typee!=0" + ] + } + }, + { + "id": "voltage-2", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Chademo
offer?", + "nl": "Welke spanning levert de stekker van type
Chademo
" + }, + "render": { + "en": "
Chademo
outputs {socket:chademo:voltage} volt", + "nl": "
Chademo
heeft een spanning van {socket:chademo:voltage} volt" + }, + "freeform": { + "key": "socket:chademo:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:chademo:voltage=500 V", + "then": { + "en": "
Chademo
outputs 500 volt", + "nl": "
Chademo
heeft een spanning van 500 volt" + } + } + ], + "condition": { + "and": [ + "socket:chademo~*", + "socket:chademo!=0" + ] + } + }, + { + "id": "current-2", + "group": "technical", + "question": { + "en": "What current do the plugs with
Chademo
offer?", + "nl": "Welke stroom levert de stekker van type
Chademo
?" + }, + "render": { + "en": "
Chademo
outputs at most {socket:chademo:current}A", + "nl": "
Chademo
levert een stroom van maximaal {socket:chademo:current}A" + }, + "freeform": { + "key": "socket:chademo:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:chademo:current=120 A", + "then": { + "en": "
Chademo
outputs at most 120 A", + "nl": "
Chademo
levert een stroom van maximaal 120 A" + } + } + ], + "condition": { + "and": [ + "socket:chademo~*", + "socket:chademo!=0" + ] + } + }, + { + "id": "power-output-2", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Chademo
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Chademo
?" + }, + "render": { + "en": "
Chademo
outputs at most {socket:chademo:output}", + "nl": "
Chademo
levert een vermogen van maximaal {socket:chademo:output}" + }, + "freeform": { + "key": "socket:chademo:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:chademo:output=50 kw", + "then": { + "en": "
Chademo
outputs at most 50 kw", + "nl": "
Chademo
levert een vermogen van maximaal 50 kw" + } + } + ], + "condition": { + "and": [ + "socket:chademo~*", + "socket:chademo!=0" + ] + } + }, + { + "id": "voltage-3", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Type 1 with cable (J1772)
offer?", + "nl": "Welke spanning levert de stekker van type
Type 1 met kabel (J1772)
" + }, + "render": { + "en": "
Type 1 with cable (J1772)
outputs {socket:type1_cable:voltage} volt", + "nl": "
Type 1 met kabel (J1772)
heeft een spanning van {socket:type1_cable:voltage} volt" + }, + "freeform": { + "key": "socket:type1_cable:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type1_cable:voltage=200 V", + "then": { + "en": "
Type 1 with cable (J1772)
outputs 200 volt", + "nl": "
Type 1 met kabel (J1772)
heeft een spanning van 200 volt" + } + }, + { + "if": "socket:socket:type1_cable:voltage=240 V", + "then": { + "en": "
Type 1 with cable (J1772)
outputs 240 volt", + "nl": "
Type 1 met kabel (J1772)
heeft een spanning van 240 volt" + } + } + ], + "condition": { + "and": [ + "socket:type1_cable~*", + "socket:type1_cable!=0" + ] + } + }, + { + "id": "current-3", + "group": "technical", + "question": { + "en": "What current do the plugs with
Type 1 with cable (J1772)
offer?", + "nl": "Welke stroom levert de stekker van type
Type 1 met kabel (J1772)
?" + }, + "render": { + "en": "
Type 1 with cable (J1772)
outputs at most {socket:type1_cable:current}A", + "nl": "
Type 1 met kabel (J1772)
levert een stroom van maximaal {socket:type1_cable:current}A" + }, + "freeform": { + "key": "socket:type1_cable:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type1_cable:current=32 A", + "then": { + "en": "
Type 1 with cable (J1772)
outputs at most 32 A", + "nl": "
Type 1 met kabel (J1772)
levert een stroom van maximaal 32 A" + } + } + ], + "condition": { + "and": [ + "socket:type1_cable~*", + "socket:type1_cable!=0" + ] + } + }, + { + "id": "power-output-3", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Type 1 with cable (J1772)
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Type 1 met kabel (J1772)
?" + }, + "render": { + "en": "
Type 1 with cable (J1772)
outputs at most {socket:type1_cable:output}", + "nl": "
Type 1 met kabel (J1772)
levert een vermogen van maximaal {socket:type1_cable:output}" + }, + "freeform": { + "key": "socket:type1_cable:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type1_cable:output=3.7 kw", + "then": { + "en": "
Type 1 with cable (J1772)
outputs at most 3.7 kw", + "nl": "
Type 1 met kabel (J1772)
levert een vermogen van maximaal 3.7 kw" + } + }, + { + "if": "socket:socket:type1_cable:output=7 kw", + "then": { + "en": "
Type 1 with cable (J1772)
outputs at most 7 kw", + "nl": "
Type 1 met kabel (J1772)
levert een vermogen van maximaal 7 kw" + } + } + ], + "condition": { + "and": [ + "socket:type1_cable~*", + "socket:type1_cable!=0" + ] + } + }, + { + "id": "voltage-4", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Type 1 without cable (J1772)
offer?", + "nl": "Welke spanning levert de stekker van type
Type 1 zonder kabel (J1772)
" + }, + "render": { + "en": "
Type 1 without cable (J1772)
outputs {socket:type1:voltage} volt", + "nl": "
Type 1 zonder kabel (J1772)
heeft een spanning van {socket:type1:voltage} volt" + }, + "freeform": { + "key": "socket:type1:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type1:voltage=200 V", + "then": { + "en": "
Type 1 without cable (J1772)
outputs 200 volt", + "nl": "
Type 1 zonder kabel (J1772)
heeft een spanning van 200 volt" + } + }, + { + "if": "socket:socket:type1:voltage=240 V", + "then": { + "en": "
Type 1 without cable (J1772)
outputs 240 volt", + "nl": "
Type 1 zonder kabel (J1772)
heeft een spanning van 240 volt" + } + } + ], + "condition": { + "and": [ + "socket:type1~*", + "socket:type1!=0" + ] + } + }, + { + "id": "current-4", + "group": "technical", + "question": { + "en": "What current do the plugs with
Type 1 without cable (J1772)
offer?", + "nl": "Welke stroom levert de stekker van type
Type 1 zonder kabel (J1772)
?" + }, + "render": { + "en": "
Type 1 without cable (J1772)
outputs at most {socket:type1:current}A", + "nl": "
Type 1 zonder kabel (J1772)
levert een stroom van maximaal {socket:type1:current}A" + }, + "freeform": { + "key": "socket:type1:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type1:current=32 A", + "then": { + "en": "
Type 1 without cable (J1772)
outputs at most 32 A", + "nl": "
Type 1 zonder kabel (J1772)
levert een stroom van maximaal 32 A" + } + } + ], + "condition": { + "and": [ + "socket:type1~*", + "socket:type1!=0" + ] + } + }, + { + "id": "power-output-4", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Type 1 without cable (J1772)
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Type 1 zonder kabel (J1772)
?" + }, + "render": { + "en": "
Type 1 without cable (J1772)
outputs at most {socket:type1:output}", + "nl": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal {socket:type1:output}" + }, + "freeform": { + "key": "socket:type1:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type1:output=3.7 kw", + "then": { + "en": "
Type 1 without cable (J1772)
outputs at most 3.7 kw", + "nl": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 3.7 kw" + } + }, + { + "if": "socket:socket:type1:output=6.6 kw", + "then": { + "en": "
Type 1 without cable (J1772)
outputs at most 6.6 kw", + "nl": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 6.6 kw" + } + }, + { + "if": "socket:socket:type1:output=7 kw", + "then": { + "en": "
Type 1 without cable (J1772)
outputs at most 7 kw", + "nl": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 7 kw" + } + }, + { + "if": "socket:socket:type1:output=7.2 kw", + "then": { + "en": "
Type 1 without cable (J1772)
outputs at most 7.2 kw", + "nl": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 7.2 kw" + } + } + ], + "condition": { + "and": [ + "socket:type1~*", + "socket:type1!=0" + ] + } + }, + { + "id": "voltage-5", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Type 1 CCS (aka Type 1 Combo)
offer?", + "nl": "Welke spanning levert de stekker van type
Type 1 CCS (ook gekend als Type 1 Combo)
" + }, + "render": { + "en": "
Type 1 CCS (aka Type 1 Combo)
outputs {socket:type1_combo:voltage} volt", + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
heeft een spanning van {socket:type1_combo:voltage} volt" + }, + "freeform": { + "key": "socket:type1_combo:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type1_combo:voltage=400 V", + "then": { + "en": "
Type 1 CCS (aka Type 1 Combo)
outputs 400 volt", + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
heeft een spanning van 400 volt" + } + }, + { + "if": "socket:socket:type1_combo:voltage=1000 V", + "then": { + "en": "
Type 1 CCS (aka Type 1 Combo)
outputs 1000 volt", + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
heeft een spanning van 1000 volt" + } + } + ], + "condition": { + "and": [ + "socket:type1_combo~*", + "socket:type1_combo!=0" + ] + } + }, + { + "id": "current-5", + "group": "technical", + "question": { + "en": "What current do the plugs with
Type 1 CCS (aka Type 1 Combo)
offer?", + "nl": "Welke stroom levert de stekker van type
Type 1 CCS (ook gekend als Type 1 Combo)
?" + }, + "render": { + "en": "
Type 1 CCS (aka Type 1 Combo)
outputs at most {socket:type1_combo:current}A", + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een stroom van maximaal {socket:type1_combo:current}A" + }, + "freeform": { + "key": "socket:type1_combo:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type1_combo:current=50 A", + "then": { + "en": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 50 A", + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een stroom van maximaal 50 A" + } + }, + { + "if": "socket:socket:type1_combo:current=125 A", + "then": { + "en": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 125 A", + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een stroom van maximaal 125 A" + } + } + ], + "condition": { + "and": [ + "socket:type1_combo~*", + "socket:type1_combo!=0" + ] + } + }, + { + "id": "power-output-5", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Type 1 CCS (aka Type 1 Combo)
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Type 1 CCS (ook gekend als Type 1 Combo)
?" + }, + "render": { + "en": "
Type 1 CCS (aka Type 1 Combo)
outputs at most {socket:type1_combo:output}", + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal {socket:type1_combo:output}" + }, + "freeform": { + "key": "socket:type1_combo:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type1_combo:output=50 kw", + "then": { + "en": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 50 kw", + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 50 kw" + } + }, + { + "if": "socket:socket:type1_combo:output=62.5 kw", + "then": { + "en": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 62.5 kw", + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 62.5 kw" + } + }, + { + "if": "socket:socket:type1_combo:output=150 kw", + "then": { + "en": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 150 kw", + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 150 kw" + } + }, + { + "if": "socket:socket:type1_combo:output=350 kw", + "then": { + "en": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 350 kw", + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 350 kw" + } + } + ], + "condition": { + "and": [ + "socket:type1_combo~*", + "socket:type1_combo!=0" + ] + } + }, + { + "id": "voltage-6", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Tesla Supercharger
offer?", + "nl": "Welke spanning levert de stekker van type
Tesla Supercharger
" + }, + "render": { + "en": "
Tesla Supercharger
outputs {socket:tesla_supercharger:voltage} volt", + "nl": "
Tesla Supercharger
heeft een spanning van {socket:tesla_supercharger:voltage} volt" + }, + "freeform": { + "key": "socket:tesla_supercharger:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_supercharger:voltage=480 V", + "then": { + "en": "
Tesla Supercharger
outputs 480 volt", + "nl": "
Tesla Supercharger
heeft een spanning van 480 volt" + } + } + ], + "condition": { + "and": [ + "socket:tesla_supercharger~*", + "socket:tesla_supercharger!=0" + ] + } + }, + { + "id": "current-6", + "group": "technical", + "question": { + "en": "What current do the plugs with
Tesla Supercharger
offer?", + "nl": "Welke stroom levert de stekker van type
Tesla Supercharger
?" + }, + "render": { + "en": "
Tesla Supercharger
outputs at most {socket:tesla_supercharger:current}A", + "nl": "
Tesla Supercharger
levert een stroom van maximaal {socket:tesla_supercharger:current}A" + }, + "freeform": { + "key": "socket:tesla_supercharger:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_supercharger:current=125 A", + "then": { + "en": "
Tesla Supercharger
outputs at most 125 A", + "nl": "
Tesla Supercharger
levert een stroom van maximaal 125 A" + } + }, + { + "if": "socket:socket:tesla_supercharger:current=350 A", + "then": { + "en": "
Tesla Supercharger
outputs at most 350 A", + "nl": "
Tesla Supercharger
levert een stroom van maximaal 350 A" + } + } + ], + "condition": { + "and": [ + "socket:tesla_supercharger~*", + "socket:tesla_supercharger!=0" + ] + } + }, + { + "id": "power-output-6", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Tesla Supercharger
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Tesla Supercharger
?" + }, + "render": { + "en": "
Tesla Supercharger
outputs at most {socket:tesla_supercharger:output}", + "nl": "
Tesla Supercharger
levert een vermogen van maximaal {socket:tesla_supercharger:output}" + }, + "freeform": { + "key": "socket:tesla_supercharger:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_supercharger:output=120 kw", + "then": { + "en": "
Tesla Supercharger
outputs at most 120 kw", + "nl": "
Tesla Supercharger
levert een vermogen van maximaal 120 kw" + } + }, + { + "if": "socket:socket:tesla_supercharger:output=150 kw", + "then": { + "en": "
Tesla Supercharger
outputs at most 150 kw", + "nl": "
Tesla Supercharger
levert een vermogen van maximaal 150 kw" + } + }, + { + "if": "socket:socket:tesla_supercharger:output=250 kw", + "then": { + "en": "
Tesla Supercharger
outputs at most 250 kw", + "nl": "
Tesla Supercharger
levert een vermogen van maximaal 250 kw" + } + } + ], + "condition": { + "and": [ + "socket:tesla_supercharger~*", + "socket:tesla_supercharger!=0" + ] + } + }, + { + "id": "voltage-7", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Type 2 (mennekes)
offer?", + "nl": "Welke spanning levert de stekker van type
Type 2 (mennekes)
" + }, + "render": { + "en": "
Type 2 (mennekes)
outputs {socket:type2:voltage} volt", + "nl": "
Type 2 (mennekes)
heeft een spanning van {socket:type2:voltage} volt" + }, + "freeform": { + "key": "socket:type2:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type2:voltage=230 V", + "then": { + "en": "
Type 2 (mennekes)
outputs 230 volt", + "nl": "
Type 2 (mennekes)
heeft een spanning van 230 volt" + } + }, + { + "if": "socket:socket:type2:voltage=400 V", + "then": { + "en": "
Type 2 (mennekes)
outputs 400 volt", + "nl": "
Type 2 (mennekes)
heeft een spanning van 400 volt" + } + } + ], + "condition": { + "and": [ + "socket:type2~*", + "socket:type2!=0" + ] + } + }, + { + "id": "current-7", + "group": "technical", + "question": { + "en": "What current do the plugs with
Type 2 (mennekes)
offer?", + "nl": "Welke stroom levert de stekker van type
Type 2 (mennekes)
?" + }, + "render": { + "en": "
Type 2 (mennekes)
outputs at most {socket:type2:current}A", + "nl": "
Type 2 (mennekes)
levert een stroom van maximaal {socket:type2:current}A" + }, + "freeform": { + "key": "socket:type2:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type2:current=16 A", + "then": { + "en": "
Type 2 (mennekes)
outputs at most 16 A", + "nl": "
Type 2 (mennekes)
levert een stroom van maximaal 16 A" + } + }, + { + "if": "socket:socket:type2:current=32 A", + "then": { + "en": "
Type 2 (mennekes)
outputs at most 32 A", + "nl": "
Type 2 (mennekes)
levert een stroom van maximaal 32 A" + } + } + ], + "condition": { + "and": [ + "socket:type2~*", + "socket:type2!=0" + ] + } + }, + { + "id": "power-output-7", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Type 2 (mennekes)
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Type 2 (mennekes)
?" + }, + "render": { + "en": "
Type 2 (mennekes)
outputs at most {socket:type2:output}", + "nl": "
Type 2 (mennekes)
levert een vermogen van maximaal {socket:type2:output}" + }, + "freeform": { + "key": "socket:type2:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type2:output=11 kw", + "then": { + "en": "
Type 2 (mennekes)
outputs at most 11 kw", + "nl": "
Type 2 (mennekes)
levert een vermogen van maximaal 11 kw" + } + }, + { + "if": "socket:socket:type2:output=22 kw", + "then": { + "en": "
Type 2 (mennekes)
outputs at most 22 kw", + "nl": "
Type 2 (mennekes)
levert een vermogen van maximaal 22 kw" + } + } + ], + "condition": { + "and": [ + "socket:type2~*", + "socket:type2!=0" + ] + } + }, + { + "id": "voltage-8", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Type 2 CCS (mennekes)
offer?", + "nl": "Welke spanning levert de stekker van type
Type 2 CCS (mennekes)
" + }, + "render": { + "en": "
Type 2 CCS (mennekes)
outputs {socket:type2_combo:voltage} volt", + "nl": "
Type 2 CCS (mennekes)
heeft een spanning van {socket:type2_combo:voltage} volt" + }, + "freeform": { + "key": "socket:type2_combo:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type2_combo:voltage=500 V", + "then": { + "en": "
Type 2 CCS (mennekes)
outputs 500 volt", + "nl": "
Type 2 CCS (mennekes)
heeft een spanning van 500 volt" + } + }, + { + "if": "socket:socket:type2_combo:voltage=920 V", + "then": { + "en": "
Type 2 CCS (mennekes)
outputs 920 volt", + "nl": "
Type 2 CCS (mennekes)
heeft een spanning van 920 volt" + } + } + ], + "condition": { + "and": [ + "socket:type2_combo~*", + "socket:type2_combo!=0" + ] + } + }, + { + "id": "current-8", + "group": "technical", + "question": { + "en": "What current do the plugs with
Type 2 CCS (mennekes)
offer?", + "nl": "Welke stroom levert de stekker van type
Type 2 CCS (mennekes)
?" + }, + "render": { + "en": "
Type 2 CCS (mennekes)
outputs at most {socket:type2_combo:current}A", + "nl": "
Type 2 CCS (mennekes)
levert een stroom van maximaal {socket:type2_combo:current}A" + }, + "freeform": { + "key": "socket:type2_combo:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type2_combo:current=125 A", + "then": { + "en": "
Type 2 CCS (mennekes)
outputs at most 125 A", + "nl": "
Type 2 CCS (mennekes)
levert een stroom van maximaal 125 A" + } + }, + { + "if": "socket:socket:type2_combo:current=350 A", + "then": { + "en": "
Type 2 CCS (mennekes)
outputs at most 350 A", + "nl": "
Type 2 CCS (mennekes)
levert een stroom van maximaal 350 A" + } + } + ], + "condition": { + "and": [ + "socket:type2_combo~*", + "socket:type2_combo!=0" + ] + } + }, + { + "id": "power-output-8", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Type 2 CCS (mennekes)
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Type 2 CCS (mennekes)
?" + }, + "render": { + "en": "
Type 2 CCS (mennekes)
outputs at most {socket:type2_combo:output}", + "nl": "
Type 2 CCS (mennekes)
levert een vermogen van maximaal {socket:type2_combo:output}" + }, + "freeform": { + "key": "socket:type2_combo:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type2_combo:output=50 kw", + "then": { + "en": "
Type 2 CCS (mennekes)
outputs at most 50 kw", + "nl": "
Type 2 CCS (mennekes)
levert een vermogen van maximaal 50 kw" + } + } + ], + "condition": { + "and": [ + "socket:type2_combo~*", + "socket:type2_combo!=0" + ] + } + }, + { + "id": "voltage-9", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Type 2 with cable (mennekes)
offer?", + "nl": "Welke spanning levert de stekker van type
Type 2 met kabel (J1772)
" + }, + "render": { + "en": "
Type 2 with cable (mennekes)
outputs {socket:type2_cable:voltage} volt", + "nl": "
Type 2 met kabel (J1772)
heeft een spanning van {socket:type2_cable:voltage} volt" + }, + "freeform": { + "key": "socket:type2_cable:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type2_cable:voltage=230 V", + "then": { + "en": "
Type 2 with cable (mennekes)
outputs 230 volt", + "nl": "
Type 2 met kabel (J1772)
heeft een spanning van 230 volt" + } + }, + { + "if": "socket:socket:type2_cable:voltage=400 V", + "then": { + "en": "
Type 2 with cable (mennekes)
outputs 400 volt", + "nl": "
Type 2 met kabel (J1772)
heeft een spanning van 400 volt" + } + } + ], + "condition": { + "and": [ + "socket:type2_cable~*", + "socket:type2_cable!=0" + ] + } + }, + { + "id": "current-9", + "group": "technical", + "question": { + "en": "What current do the plugs with
Type 2 with cable (mennekes)
offer?", + "nl": "Welke stroom levert de stekker van type
Type 2 met kabel (J1772)
?" + }, + "render": { + "en": "
Type 2 with cable (mennekes)
outputs at most {socket:type2_cable:current}A", + "nl": "
Type 2 met kabel (J1772)
levert een stroom van maximaal {socket:type2_cable:current}A" + }, + "freeform": { + "key": "socket:type2_cable:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type2_cable:current=16 A", + "then": { + "en": "
Type 2 with cable (mennekes)
outputs at most 16 A", + "nl": "
Type 2 met kabel (J1772)
levert een stroom van maximaal 16 A" + } + }, + { + "if": "socket:socket:type2_cable:current=32 A", + "then": { + "en": "
Type 2 with cable (mennekes)
outputs at most 32 A", + "nl": "
Type 2 met kabel (J1772)
levert een stroom van maximaal 32 A" + } + } + ], + "condition": { + "and": [ + "socket:type2_cable~*", + "socket:type2_cable!=0" + ] + } + }, + { + "id": "power-output-9", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Type 2 with cable (mennekes)
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Type 2 met kabel (J1772)
?" + }, + "render": { + "en": "
Type 2 with cable (mennekes)
outputs at most {socket:type2_cable:output}", + "nl": "
Type 2 met kabel (J1772)
levert een vermogen van maximaal {socket:type2_cable:output}" + }, + "freeform": { + "key": "socket:type2_cable:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:type2_cable:output=11 kw", + "then": { + "en": "
Type 2 with cable (mennekes)
outputs at most 11 kw", + "nl": "
Type 2 met kabel (J1772)
levert een vermogen van maximaal 11 kw" + } + }, + { + "if": "socket:socket:type2_cable:output=22 kw", + "then": { + "en": "
Type 2 with cable (mennekes)
outputs at most 22 kw", + "nl": "
Type 2 met kabel (J1772)
levert een vermogen van maximaal 22 kw" + } + } + ], + "condition": { + "and": [ + "socket:type2_cable~*", + "socket:type2_cable!=0" + ] + } + }, + { + "id": "voltage-10", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Tesla Supercharger CCS (a branded type2_css)
offer?", + "nl": "Welke spanning levert de stekker van type
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
" + }, + "render": { + "en": "
Tesla Supercharger CCS (a branded type2_css)
outputs {socket:tesla_supercharger_ccs:voltage} volt", + "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
heeft een spanning van {socket:tesla_supercharger_ccs:voltage} volt" + }, + "freeform": { + "key": "socket:tesla_supercharger_ccs:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_supercharger_ccs:voltage=500 V", + "then": { + "en": "
Tesla Supercharger CCS (a branded type2_css)
outputs 500 volt", + "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
heeft een spanning van 500 volt" + } + }, + { + "if": "socket:socket:tesla_supercharger_ccs:voltage=920 V", + "then": { + "en": "
Tesla Supercharger CCS (a branded type2_css)
outputs 920 volt", + "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
heeft een spanning van 920 volt" + } + } + ], + "condition": { + "and": [ + "socket:tesla_supercharger_ccs~*", + "socket:tesla_supercharger_ccs!=0" + ] + } + }, + { + "id": "current-10", + "group": "technical", + "question": { + "en": "What current do the plugs with
Tesla Supercharger CCS (a branded type2_css)
offer?", + "nl": "Welke stroom levert de stekker van type
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
?" + }, + "render": { + "en": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most {socket:tesla_supercharger_ccs:current}A", + "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
levert een stroom van maximaal {socket:tesla_supercharger_ccs:current}A" + }, + "freeform": { + "key": "socket:tesla_supercharger_ccs:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_supercharger_ccs:current=125 A", + "then": { + "en": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most 125 A", + "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
levert een stroom van maximaal 125 A" + } + }, + { + "if": "socket:socket:tesla_supercharger_ccs:current=350 A", + "then": { + "en": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most 350 A", + "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
levert een stroom van maximaal 350 A" + } + } + ], + "condition": { + "and": [ + "socket:tesla_supercharger_ccs~*", + "socket:tesla_supercharger_ccs!=0" + ] + } + }, + { + "id": "power-output-10", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Tesla Supercharger CCS (a branded type2_css)
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
?" + }, + "render": { + "en": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most {socket:tesla_supercharger_ccs:output}", + "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
levert een vermogen van maximaal {socket:tesla_supercharger_ccs:output}" + }, + "freeform": { + "key": "socket:tesla_supercharger_ccs:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_supercharger_ccs:output=50 kw", + "then": { + "en": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most 50 kw", + "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
levert een vermogen van maximaal 50 kw" + } + } + ], + "condition": { + "and": [ + "socket:tesla_supercharger_ccs~*", + "socket:tesla_supercharger_ccs!=0" + ] + } + }, + { + "id": "voltage-11", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Tesla Supercharger (destination)
offer?", + "nl": "Welke spanning levert de stekker van type
Tesla Supercharger (destination)
" + }, + "render": { + "en": "
Tesla Supercharger (destination)
outputs {socket:tesla_destination:voltage} volt", + "nl": "
Tesla Supercharger (destination)
heeft een spanning van {socket:tesla_destination:voltage} volt" + }, + "freeform": { + "key": "socket:tesla_destination:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_destination:voltage=480 V", + "then": { + "en": "
Tesla Supercharger (destination)
outputs 480 volt", + "nl": "
Tesla Supercharger (destination)
heeft een spanning van 480 volt" + } + } + ], + "condition": { + "and": [ + "socket:tesla_destination~*", + "socket:tesla_destination!=0" + ] + } + }, + { + "id": "current-11", + "group": "technical", + "question": { + "en": "What current do the plugs with
Tesla Supercharger (destination)
offer?", + "nl": "Welke stroom levert de stekker van type
Tesla Supercharger (destination)
?" + }, + "render": { + "en": "
Tesla Supercharger (destination)
outputs at most {socket:tesla_destination:current}A", + "nl": "
Tesla Supercharger (destination)
levert een stroom van maximaal {socket:tesla_destination:current}A" + }, + "freeform": { + "key": "socket:tesla_destination:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_destination:current=125 A", + "then": { + "en": "
Tesla Supercharger (destination)
outputs at most 125 A", + "nl": "
Tesla Supercharger (destination)
levert een stroom van maximaal 125 A" + } + }, + { + "if": "socket:socket:tesla_destination:current=350 A", + "then": { + "en": "
Tesla Supercharger (destination)
outputs at most 350 A", + "nl": "
Tesla Supercharger (destination)
levert een stroom van maximaal 350 A" + } + } + ], + "condition": { + "and": [ + "socket:tesla_destination~*", + "socket:tesla_destination!=0" + ] + } + }, + { + "id": "power-output-11", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Tesla Supercharger (destination)
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Tesla Supercharger (destination)
?" + }, + "render": { + "en": "
Tesla Supercharger (destination)
outputs at most {socket:tesla_destination:output}", + "nl": "
Tesla Supercharger (destination)
levert een vermogen van maximaal {socket:tesla_destination:output}" + }, + "freeform": { + "key": "socket:tesla_destination:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_destination:output=120 kw", + "then": { + "en": "
Tesla Supercharger (destination)
outputs at most 120 kw", + "nl": "
Tesla Supercharger (destination)
levert een vermogen van maximaal 120 kw" + } + }, + { + "if": "socket:socket:tesla_destination:output=150 kw", + "then": { + "en": "
Tesla Supercharger (destination)
outputs at most 150 kw", + "nl": "
Tesla Supercharger (destination)
levert een vermogen van maximaal 150 kw" + } + }, + { + "if": "socket:socket:tesla_destination:output=250 kw", + "then": { + "en": "
Tesla Supercharger (destination)
outputs at most 250 kw", + "nl": "
Tesla Supercharger (destination)
levert een vermogen van maximaal 250 kw" + } + } + ], + "condition": { + "and": [ + "socket:tesla_destination~*", + "socket:tesla_destination!=0" + ] + } + }, + { + "id": "voltage-12", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
offer?", + "nl": "Welke spanning levert de stekker van type
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
" + }, + "render": { + "en": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs {socket:tesla_destination:voltage} volt", + "nl": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
heeft een spanning van {socket:tesla_destination:voltage} volt" + }, + "freeform": { + "key": "socket:tesla_destination:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_destination:voltage=230 V", + "then": { + "en": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs 230 volt", + "nl": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
heeft een spanning van 230 volt" + } + }, + { + "if": "socket:socket:tesla_destination:voltage=400 V", + "then": { + "en": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs 400 volt", + "nl": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
heeft een spanning van 400 volt" + } + } + ], + "condition": { + "and": [ + "socket:tesla_destination~*", + "socket:tesla_destination!=0" + ] + } + }, + { + "id": "current-12", + "group": "technical", + "question": { + "en": "What current do the plugs with
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
offer?", + "nl": "Welke stroom levert de stekker van type
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
?" + }, + "render": { + "en": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most {socket:tesla_destination:current}A", + "nl": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een stroom van maximaal {socket:tesla_destination:current}A" + }, + "freeform": { + "key": "socket:tesla_destination:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_destination:current=16 A", + "then": { + "en": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 16 A", + "nl": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een stroom van maximaal 16 A" + } + }, + { + "if": "socket:socket:tesla_destination:current=32 A", + "then": { + "en": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 32 A", + "nl": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een stroom van maximaal 32 A" + } + } + ], + "condition": { + "and": [ + "socket:tesla_destination~*", + "socket:tesla_destination!=0" + ] + } + }, + { + "id": "power-output-12", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
?" + }, + "render": { + "en": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most {socket:tesla_destination:output}", + "nl": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een vermogen van maximaal {socket:tesla_destination:output}" + }, + "freeform": { + "key": "socket:tesla_destination:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:tesla_destination:output=11 kw", + "then": { + "en": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 11 kw", + "nl": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een vermogen van maximaal 11 kw" + } + }, + { + "if": "socket:socket:tesla_destination:output=22 kw", + "then": { + "en": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 22 kw", + "nl": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een vermogen van maximaal 22 kw" + } + } + ], + "condition": { + "and": [ + "socket:tesla_destination~*", + "socket:tesla_destination!=0" + ] + } + }, + { + "id": "voltage-13", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
USB to charge phones and small electronics
offer?", + "nl": "Welke spanning levert de stekker van type
USB om GSMs en kleine electronica op te laden
" + }, + "render": { + "en": "
USB to charge phones and small electronics
outputs {socket:USB-A:voltage} volt", + "nl": "
USB om GSMs en kleine electronica op te laden
heeft een spanning van {socket:USB-A:voltage} volt" + }, + "freeform": { + "key": "socket:USB-A:voltage", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:USB-A:voltage=5 V", + "then": { + "en": "
USB to charge phones and small electronics
outputs 5 volt", + "nl": "
USB om GSMs en kleine electronica op te laden
heeft een spanning van 5 volt" + } + } + ], + "condition": { + "and": [ + "socket:USB-A~*", + "socket:USB-A!=0" + ] + } + }, + { + "id": "current-13", + "group": "technical", + "question": { + "en": "What current do the plugs with
USB to charge phones and small electronics
offer?", + "nl": "Welke stroom levert de stekker van type
USB om GSMs en kleine electronica op te laden
?" + }, + "render": { + "en": "
USB to charge phones and small electronics
outputs at most {socket:USB-A:current}A", + "nl": "
USB om GSMs en kleine electronica op te laden
levert een stroom van maximaal {socket:USB-A:current}A" + }, + "freeform": { + "key": "socket:USB-A:current", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:USB-A:current=1 A", + "then": { + "en": "
USB to charge phones and small electronics
outputs at most 1 A", + "nl": "
USB om GSMs en kleine electronica op te laden
levert een stroom van maximaal 1 A" + } + }, + { + "if": "socket:socket:USB-A:current=2 A", + "then": { + "en": "
USB to charge phones and small electronics
outputs at most 2 A", + "nl": "
USB om GSMs en kleine electronica op te laden
levert een stroom van maximaal 2 A" + } + } + ], + "condition": { + "and": [ + "socket:USB-A~*", + "socket:USB-A!=0" + ] + } + }, + { + "id": "power-output-13", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
USB to charge phones and small electronics
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
USB om GSMs en kleine electronica op te laden
?" + }, + "render": { + "en": "
USB to charge phones and small electronics
outputs at most {socket:USB-A:output}", + "nl": "
USB om GSMs en kleine electronica op te laden
levert een vermogen van maximaal {socket:USB-A:output}" + }, + "freeform": { + "key": "socket:USB-A:output", + "type": "pfloat" + }, + "mappings": [ + { + "if": "socket:socket:USB-A:output=5w", + "then": { + "en": "
USB to charge phones and small electronics
outputs at most 5w", + "nl": "
USB om GSMs en kleine electronica op te laden
levert een vermogen van maximaal 5w" + } + }, + { + "if": "socket:socket:USB-A:output=10w", + "then": { + "en": "
USB to charge phones and small electronics
outputs at most 10w", + "nl": "
USB om GSMs en kleine electronica op te laden
levert een vermogen van maximaal 10w" + } + } + ], + "condition": { + "and": [ + "socket:USB-A~*", + "socket:USB-A!=0" + ] + } + }, + { + "id": "voltage-14", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Bosch Active Connect with 3 pins and cable
offer?", + "nl": "Welke spanning levert de stekker van type
Bosch Active Connect met 3 pinnen aan een kabel
" + }, + "render": { + "en": "
Bosch Active Connect with 3 pins and cable
outputs {socket:bosch_3pin:voltage} volt", + "nl": "
Bosch Active Connect met 3 pinnen aan een kabel
heeft een spanning van {socket:bosch_3pin:voltage} volt" + }, + "freeform": { + "key": "socket:bosch_3pin:voltage", + "type": "pfloat" + }, + "mappings": [], + "condition": { + "and": [ + "socket:bosch_3pin~*", + "socket:bosch_3pin!=0" + ] + } + }, + { + "id": "current-14", + "group": "technical", + "question": { + "en": "What current do the plugs with
Bosch Active Connect with 3 pins and cable
offer?", + "nl": "Welke stroom levert de stekker van type
Bosch Active Connect met 3 pinnen aan een kabel
?" + }, + "render": { + "en": "
Bosch Active Connect with 3 pins and cable
outputs at most {socket:bosch_3pin:current}A", + "nl": "
Bosch Active Connect met 3 pinnen aan een kabel
levert een stroom van maximaal {socket:bosch_3pin:current}A" + }, + "freeform": { + "key": "socket:bosch_3pin:current", + "type": "pfloat" + }, + "mappings": [], + "condition": { + "and": [ + "socket:bosch_3pin~*", + "socket:bosch_3pin!=0" + ] + } + }, + { + "id": "power-output-14", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Bosch Active Connect with 3 pins and cable
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Bosch Active Connect met 3 pinnen aan een kabel
?" + }, + "render": { + "en": "
Bosch Active Connect with 3 pins and cable
outputs at most {socket:bosch_3pin:output}", + "nl": "
Bosch Active Connect met 3 pinnen aan een kabel
levert een vermogen van maximaal {socket:bosch_3pin:output}" + }, + "freeform": { + "key": "socket:bosch_3pin:output", + "type": "pfloat" + }, + "mappings": [], + "condition": { + "and": [ + "socket:bosch_3pin~*", + "socket:bosch_3pin!=0" + ] + } + }, + { + "id": "voltage-15", + "group": "technical", + "question": { + "en": "What voltage do the plugs with
Bosch Active Connect with 5 pins and cable
offer?", + "nl": "Welke spanning levert de stekker van type
Bosch Active Connect met 5 pinnen aan een kabel
" + }, + "render": { + "en": "
Bosch Active Connect with 5 pins and cable
outputs {socket:bosch_5pin:voltage} volt", + "nl": "
Bosch Active Connect met 5 pinnen aan een kabel
heeft een spanning van {socket:bosch_5pin:voltage} volt" + }, + "freeform": { + "key": "socket:bosch_5pin:voltage", + "type": "pfloat" + }, + "mappings": [], + "condition": { + "and": [ + "socket:bosch_5pin~*", + "socket:bosch_5pin!=0" + ] + } + }, + { + "id": "current-15", + "group": "technical", + "question": { + "en": "What current do the plugs with
Bosch Active Connect with 5 pins and cable
offer?", + "nl": "Welke stroom levert de stekker van type
Bosch Active Connect met 5 pinnen aan een kabel
?" + }, + "render": { + "en": "
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:current}A", + "nl": "
Bosch Active Connect met 5 pinnen aan een kabel
levert een stroom van maximaal {socket:bosch_5pin:current}A" + }, + "freeform": { + "key": "socket:bosch_5pin:current", + "type": "pfloat" + }, + "mappings": [], + "condition": { + "and": [ + "socket:bosch_5pin~*", + "socket:bosch_5pin!=0" + ] + } + }, + { + "id": "power-output-15", + "group": "technical", + "question": { + "en": "What power output does a single plug of type
Bosch Active Connect with 5 pins and cable
offer?", + "nl": "Welk vermogen levert een enkele stekker van type
Bosch Active Connect met 5 pinnen aan een kabel
?" + }, + "render": { + "en": "
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:output}", + "nl": "
Bosch Active Connect met 5 pinnen aan een kabel
levert een vermogen van maximaal {socket:bosch_5pin:output}" + }, + "freeform": { + "key": "socket:bosch_5pin:output", + "type": "pfloat" + }, + "mappings": [], + "condition": { + "and": [ + "socket:bosch_5pin~*", + "socket:bosch_5pin!=0" + ] + } + }, { "id": "OH", "render": "{opening_hours_table(opening_hours)}", @@ -1703,71 +3374,88 @@ "bicycle=" ] } + }, + { + "id": "questions" + }, + { + "id": "questions", + "group": "technical", + "render": { + "en": "

Technical questions

The questions below are very technical. Feel free to ignore them
{questions}", + "nl": "

Technische vragen

De vragen hieronder zijn erg technisch - sla deze over indien je hier geen tijd voor hebt
{questions}" + }, + "freeform": { + "key": "questions", + "helperArgs": { + "showAllQuestions": true + } + } } ], - "icon": { - "render": "pin:#fff;./assets/themes/charging_stations/plug.svg", - "mappings": [ - { - "if": "bicycle=yes", - "then": "pin:#fff;./assets/themes/charging_stations/bicycle.svg" - }, - { - "if": { - "or": [ - "car=yes", - "motorcar=yes" - ] - }, - "then": "pin:#fff;./assets/themes/charging_stations/car.svg" - } - ] - }, - "iconOverlays": [ + "mapRendering": [ { - "if": { - "or": [ - "disused:amenity=charging_station", - "operational_status=broken" - ] - }, - "then": "cross_bottom_right:#c22;" - }, - { - "if": { - "or": [ - "proposed:amenity=charging_station", - "planned:amenity=charging_station" - ] - }, - "then": "./assets/layers/charging_station/under_construction.svg", - "badge": true - }, - { - "if": { - "and": [ - "bicycle=yes", + "location": [ + "point", + "centroid" + ], + "icon": { + "render": "pin:#fff;./assets/themes/charging_stations/plug.svg", + "mappings": [ { - "or": [ - "motorcar=yes", - "car=yes" - ] + "if": "bicycle=yes", + "then": "pin:#fff;./assets/themes/charging_stations/bicycle.svg" + }, + { + "if": { + "or": [ + "car=yes", + "motorcar=yes" + ] + }, + "then": "pin:#fff;./assets/themes/charging_stations/car.svg" } ] }, - "then": "circle:#fff;./assets/themes/charging_stations/car.svg", - "badge": true + "iconBadges": [ + { + "if": { + "or": [ + "disused:amenity=charging_station", + "operational_status=broken" + ] + }, + "then": "cross:#c22;" + }, + { + "if": { + "or": [ + "proposed:amenity=charging_station", + "planned:amenity=charging_station" + ] + }, + "then": "./assets/layers/charging_station/under_construction.svg" + }, + { + "if": { + "and": [ + "bicycle=yes", + { + "or": [ + "motorcar=yes", + "car=yes" + ] + } + ] + }, + "then": "circle:#fff;./assets/themes/charging_stations/car.svg" + } + ], + "iconSize": { + "render": "50,50,bottom" + } } ], - "width": { - "render": "8" - }, - "iconSize": { - "render": "50,50,bottom" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -1825,7 +3513,6 @@ } } ], - "wayHandling": 1, "filter": [ { "id": "vehicle-type", diff --git a/assets/layers/charging_station/charging_station.protojson b/assets/layers/charging_station/charging_station.protojson index 8c70020248..985f383124 100644 --- a/assets/layers/charging_station/charging_station.protojson +++ b/assets/layers/charging_station/charging_station.protojson @@ -413,7 +413,12 @@ } ], "condition": { - "or": ["maxstay~*","motorcar=yes","hgv=yes","bus=yes"] + "or": [ + "maxstay~*", + "motorcar=yes", + "hgv=yes", + "bus=yes" + ] } }, { @@ -497,7 +502,8 @@ "nl": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?" }, "render": { - "en": "In case of problems, call {phone}", "nl": "Bij problemen, bel naar {phone}" + "en": "In case of problems, call {phone}", + "nl": "Bij problemen, bel naar {phone}" }, "freeform": { "key": "phone", @@ -548,8 +554,8 @@ "freeform": { "key": "ref" }, - "#": "Only asked if part of a bigger network. Small operators typically don't have a reference number", - "condition":"network!=" + "#": "Only asked if part of a bigger network. Small operators typically don't have a reference number", + "condition": "network!=" }, { "id": "Operational status", @@ -604,7 +610,7 @@ } }, { - "if":{ + "if": { "and": [ "planned:amenity=", "construction:amenity=charging_station", @@ -666,71 +672,82 @@ "bicycle=" ] } + }, + { + "id": "questions" + }, + { + "id": "questions", + "group": "technical", + "render": { + "en": "

Technical questions

The questions below are very technical. Feel free to ignore them
{questions}", + "nl": "

Technische vragen

De vragen hieronder zijn erg technisch - sla deze over indien je hier geen tijd voor hebt
{questions}" + } } ], - "icon": { - "render": "pin:#fff;./assets/themes/charging_stations/plug.svg", - "mappings": [ - { - "if": "bicycle=yes", - "then": "pin:#fff;./assets/themes/charging_stations/bicycle.svg" - }, - { - "if": { - "or": [ - "car=yes", - "motorcar=yes" - ] - }, - "then": "pin:#fff;./assets/themes/charging_stations/car.svg" - } - ] - }, - "iconOverlays": [ + "mapRendering": [ { - "if": { - "or": [ - "disused:amenity=charging_station", - "operational_status=broken" - ] - }, - "then": "cross_bottom_right:#c22;" - }, - { - "if": { - "or": [ - "proposed:amenity=charging_station", - "planned:amenity=charging_station" - ] - }, - "then": "./assets/layers/charging_station/under_construction.svg", - "badge": true - }, - { - "if": { - "and": [ - "bicycle=yes", + "location": [ + "point", + "centroid" + ], + "icon": { + "render": "pin:#fff;./assets/themes/charging_stations/plug.svg", + "mappings": [ { - "or": [ - "motorcar=yes", - "car=yes" - ] + "if": "bicycle=yes", + "then": "pin:#fff;./assets/themes/charging_stations/bicycle.svg" + }, + { + "if": { + "or": [ + "car=yes", + "motorcar=yes" + ] + }, + "then": "pin:#fff;./assets/themes/charging_stations/car.svg" } ] }, - "then": "circle:#fff;./assets/themes/charging_stations/car.svg", - "badge": true + "iconBadges": [ + { + "if": { + "or": [ + "disused:amenity=charging_station", + "operational_status=broken" + ] + }, + "then": "cross:#c22;" + }, + { + "if": { + "or": [ + "proposed:amenity=charging_station", + "planned:amenity=charging_station" + ] + }, + "then": "./assets/layers/charging_station/under_construction.svg" + }, + { + "if": { + "and": [ + "bicycle=yes", + { + "or": [ + "motorcar=yes", + "car=yes" + ] + } + ] + }, + "then": "circle:#fff;./assets/themes/charging_stations/car.svg" + } + ], + "iconSize": { + "render": "50,50,bottom" + } } ], - "width": { - "render": "8" - }, - "iconSize": { - "render": "50,50,bottom" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -788,7 +805,6 @@ } } ], - "wayHandling": 1, "filter": [ { "id": "vehicle-type", diff --git a/assets/layers/charging_station/csvToJson.ts b/assets/layers/charging_station/csvToJson.ts index 4b2490b905..2d4bfe5528 100644 --- a/assets/layers/charging_station/csvToJson.ts +++ b/assets/layers/charging_station/csvToJson.ts @@ -115,7 +115,6 @@ function run(file, protojson) { } - overview_question_answers.push(json) // We add a second time for any amount to trigger a visualisation; but this is not an answer option @@ -152,6 +151,7 @@ function run(file, protojson) { technicalQuestions.push({ "id": "voltage-" + i, + group: "technical", question: { en: `What voltage do the plugs with ${descrWithImage_en} offer?`, nl: `Welke spanning levert de stekker van type ${descrWithImage_nl}` @@ -181,6 +181,7 @@ function run(file, protojson) { technicalQuestions.push({ "id": "current-" + i, + group:"technical", question: { en: `What current do the plugs with ${descrWithImage_en} offer?`, nl: `Welke stroom levert de stekker van type ${descrWithImage_nl}?`, @@ -210,6 +211,7 @@ function run(file, protojson) { technicalQuestions.push({ "id": "power-output-" + i, + group:"technical", question: { en: `What power output does a single plug of type ${descrWithImage_en} offer?`, nl: `Welk vermogen levert een enkele stekker van type ${descrWithImage_nl}?`, @@ -255,6 +257,7 @@ function run(file, protojson) { "mappings": overview_question_answers } questions.unshift(toggles) + questions.push(...technicalQuestions) const stringified = questions.map(q => JSON.stringify(q, null, " ")) let protoString = readFileSync(protojson, "utf8") diff --git a/assets/layers/charging_station/usb_port.svg b/assets/layers/charging_station/usb_port.svg index f813f20f06..f48417a790 100644 --- a/assets/layers/charging_station/usb_port.svg +++ b/assets/layers/charging_station/usb_port.svg @@ -1,74 +1,82 @@ image/svg+xml + + + + + + + + \ No newline at end of file + inkscape:connector-curvature="0" /> + \ No newline at end of file diff --git a/assets/layers/cluster_style/cluster_style.json b/assets/layers/cluster_style/cluster_style.json index 7e93c506ad..081cbb5d34 100644 --- a/assets/layers/cluster_style/cluster_style.json +++ b/assets/layers/cluster_style/cluster_style.json @@ -1,40 +1,49 @@ { - "id": "cluster_style", - "description": "The style for the clustering in all themes. Enable `debug=true` to peak into clustered tiles", - "source": { - "osmTags": "tileId~*" - }, - "title": "Clustered data", - "tagRenderings": [ - "all_tags" - ], - "color": { - "render": "#3c3", - "mappings": [ - { - "if": "showCount>200", - "then": "#f33" - }, - { - "if": "showCount>100", - "then": "#c93" - }, - { - "if": "showCount>50", - "then": "#cc3" - } - ] - }, - "width": { - "render": "1" - }, - "label": { + "id": "cluster_style", + "description": "The style for the clustering in all themes. Enable `debug=true` to peak into clustered tiles", + "source": { + "osmTags": "tileId~*" + }, + "title": "Clustered data", + "tagRenderings": [ + "all_tags" + ], + "mapRendering": [ + { + "label": { "render": "
{showCount}
", "mappings": [ - { - "if": "showCount>1000", - "then": "
{kilocount}K
" - } + { + "if": "showCount>1000", + "then": "
{kilocount}K
" + } ] + }, + "location": [ + "point" + ] + }, + { + "color": { + "render": "#3c3", + "mappings": [ + { + "if": "showCount>200", + "then": "#f33" + }, + { + "if": "showCount>100", + "then": "#c93" + }, + { + "if": "showCount>50", + "then": "#cc3" + } + ] + }, + "width": { + "render": "1" + } } + ] } \ No newline at end of file diff --git a/assets/layers/conflation/conflation.json b/assets/layers/conflation/conflation.json new file mode 100644 index 0000000000..75220077ef --- /dev/null +++ b/assets/layers/conflation/conflation.json @@ -0,0 +1,45 @@ +{ + "id": "conflation", + "description": "If the import-button is set to conflate two ways, a preview is shown. This layer defines how this preview is rendered. This layer cannot be included in a theme.", + "minzoom": 1, + "source": { + "osmTags": { + "or": [ + "move=yes", + "newpoint=yes" + ] + } + }, + "name": "Conflation", + "title": "Conflation", + "mapRendering": [ + { + "location": "point", + "icon": "addSmall:#000", + "iconSize": "10,10,center" + }, + { + "location": "end", + "icon": "circle:#0f0", + "iconSize": "10,10,center" + }, + { + "location": "start", + "icon": "square:#f00", + "iconSize": "10,10,center" + }, + { + "width": "3", + "color": "#00f", + "dasharray": { + "render": "", + "mappings": [ + { + "if": "resulting-geometry=yes", + "then": "6 6" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/assets/layers/crossings/crossings.json b/assets/layers/crossings/crossings.json index a8b673f2f8..984545be69 100644 --- a/assets/layers/crossings/crossings.json +++ b/assets/layers/crossings/crossings.json @@ -1,371 +1,380 @@ { - "id": "crossings", - "name": { - "en": "Crossings", - "nl": "Oversteekplaatsen", - "de": "Kreuzungen" + "id": "crossings", + "name": { + "en": "Crossings", + "nl": "Oversteekplaatsen", + "de": "Kreuzungen" + }, + "description": { + "en": "Crossings for pedestrians and cyclists", + "nl": "Oversteekplaatsen voor voetgangers en fietsers", + "de": "Übergänge für Fußgänger und Radfahrer" + }, + "source": { + "osmTags": { + "or": [ + "highway=traffic_signals", + "highway=crossing" + ] + } + }, + "minzoom": 17, + "title": { + "render": { + "en": "Crossing", + "nl": "Oversteekplaats", + "de": "Kreuzung" }, - "description": { - "en": "Crossings for pedestrians and cyclists", - "nl": "Oversteekplaatsen voor voetgangers en fietsers", - "de": "Übergänge für Fußgänger und Radfahrer" - }, - "source": { - "osmTags": { - "or": [ - "highway=traffic_signals", - "highway=crossing" - ] + "mappings": [ + { + "if": "highway=traffic_signals", + "then": { + "en": "Traffic signal", + "nl": "Verkeerslicht", + "ru": "Светофор", + "de": "Ampel" } + }, + { + "if": "crossing=traffic_signals", + "then": { + "en": "Crossing with traffic signals", + "nl": "Oversteektplaats met verkeerslichten", + "de": "Kreuzung mit Ampeln" + } + } + ] + }, + "presets": [ + { + "title": { + "en": "Crossing", + "nl": "Oversteekplaats", + "de": "Kreuzung" + }, + "tags": [ + "highway=crossing" + ], + "description": { + "en": "Crossing for pedestrians and/or cyclists", + "nl": "Oversteekplaats voor voetgangers en/of fietsers", + "de": "Kreuzung für Fußgänger und/oder Radfahrer" + }, + "preciseInput": { + "preferredBackground": [ + "photo" + ], + "snapToLayer": "cycleways_and_roads", + "maxSnapDistance": 25 + } }, - "minzoom": 17, - "title": { - "render": { - "en": "Crossing", - "nl": "Oversteekplaats", - "de": "Kreuzung" + { + "title": { + "en": "Traffic signal", + "nl": "Verkeerslicht", + "ru": "Светофор", + "de": "Ampel" + }, + "tags": [ + "highway=traffic_signals" + ], + "description": { + "en": "Traffic signal on a road", + "nl": "Verkeerslicht op een weg", + "de": "Ampel an einer Straße" + }, + "preciseInput": { + "preferredBackground": [ + "photo" + ], + "snapToLayer": "cycleways_and_roads", + "maxSnapDistance": 25 + } + } + ], + "tagRenderings": [ + { + "id": "crossing-type", + "question": { + "en": "What kind of crossing is this?", + "nl": "Wat voor oversteekplaats is dit?", + "de": "Was ist das für eine Kreuzung?" + }, + "condition": "highway=crossing", + "mappings": [ + { + "if": "crossing=uncontrolled", + "then": { + "en": "Crossing, without traffic lights", + "nl": "Oversteekplaats, zonder verkeerslichten", + "de": "Kreuzungen ohne Ampeln" + } }, - "mappings": [ - { - "if": "highway=traffic_signals", - "then": { - "en": "Traffic signal", - "nl": "Verkeerslicht", - "ru": "Светофор", - "de": "Ampel" - } - }, - { - "if": "crossing=traffic_signals", - "then": { - "en": "Crossing with traffic signals", - "nl": "Oversteektplaats met verkeerslichten", - "de": "Kreuzung mit Ampeln" - } - } - ] + { + "if": "crossing=traffic_signals", + "then": { + "en": "Crossing with traffic signals", + "nl": "Oversteekplaats met verkeerslichten", + "de": "Kreuzungen mit Ampeln" + } + }, + { + "if": "crossing=zebra", + "then": { + "en": "Zebra crossing", + "nl": "Zebrapad", + "de": "Zebrastreifen" + }, + "hideInAnswer": true + } + ] }, - "icon": { + { + "id": "crossing-is-zebra", + "question": { + "en": "Is this is a zebra crossing?", + "nl": "Is dit een zebrapad?", + "de": "Ist das ein Zebrastreifen?" + }, + "condition": "crossing=uncontrolled", + "mappings": [ + { + "if": "crossing_ref=zebra", + "then": { + "en": "This is a zebra crossing", + "nl": "Dit is een zebrapad", + "de": "Dies ist ein Zebrastreifen" + } + }, + { + "if": "crossing_ref=", + "then": { + "en": "This is not a zebra crossing", + "nl": "Dit is geen zebrapad", + "de": "Dies ist kein Zebrastreifen" + } + } + ] + }, + { + "id": "crossing-bicycle-allowed", + "question": { + "en": "Is this crossing also for bicycles?", + "nl": "Is deze oversteekplaats ook voor fietsers", + "de": "Können Radfahrer diese Kreuzung nutzen?" + }, + "condition": "highway=crossing", + "mappings": [ + { + "if": "bicycle=yes", + "then": { + "en": "A cyclist can use this crossing", + "nl": "Een fietser kan deze oversteekplaats gebruiken", + "de": "Radfahrer können diese Kreuzung nutzen" + } + }, + { + "if": "bicycle=no", + "then": { + "en": "A cyclist can not use this crossing", + "nl": "Een fietser kan deze oversteekplaats niet gebruiken", + "de": "Radfahrer können diese Kreuzung nicht nutzen" + } + } + ] + }, + { + "id": "crossing-has-island", + "question": { + "en": "Does this crossing have an island in the middle?", + "nl": "Heeft deze oversteekplaats een verkeerseiland in het midden?", + "de": "Gibt es an diesem Übergang eine Verkehrsinsel?" + }, + "condition": "highway=crossing", + "mappings": [ + { + "if": "crossing:island=yes", + "then": { + "en": "This crossing has an island in the middle", + "nl": "Deze oversteekplaats heeft een verkeerseiland in het midden", + "de": "Der Übergang hat eine Verkehrsinsel" + } + }, + { + "if": "crossing:island=no", + "then": { + "en": "This crossing does not have an island in the middle", + "nl": "Deze oversteekplaats heeft geen verkeerseiland in het midden", + "de": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern" + } + } + ] + }, + { + "id": "crossing-tactile", + "question": { + "en": "Does this crossing have tactile paving?", + "nl": "Heeft deze oversteekplaats een geleidelijn?", + "de": "Gibt es an dieser Kreuzung ein Blindenleitsystem?" + }, + "condition": "highway=crossing", + "mappings": [ + { + "if": "tactile_paving=yes", + "then": { + "en": "This crossing has tactile paving", + "nl": "Deze oversteekplaats heeft een geleidelijn", + "de": "An dieser Kreuzung gibt es ein Blindenleitsystem" + } + }, + { + "if": "tactile_paving=no", + "then": { + "en": "This crossing does not have tactile paving", + "nl": "Deze oversteekplaats heeft geen geleidelijn", + "de": "Diese Kreuzung hat kein Blindenleitsystem" + } + }, + { + "if": "tactile_paving=incorrect", + "then": { + "en": "This crossing has tactile paving, but is not correct", + "nl": "Deze oversteekplaats heeft een geleidelijn, die incorrect is.", + "de": "Diese Kreuzung hat taktile Pflasterung, ist aber nicht korrekt" + }, + "hideInAnswer": true + } + ] + }, + { + "id": "crossing-button", + "question": { + "en": "Does this traffic light have a button to request green light?", + "nl": "Heeft dit verkeerslicht een knop voor groen licht?", + "de": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?" + }, + "condition": { + "or": [ + "highway=traffic_signals", + "crossing=traffic_signals" + ] + }, + "mappings": [ + { + "if": "button_operated=yes", + "then": { + "en": "This traffic light has a button to request green light", + "nl": "Dit verkeerslicht heeft een knop voor groen licht", + "de": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern" + } + }, + { + "if": "button_operated=no", + "then": { + "en": "This traffic light does not have a button to request green light", + "nl": "Dit verkeerlicht heeft geen knop voor groen licht", + "de": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern." + } + } + ] + }, + { + "id": "crossing-right-turn-through-red", + "question": { + "en": "Can a cyclist turn right when the light is red?", + "nl": "Mag een fietser rechtsaf slaan als het licht rood is?", + "de": "Kann ein Radfahrer bei roter Ampel rechts abbiegen?" + }, + "condition": "highway=traffic_signals", + "mappings": [ + { + "if": "red_turn:right:bicycle=yes", + "then": { + "en": "A cyclist can turn right if the light is red ", + "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is ", + "de": "Ein Radfahrer kann bei roter Ampel rechts abbiegen " + }, + "hideInAnswer": "_country!=be" + }, + { + "if": "red_turn:right:bicycle=yes", + "then": { + "en": "A cyclist can turn right if the light is red", + "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is", + "de": "Ein Radfahrer kann bei roter Ampel rechts abbiegen" + }, + "hideInAnswer": "_country=be" + }, + { + "if": "red_turn:right:bicycle=no", + "then": { + "en": "A cyclist can not turn right if the light is red", + "nl": "Een fietser mag niet rechtsaf slaan als het licht rood is", + "de": "Ein Radfahrer kann bei roter Ampel nicht rechts abbiegen" + } + } + ] + }, + { + "id": "crossing-continue-through-red", + "question": { + "en": "Can a cyclist go straight on when the light is red?", + "nl": "Mag een fietser rechtdoor gaan als het licht rood is?", + "de": "Kann ein Radfahrer bei roter Ampel geradeaus fahren?" + }, + "condition": "highway=traffic_signals", + "mappings": [ + { + "if": "red_turn:straight:bicycle=yes", + "then": { + "en": "A cyclist can go straight on if the light is red ", + "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is ", + "de": "Ein Radfahrer kann bei roter Ampel geradeaus fahren " + }, + "hideInAnswer": "_country!=be" + }, + { + "if": "red_turn:straight:bicycle=yes", + "then": { + "en": "A cyclist can go straight on if the light is red", + "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is", + "de": "Ein Radfahrer kann bei roter Ampel geradeaus fahren" + }, + "hideInAnswer": "_country=be" + }, + { + "if": "red_turn:straight:bicycle=no", + "then": { + "en": "A cyclist can not go straight on if the light is red", + "nl": "Een fietser mag niet rechtdoor gaan als het licht rood is", + "de": "Ein Radfahrer kann bei roter Ampel nicht geradeaus fahren" + } + } + ] + } + ], + "mapRendering": [ + { + "icon": { "render": "./assets/layers/crossings/pedestrian_crossing.svg", "mappings": [ - { - "if": { - "or": [ - "highway=traffic_signals", - "crossing=traffic_signals" - ] - }, - "then": "./assets/layers/crossings/traffic_lights.svg" - } + { + "if": { + "or": [ + "highway=traffic_signals", + "crossing=traffic_signals" + ] + }, + "then": "./assets/layers/crossings/traffic_lights.svg" + } ] + }, + "location": [ + "point" + ] }, - "width": "5", - "presets": [ - { - "title": { - "en": "Crossing", - "nl": "Oversteekplaats", - "de": "Kreuzung" - }, - "tags": [ - "highway=crossing" - ], - "description": { - "en": "Crossing for pedestrians and/or cyclists", - "nl": "Oversteekplaats voor voetgangers en/of fietsers", - "de": "Kreuzung für Fußgänger und/oder Radfahrer" - }, - "preciseInput": { - "preferredBackground": [ - "photo" - ], - "snapToLayer": "cycleways_and_roads", - "maxSnapDistance": 25 - } - }, - { - "title": { - "en": "Traffic signal", - "nl": "Verkeerslicht", - "ru": "Светофор", - "de": "Ampel" - }, - "tags": [ - "highway=traffic_signals" - ], - "description": { - "en": "Traffic signal on a road", - "nl": "Verkeerslicht op een weg", - "de": "Ampel an einer Straße" - }, - "preciseInput": { - "preferredBackground": [ - "photo" - ], - "snapToLayer": "cycleways_and_roads", - "maxSnapDistance": 25 - } - } - ], - "tagRenderings": [ - { - "id": "crossing-type", - "question": { - "en": "What kind of crossing is this?", - "nl": "Wat voor oversteekplaats is dit?", - "de": "Was ist das für eine Kreuzung?" - }, - "condition": "highway=crossing", - "mappings": [ - { - "if": "crossing=uncontrolled", - "then": { - "en": "Crossing, without traffic lights", - "nl": "Oversteekplaats, zonder verkeerslichten", - "de": "Kreuzungen ohne Ampeln" - } - }, - { - "if": "crossing=traffic_signals", - "then": { - "en": "Crossing with traffic signals", - "nl": "Oversteekplaats met verkeerslichten", - "de": "Kreuzungen mit Ampeln" - } - }, - { - "if": "crossing=zebra", - "then": { - "en": "Zebra crossing", - "nl": "Zebrapad", - "de": "Zebrastreifen" - }, - "hideInAnswer": true - } - ] - }, - { - "id": "crossing-is-zebra", - "question": { - "en": "Is this is a zebra crossing?", - "nl": "Is dit een zebrapad?", - "de": "Ist das ein Zebrastreifen?" - }, - "condition": "crossing=uncontrolled", - "mappings": [ - { - "if": "crossing_ref=zebra", - "then": { - "en": "This is a zebra crossing", - "nl": "Dit is een zebrapad", - "de": "Dies ist ein Zebrastreifen" - } - }, - { - "if": "crossing_ref=", - "then": { - "en": "This is not a zebra crossing", - "nl": "Dit is geen zebrapad", - "de": "Dies ist kein Zebrastreifen" - } - } - ] - }, - { - "id": "crossing-bicycle-allowed", - "question": { - "en": "Is this crossing also for bicycles?", - "nl": "Is deze oversteekplaats ook voor fietsers", - "de": "Können Radfahrer diese Kreuzung nutzen?" - }, - "condition": "highway=crossing", - "mappings": [ - { - "if": "bicycle=yes", - "then": { - "en": "A cyclist can use this crossing", - "nl": "Een fietser kan deze oversteekplaats gebruiken", - "de": "Radfahrer können diese Kreuzung nutzen" - } - }, - { - "if": "bicycle=no", - "then": { - "en": "A cyclist can not use this crossing", - "nl": "Een fietser kan deze oversteekplaats niet gebruiken", - "de": "Radfahrer können diese Kreuzung nicht nutzen" - } - } - ] - }, - { - "id": "crossing-has-island", - "question": { - "en": "Does this crossing have an island in the middle?", - "nl": "Heeft deze oversteekplaats een verkeerseiland in het midden?", - "de": "Gibt es an diesem Übergang eine Verkehrsinsel?" - }, - "condition": "highway=crossing", - "mappings": [ - { - "if": "crossing:island=yes", - "then": { - "en": "This crossing has an island in the middle", - "nl": "Deze oversteekplaats heeft een verkeerseiland in het midden", - "de": "Der Übergang hat eine Verkehrsinsel" - } - }, - { - "if": "crossing:island=no", - "then": { - "en": "This crossing does not have an island in the middle", - "nl": "Deze oversteekplaats heeft geen verkeerseiland in het midden", - "de": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern" - } - } - ] - }, - { - "id": "crossing-tactile", - "question": { - "en": "Does this crossing have tactile paving?", - "nl": "Heeft deze oversteekplaats een geleidelijn?", - "de": "Gibt es an dieser Kreuzung ein Blindenleitsystem?" - }, - "condition": "highway=crossing", - "mappings": [ - { - "if": "tactile_paving=yes", - "then": { - "en": "This crossing has tactile paving", - "nl": "Deze oversteekplaats heeft een geleidelijn", - "de": "An dieser Kreuzung gibt es ein Blindenleitsystem" - } - }, - { - "if": "tactile_paving=no", - "then": { - "en": "This crossing does not have tactile paving", - "nl": "Deze oversteekplaats heeft geen geleidelijn", - "de": "Diese Kreuzung hat kein Blindenleitsystem" - } - }, - { - "if": "tactile_paving=incorrect", - "then": { - "en": "This crossing has tactile paving, but is not correct", - "nl": "Deze oversteekplaats heeft een geleidelijn, die incorrect is.", - "de": "Diese Kreuzung hat taktile Pflasterung, ist aber nicht korrekt" - }, - "hideInAnswer": true - } - ] - }, - { - "id": "crossing-button", - "question": { - "en": "Does this traffic light have a button to request green light?", - "nl": "Heeft dit verkeerslicht een knop voor groen licht?", - "de": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?" - }, - "condition": { - "or": [ - "highway=traffic_signals", - "crossing=traffic_signals" - ] - }, - "mappings": [ - { - "if": "button_operated=yes", - "then": { - "en": "This traffic light has a button to request green light", - "nl": "Dit verkeerslicht heeft een knop voor groen licht", - "de": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern" - } - }, - { - "if": "button_operated=no", - "then": { - "en": "This traffic light does not have a button to request green light", - "nl": "Dit verkeerlicht heeft geen knop voor groen licht", - "de": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern" - } - } - ] - }, - { - "id": "crossing-right-turn-through-red", - "question": { - "en": "Can a cyclist turn right when the light is red?", - "nl": "Mag een fietser rechtsaf slaan als het licht rood is?", - "de": "Kann ein Radfahrer bei roter Ampel rechts abbiegen?" - }, - "condition": "highway=traffic_signals", - "mappings": [ - { - "if": "red_turn:right:bicycle=yes", - "then": { - "en": "A cyclist can turn right if the light is red ", - "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is ", - "de": "Ein Radfahrer kann bei roter Ampel rechts abbiegen " - }, - "hideInAnswer": "_country!=be" - }, - { - "if": "red_turn:right:bicycle=yes", - "then": { - "en": "A cyclist can turn right if the light is red", - "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is", - "de": "Ein Radfahrer kann bei roter Ampel rechts abbiegen" - }, - "hideInAnswer": "_country=be" - }, - { - "if": "red_turn:right:bicycle=no", - "then": { - "en": "A cyclist can not turn right if the light is red", - "nl": "Een fietser mag niet rechtsaf slaan als het licht rood is", - "de": "Ein Radfahrer kann bei roter Ampel nicht rechts abbiegen" - } - } - ] - }, - { - "id": "crossing-continue-through-red", - "question": { - "en": "Can a cyclist go straight on when the light is red?", - "nl": "Mag een fietser rechtdoor gaan als het licht rood is?", - "de": "Kann ein Radfahrer bei roter Ampel geradeaus fahren?" - }, - "condition": "highway=traffic_signals", - "mappings": [ - { - "if": "red_turn:straight:bicycle=yes", - "then": { - "en": "A cyclist can go straight on if the light is red ", - "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is ", - "de": "Ein Radfahrer kann bei roter Ampel geradeaus fahren " - }, - "hideInAnswer": "_country!=be" - }, - { - "if": "red_turn:straight:bicycle=yes", - "then": { - "en": "A cyclist can go straight on if the light is red", - "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is", - "de": "Ein Radfahrer kann bei roter Ampel geradeaus fahren" - }, - "hideInAnswer": "_country=be" - }, - { - "if": "red_turn:straight:bicycle=no", - "then": { - "en": "A cyclist can not go straight on if the light is red", - "nl": "Een fietser mag niet rechtdoor gaan als het licht rood is", - "de": "Ein Radfahrer kann bei roter Ampel nicht geradeaus fahren" - } - } - ] - } - ] + { + "width": "5" + } + ] } \ No newline at end of file diff --git a/assets/layers/cycleways_and_roads/cycleways_and_roads.json b/assets/layers/cycleways_and_roads/cycleways_and_roads.json index 58807bdabf..82287015b9 100644 --- a/assets/layers/cycleways_and_roads/cycleways_and_roads.json +++ b/assets/layers/cycleways_and_roads/cycleways_and_roads.json @@ -1,1285 +1,1334 @@ { - "id": "cycleways_and_roads", - "name": { - "en": "Cycleways and roads", - "nl": "Fietspaden, straten en wegen", - "de": "Radwege und Straßen" - }, - "minzoom": 16, - "source": { - "osmTags": { - "or": [ - "highway=cycleway", - "cycleway=lane", - "cycleway=shared_lane", - "cycleway=track", - "cyclestreet=yes", - "highway=residential", - "highway=tertiary", - "highway=unclassified", - "highway=primary", - "highway=secondary", - { - "and": [ - "highway=path", - "bicycle=designated" - ] - } - ] + "id": "cycleways_and_roads", + "name": { + "en": "Cycleways and roads", + "nl": "Fietspaden, straten en wegen", + "de": "Radwege und Straßen" + }, + "minzoom": 16, + "source": { + "osmTags": { + "or": [ + "highway=cycleway", + "cycleway=lane", + "cycleway=shared_lane", + "cycleway=track", + "cyclestreet=yes", + "highway=residential", + "highway=tertiary", + "highway=unclassified", + "highway=primary", + "highway=secondary", + { + "and": [ + "highway=path", + "bicycle=designated" + ] } + ] + } + }, + "title": { + "render": { + "en": "Cycleways", + "nl": "Fietspaden", + "de": "Radwege", + "ru": "Велосипедные дорожки" }, - "title": { - "render": { - "en": "Cycleways", - "nl": "Fietspaden", - "de": "Radwege", - "ru": "Велосипедные дорожки" + "mappings": [ + { + "if": { + "or": [ + "highway=cycleway", + "highway=path" + ] }, - "mappings": [ - { - "if": { - "or": [ - "highway=cycleway", - "highway=path" - ] - }, - "then": { - "nl": "Fietsweg", - "en": "Cycleway", - "de": "Radweg", - "ru": "Велосипедная дорожка" - } - }, - { - "if": "cycleway=shared_lane", - "then": { - "nl": "Fietssuggestiestrook", - "en": "Shared lane", - "de": "Gemeinsame Fahrspur" - } - }, - { - "if": "cycleway=lane", - "then": { - "nl": "Fietsstrook", - "en": "Bike lane", - "de": "Fahrradspur" - } - }, - { - "if": "cycleway=track", - "then": { - "en": "Cycleway next to the road", - "nl": "Fietsweg naast de weg", - "de": "Radweg neben der Straße" - } - }, - { - "if": "cyclestreet=yes", - "then": { - "nl": "Fietsstraat", - "en": "Cyclestreet", - "de": "Fahrradstraße" - } - } + "then": { + "nl": "Fietsweg", + "en": "Cycleway", + "de": "Radweg", + "ru": "Велосипедная дорожка" + } + }, + { + "if": "cycleway=shared_lane", + "then": { + "nl": "Fietssuggestiestrook", + "en": "Shared lane", + "de": "Gemeinsame Fahrspur" + } + }, + { + "if": "cycleway=lane", + "then": { + "nl": "Fietsstrook", + "en": "Bike lane", + "de": "Fahrradspur" + } + }, + { + "if": "cycleway=track", + "then": { + "en": "Cycleway next to the road", + "nl": "Fietsweg naast de weg", + "de": "Radweg neben der Straße" + } + }, + { + "if": "cyclestreet=yes", + "then": { + "nl": "Fietsstraat", + "en": "Cyclestreet", + "de": "Fahrradstraße" + } + } + ] + }, + "tagRenderings": [ + { + "question": { + "en": "What kind of cycleway is here?", + "nl": "Wat voor fietspad is hier?", + "de": "Was für ein Radweg ist hier?" + }, + "condition": { + "and": [ + "highway!=cycleway", + "highway!=path" ] - }, - "tagRenderings": [ + }, + "mappings": [ { - "question": { - "en": "What kind of cycleway is here?", - "nl": "Wat voor fietspad is hier?", - "de": "Was für ein Radweg ist hier?" - }, - "condition": { - "and": [ - "highway!=cycleway", - "highway!=path" - ] - }, - "mappings": [ - { - "if": "cycleway=shared_lane", - "then": { - "en": "There is a shared lane", - "nl": "Er is een fietssuggestiestrook", - "de": "Es gibt eine geteilte Fahrspur" - } - }, - { - "if": "cycleway=lane", - "then": { - "en": "There is a lane next to the road (separated with paint)", - "nl": "Er is een fietspad aangrenzend aan de weg (gescheiden met verf)", - "de": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)" - } - }, - { - "if": "cycleway=track", - "then": { - "en": "There is a track, but no cycleway drawn separately from this road on the map.", - "nl": "Er is een fietspad (los van de weg), maar geen fietspad afzonderlijk getekend naast deze weg.", - "de": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist." - } - }, - { - "if": "cycleway=separate", - "then": { - "en": "There is a separately drawn cycleway", - "nl": "Er is een apart getekend fietspad.", - "de": "Hier ist ein getrennter Radweg vorhanden" - } - }, - { - "if": "cycleway=no", - "then": { - "en": "There is no cycleway", - "nl": "Er is geen fietspad aanwezig", - "de": "Es gibt keinen Radweg" - }, - "hideInAnswer": "cycleway=opposite" - }, - { - "if": "cycleway=no", - "then": { - "en": "There is no cycleway", - "nl": "Er is geen fietspad aanwezig", - "de": "Es gibt keinen Radweg" - }, - "hideInAnswer": "cycleway!=opposite", - "addExtraTags": [ - "oneway:bicycle=no", - "fixme=Changed from cycleway=opposite" - ] - } - ], - "id": "Cycleway type for a road" + "if": "cycleway=shared_lane", + "then": { + "en": "There is a shared lane", + "nl": "Er is een fietssuggestiestrook", + "de": "Es gibt eine geteilte Fahrspur" + } }, { - "question": { - "en": "Is this street lit?", - "nl": "Is deze weg verlicht?", - "de": "Ist diese Straße beleuchtet?" - }, - "mappings": [ - { - "if": "lit=yes", - "then": { - "en": "This street is lit", - "nl": "Deze weg is verlicht", - "de": "Diese Straße ist beleuchtet" - } - }, - { - "if": "lit=no", - "then": { - "en": "This road is not lit", - "nl": "Deze weg is niet verlicht", - "de": "Diese Straße ist nicht beleuchtet" - } - }, - { - "if": "lit=sunset-sunrise", - "then": { - "en": "This road is lit at night", - "nl": "Deze weg is 's nachts verlicht", - "de": "Diese Straße ist nachts beleuchtet" - }, - "hideInAnswer": true - }, - { - "if": "lit=24/7", - "then": { - "en": "This road is lit 24/7", - "nl": "Deze weg is 24/7 verlicht", - "de": "Diese Straße ist durchgehend beleuchtet" - } - } - ], - "id": "is lit?" + "if": "cycleway=lane", + "then": { + "en": "There is a lane next to the road (separated with paint)", + "nl": "Er is een fietspad aangrenzend aan de weg (gescheiden met verf)", + "de": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)" + } }, { - "question": { - "en": "Is this a cyclestreet?", - "nl": "Is dit een fietsstraat?", - "de": "Ist das eine Fahrradstraße?" - }, - "condition": { - "and": [ - "highway!=cycleway", - "highway!=path" - ] - }, - "mappings": [ - { - "if": "cyclestreet=yes", - "then": { - "en": "This is a cyclestreet, and a 30km/h zone.", - "nl": "Dit is een fietsstraat, en dus een 30km/h zone", - "de": "Dies ist eine Fahrradstraße in einer 30km/h Zone." - }, - "addExtraTags": [ - "overtaking:motor_vehicle=no", - "maxspeed=30" - ], - "hideInAnswer": "_country!=be" - }, - { - "if": "cyclestreet=yes", - "then": { - "en": "This is a cyclestreet", - "nl": "Dit is een fietsstraat", - "de": "Dies ist eine Fahrradstraße" - }, - "hideInAnswer": "_country=be" - }, - { - "if": "cyclestreet=", - "then": { - "en": "This is not a cyclestreet.", - "nl": "Dit is geen fietsstraat", - "de": "Dies ist keine Fahrradstraße." - }, - "addExtraTags": [ - "overtaking:motor_vehicle=" - ] - } - ], - "id": "Is this a cyclestreet? (For a road)" + "if": "cycleway=track", + "then": { + "en": "There is a track, but no cycleway drawn separately from this road on the map.", + "nl": "Er is een fietspad (los van de weg), maar geen fietspad afzonderlijk getekend naast deze weg.", + "de": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist." + } }, { - "render": { - "en": "The maximum speed on this road is {maxspeed} km/h", - "nl": "De maximumsnelheid op deze weg is {maxspeed} km/u", - "de": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h" - }, - "freeform": { - "key": "maxspeed", - "type": "nat" - }, - "condition": { - "and": [ - "highway!=cycleway", - "highway!=path" - ] - }, - "mappings": [ - { - "if": "maxspeed=20", - "then": { - "en": "The maximum speed is 20 km/h", - "nl": "De maximumsnelheid is 20 km/u", - "de": "Die Höchstgeschwindigkeit ist 20 km/h" - } - }, - { - "if": "maxspeed=30", - "then": { - "en": "The maximum speed is 30 km/h", - "nl": "De maximumsnelheid is 30 km/u", - "de": "Die Höchstgeschwindigkeit ist 30 km/h" - } - }, - { - "if": "maxspeed=50", - "then": { - "en": "The maximum speed is 50 km/h", - "nl": "De maximumsnelheid is 50 km/u", - "de": "Die Höchstgeschwindigkeit ist 50 km/h" - } - }, - { - "if": "maxspeed=70", - "then": { - "en": "The maximum speed is 70 km/h", - "nl": "De maximumsnelheid is 70 km/u", - "de": "Die Höchstgeschwindigkeit ist 70 km/h" - } - }, - { - "if": "maxspeed=90", - "then": { - "en": "The maximum speed is 90 km/h", - "nl": "De maximumsnelheid is 90 km/u", - "de": "Die Höchstgeschwindigkeit ist 90 km/h" - } - } - ], - "question": { - "en": "What is the maximum speed in this street?", - "nl": "Wat is de maximumsnelheid in deze straat?", - "de": "Was ist die Höchstgeschwindigkeit auf dieser Straße?" - }, - "id": "Maxspeed (for road)" + "if": "cycleway=separate", + "then": { + "en": "There is a separately drawn cycleway", + "nl": "Er is een apart getekend fietspad.", + "de": "Hier ist ein getrennter Radweg vorhanden" + } }, { - "render": { - "en": "This cyleway is made of {cycleway:surface}", - "nl": "Dit fietspad is gemaakt van {cycleway:surface}", - "de": "Der Radweg ist aus {cycleway:surface}" - }, - "freeform": { - "key": "cycleway:surface" - }, - "condition": { - "or": [ - "cycleway=shared_lane", - "cycleway=lane", - "cycleway=track" - ] - }, - "mappings": [ - { - "if": "cycleway:surface=unpaved", - "then": { - "en": "This cycleway is unpaved", - "nl": "Dit fietspad is onverhard", - "de": "Dieser Radweg hat keinen festen Belag" - }, - "hideInAnswer": true - }, - { - "if": "cycleway:surface=paved", - "then": { - "en": "This cycleway is paved", - "nl": "Dit fietspad is geplaveid", - "de": "Dieser Radweg hat einen festen Belag" - }, - "hideInAnswer": true - }, - { - "if": "cycleway:surface=asphalt", - "then": { - "en": "This cycleway is made of asphalt", - "nl": "Dit fietspad is gemaakt van asfalt", - "de": "Der Radweg ist aus Asphalt" - } - }, - { - "if": "cycleway:surface=paving_stones", - "then": { - "en": "This cycleway is made of smooth paving stones", - "nl": "Dit fietspad is gemaakt van straatstenen", - "de": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen" - } - }, - { - "if": "cycleway:surface=concrete", - "then": { - "en": "This cycleway is made of concrete", - "nl": "Dit fietspad is gemaakt van beton", - "de": "Der Radweg ist aus Beton" - } - }, - { - "if": "cycleway:surface=cobblestone", - "then": { - "en": "This cycleway is made of cobblestone (unhewn or sett)", - "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)", - "de": "Dieser Radweg besteht aus Kopfsteinpflaster" - }, - "hideInAnswer": true - }, - { - "if": "cycleway:surface=unhewn_cobblestone", - "then": { - "en": "This cycleway is made of raw, natural cobblestone", - "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien", - "de": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster" - } - }, - { - "if": "cycleway:surface=sett", - "then": { - "en": "This cycleway is made of flat, square cobblestone", - "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien", - "de": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster" - } - }, - { - "if": "cycleway:surface=wood", - "then": { - "en": "This cycleway is made of wood", - "nl": "Dit fietspad is gemaakt van hout", - "de": "Der Radweg ist aus Holz" - } - }, - { - "if": "cycleway:surface=gravel", - "then": { - "en": "This cycleway is made of gravel", - "nl": "Dit fietspad is gemaakt van grind", - "de": "Der Radweg ist aus Schotter" - } - }, - { - "if": "cycleway:surface=fine_gravel", - "then": { - "en": "This cycleway is made of fine gravel", - "nl": "Dit fietspad is gemaakt van fijn grind", - "de": "Dieser Radweg besteht aus feinem Schotter" - } - }, - { - "if": "cycleway:surface=pebblestone", - "then": { - "en": "This cycleway is made of pebblestone", - "nl": "Dit fietspad is gemaakt van kiezelsteentjes", - "de": "Der Radweg ist aus Kies" - } - }, - { - "if": "cycleway:surface=ground", - "then": { - "en": "This cycleway is made from raw ground", - "nl": "Dit fietspad is gemaakt van aarde", - "de": "Dieser Radweg besteht aus Rohboden" - } - } - ], - "question": { - "en": "What is the surface of the cycleway made from?", - "nl": "Waaruit is het oppervlak van het fietspad van gemaakt?", - "de": "Was ist der Belag dieses Radwegs?" - }, - "id": "Cycleway:surface" + "if": "cycleway=no", + "then": { + "en": "There is no cycleway", + "nl": "Er is geen fietspad aanwezig", + "de": "Es gibt keinen Radweg" + }, + "hideInAnswer": "cycleway=opposite" }, { - "question": { - "en": "What is the smoothness of this cycleway?", - "nl": "Wat is de kwaliteit van dit fietspad?", - "de": "Wie eben ist dieser Radweg?" - }, - "condition": { - "or": [ - "cycleway=shared_lane", - "cycleway=lane", - "cycleway=track" - ] - }, - "mappings": [ - { - "if": "cycleway:smoothness=excellent", - "then": { - "en": "Usable for thin rollers: rollerblade, skateboard", - "nl": "Geschikt voor fijne rollers: rollerblade, skateboard", - "de": "Geeignet für dünne Rollen: Rollerblades, Skateboard" - } - }, - { - "if": "cycleway:smoothness=good", - "then": { - "en": "Usable for thin wheels: racing bike", - "nl": "Geschikt voor fijne wielen: racefiets", - "de": "Geeignet für dünne Reifen: Rennrad" - } - }, - { - "if": "cycleway:smoothness=intermediate", - "then": { - "en": "Usable for normal wheels: city bike, wheelchair, scooter", - "nl": "Geschikt voor normale wielen: stadsfiets, rolstoel, scooter", - "de": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter" - } - }, - { - "if": "cycleway:smoothness=bad", - "then": { - "en": "Usable for robust wheels: trekking bike, car, rickshaw", - "nl": "Geschikt voor brede wielen: trekfiets, auto, rickshaw", - "de": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha" - } - }, - { - "if": "cycleway:smoothness=very_bad", - "then": { - "en": "Usable for vehicles with high clearance: light duty off-road vehicle", - "nl": "Geschikt voor voertuigen met hoge banden: lichte terreinwagen", - "de": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen" - } - }, - { - "if": "cycleway:smoothness=horrible", - "then": { - "en": "Usable for off-road vehicles: heavy duty off-road vehicle", - "nl": "Geschikt voor terreinwagens: zware terreinwagen", - "de": "Geeignet für Geländefahrzeuge: schwerer Geländewagen" - } - }, - { - "if": "cycleway:smoothness=very_horrible", - "then": { - "en": "Usable for specialized off-road vehicles: tractor, ATV", - "nl": "Geschikt voor gespecialiseerde terreinwagens: tractor, alleterreinwagen", - "de": "Geeignet für Geländefahrzeuge: Traktor, ATV" - } - }, - { - "if": "cycleway:smoothness=impassable", - "then": { - "en": "Impassable / No wheeled vehicle", - "nl": "Niet geschikt voor voertuigen met wielen", - "de": "Unpassierbar / Keine bereiften Fahrzeuge" - } - } - ], - "id": "Cycleway:smoothness" - }, - { - "render": { - "en": "This road is made of {surface}", - "nl": "Deze weg is gemaakt van {surface}", - "de": "Der Radweg ist aus {surface}" - }, - "freeform": { - "key": "surface" - }, - "mappings": [ - { - "if": "surface=unpaved", - "then": { - "en": "This cycleway is unhardened", - "nl": "Dit fietspad is onverhard", - "de": "Dieser Radweg ist nicht befestigt" - }, - "hideInAnswer": true - }, - { - "if": "surface=paved", - "then": { - "en": "This cycleway is paved", - "nl": "Dit fietspad is geplaveid", - "de": "Dieser Radweg hat einen festen Belag" - }, - "hideInAnswer": true - }, - { - "if": "surface=asphalt", - "then": { - "en": "This cycleway is made of asphalt", - "nl": "Dit fietspad is gemaakt van asfalt", - "de": "Der Radweg ist aus Asphalt" - } - }, - { - "if": "surface=paving_stones", - "then": { - "en": "This cycleway is made of smooth paving stones", - "nl": "Dit fietspad is gemaakt van straatstenen", - "de": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen" - } - }, - { - "if": "surface=concrete", - "then": { - "en": "This cycleway is made of concrete", - "nl": "Dit fietspad is gemaakt van beton", - "de": "Der Radweg ist aus Beton" - } - }, - { - "if": "surface=cobblestone", - "then": { - "en": "This cycleway is made of cobblestone (unhewn or sett)", - "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)", - "de": "Dieser Radweg besteht aus Kopfsteinpflaster" - }, - "hideInAnswer": true - }, - { - "if": "surface=unhewn_cobblestone", - "then": { - "en": "This cycleway is made of raw, natural cobblestone", - "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien", - "de": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster" - } - }, - { - "if": "surface=sett", - "then": { - "en": "This cycleway is made of flat, square cobblestone", - "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien", - "de": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster" - } - }, - { - "if": "surface=wood", - "then": { - "en": "This cycleway is made of wood", - "nl": "Dit fietspad is gemaakt van hout", - "de": "Der Radweg ist aus Holz" - } - }, - { - "if": "surface=gravel", - "then": { - "en": "This cycleway is made of gravel", - "nl": "Dit fietspad is gemaakt van grind", - "de": "Der Radweg ist aus Schotter" - } - }, - { - "if": "surface=fine_gravel", - "then": { - "en": "This cycleway is made of fine gravel", - "nl": "Dit fietspad is gemaakt van fijn grind", - "de": "Dieser Radweg besteht aus feinem Schotter" - } - }, - { - "if": "surface=pebblestone", - "then": { - "en": "This cycleway is made of pebblestone", - "nl": "Dit fietspad is gemaakt van kiezelsteentjes", - "de": "Der Radweg ist aus Kies" - } - }, - { - "if": "surface=ground", - "then": { - "en": "This cycleway is made from raw ground", - "nl": "Dit fietspad is gemaakt van aarde", - "de": "Dieser Radweg besteht aus Rohboden" - } - } - ], - "question": { - "en": "What is the surface of the street made from?", - "nl": "Waaruit is het oppervlak van de straat gemaakt?", - "de": "Was ist der Belag dieser Straße?" - }, - "id": "Surface of the road" - }, - { - "question": { - "en": "What is the smoothness of this street?", - "nl": "Wat is de kwaliteit van deze straat?", - "de": "Wie eben ist diese Straße?" - }, - "condition": { - "or": [ - "cycleway=no", - "highway=cycleway" - ] - }, - "mappings": [ - { - "if": "smoothness=excellent", - "then": { - "en": "Usable for thin rollers: rollerblade, skateboard", - "de": "Geeignet für dünne Rollen: Rollerblades, Skateboard" - } - }, - { - "if": "smoothness=good", - "then": { - "en": "Usable for thin wheels: racing bike", - "de": "Geeignet für dünne Reifen: Rennrad" - } - }, - { - "if": "smoothness=intermediate", - "then": { - "en": "Usable for normal wheels: city bike, wheelchair, scooter", - "de": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter" - } - }, - { - "if": "smoothness=bad", - "then": { - "en": "Usable for robust wheels: trekking bike, car, rickshaw", - "de": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha" - } - }, - { - "if": "smoothness=very_bad", - "then": { - "en": "Usable for vehicles with high clearance: light duty off-road vehicle", - "de": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen" - } - }, - { - "if": "smoothness=horrible", - "then": { - "en": "Usable for off-road vehicles: heavy duty off-road vehicle", - "de": "Geeignet für Geländefahrzeuge: schwerer Geländewagen" - } - }, - { - "if": "smoothness=very_horrible", - "then": { - "en": "Usable for specialized off-road vehicles: tractor, ATV", - "de": "Geeignet für spezielle Geländewagen: Traktor, ATV" - } - }, - { - "if": "smoothness=impassable", - "then": { - "en": "Impassable / No wheeled vehicle", - "de": "Unpassierbar / Keine bereiften Fahrzeuge" - } - } - ], - "id": "Surface of the street" - }, - { - "condition": { - "and": [ - "highway!=cycleway", - "highway!=path" - ] - }, - "render": { - "en": "The carriage width of this road is {width:carriageway}m", - "nl": "De breedte van deze rijbaan in deze straat is {width:carriageway}m", - "de": "Die Fahrbahnbreite dieser Straße beträgt {width:carriageway}m" - }, - "freeform": { - "key": "width:carriageway", - "type": "length", - "helperArgs": [ - "20", - "map" - ] - }, - "question": { - "en": "What is the carriage width of this road (in meters)?
This is measured curb to curb and thus includes the width of parallell parking lanes", - "nl": "Hoe breed is de rijbaan in deze straat (in meters)?
Dit is
Meet dit van stoepsteen tot stoepsteen, dus inclusief een parallelle parkeerstrook", - "de": "Wie groß ist die Fahrbahnbreite dieser Straße (in Metern)?
Diese wird von Bordstein zu Bordstein gemessen und schließt daher die Breite von parallelen Parkspuren ein" - }, - "id": "width:carriageway" - }, - { - "id": "cycleway-lane-track-traffic-signs", - "question": { - "en": "What traffic sign does this cycleway have?", - "nl": "Welk verkeersbord heeft dit fietspad?", - "de": "Welches Verkehrszeichen hat dieser Radweg?" - }, - "condition": { - "or": [ - "cycleway=lane", - "cycleway=track" - ] - }, - "mappings": [ - { - "if": "cycleway:traffic_sign=BE:D7", - "then": { - "en": "Compulsory cycleway ", - "nl": "Verplicht fietspad ", - "de": "Vorgeschriebener Radweg " - }, - "hideInAnswer": "_country!=be" - }, - { - "if": "cycleway:traffic_sign~BE:D7;.*", - "then": { - "en": "Compulsory cycleway (with supplementary sign)
", - "nl": "Verplicht fietspad (met onderbord)
", - "de": "Vorgeschriebener Radweg (mit Zusatzschild)
" - }, - "hideInAnswer": true - }, - { - "if": "cycleway:traffic_sign=BE:D9", - "then": { - "en": "Segregated foot/cycleway ", - "nl": "Afgescheiden voet-/fietspad ", - "de": "Getrennter Fuß-/Radweg " - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "cycleway:foot=designated", - "cycleway:segregated=yes" - ] - }, - { - "if": "cycleway:traffic_sign=BE:D10", - "then": { - "en": "Unsegregated foot/cycleway ", - "nl": "Gedeeld voet-/fietspad ", - "de": "Gemeinsamer Fuß-/Radweg " - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "cycleway:foot=designated", - "cycleway:segregated=no" - ] - }, - { - "if": "cycleway:traffic_sign=none", - "then": { - "en": "No traffic sign present", - "nl": "Geen verkeersbord aanwezig", - "de": "Kein Verkehrsschild vorhanden" - } - } - ] - }, - { - "id": "cycleway-traffic-signs", - "question": { - "en": "What traffic sign does this cycleway have?", - "nl": "Welk verkeersbord heeft dit fietspad?", - "de": "Welches Verkehrszeichen hat dieser Radweg?" - }, - "condition": { - "or": [ - "highway=cycleway", - "highway=path" - ] - }, - "mappings": [ - { - "if": "traffic_sign=BE:D7", - "then": { - "en": "Compulsory cycleway ", - "nl": "Verplicht fietspad ", - "de": "Vorgeschriebener Radweg " - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "bicycle=designated", - "mofa=designated", - "moped=yes", - "speed_pedelec=yes" - ] - }, - { - "if": "traffic_sign~BE:D7;.*", - "then": { - "en": "Compulsory cycleway (with supplementary sign)
", - "nl": "Verplicht fietspad (met onderbord)
", - "de": "Vorgeschriebener Radweg (mit Zusatzschild)
" - }, - "hideInAnswer": true - }, - { - "if": "traffic_sign=BE:D9", - "then": { - "en": "Segregated foot/cycleway ", - "nl": "Afgescheiden voet-/fietspad ", - "de": "Getrennter Fuß-/Radweg " - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "foot=designated", - "bicycle=designated", - "mofa=designated", - "moped=no", - "speed_pedelec=no", - "segregated=yes" - ] - }, - { - "if": "traffic_sign=BE:D10", - "then": { - "en": "Unsegregated foot/cycleway ", - "nl": "Gedeeld voet-/fietspad ", - "de": "Gemeinsamer Fuß-/Radweg " - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "foot=designated", - "bicycle=designated", - "mofa=designated", - "moped=no", - "speed_pedelec=no", - "segregated=no" - ] - }, - { - "if": "traffic_sign=none", - "then": { - "en": "No traffic sign present", - "nl": "Geen verkeersbord aanwezig", - "de": "Kein Verkehrsschild vorhanden" - } - } - ] - }, - { - "id": "cycleway-traffic-signs-supplementary", - "question": { - "en": "Does the traffic sign D7 () have a supplementary sign?", - "nl": "Heeft het verkeersbord D7 () een onderbord?", - "de": "Hat das Verkehrszeichen D7 () ein Zusatzzeichen?" - }, - "condition": { - "or": [ - "cycleway:traffic_sign=BE:D7", - "cycleway:traffic_sign~BE:D7;.*" - ] - }, - "mappings": [ - { - "if": "cycleway:traffic_sign=BE:D7;BE:M6", - "then": { - "en": "", - "nl": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "cycleway:moped=designated" - ] - }, - { - "if": "cycleway:traffic_sign=BE:D7;BE:M13", - "then": { - "en": "", - "nl": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "cycleway:speed_pedelec=designated" - ] - }, - { - "if": "cycleway:traffic_sign=BE:D7;BE:M14", - "then": { - "en": "", - "nl": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "cycleway:moped=designated", - "cycleway:speed_pedelec=designated" - ] - }, - { - "if": "cycleway:traffic_sign=BE:D7;BE:M7", - "then": { - "en": "", - "nl": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "cycleway:moped=no" - ] - }, - { - "if": "cycleway:traffic_sign=BE:D7;BE:M15", - "then": { - "en": "", - "nl": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "cycleway:speed_pedelec=no" - ] - }, - { - "if": "cycleway:traffic_sign=BE:D7;BE:M16", - "then": { - "en": "", - "nl": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "cycleway:moped=designated", - "cycleway:speed_pedelec=no" - ] - }, - { - "if": "cycleway:traffic_sign:supplementary=none", - "then": { - "en": "No supplementary traffic sign present", - "nl": "Geen onderbord aanwezig", - "de": "Kein zusätzliches Verkehrszeichen vorhanden" - } - } - ] - }, - { - "id": "cycleway-traffic-signs-D7-supplementary", - "question": { - "en": "Does the traffic sign D7 () have a supplementary sign?", - "nl": "Heeft het verkeersbord D7 () een onderbord?", - "de": "Hat das Verkehrszeichen D7 () ein Zusatzzeichen?" - }, - "condition": { - "or": [ - "traffic_sign=BE:D7", - "traffic_sign~BE:D7;.*" - ] - }, - "mappings": [ - { - "if": "traffic_sign=BE:D7;BE:M6", - "then": { - "en": "", - "nl": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "moped=designated" - ] - }, - { - "if": "traffic_sign=BE:D7;BE:M13", - "then": { - "en": "", - "nl": "", - "de": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "speed_pedelec=designated" - ] - }, - { - "if": "traffic_sign=BE:D7;BE:M14", - "then": { - "en": "", - "nl": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "moped=designated", - "speed_pedelec=designated" - ] - }, - { - "if": "traffic_sign=BE:D7;BE:M7", - "then": { - "en": "", - "nl": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "moped=no" - ] - }, - { - "if": ":traffic_sign=BE:D7;BE:M15", - "then": { - "en": "", - "nl": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "speed_pedelec=no" - ] - }, - { - "if": "traffic_sign=BE:D7;BE:M16", - "then": { - "en": "", - "nl": "" - }, - "hideInAnswer": "_country!=be", - "addExtraTags": [ - "moped=designated", - "speed_pedelec=no" - ] - }, - { - "if": "traffic_sign:supplementary=none", - "then": { - "en": "No supplementary traffic sign present", - "nl": "Geen onderbord aanwezig", - "de": "Kein zusätzliches Verkehrszeichen vorhanden" - } - } - ] - }, - { - "render": { - "en": "The buffer besides this cycleway is {cycleway:buffer} m", - "nl": "De schrikafstand van dit fietspad is {cycleway:buffer} m", - "de": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m" - }, - "question": { - "en": "How wide is the gap between the cycleway and the road?", - "nl": "Hoe breed is de ruimte tussen het fietspad en de weg?", - "de": "Wie breit ist der Abstand zwischen Radweg und Straße?" - }, - "condition": { - "or": [ - "cycleway=track", - "cycleway=lane" - ] - }, - "freeform": { - "key": "cycleway:buffer", - "type": "length", - "helperArgs": [ - "20", - "map" - ] - }, - "id": "cycleways_and_roads-cycleway:buffer" - }, - { - "id": "cyclelan-segregation", - "question": { - "en": "How is this cycleway separated from the road?", - "nl": "Hoe is dit fietspad gescheiden van de weg?", - "de": "Wie ist der Radweg von der Straße abgegrenzt?" - }, - "condition": { - "or": [ - "cycleway=track", - "cycleway=lane" - ] - }, - "mappings": [ - { - "if": "cycleway:separation=dashed_line", - "then": { - "en": "This cycleway is separated by a dashed line", - "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep", - "de": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie" - } - }, - { - "if": "cycleway:separation=solid_line", - "then": { - "en": "This cycleway is separated by a solid line", - "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep", - "de": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie" - } - }, - { - "if": "cycleway:separation=parking_lane", - "then": { - "en": "This cycleway is separated by a parking lane", - "nl": "Dit fietspad is gescheiden van de weg met parkeervakken", - "de": "Der Radweg ist abgegrenzt durch eine Parkspur" - } - }, - { - "if": "cycleway:separation=kerb", - "then": { - "en": "This cycleway is separated by a kerb", - "nl": "Dit fietspad is gescheiden van de weg met een stoeprand", - "de": "Dieser Radweg ist getrennt durch einen Bordstein" - } - } - ] - }, - { - "id": "cycleway-segregation", - "question": { - "en": "How is this cycleway separated from the road?", - "nl": "Hoe is dit fietspad gescheiden van de weg?", - "de": "Wie ist der Radweg von der Straße abgegrenzt?" - }, - "condition": { - "or": [ - "highway=cycleway", - "highway=path" - ] - }, - "mappings": [ - { - "if": "separation=dashed_line", - "then": { - "en": "This cycleway is separated by a dashed line", - "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep", - "de": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie" - } - }, - { - "if": "separation=solid_line", - "then": { - "en": "This cycleway is separated by a solid line", - "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep", - "de": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie" - } - }, - { - "if": "separation=parking_lane", - "then": { - "en": "This cycleway is separated by a parking lane", - "nl": "Dit fietspad is gescheiden van de weg met parkeervakken", - "de": "Der Radweg ist abgegrenzt durch eine Parkspur" - } - }, - { - "if": "separation=kerb", - "then": { - "en": "This cycleway is separated by a kerb", - "nl": "Dit fietspad is gescheiden van de weg met een stoeprand", - "de": "Dieser Radweg ist getrennt durch einen Bordstein" - } - } - ] + "if": "cycleway=no", + "then": { + "en": "There is no cycleway", + "nl": "Er is geen fietspad aanwezig", + "de": "Es gibt keinen Radweg" + }, + "hideInAnswer": "cycleway!=opposite", + "addExtraTags": [ + "oneway:bicycle=no", + "fixme=Changed from cycleway=opposite" + ] } - ], - "icon": { + ], + "id": "Cycleway type for a road" + }, + { + "question": { + "en": "Is this street lit?", + "nl": "Is deze weg verlicht?", + "de": "Ist diese Straße beleuchtet?" + }, + "mappings": [ + { + "if": "lit=yes", + "then": { + "en": "This street is lit", + "nl": "Deze weg is verlicht", + "de": "Diese Straße ist beleuchtet" + } + }, + { + "if": "lit=no", + "then": { + "en": "This road is not lit", + "nl": "Deze weg is niet verlicht", + "de": "Diese Straße ist nicht beleuchtet" + } + }, + { + "if": "lit=sunset-sunrise", + "then": { + "en": "This road is lit at night", + "nl": "Deze weg is 's nachts verlicht", + "de": "Diese Straße ist nachts beleuchtet" + }, + "hideInAnswer": true + }, + { + "if": "lit=24/7", + "then": { + "en": "This road is lit 24/7", + "nl": "Deze weg is 24/7 verlicht", + "de": "Diese Straße ist durchgehend beleuchtet" + } + } + ], + "id": "is lit?" + }, + { + "question": { + "en": "Is this a cyclestreet?", + "nl": "Is dit een fietsstraat?", + "de": "Ist das eine Fahrradstraße?" + }, + "condition": { + "and": [ + "highway!=cycleway", + "highway!=path" + ] + }, + "mappings": [ + { + "if": "cyclestreet=yes", + "then": { + "en": "This is a cyclestreet, and a 30km/h zone.", + "nl": "Dit is een fietsstraat, en dus een 30km/h zone", + "de": "Dies ist eine Fahrradstraße in einer 30km/h Zone." + }, + "addExtraTags": [ + "overtaking:motor_vehicle=no", + "maxspeed=30" + ], + "hideInAnswer": "_country!=be" + }, + { + "if": "cyclestreet=yes", + "then": { + "en": "This is a cyclestreet", + "nl": "Dit is een fietsstraat", + "de": "Dies ist eine Fahrradstraße" + }, + "hideInAnswer": "_country=be" + }, + { + "if": "cyclestreet=", + "then": { + "en": "This is not a cyclestreet.", + "nl": "Dit is geen fietsstraat", + "de": "Dies ist keine Fahrradstraße." + }, + "addExtraTags": [ + "overtaking:motor_vehicle=" + ] + } + ], + "id": "Is this a cyclestreet? (For a road)" + }, + { + "render": { + "en": "The maximum speed on this road is {maxspeed} km/h", + "nl": "De maximumsnelheid op deze weg is {maxspeed} km/u", + "de": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h", + "id": "Kecepatan maksimum di jalan ini adalah {maxspeed} km/jam" + }, + "freeform": { + "key": "maxspeed", + "type": "nat" + }, + "condition": { + "and": [ + "highway!=cycleway", + "highway!=path" + ] + }, + "mappings": [ + { + "if": "maxspeed=20", + "then": { + "en": "The maximum speed is 20 km/h", + "nl": "De maximumsnelheid is 20 km/u", + "de": "Die Höchstgeschwindigkeit ist 20 km/h" + } + }, + { + "if": "maxspeed=30", + "then": { + "en": "The maximum speed is 30 km/h", + "nl": "De maximumsnelheid is 30 km/u", + "de": "Die Höchstgeschwindigkeit ist 30 km/h" + } + }, + { + "if": "maxspeed=50", + "then": { + "en": "The maximum speed is 50 km/h", + "nl": "De maximumsnelheid is 50 km/u", + "de": "Die Höchstgeschwindigkeit ist 50 km/h" + } + }, + { + "if": "maxspeed=70", + "then": { + "en": "The maximum speed is 70 km/h", + "nl": "De maximumsnelheid is 70 km/u", + "de": "Die Höchstgeschwindigkeit ist 70 km/h", + "id": "Kecepatan maksimum 70 km/jam" + } + }, + { + "if": "maxspeed=90", + "then": { + "en": "The maximum speed is 90 km/h", + "nl": "De maximumsnelheid is 90 km/u", + "de": "Die Höchstgeschwindigkeit ist 90 km/h", + "id": "Kecepatan maksimum 90 km/jam" + } + } + ], + "question": { + "en": "What is the maximum speed in this street?", + "nl": "Wat is de maximumsnelheid in deze straat?", + "de": "Was ist die Höchstgeschwindigkeit auf dieser Straße?", + "id": "Berapa kecepatan maksimum di jalan ini?" + }, + "id": "Maxspeed (for road)" + }, + { + "render": { + "en": "This cyleway is made of {cycleway:surface}", + "nl": "Dit fietspad is gemaakt van {cycleway:surface}", + "de": "Der Radweg ist aus {cycleway:surface}" + }, + "freeform": { + "key": "cycleway:surface" + }, + "condition": { + "or": [ + "cycleway=shared_lane", + "cycleway=lane", + "cycleway=track" + ] + }, + "mappings": [ + { + "if": "cycleway:surface=unpaved", + "then": { + "en": "This cycleway is unpaved", + "nl": "Dit fietspad is onverhard", + "de": "Dieser Radweg hat keinen festen Belag" + }, + "hideInAnswer": true + }, + { + "if": "cycleway:surface=paved", + "then": { + "en": "This cycleway is paved", + "nl": "Dit fietspad is geplaveid", + "de": "Dieser Radweg hat einen festen Belag" + }, + "hideInAnswer": true + }, + { + "if": "cycleway:surface=asphalt", + "then": { + "en": "This cycleway is made of asphalt", + "nl": "Dit fietspad is gemaakt van asfalt", + "de": "Der Radweg ist aus Asphalt" + } + }, + { + "if": "cycleway:surface=paving_stones", + "then": { + "en": "This cycleway is made of smooth paving stones", + "nl": "Dit fietspad is gemaakt van straatstenen", + "de": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen" + } + }, + { + "if": "cycleway:surface=concrete", + "then": { + "en": "This cycleway is made of concrete", + "nl": "Dit fietspad is gemaakt van beton", + "de": "Der Radweg ist aus Beton" + } + }, + { + "if": "cycleway:surface=cobblestone", + "then": { + "en": "This cycleway is made of cobblestone (unhewn or sett)", + "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)", + "de": "Dieser Radweg besteht aus Kopfsteinpflaster" + }, + "hideInAnswer": true + }, + { + "if": "cycleway:surface=unhewn_cobblestone", + "then": { + "en": "This cycleway is made of raw, natural cobblestone", + "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien", + "de": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster" + } + }, + { + "if": "cycleway:surface=sett", + "then": { + "en": "This cycleway is made of flat, square cobblestone", + "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien", + "de": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster" + } + }, + { + "if": "cycleway:surface=wood", + "then": { + "en": "This cycleway is made of wood", + "nl": "Dit fietspad is gemaakt van hout", + "de": "Der Radweg ist aus Holz" + } + }, + { + "if": "cycleway:surface=gravel", + "then": { + "en": "This cycleway is made of gravel", + "nl": "Dit fietspad is gemaakt van grind", + "de": "Der Radweg ist aus Schotter" + } + }, + { + "if": "cycleway:surface=fine_gravel", + "then": { + "en": "This cycleway is made of fine gravel", + "nl": "Dit fietspad is gemaakt van fijn grind", + "de": "Dieser Radweg besteht aus feinem Schotter" + } + }, + { + "if": "cycleway:surface=pebblestone", + "then": { + "en": "This cycleway is made of pebblestone", + "nl": "Dit fietspad is gemaakt van kiezelsteentjes", + "de": "Der Radweg ist aus Kies" + } + }, + { + "if": "cycleway:surface=ground", + "then": { + "en": "This cycleway is made from raw ground", + "nl": "Dit fietspad is gemaakt van aarde", + "de": "Dieser Radweg besteht aus Rohboden" + } + } + ], + "question": { + "en": "What is the surface of the cycleway made from?", + "nl": "Waaruit is het oppervlak van het fietspad van gemaakt?", + "de": "Was ist der Belag dieses Radwegs?" + }, + "id": "Cycleway:surface" + }, + { + "question": { + "en": "What is the smoothness of this cycleway?", + "nl": "Wat is de kwaliteit van dit fietspad?", + "de": "Wie eben ist dieser Radweg?" + }, + "condition": { + "or": [ + "cycleway=shared_lane", + "cycleway=lane", + "cycleway=track" + ] + }, + "mappings": [ + { + "if": "cycleway:smoothness=excellent", + "then": { + "en": "Usable for thin rollers: rollerblade, skateboard", + "nl": "Geschikt voor fijne rollers: rollerblade, skateboard", + "de": "Geeignet für dünne Rollen: Rollerblades, Skateboard" + } + }, + { + "if": "cycleway:smoothness=good", + "then": { + "en": "Usable for thin wheels: racing bike", + "nl": "Geschikt voor fijne wielen: racefiets", + "de": "Geeignet für dünne Reifen: Rennrad" + } + }, + { + "if": "cycleway:smoothness=intermediate", + "then": { + "en": "Usable for normal wheels: city bike, wheelchair, scooter", + "nl": "Geschikt voor normale wielen: stadsfiets, rolstoel, scooter", + "de": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter" + } + }, + { + "if": "cycleway:smoothness=bad", + "then": { + "en": "Usable for robust wheels: trekking bike, car, rickshaw", + "nl": "Geschikt voor brede wielen: trekfiets, auto, rickshaw", + "de": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha" + } + }, + { + "if": "cycleway:smoothness=very_bad", + "then": { + "en": "Usable for vehicles with high clearance: light duty off-road vehicle", + "nl": "Geschikt voor voertuigen met hoge banden: lichte terreinwagen", + "de": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen" + } + }, + { + "if": "cycleway:smoothness=horrible", + "then": { + "en": "Usable for off-road vehicles: heavy duty off-road vehicle", + "nl": "Geschikt voor terreinwagens: zware terreinwagen", + "de": "Geeignet für Geländefahrzeuge: schwerer Geländewagen" + } + }, + { + "if": "cycleway:smoothness=very_horrible", + "then": { + "en": "Usable for specialized off-road vehicles: tractor, ATV", + "nl": "Geschikt voor gespecialiseerde terreinwagens: tractor, alleterreinwagen", + "de": "Geeignet für Geländefahrzeuge: Traktor, ATV" + } + }, + { + "if": "cycleway:smoothness=impassable", + "then": { + "en": "Impassable / No wheeled vehicle", + "nl": "Niet geschikt voor voertuigen met wielen", + "de": "Unpassierbar / Keine bereiften Fahrzeuge" + } + } + ], + "id": "Cycleway:smoothness" + }, + { + "render": { + "en": "This road is made of {surface}", + "nl": "Deze weg is gemaakt van {surface}", + "de": "Der Radweg ist aus {surface}", + "id": "Jalan ini terbuat dari {surface}" + }, + "freeform": { + "key": "surface" + }, + "mappings": [ + { + "if": "surface=unpaved", + "then": { + "en": "This cycleway is unhardened", + "nl": "Dit fietspad is onverhard", + "de": "Dieser Radweg ist nicht befestigt" + }, + "hideInAnswer": true + }, + { + "if": "surface=paved", + "then": { + "en": "This cycleway is paved", + "nl": "Dit fietspad is geplaveid", + "de": "Dieser Radweg hat einen festen Belag", + "id": "Jalur sepeda ini diaspal" + }, + "hideInAnswer": true + }, + { + "if": "surface=asphalt", + "then": { + "en": "This cycleway is made of asphalt", + "nl": "Dit fietspad is gemaakt van asfalt", + "de": "Der Radweg ist aus Asphalt", + "id": "Jalur sepeda ini terbuat dari aspal" + } + }, + { + "if": "surface=paving_stones", + "then": { + "en": "This cycleway is made of smooth paving stones", + "nl": "Dit fietspad is gemaakt van straatstenen", + "de": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen", + "id": "Jalur sepeda ini terbuat dari batu paving halus" + } + }, + { + "if": "surface=concrete", + "then": { + "en": "This cycleway is made of concrete", + "nl": "Dit fietspad is gemaakt van beton", + "de": "Der Radweg ist aus Beton", + "id": "Jalur sepeda ini terbuat dari beton" + } + }, + { + "if": "surface=cobblestone", + "then": { + "en": "This cycleway is made of cobblestone (unhewn or sett)", + "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)", + "de": "Dieser Radweg besteht aus Kopfsteinpflaster", + "id": "Jalur sepeda ini terbuat dari cobblestone (unhewn atau sett)" + }, + "hideInAnswer": true + }, + { + "if": "surface=unhewn_cobblestone", + "then": { + "en": "This cycleway is made of raw, natural cobblestone", + "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien", + "de": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster", + "id": "Jalur sepeda ini terbuat dari batu bulat alami" + } + }, + { + "if": "surface=sett", + "then": { + "en": "This cycleway is made of flat, square cobblestone", + "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien", + "de": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster" + } + }, + { + "if": "surface=wood", + "then": { + "en": "This cycleway is made of wood", + "nl": "Dit fietspad is gemaakt van hout", + "de": "Der Radweg ist aus Holz", + "id": "Jalur sepeda ini terbuat dari kayu" + } + }, + { + "if": "surface=gravel", + "then": { + "en": "This cycleway is made of gravel", + "nl": "Dit fietspad is gemaakt van grind", + "de": "Der Radweg ist aus Schotter", + "id": "Jalur sepeda ini terbuat dari kerikil" + } + }, + { + "if": "surface=fine_gravel", + "then": { + "en": "This cycleway is made of fine gravel", + "nl": "Dit fietspad is gemaakt van fijn grind", + "de": "Dieser Radweg besteht aus feinem Schotter", + "id": "Jalur sepeda ini terbuat dari kerikil halus" + } + }, + { + "if": "surface=pebblestone", + "then": { + "en": "This cycleway is made of pebblestone", + "nl": "Dit fietspad is gemaakt van kiezelsteentjes", + "de": "Der Radweg ist aus Kies", + "id": "Jalur sepeda ini terbuat dari batu kerikil" + } + }, + { + "if": "surface=ground", + "then": { + "en": "This cycleway is made from raw ground", + "nl": "Dit fietspad is gemaakt van aarde", + "de": "Dieser Radweg besteht aus Rohboden", + "id": "Jalur sepeda ini terbuat dari tanah alami" + } + } + ], + "question": { + "en": "What is the surface of the street made from?", + "nl": "Waaruit is het oppervlak van de straat gemaakt?", + "de": "Was ist der Belag dieser Straße?", + "id": "Permukaan jalannya terbuat dari apa?" + }, + "id": "Surface of the road" + }, + { + "question": { + "en": "What is the smoothness of this street?", + "nl": "Wat is de kwaliteit van deze straat?", + "de": "Wie eben ist diese Straße?" + }, + "condition": { + "or": [ + "cycleway=no", + "highway=cycleway" + ] + }, + "mappings": [ + { + "if": "smoothness=excellent", + "then": { + "en": "Usable for thin rollers: rollerblade, skateboard", + "de": "Geeignet für dünne Rollen: Rollerblades, Skateboard", + "id": "Dapat digunakan untuk roller tipis: rollerblade, skateboard" + } + }, + { + "if": "smoothness=good", + "then": { + "en": "Usable for thin wheels: racing bike", + "de": "Geeignet für dünne Reifen: Rennrad", + "id": "Dapat digunakan untuk roda tipis: sepeda balap" + } + }, + { + "if": "smoothness=intermediate", + "then": { + "en": "Usable for normal wheels: city bike, wheelchair, scooter", + "de": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter", + "id": "Dapat digunakan untuk roda normal: sepeda kota, kursi roda, skuter" + } + }, + { + "if": "smoothness=bad", + "then": { + "en": "Usable for robust wheels: trekking bike, car, rickshaw", + "de": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha", + "id": "Dapat digunakan untuk roda yang kuat: sepeda trekking, mobil, becak" + } + }, + { + "if": "smoothness=very_bad", + "then": { + "en": "Usable for vehicles with high clearance: light duty off-road vehicle", + "de": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen" + } + }, + { + "if": "smoothness=horrible", + "then": { + "en": "Usable for off-road vehicles: heavy duty off-road vehicle", + "de": "Geeignet für Geländefahrzeuge: schwerer Geländewagen", + "id": "Dapat digunakan untuk kendaraan off-road: kendaraan off-road berat" + } + }, + { + "if": "smoothness=very_horrible", + "then": { + "en": "Usable for specialized off-road vehicles: tractor, ATV", + "de": "Geeignet für spezielle Geländewagen: Traktor, ATV", + "id": "Dapat digunakan untuk kendaraan off-road khusus: traktor, ATV" + } + }, + { + "if": "smoothness=impassable", + "then": { + "en": "Impassable / No wheeled vehicle", + "de": "Unpassierbar / Keine bereiften Fahrzeuge" + } + } + ], + "id": "Surface of the street" + }, + { + "condition": { + "and": [ + "highway!=cycleway", + "highway!=path" + ] + }, + "render": { + "en": "The carriage width of this road is {width:carriageway}m", + "nl": "De breedte van deze rijbaan in deze straat is {width:carriageway}m", + "de": "Die Fahrbahnbreite dieser Straße beträgt {width:carriageway}m" + }, + "freeform": { + "key": "width:carriageway", + "type": "length", + "helperArgs": [ + "20", + "map" + ] + }, + "question": { + "en": "What is the carriage width of this road (in meters)?
This is measured curb to curb and thus includes the width of parallell parking lanes", + "nl": "Hoe breed is de rijbaan in deze straat (in meters)?
Dit is
Meet dit van stoepsteen tot stoepsteen, dus inclusief een parallelle parkeerstrook", + "de": "Wie groß ist die Fahrbahnbreite dieser Straße (in Metern)?
Diese wird von Bordstein zu Bordstein gemessen und schließt daher die Breite von parallelen Parkspuren ein" + }, + "id": "width:carriageway" + }, + { + "id": "cycleway-lane-track-traffic-signs", + "question": { + "en": "What traffic sign does this cycleway have?", + "nl": "Welk verkeersbord heeft dit fietspad?", + "de": "Welches Verkehrszeichen hat dieser Radweg?", + "id": "Rambu lalu lintas apa yang dimiliki jalur sepeda ini?" + }, + "condition": { + "or": [ + "cycleway=lane", + "cycleway=track" + ] + }, + "mappings": [ + { + "if": "cycleway:traffic_sign=BE:D7", + "then": { + "en": "Compulsory cycleway ", + "nl": "Verplicht fietspad ", + "de": "Vorgeschriebener Radweg ", + "id": "Jalur sepeda wajib " + }, + "hideInAnswer": "_country!=be" + }, + { + "if": "cycleway:traffic_sign~BE:D7;.*", + "then": { + "en": "Compulsory cycleway (with supplementary sign)
", + "nl": "Verplicht fietspad (met onderbord)
", + "de": "Vorgeschriebener Radweg (mit Zusatzschild)
", + "id": "Jalur sepeda wajib (dengan tanda tambahan)
" + }, + "hideInAnswer": true + }, + { + "if": "cycleway:traffic_sign=BE:D9", + "then": { + "en": "Segregated foot/cycleway ", + "nl": "Afgescheiden voet-/fietspad ", + "de": "Getrennter Fuß-/Radweg ", + "id": "Jalur pejalan kaki/sepeda terpisah " + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "cycleway:foot=designated", + "cycleway:segregated=yes" + ] + }, + { + "if": "cycleway:traffic_sign=BE:D10", + "then": { + "en": "Unsegregated foot/cycleway ", + "nl": "Gedeeld voet-/fietspad ", + "de": "Gemeinsamer Fuß-/Radweg ", + "id": "Jalur pejalan kaki/sepeda tidak terpisah " + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "cycleway:foot=designated", + "cycleway:segregated=no" + ] + }, + { + "if": "cycleway:traffic_sign=none", + "then": { + "en": "No traffic sign present", + "nl": "Geen verkeersbord aanwezig", + "de": "Kein Verkehrsschild vorhanden", + "id": "Tidak ada rambu lalu lintas" + } + } + ] + }, + { + "id": "cycleway-traffic-signs", + "question": { + "en": "What traffic sign does this cycleway have?", + "nl": "Welk verkeersbord heeft dit fietspad?", + "de": "Welches Verkehrszeichen hat dieser Radweg?" + }, + "condition": { + "or": [ + "highway=cycleway", + "highway=path" + ] + }, + "mappings": [ + { + "if": "traffic_sign=BE:D7", + "then": { + "en": "Compulsory cycleway ", + "nl": "Verplicht fietspad ", + "de": "Vorgeschriebener Radweg ", + "id": "Jalur sepeda wajib " + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "bicycle=designated", + "mofa=designated", + "moped=yes", + "speed_pedelec=yes" + ] + }, + { + "if": "traffic_sign~BE:D7;.*", + "then": { + "en": "Compulsory cycleway (with supplementary sign)
", + "nl": "Verplicht fietspad (met onderbord)
", + "de": "Vorgeschriebener Radweg (mit Zusatzschild)
" + }, + "hideInAnswer": true + }, + { + "if": "traffic_sign=BE:D9", + "then": { + "en": "Segregated foot/cycleway ", + "nl": "Afgescheiden voet-/fietspad ", + "de": "Getrennter Fuß-/Radweg " + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "foot=designated", + "bicycle=designated", + "mofa=designated", + "moped=no", + "speed_pedelec=no", + "segregated=yes" + ] + }, + { + "if": "traffic_sign=BE:D10", + "then": { + "en": "Unsegregated foot/cycleway ", + "nl": "Gedeeld voet-/fietspad ", + "de": "Gemeinsamer Fuß-/Radweg " + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "foot=designated", + "bicycle=designated", + "mofa=designated", + "moped=no", + "speed_pedelec=no", + "segregated=no" + ] + }, + { + "if": "traffic_sign=none", + "then": { + "en": "No traffic sign present", + "nl": "Geen verkeersbord aanwezig", + "de": "Kein Verkehrsschild vorhanden" + } + } + ] + }, + { + "id": "cycleway-traffic-signs-supplementary", + "question": { + "en": "Does the traffic sign D7 () have a supplementary sign?", + "nl": "Heeft het verkeersbord D7 () een onderbord?", + "de": "Hat das Verkehrszeichen D7 () ein Zusatzzeichen?" + }, + "condition": { + "or": [ + "cycleway:traffic_sign=BE:D7", + "cycleway:traffic_sign~BE:D7;.*" + ] + }, + "mappings": [ + { + "if": "cycleway:traffic_sign=BE:D7;BE:M6", + "then": { + "en": "", + "nl": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "cycleway:moped=designated" + ] + }, + { + "if": "cycleway:traffic_sign=BE:D7;BE:M13", + "then": { + "en": "", + "nl": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "cycleway:speed_pedelec=designated" + ] + }, + { + "if": "cycleway:traffic_sign=BE:D7;BE:M14", + "then": { + "en": "", + "nl": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "cycleway:moped=designated", + "cycleway:speed_pedelec=designated" + ] + }, + { + "if": "cycleway:traffic_sign=BE:D7;BE:M7", + "then": { + "en": "", + "nl": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "cycleway:moped=no" + ] + }, + { + "if": "cycleway:traffic_sign=BE:D7;BE:M15", + "then": { + "en": "", + "nl": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "cycleway:speed_pedelec=no" + ] + }, + { + "if": "cycleway:traffic_sign=BE:D7;BE:M16", + "then": { + "en": "", + "nl": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "cycleway:moped=designated", + "cycleway:speed_pedelec=no" + ] + }, + { + "if": "cycleway:traffic_sign:supplementary=none", + "then": { + "en": "No supplementary traffic sign present", + "nl": "Geen onderbord aanwezig", + "de": "Kein zusätzliches Verkehrszeichen vorhanden" + } + } + ] + }, + { + "id": "cycleway-traffic-signs-D7-supplementary", + "question": { + "en": "Does the traffic sign D7 () have a supplementary sign?", + "nl": "Heeft het verkeersbord D7 () een onderbord?", + "de": "Hat das Verkehrszeichen D7 () ein Zusatzzeichen?" + }, + "condition": { + "or": [ + "traffic_sign=BE:D7", + "traffic_sign~BE:D7;.*" + ] + }, + "mappings": [ + { + "if": "traffic_sign=BE:D7;BE:M6", + "then": { + "en": "", + "nl": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "moped=designated" + ] + }, + { + "if": "traffic_sign=BE:D7;BE:M13", + "then": { + "en": "", + "nl": "", + "de": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "speed_pedelec=designated" + ] + }, + { + "if": "traffic_sign=BE:D7;BE:M14", + "then": { + "en": "", + "nl": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "moped=designated", + "speed_pedelec=designated" + ] + }, + { + "if": "traffic_sign=BE:D7;BE:M7", + "then": { + "en": "", + "nl": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "moped=no" + ] + }, + { + "if": ":traffic_sign=BE:D7;BE:M15", + "then": { + "en": "", + "nl": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "speed_pedelec=no" + ] + }, + { + "if": "traffic_sign=BE:D7;BE:M16", + "then": { + "en": "", + "nl": "" + }, + "hideInAnswer": "_country!=be", + "addExtraTags": [ + "moped=designated", + "speed_pedelec=no" + ] + }, + { + "if": "traffic_sign:supplementary=none", + "then": { + "en": "No supplementary traffic sign present", + "nl": "Geen onderbord aanwezig", + "de": "Kein zusätzliches Verkehrszeichen vorhanden" + } + } + ] + }, + { + "render": { + "en": "The buffer besides this cycleway is {cycleway:buffer} m", + "nl": "De schrikafstand van dit fietspad is {cycleway:buffer} m", + "de": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m" + }, + "question": { + "en": "How wide is the gap between the cycleway and the road?", + "nl": "Hoe breed is de ruimte tussen het fietspad en de weg?", + "de": "Wie breit ist der Abstand zwischen Radweg und Straße?" + }, + "condition": { + "or": [ + "cycleway=track", + "cycleway=lane" + ] + }, + "freeform": { + "key": "cycleway:buffer", + "type": "length", + "helperArgs": [ + "20", + "map" + ] + }, + "id": "cycleways_and_roads-cycleway:buffer" + }, + { + "id": "cyclelan-segregation", + "question": { + "en": "How is this cycleway separated from the road?", + "nl": "Hoe is dit fietspad gescheiden van de weg?", + "de": "Wie ist der Radweg von der Straße abgegrenzt?", + "id": "Bagaimana jalur sepeda ini terpisah dari jalan?" + }, + "condition": { + "or": [ + "cycleway=track", + "cycleway=lane" + ] + }, + "mappings": [ + { + "if": "cycleway:separation=dashed_line", + "then": { + "en": "This cycleway is separated by a dashed line", + "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep", + "de": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie", + "id": "Jalur sepeda ini dipisahkan oleh garis putus-putus" + } + }, + { + "if": "cycleway:separation=solid_line", + "then": { + "en": "This cycleway is separated by a solid line", + "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep", + "de": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie", + "id": "Jalur sepeda ini dipisahkan oleh garis solid" + } + }, + { + "if": "cycleway:separation=parking_lane", + "then": { + "en": "This cycleway is separated by a parking lane", + "nl": "Dit fietspad is gescheiden van de weg met parkeervakken", + "de": "Der Radweg ist abgegrenzt durch eine Parkspur", + "id": "Jalur sepeda ini dipisahkan oleh jalur parkir" + } + }, + { + "if": "cycleway:separation=kerb", + "then": { + "en": "This cycleway is separated by a kerb", + "nl": "Dit fietspad is gescheiden van de weg met een stoeprand", + "de": "Dieser Radweg ist getrennt durch einen Bordstein", + "id": "Jalur sepeda ini dipisahkan oleh kerb" + } + } + ] + }, + { + "id": "cycleway-segregation", + "question": { + "en": "How is this cycleway separated from the road?", + "nl": "Hoe is dit fietspad gescheiden van de weg?", + "de": "Wie ist der Radweg von der Straße abgegrenzt?", + "id": "Bagaimana jalur sepeda ini dipisahkan dari jalan?" + }, + "condition": { + "or": [ + "highway=cycleway", + "highway=path" + ] + }, + "mappings": [ + { + "if": "separation=dashed_line", + "then": { + "en": "This cycleway is separated by a dashed line", + "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep", + "de": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie", + "id": "Jalur sepeda ini dipisahkan oleh garis putus-putus" + } + }, + { + "if": "separation=solid_line", + "then": { + "en": "This cycleway is separated by a solid line", + "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep", + "de": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie", + "id": "Jalur sepeda ini dipisahkan oleh garis solid" + } + }, + { + "if": "separation=parking_lane", + "then": { + "en": "This cycleway is separated by a parking lane", + "nl": "Dit fietspad is gescheiden van de weg met parkeervakken", + "de": "Der Radweg ist abgegrenzt durch eine Parkspur", + "id": "Jalur sepeda ini dipisahkan oleh jalur parkir" + } + }, + { + "if": "separation=kerb", + "then": { + "en": "This cycleway is separated by a kerb", + "nl": "Dit fietspad is gescheiden van de weg met een stoeprand", + "de": "Dieser Radweg ist getrennt durch einen Bordstein", + "id": "Jalur sepeda ini dipisahkan oleh kerb" + } + } + ] + } + ], + "allowSplit": true, + "mapRendering": [ + { + "icon": { "render": "./assets/themes/cycle_infra/bicycleway.svg" - }, - "width": { - "render": "8" - }, - "iconSize": { + }, + "iconSize": { "render": "40,40,center" + }, + "location": [ + "point" + ] }, - "color": { + { + "color": { "render": "rgba(170, 170, 170, 0.7)", "mappings": [ - { - "if": "highway=cycleway", - "then": "rgba(0, 189, 141, 0.7)" - }, - { - "if": "highway=path", - "then": "rgba(204, 74, 207, 0.7)" - }, - { - "if": "cycleway=track", - "then": "rgba(113, 3, 200, 0.7)" - }, - { - "if": "cycleway=shared_lane", - "then": "rgba(74, 59, 247, 0.7)" - }, - { - "if": "cycleway=lane", - "then": "rgba(254, 155, 6, 0.9)" - }, - { - "if": "cyclestreet=yes", - "then": "rgba(57, 159, 191, 0.7)" - } + { + "if": "highway=cycleway", + "then": "rgba(0, 189, 141, 0.7)" + }, + { + "if": "highway=path", + "then": "rgba(204, 74, 207, 0.7)" + }, + { + "if": "cycleway=track", + "then": "rgba(113, 3, 200, 0.7)" + }, + { + "if": "cycleway=shared_lane", + "then": "rgba(74, 59, 247, 0.7)" + }, + { + "if": "cycleway=lane", + "then": "rgba(254, 155, 6, 0.9)" + }, + { + "if": "cyclestreet=yes", + "then": "rgba(57, 159, 191, 0.7)" + } ] - }, - "dashArray": { + }, + "width": { + "render": "8" + }, + "dashArray": { "render": "", "mappings": [ - { - "if": { - "or": [ - "oneway=yes", - { - "or": [ - "highway=cycleway", - "highway=path" - ] - } - ] - }, - "then": "" + { + "if": { + "or": [ + "oneway=yes", + { + "or": [ + "highway=cycleway", + "highway=path" + ] + } + ] }, - { - "if": "cycleway=track", - "then": "" - }, - { - "if": "cycleway=shared_lane", - "then": "15 30" - }, - { - "if": "cycleway=lane", - "then": "25 15 15 15 25" - }, - { - "if": "cyclestreet=yes", - "then": "" - } + "then": "" + }, + { + "if": "cycleway=track", + "then": "" + }, + { + "if": "cycleway=shared_lane", + "then": "15 30" + }, + { + "if": "cycleway=lane", + "then": "25 15 15 15 25" + }, + { + "if": "cyclestreet=yes", + "then": "" + } ] - }, - "allowSplit": true + } + } + ] } \ No newline at end of file diff --git a/assets/layers/defibrillator/defibrillator.json b/assets/layers/defibrillator/defibrillator.json index 1055366784..fe98f75ec7 100644 --- a/assets/layers/defibrillator/defibrillator.json +++ b/assets/layers/defibrillator/defibrillator.json @@ -1,555 +1,573 @@ { - "id": "defibrillator", - "name": { - "en": "Defibrillators", - "ca": "Desfibril·ladors", - "es": "Desfibriladores", - "fr": "Défibrillateurs", - "nl": "Defibrillatoren", - "de": "Defibrillatoren", - "it": "Defibrillatori", - "ru": "Дефибрилляторы" - }, - "source": { - "osmTags": "emergency=defibrillator" - }, - "calculatedTags": [ - "_days_since_last_survey=Math.floor(new Date() - new Date(feat.properties['survey:date'])/(1000*60*60*24))", - "_recently_surveyed=Number(feat.properties._days_since_last_survey) <= 90" - ], - "minzoom": 12, - "title": { - "render": { - "en": "Defibrillator", - "ca": "Desfibril·lador", - "es": "Desfibrilador", - "fr": "Défibrillateur", - "nl": "Defibrillator", - "de": "Defibrillator", - "it": "Defibrillatore", - "ru": "Дефибриллятор" + "id": "defibrillator", + "name": { + "en": "Defibrillators", + "ca": "Desfibril·ladors", + "es": "Desfibriladores", + "fr": "Défibrillateurs", + "nl": "Defibrillatoren", + "de": "Defibrillatoren", + "it": "Defibrillatori", + "ru": "Дефибрилляторы" + }, + "source": { + "osmTags": "emergency=defibrillator" + }, + "calculatedTags": [ + "_days_since_last_survey=Math.floor(new Date() - new Date(feat.properties['survey:date'])/(1000*60*60*24))", + "_recently_surveyed=Number(feat.properties._days_since_last_survey) <= 90" + ], + "minzoom": 12, + "title": { + "render": { + "en": "Defibrillator", + "ca": "Desfibril·lador", + "es": "Desfibrilador", + "fr": "Défibrillateur", + "nl": "Defibrillator", + "de": "Defibrillator", + "it": "Defibrillatore", + "ru": "Дефибриллятор" + } + }, + "presets": [ + { + "title": { + "en": "Defibrillator", + "ca": "Desfibril·lador", + "es": "Desfibrilador", + "fr": "Défibrillateur", + "nl": "Defibrillator", + "de": "Defibrillator", + "it": "Defibrillatore", + "ru": "Дефибриллятор" + }, + "tags": [ + "emergency=defibrillator" + ], + "preciseInput": { + "preferredBackground": "map" + } + } + ], + "tagRenderings": [ + "images", + { + "id": "defibrillator-indoors", + "question": { + "en": "Is this defibrillator located indoors?", + "ca": "Està el desfibril·lador a l'interior?", + "es": "¿Esté el desfibrilador en interior?", + "fr": "Ce défibrillateur est-il disposé en intérieur ?", + "nl": "Hangt deze defibrillator binnen of buiten?", + "de": "Befindet sich dieser Defibrillator im Gebäude?", + "it": "Questo defibrillatore si trova all’interno?" + }, + "mappings": [ + { + "if": "indoor=yes", + "then": { + "en": "This defibrillator is located indoors", + "ca": "Aquest desfibril·lador està a l'interior", + "es": "Este desfibrilador está en interior", + "fr": "Ce défibrillateur est en intérieur (dans un batiment)", + "nl": "Deze defibrillator bevindt zich in een gebouw", + "de": "Dieser Defibrillator befindet sich im Gebäude", + "it": "Questo defibrillatore si trova all’interno" + } + }, + { + "if": "indoor=no", + "then": { + "en": "This defibrillator is located outdoors", + "ca": "Aquest desfibril·lador està a l'exterior", + "es": "Este desfibrilador está en exterior", + "fr": "Ce défibrillateur est situé en extérieur", + "nl": "Deze defibrillator hangt buiten", + "de": "Dieser Defibrillator befindet sich im Freien", + "it": "Questo defibrillatore si trova all’esterno" + } } + ] }, - "icon": { + { + "question": { + "en": "Is this defibrillator freely accessible?", + "ca": "Està el desfibril·lador accessible lliurement?", + "es": "¿Está el desfibrilador accesible libremente?", + "fr": "Ce défibrillateur est-il librement accessible ?", + "nl": "Is deze defibrillator vrij toegankelijk?", + "de": "Ist dieser Defibrillator frei zugänglich?", + "it": "Questo defibrillatore è liberamente accessibile?" + }, + "render": { + "en": "Access is {access}", + "ca": "L'accés és {access}", + "es": "El acceso es {access}", + "fr": "{access} accessible", + "nl": "Toegankelijkheid is {access}", + "de": "Zugang ist {access}", + "it": "Accesso è {access}" + }, + "freeform": { + "key": "access", + "addExtraTags": [ + "fixme=Freeform field used for access - doublecheck the value" + ] + }, + "mappings": [ + { + "if": "access=yes", + "then": { + "en": "Publicly accessible", + "ca": "Accés lliure", + "es": "Acceso libre", + "fr": "Librement accessible", + "nl": "Publiek toegankelijk", + "de": "Öffentlich zugänglich", + "it": "Pubblicamente accessibile", + "ru": "Общедоступный" + } + }, + { + "if": "access=public", + "then": { + "en": "Publicly accessible", + "ca": "Publicament accessible", + "es": "Publicament accesible", + "fr": "Librement accessible", + "nl": "Publiek toegankelijk", + "de": "Öffentlich zugänglich", + "it": "Pubblicamente accessibile", + "ru": "Общедоступный" + }, + "hideInAnswer": true + }, + { + "if": "access=customers", + "then": { + "en": "Only accessible to customers", + "ca": "Només accessible a clients", + "es": "Sólo accesible a clientes", + "fr": "Réservé aux clients du lieu", + "nl": "Enkel toegankelijk voor klanten", + "de": "Nur für Kunden zugänglich", + "it": "Accessibile solo ai clienti", + "ru": "Доступно только для клиентов" + } + }, + { + "if": "access=private", + "then": { + "en": "Not accessible to the general public (e.g. only accesible to staff, the owners, ...)", + "ca": "No accessible al públic en general (ex. només accesible a treballadors, propietaris, ...)", + "es": "No accesible al público en general (ex. sólo accesible a trabajadores, propietarios, ...)", + "fr": "Non accessible au public (par exemple réservé au personnel, au propriétaire, ...)", + "nl": "Niet toegankelijk voor het publiek (bv. enkel voor personeel, de eigenaar, ...)", + "de": "Nicht für die Öffentlichkeit zugänglich (z.B. nur für das Personal, die Eigentümer, ...)", + "it": "Non accessibile al pubblico (ad esempio riservato al personale, ai proprietari, etc.)" + } + }, + { + "if": "access=no", + "then": { + "en": "Not accessible, possibly only for professional use", + "nl": "Niet toegankelijk, mogelijk enkel voor professionals", + "fr": "Pas accessible, peut-être uniquement à usage professionnel", + "it": "Non accessibile, potrebbe essere solo per uso professionale", + "de": "Nicht zugänglich, möglicherweise nur für betriebliche Nutzung" + } + } + ], + "id": "defibrillator-access" + }, + { + "question": { + "en": "Is this a a regular automatic defibrillator or a manual defibrillator for professionals only?", + "nl": "Is dit een gewone automatische defibrillator of een manueel toestel enkel voor professionals?", + "fr": "Est-ce un défibrillateur automatique normal ou un défibrillateur manuel à usage professionnel uniquement ?", + "it": "Si tratta di un normale defibrillatore automatico o un defibrillatore manuale riservato ai professionisti?", + "de": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?" + }, + + "condition": { + "and": [ + "access=no" + ] + }, + "mappings": [ + { + "if": "defibrillator=", + "then": { + "en": "There is no info about the type of device", + "nl": "Er is geen info over het soort toestel", + "fr": "Il n'y a pas d'information sur le type de dispositif", + "it": "Non vi sono informazioni riguardanti il tipo di questo dispositivo", + "de": "Es gibt keine Informationen über den Gerätetyp" + }, + "hideInAnswer": true + }, + { + "if": "defibrillator=manual", + "then": { + "en": "This is a manual defibrillator for professionals", + "nl": "Dit is een manueel toestel enkel voor professionals", + "fr": "C'est un défibrillateur manuel pour professionnel", + "it": "Questo è un defibrillatore manuale per professionisti", + "de": "Dies ist ein manueller Defibrillator für den professionellen Einsatz" + } + }, + { + "if": "defibrillator=automatic", + "then": { + "en": "This is a normal automatic defibrillator", + "nl": "Dit is een gewone automatische defibrillator", + "fr": "C'est un défibrillateur automatique manuel", + "it": "È un normale defibrillatore automatico", + "ru": "Это обычный автоматический дефибриллятор", + "de": "Dies ist ein normaler automatischer Defibrillator" + } + }, + { + "if": "defibrillator~", + "then": { + "en": "This is a special type of defibrillator: {defibrillator}" + }, + "hideInAnswer": true + } + ], + "id": "defibrillator-defibrillator" + }, + { + "question": { + "en": "On which floor is this defibrillator located?", + "ca": "A quina planta està el desfibril·lador localitzat?", + "es": "¿En qué planta se encuentra el defibrilador localizado?", + "fr": "À quel étage est situé ce défibrillateur ?", + "nl": "Op welke verdieping bevindt deze defibrillator zich?", + "de": "In welchem Stockwerk befindet sich dieser Defibrillator?", + "it": "A che piano si trova questo defibrillatore?" + }, + "condition": { + "and": [ + "indoor=yes" + ] + }, + "freeform": { + "key": "level", + "type": "int" + }, + "render": { + "en": "This defibrillator is on floor {level}", + "ca": "Aquest desfibril·lador és a la planta {level}", + "es": "El desfibrilador se encuentra en la planta {level}", + "fr": "Ce défibrillateur est à l'étage {level}", + "nl": "De defibrillator bevindt zicht op verdieping {level}", + "de": "Dieser Defibrallator befindet sich im {level}. Stockwerk", + "it": "Questo defibrillatore è al piano {level}" + }, + "mappings": [ + { + "if": "level=0", + "then": { + "en": "This defibrillator is on the ground floor", + "nl": "Deze defibrillator bevindt zich gelijkvloers", + "fr": "Ce défibrillateur est au rez-de-chaussée", + "it": "Questo defibrillatore è al pian terreno", + "de": "Dieser Defibrillator befindet sich im Erdgeschoss" + } + }, + { + "if": "level=1", + "then": { + "en": "This defibrillator is on the first floor", + "nl": "Deze defibrillator is op de eerste verdieping", + "fr": "Ce défibrillateur est au premier étage", + "it": "Questo defibrillatore è al primo piano", + "de": "Dieser Defibrillator befindet sich in der ersten Etage" + } + } + ], + "id": "defibrillator-level" + }, + { + "render": { + "nl": "Meer informatie over de locatie (lokale taal):
{defibrillator:location}", + "en": "Extra information about the location (in the local languagel):
{defibrillator:location}", + "fr": "Informations supplémentaires à propos de l'emplacement (dans la langue locale) :
{defibrillator:location}", + "it": "Informazioni supplementari circa la posizione (in lingua locale):
{defibrillator:location}", + "de": "Zusätzliche Informationen über den Standort (in der Landessprache):
{defibrillator:location}" + }, + "question": { + "en": "Please give some explanation on where the defibrillator can be found (in the local language)", + "ca": "Dóna detalls d'on es pot trobar el desfibril·lador", + "es": "Da detalles de dónde se puede encontrar el desfibrilador (en el idioma local)", + "fr": "Veuillez indiquez plus précisément où se situe le défibrillateur (dans la langue local)", + "nl": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in de plaatselijke taal)", + "de": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (in der lokalen Sprache)", + "it": "Indica più precisamente dove si trova il defibrillatore (in lingua locale)" + }, + "freeform": { + "type": "text", + "key": "defibrillator:location" + }, + "id": "defibrillator-defibrillator:location" + }, + { + "render": { + "nl": "Meer informatie over de locatie (in het Engels):
{defibrillator:location:en}", + "en": "Extra information about the location (in English):
{defibrillator:location:en}", + "fr": "Informations supplémentaires à propos de l'emplacement (en anglais) :
{defibrillator:location:en}", + "it": "Informazioni supplementari circa la posizione (in inglese):
{defibrillator:location:en}", + "de": "Zusätzliche Informationen über den Standort (auf Englisch):
{defibrillator:location:en}" + }, + "question": { + "en": "Please give some explanation on where the defibrillator can be found (in English)", + "ca": "Dóna detalls d'on es pot trobar el desfibril·lador", + "es": "Da detalles de dónde se puede encontrar el desfibrilador (en ingles)", + "fr": "Veuillez indiquez plus précisément où se situe le défibrillateur (en englais)", + "nl": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in het Engels)", + "de": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Englisch)", + "it": "Indica più precisamente dove si trova il defibrillatore (in inglese)" + }, + "freeform": { + "type": "text", + "key": "defibrillator:location:en" + }, + "id": "defibrillator-defibrillator:location:en" + }, + { + "render": { + "nl": "Meer informatie over de locatie (in het Frans):
{defibrillator:location:fr}", + "en": "Extra information about the location (in French):
{defibrillator:location:fr}", + "fr": "Informations supplémentaires à propos de l'emplacement (en Français) :
{defibrillator:location:fr}", + "it": "Informazioni supplementari circa la posizione (in francese):
{defibrillator:location:fr}", + "de": "Zusätzliche Informationen zum Standort (auf Französisch):
{defibrillator:location:fr}" + }, + "question": { + "en": "Please give some explanation on where the defibrillator can be found (in French)", + "ca": "Dóna detalls d'on es pot trobar el desfibril·lador", + "es": "Da detalles de dónde se puede encontrar el desfibrilador (en frances)", + "fr": "Veuillez indiquez plus précisément où se situe le défibrillateur (en français)", + "nl": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in het Frans)", + "de": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Französisch)", + "it": "Indica più precisamente dove si trova il defibrillatore (in francese)" + }, + "freeform": { + "type": "text", + "key": "defibrillator:location:fr" + }, + "id": "defibrillator-defibrillator:location:fr" + }, + "wheelchair-access", + { + "render": { + "nl": "Officieel identificatienummer van het toestel: {ref}", + "en": "Official identification number of the device: {ref}", + "fr": "Numéro d'identification officiel de ce dispositif : {ref}", + "it": "Numero identificativo ufficiale di questo dispositivo:{ref}", + "de": "Offizielle Identifikationsnummer des Geräts: {ref}" + }, + "question": { + "en": "What is the official identification number of the device? (if visible on device)", + "nl": "Wat is het officieel identificatienummer van het toestel? (indien zichtbaar op toestel)", + "fr": "Quel est le numéro d'identification officiel de ce dispositif ? (si il est visible sur le dispositif)", + "it": "Qual è il numero identificativo ufficiale di questo dispositivo? (se visibile sul dispositivo)", + "de": "Wie lautet die offizielle Identifikationsnummer des Geräts? (falls am Gerät sichtbar)" + }, + "freeform": { + "type": "text", + "key": "ref" + }, + "id": "defibrillator-ref" + }, + { + "render": { + "en": "Email for questions about this defibrillator: {email}", + "nl": "Email voor vragen over deze defibrillator: {email}", + "fr": "Adresse électronique pour des questions à propos de ce défibrillateur : {email}", + "it": "Indirizzo email per le domande su questo defibrillatore:{email}", + "de": "E-Mail für Fragen zu diesem Defibrillator: {email}" + }, + "question": { + "en": "What is the email for questions about this defibrillator?", + "nl": "Wat is het email-adres voor vragen over deze defibrillator", + "fr": "Quelle est l'adresse électronique pour des questions à propos de ce défibrillateur ?", + "it": "Qual è l’indirizzo email per le domande riguardanti questo defibrillatore?", + "de": "Wie lautet die E-Mail für Fragen zu diesem Defibrillator?" + }, + "freeform": { + "key": "email", + "type": "email" + }, + "id": "defibrillator-email" + }, + { + "render": { + "en": "Telephone for questions about this defibrillator: {phone}", + "fr": "Numéro de téléphone pour questions sur le défibrillateur : {phone}", + "nl": "Telefoonnummer voor vragen over deze defibrillator: {phone}", + "it": "Numero di telefono per le domande su questo defibrillatore:{phone}", + "de": "Telefonnummer für Fragen zu diesem Defibrillator: {phone}" + }, + "question": { + "en": "What is the phone number for questions about this defibrillator?", + "fr": "Quel est le numéro de téléphone pour questions sur le défibrillateur ?", + "nl": "Wat is het telefoonnummer voor vragen over deze defibrillator", + "it": "Qual è il numero di telefono per le domande riguardanti questo defibrillatore?", + "de": "Wie lautet die Telefonnummer für Fragen zu diesem Defibrillator?" + }, + "freeform": { + "key": "phone", + "type": "phone" + }, + "id": "defibrillator-phone" + }, + { + "render": { + "en": "{opening_hours_table(opening_hours)}", + "nl": "{opening_hours_table(opening_hours)}", + "fr": "{opening_hours_table(opening_hours)}", + "it": "{opening_hours_table(opening_hours)}", + "ru": "{opening_hours_table(opening_hours)}", + "de": "{opening_hours_table(opening_hours)}" + }, + "question": { + "en": "At what times is this defibrillator available?", + "nl": "Wanneer is deze defibrillator beschikbaar?", + "fr": "À quels horaires ce défibrillateur est-il accessible ?", + "it": "In quali orari è disponibile questo defibrillatore?", + "ru": "В какое время доступен этот дефибриллятор?", + "de": "Zu welchen Zeiten ist dieser Defibrillator verfügbar?" + }, + "freeform": { + "key": "opening_hours", + "type": "opening_hours" + }, + "mappings": [ + { + "if": "opening_hours=24/7", + "then": { + "en": "24/7 opened (including holidays)", + "nl": "24/7 open (inclusief feestdagen)", + "fr": "Ouvert 24/7 (jours feriés inclus)", + "it": "Aperto 24/7 (festivi inclusi)", + "de": "24/7 geöffnet (auch an Feiertagen)" + } + } + ], + "id": "defibrillator-opening_hours" + }, + { + "render": { + "en": "Additional information: {description}", + "nl": "Aanvullende info: {description}", + "fr": "Informations supplémentaires : {description}", + "it": "Informazioni supplementari: {description}", + "ru": "Дополнительная информация: {description}", + "de": "Zusätzliche Informationen: {description}", + "id": "Informasi tambahan: {description}" + }, + "question": { + "en": "Is there any useful information for users that you haven't been able to describe above? (leave blank if no)", + "nl": "Is er nog iets bijzonder aan deze defibrillator dat je nog niet hebt kunnen meegeven? (laat leeg indien niet)", + "fr": "Y a-t-il des informations utiles pour les utilisateurs que vous n'avez pas pu décrire ci-dessus ? (laisser vide sinon)", + "it": "Vi sono altre informazioni utili agli utenti che non è stato possibile aggiungere prima? (lasciare vuoto in caso negativo)", + "de": "Gibt es nützliche Informationen für Benutzer, die Sie oben nicht beschreiben konnten? (leer lassen, wenn nein)" + }, + "freeform": { + "key": "description", + "type": "text" + }, + "id": "defibrillator-description" + }, + { + "question": { + "en": "When was this defibrillator last surveyed?", + "nl": "Wanneer is deze defibrillator het laatst gecontroleerd in OpenStreetMap?", + "fr": "Quand le défibrillateur a-t-il été vérifié pour la dernière fois ?", + "it": "Quando è stato verificato per l’ultima volta questo defibrillatore?", + "de": "Wann wurde dieser Defibrillator zuletzt überprüft?" + }, + "render": { + "en": "This defibrillator was last surveyed on {survey:date}", + "nl": "Deze defibrillator is nagekeken in OSM op {survey:date}", + "fr": "Ce défibrillateur a été vérifié pour la dernière fois le {survey:date}", + "it": "Questo defibrillatore è stato verificato per l‘ultima volta in data {survey:date}", + "de": "Dieser Defibrillator wurde zuletzt am {survey:date} überprüft" + }, + "freeform": { + "key": "survey:date", + "type": "date" + }, + "mappings": [ + { + "if": "survey:date:={_now:date}", + "then": { + "en": "Checked today!", + "nl": "Vandaag nagekeken!", + "fr": "Vérifié aujourd'hui !", + "it": "Verificato oggi!", + "ru": "Проверено сегодня!", + "de": "Heute überprüft!" + } + } + ], + "id": "defibrillator-survey:date" + }, + { + "render": { + "en": "Extra information for OpenStreetMap experts: {fixme}", + "nl": "Extra informatie voor OpenStreetMap experts: {fixme}", + "fr": "Informations supplémentaires pour les experts d'OpenStreetMap : {fixme}", + "it": "Informazioni supplementari per gli esperti di OpenStreetMap: {fixme}", + "de": "Zusätzliche Informationen für OpenStreetMap-Experten: {fixme}", + "ru": "Дополнительная информация для экспертов OpenStreetMap: {fixme}" + }, + "question": { + "en": "Is there something wrong with how this is mapped, that you weren't able to fix here? (leave a note to OpenStreetMap experts)", + "nl": "Is er iets mis met de informatie over deze defibrillator dat je hier niet opgelost kreeg? (laat hier een berichtje achter voor OpenStreetMap experts)", + "fr": "Y a-t-il quelque chose qui ne va pas dans la manière dont ça a été cartographié, et que vous n'avez pas pu réparer ici ? (laisser une note pour les experts d'OpenStreetMap)", + "it": "C’è qualcosa di sbagliato riguardante come è stato mappato, che non si è potuto correggere qua? (lascia una nota agli esperti di OpenStreetMap)", + "de": "Gibt es einen Fehler in der Kartierung, den Sie hier nicht beheben konnten? (hinterlasse eine Notiz an OpenStreetMap-Experten)" + }, + "freeform": { + "key": "fixme", + "type": "text" + }, + "id": "defibrillator-fixme" + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:emergency:=defibrillator}", + "emergency=" + ] + }, + "neededChangesets": 5 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { "render": "./assets/themes/aed/aed.svg", "mappings": [ - { - "if": "_recently_surveyed=true", - "then": "./assets/layers/defibrillator/aed_checked.svg" - } + { + "if": "_recently_surveyed=true", + "then": "./assets/layers/defibrillator/aed_checked.svg" + } ] + }, + "location": [ + "point" + ] }, - "color": "#0000ff", - "presets": [ - { - "title": { - "en": "Defibrillator", - "ca": "Desfibril·lador", - "es": "Desfibrilador", - "fr": "Défibrillateur", - "nl": "Defibrillator", - "de": "Defibrillator", - "it": "Defibrillatore", - "ru": "Дефибриллятор" - }, - "tags": [ - "emergency=defibrillator" - ], - "preciseInput": { - "preferredBackground": "map" - } - } - ], - "tagRenderings": [ - "images", - { - "id": "defibrillator-indoors", - "question": { - "en": "Is this defibrillator located indoors?", - "ca": "Està el desfibril·lador a l'interior?", - "es": "¿Esté el desfibrilador en interior?", - "fr": "Ce défibrillateur est-il disposé en intérieur ?", - "nl": "Hangt deze defibrillator binnen of buiten?", - "de": "Befindet sich dieser Defibrillator im Gebäude?", - "it": "Questo defibrillatore si trova all’interno?" - }, - "mappings": [ - { - "if": "indoor=yes", - "then": { - "en": "This defibrillator is located indoors", - "ca": "Aquest desfibril·lador està a l'interior", - "es": "Este desfibrilador está en interior", - "fr": "Ce défibrillateur est en intérieur (dans un batiment)", - "nl": "Deze defibrillator bevindt zich in een gebouw", - "de": "Dieser Defibrillator befindet sich im Gebäude", - "it": "Questo defibrillatore si trova all’interno" - } - }, - { - "if": "indoor=no", - "then": { - "en": "This defibrillator is located outdoors", - "ca": "Aquest desfibril·lador està a l'exterior", - "es": "Este desfibrilador está en exterior", - "fr": "Ce défibrillateur est situé en extérieur", - "nl": "Deze defibrillator hangt buiten", - "de": "Dieser Defibrillator befindet sich im Freien", - "it": "Questo defibrillatore si trova all’esterno" - } - } - ] - }, - { - "question": { - "en": "Is this defibrillator freely accessible?", - "ca": "Està el desfibril·lador accessible lliurement?", - "es": "¿Está el desfibrilador accesible libremente?", - "fr": "Ce défibrillateur est-il librement accessible ?", - "nl": "Is deze defibrillator vrij toegankelijk?", - "de": "Ist dieser Defibrillator frei zugänglich?", - "it": "Questo defibrillatore è liberamente accessibile?" - }, - "render": { - "en": "Access is {access}", - "ca": "L'accés és {access}", - "es": "El acceso es {access}", - "fr": "{access} accessible", - "nl": "Toegankelijkheid is {access}", - "de": "Zugang ist {access}", - "it": "Accesso è {access}" - }, - "freeform": { - "key": "access", - "addExtraTags": [ - "fixme=Freeform field used for access - doublecheck the value" - ] - }, - "mappings": [ - { - "if": "access=yes", - "then": { - "en": "Publicly accessible", - "ca": "Accés lliure", - "es": "Acceso libre", - "fr": "Librement accessible", - "nl": "Publiek toegankelijk", - "de": "Öffentlich zugänglich", - "it": "Pubblicamente accessibile", - "ru": "Общедоступный" - } - }, - { - "if": "access=public", - "then": { - "en": "Publicly accessible", - "ca": "Publicament accessible", - "es": "Publicament accesible", - "fr": "Librement accessible", - "nl": "Publiek toegankelijk", - "de": "Öffentlich zugänglich", - "it": "Pubblicamente accessibile", - "ru": "Общедоступный" - }, - "hideInAnswer": true - }, - { - "if": "access=customers", - "then": { - "en": "Only accessible to customers", - "ca": "Només accessible a clients", - "es": "Sólo accesible a clientes", - "fr": "Réservé aux clients du lieu", - "nl": "Enkel toegankelijk voor klanten", - "de": "Nur für Kunden zugänglich", - "it": "Accessibile solo ai clienti", - "ru": "Доступно только для клиентов" - } - }, - { - "if": "access=private", - "then": { - "en": "Not accessible to the general public (e.g. only accesible to staff, the owners, ...)", - "ca": "No accessible al públic en general (ex. només accesible a treballadors, propietaris, ...)", - "es": "No accesible al público en general (ex. sólo accesible a trabajadores, propietarios, ...)", - "fr": "Non accessible au public (par exemple réservé au personnel, au propriétaire, ...)", - "nl": "Niet toegankelijk voor het publiek (bv. enkel voor personeel, de eigenaar, ...)", - "de": "Nicht für die Öffentlichkeit zugänglich (z.B. nur für das Personal, die Eigentümer, ...)", - "it": "Non accessibile al pubblico (ad esempio riservato al personale, ai proprietari, etc.)" - } - }, - { - "if": "access=no", - "then": { - "en": "Not accessible, possibly only for professional use", - "nl": "Niet toegankelijk, mogelijk enkel voor professionals", - "fr": "Pas accessible, peut-être uniquement à usage professionnel", - "it": "Non accessibile, potrebbe essere solo per uso professionale", - "de": "Nicht zugänglich, möglicherweise nur für betriebliche Nutzung" - } - } - ], - "id": "defibrillator-access" - }, - { - "render": { - "en": "There is no info about the type of device", - "nl": "Er is geen info over het soort toestel", - "fr": "Il n'y a pas d'information sur le type de dispositif", - "it": "Non vi sono informazioni riguardanti il tipo di questo dispositivo", - "de": "Es gibt keine Informationen über den Gerätetyp" - }, - "question": { - "en": "Is this a a regular automatic defibrillator or a manual defibrillator for professionals only?", - "nl": "Is dit een gewone automatische defibrillator of een manueel toestel enkel voor professionals?", - "fr": "Est-ce un défibrillateur automatique normal ou un défibrillateur manuel à usage professionnel uniquement ?", - "it": "Si tratta di un normale defibrillatore automatico o un defibrillatore manuale riservato ai professionisti?", - "de": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?" - }, - "freeform": { - "key": "defibrillator" - }, - "condition": { - "and": [ - "access=no" - ] - }, - "mappings": [ - { - "if": "defibrillator=manual", - "then": { - "en": "This is a manual defibrillator for professionals", - "nl": "Dit is een manueel toestel enkel voor professionals", - "fr": "C'est un défibrillateur manuel pour professionnel", - "it": "Questo è un defibrillatore manuale per professionisti", - "de": "Dies ist ein manueller Defibrillator für den professionellen Einsatz" - } - }, - { - "if": "defibrillator=automatic", - "then": { - "en": "This is a normal automatic defibrillator", - "nl": "Dit is een gewone automatische defibrillator", - "fr": "C'est un défibrillateur automatique manuel", - "it": "È un normale defibrillatore automatico", - "ru": "Это обычный автоматический дефибриллятор", - "de": "Dies ist ein normaler automatischer Defibrillator" - } - } - ], - "id": "defibrillator-defibrillator" - }, - { - "question": { - "en": "On which floor is this defibrillator located?", - "ca": "A quina planta està el desfibril·lador localitzat?", - "es": "¿En qué planta se encuentra el defibrilador localizado?", - "fr": "À quel étage est situé ce défibrillateur ?", - "nl": "Op welke verdieping bevindt deze defibrillator zich?", - "de": "In welchem Stockwerk befindet sich dieser Defibrillator?", - "it": "A che piano si trova questo defibrillatore?" - }, - "condition": { - "and": [ - "indoor=yes" - ] - }, - "freeform": { - "key": "level", - "type": "int" - }, - "render": { - "en": "This defibrillator is on floor {level}", - "ca": "Aquest desfibril·lador és a la planta {level}", - "es": "El desfibrilador se encuentra en la planta {level}", - "fr": "Ce défibrillateur est à l'étage {level}", - "nl": "De defibrillator bevindt zicht op verdieping {level}", - "de": "Dieser Defibrallator befindet sich im {level}. Stockwerk", - "it": "Questo defibrillatore è al piano {level}" - }, - "mappings": [ - { - "if": "level=0", - "then": { - "en": "This defibrillator is on the ground floor", - "nl": "Deze defibrillator bevindt zich gelijkvloers", - "fr": "Ce défibrillateur est au rez-de-chaussée", - "it": "Questo defibrillatore è al pian terreno", - "de": "Dieser Defibrillator befindet sich im Erdgeschoss" - } - }, - { - "if": "level=1", - "then": { - "en": "This defibrillator is on the first floor", - "nl": "Deze defibrillator is op de eerste verdieping", - "fr": "Ce défibrillateur est au premier étage", - "it": "Questo defibrillatore è al primo piano", - "de": "Dieser Defibrillator befindet sich in der ersten Etage" - } - } - ], - "id": "defibrillator-level" - }, - { - "render": { - "nl": "Meer informatie over de locatie (lokale taal):
{defibrillator:location}", - "en": "Extra information about the location (in the local languagel):
{defibrillator:location}", - "fr": "Informations supplémentaires à propos de l'emplacement (dans la langue locale) :
{defibrillator:location}", - "it": "Informazioni supplementari circa la posizione (in lingua locale):
{defibrillator:location}", - "de": "Zusätzliche Informationen über den Standort (in der Landessprache):
{defibrillator:location}" - }, - "question": { - "en": "Please give some explanation on where the defibrillator can be found (in the local language)", - "ca": "Dóna detalls d'on es pot trobar el desfibril·lador", - "es": "Da detalles de dónde se puede encontrar el desfibrilador (en el idioma local)", - "fr": "Veuillez indiquez plus précisément où se situe le défibrillateur (dans la langue local)", - "nl": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in de plaatselijke taal)", - "de": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (in der lokalen Sprache)", - "it": "Indica più precisamente dove si trova il defibrillatore (in lingua locale)" - }, - "freeform": { - "type": "text", - "key": "defibrillator:location" - }, - "id": "defibrillator-defibrillator:location" - }, - { - "render": { - "nl": "Meer informatie over de locatie (in het Engels):
{defibrillator:location:en}", - "en": "Extra information about the location (in English):
{defibrillator:location:en}", - "fr": "Informations supplémentaires à propos de l'emplacement (en anglais) :
{defibrillator:location}", - "it": "Informazioni supplementari circa la posizione (in inglese):
{defibrillator:location:en}", - "de": "Zusätzliche Informationen über den Standort (auf Englisch):
{defibrillator:location}" - }, - "question": { - "en": "Please give some explanation on where the defibrillator can be found (in English)", - "ca": "Dóna detalls d'on es pot trobar el desfibril·lador", - "es": "Da detalles de dónde se puede encontrar el desfibrilador (en ingles)", - "fr": "Veuillez indiquez plus précisément où se situe le défibrillateur (en englais)", - "nl": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in het Engels)", - "de": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Englisch)", - "it": "Indica più precisamente dove si trova il defibrillatore (in inglese)" - }, - "freeform": { - "type": "text", - "key": "defibrillator:location:en" - }, - "id": "defibrillator-defibrillator:location:en" - }, - { - "render": { - "nl": "Meer informatie over de locatie (in het Frans):
{defibrillator:location:fr}", - "en": "Extra information about the location (in French):
{defibrillator:location:fr}", - "fr": "Informations supplémentaires à propos de l'emplacement (en Français) :
{defibrillator:location}", - "it": "Informazioni supplementari circa la posizione (in francese):
{defibrillator:location:fr}", - "de": "Zusätzliche Informationen zum Standort (auf Französisch):
{defibrillator:Standort:fr}" - }, - "question": { - "en": "Please give some explanation on where the defibrillator can be found (in French)", - "ca": "Dóna detalls d'on es pot trobar el desfibril·lador", - "es": "Da detalles de dónde se puede encontrar el desfibrilador (en frances)", - "fr": "Veuillez indiquez plus précisément où se situe le défibrillateur (en français)", - "nl": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in het Frans)", - "de": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Französisch)", - "it": "Indica più precisamente dove si trova il defibrillatore (in francese)" - }, - "freeform": { - "type": "text", - "key": "defibrillator:location:fr" - }, - "id": "defibrillator-defibrillator:location:fr" - }, - "wheelchair-access", - { - "render": { - "nl": "Officieel identificatienummer van het toestel: {ref}", - "en": "Official identification number of the device: {ref}", - "fr": "Numéro d'identification officiel de ce dispositif : {ref}", - "it": "Numero identificativo ufficiale di questo dispositivo:{ref}", - "de": "Offizielle Identifikationsnummer des Geräts: {ref}" - }, - "question": { - "en": "What is the official identification number of the device? (if visible on device)", - "nl": "Wat is het officieel identificatienummer van het toestel? (indien zichtbaar op toestel)", - "fr": "Quel est le numéro d'identification officiel de ce dispositif ? (si il est visible sur le dispositif)", - "it": "Qual è il numero identificativo ufficiale di questo dispositivo? (se visibile sul dispositivo)", - "de": "Wie lautet die offizielle Identifikationsnummer des Geräts? (falls am Gerät sichtbar)" - }, - "freeform": { - "type": "text", - "key": "ref" - }, - "id": "defibrillator-ref" - }, - { - "render": { - "en": "Email for questions about this defibrillator: {email}", - "nl": "Email voor vragen over deze defibrillator: {email}", - "fr": "Adresse électronique pour des questions à propos de ce défibrillateur : {email}", - "it": "Indirizzo email per le domande su questo defibrillatore:{email}", - "de": "E-Mail für Fragen zu diesem Defibrillator: {email}" - }, - "question": { - "en": "What is the email for questions about this defibrillator?", - "nl": "Wat is het email-adres voor vragen over deze defibrillator", - "fr": "Quelle est l'adresse électronique pour des questions à propos de ce défibrillateur ?", - "it": "Qual è l’indirizzo email per le domande riguardanti questo defibrillatore?", - "de": "Wie lautet die E-Mail für Fragen zu diesem Defibrillator?" - }, - "freeform": { - "key": "email", - "type": "email" - }, - "id": "defibrillator-email" - }, - { - "render": { - "en": "Telephone for questions about this defibrillator: {phone}", - "fr": "Numéro de téléphone pour questions sur le défibrillateur : {phone}", - "nl": "Telefoonnummer voor vragen over deze defibrillator: {phone}", - "it": "Numero di telefono per le domande su questo defibrillatore:{phone}", - "de": "Telefonnummer für Fragen zu diesem Defibrillator: {phone}" - }, - "question": { - "en": "What is the phone number for questions about this defibrillator?", - "fr": "Quel est le numéro de téléphone pour questions sur le défibrillateur ?", - "nl": "Wat is het telefoonnummer voor vragen over deze defibrillator", - "it": "Qual è il numero di telefono per le domande riguardanti questo defibrillatore?", - "de": "Wie lautet die Telefonnummer für Fragen zu diesem Defibrillator?" - }, - "freeform": { - "key": "phone", - "type": "phone" - }, - "id": "defibrillator-phone" - }, - { - "render": { - "en": "{opening_hours_table(opening_hours)}", - "nl": "{opening_hours_table(opening_hours)}", - "fr": "{opening_hours_table(opening_hours)}", - "it": "{opening_hours_table(opening_hours)}", - "ru": "{opening_hours_table(opening_hours)}", - "de": "{opening_hours_table(opening_hours)}" - }, - "question": { - "en": "At what times is this defibrillator available?", - "nl": "Wanneer is deze defibrillator beschikbaar?", - "fr": "À quels horaires ce défibrillateur est-il accessible ?", - "it": "In quali orari è disponibile questo defibrillatore?", - "ru": "В какое время доступен этот дефибриллятор?", - "de": "Zu welchen Zeiten ist dieser Defibrillator verfügbar?" - }, - "freeform": { - "key": "opening_hours", - "type": "opening_hours" - }, - "mappings": [ - { - "if": "opening_hours=24/7", - "then": { - "en": "24/7 opened (including holidays)", - "nl": "24/7 open (inclusief feestdagen)", - "fr": "Ouvert 24/7 (jours feriés inclus)", - "it": "Aperto 24/7 (festivi inclusi)", - "de": "24/7 geöffnet (auch an Feiertagen)" - } - } - ], - "id": "defibrillator-opening_hours" - }, - { - "render": { - "en": "Additional information: {description}", - "nl": "Aanvullende info: {description}", - "fr": "Informations supplémentaires : {description}", - "it": "Informazioni supplementari: {description}", - "ru": "Дополнительная информация: {description}", - "de": "Zusätzliche Informationen: {description}", - "id": "Informasi tambahan: {description}" - }, - "question": { - "en": "Is there any useful information for users that you haven't been able to describe above? (leave blank if no)", - "nl": "Is er nog iets bijzonder aan deze defibrillator dat je nog niet hebt kunnen meegeven? (laat leeg indien niet)", - "fr": "Y a-t-il des informations utiles pour les utilisateurs que vous n'avez pas pu décrire ci-dessus ? (laisser vide sinon)", - "it": "Vi sono altre informazioni utili agli utenti che non è stato possibile aggiungere prima? (lasciare vuoto in caso negativo)", - "de": "Gibt es nützliche Informationen für Benutzer, die Sie oben nicht beschreiben konnten? (leer lassen, wenn nein)" - }, - "freeform": { - "key": "description", - "type": "text" - }, - "id": "defibrillator-description" - }, - { - "question": { - "en": "When was this defibrillator last surveyed?", - "nl": "Wanneer is deze defibrillator het laatst gecontroleerd in OpenStreetMap?", - "fr": "Quand le défibrillateur a-t-il été vérifié pour la dernière fois ?", - "it": "Quando è stato verificato per l’ultima volta questo defibrillatore?", - "de": "Wann wurde dieser Defibrillator zuletzt überprüft?" - }, - "render": { - "en": "This defibrillator was last surveyed on {survey:date}", - "nl": "Deze defibrillator is nagekeken in OSM op {survey:date}", - "fr": "Ce défibrillateur a été vérifié pour la dernière fois le {survey:date}", - "it": "Questo defibrillatore è stato verificato per l‘ultima volta in data {survey:date}", - "de": "Dieser Defibrillator wurde zuletzt am {survey:date} überprüft" - }, - "freeform": { - "key": "survey:date", - "type": "date" - }, - "mappings": [ - { - "if": "survey:date:={_now:date}", - "then": { - "en": "Checked today!", - "nl": "Vandaag nagekeken!", - "fr": "Vérifié aujourd'hui !", - "it": "Verificato oggi!", - "ru": "Проверено сегодня!", - "de": "Heute überprüft!" - } - } - ], - "id": "defibrillator-survey:date" - }, - { - "render": { - "en": "Extra information for OpenStreetMap experts: {fixme}", - "nl": "Extra informatie voor OpenStreetMap experts: {fixme}", - "fr": "Informations supplémentaires pour les experts d'OpenStreetMap : {fixme}", - "it": "Informazioni supplementari per gli esperti di OpenStreetMap: {fixme}", - "de": "Zusätzliche Informationen für OpenStreetMap-Experten: {fixme}", - "ru": "Дополнительная информация для экспертов OpenStreetMap: {fixme}" - }, - "question": { - "en": "Is there something wrong with how this is mapped, that you weren't able to fix here? (leave a note to OpenStreetMap experts)", - "nl": "Is er iets mis met de informatie over deze defibrillator dat je hier niet opgelost kreeg? (laat hier een berichtje achter voor OpenStreetMap experts)", - "fr": "Y a-t-il quelque chose qui ne va pas dans la manière dont ça a été cartographié, et que vous n'avez pas pu réparer ici ? (laisser une note pour les experts d'OpenStreetMap)", - "it": "C’è qualcosa di sbagliato riguardante come è stato mappato, che non si è potuto correggere qua? (lascia una nota agli esperti di OpenStreetMap)", - "de": "Gibt es einen Fehler in der Kartierung, den Sie hier nicht beheben konnten? (hinterlasse eine Notiz an OpenStreetMap-Experten)" - }, - "freeform": { - "key": "fixme", - "type": "text" - }, - "id": "defibrillator-fixme" - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:emergency:=defibrillator}", - "emergency=" - ] - }, - "neededChangesets": 5 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + { + "color": "#0000ff" } + ] } \ No newline at end of file diff --git a/assets/layers/direction/direction.json b/assets/layers/direction/direction.json index 75cd375c25..c60322d116 100644 --- a/assets/layers/direction/direction.json +++ b/assets/layers/direction/direction.json @@ -1,49 +1,58 @@ { - "id": "direction", - "name": { - "en": "Direction visualization", - "nl": "Richtingsvisualisatie", - "fr": "Visualisation de la direction", - "it": "Visualizzazione della direzione", - "ru": "Визуализация направления", - "de": "Visualisierung der Richtung" - }, - "minzoom": 16, - "source": { - "osmTags": { - "or": [ - "camera:direction~*", - "direction~*" - ] - } - }, - "doNotDownload": true, - "passAllFeatures": true, - "title": null, - "description": { - "en": "This layer visualizes directions", - "nl": "Deze laag toont de oriëntatie van een object", - "fr": "Cette couche visualise les directions", - "it": "Questo livello visualizza le direzioni", - "de": "Diese Ebene visualisiert Richtungen" - }, - "tagRenderings": [], - "icon": { + "id": "direction", + "name": { + "en": "Direction visualization", + "nl": "Richtingsvisualisatie", + "fr": "Visualisation de la direction", + "it": "Visualizzazione della direzione", + "ru": "Визуализация направления", + "de": "Visualisierung der Richtung" + }, + "minzoom": 16, + "source": { + "osmTags": { + "or": [ + "camera:direction~*", + "direction~*" + ] + } + }, + "doNotDownload": true, + "passAllFeatures": true, + "title": null, + "description": { + "en": "This layer visualizes directions", + "nl": "Deze laag toont de oriëntatie van een object", + "fr": "Cette couche visualise les directions", + "it": "Questo livello visualizza le direzioni", + "de": "Diese Ebene visualisiert Richtungen" + }, + "tagRenderings": [], + "stroke": "0", + "presets": [], + "mapRendering": [ + { + "icon": { "render": "direction_gradient:var(--catch-detail-color)", "#": "For some weird reason, showing the icon in the layer control panel breaks the svg-gradient (because the svg gradient has a global color or smthng) - so we use a different icon without gradient", "mappings": [ - { - "if": "id=node/-1", - "then": "direction:var(--catch-detail-color)" - } + { + "if": "id=node/-1", + "then": "direction:var(--catch-detail-color)" + } ] - }, - "rotation": { + }, + "iconSize": "200,200,center", + "location": [ + "point", + "centroid" + ], + "rotation": { "render": "{_direction:numerical}deg" + } }, - "iconSize": "200,200,center", - "color": "--catch-detail-color", - "stroke": "0", - "presets": [], - "wayHandling": 2 + { + "color": "--catch-detail-color" + } + ] } \ No newline at end of file diff --git a/assets/layers/drinking_water/drinking_water.json b/assets/layers/drinking_water/drinking_water.json index 1170a823e4..5afb438e3d 100644 --- a/assets/layers/drinking_water/drinking_water.json +++ b/assets/layers/drinking_water/drinking_water.json @@ -1,186 +1,191 @@ { - "id": "drinking_water", - "name": { - "en": "Drinking water", - "nl": "Drinkbaar water", - "fr": "Eau potable", - "gl": "Auga potábel", - "de": "Trinkwasserstelle", - "it": "Acqua potabile", - "ru": "Питьевая вода", - "id": "Air minum" - }, - "title": { - "render": { - "en": "Drinking water", - "nl": "Drinkbaar water", - "fr": "Eau potable", - "gl": "Auga potábel", - "de": "Trinkwasserstelle", - "it": "Acqua potabile", - "ru": "Питьевая вода", - "id": "Air minum" - } - }, - "icon": { - "render": "pin:#6BC4F7;./assets/layers/drinking_water/drips.svg" - }, - "iconOverlays": [ - { - "if": { - "or": [ - "operational_status=broken", - "operational_status=closed" - ] - }, - "then": "close:#c33", - "badge": true - } - ], - "iconSize": "40,40,bottom", - "source": { - "osmTags": { - "and": [ - "amenity=drinking_water", - "access!=permissive", - "access!=private" - ] - } - }, - "calculatedTags": [ - "_closest_other_drinking_water=feat.closestn('drinking_water', 1, undefined, 5000).map(f => ({id: f.feat.id, distance: ''+f.distance}))[0]", - "_closest_other_drinking_water_id=JSON.parse(feat.properties._closest_other_drinking_water)?.id", - "_closest_other_drinking_water_distance=Math.floor(Number(JSON.parse(feat.properties._closest_other_drinking_water)?.distance) * 1000)" - ], - "minzoom": 13, - "wayHandling": 1, - "presets": [ - { - "title": { - "en": "drinking water", - "nl": "drinkbaar water", - "fr": "eau potable", - "gl": "auga potábel", - "de": "Trinkwasserstelle", - "it": "acqua potabile", - "ru": "питьевая вода", - "id": "air minum" - }, - "tags": [ - "amenity=drinking_water" - ] - } - ], - "color": "#6bc4f7", - "tagRenderings": [ - "images", - { - "question": { - "en": "Is this drinking water spot still operational?", - "nl": "Is deze drinkwaterkraan nog steeds werkende?", - "it": "Questo punto di acqua potabile è sempre funzionante?", - "fr": "Ce point d'eau potable est-il toujours opérationnel ?", - "de": "Ist diese Trinkwasserstelle noch in Betrieb?" - }, - "render": { - "en": "The operational status is {operational_status", - "nl": "Deze waterkraan-status is {operational_status}", - "it": "Lo stato operativo è {operational_status}", - "fr": "L'état opérationnel est {operational_status", - "de": "Der Betriebsstatus ist {operational_status" - }, - "freeform": { - "key": "operational_status" - }, - "mappings": [ - { - "if": "operational_status=", - "then": { - "en": "This drinking water works", - "nl": "Deze drinkwaterfontein werkt", - "it": "La fontanella funziona", - "fr": "Cette fontaine fonctionne", - "de": "Diese Trinkwasserstelle funktioniert" - } - }, - { - "if": "operational_status=broken", - "then": { - "en": "This drinking water is broken", - "nl": "Deze drinkwaterfontein is kapot", - "it": "La fontanella è guasta", - "fr": "Cette fontaine est cassée", - "de": "Diese Trinkwasserstelle ist kaputt" - } - }, - { - "if": "operational_status=closed", - "then": { - "en": "This drinking water is closed", - "nl": "Deze drinkwaterfontein is afgesloten", - "it": "La fontanella è chiusa", - "fr": "Cette fontaine est fermée", - "de": "Diese Trinkwasserstelle wurde geschlossen" - } - } - ], - "id": "Still in use?" - }, - { - "question": { - "en": "How easy is it to fill water bottles?", - "nl": "Hoe gemakkelijk is het om drinkbussen bij te vullen?", - "de": "Wie einfach ist es, Wasserflaschen zu füllen?", - "it": "Quanto è facile riempire d’acqua le bottiglie?", - "fr": "Est-il facile de remplir des bouteilles d'eau ?" - }, - "mappings": [ - { - "if": "bottle=yes", - "then": { - "en": "It is easy to refill water bottles", - "nl": "Een drinkbus bijvullen gaat makkelijk", - "de": "Es ist einfach, Wasserflaschen nachzufüllen", - "it": "È facile riempire d’acqua le bottiglie", - "fr": "Il est facile de remplir les bouteilles d'eau" - } - }, - { - "if": "bottle=no", - "then": { - "en": "Water bottles may not fit", - "nl": "Een drinkbus past moeilijk", - "de": "Wasserflaschen passen möglicherweise nicht", - "it": "Le bottiglie d’acqua potrebbero non entrare", - "fr": "Les bouteilles d'eau peuvent ne pas passer" - } - } - ], - "id": "Bottle refill" - }, - { - "id": "render-closest-drinking-water", - "render": { - "en": "There is another drinking water fountain at {_closest_other_drinking_water_distance} meter", - "nl": "Er bevindt zich een ander drinkwaterpunt op {_closest_other_drinking_water_distance} meter", - "it": "C’è un’altra fontanella a {_closest_other_drinking_water_distance} metri", - "de": "Eine weitere Trinkwasserstelle liegt {_closest_other_drinking_water_distance} Meter entfernt", - "fr": "Une autre source d’eau potable est à {_closest_other_drinking_water_distance} mètres a>" - }, - "condition": "_closest_other_drinking_water_id~*" - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity:={amenity}", - "amenity=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + "id": "drinking_water", + "name": { + "en": "Drinking water", + "nl": "Drinkbaar water", + "fr": "Eau potable", + "gl": "Auga potábel", + "de": "Trinkwasserstelle", + "it": "Acqua potabile", + "ru": "Питьевая вода", + "id": "Air minum" + }, + "title": { + "render": { + "en": "Drinking water", + "nl": "Drinkbaar water", + "fr": "Eau potable", + "gl": "Auga potábel", + "de": "Trinkwasserstelle", + "it": "Acqua potabile", + "ru": "Питьевая вода", + "id": "Air minum" } + }, + "source": { + "osmTags": { + "and": [ + "amenity=drinking_water", + "access!=permissive", + "access!=private" + ] + } + }, + "calculatedTags": [ + "_closest_other_drinking_water=feat.closestn('drinking_water', 1, undefined, 5000).map(f => ({id: f.feat.id, distance: ''+f.distance}))[0]", + "_closest_other_drinking_water_id=JSON.parse(feat.properties._closest_other_drinking_water)?.id", + "_closest_other_drinking_water_distance=Math.floor(Number(JSON.parse(feat.properties._closest_other_drinking_water)?.distance) * 1000)" + ], + "minzoom": 13, + "presets": [ + { + "title": { + "en": "drinking water", + "nl": "drinkbaar water", + "fr": "eau potable", + "gl": "auga potábel", + "de": "trinkwasser", + "it": "acqua potabile", + "ru": "питьевая вода", + "id": "air minum" + }, + "tags": [ + "amenity=drinking_water" + ] + } + ], + "tagRenderings": [ + "images", + { + "question": { + "en": "Is this drinking water spot still operational?", + "nl": "Is deze drinkwaterkraan nog steeds werkende?", + "it": "Questo punto di acqua potabile è sempre funzionante?", + "fr": "Ce point d'eau potable est-il toujours opérationnel ?", + "de": "Ist diese Trinkwasserstelle noch in Betrieb?" + }, + "render": { + "en": "The operational status is {operational_status}", + "nl": "Deze waterkraan-status is {operational_status}", + "it": "Lo stato operativo è {operational_status}", + "fr": "L'état opérationnel est {operational_status}", + "de": "Der Betriebsstatus ist {operational_status}/i>" + }, + "freeform": { + "key": "operational_status" + }, + "mappings": [ + { + "if": "operational_status=", + "then": { + "en": "This drinking water works", + "nl": "Deze drinkwaterfontein werkt", + "it": "La fontanella funziona", + "fr": "Cette fontaine fonctionne", + "de": "Diese Trinkwasserstelle funktioniert" + } + }, + { + "if": "operational_status=broken", + "then": { + "en": "This drinking water is broken", + "nl": "Deze drinkwaterfontein is kapot", + "it": "La fontanella è guasta", + "fr": "Cette fontaine est cassée", + "de": "Diese Trinkwasserstelle ist kaputt" + } + }, + { + "if": "operational_status=closed", + "then": { + "en": "This drinking water is closed", + "nl": "Deze drinkwaterfontein is afgesloten", + "it": "La fontanella è chiusa", + "fr": "Cette fontaine est fermée", + "de": "Diese Trinkwasserstelle wurde geschlossen" + } + } + ], + "id": "Still in use?" + }, + { + "question": { + "en": "How easy is it to fill water bottles?", + "nl": "Hoe gemakkelijk is het om drinkbussen bij te vullen?", + "de": "Wie einfach ist es, Wasserflaschen zu füllen?", + "it": "Quanto è facile riempire d’acqua le bottiglie?", + "fr": "Est-il facile de remplir des bouteilles d'eau ?" + }, + "mappings": [ + { + "if": "bottle=yes", + "then": { + "en": "It is easy to refill water bottles", + "nl": "Een drinkbus bijvullen gaat makkelijk", + "de": "Es ist einfach, Wasserflaschen nachzufüllen", + "it": "È facile riempire d’acqua le bottiglie", + "fr": "Il est facile de remplir les bouteilles d'eau" + } + }, + { + "if": "bottle=no", + "then": { + "en": "Water bottles may not fit", + "nl": "Een drinkbus past moeilijk", + "de": "Wasserflaschen passen möglicherweise nicht", + "it": "Le bottiglie d’acqua potrebbero non entrare", + "fr": "Les bouteilles d'eau peuvent ne pas passer" + } + } + ], + "id": "Bottle refill" + }, + { + "id": "render-closest-drinking-water", + "render": { + "en": "There is another drinking water fountain at {_closest_other_drinking_water_distance} meter", + "nl": "Er bevindt zich een ander drinkwaterpunt op {_closest_other_drinking_water_distance} meter", + "it": "C’è un’altra fontanella a {_closest_other_drinking_water_distance} metri", + "de": "Ein weiterer Trinkwasserbrunnen befindet sich in {_closest_other_drinking_water_distance} Meter", + "fr": "Une autre source d’eau potable est à {_closest_other_drinking_water_distance} mètres a>" + }, + "condition": "_closest_other_drinking_water_id~*" + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity:={amenity}", + "amenity=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { + "render": "pin:#6BC4F7;./assets/layers/drinking_water/drips.svg" + }, + "iconBadges": [ + { + "if": { + "or": [ + "operational_status=broken", + "operational_status=closed" + ] + }, + "then": "close:#c33" + } + ], + "iconSize": "40,40,bottom", + "location": [ + "point", + "centroid" + ] + } + ] } \ No newline at end of file diff --git a/assets/layers/etymology/etymology.json b/assets/layers/etymology/etymology.json index 9af75d3f94..e9645a4bb0 100644 --- a/assets/layers/etymology/etymology.json +++ b/assets/layers/etymology/etymology.json @@ -1,176 +1,186 @@ { - "id": "etymology", - "#": "A layer showing all objects having etymology info (either via `name:etymology:wikidata` or `name:etymology`. The intention is that this layer is reused for a certain category to also _ask_ for information", - "name": { - "en": "Has etymolgy", - "nl": "Heeft etymology info", - "de": "Hat eine Namensherkunft" + "id": "etymology", + "#": "A layer showing all objects having etymology info (either via `name:etymology:wikidata` or `name:etymology`. The intention is that this layer is reused for a certain category to also _ask_ for information", + "name": { + "en": "Has etymolgy", + "nl": "Heeft etymology info", + "de": "Hat eine Namensherkunft" + }, + "minzoom": 12, + "source": { + "osmTags": { + "or": [ + "name:etymology:wikidata~*", + "name:etymology~*" + ] + } + }, + "title": { + "render": { + "*": "{name}" + } + }, + "description": { + "en": "All objects which have an etymology known", + "nl": "Alle lagen met een gelinkt etymology", + "de": "Alle Objekte, die eine bekannte Namensherkunft haben" + }, + "calculatedTags": [ + "_same_name_ids=feat.closestn('*', 250, undefined, 2500)?.filter(f => f.feat.properties.name === feat.properties.name)?.map(f => f.feat.properties.id)??[]" + ], + "tagRenderings": [ + { + "id": "etymology-images-from-wikipedia", + "render": { + "*": "{image_carousel(name:etymology:wikidata)}" + } }, - "minzoom": 12, - "source": { - "osmTags": { - "or": [ - "name:etymology:wikidata~*", - "name:etymology~*" + { + "id": "wikipedia-etymology", + "question": { + "en": "What is the Wikidata-item that this object is named after?", + "nl": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?", + "de": "Was ist das Wikidata-Element, nach dem dieses Objekt benannt ist?" + }, + "freeform": { + "key": "name:etymology:wikidata", + "type": "wikidata", + "helperArgs": [ + "name", + { + "removePostfixes": [ + "steenweg", + "heirbaan", + "baan", + "straat", + "street", + "weg", + "dreef", + "laan", + "boulevard", + "pad", + "path", + "plein", + "square", + "plaza", + "wegel", + "kerk", + "church", + "kaai" ] + } + ] + }, + "render": { + "en": "

Wikipedia article of the name giver

{wikipedia(name:etymology:wikidata):max-height:20rem}", + "nl": "

Wikipedia artikel van de naamgever

{wikipedia(name:etymology:wikidata):max-height:20rem}", + "de": "

Wikipedia Artikel zur Namensherkunft

{wikipedia(name:etymology:wikidata):max-height:20rem}" + }, + "condition": "name:etymology!=unknown" + }, + { + "id": "zoeken op inventaris onroerend erfgoed", + "render": { + "nl": "
Zoeken op inventaris onroerend erfgoed", + "en": "Search on inventaris onroerend erfgoed" + }, + "conditions": "_country=be" + }, + { + "id": "simple etymology", + "question": { + "en": "What is this object named after?
This might be written on the street name sign", + "nl": "Naar wat is dit object vernoemd?
Dit staat mogelijks vermeld op het straatnaambordje", + "de": "Wonach ist dieses Objekt benannt?
Das könnte auf einem Straßenschild stehen" + }, + "render": { + "en": "Named after {name:etymology}", + "nl": "Vernoemd naar {name:etymology}", + "de": "Benannt nach {name:etymology}" + }, + "freeform": { + "key": "name:etymology" + }, + "mappings": [ + { + "if": "name:etymology=unknown", + "then": { + "en": "The origin of this name is unknown in all literature", + "nl": "De oorsprong van deze naam is onbekend in de literatuur", + "de": "Der Ursprung dieses Namens ist in der gesamten Literatur unbekannt" + } } + ], + "condition": { + "or": [ + "name:etymology~*", + "name:etymology:wikidata=" + ] + } }, - "title": { - "render": { - "*": "{name}" - } + "questions", + { + "id": "street-name-sign-image", + "render": { + "en": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Add image of a street name sign)}", + "nl": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Voeg afbeelding van straatnaambordje toe)}" + } }, - "description": { - "en": "All objects which have an etymology known", - "nl": "Alle lagen met een gelinkt etymology", - "de": "Alle Objekte, die eine bekannte Namensherkunft haben" + { + "id": "minimap", + "render": { + "*": "{minimap(18, id, _same_name_ids):height:10rem}" + } }, - "calculatedTags": [ - "_same_name_ids=feat.closestn('*', 250, undefined, 2500)?.filter(f => f.feat.properties.name === feat.properties.name)?.map(f => f.feat.properties.id)??[]" - ], - "tagRenderings": [ - { - "id": "etymology-images-from-wikipedia", - "render": { - "*": "{image_carousel(name:etymology:wikidata)}" - } - }, - { - "id": "wikipedia-etymology", - "question": { - "en": "What is the Wikidata-item that this object is named after?", - "nl": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?", - "de": "Was ist das Wikidata-Element, nach dem dieses Objekt benannt ist?" - }, - "freeform": { - "key": "name:etymology:wikidata", - "type": "wikidata", - "helperArgs": [ - "name", - { - "removePostfixes": [ - "steenweg", - "heirbaan", - "baan", - "straat", - "street", - "weg", - "dreef", - "laan", - "boulevard", - "pad", - "path", - "plein", - "square", - "plaza", - "wegel", - "kerk", - "church", - "kaai" - ] - } - ] - }, - "render": { - "en": "

Wikipedia article of the name giver

{wikipedia(name:etymology:wikidata):max-height:20rem}", - "nl": "

Wikipedia artikel van de naamgever

{wikipedia(name:etymology:wikidata):max-height:20rem}", - "de": "

Wikipedia Artikel zur Namensherkunft

{wikipedia(name:etymology:wikidata):max-height:20rem}" - }, - "condition": "name:etymology!=unknown" - }, - { - "id": "zoeken op inventaris onroerend erfgoed", - "render": { - "nl": "Zoeken op inventaris onroerend erfgoed", - "en": "Search on inventaris onroerend erfgoed" - }, - "conditions": "_country=be" - }, - { - "id": "simple etymology", - "question": { - "en": "What is this object named after?
This might be written on the street name sign", - "nl": "Naar wat is dit object vernoemd?
Dit staat mogelijks vermeld op het straatnaambordje", - "de": "Wonach ist dieses Objekt benannt?
Das könnte auf einem Straßenschild stehen" - }, - "render": { - "en": "Named after {name:etymology}", - "nl": "Vernoemd naar {name:etymology}", - "de": "Benannt nach {name:etymology}" - }, - "freeform": { - "key": "name:etymology" - }, - "mappings": [ - { - "if": "name:etymology=unknown", - "then": { - "en": "The origin of this name is unknown in all literature", - "nl": "De oorsprong van deze naam is onbekend in de literatuur", - "de": "Der Ursprung dieses Namens ist in der gesamten Literatur unbekannt" - } - } - ], - "condition": { - "or": [ - "name:etymology~*", - "name:etymology:wikidata=" - ] - } - }, - { - "id": "street-name-sign-image", - "render": { - "en": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Add image of a street name sign)}", - "nl": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Voeg afbeelding van straatnaambordje toe)}" - } - }, - { - "id": "minimap", - "render": { - "*": "{minimap(18, id, _same_name_ids):height:10rem}" - } - }, - { - "id": "etymology_multi_apply", - "render": { - "en": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Auto-applying data on all segments with the same name, true)}" - } - }, - "wikipedia" - ], - "icon": { + { + "id": "etymology_multi_apply", + "render": { + "en": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Auto-applying data on all segments with the same name, true)}" + } + }, + "wikipedia" + ], + "mapRendering": [ + { + "icon": { "render": "pin:#05d7fcaa;./assets/layers/etymology/logo.svg", "mappings": [ - { - "if": { - "and": [ - "name:etymology=", - "name:etymology:wikidata=" - ] - }, - "then": "pin:#fcca05aa;./assets/layers/etymology/logo.svg" - } + { + "if": { + "and": [ + "name:etymology=", + "name:etymology:wikidata=" + ] + }, + "then": "pin:#fcca05aa;./assets/layers/etymology/logo.svg" + } ] - }, - "width": { - "render": "8" - }, - "iconSize": { + }, + "iconSize": { "render": "40,40,center" + }, + "location": [ + "point" + ] }, - "color": { + { + "color": { "render": "#05d7fcaa", "mappings": [ - { - "if": { - "and": [ - "name:etymology=", - "name:etymology:wikidata=" - ] - }, - "then": "#fcca05aa" - } + { + "if": { + "and": [ + "name:etymology=", + "name:etymology:wikidata=" + ] + }, + "then": "#fcca05aa" + } ] + }, + "width": { + "render": "8" + } } + ] } \ No newline at end of file diff --git a/assets/layers/etymology/logo.svg b/assets/layers/etymology/logo.svg index 6d6c9a0f64..bb88d30403 100644 --- a/assets/layers/etymology/logo.svg +++ b/assets/layers/etymology/logo.svg @@ -2,106 +2,105 @@ - - - - - - image/svg+xml - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="31.41128mm" + height="21.6535mm" + viewBox="0 0 31.41128 21.6535" + version="1.1" + id="svg8" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="logo.svg"> + + + + + + image/svg+xml + + + + + + - - - - - - - - - - + transform="matrix(0.21233122,0,0,0.21233122,6.7520733,38.096318)" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" + id="flowRoot10"> + + + + + + + + + + + + - - diff --git a/assets/layers/food/food.json b/assets/layers/food/food.json index 4d663408d8..260d281ad5 100644 --- a/assets/layers/food/food.json +++ b/assets/layers/food/food.json @@ -1,673 +1,679 @@ { - "id": "food", - "name": { - "nl": "Eetgelegenheden", - "en": "Restaurants and fast food", - "de": "Restaurants und Fast Food" + "id": "food", + "name": { + "nl": "Eetgelegenheden", + "en": "Restaurants and fast food", + "de": "Restaurants und Fast Food" + }, + "source": { + "osmTags": { + "or": [ + "amenity=fast_food", + "amenity=restaurant" + ] + } + }, + "minzoom": 12, + "presets": [ + { + "title": { + "en": "restaurant", + "nl": "restaurant", + "ru": "ресторан", + "de": "Restaurant" + }, + "tags": [ + "amenity=restaurant" + ], + "description": { + "nl": "Een eetgegelegenheid waar je aan tafel wordt bediend", + "en": "A formal eating place with sit-down facilities selling full meals served by waiters", + "de": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden" + }, + "preciseInput": { + "preferredBackground": "map" + } }, - "source": { - "osmTags": { - "or": [ - "amenity=fast_food", - "amenity=restaurant" - ] + { + "title": { + "en": "fastfood", + "nl": "fastfood-zaak", + "ru": "быстрое питание", + "de": "Schnellimbiss" + }, + "tags": [ + "amenity=fast_food" + ], + "description": { + "nl": "Een zaak waar je snel bediend wordt, vaak met de focus op afhalen. Zitgelegenheid is eerder beperkt (of zelfs afwezig)", + "en": "A food business concentrating on fast counter-only service and take-away food", + "de": "Ein Lebensmittelunternehmen, das sich auf schnellen Thekendienst und Essen zum Mitnehmen konzentriert" + }, + "preciseInput": { + "preferredBackground": "map" + } + }, + { + "title": { + "en": "fries shop", + "nl": "frituur", + "de": "Pommesbude" + }, + "tags": [ + "amenity=fast_food", + "cuisine=friture" + ], + "description": { + "nl": "Een fastfood-zaak waar je frieten koopt" + }, + "preciseInput": { + "preferredBackground": "map" + } + } + ], + "title": { + "render": { + "nl": "Eetgelegenheid" + }, + "mappings": [ + { + "if": { + "and": [ + "name~*", + "amenity=restaurant" + ] + }, + "then": { + "nl": "Restaurant {name}", + "en": "Restaurant {name}", + "de": "Restaurant {name}" } + }, + { + "if": { + "and": [ + "name~*", + "amenity=fast_food" + ] + }, + "then": { + "nl": "Fastfood-zaak {name}", + "en": "Fastfood {name}", + "de": "Schnellrestaurant{name}" + } + } + ] + }, + "tagRenderings": [ + "images", + { + "question": { + "nl": "Wat is de naam van deze eetgelegenheid?", + "en": "What is the name of this restaurant?", + "de": "Wie heißt dieses Restaurant?" + }, + "render": { + "nl": "De naam van deze eetgelegeheid is {name}", + "en": "The name of this restaurant is {name}", + "de": "Das Restaurant heißt {name}" + }, + "freeform": { + "key": "name" + }, + "id": "Name" }, - "minzoom": 12, - "wayHandling": 1, - "icon": { + { + "question": { + "en": "What type of business is this?", + "nl": "Wat voor soort zaak is dit?", + "de": "Um was für ein Geschäft handelt es sich?" + }, + "mappings": [ + { + "if": "amenity=fast_food", + "then": { + "nl": "Dit is een fastfood-zaak. De focus ligt op snelle bediening, zitplaatsen zijn vaak beperkt en functioneel" + } + }, + { + "if": "amenity=restaurant", + "then": { + "nl": "Dit is een restaurant. De focus ligt op een aangename ervaring waar je aan tafel wordt bediend" + } + } + ], + "id": "Fastfood vs restaurant" + }, + "opening_hours", + "website", + "email", + "phone", + "payment-options", + "wheelchair-access", + { + "question": { + "nl": "Welk soort gerechten worden hier geserveerd?", + "en": "Which food is served here?", + "de": "Welches Essen gibt es hier?" + }, + "render": { + "nl": "Deze plaats serveert vooral {cuisine}", + "en": "This place mostly serves {cuisine}", + "de": "An diesem Ort gibt es hauptsächlich {cuisine}" + }, + "freeform": { + "key": "cuisine", + "addExtraTags": [ + "fixme=Freeform tag `cuisine` used, to be doublechecked" + ] + }, + "mappings": [ + { + "if": "cuisine=pizza", + "then": { + "en": "This is a pizzeria", + "nl": "Dit is een pizzeria", + "de": "Dies ist eine Pizzeria" + } + }, + { + "if": "cuisine=friture", + "then": { + "en": "This is a friture", + "nl": "Dit is een frituur", + "de": "Dies ist eine Pommesbude" + } + }, + { + "if": "cuisine=pasta", + "then": { + "en": "Mainly serves pasta", + "nl": "Dit is een pastazaak", + "de": "Bietet vorwiegend Pastagerichte an" + } + }, + { + "if": "cuisine=kebab", + "then": { + "nl": "Dit is een kebabzaak" + } + }, + { + "if": "cuisine=sandwich", + "then": { + "nl": "Dit is een broodjeszaak" + } + }, + { + "if": "cuisine=burger", + "then": { + "nl": "Dit is een hamburgerrestaurant" + } + }, + { + "if": "cuisine=sushi", + "then": { + "nl": "Dit is een sushirestaurant" + } + }, + { + "if": "cuisine=coffee", + "then": { + "nl": "Dit is een koffiezaak" + } + }, + { + "if": "cuisine=italian", + "then": { + "nl": "Dit is een Italiaans restaurant (dat meer dan enkel pasta of pizza verkoopt)" + } + }, + { + "if": "cuisine=french", + "then": { + "nl": "Dit is een Frans restaurant" + } + }, + { + "if": "cuisine=chinese", + "then": { + "nl": "Dit is een Chinees restaurant" + } + }, + { + "if": "cuisine=greek", + "then": { + "nl": "Dit is een Grieks restaurant" + } + }, + { + "if": "cuisine=indian", + "then": { + "nl": "Dit is een Indisch restaurant" + } + }, + { + "if": "cuisine=turkish", + "then": { + "nl": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)" + } + }, + { + "if": "cuisine=thai", + "then": { + "nl": "Dit is een Thaïs restaurant" + } + } + ], + "id": "Cuisine" + }, + { + "question": { + "nl": "Biedt deze zaak een afhaalmogelijkheid aan?", + "en": "Does this place offer takea-way?", + "de": "Ist an diesem Ort Mitnahme möglich?" + }, + "mappings": [ + { + "if": "takeaway=only", + "then": { + "en": "This is a take-away only business", + "nl": "Hier is enkel afhaal mogelijk", + "de": "Dieses Geschäft bietet nur Artikel zur Mitnahme an" + } + }, + { + "if": "takeaway=yes", + "then": { + "en": "Take-away is possible here", + "nl": "Eten kan hier afgehaald worden", + "de": "Mitnahme möglich" + } + }, + { + "if": "takeaway=no", + "then": { + "en": "Take-away is not possible here", + "nl": "Hier is geen afhaalmogelijkheid", + "de": "Mitnahme nicht möglich" + } + } + ], + "id": "Takeaway" + }, + { + "question": { + "nl": "Heeft deze eetgelegenheid een vegetarische optie?", + "en": "Does this restaurant have a vegetarian option?", + "de": "Gibt es im das Restaurant vegetarische Speisen?" + }, + "mappings": [ + { + "if": "diet:vegetarian=no", + "then": { + "nl": "Geen vegetarische opties beschikbaar" + } + }, + { + "if": "diet:vegetarian=limited", + "then": { + "nl": "Beperkte vegetarische opties zijn beschikbaar" + } + }, + { + "if": "diet:vegetarian=yes", + "then": { + "nl": "Vegetarische opties zijn beschikbaar" + } + }, + { + "if": "diet:vegetarian=only", + "then": { + "nl": "Enkel vegetarische opties zijn beschikbaar" + } + } + ], + "condition": "cuisine!=friture", + "id": "Vegetarian (no friture)" + }, + { + "question": { + "nl": "Heeft deze eetgelegenheid een veganistische optie?" + }, + "mappings": [ + { + "if": "diet:vegan=no", + "then": { + "nl": "Geen veganistische opties beschikbaar" + } + }, + { + "if": "diet:vegan=limited", + "then": { + "nl": "Beperkte veganistische opties zijn beschikbaar" + } + }, + { + "if": "diet:vegan=yes", + "then": { + "nl": "Veganistische opties zijn beschikbaar" + } + }, + { + "if": "diet:vegan=only", + "then": { + "nl": "Enkel veganistische opties zijn beschikbaar" + } + } + ], + "condition": "cuisine!=friture", + "id": "Vegan (no friture)" + }, + { + "question": { + "en": "Does this restaurant offer a halal menu?", + "nl": "Heeft dit restaurant halal opties?", + "de": "Gibt es im das Restaurant halal Speisen?" + }, + "mappings": [ + { + "if": "diet:halal=no", + "then": { + "en": "There are no halal options available", + "nl": "Er zijn geen halal opties aanwezig", + "de": "Hier gibt es keine halal Speisen" + } + }, + { + "if": "diet:halal=limited", + "then": { + "en": "There is a small halal menu", + "nl": "Er zijn een beperkt aantal halal opties", + "de": "Hier gibt es wenige halal Speisen" + } + }, + { + "if": "diet:halal=yes", + "then": { + "nl": "Halal menu verkrijgbaar", + "en": "There is a halal menu", + "de": "Es gibt halal Speisen" + } + }, + { + "if": "diet:halal=only", + "then": { + "nl": "Enkel halal opties zijn beschikbaar", + "en": "Only halal options are available", + "de": "Es gibt ausschließlich halal Speisen" + } + } + ], + "condition": "cuisine!=friture", + "id": "halal (no friture)" + }, + { + "id": "friture-vegetarian", + "question": { + "nl": "Heeft deze frituur vegetarische snacks?", + "fr": "Cette friterie est-elle équipée de snacks végétariens ?" + }, + "mappings": [ + { + "if": "diet:vegetarian=yes", + "then": { + "nl": "Er zijn vegetarische snacks aanwezig", + "fr": "Des collations végétariens sont disponibles" + } + }, + { + "if": "diet:vegetarian=limited", + "then": { + "nl": "Slechts enkele vegetarische snacks", + "fr": "Quelques snacks végétariens seulement" + } + }, + { + "if": "diet:vegetarian=no", + "then": { + "nl": "Geen vegetarische snacks beschikbaar", + "fr": "Pas d'en-cas végétariens disponibles" + } + } + ], + "condition": "cuisine=friture" + }, + { + "id": "friture-vegan", + "question": { + "nl": "Heeft deze frituur veganistische snacks?", + "fr": "Cette friterie est-elle équipée de snacks végétaliens ?" + }, + "mappings": [ + { + "if": "diet:vegan=yes", + "then": { + "nl": "Er zijn veganistische snacks aanwezig", + "fr": "Des collations végétaliens sont disponibles" + } + }, + { + "if": "diet:vegan=limited", + "then": { + "nl": "Slechts enkele veganistische snacks", + "fr": "Quelques snacks végétaliens seulement" + } + }, + { + "if": "diet:vegan=no", + "then": { + "nl": "Geen veganistische snacks beschikbaar", + "fr": "Pas d'en-cas végétaliens disponibles" + } + } + ], + "condition": "cuisine=friture" + }, + { + "id": "friture-oil", + "question": { + "nl": "Bakt deze frituur met dierlijk vet of met plantaardige olie?", + "fr": "Cette friteuse fonctionne-t-elle avec de la graisse animale ou végétale ?" + }, + "mappings": [ + { + "if": "friture:oil=vegetable", + "then": { + "nl": "Plantaardige olie", + "fr": "Huile végétale" + } + }, + { + "if": "friture:oil=animal", + "then": { + "nl": "Dierlijk vet", + "fr": "Graisse animale" + } + } + ], + "condition": "cuisine=friture" + }, + { + "id": "friture-take-your-container", + "question": { + "nl": "Als je je eigen container (bv. kookpot of kleine potjes voor saus) meeneemt, gebruikt de frituur deze dan om je bestelling in te doen?", + "fr": "Est-il proposé d’utiliser ses propres contenants pour sa commande ?
", + "en": "If you bring your own container (such as a cooking pot and small pots), is it used to package your order?
", + "ja": "お客様が持参容器(調理用の鍋や小さな鍋など)をもってきた場合は、注文の梱包に使用されますか?
", + "de": "Wenn Sie Ihr eigenes Behältnis mitbringen (z. B. einen Kochtopf und kleine Töpfe), wird es dann zum Verpacken Ihrer Bestellung verwendet?
" + }, + "mappings": [ + { + "if": "reusable_packaging:accept=yes", + "then": { + "nl": "Je mag je eigen containers meenemen om je bestelling in mee te nemen en zo minder afval te maken", + "fr": "Vous pouvez apporter vos contenants pour votre commande, limitant l’usage de matériaux à usage unique et les déchets", + "en": "You can bring your own containers to get your order, saving on single-use packaging material and thus waste", + "ja": "自分の容器を持ってきて、注文を受け取ることができ、使い捨ての梱包材を節約して、無駄を省くことができます", + "de": "Sie können ihre eigenen Behälter mitbringen, um Ihre Bestellung zu erhalten, was Einwegverpackungsmaterial und damit Abfall spart" + } + }, + { + "if": "reusable_packaging:accept=no", + "then": { + "nl": "Je mag geen eigen containers meenemen om je bestelling in mee te nemen", + "fr": "Apporter ses propres contenants n’est pas permis", + "en": "Bringing your own container is not allowed", + "ja": "独自の容器を持参することはできません", + "ru": "Приносить свою тару не разрешено", + "de": "Das Mitbringen eines eigenen Containers ist nicht erlaubt" + } + }, + { + "if": "reusable_packaging:accept=only", + "then": { + "nl": "Je moet je eigen containers meenemen om je bestelling in mee te nemen.", + "en": "You must bring your own container to order here.", + "ja": "自身の容器が注文に必要。", + "fr": "Il est obligatoire d’apporter ses propres contenants", + "de": "Sie müssen Ihren eigenen Behälter mitbringen, um hier zu bestellen." + } + } + ], + "condition": "cuisine=friture" + }, + "service:electricity", + "dog-access" + ], + "filter": [ + { + "id": "opened-now", + "options": [ + { + "question": { + "en": "Opened now", + "nl": "Nu geopened", + "de": "Aktuell geöffnet" + }, + "osmTags": "_isOpen=yes" + } + ] + }, + { + "id": "vegetarian", + "options": [ + { + "question": { + "en": "Has a vegetarian menu", + "nl": "Heeft een vegetarisch menu", + "de": "Hat vegetarische Speisen" + }, + "osmTags": { + "or": [ + "diet:vegetarian=yes", + "diet:vegetarian=only", + "diet:vegan=yes", + "diet:vegan=only" + ] + } + } + ] + }, + { + "id": "vegan", + "options": [ + { + "question": { + "en": "Has a vegan menu", + "nl": "Heeft een veganistisch menu", + "de": "Bietet vegan Speisen an" + }, + "osmTags": { + "or": [ + "diet:vegan=yes", + "diet:vegan=only" + ] + } + } + ] + }, + { + "id": "halal", + "options": [ + { + "question": { + "en": "Has a halal menu", + "nl": "Heeft een halal menu", + "de": "Hat halal Speisen" + }, + "osmTags": { + "or": [ + "diet:halal=yes", + "diet:halal=only" + ] + } + } + ] + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "amenity=", + "disused:amenity:={amenity}" + ] + } + }, + "allowMove": true, + "mapRendering": [ + { + "icon": { "render": "circle:white;./assets/layers/food/restaurant.svg", "mappings": [ - { - "if": { - "and": [ - "amenity=fast_food", - "cuisine=friture" - ] - }, - "then": "circle:white;./assets/layers/food/fries.svg" - }, - { - "if": "amenity=fast_food", - "then": "circle:white;./assets/layers/food/fastfood.svg" - } - ] - }, - "iconOverlays": [ - { - "if": "opening_hours~*", - "then": "isOpen", - "badge": true - }, - { + { "if": { - "or": [ - "diet:vegetarian=yes", - "diet:vegan=yes" - ] - }, - "then": { - "render": "circle:white;./assets/themes/fritures/Vegetarian-mark.svg" - }, - "badge": true - } - ], - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
{name}
" - } - ] - }, - "presets": [ - { - "title": { - "en": "restaurant", - "nl": "restaurant", - "ru": "ресторан", - "de": "Restaurant" - }, - "tags": [ - "amenity=restaurant" - ], - "description": { - "nl": "Een eetgegelegenheid waar je aan tafel wordt bediend", - "en": "A formal eating place with sit-down facilities selling full meals served by waiters", - "de": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden" - }, - "preciseInput": { - "preferredBackground": "map" - } - }, - { - "title": { - "en": "fastfood", - "nl": "fastfood-zaak", - "ru": "быстрое питание", - "de": "Schnellimbiss" - }, - "tags": [ - "amenity=fast_food" - ], - "description": { - "nl": "Een zaak waar je snel bediend wordt, vaak met de focus op afhalen. Zitgelegenheid is eerder beperkt (of zelfs afwezig)", - "en": "A food business concentrating on fast counter-only service and take-away food", - "de": "Ein Lebensmittelunternehmen, das sich auf schnellen Thekendienst und Essen zum Mitnehmen konzentriert" - }, - "preciseInput": { - "preferredBackground": "map" - } - }, - { - "title": { - "en": "fries shop", - "nl": "frituur", - "de": "Pommesbude" - }, - "tags": [ + "and": [ "amenity=fast_food", "cuisine=friture" - ], - "description": { - "nl": "Een fastfood-zaak waar je frieten koopt" + ] }, - "preciseInput": { - "preferredBackground": "map" - } - } - ], - "title": { - "render": { - "nl": "Eetgelegenheid" - }, - "mappings": [ - { - "if": { - "and": [ - "name~*", - "amenity=restaurant" - ] - }, - "then": { - "nl": "Restaurant {name}", - "en": "Restaurant {name}", - "de": "Restaurant {name}" - } - }, - { - "if": { - "and": [ - "name~*", - "amenity=fast_food" - ] - }, - "then": { - "nl": "Fastfood-zaak {name}", - "en": "Fastfood {name}", - "de": "Schnellrestaurant{name}" - } - } + "then": "circle:white;./assets/layers/food/fries.svg" + }, + { + "if": "amenity=fast_food", + "then": "circle:white;./assets/layers/food/fastfood.svg" + } ] - }, - "tagRenderings": [ - "images", + }, + "iconBadges": [ { - "question": { - "nl": "Wat is de naam van deze eetgelegenheid?", - "en": "What is the name of this restaurant?", - "de": "Wie heißt dieses Restaurant?" - }, - "render": { - "nl": "De naam van deze eetgelegeheid is {name}", - "en": "The name of this restaurant is {name}", - "de": "Das Restaurant heißt {name}" - }, - "freeform": { - "key": "name" - }, - "id": "Name" + "if": "opening_hours~*", + "then": "isOpen" }, { - "question": { - "en": "What type of business is this?", - "nl": "Wat voor soort zaak is dit?", - "de": "Um was für ein Geschäft handelt es sich?" - }, - "mappings": [ - { - "if": "amenity=fast_food", - "then": { - "nl": "Dit is een fastfood-zaak. De focus ligt op snelle bediening, zitplaatsen zijn vaak beperkt en functioneel" - } - }, - { - "if": "amenity=restaurant", - "then": { - "nl": "Dit is een restaurant. De focus ligt op een aangename ervaring waar je aan tafel wordt bediend" - } - } - ], - "id": "Fastfood vs restaurant" - }, - "opening_hours", - "website", - "email", - "phone", - "payment-options", - "wheelchair-access", - { - "question": { - "nl": "Welk soort gerechten worden hier geserveerd?", - "en": "Which food is served here?", - "de": "Welches Essen gibt es hier?" - }, - "render": { - "nl": "Deze plaats serveert vooral {cuisine}", - "en": "This place mostly serves {cuisine}", - "de": "An diesem Ort gibt es hauptsächlich {cuisine}" - }, - "freeform": { - "key": "cuisine", - "addExtraTags": [ - "fixme=Freeform tag `cuisine` used, to be doublechecked" - ] - }, - "mappings": [ - { - "if": "cuisine=pizza", - "then": { - "en": "This is a pizzeria", - "nl": "Dit is een pizzeria", - "de": "Dies ist eine Pizzeria" - } - }, - { - "if": "cuisine=friture", - "then": { - "en": "This is a friture", - "nl": "Dit is een frituur", - "de": "Dies ist eine Pommesbude" - } - }, - { - "if": "cuisine=pasta", - "then": { - "en": "Mainly serves pasta", - "nl": "Dit is een pastazaak", - "de": "Bietet vorwiegend Pastagerichte an" - } - }, - { - "if": "cuisine=kebab", - "then": { - "nl": "Dit is een kebabzaak" - } - }, - { - "if": "cuisine=sandwich", - "then": { - "nl": "Dit is een broodjeszaak" - } - }, - { - "if": "cuisine=burger", - "then": { - "nl": "Dit is een hamburgerrestaurant" - } - }, - { - "if": "cuisine=sushi", - "then": { - "nl": "Dit is een sushirestaurant" - } - }, - { - "if": "cuisine=coffee", - "then": { - "nl": "Dit is een koffiezaak" - } - }, - { - "if": "cuisine=italian", - "then": { - "nl": "Dit is een Italiaans restaurant (dat meer dan enkel pasta of pizza verkoopt)" - } - }, - { - "if": "cuisine=french", - "then": { - "nl": "Dit is een Frans restaurant" - } - }, - { - "if": "cuisine=chinese", - "then": { - "nl": "Dit is een Chinees restaurant" - } - }, - { - "if": "cuisine=greek", - "then": { - "nl": "Dit is een Grieks restaurant" - } - }, - { - "if": "cuisine=indian", - "then": { - "nl": "Dit is een Indisch restaurant" - } - }, - { - "if": "cuisine=turkish", - "then": { - "nl": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)" - } - }, - { - "if": "cuisine=thai", - "then": { - "nl": "Dit is een Thaïs restaurant" - } - } - ], - "id": "Cuisine" - }, - { - "question": { - "nl": "Biedt deze zaak een afhaalmogelijkheid aan?", - "en": "Does this place offer takea-way?", - "de": "Ist an diesem Ort Mitnahme möglich?" - }, - "mappings": [ - { - "if": "takeaway=only", - "then": { - "en": "This is a take-away only business", - "nl": "Hier is enkel afhaal mogelijk", - "de": "Dieses Geschäft bietet nur Artikel zur Mitnahme an" - } - }, - { - "if": "takeaway=yes", - "then": { - "en": "Take-away is possible here", - "nl": "Eten kan hier afgehaald worden", - "de": "Mitnahme möglich" - } - }, - { - "if": "takeaway=no", - "then": { - "en": "Take-away is not possible here", - "nl": "Hier is geen afhaalmogelijkheid", - "de": "Mitnahme nicht möglich" - } - } - ], - "id": "Takeaway" - }, - { - "question": { - "nl": "Heeft deze eetgelegenheid een vegetarische optie?", - "en": "Does this restaurant have a vegetarian option?", - "de": "Gibt es im das Restaurant vegetarische Speisen?" - }, - "mappings": [ - { - "if": "diet:vegetarian=no", - "then": { - "nl": "Geen vegetarische opties beschikbaar" - } - }, - { - "if": "diet:vegetarian=limited", - "then": { - "nl": "Beperkte vegetarische opties zijn beschikbaar" - } - }, - { - "if": "diet:vegetarian=yes", - "then": { - "nl": "Vegetarische opties zijn beschikbaar" - } - }, - { - "if": "diet:vegetarian=only", - "then": { - "nl": "Enkel vegetarische opties zijn beschikbaar" - } - } - ], - "condition": "cuisine!=friture", - "id": "Vegetarian (no friture)" - }, - { - "question": { - "nl": "Heeft deze eetgelegenheid een veganistische optie?" - }, - "mappings": [ - { - "if": "diet:vegan=no", - "then": { - "nl": "Geen veganistische opties beschikbaar" - } - }, - { - "if": "diet:vegan=limited", - "then": { - "nl": "Beperkte veganistische opties zijn beschikbaar" - } - }, - { - "if": "diet:vegan=yes", - "then": { - "nl": "Veganistische opties zijn beschikbaar" - } - }, - { - "if": "diet:vegan=only", - "then": { - "nl": "Enkel veganistische opties zijn beschikbaar" - } - } - ], - "condition": "cuisine!=friture", - "id": "Vegan (no friture)" - }, - { - "question": { - "en": "Does this restaurant offer a halal menu?", - "nl": "Heeft dit restaurant halal opties?", - "de": "Gibt es im das Restaurant halal Speisen?" - }, - "mappings": [ - { - "if": "diet:halal=no", - "then": { - "en": "There are no halal options available", - "nl": "Er zijn geen halal opties aanwezig", - "de": "Hier gibt es keine halal Speisen" - } - }, - { - "if": "diet:halal=limited", - "then": { - "en": "There is a small halal menu", - "nl": "Er zijn een beperkt aantal halal opties", - "de": "Hier gibt es wenige halal Speisen" - } - }, - { - "if": "diet:halal=yes", - "then": { - "nl": "Halal menu verkrijgbaar", - "en": "There is a halal menu", - "de": "Es gibt halal Speisen" - } - }, - { - "if": "diet:halal=only", - "then": { - "nl": "Enkel halal opties zijn beschikbaar", - "en": "Only halal options are available", - "de": "Es gibt ausschließlich halal Speisen" - } - } - ], - "condition": "cuisine!=friture", - "id": "halal (no friture)" - }, - { - "id": "friture-vegetarian", - "question": { - "nl": "Heeft deze frituur vegetarische snacks?", - "fr": "Cette friterie est-elle équipée de snacks végétariens ?" - }, - "mappings": [ - { - "if": "diet:vegetarian=yes", - "then": { - "nl": "Er zijn vegetarische snacks aanwezig", - "fr": "Des collations végétariens sont disponibles" - } - }, - { - "if": "diet:vegetarian=limited", - "then": { - "nl": "Slechts enkele vegetarische snacks", - "fr": "Quelques snacks végétariens seulement" - } - }, - { - "if": "diet:vegetarian=no", - "then": { - "nl": "Geen vegetarische snacks beschikbaar", - "fr": "Pas d'en-cas végétariens disponibles" - } - } - ], - "condition": "cuisine=friture" - }, - { - "id": "friture-vegan", - "question": { - "nl": "Heeft deze frituur veganistische snacks?", - "fr": "Cette friterie est-elle équipée de snacks végétaliens ?" - }, - "mappings": [ - { - "if": "diet:vegan=yes", - "then": { - "nl": "Er zijn veganistische snacks aanwezig", - "fr": "Des collations végétaliens sont disponibles" - } - }, - { - "if": "diet:vegan=limited", - "then": { - "nl": "Slechts enkele veganistische snacks", - "fr": "Quelques snacks végétaliens seulement" - } - }, - { - "if": "diet:vegan=no", - "then": { - "nl": "Geen veganistische snacks beschikbaar", - "fr": "Pas d'en-cas végétaliens disponibles" - } - } - ], - "condition": "cuisine=friture" - }, - { - "id": "friture-oil", - "question": { - "nl": "Bakt deze frituur met dierlijk vet of met plantaardige olie?", - "fr": "Cette friteuse fonctionne-t-elle avec de la graisse animale ou végétale ?" - }, - "mappings": [ - { - "if": "friture:oil=vegetable", - "then": { - "nl": "Plantaardige olie", - "fr": "Huile végétale" - } - }, - { - "if": "friture:oil=animal", - "then": { - "nl": "Dierlijk vet", - "fr": "Graisse animale" - } - } - ], - "condition": "cuisine=friture" - }, - { - "id": "friture-take-your-container", - "question": { - "nl": "Als je je eigen container (bv. kookpot of kleine potjes voor saus) meeneemt, gebruikt de frituur deze dan om je bestelling in te doen?", - "fr": "Est-il proposé d’utiliser ses propres contenants pour sa commande ?
", - "en": "If you bring your own container (such as a cooking pot and small pots), is it used to package your order?
", - "ja": "お客様が持参容器(調理用の鍋や小さな鍋など)をもってきた場合は、注文の梱包に使用されますか?
", - "de": "Wenn Sie Ihr eigenes Behältnis mitbringen (z. B. einen Kochtopf und kleine Töpfe), wird es dann zum Verpacken Ihrer Bestellung verwendet?
" - }, - "mappings": [ - { - "if": "reusable_packaging:accept=yes", - "then": { - "nl": "Je mag je eigen containers meenemen om je bestelling in mee te nemen en zo minder afval te maken", - "fr": "Vous pouvez apporter vos contenants pour votre commande, limitant l’usage de matériaux à usage unique et les déchets", - "en": "You can bring your own containers to get your order, saving on single-use packaging material and thus waste", - "ja": "自分の容器を持ってきて、注文を受け取ることができ、使い捨ての梱包材を節約して、無駄を省くことができます", - "de": "Sie können ihre eigenen Behälter mitbringen, um Ihre Bestellung zu erhalten, was Einwegverpackungsmaterial und damit Abfall spart" - } - }, - { - "if": "reusable_packaging:accept=no", - "then": { - "nl": "Je mag geen eigen containers meenemen om je bestelling in mee te nemen", - "fr": "Apporter ses propres contenants n’est pas permis", - "en": "Bringing your own container is not allowed", - "ja": "独自の容器を持参することはできません", - "ru": "Приносить свою тару не разрешено", - "de": "Das Mitbringen eines eigenen Containers ist nicht erlaubt" - } - }, - { - "if": "reusable_packaging:accept=only", - "then": { - "nl": "Je moet je eigen containers meenemen om je bestelling in mee te nemen.", - "en": "You must bring your own container to order here.", - "ja": "自身の容器が注文に必要。", - "fr": "Il est obligatoire d’apporter ses propres contenants", - "de": "Sie müssen Ihren eigenen Behälter mitbringen, um hier zu bestellen." - } - } - ], - "condition": "cuisine=friture" - }, - "dog-access" - ], - "filter": [ - { - "id": "opened-now", - "options": [ - { - "question": { - "en": "Opened now", - "nl": "Nu geopened", - "de": "Aktuell geöffnet" - }, - "osmTags": "_isOpen=yes" - } - ] - }, - { - "id": "vegetarian", - "options": [ - { - "question": { - "en": "Has a vegetarian menu", - "nl": "Heeft een vegetarisch menu", - "de": "Hat vegetarische Speisen" - }, - "osmTags": { - "or": [ - "diet:vegetarian=yes", - "diet:vegetarian=only", - "diet:vegan=yes", - "diet:vegan=only" - ] - } - } - ] - }, - { - "id": "vegan", - "options": [ - { - "question": { - "en": "Has a vegan menu", - "nl": "Heeft een veganistisch menu", - "de": "Bietet vegan Speisen an" - }, - "osmTags": { - "or": [ - "diet:vegan=yes", - "diet:vegan=only" - ] - } - } - ] - }, - { - "id": "halal", - "options": [ - { - "question": { - "en": "Has a halal menu", - "nl": "Heeft een halal menu", - "de": "Hat halal Speisen" - }, - "osmTags": { - "or": [ - "diet:halal=yes", - "diet:halal=only" - ] - } - } + "if": { + "or": [ + "diet:vegetarian=yes", + "diet:vegan=yes" ] + }, + "then": { + "render": "circle:white;./assets/themes/fritures/Vegetarian-mark.svg" + } } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "amenity=", - "disused:amenity:={amenity}" - ] - } - }, - "allowMove": true + ], + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
{name}
" + } + ] + }, + "location": [ + "point", + "centroid" + ] + } + ] } \ No newline at end of file diff --git a/assets/layers/ghost_bike/ghost_bike.json b/assets/layers/ghost_bike/ghost_bike.json index b3fb46860f..be4b2292e2 100644 --- a/assets/layers/ghost_bike/ghost_bike.json +++ b/assets/layers/ghost_bike/ghost_bike.json @@ -1,208 +1,213 @@ { - "id": "ghost_bike", - "name": { - "en": "Ghost bikes", - "nl": "Witte Fietsen", - "de": "Geisterräder", + "id": "ghost_bike", + "name": { + "en": "Ghost bikes", + "nl": "Witte Fietsen", + "de": "Geisterräder", + "it": "Bici fantasma", + "fr": "Vélos fantômes", + "eo": "Fantombiciklo", + "es": "Bicicleta blanca", + "fi": "Haamupyörä", + "gl": "Bicicleta pantasma", + "hu": "Emlékkerékpár", + "ja": "ゴーストバイク", + "nb_NO": "Spøkelsessykler", + "pl": "Duch roweru", + "pt_BR": "Bicicleta fantasma", + "ru": "Велосипед Ghost", + "sv": "Spökcykel", + "zh_Hant": "幽靈單車", + "pt": "Bicicleta fantasma" + }, + "source": { + "osmTags": "memorial=ghost_bike" + }, + "minzoom": 0, + "title": { + "render": { + "en": "Ghost bike", + "nl": "Witte Fiets", + "de": "Geisterrad", + "it": "Bici fantasma", + "fr": "Vélo fantôme", + "eo": "Fantombiciklo", + "es": "Bicicleta blanca", + "fi": "Haamupyörä", + "gl": "Bicicleta pantasma", + "hu": "Emlékkerékpár", + "ja": "ゴーストバイク", + "nb_NO": "Spøkelsessykler", + "pl": "Duch roweru", + "pt_BR": "Bicicleta fantasma", + "ru": "Велосипед Ghost", + "sv": "Spökcykel", + "zh_Hant": "幽靈單車", + "pt": "Bicicleta fantasma" + }, + "mappings": [ + { + "if": "name~*", + "then": { + "en": "Ghost bike in the remembrance of {name}", + "nl": "Witte fiets ter nagedachtenis van {name}", + "de": "Geisterrad im Gedenken an {name}", + "it": "Bici fantasma in ricordo di {name}", + "fr": "Vélo fantôme en souvenir de {name}" + } + } + ] + }, + "presets": [ + { + "title": { + "en": "Ghost bike", + "nl": "Witte fiets", + "de": "Geisterrad", "it": "Bici fantasma", - "fr": "Vélos fantômes", - "eo": "Fantombiciklo", - "es": "Bicicleta blanca", - "fi": "Haamupyörä", - "gl": "Bicicleta pantasma", - "hu": "Emlékkerékpár", - "ja": "ゴーストバイク", - "nb_NO": "Spøkelsessykler", - "pl": "Duch roweru", - "pt_BR": "Bicicleta fantasma", - "ru": "Велосипед Ghost", - "sv": "Spökcykel", - "zh_Hant": "幽靈單車", - "pt": "Bicicleta fantasma" - }, - "source": { - "osmTags": "memorial=ghost_bike" - }, - "minzoom": 0, - "title": { - "render": { - "en": "Ghost bike", - "nl": "Witte Fiets", - "de": "Geisterrad", - "it": "Bici fantasma", - "fr": "Vélo fantôme", - "eo": "Fantombiciklo", - "es": "Bicicleta blanca", - "fi": "Haamupyörä", - "gl": "Bicicleta pantasma", - "hu": "Emlékkerékpár", - "ja": "ゴーストバイク", - "nb_NO": "Spøkelsessykler", - "pl": "Duch roweru", - "pt_BR": "Bicicleta fantasma", - "ru": "Велосипед Ghost", - "sv": "Spökcykel", - "zh_Hant": "幽靈單車", - "pt": "Bicicleta fantasma" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "en": "Ghost bike in the remembrance of {name}", - "nl": "Witte fiets ter nagedachtenis van {name}", - "de": "Geisterrad im Gedenken an {name}", - "it": "Bici fantasma in ricordo di {name}", - "fr": "Vélo fantôme en souvenir de {name}" - } - } - ] - }, - "icon": "./assets/layers/ghost_bike/ghost_bike.svg", - "iconSize": "40,40,bottom", - "width": "5", - "color": "#000", - "wayHandling": 1, - "presets": [ - { - "title": { - "en": "Ghost bike", - "nl": "Witte fiets", - "de": "Geisterrad", - "it": "Bici fantasma", - "fr": "Vélo fantôme" - }, - "tags": [ - "historic=memorial", - "memorial=ghost_bike" - ] - } - ], - "tagRenderings": [ - { - "id": "ghost-bike-explanation", - "render": { - "en": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location.", - "nl": "Een Witte Fiets (of Spookfiets) is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat over een witgeschilderde fiets die geplaatst werd in de buurt van het ongeval.", - "de": "Ein Geisterrad ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde.", - "it": "Una bici fantasma è il memoriale di un ciclista che è morto in un incidente stradale e che ha la forma di una bicicletta bianca piazzata in maniera stabile vicino al luogo dell’incidente.", - "fr": "Un vélo fantôme est un monument commémoratif pour un cycliste décédé dans un accident de la route, sous la forme d'un vélo blanc placé en permanence près du lieu de l'accident." - } - }, - "images", - { - "question": { - "en": "Whom is remembered by this ghost bike?
Please respect privacy - only fill out the name if it is widely published or marked on the cycle. Opt to leave out the family name.
", - "nl": "Aan wie is deze witte fiets een eerbetoon?
Respecteer privacy - voeg enkel een naam toe indien die op de fiets staat of gepubliceerd is. Eventueel voeg je enkel de voornaam toe.
", - "de": "An wen erinnert dieses Geisterrad?
Bitte respektieren Sie die Privatsphäre - geben Sie den Namen nur an, wenn er weit verbreitet oder auf dem Fahrrad markiert ist. Den Familiennamen können Sie weglassen.
", - "it": "A chi è dedicata questa bici fantasma?
Rispetta la privacy (compila solo il nome se questo è stato ampiamente pubblicato o se è scritto sulla bici). Decidi se è il caso di non inserire il cognome.
", - "fr": "À qui est dédié ce vélo fantôme ?
Veuillez respecter la vie privée – ajoutez le nom seulement s'il est largement publié ou marqué sur le vélo. Choisissez de ne pas indiquer le nom de famille
" - }, - "render": { - "en": "In remembrance of {name}", - "nl": "Ter nagedachtenis van {name}", - "de": "Im Gedenken an {name}", - "it": "In ricordo di {name}", - "fr": "En souvenir de {name}", - "ru": "В знак памяти о {name}" - }, - "freeform": { - "key": "name" - }, - "mappings": [ - { - "if": "noname=yes", - "then": { - "en": "No name is marked on the bike", - "nl": "De naam is niet aangeduid op de fiets", - "de": "Auf dem Fahrrad ist kein Name angegeben", - "it": "Nessun nome scritto sulla bici", - "fr": "Aucun nom n'est marqué sur le vélo" - } - } - ], - "id": "ghost_bike-name" - }, - { - "question": { - "en": "On what webpage can one find more information about the Ghost bike or the accident?", - "nl": "Op welke website kan men meer informatie vinden over de Witte fiets of over het ongeval?", - "de": "Auf welcher Webseite kann man mehr Informationen über das Geisterrad oder den Unfall finden?", - "it": "In quale pagina web si possono trovare informazioni sulla bici fantasma o l’incidente?", - "fr": "Sur quelle page web peut-on trouver plus d'informations sur le Vélo fantôme ou l'accident ?" - }, - "render": { - "en": "More information is available", - "nl": "Meer informatie", - "de": "Mehr Informationen", - "it": "Sono disponibili ulteriori informazioni", - "ru": "Доступна более подробная информация", - "fr": "Plus d'informations sont disponibles", - "id": "Informasi lanjut tersedia" - }, - "freeform": { - "type": "url", - "key": "source" - }, - "id": "ghost_bike-source" - }, - { - "question": { - "en": "What is the inscription on this Ghost bike?", - "nl": "Wat is het opschrift op deze witte fiets?", - "de": "Wie lautet die Inschrift auf diesem Geisterrad?", - "it": "Che cosa è scritto sulla bici fantasma?", - "fr": "Quelle est l'inscription sur ce vélo fantôme ?" - }, - "render": { - "en": "{inscription}", - "nl": "{inscription}", - "de": "{inscription}", - "ca": "{inscription}", - "fr": "{inscription}", - "it": "{inscription}", - "ru": "{inscription}", - "id": "{inscription}" - }, - "freeform": { - "key": "inscription" - }, - "id": "ghost_bike-inscription" - }, - { - "question": { - "nl": "Wanneer werd deze witte fiets geplaatst?", - "en": "When was this Ghost bike installed?", - "it": "Quando è stata installata questa bici fantasma?", - "fr": "Quand ce vélo fantôme a-t-il été installée ?", - "de": "Wann wurde dieses Geisterrad aufgestellt?" - }, - "render": { - "nl": "Geplaatst op {start_date}", - "en": "Placed on {start_date}", - "it": "Piazzata in data {start_date}", - "fr": "Placé le {start_date}", - "ru": "Установлен {start_date}", - "de": "Aufgestellt am {start_date}" - }, - "freeform": { - "key": "start_date", - "type": "date" - }, - "id": "ghost_bike-start_date" - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "razed:memorial:=ghost_bike", - "memorial=" - ] - }, - "neededChangesets": 50 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + "fr": "Vélo fantôme" + }, + "tags": [ + "historic=memorial", + "memorial=ghost_bike" + ] } + ], + "tagRenderings": [ + { + "id": "ghost-bike-explanation", + "render": { + "en": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location.", + "nl": "Een Witte Fiets (of Spookfiets) is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat over een witgeschilderde fiets die geplaatst werd in de buurt van het ongeval.", + "de": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt wird.", + "it": "Una bici fantasma è il memoriale di un ciclista che è morto in un incidente stradale e che ha la forma di una bicicletta bianca piazzata in maniera stabile vicino al luogo dell’incidente.", + "fr": "Un vélo fantôme est un monument commémoratif pour un cycliste décédé dans un accident de la route, sous la forme d'un vélo blanc placé en permanence près du lieu de l'accident." + } + }, + "images", + { + "question": { + "en": "Whom is remembered by this ghost bike?
Please respect privacy - only fill out the name if it is widely published or marked on the cycle. Opt to leave out the family name.
", + "nl": "Aan wie is deze witte fiets een eerbetoon?
Respecteer privacy - voeg enkel een naam toe indien die op de fiets staat of gepubliceerd is. Eventueel voeg je enkel de voornaam toe.
", + "de": "An wen erinnert dieses Geisterrad?
Bitte respektieren Sie die Privatsphäre - geben Sie den Namen nur an, wenn er weit verbreitet oder auf dem Fahrrad markiert ist. Den Familiennamen können Sie weglassen.
", + "it": "A chi è dedicata questa bici fantasma?
Rispetta la privacy (compila solo il nome se questo è stato ampiamente pubblicato o se è scritto sulla bici). Decidi se è il caso di non inserire il cognome.
", + "fr": "À qui est dédié ce vélo fantôme ?
Veuillez respecter la vie privée – ajoutez le nom seulement s'il est largement publié ou marqué sur le vélo. Choisissez de ne pas indiquer le nom de famille
" + }, + "render": { + "en": "In remembrance of {name}", + "nl": "Ter nagedachtenis van {name}", + "de": "Im Gedenken an {name}", + "it": "In ricordo di {name}", + "fr": "En souvenir de {name}", + "ru": "В знак памяти о {name}" + }, + "freeform": { + "key": "name" + }, + "mappings": [ + { + "if": "noname=yes", + "then": { + "en": "No name is marked on the bike", + "nl": "De naam is niet aangeduid op de fiets", + "de": "Auf dem Fahrrad ist kein Name angegeben", + "it": "Nessun nome scritto sulla bici", + "fr": "Aucun nom n'est marqué sur le vélo" + } + } + ], + "id": "ghost_bike-name" + }, + { + "question": { + "en": "On what webpage can one find more information about the Ghost bike or the accident?", + "nl": "Op welke website kan men meer informatie vinden over de Witte fiets of over het ongeval?", + "de": "Auf welcher Webseite kann man mehr Informationen über das Geisterrad oder den Unfall finden?", + "it": "In quale pagina web si possono trovare informazioni sulla bici fantasma o l’incidente?", + "fr": "Sur quelle page web peut-on trouver plus d'informations sur le Vélo fantôme ou l'accident ?" + }, + "render": { + "en": "More information is available", + "nl": "Meer informatie", + "de": "Mehr Informationen", + "it": "Sono disponibili ulteriori informazioni", + "ru": "Доступна более подробная информация", + "fr": "Plus d'informations sont disponibles", + "id": "Informasi lanjut tersedia" + }, + "freeform": { + "type": "url", + "key": "source" + }, + "id": "ghost_bike-source" + }, + { + "question": { + "en": "What is the inscription on this Ghost bike?", + "nl": "Wat is het opschrift op deze witte fiets?", + "de": "Wie lautet die Inschrift auf diesem Geisterrad?", + "it": "Che cosa è scritto sulla bici fantasma?", + "fr": "Quelle est l'inscription sur ce vélo fantôme ?" + }, + "render": { + "en": "{inscription}", + "nl": "{inscription}", + "de": "{inscription}", + "ca": "{inscription}", + "fr": "{inscription}", + "it": "{inscription}", + "ru": "{inscription}", + "id": "{inscription}" + }, + "freeform": { + "key": "inscription" + }, + "id": "ghost_bike-inscription" + }, + { + "question": { + "nl": "Wanneer werd deze witte fiets geplaatst?", + "en": "When was this Ghost bike installed?", + "it": "Quando è stata installata questa bici fantasma?", + "fr": "Quand ce vélo fantôme a-t-il été installée ?", + "de": "Wann wurde dieses Geisterrad aufgestellt?" + }, + "render": { + "nl": "Geplaatst op {start_date}", + "en": "Placed on {start_date}", + "it": "Piazzata in data {start_date}", + "fr": "Placé le {start_date}", + "ru": "Установлен {start_date}", + "de": "Aufgestellt am {start_date}" + }, + "freeform": { + "key": "start_date", + "type": "date" + }, + "id": "ghost_bike-start_date" + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "razed:memorial:=ghost_bike", + "memorial=" + ] + }, + "neededChangesets": 50 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": "./assets/layers/ghost_bike/ghost_bike.svg", + "iconSize": "40,40,bottom", + "location": [ + "point", + "centroid" + ] + } + ] } \ No newline at end of file diff --git a/assets/layers/gps_location/gps_location.json b/assets/layers/gps_location/gps_location.json new file mode 100644 index 0000000000..5016797eb9 --- /dev/null +++ b/assets/layers/gps_location/gps_location.json @@ -0,0 +1,19 @@ +{ + "id": "gps_location", + "description": "Meta layer showing the current location of the user. Add this to your theme and override the icon to change the appearance of the current location. The object will always have `id=gps` and will have _all_ the properties included in the [`Coordinates`-object](https://developer.mozilla.org/en-US/docs/Web/API/GeolocationCoordinates) returned by the browser.", + "minzoom": 0, + "source": { + "osmTags": "id=gps", + "maxCacheAge": 0 + }, + "mapRendering": [ + { + "icon": "crosshair:#00f", + "iconSize": "40,40,center", + "location": [ + "point", + "centroid" + ] + } + ] +} \ No newline at end of file diff --git a/assets/layers/gps_track/gps_track.json b/assets/layers/gps_track/gps_track.json new file mode 100644 index 0000000000..75f18e2e15 --- /dev/null +++ b/assets/layers/gps_track/gps_track.json @@ -0,0 +1,28 @@ +{ + "id": "gps_track", + "description": "Meta layer showing the previou locations of the user. Add this to your theme and override the icon to change the appearance of the current location.", + "minzoom": 0, + "source": { + "osmTags": "user:location=yes", + "maxCacheAge": 0 + }, + "#title": { + "render": "Your travelled path" + }, + "tagRenderings": [ + { + "id": "Privacy notice", + "render": { + "en": "This is the path you've travelled since this website is opened. Don't worry - this is only visible to you and no one else. Your location data is never sent off-device." + } + }, + "export_as_gpx" + ], + "#name": "Your track", + "mapRendering": [ + { + "width": 0, + "color": "#bb000077" + } + ] +} \ No newline at end of file diff --git a/assets/layers/grass_in_parks/grass_in_parks.json b/assets/layers/grass_in_parks/grass_in_parks.json index a95d6e0eb6..87ea8db0dc 100644 --- a/assets/layers/grass_in_parks/grass_in_parks.json +++ b/assets/layers/grass_in_parks/grass_in_parks.json @@ -1,55 +1,64 @@ { - "id": "grass_in_parks", - "name": { - "nl": "Toegankelijke grasvelden in parken" - }, - "source": { - "osmTags": { - "or": [ - "name=Park Oude God", - { - "and": [ - "landuse=grass", - { - "or": [ - "access=public", - "access=yes" - ] - } - ] - } - ] - }, - "overpassScript": "way[\"leisure\"=\"park\"];node(w);is_in;area._[\"leisure\"=\"park\"];(way(area)[\"landuse\"=\"grass\"]; node(w); );" - }, - "minzoom": 0, - "title": { - "render": { - "nl": "Speelweide in een park" - }, - "mappings": [ + "id": "grass_in_parks", + "name": { + "nl": "Toegankelijke grasvelden in parken" + }, + "source": { + "osmTags": { + "or": [ + "name=Park Oude God", + { + "and": [ + "landuse=grass", { - "if": "name~*", - "then": { - "nl": "{name}" - } + "or": [ + "access=public", + "access=yes" + ] } - ] - }, - "icon": "./assets/themes/playgrounds/playground.svg", - "iconSize": "40,40,center", - "width": "1", - "color": "#0f0", - "wayHandling": 2, - "tagRenderings": [ - "images", - { - "id": "explanation", - "render": "Op dit grasveld in het park mag je spelen, picnicken, zitten, ..." - }, - { - "id": "grass-in-parks-reviews", - "render": "{reviews(name, landuse=grass )}" + ] } + ] + }, + "overpassScript": "way[\"leisure\"=\"park\"];node(w);is_in;area._[\"leisure\"=\"park\"];(way(area)[\"landuse\"=\"grass\"]; node(w); );" + }, + "minzoom": 0, + "title": { + "render": { + "nl": "Speelweide in een park" + }, + "mappings": [ + { + "if": "name~*", + "then": { + "nl": "{name}" + } + } ] + }, + "tagRenderings": [ + "images", + { + "id": "explanation", + "render": "Op dit grasveld in het park mag je spelen, picnicken, zitten, ..." + }, + { + "id": "grass-in-parks-reviews", + "render": "{reviews(name, landuse=grass )}" + } + ], + "mapRendering": [ + { + "icon": "./assets/themes/playgrounds/playground.svg", + "iconSize": "40,40,center", + "location": [ + "point", + "centroid" + ] + }, + { + "color": "#0f0", + "width": "1" + } + ] } \ No newline at end of file diff --git a/assets/layers/home_location/home_location.json b/assets/layers/home_location/home_location.json index 0bf07c75aa..74276dc09a 100644 --- a/assets/layers/home_location/home_location.json +++ b/assets/layers/home_location/home_location.json @@ -1,17 +1,23 @@ { - "id": "home_location", - "description": "Meta layer showing the home location of the user", - "minzoom": 0, - "source": { - "osmTags": "user:home=yes" - }, - "icon": { + "id": "home_location", + "description": "Meta layer showing the home location of the user. The home location can be set in the [profile settings](https://www.openstreetmap.org/profile/edit) of OpenStreetMap.", + "minzoom": 0, + "source": { + "osmTags": "user:home=yes", + "maxCacheAge": 0 + }, + "mapRendering": [ + { + "icon": { "render": "circle:white;./assets/svg/home.svg" - }, - "iconSize": { + }, + "iconSize": { "render": "20,20,center" - }, - "color": { - "render": "#00f" + }, + "location": [ + "point", + "centroid" + ] } + ] } \ No newline at end of file diff --git a/assets/layers/information_board/information_board.json b/assets/layers/information_board/information_board.json index 1f6b08c2de..b482ff5b36 100644 --- a/assets/layers/information_board/information_board.json +++ b/assets/layers/information_board/information_board.json @@ -1,72 +1,81 @@ { - "id": "information_board", - "name": { - "nl": "Informatieborden", - "en": "Information boards", - "it": "Pannelli informativi", - "fr": "Panneaux d'informations", - "de": "Informationstafeln", - "ru": "Информационные щиты" - }, - "minzoom": 12, - "source": { - "osmTags": { - "and": [ - "information=board" - ] - } - }, - "title": { - "render": { - "nl": "Informatiebord", - "en": "Information board", - "it": "Pannello informativo", - "fr": "Panneau d'informations", - "de": "Informationstafel", - "ru": "Информационный щит" - } - }, - "tagRenderings": [ - "images" - ], - "icon": { - "render": "./assets/layers/information_board/board.svg" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#00f" - }, - "presets": [ - { - "tags": [ - "tourism=information", - "information=board" - ], - "title": { - "nl": "informatiebord", - "en": "information board", - "it": "pannello informativo", - "fr": "panneau d'informations", - "de": "informationstafel", - "ru": "информационный щит" - } - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:tourism:=information", - "tourism=", - "razed:information=board", - "information=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + "id": "information_board", + "name": { + "nl": "Informatieborden", + "en": "Information boards", + "it": "Pannelli informativi", + "fr": "Panneaux d'informations", + "de": "Informationstafeln", + "ru": "Информационные щиты" + }, + "minzoom": 12, + "source": { + "osmTags": { + "and": [ + "information=board" + ] } + }, + "title": { + "render": { + "nl": "Informatiebord", + "en": "Information board", + "it": "Pannello informativo", + "fr": "Panneau d'informations", + "de": "Informationstafel", + "ru": "Информационный щит" + } + }, + "tagRenderings": [ + "images" + ], + "presets": [ + { + "tags": [ + "tourism=information", + "information=board" + ], + "title": { + "nl": "informatiebord", + "en": "information board", + "it": "pannello informativo", + "fr": "panneau d'informations", + "de": "informationstafel", + "ru": "информационный щит" + } + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:tourism:=information", + "tourism=", + "razed:information=board", + "information=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { + "render": "./assets/layers/information_board/board.svg" + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point" + ] + }, + { + "color": { + "render": "#00f" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/left_right_style/left_right_style.json b/assets/layers/left_right_style/left_right_style.json new file mode 100644 index 0000000000..9b8f82d136 --- /dev/null +++ b/assets/layers/left_right_style/left_right_style.json @@ -0,0 +1,35 @@ +{ + "id": "left_right_style", + "description": "Special meta-style which will show one single line, either on the left or on the right depending on the id. This is used in the small popups with left_right roads. Cannot be included in a theme", + "source": { + "osmTags": { + "or": [ + "id=left", + "id=right" + ] + } + }, + "mapRendering": [ + { + "width": 15, + "color": { + "render": "#ff000088", + "mappings": [ + { + "if": "id=left", + "then": "#0000ff88" + } + ] + }, + "offset": { + "render": "-15", + "mappings": [ + { + "if": "id=right", + "then": "15" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/assets/layers/map/map.json b/assets/layers/map/map.json index 52083262b8..464ed658fa 100644 --- a/assets/layers/map/map.json +++ b/assets/layers/map/map.json @@ -1,245 +1,254 @@ { - "id": "map", - "name": { - "en": "Maps", - "nl": "Kaarten", - "it": "Mappe", - "ru": "Карты", - "fr": "Cartes", - "de": "Karten" - }, - "minzoom": 12, - "source": { - "osmTags": { - "or": [ - "tourism=map", - "information=map" - ] - } - }, - "title": { - "render": { - "en": "Map", - "nl": "Kaart", - "it": "Mappa", - "ru": "Карта", - "fr": "Carte", - "de": "Karte" - } - }, - "description": { - "en": "A map, meant for tourists which is permanently installed in the public space", - "nl": "Een permantent geinstalleerde kaart", - "it": "Una mappa, destinata ai turisti e che è sistemata in maniera permanente in uno spazio pubblico", - "fr": "Une carte, destinée aux touristes, installée en permanence dans l'espace public", - "de": "Eine Karte, die für Touristen gedacht ist und dauerhaft im öffentlichen Raum aufgestellt ist" - }, - "tagRenderings": [ - "images", + "id": "map", + "name": { + "en": "Maps", + "nl": "Kaarten", + "it": "Mappe", + "ru": "Карты", + "fr": "Cartes", + "de": "Karten" + }, + "minzoom": 12, + "source": { + "osmTags": { + "or": [ + "tourism=map", + "information=map" + ] + } + }, + "title": { + "render": { + "en": "Map", + "nl": "Kaart", + "it": "Mappa", + "ru": "Карта", + "fr": "Carte", + "de": "Karte" + } + }, + "description": { + "en": "A map, meant for tourists which is permanently installed in the public space", + "nl": "Een permantent geinstalleerde kaart", + "it": "Una mappa, destinata ai turisti e che è sistemata in maniera permanente in uno spazio pubblico", + "fr": "Une carte, destinée aux touristes, installée en permanence dans l'espace public", + "de": "Eine Karte, die für Touristen gedacht ist und dauerhaft im öffentlichen Raum aufgestellt ist" + }, + "tagRenderings": [ + "images", + { + "question": { + "en": "On which data is this map based?", + "nl": "Op welke data is deze kaart gebaseerd?", + "it": "Su quali dati si basa questa mappa?", + "fr": "Sur quelles données cette carte est-elle basée ?", + "de": "Auf welchen Daten basiert diese Karte?" + }, + "mappings": [ { - "question": { - "en": "On which data is this map based?", - "nl": "Op welke data is deze kaart gebaseerd?", - "it": "Su quali dati si basa questa mappa?", - "fr": "Sur quelles données cette carte est-elle basée ?", - "de": "Auf welchen Daten basiert diese Karte?" - }, - "mappings": [ - { - "if": { - "and": [ - "map_source=OpenStreetMap", - "not:map_source=" - ] - }, - "then": { - "en": "This map is based on OpenStreetMap", - "nl": "Deze kaart is gebaseerd op OpenStreetMap", - "it": "Questa mappa si basa su OpenStreetMap", - "ru": "Эта карта основана на OpenStreetMap", - "fr": "Cette carte est basée sur OpenStreetMap", - "de": "Diese Karte basiert auf OpenStreetMap" - } - } - ], - "freeform": { - "key": "map_source" - }, - "render": { - "en": "This map is based on {map_source}", - "nl": "Deze kaart is gebaseerd op {map_source}", - "it": "Questa mappa si basa su {map_source}", - "ru": "Эта карта основана на {map_source}", - "fr": "Cette carte est basée sur {map_source}", - "de": "Diese Karte basiert auf {map_source}" - }, - "id": "map-map_source" + "if": { + "and": [ + "map_source=OpenStreetMap", + "not:map_source=" + ] + }, + "then": { + "en": "This map is based on OpenStreetMap", + "nl": "Deze kaart is gebaseerd op OpenStreetMap", + "it": "Questa mappa si basa su OpenStreetMap", + "ru": "Эта карта основана на OpenStreetMap", + "fr": "Cette carte est basée sur OpenStreetMap", + "de": "Diese Karte basiert auf OpenStreetMap" + } + } + ], + "freeform": { + "key": "map_source" + }, + "render": { + "en": "This map is based on {map_source}", + "nl": "Deze kaart is gebaseerd op {map_source}", + "it": "Questa mappa si basa su {map_source}", + "ru": "Эта карта основана на {map_source}", + "fr": "Cette carte est basée sur {map_source}", + "de": "Diese Karte basiert auf {map_source}" + }, + "id": "map-map_source" + }, + { + "id": "map-attribution", + "question": { + "en": "Is the OpenStreetMap-attribution given?", + "nl": "Is de attributie voor OpenStreetMap aanwezig?", + "it": "L’attribuzione a OpenStreetMap è presente?", + "de": "Ist die OpenStreetMap-Attribution vorhanden?", + "fr": "L’attribution à OpenStreetMap est elle-présente ?" + }, + "mappings": [ + { + "if": { + "and": [ + "map_source:attribution=yes" + ] + }, + "then": { + "en": "OpenStreetMap is clearly attributed, including the ODBL-license", + "nl": "De OpenStreetMap-attributie is duidelijk aangegeven, zelf met vermelding van \"ODBL\" ", + "it": "L’attribuzione a OpenStreetMap è chiaramente specificata, inclusa la licenza ODBL", + "de": "OpenStreetMap ist eindeutig attributiert, einschließlich der ODBL-Lizenz", + "fr": "L’attribution est clairement inscrite ainsi que la licence ODBL" + } }, { - "id": "map-attribution", - "question": { - "en": "Is the OpenStreetMap-attribution given?", - "nl": "Is de attributie voor OpenStreetMap aanwezig?", - "it": "L’attribuzione a OpenStreetMap è presente?", - "de": "Ist die OpenStreetMap-Attribution vorhanden?", - "fr": "L’attribution à OpenStreetMap est elle-présente ?" - }, - "mappings": [ - { - "if": { - "and": [ - "map_source:attribution=yes" - ] - }, - "then": { - "en": "OpenStreetMap is clearly attributed, including the ODBL-license", - "nl": "De OpenStreetMap-attributie is duidelijk aangegeven, zelf met vermelding van \"ODBL\" ", - "it": "L’attribuzione a OpenStreetMap è chiaramente specificata, inclusa la licenza ODBL", - "de": "OpenStreetMap ist eindeutig attributiert, einschließlich der ODBL-Lizenz", - "fr": "L’attribution est clairement inscrite ainsi que la licence ODBL" - } - }, - { - "if": { - "and": [ - "map_source:attribution=incomplete" - ] - }, - "then": { - "en": "OpenStreetMap is clearly attributed, but the license is not mentioned", - "nl": "OpenStreetMap is duidelijk aangegeven, maar de licentievermelding ontbreekt", - "it": "L’attribuzione a OpenStreetMap è chiaramente specificata ma la licenza non compare", - "de": "OpenStreetMap ist eindeutig attributiert, aber die Lizenz wird nicht erwähnt", - "fr": "L’attribution est clairement inscrite mais la licence est absente" - } - }, - { - "if": { - "and": [ - "map_source:attribution=sticker" - ] - }, - "then": { - "en": "OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it", - "nl": "OpenStreetMap was oorspronkelijk niet aangeduid, maar iemand plaatste er een sticker", - "it": "Non era presente alcun cenno a OpenStreetMap ma qualcuno vi ha attaccato un adesivo di OpenStreetMap", - "de": "OpenStreetMap wurde nicht erwähnt, aber jemand hat einen OpenStreetMap-Aufkleber darauf geklebt", - "fr": "OpenStreetMap n’est pas mentionné, un sticker OpenStreetMap a été collé" - } - }, - { - "if": { - "and": [ - "map_source:attribution=none" - ] - }, - "then": { - "en": "There is no attribution at all", - "nl": "Er is geen attributie", - "it": "Non c’è alcuna attribuzione", - "fr": "Il n'y a aucune attribution", - "de": "Es gibt überhaupt keine Namensnennung" - } - }, - { - "if": { - "and": [ - "map_source:attribution=no" - ] - }, - "then": { - "nl": "Er is geen attributie", - "en": "There is no attribution at all", - "it": "Non c’è alcuna attribuzione", - "fr": "Il n'y a aucune attribution", - "de": "Es gibt überhaupt keine Namensnennung" - }, - "hideInAnswer": true - } - ], - "condition": { - "or": [ - "map_source~(O|)pen(S|s)treet(M|m)ap", - "map_source=osm", - "map_source=OSM" - ] - } + "if": { + "and": [ + "map_source:attribution=incomplete" + ] + }, + "then": { + "en": "OpenStreetMap is clearly attributed, but the license is not mentioned", + "nl": "OpenStreetMap is duidelijk aangegeven, maar de licentievermelding ontbreekt", + "it": "L’attribuzione a OpenStreetMap è chiaramente specificata ma la licenza non compare", + "de": "OpenStreetMap ist eindeutig attributiert, aber die Lizenz wird nicht erwähnt", + "fr": "L’attribution est clairement inscrite mais la licence est absente" + } + }, + { + "if": { + "and": [ + "map_source:attribution=sticker" + ] + }, + "then": { + "en": "OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it", + "nl": "OpenStreetMap was oorspronkelijk niet aangeduid, maar iemand plaatste er een sticker", + "it": "Non era presente alcun cenno a OpenStreetMap ma qualcuno vi ha attaccato un adesivo di OpenStreetMap", + "de": "OpenStreetMap wurde nicht erwähnt, aber jemand hat einen OpenStreetMap-Aufkleber darauf geklebt", + "fr": "OpenStreetMap n’est pas mentionné, un sticker OpenStreetMap a été collé" + } + }, + { + "if": { + "and": [ + "map_source:attribution=none" + ] + }, + "then": { + "en": "There is no attribution at all", + "nl": "Er is geen attributie", + "it": "Non c’è alcuna attribuzione", + "fr": "Il n'y a aucune attribution", + "de": "Es gibt überhaupt keine Namensnennung" + } + }, + { + "if": { + "and": [ + "map_source:attribution=no" + ] + }, + "then": { + "nl": "Er is geen attributie", + "en": "There is no attribution at all", + "it": "Non c’è alcuna attribuzione", + "fr": "Il n'y a aucune attribution", + "de": "Es gibt überhaupt keine Namensnennung" + }, + "hideInAnswer": true } - ], - "icon": { + ], + "condition": { + "or": [ + "map_source~(O|)pen(S|s)treet(M|m)ap", + "map_source=osm", + "map_source=OSM" + ] + } + } + ], + "presets": [ + { + "tags": [ + "tourism=map" + ], + "title": { + "en": "Map", + "nl": "Kaart", + "it": "Mappa", + "ru": "Карта", + "fr": "Carte", + "de": "Karte" + }, + "description": { + "en": "Add a missing map", + "nl": "Voeg een ontbrekende kaart toe", + "it": "Aggiungi una mappa mancante", + "fr": "Ajouter une carte manquante", + "de": "Fehlende Karte hinzufügen" + } + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "razed:tourism:=information", + "tourism=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { "render": "./assets/layers/map/map.svg", "mappings": [ - { - "if": { - "and": [ - "map_source=OpenStreetMap", - "map_source:attribution=sticker" - ] - }, - "then": "./assets/layers/map/map-stickered.svg" + { + "if": { + "and": [ + "map_source=OpenStreetMap", + "map_source:attribution=sticker" + ] }, - { - "if": { - "and": [ - "map_source=OpenStreetMap", - "map_source:attribution=yes" - ] - }, - "then": "./assets/layers/map/osm-logo-white-bg.svg" + "then": "./assets/layers/map/map-stickered.svg" + }, + { + "if": { + "and": [ + "map_source=OpenStreetMap", + "map_source:attribution=yes" + ] }, - { - "if": { - "and": [ - "map_source=OpenStreetMap" - ] - }, - "then": "./assets/layers/map/osm-logo-buggy-attr.svg" - } + "then": "./assets/layers/map/osm-logo-white-bg.svg" + }, + { + "if": { + "and": [ + "map_source=OpenStreetMap" + ] + }, + "then": "./assets/layers/map/osm-logo-buggy-attr.svg" + } ] - }, - "width": { - "render": "8" - }, - "iconSize": { + }, + "iconSize": { "render": "50,50,center" + }, + "location": [ + "point", + "centroid" + ] }, - "color": { + { + "color": { "render": "#00f" - }, - "presets": [ - { - "tags": [ - "tourism=map" - ], - "title": { - "en": "Map", - "nl": "Kaart", - "it": "Mappa", - "ru": "Карта", - "fr": "Carte", - "de": "Karte" - }, - "description": { - "en": "Add a missing map", - "nl": "Voeg een ontbrekende kaart toe", - "it": "Aggiungi una mappa mancante", - "fr": "Ajouter une carte manquante", - "de": "Fehlende Karte hinzufügen" - } - } - ], - "wayHandling": 2, - "deletion": { - "softDeletionTags": { - "and": [ - "razed:tourism:=information", - "tourism=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + }, + "width": { + "render": "8" + } } + ] } \ No newline at end of file diff --git a/assets/layers/nature_reserve/nature_reserve.json b/assets/layers/nature_reserve/nature_reserve.json index fb5a32e154..ca6baadd22 100644 --- a/assets/layers/nature_reserve/nature_reserve.json +++ b/assets/layers/nature_reserve/nature_reserve.json @@ -1,470 +1,479 @@ { - "id": "nature_reserve", - "name": { - "nl": "Natuurgebied" - }, - "minzoom": 12, - "source": { - "osmTags": { - "and": [ - { - "or": [ - "leisure=nature_reserve", - { - "and": [ - "protect_class!=98", - "boundary=protected_area" - ] - } - ] - } - ] - } - }, - "title": { - "render": { - "nl": "Natuurgebied" - }, - "mappings": [ + "id": "nature_reserve", + "name": { + "nl": "Natuurgebied" + }, + "minzoom": 12, + "source": { + "osmTags": { + "and": [ + { + "or": [ + "leisure=nature_reserve", { - "if": { - "and": [ - "name:nl~*" - ] - }, - "then": { - "nl": "{name:nl}" - } - }, - { - "if": { - "and": [ - "name~*" - ] - }, - "then": { - "nl": "{name}" - } - } - ] - }, - "description": { - "nl": "Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid." - }, - "tagRenderings": [ - "images", - { - "render": { - "nl": "De toegankelijkheid van dit gebied is: {access:description}" - }, - "question": { - "nl": "Is dit gebied toegankelijk?" - }, - "freeform": { - "key": "access:description" - }, - "mappings": [ - { - "if": { - "and": [ - "access=yes", - "fee=" - ] - }, - "then": { - "nl": "Vrij toegankelijk" - } - }, - { - "if": { - "and": [ - "access=no", - "fee=" - ] - }, - "then": { - "nl": "Niet toegankelijk" - } - }, - { - "if": { - "and": [ - "access=private", - "fee=" - ] - }, - "then": { - "nl": "Niet toegankelijk, want privégebied" - } - }, - { - "if": { - "and": [ - "access=permissive", - "fee=" - ] - }, - "then": { - "nl": "Toegankelijk, ondanks dat het privegebied is" - } - }, - { - "if": { - "and": [ - "access=guided", - "fee=" - ] - }, - "then": { - "nl": "Enkel toegankelijk met een gids of tijdens een activiteit" - } - }, - { - "if": { - "and": [ - "access=yes", - "fee=yes" - ] - }, - "then": { - "nl": "Toegankelijk mits betaling" - } - } - ], - "id": "Access tag" - }, - { - "render": { - "nl": "Beheer door {operator}" - }, - "question": { - "nl": "Wie beheert dit gebied?" - }, - "freeform": { - "key": "operator" - }, - "mappings": [ - { - "if": { - "and": [ - "operator=Natuurpunt" - ] - }, - "then": { - "nl": "Dit gebied wordt beheerd door Natuurpunt" - } - }, - { - "if": { - "and": [ - "operator~(n|N)atuurpunt.*" - ] - }, - "then": { - "nl": "Dit gebied wordt beheerd door {operator}" - }, - "hideInAnswer": true - }, - { - "if": { - "and": [ - "operator=Agentschap Natuur en Bos" - ] - }, - "then": { - "nl": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos" - } - } - ], - "id": "Operator tag" - }, - { - "render": { - "nl": "Dit gebied heet {name:nl}" - }, - "question": { - "nl": "Wat is de Nederlandstalige naam van dit gebied?" - }, - "freeform": { - "key": "name:nl" - }, - "condition": { - "and": [ - "name:nl~*" - ] - }, - "id": "Name:nl-tag" - }, - { - "render": { - "nl": "Dit gebied heet {name}" - }, - "question": { - "nl": "Wat is de naam van dit gebied?" - }, - "freeform": { - "key": "name", - "addExtraTags": [ - "noname=" - ] - }, - "condition": { - "and": [ - "name:nl=" - ] - }, - "mappings": [ - { - "if": { - "and": [ - "noname=yes", - "name=" - ] - }, - "then": { - "nl": "Dit gebied heeft geen naam" - } - } - ], - "id": "Name tag" - }, - { - "question": { - "nl": "Zijn honden toegelaten in dit gebied?", - "en": "Are dogs allowed in this nature reserve?", - "it": "I cani sono ammessi in questa riserva naturale?", - "fr": "Les chiens sont-ils autorisés dans cette réserve naturelle ?", - "de": "Sind Hunde in diesem Naturschutzgebiet erlaubt?" - }, - "condition": { - "or": [ - "access=yes", - "access=permissive", - "access=guided" - ] - }, - "mappings": [ - { - "if": "dog=leashed", - "then": { - "nl": "Honden moeten aan de leiband", - "en": "Dogs have to be leashed", - "it": "I cani devono essere tenuti al guinzaglio", - "fr": "Les chiens doivent être tenus en laisse", - "de": "Hunde müssen angeleint sein" - } - }, - { - "if": "dog=no", - "then": { - "nl": "Honden zijn niet toegestaan", - "en": "No dogs allowed", - "it": "I cani non sono ammessi", - "fr": "Chiens interdits", - "de": "Hunde sind nicht erlaubt" - } - }, - { - "if": "dog=yes", - "then": { - "nl": "Honden zijn welkom en mogen vrij rondlopen", - "en": "Dogs are allowed to roam freely", - "it": "I cani sono liberi di girare liberi", - "fr": "Les chiens sont autorisés à se promener librement", - "de": "Hunde dürfen frei herumlaufen" - } - } - ], - "id": "Dogs?" - }, - { - "question": { - "en": "On which webpage can one find more information about this nature reserve?", - "nl": "Op welke webpagina kan men meer informatie vinden over dit natuurgebied?", - "it": "In quale pagina web si possono trovare altre informazioni riguardanti questa riserva naturale?", - "fr": "Sur quelle page web peut-on trouver plus d'informations sur cette réserve naturelle ?", - "de": "Auf welcher Webseite kann man mehr Informationen über dieses Naturschutzgebiet finden?" - }, - "render": "{website}", - "freeform": { - "key": "website", - "type": "url" - }, - "id": "Website" - }, - { - "question": { - "nl": "Wie is de conservator van dit gebied?
Respecteer privacy - geef deze naam enkel als die duidelijk is gepubliceerd", - "en": "Whom is the curator of this nature reserve?
Respect privacy - only fill out a name if this is widely published", - "it": "Chi è il curatore di questa riserva naturale?
Rispetta la privacy (scrivi il nome solo se questo è noto pubblicamente)", - "fr": "Qui est en charge de la conservation de la réserve ?
À ne remplir seulement que si le nom est diffusé au public", - "de": "Wer ist der Verwalter dieses Naturschutzgebietes?
Respektieren Sie die Privatsphäre - geben Sie nur dann einen Namen an, wenn dieser allgemein bekannt ist" - }, - "render": { - "nl": "{curator} is de beheerder van dit gebied", - "en": "{curator} is the curator of this nature reserve", - "it": "{curator} è il curatore di questa riserva naturale", - "fr": "{curator} est en charge de la conservation de la réserve", - "de": "{curator} ist der Pfleger dieses Naturschutzgebietes" - }, - "freeform": { - "key": "curator", - "type": "string" - }, - "id": "Curator" - }, - { - "question": { - "nl": "Waar kan men naartoe emailen voor vragen en meldingen van dit natuurgebied?
Respecteer privacy - geef enkel persoonlijke emailadressen als deze elders zijn gepubliceerd", - "en": "What email adress can one send to with questions and problems with this nature reserve?
Respect privacy - only fill out a personal email address if this is widely published", - "it": "Qual è l’indirizzo email a cui scrivere per fare domande o segnalare problemi su questa riserva naturale?
Rispetta la privacy (compila l’indirizzo email personale solo se è stato reso pubblico)", - "fr": "À quelle adresse courriel peut-on envoyer des questions et des problèmes concernant cette réserve naturelle ?
Respecter la vie privée – renseignez une adresse électronique personnelle seulement si celle-ci est largement publiée", - "de": "An welche Email-Adresse kann man sich bei Fragen und Problemen zu diesem Naturschutzgebiet wenden?
Respektieren Sie die Privatsphäre - geben Sie nur dann eine persönliche Email-Adresse an, wenn diese allgemein bekannt ist" - }, - "render": { - "nl": "{email}", - "en": "{email}", - "ca": "{email}", - "de": "{email}", - "fr": "{email}", - "it": "{email}", - "ru": "{email}", - "id": "{email}" - }, - "freeform": { - "key": "email", - "type": "email" - }, - "id": "Email" - }, - { - "question": { - "nl": "Waar kan men naartoe bellen voor vragen en meldingen van dit natuurgebied?
Respecteer privacy - geef enkel persoonlijke telefoonnummers als deze elders zijn gepubliceerd", - "en": "What phone number can one call to with questions and problems with this nature reserve?
Respect privacy - only fill out a personal phone number address if this is widely published", - "it": "Quale numero di telefono comporre per fare domande o segnalare problemi riguardanti questa riserva naturale?br/>Rispetta la privacy (inserisci il numero di telefono privato solo se questo è noto pubblicamente)", - "fr": "Quel numéro de téléphone peut-on appeler pour poser des questions et résoudre des problèmes concernant cette réserve naturelle ?
Respecter la vie privée – renseignez un numéro de téléphone personnel seulement si celui-ci est largement publié", - "de": "Welche Telefonnummer kann man bei Fragen und Problemen zu diesem Naturschutzgebiet anrufen?
Respektieren Sie die Privatsphäre - geben Sie nur eine Telefonnummer an, wenn diese allgemein bekannt ist" - }, - "render": { - "nl": "{phone}", - "en": "{phone}", - "ca": "{phone}", - "de": "{phone}", - "fr": "{phone}", - "it": "{phone}", - "ru": "{phone}", - "id": "{phone}" - }, - "freeform": { - "key": "phone", - "type": "phone" - }, - "id": "phone" - }, - { - "render": { - "nl": "Extra info: {description}" - }, - "freeform": { - "key": "description" - }, - "id": "Non-editable description {description}" - }, - { - "question": "Is er extra info die je kwijt wil?", - "render": { - "nl": "Extra info: {description:0}" - }, - "freeform": { - "key": "description:0" - }, - "id": "Editable description {description:0}" - }, - { - "render": { - "en": "Surface area: {_surface:ha}Ha", - "nl": "Totale oppervlakte: {_surface:ha}Ha", - "it": "Area: {_surface:ha} ha", - "fr": "Superficie : {_surface:ha} ha", - "de": "Grundfläche: {_surface:ha}ha" - }, - "mappings": [ - { - "if": "_surface:ha=0", - "then": { - "*": "" - } - } - ], - "id": "Surface area" - }, - "wikipedia" - ], - "wayHandling": 2, - "icon": { - "render": "./assets/layers/nature_reserve/nature_reserve.svg" - }, - "width": { - "render": "1" - }, - "iconSize": { - "render": "50,50,center" - }, - "color": { - "render": "#3c3" - }, - "presets": [ - { - "tags": [ - "leisure=nature_reserve", - "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" - ], - "title": { - "nl": "natuurreservaat" - }, - "description": { - "nl": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt" + "and": [ + "protect_class!=98", + "boundary=protected_area" + ] } + ] } - ], - "filter": [ - { - "id": "access", - "options": [ - { - "question": { - "nl": "Vrij te bezoeken" - }, - "osmTags": "access=yes" - } - ] + ] + } + }, + "title": { + "render": { + "nl": "Natuurgebied" + }, + "mappings": [ + { + "if": { + "and": [ + "name:nl~*" + ] }, - { - "id": "dogs", - "options": [ - { - "question": { - "nl": "Alle natuurgebieden" - } - }, - { - "question": { - "nl": "Honden mogen vrij rondlopen" - }, - "osmTags": "dog=yes" - }, - { - "question": { - "nl": "Honden welkom aan de leiband" - }, - "osmTags": { - "or": [ - "dog=yes", - "dog=leashed" - ] - } - } - ] + "then": { + "nl": "{name:nl}" } + }, + { + "if": { + "and": [ + "name~*" + ] + }, + "then": { + "nl": "{name}" + } + } ] + }, + "description": { + "nl": "Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid." + }, + "tagRenderings": [ + "images", + { + "render": { + "nl": "De toegankelijkheid van dit gebied is: {access:description}" + }, + "question": { + "nl": "Is dit gebied toegankelijk?" + }, + "freeform": { + "key": "access:description" + }, + "mappings": [ + { + "if": { + "and": [ + "access=yes", + "fee=" + ] + }, + "then": { + "nl": "Vrij toegankelijk" + } + }, + { + "if": { + "and": [ + "access=no", + "fee=" + ] + }, + "then": { + "nl": "Niet toegankelijk" + } + }, + { + "if": { + "and": [ + "access=private", + "fee=" + ] + }, + "then": { + "nl": "Niet toegankelijk, want privégebied" + } + }, + { + "if": { + "and": [ + "access=permissive", + "fee=" + ] + }, + "then": { + "nl": "Toegankelijk, ondanks dat het privegebied is" + } + }, + { + "if": { + "and": [ + "access=guided", + "fee=" + ] + }, + "then": { + "nl": "Enkel toegankelijk met een gids of tijdens een activiteit" + } + }, + { + "if": { + "and": [ + "access=yes", + "fee=yes" + ] + }, + "then": { + "nl": "Toegankelijk mits betaling" + } + } + ], + "id": "Access tag" + }, + { + "render": { + "nl": "Beheer door {operator}" + }, + "question": { + "nl": "Wie beheert dit gebied?" + }, + "freeform": { + "key": "operator" + }, + "mappings": [ + { + "if": { + "and": [ + "operator=Natuurpunt" + ] + }, + "then": { + "nl": "Dit gebied wordt beheerd door Natuurpunt" + } + }, + { + "if": { + "and": [ + "operator~(n|N)atuurpunt.*" + ] + }, + "then": { + "nl": "Dit gebied wordt beheerd door {operator}" + }, + "hideInAnswer": true + }, + { + "if": { + "and": [ + "operator=Agentschap Natuur en Bos" + ] + }, + "then": { + "nl": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos" + } + } + ], + "id": "Operator tag" + }, + { + "render": { + "nl": "Dit gebied heet {name:nl}" + }, + "question": { + "nl": "Wat is de Nederlandstalige naam van dit gebied?" + }, + "freeform": { + "key": "name:nl" + }, + "condition": { + "and": [ + "name:nl~*" + ] + }, + "id": "Name:nl-tag" + }, + { + "render": { + "nl": "Dit gebied heet {name}" + }, + "question": { + "nl": "Wat is de naam van dit gebied?" + }, + "freeform": { + "key": "name", + "addExtraTags": [ + "noname=" + ] + }, + "condition": { + "and": [ + "name:nl=" + ] + }, + "mappings": [ + { + "if": { + "and": [ + "noname=yes", + "name=" + ] + }, + "then": { + "nl": "Dit gebied heeft geen naam" + } + } + ], + "id": "Name tag" + }, + { + "question": { + "nl": "Zijn honden toegelaten in dit gebied?", + "en": "Are dogs allowed in this nature reserve?", + "it": "I cani sono ammessi in questa riserva naturale?", + "fr": "Les chiens sont-ils autorisés dans cette réserve naturelle ?", + "de": "Sind Hunde in diesem Naturschutzgebiet erlaubt?" + }, + "condition": { + "or": [ + "access=yes", + "access=permissive", + "access=guided" + ] + }, + "mappings": [ + { + "if": "dog=leashed", + "then": { + "nl": "Honden moeten aan de leiband", + "en": "Dogs have to be leashed", + "it": "I cani devono essere tenuti al guinzaglio", + "fr": "Les chiens doivent être tenus en laisse", + "de": "Hunde müssen angeleint sein" + } + }, + { + "if": "dog=no", + "then": { + "nl": "Honden zijn niet toegestaan", + "en": "No dogs allowed", + "it": "I cani non sono ammessi", + "fr": "Chiens interdits", + "de": "Hunde sind nicht erlaubt" + } + }, + { + "if": "dog=yes", + "then": { + "nl": "Honden zijn welkom en mogen vrij rondlopen", + "en": "Dogs are allowed to roam freely", + "it": "I cani sono liberi di girare liberi", + "fr": "Les chiens sont autorisés à se promener librement", + "de": "Hunde dürfen frei herumlaufen" + } + } + ], + "id": "Dogs?" + }, + { + "question": { + "en": "On which webpage can one find more information about this nature reserve?", + "nl": "Op welke webpagina kan men meer informatie vinden over dit natuurgebied?", + "it": "In quale pagina web si possono trovare altre informazioni riguardanti questa riserva naturale?", + "fr": "Sur quelle page web peut-on trouver plus d'informations sur cette réserve naturelle ?", + "de": "Auf welcher Webseite kann man mehr Informationen über dieses Naturschutzgebiet finden?" + }, + "render": "{website}", + "freeform": { + "key": "website", + "type": "url" + }, + "id": "Website" + }, + { + "question": { + "nl": "Wie is de conservator van dit gebied?
Respecteer privacy - geef deze naam enkel als die duidelijk is gepubliceerd", + "en": "Whom is the curator of this nature reserve?
Respect privacy - only fill out a name if this is widely published", + "it": "Chi è il curatore di questa riserva naturale?
Rispetta la privacy (scrivi il nome solo se questo è noto pubblicamente)", + "fr": "Qui est en charge de la conservation de la réserve ?
À ne remplir seulement que si le nom est diffusé au public", + "de": "Wer ist der Verwalter dieses Naturschutzgebietes?
Respektieren Sie die Privatsphäre - geben Sie nur dann einen Namen an, wenn dieser allgemein bekannt ist" + }, + "render": { + "nl": "{curator} is de beheerder van dit gebied", + "en": "{curator} is the curator of this nature reserve", + "it": "{curator} è il curatore di questa riserva naturale", + "fr": "{curator} est en charge de la conservation de la réserve", + "de": "{curator} ist der Pfleger dieses Naturschutzgebietes" + }, + "freeform": { + "key": "curator", + "type": "string" + }, + "id": "Curator" + }, + { + "question": { + "nl": "Waar kan men naartoe emailen voor vragen en meldingen van dit natuurgebied?
Respecteer privacy - geef enkel persoonlijke emailadressen als deze elders zijn gepubliceerd", + "en": "What email adress can one send to with questions and problems with this nature reserve?
Respect privacy - only fill out a personal email address if this is widely published", + "it": "Qual è l’indirizzo email a cui scrivere per fare domande o segnalare problemi su questa riserva naturale?
Rispetta la privacy (compila l’indirizzo email personale solo se è stato reso pubblico)", + "fr": "À quelle adresse courriel peut-on envoyer des questions et des problèmes concernant cette réserve naturelle ?
Respecter la vie privée – renseignez une adresse électronique personnelle seulement si celle-ci est largement publiée", + "de": "An welche Email-Adresse kann man sich bei Fragen und Problemen zu diesem Naturschutzgebiet wenden?
Respektieren Sie die Privatsphäre - geben Sie nur dann eine persönliche Email-Adresse an, wenn diese allgemein bekannt ist" + }, + "render": { + "nl": "{email}", + "en": "{email}", + "ca": "{email}", + "de": "{email}", + "fr": "{email}", + "it": "{email}", + "ru": "{email}", + "id": "{email}" + }, + "freeform": { + "key": "email", + "type": "email" + }, + "id": "Email" + }, + { + "question": { + "nl": "Waar kan men naartoe bellen voor vragen en meldingen van dit natuurgebied?
Respecteer privacy - geef enkel persoonlijke telefoonnummers als deze elders zijn gepubliceerd", + "en": "What phone number can one call to with questions and problems with this nature reserve?
Respect privacy - only fill out a personal phone number address if this is widely published", + "it": "Quale numero di telefono comporre per fare domande o segnalare problemi riguardanti questa riserva naturale?br/>Rispetta la privacy (inserisci il numero di telefono privato solo se questo è noto pubblicamente)", + "fr": "Quel numéro de téléphone peut-on appeler pour poser des questions et résoudre des problèmes concernant cette réserve naturelle ?
Respecter la vie privée – renseignez un numéro de téléphone personnel seulement si celui-ci est largement publié", + "de": "Welche Telefonnummer kann man bei Fragen und Problemen zu diesem Naturschutzgebiet anrufen?
Respektieren Sie die Privatsphäre - geben Sie nur eine Telefonnummer an, wenn diese allgemein bekannt ist" + }, + "render": { + "nl": "{phone}", + "en": "{phone}", + "ca": "{phone}", + "de": "{phone}", + "fr": "{phone}", + "it": "{phone}", + "ru": "{phone}", + "id": "{phone}" + }, + "freeform": { + "key": "phone", + "type": "phone" + }, + "id": "phone" + }, + { + "render": { + "nl": "Extra info: {description}" + }, + "freeform": { + "key": "description" + }, + "id": "Non-editable description" + }, + { + "question": "Is er extra info die je kwijt wil?", + "render": { + "nl": "Extra info: {description:0}" + }, + "freeform": { + "key": "description:0" + }, + "id": "Editable description" + }, + { + "render": { + "en": "Surface area: {_surface:ha}Ha", + "nl": "Totale oppervlakte: {_surface:ha}Ha", + "it": "Area: {_surface:ha} ha", + "fr": "Superficie : {_surface:ha} ha", + "de": "Grundfläche: {_surface:ha}ha" + }, + "mappings": [ + { + "if": "_surface:ha=0", + "then": { + "*": "" + } + } + ], + "id": "Surface area" + }, + "wikipedia" + ], + "presets": [ + { + "tags": [ + "leisure=nature_reserve", + "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" + ], + "title": { + "nl": "natuurreservaat" + }, + "description": { + "nl": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt" + } + } + ], + "filter": [ + { + "id": "access", + "options": [ + { + "question": { + "nl": "Vrij te bezoeken" + }, + "osmTags": "access=yes" + } + ] + }, + { + "id": "dogs", + "options": [ + { + "question": { + "nl": "Alle natuurgebieden" + } + }, + { + "question": { + "nl": "Honden mogen vrij rondlopen" + }, + "osmTags": "dog=yes" + }, + { + "question": { + "nl": "Honden welkom aan de leiband" + }, + "osmTags": { + "or": [ + "dog=yes", + "dog=leashed" + ] + } + } + ] + } + ], + "mapRendering": [ + { + "icon": { + "render": "./assets/layers/nature_reserve/nature_reserve.svg" + }, + "iconSize": { + "render": "50,50,center" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#3c3" + }, + "width": { + "render": "1" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/observation_tower/Tower_observation.svg b/assets/layers/observation_tower/Tower_observation.svg index 2dd693970f..cda4271f85 100644 --- a/assets/layers/observation_tower/Tower_observation.svg +++ b/assets/layers/observation_tower/Tower_observation.svg @@ -1,38 +1,37 @@ - - - - image/svgxml - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + width="14" + height="14" + viewBox="0 0 14 14" + id="svg2"> + + + + image/svgxml + + + + + + + + \ No newline at end of file diff --git a/assets/layers/observation_tower/observation_tower.json b/assets/layers/observation_tower/observation_tower.json index ab05bd66dd..c098033d0c 100644 --- a/assets/layers/observation_tower/observation_tower.json +++ b/assets/layers/observation_tower/observation_tower.json @@ -1,209 +1,210 @@ { - "id": "observation_tower", - "name": { - "en": "Observation towers", - "nl": "Uitkijktorens", - "ru": "Смотровые башни", - "de": "Aussichtstürme" + "id": "observation_tower", + "name": { + "en": "Observation towers", + "nl": "Uitkijktorens", + "ru": "Смотровые башни", + "de": "Aussichtstürme" + }, + "minzoom": 8, + "title": { + "render": { + "en": "Observation tower", + "nl": "Uitkijktoren", + "ru": "Смотровая башня", + "de": "Beobachtungsturm" }, - "minzoom": 8, - "title": { - "render": { - "en": "Observation tower", - "nl": "Uitkijktoren", - "ru": "Смотровая башня", - "de": "Beobachtungsturm" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "en": "{name}", - "nl": "{name}", - "ru": "{name}", - "de": "{name}" - } - } + "mappings": [ + { + "if": "name~*", + "then": { + "en": "{name}", + "nl": "{name}", + "ru": "{name}", + "de": "{name}" + } + } + ] + }, + "description": { + "en": "Towers with a panoramic view", + "nl": "Torens om van het uitzicht te genieten", + "de": "Türme zur Aussicht auf die umgebende Landschaft" + }, + "tagRenderings": [ + "images", + { + "question": { + "en": "What is the name of this tower?", + "nl": "Heeft deze toren een naam?", + "de": "Wie heißt dieser Turm?" + }, + "render": { + "en": "This tower is called {name}", + "nl": "Deze toren heet {name}", + "de": "Der Name dieses Turms lautet {name}" + }, + "freeform": { + "key": "name" + }, + "mappings": [ + { + "if": "noname=yes", + "then": { + "en": "This tower doesn't have a specific name", + "nl": "Deze toren heeft geen specifieke naam", + "de": "Dieser Turm hat keinen eigenen Namen" + } + } + ], + "id": "name" + }, + { + "question": { + "en": "What is the height of this tower?", + "nl": "Hoe hoog is deze toren?", + "de": "Wie hoch ist dieser Turm?" + }, + "render": { + "en": "This tower is {height} high", + "nl": "Deze toren is {height} hoog", + "de": "Dieser Turm ist {height} hoch" + }, + "freeform": { + "key": "height", + "type": "pfloat" + }, + "id": "Height" + }, + { + "question": { + "en": "Who maintains this tower?", + "nl": "Wie onderhoudt deze toren?", + "de": "Wer betreibt diesen Turm?" + }, + "render": { + "nl": "Wordt onderhouden door {operator}", + "en": "Maintained by {operator}", + "de": "Betrieben von {operator}" + }, + "freeform": { + "key": "operator" + }, + "id": "Operator" + }, + "website", + { + "question": { + "en": "How much does one have to pay to enter this tower?", + "nl": "Hoeveel moet men betalen om deze toren te bezoeken?", + "de": "Was kostet der Zugang zu diesem Turm?" + }, + "render": { + "en": "Visiting this tower costs {charge}", + "nl": "Deze toren bezoeken kost {charge}", + "de": "Der Besuch des Turms kostet {charge}" + }, + "freeform": { + "key": "charge", + "addExtraTags": [ + "fee=yes" ] - }, - "description": { - "en": "Towers with a panoramic view", - "nl": "Torens om van het uitzicht te genieten", - "de": "Türme zur Aussicht auf die umgebende Landschaft" - }, - "tagRenderings": [ - "images", + }, + "mappings": [ { - "question": { - "en": "What is the name of this tower?", - "nl": "Heeft deze toren een naam?", - "de": "Wie heißt dieser Turm?" - }, - "render": { - "en": "This tower is called {name}", - "nl": "Deze toren heet {name}", - "de": "Der Name dieses Turms lautet {name}" - }, - "freeform": { - "key": "name" - }, - "mappings": [ - { - "if": "noname=yes", - "then": { - "en": "This tower doesn't have a specific name", - "nl": "Deze toren heeft geen specifieke naam", - "de": "Dieser Turm hat keinen eigenen Namen" - } - } - ], - "id": "name" - }, - { - "question": { - "en": "What is the height of this tower?", - "nl": "Hoe hoog is deze toren?", - "de": "Wie hoch ist dieser Turm?" - }, - "render": { - "en": "This tower is {height} high", - "nl": "Deze toren is {height} hoog", - "de": "Dieser Turm ist {height} hoch" - }, - "freeform": { - "key": "height", - "type": "pfloat" - }, - "id": "Height" - }, - { - "question": { - "en": "Who maintains this tower?", - "nl": "Wie onderhoudt deze toren?", - "de": "Wer betreibt diesen Turm?" - }, - "render": { - "nl": "Wordt onderhouden door {operator}", - "en": "Maintained by {operator}", - "de": "Betrieben von {operator}" - }, - "freeform": { - "key": "operator" - }, - "id": "Operator" - }, - "website", - { - "question": { - "en": "How much does one have to pay to enter this tower?", - "nl": "Hoeveel moet men betalen om deze toren te bezoeken?", - "de": "Was kostet der Zugang zu diesem Turm?" - }, - "render": { - "en": "Visiting this tower costs {charge}", - "nl": "Deze toren bezoeken kost {charge}", - "de": "Der Besuch des Turms kostet {charge}" - }, - "freeform": { - "key": "charge", - "addExtraTags": [ - "fee=yes" - ] - }, - "mappings": [ - { - "if": { - "and": [ - "fee=no", - "charge=" - ] - }, - "then": { - "en": "Free to visit", - "nl": "Gratis te bezoeken", - "de": "Eintritt kostenlos" - } - } - ], - "id": "Fee" - }, - { - "builtin": "payment-options", - "override": { - "condition": { - "or": [ - "fee=yes", - "charge~*" - ] - } - }, - "id": "Payment methods" - }, - "wheelchair-access", - "wikipedia" - ], - "wayHandling": 1, - "icon": { - "render": "circle:white;./assets/layers/observation_tower/Tower_observation.svg" - }, - "width": { - "render": "2" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#00f" - }, - "presets": [ - { - "tags": [ - "man_made=tower", - "tower:type=observation" - ], - "title": { - "en": "observation tower", - "nl": "Uitkijktoren", - "ru": "смотровая башня", - "de": "Beobachtungsturm" - }, - "description": { - "nl": "Een publiek toegankelijke uitkijktoren" - } - } - ], - "source": { - "osmTags": { + "if": { "and": [ - "tower:type=observation" + "fee=no", + "charge=" ] + }, + "then": { + "en": "Free to visit", + "nl": "Gratis te bezoeken", + "de": "Eintritt kostenlos" + } } + ], + "id": "Fee" }, - "units": [ - { - "appliesToKey": [ - "height" - ], - "applicableUnits": [ - { - "canonicalDenomination": "m", - "alternativeDenomination": [ - "meter", - "mtr" - ], - "human": { - "nl": " meter", - "en": " meter", - "ru": " метр", - "de": " Meter" - } - } - ], - "eraseInvalidValues": true + { + "builtin": "payment-options", + "override": { + "condition": { + "or": [ + "fee=yes", + "charge~*" + ] } - ], - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + }, + "id": "Payment methods" + }, + "wheelchair-access", + "wikipedia" + ], + "presets": [ + { + "tags": [ + "man_made=tower", + "tower:type=observation" + ], + "title": { + "en": "observation tower", + "nl": "Uitkijktoren", + "ru": "смотровая башня", + "de": "Beobachtungsturm" + }, + "description": { + "nl": "Een publiek toegankelijke uitkijktoren" + } } + ], + "source": { + "osmTags": { + "and": [ + "tower:type=observation" + ] + } + }, + "units": [ + { + "appliesToKey": [ + "height" + ], + "applicableUnits": [ + { + "canonicalDenomination": "m", + "alternativeDenomination": [ + "meter", + "mtr" + ], + "human": { + "nl": " meter", + "en": " meter", + "ru": " метр", + "de": " Meter" + } + } + ], + "eraseInvalidValues": true + } + ], + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { + "render": "circle:white;./assets/layers/observation_tower/Tower_observation.svg" + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point", + "centroid" + ] + } + ] } \ No newline at end of file diff --git a/assets/layers/parking/parking.json b/assets/layers/parking/parking.json index b428d5f991..8e7764b35e 100644 --- a/assets/layers/parking/parking.json +++ b/assets/layers/parking/parking.json @@ -1,98 +1,65 @@ { - "id": "parking", - "name": { - "nl": "Parking" - }, - "minzoom": 12, - "source": { - "osmTags": { - "and": [ - { - "or": [ - "amenity=parking", - "amenity=motorcycle_parking", - "amenity=bicycle_parking" - ] - } - ] - } - }, - "title": { - "render": { - "nl": "Parking" - }, - "mappings": [ - { - "if": "amenity=parking", - "then": { - "nl": "{name:nl}" - } - }, - { - "if": "amenity=motorcycle_parking", - "then": { - "nl": "{name}" - } - }, - { - "if": "amenity=bicycle_parking", - "then": { - "nl": "Fietsenstalling" - } - } - ] - }, - "icon": { - "render": "./assets/layers/parking/parking.svg" - }, - "description": { - "nl": "Parking" - }, - "tagRenderings": [ - "images" - ], - "wayHandling": 1, - "iconSize": { - "render": "36,36,center" - }, - "color": { - "render": "#E1AD01" - }, - "presets": [ - { - "tags": [ - "amenity=bicycle_parking" - ], - "title": { - "nl": "fietsparking" - }, - "description": { - "nl": "Voeg hier een fietsenstalling toe" - } - }, - { - "tags": [ - "amenity=parking" - ], - "title": { - "nl": "parking" - }, - "description": { - "nl": "Voeg hier een parking voor auto's toe" - } - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity:={amenity}", - "amenity=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + "id": "parking", + "name": { + "nl": "Parking" + }, + "minzoom": 12, + "source": { + "osmTags": "amenity=parking" + }, + "title": { + "render": { + "nl": "Parking voor auto's", + "en": "Car parking" } + }, + "description": { + "en": "A layer showing car parkings", + "nl": "Deze laag toont autoparkings" + }, + "tagRenderings": [ + "images" + ], + "presets": [ + { + "tags": [ + "amenity=parking" + ], + "title": { + "nl": "parking voor auto's", + "en": "car parking" + } + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity:={amenity}", + "amenity=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { + "render": "./assets/layers/parking/parking.svg" + }, + "iconSize": { + "render": "36,36,center" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "width": 2, + "color": "#ddcc00" + } + ] } \ No newline at end of file diff --git a/assets/layers/picnic_table/picnic_table.json b/assets/layers/picnic_table/picnic_table.json index d98331acc1..fd06f63f4f 100644 --- a/assets/layers/picnic_table/picnic_table.json +++ b/assets/layers/picnic_table/picnic_table.json @@ -1,119 +1,123 @@ { - "id": "picnic_table", - "name": { - "en": "Picnic tables", - "nl": "Picnictafels", - "it": "Tavoli da picnic", - "ru": "Столы для пикника", - "fr": "Tables de pique-nique", - "de": "Picknick-Tische" - }, - "minzoom": 12, - "source": { - "osmTags": "leisure=picnic_table" - }, - "title": { - "render": { - "en": "Picnic table", - "nl": "Picnictafel", - "it": "Tavolo da picnic", - "ru": "Стол для пикника", - "fr": "Table de pique-nique", - "de": "Picknick-Tisch" - } - }, - "description": { - "en": "The layer showing picnic tables", - "nl": "Deze laag toont picnictafels", - "it": "Il livello che mostra i tavoli da picnic", - "fr": "La couche montrant les tables de pique-nique", - "ru": "Слой, отображающий столы для пикника", - "de": "Die Ebene zeigt Picknicktische an" - }, - "tagRenderings": [ - { - "question": { - "en": "What material is this picnic table made of?", - "nl": "Van welk materiaal is deze picnictafel gemaakt?", - "it": "Di che materiale è fatto questo tavolo da picnic?", - "de": "Aus welchem Material besteht dieser Picknicktisch?", - "ru": "Из чего изготовлен этот стол для пикника?", - "fr": "En quel matériau est faite la table de pique-nique ?" - }, - "render": { - "en": "This picnic table is made of {material}", - "nl": "Deze picnictafel is gemaakt van {material}", - "it": "Questo tavolo da picnic è fatto di {material}", - "de": "Dieser Picknicktisch besteht aus {material}", - "ru": "Этот стол для пикника сделан из {material}", - "fr": "La table est faite en {material}" - }, - "freeform": { - "key": "material" - }, - "mappings": [ - { - "if": "material=wood", - "then": { - "en": "This is a wooden picnic table", - "nl": "Deze picnictafel is gemaakt uit hout", - "it": "È un tavolo da picnic in legno", - "ru": "Это деревянный стол для пикника", - "de": "Dies ist ein Picknicktisch aus Holz", - "fr": "C’est une table en bois" - } - }, - { - "if": "material=concrete", - "then": { - "en": "This is a concrete picnic table", - "nl": "Deze picnictafel is gemaakt uit beton", - "it": "È un tavolo da picnic in cemento", - "ru": "Это бетонный стол для пикника", - "de": "Dies ist ein Picknicktisch aus Beton", - "fr": "C’est une table en béton" - } - } - ], - "id": "picnic_table-material" - } - ], - "icon": { - "render": "circle:#e6cf39;./assets/layers/picnic_table/picnic_table.svg" - }, - "iconSize": { - "render": "35,35,center" - }, - "color": { - "render": "#00f" - }, - "presets": [ - { - "tags": [ - "leisure=picnic_table" - ], - "title": { - "en": "picnic table", - "nl": "picnic-tafel", - "it": "tavolo da picnic", - "ru": "стол для пикника", - "de": "picknicktisch", - "fr": "table de pique-nique" - } - } - ], - "wayHandling": 1, - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity:={amenity}", - "amenity=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + "id": "picnic_table", + "name": { + "en": "Picnic tables", + "nl": "Picnictafels", + "it": "Tavoli da picnic", + "ru": "Столы для пикника", + "fr": "Tables de pique-nique", + "de": "Picknick-Tische" + }, + "minzoom": 12, + "source": { + "osmTags": "leisure=picnic_table" + }, + "title": { + "render": { + "en": "Picnic table", + "nl": "Picnictafel", + "it": "Tavolo da picnic", + "ru": "Стол для пикника", + "fr": "Table de pique-nique", + "de": "Picknick-Tisch" } + }, + "description": { + "en": "The layer showing picnic tables", + "nl": "Deze laag toont picnictafels", + "it": "Il livello che mostra i tavoli da picnic", + "fr": "La couche montrant les tables de pique-nique", + "ru": "Слой, отображающий столы для пикника", + "de": "Die Ebene zeigt Picknicktische an" + }, + "tagRenderings": [ + { + "question": { + "en": "What material is this picnic table made of?", + "nl": "Van welk materiaal is deze picnictafel gemaakt?", + "it": "Di che materiale è fatto questo tavolo da picnic?", + "de": "Aus welchem Material besteht dieser Picknicktisch?", + "ru": "Из чего изготовлен этот стол для пикника?", + "fr": "En quel matériau est faite la table de pique-nique ?" + }, + "render": { + "en": "This picnic table is made of {material}", + "nl": "Deze picnictafel is gemaakt van {material}", + "it": "Questo tavolo da picnic è fatto di {material}", + "de": "Dieser Picknicktisch besteht aus {material}", + "ru": "Этот стол для пикника сделан из {material}", + "fr": "La table est faite en {material}" + }, + "freeform": { + "key": "material" + }, + "mappings": [ + { + "if": "material=wood", + "then": { + "en": "This is a wooden picnic table", + "nl": "Deze picnictafel is gemaakt uit hout", + "it": "È un tavolo da picnic in legno", + "ru": "Это деревянный стол для пикника", + "de": "Dies ist ein Picknicktisch aus Holz", + "fr": "C’est une table en bois" + } + }, + { + "if": "material=concrete", + "then": { + "en": "This is a concrete picnic table", + "nl": "Deze picnictafel is gemaakt uit beton", + "it": "È un tavolo da picnic in cemento", + "ru": "Это бетонный стол для пикника", + "de": "Dies ist ein Picknicktisch aus Beton", + "fr": "C’est une table en béton" + } + } + ], + "id": "picnic_table-material" + } + ], + "presets": [ + { + "tags": [ + "leisure=picnic_table" + ], + "title": { + "en": "picnic table", + "nl": "picnic-tafel", + "it": "tavolo da picnic", + "ru": "стол для пикника", + "de": "picknicktisch", + "fr": "table de pique-nique" + } + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity:={amenity}", + "amenity=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { + "render": "circle:#e6cf39;./assets/layers/picnic_table/picnic_table.svg" + }, + "iconSize": { + "render": "35,35,center" + }, + "location": [ + "point", + "centroid" + ] + } + ] } \ No newline at end of file diff --git a/assets/layers/play_forest/play_forest.json b/assets/layers/play_forest/play_forest.json index 0b1f2485ed..227311cadc 100644 --- a/assets/layers/play_forest/play_forest.json +++ b/assets/layers/play_forest/play_forest.json @@ -1,120 +1,123 @@ { - "id": "play_forest", - "name": { - "nl": "Speelbossen" + "id": "play_forest", + "name": { + "nl": "Speelbossen" + }, + "minzoom": 13, + "source": { + "osmTags": { + "and": [ + "playground=forest" + ] + } + }, + "title": { + "render": { + "nl": "Speelbos" }, - "minzoom": 13, - "source": { - "osmTags": { - "and": [ - "playground=forest" - ] + "mappings": [ + { + "if": "name~Speelbos.*", + "then": { + "nl": "{name}" } - }, - "title": { - "render": { - "nl": "Speelbos" - }, - "mappings": [ - { - "if": "name~Speelbos.*", - "then": { - "nl": "{name}" - } - }, - { - "if": "name~*", - "then": { - "nl": "Speelbos {name}" - } - } - ] - }, - "description": { - "nl": "Een speelbos is een vrij toegankelijke zone in een bos" - }, - "tagRenderings": [ - "images", - { - "question": "Wie beheert dit gebied?", - "render": "Dit gebied wordt beheerd door {operator}", - "freeform": { - "key": "operator" - }, - "mappings": [ - { - "if": "operator~[aA][nN][bB]", - "then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos", - "hideInAnswer": true - }, - { - "if": "operator=Agenstchap Natuur en Bos", - "then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos" - } - ], - "id": "play_forest-operator" - }, - { - "id": "play_forest-opening_hours", - "question": "Wanneer is deze speelzone toegankelijk?", - "mappings": [ - { - "if": "opening_hours=08:00-22:00", - "then": "Het hele jaar door overdag toegankelijk (van 08:00 tot 22:00)" - }, - { - "if": "opening_hours=Jul-Aug 08:00-22:00", - "then": "Enkel in de zomervakantie en overdag toegankelijk (van 1 juli tot 31 augustus, van 08:00 tot 22:00" - } - ] - }, - { - "question": "Wie kan men emailen indien er problemen zijn met de speelzone?", - "render": "De bevoegde dienst kan bereikt worden via {email}", - "freeform": { - "key": "email", - "type": "email" - }, - "id": "play_forest-email" - }, - { - "question": "Wie kan men bellen indien er problemen zijn met de speelzone?", - "render": "De bevoegde dienst kan getelefoneerd worden via {phone}", - "freeform": { - "key": "phone", - "type": "phone" - }, - "id": "play_forest-phone" - }, - "questions", - { - "id": "play_forest-reviews", - "render": "{reviews(name, play_forest)}" + }, + { + "if": "name~*", + "then": { + "nl": "Speelbos {name}" } - ], - "hideFromOverview": false, - "icon": { - "render": "./assets/layers/play_forest/icon.svg" + } + ] + }, + "description": { + "nl": "Een speelbos is een vrij toegankelijke zone in een bos" + }, + "tagRenderings": [ + "images", + { + "question": "Wie beheert dit gebied?", + "render": "Dit gebied wordt beheerd door {operator}", + "freeform": { + "key": "operator" + }, + "mappings": [ + { + "if": "operator~[aA][nN][bB]", + "then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos", + "hideInAnswer": true + }, + { + "if": "operator=Agenstchap Natuur en Bos", + "then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos" + } + ], + "id": "play_forest-operator" }, - "width": { - "render": "2" + { + "id": "play_forest-opening_hours", + "question": "Wanneer is deze speelzone toegankelijk?", + "mappings": [ + { + "if": "opening_hours=08:00-22:00", + "then": "Het hele jaar door overdag toegankelijk (van 08:00 tot 22:00)" + }, + { + "if": "opening_hours=Jul-Aug 08:00-22:00", + "then": "Enkel in de zomervakantie en overdag toegankelijk (van 1 juli tot 31 augustus, van 08:00 tot 22:00" + } + ] }, - "iconSize": { + { + "question": "Wie kan men emailen indien er problemen zijn met de speelzone?", + "render": "De bevoegde dienst kan bereikt worden via {email}", + "freeform": { + "key": "email", + "type": "email" + }, + "id": "play_forest-email" + }, + { + "question": "Wie kan men bellen indien er problemen zijn met de speelzone?", + "render": "De bevoegde dienst kan getelefoneerd worden via {phone}", + "freeform": { + "key": "phone", + "type": "phone" + }, + "id": "play_forest-phone" + }, + "questions", + { + "id": "play_forest-reviews", + "render": "{reviews(name, play_forest)}" + } + ], + "hideFromOverview": false, + "presets": [ + { + "title": "Speelbos", + "tags": [ + "leisure=playground", + "playground=forest", + "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" + ], + "description": "Een zone in het bos, duidelijk gemarkeerd als speelzone met de overeenkomstige borden.
" + } + ], + "mapRendering": [ + { + "icon": "./assets/layers/play_forest/icon.svg", + "iconSize": { "render": "40,40,center" + }, + "location": [ + "point", + "centroid" + ] }, - "color": { - "render": "#007055" - }, - "presets": [ - { - "title": "Speelbos", - "tags": [ - "leisure=playground", - "playground=forest", - "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" - ], - "description": "Een zone in het bos, duidelijk gemarkeerd als speelzone met de overeenkomstige borden.
" - } - ], - "wayHandling": 2 + { + "color": "#007055", + "width": "2" + } + ] } \ No newline at end of file diff --git a/assets/layers/playground/playground.json b/assets/layers/playground/playground.json index 5a80bbdefa..b6df6429ac 100644 --- a/assets/layers/playground/playground.json +++ b/assets/layers/playground/playground.json @@ -1,549 +1,557 @@ { - "id": "playground", - "name": { - "nl": "Speeltuinen", - "en": "Playgrounds", - "ru": "Детские площадки", - "de": "Spielplätze", - "it": "Campi da gioco", - "fr": "Aire de jeu" + "id": "playground", + "name": { + "nl": "Speeltuinen", + "en": "Playgrounds", + "ru": "Детские площадки", + "de": "Spielplätze", + "it": "Campi da gioco", + "fr": "Aire de jeu" + }, + "minzoom": 13, + "source": { + "osmTags": { + "and": [ + "leisure=playground", + "playground!=forest" + ] + } + }, + "calculatedTags": [ + "_size_classification=Number(feat.properties._surface) < 10 ? 'small' : (Number(feat.properties._surface) < 100 ? 'medium' : 'large') " + ], + "description": { + "nl": "Speeltuinen", + "en": "Playgrounds", + "it": "Parchi giochi", + "ru": "Детские площадки", + "de": "Spielplätze", + "fr": "Aire de jeu" + }, + "title": { + "render": { + "nl": "Speeltuin", + "en": "Playground", + "it": "Parco giochi", + "ru": "Детская площадка", + "de": "Spielplatz", + "fr": "Aire de jeu" }, - "minzoom": 13, - "source": { - "osmTags": { - "and": [ - "leisure=playground", - "playground!=forest" - ] + "mappings": [ + { + "if": "name~*", + "then": { + "nl": "Speeltuin {name}", + "en": "Playground {name}", + "it": "Parco giochi {name}", + "ru": "Детская площадка {name}", + "de": "Spielplatz {name}", + "fr": "Aire de jeu {name}" } - }, - "calculatedTags": [ - "_size_classification=Number(feat.properties._surface) < 10 ? 'small' : (Number(feat.properties._surface) < 100 ? 'medium' : 'large') " - ], - "description": { - "nl": "Speeltuinen", - "en": "Playgrounds", - "it": "Parchi giochi", - "ru": "Детские площадки", - "de": "Spielplätze", - "fr": "Aire de jeu" - }, - "title": { - "render": { - "nl": "Speeltuin", - "en": "Playground", - "it": "Parco giochi", - "ru": "Детская площадка", - "de": "Spielplatz", - "fr": "Aire de jeu" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "nl": "Speeltuin {name}", - "en": "Playground {name}", - "it": "Parco giochi {name}", - "ru": "Детская площадка {name}", - "de": "Spielplatz {name}", - "fr": "Aire de jeu {name}" - } - } - ] - }, - "tagRenderings": [ - "images", + } + ] + }, + "tagRenderings": [ + "images", + { + "question": { + "nl": "Wat is de ondergrond van deze speeltuin?
Indien er verschillende ondergronden zijn, neem de meest voorkomende", + "en": "Which is the surface of this playground?
If there are multiple, select the most occuring one", + "it": "Qual è la superficie di questo parco giochi?
Se ve ne è più di una, seleziona quella predominante", + "de": "Welche Oberfläche hat dieser Spielplatz?
Wenn es mehrere gibt, wähle die am häufigsten vorkommende aus", + "fr": "De quelle matière est la surface de l’aire de jeu ?
Pour plusieurs matières, sélectionner la principale" + }, + "render": { + "nl": "De ondergrond is {surface}", + "en": "The surface is {surface}", + "it": "La superficie è {surface}", + "ru": "Поверхность - {surface}", + "de": "Die Oberfläche ist {surface}", + "fr": "La surface est en {surface}" + }, + "freeform": { + "key": "surface" + }, + "mappings": [ { - "question": { - "nl": "Wat is de ondergrond van deze speeltuin?
Indien er verschillende ondergronden zijn, neem de meest voorkomende", - "en": "Which is the surface of this playground?
If there are multiple, select the most occuring one", - "it": "Qual è la superficie di questo parco giochi?
Se ve ne è più di una, seleziona quella predominante", - "de": "Welche Oberfläche hat dieser Spielplatz?
Wenn es mehrere gibt, wähle die am häufigsten vorkommende aus", - "fr": "De quelle matière est la surface de l’aire de jeu ?
Pour plusieurs matières, sélectionner la principale" - }, - "render": { - "nl": "De ondergrond is {surface}", - "en": "The surface is {surface}", - "it": "La superficie è {surface}", - "ru": "Поверхность - {surface}", - "de": "Die Oberfläche ist {surface}", - "fr": "La surface est en {surface}" - }, - "freeform": { - "key": "surface" - }, - "mappings": [ - { - "if": "surface=grass", - "then": { - "nl": "De ondergrond is gras", - "en": "The surface is grass", - "it": "La superficie è prato", - "ru": "Поверхность - трава", - "de": "Die Oberfläche ist Gras", - "fr": "La surface est en gazon" - } - }, - { - "if": "surface=sand", - "then": { - "nl": "De ondergrond is zand", - "en": "The surface is sand", - "it": "La superficie è sabbia", - "ru": "Поверхность - песок", - "de": "Die Oberfläche ist Sand", - "fr": "La surface est en sable" - } - }, - { - "if": "surface=woodchips", - "then": { - "nl": "De ondergrond bestaat uit houtsnippers", - "en": "The surface consist of woodchips", - "it": "La superficie consiste di trucioli di legno", - "de": "Die Oberfläche besteht aus Holzschnitzeln", - "ru": "Покрытие из щепы", - "fr": "La surface est en copeaux de bois" - } - }, - { - "if": "surface=paving_stones", - "then": { - "nl": "De ondergrond bestaat uit stoeptegels", - "en": "The surface is paving stones", - "it": "La superficie è mattonelle regolari", - "ru": "Поверхность - брусчатка", - "de": "Die Oberfläche ist Pflastersteine", - "fr": "La surface est en pavés" - } - }, - { - "if": "surface=asphalt", - "then": { - "nl": "De ondergrond is asfalt", - "en": "The surface is asphalt", - "it": "La superficie è asfalto", - "ru": "Поверхность - асфальт", - "de": "Die Oberfläche ist Asphalt", - "fr": "La surface est en bitume" - } - }, - { - "if": "surface=concrete", - "then": { - "nl": "De ondergrond is beton", - "en": "The surface is concrete", - "it": "La superficie è cemento", - "ru": "Поверхность - бетон", - "de": "Die Oberfläche ist Beton", - "fr": "La surface est en béton" - } - }, - { - "if": "surface=unpaved", - "then": { - "nl": "De ondergrond is onverhard", - "en": "The surface is unpaved", - "it": "La superficie è non pavimentato", - "de": "Die Oberfläche ist unbefestigt", - "fr": "La surface n’a pas de revêtement" - }, - "hideInAnswer": true - }, - { - "if": "surface=paved", - "then": { - "nl": "De ondergrond is verhard", - "en": "The surface is paved", - "it": "La superficie è pavimentato", - "de": "Die Oberfläche ist befestigt", - "fr": "La surface a un revêtement" - }, - "hideInAnswer": true - } - ], - "id": "playground-surface" + "if": "surface=grass", + "then": { + "nl": "De ondergrond is gras", + "en": "The surface is grass", + "it": "La superficie è prato", + "ru": "Поверхность - трава", + "de": "Die Oberfläche ist Gras", + "fr": "La surface est en gazon" + } }, { - "id": "playground-lit", - "question": { - "nl": "Is deze speeltuin 's nachts verlicht?", - "en": "Is this playground lit at night?", - "it": "È illuminato di notte questo parco giochi?", - "fr": "Ce terrain de jeux est-il éclairé la nuit ?", - "de": "Ist dieser Spielplatz nachts beleuchtet?", - "ru": "Эта игровая площадка освещается ночью?" - }, - "mappings": [ - { - "if": "lit=yes", - "then": { - "nl": "Deze speeltuin is 's nachts verlicht", - "en": "This playground is lit at night", - "it": "Questo parco giochi è illuminato di notte", - "de": "Dieser Spielplatz ist nachts beleuchtet", - "ru": "Эта детская площадка освещается ночью", - "fr": "L’aire de jeu est éclairée de nuit" - } - }, - { - "if": "lit=no", - "then": { - "nl": "Deze speeltuin is 's nachts niet verlicht", - "en": "This playground is not lit at night", - "it": "Questo parco giochi non è illuminato di notte", - "de": "Dieser Spielplatz ist nachts nicht beleuchtet", - "ru": "Эта детская площадка не освещается ночью", - "fr": "L’aire de jeu n’est pas éclairée de nuit" - } - } - ] + "if": "surface=sand", + "then": { + "nl": "De ondergrond is zand", + "en": "The surface is sand", + "it": "La superficie è sabbia", + "ru": "Поверхность - песок", + "de": "Die Oberfläche ist Sand", + "fr": "La surface est en sable" + } }, { - "render": { - "nl": "Toegankelijk vanaf {min_age} jaar oud", - "en": "Accessible to kids older than {min_age} years", - "it": "Accessibile ai bambini di almeno {min_age} anni", - "ru": "Доступно для детей старше {min_age} лет", - "fr": "Accessible aux enfants de plus de {min_age} ans", - "de": "Zugang nur für Kinder ab {min_age} Jahren" - }, - "question": { - "nl": "Wat is de minimale leeftijd om op deze speeltuin te mogen?", - "en": "What is the minimum age required to access this playground?", - "it": "Qual è l’età minima per accedere a questo parco giochi?", - "fr": "Quel est l'âge minimal requis pour accéder à ce terrain de jeux ?", - "ru": "С какого возраста доступна эта детская площадка?", - "de": "Ab welchem Alter dürfen Kinder auf diesem Spielplatz spielen?" - }, - "freeform": { - "key": "min_age", - "type": "pnat" - }, - "id": "playground-min_age" + "if": "surface=woodchips", + "then": { + "nl": "De ondergrond bestaat uit houtsnippers", + "en": "The surface consist of woodchips", + "it": "La superficie consiste di trucioli di legno", + "de": "Die Oberfläche besteht aus Holzschnitzeln", + "ru": "Покрытие из щепы", + "fr": "La surface est en copeaux de bois" + } }, { - "render": { - "nl": "Toegankelijk tot {max_age}", - "en": "Accessible to kids of at most {max_age}", - "it": "Accessibile ai bambini di età inferiore a {max_age}", - "fr": "Accessible aux enfants de {max_age} au maximum", - "ru": "Доступно детям до {max_age}", - "de": "Zugang nur für Kinder bis maximal {max_age}" - }, - "question": { - "nl": "Wat is de maximaal toegestane leeftijd voor deze speeltuin?", - "en": "What is the maximum age allowed to access this playground?", - "it": "Qual è l’età massima per accedere a questo parco giochi?", - "fr": "Quel est l’âge maximum autorisé pour utiliser l’aire de jeu ?", - "de": "Bis zu welchem Alter dürfen Kinder auf diesem Spielplatz spielen?" - }, - "freeform": { - "key": "max_age", - "type": "pnat" - }, - "id": "playground-max_age" + "if": "surface=paving_stones", + "then": { + "nl": "De ondergrond bestaat uit stoeptegels", + "en": "The surface is paving stones", + "it": "La superficie è mattonelle regolari", + "ru": "Поверхность - брусчатка", + "de": "Die Oberfläche ist Pflastersteine", + "fr": "La surface est en pavés" + } }, { - "question": { - "nl": "Wie beheert deze speeltuin?", - "en": "Who operates this playground?", - "it": "Chi è il responsabile di questo parco giochi?", - "de": "Wer betreibt diesen Spielplatz?", - "fr": "Qui est en charge de l’exploitation de l’aire de jeu ?" - }, - "render": { - "nl": "Beheer door {operator}", - "en": "Operated by {operator}", - "it": "Gestito da {operator}", - "fr": "Exploité par {operator}", - "de": "Betrieben von {operator}" - }, - "freeform": { - "key": "operator" - }, - "id": "playground-operator" + "if": "surface=asphalt", + "then": { + "nl": "De ondergrond is asfalt", + "en": "The surface is asphalt", + "it": "La superficie è asfalto", + "ru": "Поверхность - асфальт", + "de": "Die Oberfläche ist Asphalt", + "fr": "La surface est en bitume" + } }, { - "id": "playground-access", - "question": { - "nl": "Is deze speeltuin vrij toegankelijk voor het publiek?", - "en": "Is this playground accessible to the general public?", - "it": "Questo parco giochi è pubblicamente accessibile?", - "de": "Ist dieser Spielplatz für die Allgemeinheit zugänglich?", - "fr": "L’aire de jeu est-elle accessible au public ?" - }, - "mappings": [ - { - "if": "access=", - "then": { - "en": "Accessible to the general public", - "nl": "Vrij toegankelijk voor het publiek", - "it": "Accessibile pubblicamente", - "de": "Zugänglich für die Allgemeinheit", - "fr": "Accessible au public" - }, - "hideInAnswer": true - }, - { - "if": "access=yes", - "then": { - "en": "Accessible to the general public", - "nl": "Vrij toegankelijk voor het publiek", - "it": "Accessibile pubblicamente", - "de": "Zugänglich für die Allgemeinheit", - "fr": "Accessible au public" - } - }, - { - "if": "access=customers", - "then": { - "en": "Only accessible for clients of the operating business", - "nl": "Enkel toegankelijk voor klanten van de bijhorende zaak", - "it": "Accessibile solamente ai clienti dell’attività che lo gestisce", - "de": "Nur für Kunden des Betreibers zugänglich", - "fr": "Réservée aux clients" - } - }, - { - "if": "access=students", - "then": { - "en": "Only accessible to students of the school", - "nl": "Vrij toegankelijk voor scholieren van de school", - "it": "Accessibile solamente agli studenti della scuola", - "de": "Nur für Schüler der Schule zugänglich", - "fr": "Réservée aux élèves de l’école" - } - }, - { - "if": "access=private", - "then": { - "en": "Not accessible", - "nl": "Niet vrij toegankelijk", - "it": "Non accessibile", - "ru": "Недоступно", - "fr": "Non accessible", - "de": "Nicht zugänglich" - } - } - ] + "if": "surface=concrete", + "then": { + "nl": "De ondergrond is beton", + "en": "The surface is concrete", + "it": "La superficie è cemento", + "ru": "Поверхность - бетон", + "de": "Die Oberfläche ist Beton", + "fr": "La surface est en béton" + } }, { - "question": { - "nl": "Wie kan men emailen indien er problemen zijn met de speeltuin?", - "en": "What is the email address of the playground maintainer?", - "it": "Qual è l’indirizzo email del gestore di questo parco giochi?", - "fr": "Quelle est l'adresse électronique du responsable de l'aire de jeux ?", - "de": "Wie lautet die E-Mail Adresse des Spielplatzbetreuers?" - }, - "render": { - "nl": "De bevoegde dienst kan bereikt worden via {email}", - "en": "{email}", - "ca": "{email}", - "de": "{email}", - "fr": "{email}", - "it": "{email}", - "ru": "{email}", - "id": "{email}" - }, - "freeform": { - "key": "email", - "type": "email" - }, - "id": "playground-email" + "if": "surface=unpaved", + "then": { + "nl": "De ondergrond is onverhard", + "en": "The surface is unpaved", + "it": "La superficie è non pavimentato", + "de": "Die Oberfläche ist unbefestigt", + "fr": "La surface n’a pas de revêtement" + }, + "hideInAnswer": true }, { - "question": { - "nl": "Wie kan men bellen indien er problemen zijn met de speeltuin?", - "en": "What is the phone number of the playground maintainer?", - "fr": "Quel est le numéro de téléphone du responsable du terrain de jeux ?", - "it": "Qual è il numero di telefono del gestore del campetto?", - "de": "Wie lautet die Telefonnummer vom Betreiber des Spielplatzes?" - }, - "render": { - "nl": "De bevoegde dienst kan getelefoneerd worden via {phone}", - "en": "{phone}", - "ca": "{phone}", - "de": "{phone}", - "fr": "{phone}", - "ru": "{phone}", - "id": "{phone}", - "it": "{phone}" - }, - "freeform": { - "key": "phone", - "type": "phone" - }, - "id": "playground-phone" - }, - { - "id": "Playground-wheelchair", - "question": { - "nl": "Is deze speeltuin toegankelijk voor rolstoelgebruikers?", - "en": "Is this playground accessible to wheelchair users?", - "fr": "Ce terrain de jeux est-il accessible aux personnes en fauteuil roulant ?", - "de": "Ist dieser Spielplatz für Rollstuhlfahrer zugänglich?", - "it": "Il campetto è accessibile a persone in sedia a rotelle?", - "ru": "Доступна ли детская площадка пользователям кресел-колясок?" - }, - "mappings": [ - { - "if": "wheelchair=yes", - "then": { - "nl": "Geheel toegankelijk voor rolstoelgebruikers", - "en": "Completely accessible for wheelchair users", - "fr": "Entièrement accessible aux personnes en fauteuil roulant", - "de": "Vollständig zugänglich für Rollstuhlfahrer", - "it": "Completamente accessibile in sedia a rotelle", - "ru": "Полностью доступна пользователям кресел-колясок" - } - }, - { - "if": "wheelchair=limited", - "then": { - "nl": "Beperkt toegankelijk voor rolstoelgebruikers", - "en": "Limited accessibility for wheelchair users", - "fr": "Accessibilité limitée pour les personnes en fauteuil roulant", - "de": "Eingeschränkte Zugänglichkeit für Rollstuhlfahrer", - "it": "Accesso limitato in sedia a rotelle", - "ru": "Частично доступна пользователям кресел-колясок" - } - }, - { - "if": "wheelchair=no", - "then": { - "nl": "Niet toegankelijk voor rolstoelgebruikers", - "en": "Not accessible for wheelchair users", - "fr": "Non accessible aux personnes en fauteuil roulant", - "de": "Nicht zugänglich für Rollstuhlfahrer", - "it": "Non accessibile in sedia a rotelle", - "ru": "Недоступна пользователям кресел-колясок" - } - } - ] - }, - { - "freeform": { - "key": "opening_hours", - "type": "opening_hours" - }, - "render": "{opening_hours_table(opening_hours)}", - "question": { - "nl": "Op welke uren is deze speeltuin toegankelijk?", - "en": "When is this playground accessible?", - "fr": "Quand ce terrain de jeux est-il accessible ?", - "it": "Quando si può accedere a questo campetto?", - "ru": "Когда открыта эта игровая площадка?", - "de": "Wann ist dieser Spielplatz zugänglich?" - }, - "mappings": [ - { - "if": "opening_hours=sunrise-sunset", - "then": { - "nl": "Van zonsopgang tot zonsondergang", - "en": "Accessible from sunrise till sunset", - "fr": "Accessible du lever au coucher du soleil", - "it": "Si può accedere dall'alba al tramonto", - "ru": "Открыто от рассвета до заката", - "de": "Zugänglich von Sonnenaufgang bis Sonnenuntergang" - } - }, - { - "if": "opening_hours=24/7", - "then": { - "nl": "Dag en nacht toegankelijk", - "en": "Always accessible", - "fr": "Toujours accessible", - "ru": "Всегда доступен", - "it": "Si può sempre accedere", - "de": "Immer zugänglich" - } - }, - { - "if": "opening_hours=", - "then": { - "nl": "Dag en nacht toegankelijk", - "en": "Always accessible", - "ru": "Всегда доступен", - "fr": "Toujours accessible", - "it": "Si può sempre accedere", - "de": "Immer zugänglich" - }, - "hideInAnswer": true - } - ], - "id": "playground-opening_hours" - }, - "questions", - { - "id": "playground-reviews", - "render": "{reviews(name, playground)}" + "if": "surface=paved", + "then": { + "nl": "De ondergrond is verhard", + "en": "The surface is paved", + "it": "La superficie è pavimentato", + "de": "Die Oberfläche ist befestigt", + "fr": "La surface a un revêtement" + }, + "hideInAnswer": true } - ], - "icon": { + ], + "id": "playground-surface" + }, + { + "id": "playground-lit", + "question": { + "nl": "Is deze speeltuin 's nachts verlicht?", + "en": "Is this playground lit at night?", + "it": "È illuminato di notte questo parco giochi?", + "fr": "Ce terrain de jeux est-il éclairé la nuit ?", + "de": "Ist dieser Spielplatz nachts beleuchtet?", + "ru": "Эта игровая площадка освещается ночью?" + }, + "mappings": [ + { + "if": "lit=yes", + "then": { + "nl": "Deze speeltuin is 's nachts verlicht", + "en": "This playground is lit at night", + "it": "Questo parco giochi è illuminato di notte", + "de": "Dieser Spielplatz ist nachts beleuchtet", + "ru": "Эта детская площадка освещается ночью", + "fr": "L’aire de jeu est éclairée de nuit" + } + }, + { + "if": "lit=no", + "then": { + "nl": "Deze speeltuin is 's nachts niet verlicht", + "en": "This playground is not lit at night", + "it": "Questo parco giochi non è illuminato di notte", + "de": "Dieser Spielplatz ist nachts nicht beleuchtet", + "ru": "Эта детская площадка не освещается ночью", + "fr": "L’aire de jeu n’est pas éclairée de nuit" + } + } + ] + }, + { + "render": { + "nl": "Toegankelijk vanaf {min_age} jaar oud", + "en": "Accessible to kids older than {min_age} years", + "it": "Accessibile ai bambini di almeno {min_age} anni", + "ru": "Доступно для детей старше {min_age} лет", + "fr": "Accessible aux enfants de plus de {min_age} ans", + "de": "Zugang nur für Kinder ab {min_age} Jahren" + }, + "question": { + "nl": "Wat is de minimale leeftijd om op deze speeltuin te mogen?", + "en": "What is the minimum age required to access this playground?", + "it": "Qual è l’età minima per accedere a questo parco giochi?", + "fr": "Quel est l'âge minimal requis pour accéder à ce terrain de jeux ?", + "ru": "С какого возраста доступна эта детская площадка?", + "de": "Ab welchem Alter dürfen Kinder auf diesem Spielplatz spielen?" + }, + "freeform": { + "key": "min_age", + "type": "pnat" + }, + "id": "playground-min_age" + }, + { + "render": { + "nl": "Toegankelijk tot {max_age}", + "en": "Accessible to kids of at most {max_age}", + "it": "Accessibile ai bambini di età inferiore a {max_age}", + "fr": "Accessible aux enfants de {max_age} au maximum", + "ru": "Доступно детям до {max_age}", + "de": "Zugang nur für Kinder bis maximal {max_age}" + }, + "question": { + "nl": "Wat is de maximaal toegestane leeftijd voor deze speeltuin?", + "en": "What is the maximum age allowed to access this playground?", + "it": "Qual è l’età massima per accedere a questo parco giochi?", + "fr": "Quel est l’âge maximum autorisé pour utiliser l’aire de jeu ?", + "de": "Bis zu welchem Alter dürfen Kinder auf diesem Spielplatz spielen?" + }, + "freeform": { + "key": "max_age", + "type": "pnat" + }, + "id": "playground-max_age" + }, + { + "question": { + "nl": "Wie beheert deze speeltuin?", + "en": "Who operates this playground?", + "it": "Chi è il responsabile di questo parco giochi?", + "de": "Wer betreibt diesen Spielplatz?", + "fr": "Qui est en charge de l’exploitation de l’aire de jeu ?" + }, + "render": { + "nl": "Beheer door {operator}", + "en": "Operated by {operator}", + "it": "Gestito da {operator}", + "fr": "Exploité par {operator}", + "de": "Betrieben von {operator}" + }, + "freeform": { + "key": "operator" + }, + "id": "playground-operator" + }, + { + "id": "playground-access", + "question": { + "nl": "Is deze speeltuin vrij toegankelijk voor het publiek?", + "en": "Is this playground accessible to the general public?", + "it": "Questo parco giochi è pubblicamente accessibile?", + "de": "Ist dieser Spielplatz für die Allgemeinheit zugänglich?", + "fr": "L’aire de jeu est-elle accessible au public ?" + }, + "mappings": [ + { + "if": "access=", + "then": { + "en": "Accessible to the general public", + "nl": "Vrij toegankelijk voor het publiek", + "it": "Accessibile pubblicamente", + "de": "Zugänglich für die Allgemeinheit", + "fr": "Accessible au public" + }, + "hideInAnswer": true + }, + { + "if": "access=yes", + "then": { + "en": "Accessible to the general public", + "nl": "Vrij toegankelijk voor het publiek", + "it": "Accessibile pubblicamente", + "de": "Zugänglich für die Allgemeinheit", + "fr": "Accessible au public" + } + }, + { + "if": "access=customers", + "then": { + "en": "Only accessible for clients of the operating business", + "nl": "Enkel toegankelijk voor klanten van de bijhorende zaak", + "it": "Accessibile solamente ai clienti dell’attività che lo gestisce", + "de": "Nur für Kunden des Betreibers zugänglich", + "fr": "Réservée aux clients" + } + }, + { + "if": "access=students", + "then": { + "en": "Only accessible to students of the school", + "nl": "Vrij toegankelijk voor scholieren van de school", + "it": "Accessibile solamente agli studenti della scuola", + "de": "Nur für Schüler der Schule zugänglich", + "fr": "Réservée aux élèves de l’école" + } + }, + { + "if": "access=private", + "then": { + "en": "Not accessible", + "nl": "Niet vrij toegankelijk", + "it": "Non accessibile", + "ru": "Недоступно", + "fr": "Non accessible", + "de": "Nicht zugänglich" + } + } + ] + }, + { + "question": { + "nl": "Wie kan men emailen indien er problemen zijn met de speeltuin?", + "en": "What is the email address of the playground maintainer?", + "it": "Qual è l’indirizzo email del gestore di questo parco giochi?", + "fr": "Quelle est l'adresse électronique du responsable de l'aire de jeux ?", + "de": "Wie lautet die E-Mail Adresse des Spielplatzbetreuers?" + }, + "render": { + "nl": "De bevoegde dienst kan bereikt worden via {email}", + "en": "{email}", + "ca": "{email}", + "de": "{email}", + "fr": "{email}", + "it": "{email}", + "ru": "{email}", + "id": "{email}" + }, + "freeform": { + "key": "email", + "type": "email" + }, + "id": "playground-email" + }, + { + "question": { + "nl": "Wie kan men bellen indien er problemen zijn met de speeltuin?", + "en": "What is the phone number of the playground maintainer?", + "fr": "Quel est le numéro de téléphone du responsable du terrain de jeux ?", + "it": "Qual è il numero di telefono del gestore del campetto?", + "de": "Wie lautet die Telefonnummer vom Betreiber des Spielplatzes?" + }, + "render": { + "nl": "De bevoegde dienst kan getelefoneerd worden via {phone}", + "en": "{phone}", + "ca": "{phone}", + "de": "{phone}", + "fr": "{phone}", + "ru": "{phone}", + "id": "{phone}", + "it": "{phone}" + }, + "freeform": { + "key": "phone", + "type": "phone" + }, + "id": "playground-phone" + }, + { + "id": "Playground-wheelchair", + "question": { + "nl": "Is deze speeltuin toegankelijk voor rolstoelgebruikers?", + "en": "Is this playground accessible to wheelchair users?", + "fr": "Ce terrain de jeux est-il accessible aux personnes en fauteuil roulant ?", + "de": "Ist dieser Spielplatz für Rollstuhlfahrer zugänglich?", + "it": "Il campetto è accessibile a persone in sedia a rotelle?", + "ru": "Доступна ли детская площадка пользователям кресел-колясок?" + }, + "mappings": [ + { + "if": "wheelchair=yes", + "then": { + "nl": "Geheel toegankelijk voor rolstoelgebruikers", + "en": "Completely accessible for wheelchair users", + "fr": "Entièrement accessible aux personnes en fauteuil roulant", + "de": "Vollständig zugänglich für Rollstuhlfahrer", + "it": "Completamente accessibile in sedia a rotelle", + "ru": "Полностью доступна пользователям кресел-колясок" + } + }, + { + "if": "wheelchair=limited", + "then": { + "nl": "Beperkt toegankelijk voor rolstoelgebruikers", + "en": "Limited accessibility for wheelchair users", + "fr": "Accessibilité limitée pour les personnes en fauteuil roulant", + "de": "Eingeschränkte Zugänglichkeit für Rollstuhlfahrer", + "it": "Accesso limitato in sedia a rotelle", + "ru": "Частично доступна пользователям кресел-колясок" + } + }, + { + "if": "wheelchair=no", + "then": { + "nl": "Niet toegankelijk voor rolstoelgebruikers", + "en": "Not accessible for wheelchair users", + "fr": "Non accessible aux personnes en fauteuil roulant", + "de": "Nicht zugänglich für Rollstuhlfahrer", + "it": "Non accessibile in sedia a rotelle", + "ru": "Недоступна пользователям кресел-колясок" + } + } + ] + }, + { + "freeform": { + "key": "opening_hours", + "type": "opening_hours" + }, + "render": "{opening_hours_table(opening_hours)}", + "question": { + "nl": "Op welke uren is deze speeltuin toegankelijk?", + "en": "When is this playground accessible?", + "fr": "Quand ce terrain de jeux est-il accessible ?", + "it": "Quando si può accedere a questo campetto?", + "ru": "Когда открыта эта игровая площадка?", + "de": "Wann ist dieser Spielplatz zugänglich?" + }, + "mappings": [ + { + "if": "opening_hours=sunrise-sunset", + "then": { + "nl": "Van zonsopgang tot zonsondergang", + "en": "Accessible from sunrise till sunset", + "fr": "Accessible du lever au coucher du soleil", + "it": "Si può accedere dall'alba al tramonto", + "ru": "Открыто от рассвета до заката", + "de": "Zugänglich von Sonnenaufgang bis Sonnenuntergang" + } + }, + { + "if": "opening_hours=24/7", + "then": { + "nl": "Dag en nacht toegankelijk", + "en": "Always accessible", + "fr": "Toujours accessible", + "ru": "Всегда доступен", + "it": "Si può sempre accedere", + "de": "Immer zugänglich" + } + }, + { + "if": "opening_hours=", + "then": { + "nl": "Dag en nacht toegankelijk", + "en": "Always accessible", + "ru": "Всегда доступен", + "fr": "Toujours accessible", + "it": "Si può sempre accedere", + "de": "Immer zugänglich" + }, + "hideInAnswer": true + } + ], + "id": "playground-opening_hours" + }, + "questions", + { + "id": "playground-reviews", + "render": "{reviews(name, playground)}" + } + ], + "presets": [ + { + "tags": [ + "leisure=playground" + ], + "title": { + "nl": "Speeltuin", + "en": "Playground", + "ru": "Детская площадка", + "fr": "Terrain de jeux", + "it": "Campetto", + "de": "Spielplatz" + } + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:leisure=playground", + "leisure=" + ] + } + }, + "mapRendering": [ + { + "icon": { "render": "./assets/themes/playgrounds/playground.svg" - }, - "iconOverlays": [ + }, + "iconBadges": [ { - "if": { - "and": [ - "opening_hours!=24/7", - "opening_hours~*" - ] - }, - "then": "isOpen", - "badge": true + "if": { + "and": [ + "opening_hours!=24/7", + "opening_hours~*" + ] + }, + "then": "isOpen" } - ], - "width": { - "render": "1" - }, - "iconSize": { + ], + "iconSize": { "render": "40,40,center", "mappings": [ - { - "if": "id~node/.*", - "then": "40,40,center" - }, - { - "if": "_size_classification=small", - "then": "25,25,center" - }, - { - "if": "_size_classification=medium", - "then": "40,40,center" - }, - { - "if": "_size_classification=large", - "then": "60,60,center" - } + { + "if": "id~node/.*", + "then": "40,40,center" + }, + { + "if": "_size_classification=small", + "then": "25,25,center" + }, + { + "if": "_size_classification=medium", + "then": "40,40,center" + }, + { + "if": "_size_classification=large", + "then": "60,60,center" + } ] + }, + "location": [ + "point", + "centroid" + ] }, - "color": { + { + "color": { "render": "#5dbaa9" - }, - "presets": [ - { - "tags": [ - "leisure=playground" - ], - "title": { - "nl": "Speeltuin", - "en": "Playground", - "ru": "Детская площадка", - "fr": "Terrain de jeux", - "it": "Campetto", - "de": "Spielplatz" - } - } - ], - "wayHandling": 2, - "deletion": { - "softDeletionTags": { - "and": [ - "disused:leisure=playground", - "leisure=" - ] - } + }, + "width": { + "render": "1" + } } + ] } \ No newline at end of file diff --git a/assets/layers/public_bookcase/public_bookcase.json b/assets/layers/public_bookcase/public_bookcase.json index 277f0fb02d..ebb432d1a2 100644 --- a/assets/layers/public_bookcase/public_bookcase.json +++ b/assets/layers/public_bookcase/public_bookcase.json @@ -1,491 +1,500 @@ { - "id": "public_bookcase", - "name": { - "en": "Bookcases", - "nl": "Boekenruilkastjes", - "de": "Bücherschränke", - "fr": "Microbibliothèque", - "ru": "Книжные шкафы", - "it": "Microbiblioteche" + "id": "public_bookcase", + "name": { + "en": "Bookcases", + "nl": "Boekenruilkastjes", + "de": "Bücherschränke", + "fr": "Microbibliothèque", + "ru": "Книжные шкафы", + "it": "Microbiblioteche" + }, + "description": { + "en": "A streetside cabinet with books, accessible to anyone", + "nl": "Een straatkastje met boeken voor iedereen", + "de": "Ein Bücherschrank am Straßenrand mit Büchern, für jedermann zugänglich", + "fr": "Une armoire ou une boite contenant des livres en libre accès", + "it": "Una vetrinetta ai bordi della strada contenente libri, aperta al pubblico", + "ru": "Уличный шкаф с книгами, доступными для всех" + }, + "source": { + "osmTags": "amenity=public_bookcase" + }, + "minzoom": 10, + "title": { + "render": { + "en": "Bookcase", + "nl": "Boekenruilkast", + "de": "Bücherschrank", + "fr": "Microbibliothèque", + "ru": "Книжный шкаф", + "it": "Microbiblioteca" }, - "description": { - "en": "A streetside cabinet with books, accessible to anyone", - "nl": "Een straatkastje met boeken voor iedereen", - "de": "Ein Bücherschrank am Straßenrand mit Büchern, für jedermann zugänglich", - "fr": "Une armoire ou une boite contenant des livres en libre accès", - "it": "Una vetrinetta ai bordi della strada contenente libri, aperta al pubblico", - "ru": "Уличный шкаф с книгами, доступными для всех" - }, - "source": { - "osmTags": "amenity=public_bookcase" - }, - "minzoom": 10, - "wayHandling": 2, - "title": { - "render": { - "en": "Bookcase", - "nl": "Boekenruilkast", - "de": "Bücherschrank", - "fr": "Microbibliothèque", - "ru": "Книжный шкаф", - "it": "Microbiblioteca" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "en": "Public bookcase {name}", - "nl": "Boekenruilkast {name}", - "de": "Öffentlicher Bücherschrank {name}", - "fr": "Microbibliothèque {name}", - "ru": "Общественный книжный шкаф {name}", - "it": "Microbiblioteca pubblica {name}" - } - } - ] - }, - "icon": { - "render": "./assets/themes/bookcases/bookcase.svg;" - }, - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
{name}
" - } - ] - }, - "color": { - "render": "#0000ff" - }, - "width": { - "render": "8" - }, - "presets": [ - { - "title": { - "en": "Bookcase", - "nl": "Boekenruilkast", - "de": "Bücherschrank", - "fr": "Microbibliothèque", - "ru": "Книжный шкаф", - "it": "Microbiblioteca" - }, - "tags": [ - "amenity=public_bookcase" - ], - "preciseInput": { - "preferredBackground": "photo" - } - } - ], - "tagRenderings": [ - "images", - { - "id": "minimap", - "render": "{minimap():height: 9rem; border-radius: 2.5rem; overflow:hidden;border:1px solid gray}" - }, - { - "render": { - "en": "The name of this bookcase is {name}", - "nl": "De naam van dit boekenruilkastje is {name}", - "de": "Der Name dieses Bücherschrank lautet {name}", - "fr": "Le nom de cette microbibliothèque est {name}", - "ru": "Название книжного шкафа — {name}", - "it": "Questa microbiblioteca si chiama {name}" - }, - "question": { - "en": "What is the name of this public bookcase?", - "nl": "Wat is de naam van dit boekenuilkastje?", - "de": "Wie heißt dieser öffentliche Bücherschrank?", - "fr": "Quel est le nom de cette microbibliothèque ?", - "ru": "Как называется этот общественный книжный шкаф?", - "it": "Come si chiama questa microbiblioteca pubblica?" - }, - "freeform": { - "key": "name" - }, - "mappings": [ - { - "if": { - "and": [ - "noname=yes", - "name=" - ] - }, - "then": { - "en": "This bookcase doesn't have a name", - "nl": "Dit boekenruilkastje heeft geen naam", - "de": "Dieser Bücherschrank hat keinen Namen", - "fr": "Cette microbibliothèque n'a pas de nom", - "ru": "У этого книжного шкафа нет названия", - "it": "Questa microbiblioteca non ha un nome proprio" - } - } - ], - "id": "public_bookcase-name" - }, - { - "render": { - "en": "{capacity} books fit in this bookcase", - "nl": "Er passen {capacity} boeken", - "de": "{capacity} Bücher passen in diesen Bücherschrank", - "fr": "{capacity} livres peuvent entrer dans cette microbibliothèque", - "it": "Questa microbiblioteca può contenere fino a {capacity} libri", - "ru": "{capacity} книг помещается в этот книжный шкаф" - }, - "question": { - "en": "How many books fit into this public bookcase?", - "nl": "Hoeveel boeken passen er in dit boekenruilkastje?", - "de": "Wie viele Bücher passen in diesen öffentlichen Bücherschrank?", - "fr": "Combien de livres peuvent entrer dans cette microbibliothèque ?", - "ru": "Сколько книг помещается в этом общественном книжном шкафу?", - "it": "Quanti libri può contenere questa microbiblioteca?" - }, - "freeform": { - "key": "capacity", - "type": "nat", - "inline": true - }, - "id": "public_bookcase-capacity" - }, - { - "id": "bookcase-booktypes", - "question": { - "en": "What kind of books can be found in this public bookcase?", - "nl": "Voor welke doelgroep zijn de meeste boeken in dit boekenruilkastje?", - "de": "Welche Art von Büchern sind in diesem öffentlichen Bücherschrank zu finden?", - "fr": "Quel type de livres peut-on dans cette microbibliothèque ?", - "it": "Che tipo di libri si possono trovare in questa microbiblioteca?", - "ru": "Какие книги можно найти в этом общественном книжном шкафу?" - }, - "mappings": [ - { - "if": "books=children", - "then": { - "en": "Mostly children books", - "nl": "Voornamelijk kinderboeken", - "de": "Vorwiegend Kinderbücher", - "fr": "Livres pour enfants", - "ru": "В основном детские книги", - "it": "Principalmente libri per l'infanzia" - } - }, - { - "if": "books=adults", - "then": { - "en": "Mostly books for adults", - "nl": "Voornamelijk boeken voor volwassenen", - "de": "Vorwiegend Bücher für Erwachsene", - "fr": "Livres pour les adultes", - "ru": "В основном книги для взрослых", - "it": "Principalmente libri per persone in età adulta" - } - }, - { - "if": "books=children;adults", - "then": { - "en": "Both books for kids and adults", - "nl": "Boeken voor zowel kinderen als volwassenen", - "de": "Sowohl Bücher für Kinder als auch für Erwachsene", - "fr": "Livres pour enfants et adultes également", - "it": "Sia libri per l'infanzia, sia per l'età adulta", - "ru": "Книги и для детей, и для взрослых" - } - } - ] - }, - { - "id": "bookcase-is-indoors", - "question": { - "en": "Is this bookcase located outdoors?", - "nl": "Staat dit boekenruilkastje binnen of buiten?", - "de": "Befindet sich dieser Bücherschrank im Freien?", - "fr": "Cette microbiliothèque est-elle en extérieur ?", - "it": "Questa microbiblioteca si trova all'aperto?" - }, - "mappings": [ - { - "then": { - "en": "This bookcase is located indoors", - "nl": "Dit boekenruilkastje staat binnen", - "de": "Dieser Bücherschrank befindet sich im Innenbereich", - "fr": "Cette microbibliothèque est en intérieur", - "it": "Questa microbiblioteca si trova al chiuso" - }, - "if": "indoor=yes" - }, - { - "then": { - "en": "This bookcase is located outdoors", - "nl": "Dit boekenruilkastje staat buiten", - "de": "Dieser Bücherschrank befindet sich im Freien", - "fr": "Cette microbibliothèque est en extérieur", - "it": "Questa microbiblioteca si trova all'aperto" - }, - "if": "indoor=no" - }, - { - "then": { - "en": "This bookcase is located outdoors", - "nl": "Dit boekenruilkastje staat buiten", - "de": "Dieser Bücherschrank befindet sich im Freien", - "fr": "Cette microbibliothèque est en extérieur", - "it": "Questa microbiblioteca si trova all'aperto" - }, - "if": "indoor=", - "hideInAnswer": true - } - ] - }, - { - "id": "bookcase-is-accessible", - "question": { - "en": "Is this public bookcase freely accessible?", - "nl": "Is dit boekenruilkastje publiek toegankelijk?", - "de": "Ist dieser öffentliche Bücherschrank frei zugänglich?", - "fr": "Cette microbibliothèque est-elle librement accèssible ?", - "it": "Questa microbiblioteca è ad accesso libero?", - "ru": "Имеется ли свободный доступ к этому общественному книжному шкафу?" - }, - "condition": "indoor=yes", - "mappings": [ - { - "then": { - "en": "Publicly accessible", - "nl": "Publiek toegankelijk", - "de": "Öffentlich zugänglich", - "fr": "Accèssible au public", - "it": "È ad accesso libero", - "ru": "Свободный доступ" - }, - "if": "access=yes" - }, - { - "then": { - "en": "Only accessible to customers", - "nl": "Enkel toegankelijk voor klanten", - "de": "Nur für Kunden zugänglich", - "fr": "Accèssible aux clients", - "it": "L'accesso è riservato ai clienti" - }, - "if": "access=customers" - } - ] - }, - { - "question": { - "en": "Who maintains this public bookcase?", - "nl": "Wie is verantwoordelijk voor dit boekenruilkastje?", - "de": "Wer unterhält diesen öffentlichen Bücherschrank?", - "fr": "Qui entretien cette microbibliothèque ?", - "it": "Chi mantiene questa microbiblioteca?" - }, - "render": { - "en": "Operated by {operator}", - "nl": "Onderhouden door {operator}", - "de": "Betrieben von {operator}", - "fr": "Entretenue par {operator}", - "it": "È gestita da {operator}" - }, - "freeform": { - "type": "string", - "key": "operator" - }, - "id": "public_bookcase-operator" - }, - { - "question": { - "en": "Is this public bookcase part of a bigger network?", - "nl": "Is dit boekenruilkastje deel van een netwerk?", - "de": "Ist dieser öffentliche Bücherschrank Teil eines größeren Netzwerks?", - "fr": "Cette microbibliothèque fait-elle partie d'un réseau/groupe ?", - "it": "Questa microbiblioteca fa parte di una rete?" - }, - "render": { - "en": "This public bookcase is part of {brand}", - "nl": "Dit boekenruilkastje is deel van het netwerk {brand}", - "de": "Dieser Bücherschrank ist Teil von {brand}", - "fr": "Cette microbibliothèque fait partie du groupe {brand}", - "it": "Questa microbiblioteca fa parte di {brand}" - }, - "condition": "ref=", - "freeform": { - "key": "brand" - }, - "mappings": [ - { - "then": { - "en": "Part of the network 'Little Free Library'", - "nl": "Deel van het netwerk 'Little Free Library'", - "de": "Teil des Netzwerks 'Little Free Library'", - "fr": "Fait partie du réseau Little Free Library", - "it": "Fa parte della rete 'Little Free Library'" - }, - "if": { - "and": [ - "brand=Little Free Library", - "nobrand=" - ] - } - }, - { - "if": { - "and": [ - "nobrand=yes", - "brand=" - ] - }, - "then": { - "en": "This public bookcase is not part of a bigger network", - "nl": "Dit boekenruilkastje maakt geen deel uit van een netwerk", - "de": "Dieser öffentliche Bücherschrank ist nicht Teil eines größeren Netzwerks", - "fr": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe", - "it": "Questa microbiblioteca non fa parte di una rete" - } - } - ], - "id": "public_bookcase-brand" - }, - { - "render": { - "en": "The reference number of this public bookcase within {brand} is {ref}", - "nl": "Het referentienummer binnen {brand} is {ref}", - "de": "Die Referenznummer dieses öffentlichen Bücherschranks innerhalb {brand} lautet {ref}", - "fr": "Cette microbibliothèque du réseau {brand} possède le numéro {ref}", - "it": "Il numero identificativo di questa microbiblioteca nella rete {brand} è {ref}" - }, - "question": { - "en": "What is the reference number of this public bookcase?", - "nl": "Wat is het referentienummer van dit boekenruilkastje?", - "de": "Wie lautet die Referenznummer dieses öffentlichen Bücherschranks?", - "fr": "Quelle est le numéro de référence de cette microbibliothèque ?", - "it": "Qual è il numero identificativo di questa microbiblioteca?" - }, - "condition": "brand~*", - "freeform": { - "key": "ref" - }, - "mappings": [ - { - "then": { - "en": "This bookcase is not part of a bigger network", - "nl": "Dit boekenruilkastje maakt geen deel uit van een netwerk", - "de": "Dieser Bücherschrank ist nicht Teil eines größeren Netzwerks", - "fr": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe", - "it": "Questa microbiblioteca non fa parte di una rete" - }, - "if": { - "and": [ - "nobrand=yes", - "brand=", - "ref=" - ] - } - } - ], - "id": "public_bookcase-ref" - }, - { - "question": { - "en": "When was this public bookcase installed?", - "nl": "Op welke dag werd dit boekenruilkastje geinstalleerd?", - "de": "Wann wurde dieser öffentliche Bücherschrank installiert?", - "fr": "Quand a été installée cette microbibliothèque ?", - "it": "Quando è stata inaugurata questa microbiblioteca?", - "ru": "Когда был установлен этот общественный книжный шкаф?" - }, - "render": { - "en": "Installed on {start_date}", - "nl": "Geplaatst op {start_date}", - "de": "Installiert am {start_date}", - "fr": "Installée le {start_date}", - "it": "È stata inaugurata il {start_date}", - "ru": "Установлен {start_date}" - }, - "freeform": { - "key": "start_date", - "type": "date" - }, - "id": "public_bookcase-start_date" - }, - { - "render": { - "en": "More info on the website", - "nl": "Meer info op de website", - "de": "Weitere Informationen auf der Webseite", - "fr": "Plus d'infos sur le site web", - "ru": "Более подробная информация на сайте", - "it": "Maggiori informazioni sul sito web" - }, - "question": { - "en": "Is there a website with more information about this public bookcase?", - "nl": "Is er een website over dit boekenruilkastje?", - "de": "Gibt es eine Website mit weiteren Informationen über diesen öffentlichen Bücherschrank?", - "fr": "Y a-t-il un site web avec plus d'informations sur cette microbibliothèque ?", - "it": "C'è un sito web con maggiori informazioni su questa microbiblioteca?", - "ru": "Есть ли веб-сайт с более подробной информацией об этом общественном книжном шкафе?" - }, - "freeform": { - "key": "website", - "type": "url" - }, - "id": "public_bookcase-website" - } - ], - "allowMove": true, - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity=public_bookcase", - "amenity=" - ] - }, - "neededChangesets": 5 - }, - "filter": [ - { - "id": "kid-books", - "options": [ - { - "question": "Kinderboeken aanwezig?", - "osmTags": "books~.*children.*" - } - ] - }, - { - "id": "adult-books", - "options": [ - { - "question": "Boeken voor volwassenen aanwezig?", - "osmTags": "books~.*adults.*" - } - ] - }, - { - "id": "inside", - "options": [ - { - "question": { - "nl": "Binnen of buiten", - "en": "Indoor or outdoor", - "de": "Innen oder Außen" - } - }, - { - "question": "Binnen?", - "osmTags": "indoor=yes" - }, - { - "question": "Buiten?", - "osmTags": { - "or": [ - "indoor=no", - "indoor=" - ] - } - } - ] + "mappings": [ + { + "if": "name~*", + "then": { + "en": "Public bookcase {name}", + "nl": "Boekenruilkast {name}", + "de": "Öffentlicher Bücherschrank {name}", + "fr": "Microbibliothèque {name}", + "ru": "Общественный книжный шкаф {name}", + "it": "Microbiblioteca pubblica {name}" } + } ] + }, + "presets": [ + { + "title": { + "en": "Bookcase", + "nl": "Boekenruilkast", + "de": "Bücherschrank", + "fr": "Microbibliothèque", + "ru": "Книжный шкаф", + "it": "Microbiblioteca" + }, + "tags": [ + "amenity=public_bookcase" + ], + "preciseInput": { + "preferredBackground": "photo" + } + } + ], + "tagRenderings": [ + "images", + { + "id": "minimap", + "render": "{minimap():height: 9rem; border-radius: 2.5rem; overflow:hidden;border:1px solid gray}" + }, + { + "render": { + "en": "The name of this bookcase is {name}", + "nl": "De naam van dit boekenruilkastje is {name}", + "de": "Der Name dieses Bücherschrank lautet {name}", + "fr": "Le nom de cette microbibliothèque est {name}", + "ru": "Название книжного шкафа — {name}", + "it": "Questa microbiblioteca si chiama {name}" + }, + "question": { + "en": "What is the name of this public bookcase?", + "nl": "Wat is de naam van dit boekenuilkastje?", + "de": "Wie heißt dieser öffentliche Bücherschrank?", + "fr": "Quel est le nom de cette microbibliothèque ?", + "ru": "Как называется этот общественный книжный шкаф?", + "it": "Come si chiama questa microbiblioteca pubblica?" + }, + "freeform": { + "key": "name" + }, + "mappings": [ + { + "if": { + "and": [ + "noname=yes", + "name=" + ] + }, + "then": { + "en": "This bookcase doesn't have a name", + "nl": "Dit boekenruilkastje heeft geen naam", + "de": "Dieser Bücherschrank hat keinen Namen", + "fr": "Cette microbibliothèque n'a pas de nom", + "ru": "У этого книжного шкафа нет названия", + "it": "Questa microbiblioteca non ha un nome proprio" + } + } + ], + "id": "public_bookcase-name" + }, + { + "render": { + "en": "{capacity} books fit in this bookcase", + "nl": "Er passen {capacity} boeken", + "de": "{capacity} Bücher passen in diesen Bücherschrank", + "fr": "{capacity} livres peuvent entrer dans cette microbibliothèque", + "it": "Questa microbiblioteca può contenere fino a {capacity} libri", + "ru": "{capacity} книг помещается в этот книжный шкаф" + }, + "question": { + "en": "How many books fit into this public bookcase?", + "nl": "Hoeveel boeken passen er in dit boekenruilkastje?", + "de": "Wie viele Bücher passen in diesen öffentlichen Bücherschrank?", + "fr": "Combien de livres peuvent entrer dans cette microbibliothèque ?", + "ru": "Сколько книг помещается в этом общественном книжном шкафу?", + "it": "Quanti libri può contenere questa microbiblioteca?" + }, + "freeform": { + "key": "capacity", + "type": "nat", + "inline": true + }, + "id": "public_bookcase-capacity" + }, + { + "id": "bookcase-booktypes", + "question": { + "en": "What kind of books can be found in this public bookcase?", + "nl": "Voor welke doelgroep zijn de meeste boeken in dit boekenruilkastje?", + "de": "Welche Art von Büchern sind in diesem öffentlichen Bücherschrank zu finden?", + "fr": "Quel type de livres peut-on dans cette microbibliothèque ?", + "it": "Che tipo di libri si possono trovare in questa microbiblioteca?", + "ru": "Какие книги можно найти в этом общественном книжном шкафу?" + }, + "mappings": [ + { + "if": "books=children", + "then": { + "en": "Mostly children books", + "nl": "Voornamelijk kinderboeken", + "de": "Vorwiegend Kinderbücher", + "fr": "Livres pour enfants", + "ru": "В основном детские книги", + "it": "Principalmente libri per l'infanzia" + } + }, + { + "if": "books=adults", + "then": { + "en": "Mostly books for adults", + "nl": "Voornamelijk boeken voor volwassenen", + "de": "Vorwiegend Bücher für Erwachsene", + "fr": "Livres pour les adultes", + "ru": "В основном книги для взрослых", + "it": "Principalmente libri per persone in età adulta" + } + }, + { + "if": "books=children;adults", + "then": { + "en": "Both books for kids and adults", + "nl": "Boeken voor zowel kinderen als volwassenen", + "de": "Sowohl Bücher für Kinder als auch für Erwachsene", + "fr": "Livres pour enfants et adultes également", + "it": "Sia libri per l'infanzia, sia per l'età adulta", + "ru": "Книги и для детей, и для взрослых" + } + } + ] + }, + { + "id": "bookcase-is-indoors", + "question": { + "en": "Is this bookcase located outdoors?", + "nl": "Staat dit boekenruilkastje binnen of buiten?", + "de": "Befindet sich dieser Bücherschrank im Freien?", + "fr": "Cette microbiliothèque est-elle en extérieur ?", + "it": "Questa microbiblioteca si trova all'aperto?" + }, + "mappings": [ + { + "then": { + "en": "This bookcase is located indoors", + "nl": "Dit boekenruilkastje staat binnen", + "de": "Dieser Bücherschrank befindet sich im Innenbereich", + "fr": "Cette microbibliothèque est en intérieur", + "it": "Questa microbiblioteca si trova al chiuso" + }, + "if": "indoor=yes" + }, + { + "then": { + "en": "This bookcase is located outdoors", + "nl": "Dit boekenruilkastje staat buiten", + "de": "Dieser Bücherschrank befindet sich im Freien", + "fr": "Cette microbibliothèque est en extérieur", + "it": "Questa microbiblioteca si trova all'aperto" + }, + "if": "indoor=no" + }, + { + "then": { + "en": "This bookcase is located outdoors", + "nl": "Dit boekenruilkastje staat buiten", + "de": "Dieser Bücherschrank befindet sich im Freien", + "fr": "Cette microbibliothèque est en extérieur", + "it": "Questa microbiblioteca si trova all'aperto" + }, + "if": "indoor=", + "hideInAnswer": true + } + ] + }, + { + "id": "bookcase-is-accessible", + "question": { + "en": "Is this public bookcase freely accessible?", + "nl": "Is dit boekenruilkastje publiek toegankelijk?", + "de": "Ist dieser öffentliche Bücherschrank frei zugänglich?", + "fr": "Cette microbibliothèque est-elle librement accèssible ?", + "it": "Questa microbiblioteca è ad accesso libero?", + "ru": "Имеется ли свободный доступ к этому общественному книжному шкафу?" + }, + "condition": "indoor=yes", + "mappings": [ + { + "then": { + "en": "Publicly accessible", + "nl": "Publiek toegankelijk", + "de": "Öffentlich zugänglich", + "fr": "Accèssible au public", + "it": "È ad accesso libero", + "ru": "Свободный доступ" + }, + "if": "access=yes" + }, + { + "then": { + "en": "Only accessible to customers", + "nl": "Enkel toegankelijk voor klanten", + "de": "Nur für Kunden zugänglich", + "fr": "Accèssible aux clients", + "it": "L'accesso è riservato ai clienti" + }, + "if": "access=customers" + } + ] + }, + { + "question": { + "en": "Who maintains this public bookcase?", + "nl": "Wie is verantwoordelijk voor dit boekenruilkastje?", + "de": "Wer unterhält diesen öffentlichen Bücherschrank?", + "fr": "Qui entretien cette microbibliothèque ?", + "it": "Chi mantiene questa microbiblioteca?" + }, + "render": { + "en": "Operated by {operator}", + "nl": "Onderhouden door {operator}", + "de": "Betrieben von {operator}", + "fr": "Entretenue par {operator}", + "it": "È gestita da {operator}" + }, + "freeform": { + "type": "string", + "key": "operator" + }, + "id": "public_bookcase-operator" + }, + { + "question": { + "en": "Is this public bookcase part of a bigger network?", + "nl": "Is dit boekenruilkastje deel van een netwerk?", + "de": "Ist dieser öffentliche Bücherschrank Teil eines größeren Netzwerks?", + "fr": "Cette microbibliothèque fait-elle partie d'un réseau/groupe ?", + "it": "Questa microbiblioteca fa parte di una rete?" + }, + "render": { + "en": "This public bookcase is part of {brand}", + "nl": "Dit boekenruilkastje is deel van het netwerk {brand}", + "de": "Dieser Bücherschrank ist Teil von {brand}", + "fr": "Cette microbibliothèque fait partie du groupe {brand}", + "it": "Questa microbiblioteca fa parte di {brand}" + }, + "condition": "ref=", + "freeform": { + "key": "brand" + }, + "mappings": [ + { + "then": { + "en": "Part of the network 'Little Free Library'", + "nl": "Deel van het netwerk 'Little Free Library'", + "de": "Teil des Netzwerks 'Little Free Library'", + "fr": "Fait partie du réseau Little Free Library", + "it": "Fa parte della rete 'Little Free Library'" + }, + "if": { + "and": [ + "brand=Little Free Library", + "nobrand=" + ] + } + }, + { + "if": { + "and": [ + "nobrand=yes", + "brand=" + ] + }, + "then": { + "en": "This public bookcase is not part of a bigger network", + "nl": "Dit boekenruilkastje maakt geen deel uit van een netwerk", + "de": "Dieser öffentliche Bücherschrank ist nicht Teil eines größeren Netzwerks", + "fr": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe", + "it": "Questa microbiblioteca non fa parte di una rete" + } + } + ], + "id": "public_bookcase-brand" + }, + { + "render": { + "en": "The reference number of this public bookcase within {brand} is {ref}", + "nl": "Het referentienummer binnen {brand} is {ref}", + "de": "Die Referenznummer dieses öffentlichen Bücherschranks innerhalb {brand} lautet {ref}", + "fr": "Cette microbibliothèque du réseau {brand} possède le numéro {ref}", + "it": "Il numero identificativo di questa microbiblioteca nella rete {brand} è {ref}" + }, + "question": { + "en": "What is the reference number of this public bookcase?", + "nl": "Wat is het referentienummer van dit boekenruilkastje?", + "de": "Wie lautet die Referenznummer dieses öffentlichen Bücherschranks?", + "fr": "Quelle est le numéro de référence de cette microbibliothèque ?", + "it": "Qual è il numero identificativo di questa microbiblioteca?" + }, + "condition": "brand~*", + "freeform": { + "key": "ref" + }, + "mappings": [ + { + "then": { + "en": "This bookcase is not part of a bigger network", + "nl": "Dit boekenruilkastje maakt geen deel uit van een netwerk", + "de": "Dieser Bücherschrank ist nicht Teil eines größeren Netzwerks", + "fr": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe", + "it": "Questa microbiblioteca non fa parte di una rete" + }, + "if": { + "and": [ + "nobrand=yes", + "brand=", + "ref=" + ] + } + } + ], + "id": "public_bookcase-ref" + }, + { + "question": { + "en": "When was this public bookcase installed?", + "nl": "Op welke dag werd dit boekenruilkastje geinstalleerd?", + "de": "Wann wurde dieser öffentliche Bücherschrank installiert?", + "fr": "Quand a été installée cette microbibliothèque ?", + "it": "Quando è stata inaugurata questa microbiblioteca?", + "ru": "Когда был установлен этот общественный книжный шкаф?" + }, + "render": { + "en": "Installed on {start_date}", + "nl": "Geplaatst op {start_date}", + "de": "Installiert am {start_date}", + "fr": "Installée le {start_date}", + "it": "È stata inaugurata il {start_date}", + "ru": "Установлен {start_date}" + }, + "freeform": { + "key": "start_date", + "type": "date" + }, + "id": "public_bookcase-start_date" + }, + { + "render": { + "en": "More info on the website", + "nl": "Meer info op de website", + "de": "Weitere Informationen auf der Webseite", + "fr": "Plus d'infos sur le site web", + "ru": "Более подробная информация на сайте", + "it": "Maggiori informazioni sul sito web" + }, + "question": { + "en": "Is there a website with more information about this public bookcase?", + "nl": "Is er een website over dit boekenruilkastje?", + "de": "Gibt es eine Website mit weiteren Informationen über diesen öffentlichen Bücherschrank?", + "fr": "Y a-t-il un site web avec plus d'informations sur cette microbibliothèque ?", + "it": "C'è un sito web con maggiori informazioni su questa microbiblioteca?", + "ru": "Есть ли веб-сайт с более подробной информацией об этом общественном книжном шкафе?" + }, + "freeform": { + "key": "website", + "type": "url" + }, + "id": "public_bookcase-website" + } + ], + "allowMove": true, + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity=public_bookcase", + "amenity=" + ] + }, + "neededChangesets": 5 + }, + "filter": [ + { + "id": "kid-books", + "options": [ + { + "question": "Kinderboeken aanwezig?", + "osmTags": "books~.*children.*" + } + ] + }, + { + "id": "adult-books", + "options": [ + { + "question": "Boeken voor volwassenen aanwezig?", + "osmTags": "books~.*adults.*" + } + ] + }, + { + "id": "inside", + "options": [ + { + "question": { + "nl": "Binnen of buiten", + "en": "Indoor or outdoor", + "de": "Innen oder Außen" + } + }, + { + "question": "Binnen?", + "osmTags": "indoor=yes" + }, + { + "question": "Buiten?", + "osmTags": { + "or": [ + "indoor=no", + "indoor=" + ] + } + } + ] + } + ], + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/bookcases/bookcase.svg" + }, + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
{name}
" + } + ] + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#0000ff" + }, + "width": { + "render": "8" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/shops/shops.json b/assets/layers/shops/shops.json index ab90478336..b739986fbf 100644 --- a/assets/layers/shops/shops.json +++ b/assets/layers/shops/shops.json @@ -1,6 +1,335 @@ { - "id": "shops", - "name": { + "id": "shops", + "name": { + "en": "Shop", + "fr": "Magasin", + "ru": "Магазин", + "ja": "店", + "nl": "Winkel", + "de": "Geschäft", + "eo": "Butiko" + }, + "minzoom": 16, + "source": { + "osmTags": { + "and": [ + "shop~*" + ] + } + }, + "title": { + "render": { + "en": "Shop", + "fr": "Magasin", + "ru": "Магазин", + "ja": "店", + "nl": "Winkel", + "de": "Geschäft", + "eo": "Butiko" + }, + "mappings": [ + { + "if": { + "and": [ + "name~*" + ] + }, + "then": { + "en": "{name}", + "fr": "{name}", + "ru": "{name}", + "ja": "{name}", + "de": "{name}", + "eo": "{name}" + } + }, + { + "if": { + "and": [ + "shop!~yes" + ] + }, + "then": { + "en": "{shop}", + "fr": "{shop}", + "ru": "{shop}", + "ja": "{shop}", + "de": "{shop}", + "eo": "{shop}" + } + } + ] + }, + "description": { + "en": "A shop", + "fr": "Un magasin", + "ja": "ショップ", + "nl": "Een winkel", + "ru": "Магазин", + "de": "Ein Geschäft", + "eo": "Butiko" + }, + "tagRenderings": [ + "images", + { + "question": { + "en": "What is the name of this shop?", + "fr": "Qu'est-ce que le nom de ce magasin?", + "ru": "Как называется этот магазин?", + "ja": "このお店の名前は何ですか?", + "nl": "Wat is de naam van deze winkel?", + "de": "Wie ist der Name dieses Geschäfts?" + }, + "render": "This shop is called {name}", + "freeform": { + "key": "name" + }, + "id": "shops-name" + }, + { + "render": { + "en": "This shop sells {shop}", + "fr": "Ce magasin vends {shop}", + "ja": "こちらのお店では{shop}を販売しております", + "de": "Dieses Geschäft verkauft {shop}", + "eo": "Ĉi tiu butiko vendas {shop}" + }, + "question": { + "en": "What does this shop sell?", + "fr": "Que vends ce magasin ?", + "ja": "このお店では何を売っていますか?", + "ru": "Что продаётся в этом магазине?", + "de": "Was wird in diesem Geschäft verkauft?", + "eo": "Kion vendas ĉi tiu butiko?" + }, + "freeform": { + "key": "shop" + }, + "mappings": [ + { + "if": { + "and": [ + "shop=convenience" + ] + }, + "then": { + "en": "Convenience store", + "fr": "Épicerie/superette", + "ja": "コンビニエンスストア", + "de": "Lebensmittelladen", + "nl": "Gemakswinkel" + } + }, + { + "if": { + "and": [ + "shop=supermarket" + ] + }, + "then": { + "en": "Supermarket", + "fr": "Supermarché", + "ru": "Супермаркет", + "ja": "スーパーマーケット", + "nl": "Supermarkt", + "de": "Supermarkt" + } + }, + { + "if": { + "and": [ + "shop=clothes" + ] + }, + "then": { + "en": "Clothing store", + "fr": "Magasin de vêtements", + "ru": "Магазин одежды", + "ja": "衣料品店", + "de": "Bekleidungsgeschäft", + "nl": "Kledingwinkel" + } + }, + { + "if": { + "and": [ + "shop=hairdresser" + ] + }, + "then": { + "en": "Hairdresser", + "fr": "Coiffeur", + "ru": "Парикмахерская", + "ja": "理容師", + "nl": "Kapper", + "de": "Friseur" + } + }, + { + "if": { + "and": [ + "shop=bakery" + ] + }, + "then": { + "en": "Bakery", + "fr": "Boulangerie", + "ja": "ベーカリー", + "nl": "Bakkerij", + "de": "Bäckerei", + "eo": "Bakejo" + } + }, + { + "if": { + "and": [ + "shop=car_repair" + ] + }, + "then": { + "en": "Car repair (garage)", + "fr": "Garage de réparation automobile", + "ja": "自動車修理(ガレージ)", + "de": "Autowerkstatt", + "fi": "Autokorjaamo", + "hu": "Autószerelő", + "id": "Bengkel Mobil", + "it": "Autofficina", + "nb_NO": "Bilverksted", + "nl": "Autogarage", + "pl": "Warsztat samochodowy", + "pt": "Oficina de automóveis", + "pt_BR": "Oficina Mecânica", + "ru": "Автомастерская", + "sv": "Bilverkstad" + } + }, + { + "if": { + "and": [ + "shop=car" + ] + }, + "then": { + "en": "Car dealer", + "fr": "Concessionnaire", + "ru": "Автосалон", + "ja": "自動車ディーラー", + "de": "Autohändler", + "nl": "Autodealer" + } + } + ], + "id": "shops-shop" + }, + { + "render": { + "en": "{phone}", + "fr": "{phone}", + "ca": "{phone}", + "id": "{phone}", + "ru": "{phone}", + "ja": "{phone}", + "de": "{phone}", + "eo": "{phone}", + "nl": "{phone}" + }, + "question": { + "en": "What is the phone number?", + "fr": "Quel est le numéro de téléphone ?", + "ja": "電話番号は何番ですか?", + "nl": "Wat is het telefoonnummer?", + "ru": "Какой телефон?", + "de": "Wie ist die Telefonnummer?", + "eo": "Kio estas la telefonnumero?" + }, + "freeform": { + "key": "phone", + "type": "phone" + }, + "id": "shops-phone" + }, + { + "render": { + "en": "{website}", + "fr": "{website}", + "ca": "{website}", + "id": "{website}", + "ru": "{website}", + "ja": "{website}", + "de": "{website}", + "eo": "{website}" + }, + "question": { + "en": "What is the website of this shop?", + "fr": "Quel est le site internet de ce magasin ?", + "ja": "このお店のホームページは何ですか?", + "nl": "Wat is de website van deze winkel?", + "ru": "Какой веб-сайт у этого магазина?", + "de": "Wie lautet die Webseite dieses Geschäfts?" + }, + "freeform": { + "key": "website", + "type": "url" + }, + "id": "shops-website" + }, + { + "render": { + "en": "{email}", + "fr": "{email}", + "id": "{email}", + "ru": "{email}", + "ja": "{email}", + "eo": "{email}", + "nl": "{email}" + }, + "question": { + "en": "What is the email address of this shop?", + "fr": "Quelle est l'adresse électronique de ce magasin ?", + "ja": "このお店のメールアドレスは何ですか?", + "ru": "Каков адрес электронной почты этого магазина?", + "nl": "Wat is het e-mailadres van deze winkel?", + "de": "Wie ist die Email-Adresse dieses Geschäfts?", + "eo": "Kio estas la retpoŝta adreso de ĉi tiu butiko?" + }, + "freeform": { + "key": "email", + "type": "email" + }, + "id": "shops-email" + }, + { + "render": { + "en": "{opening_hours_table(opening_hours)}", + "fr": "{opening_hours_table(opening_hours)}", + "ru": "{opening_hours_table(opening_hours)}", + "ja": "{opening_hours_table(opening_hours)}", + "nl": "{opening_hours_table(opening_hours)}" + }, + "question": { + "en": "What are the opening hours of this shop?", + "fr": "Quels sont les horaires d'ouverture de ce magasin ?", + "ja": "この店の営業時間は何時から何時までですか?", + "nl": "Wat zijn de openingsuren van deze winkel?", + "ru": "Каковы часы работы этого магазина?", + "de": "Wie sind die Öffnungszeiten dieses Geschäfts?" + }, + "freeform": { + "key": "opening_hours", + "type": "opening_hours" + }, + "id": "shops-opening_hours" + }, + "questions", + "reviews" + ], + "presets": [ + { + "tags": [ + "shop=yes" + ], + "title": { "en": "Shop", "fr": "Magasin", "ru": "Магазин", @@ -8,374 +337,53 @@ "nl": "Winkel", "de": "Geschäft", "eo": "Butiko" - }, - "minzoom": 16, - "source": { - "osmTags": { - "and": [ - "shop~*" - ] - } - }, - "title": { - "render": { - "en": "Shop", - "fr": "Magasin", - "ru": "Магазин", - "ja": "店", - "nl": "Winkel", - "de": "Geschäft", - "eo": "Butiko" - }, - "mappings": [ - { - "if": { - "and": [ - "name~*" - ] - }, - "then": { - "en": "{name}", - "fr": "{name}", - "ru": "{name}", - "ja": "{name}", - "de": "{name}", - "eo": "{name}" - } - }, - { - "if": { - "and": [ - "shop!~yes" - ] - }, - "then": { - "en": "{shop}", - "fr": "{shop}", - "ru": "{shop}", - "ja": "{shop}", - "de": "{shop}", - "eo": "{shop}" - } - } - ] - }, - "description": { - "en": "A shop", - "fr": "Un magasin", - "ja": "ショップ", - "nl": "Een winkel", - "ru": "Магазин", - "de": "Ein Geschäft", - "eo": "Butiko" - }, - "tagRenderings": [ - "images", - { - "question": { - "en": "What is the name of this shop?", - "fr": "Qu'est-ce que le nom de ce magasin?", - "ru": "Как называется этот магазин?", - "ja": "このお店の名前は何ですか?", - "nl": "Wat is de naam van deze winkel?", - "de": "Wie ist der Name dieses Geschäfts?" - }, - "render": "This shop is called {name}", - "freeform": { - "key": "name" - }, - "id": "shops-name" - }, - { - "render": { - "en": "This shop sells {shop}", - "fr": "Ce magasin vends {shop}", - "ja": "こちらのお店では{shop}を販売しております", - "de": "Dieses Geschäft verkauft {shop}", - "eo": "Ĉi tiu butiko vendas {shop}" - }, - "question": { - "en": "What does this shop sell?", - "fr": "Que vends ce magasin ?", - "ja": "このお店では何を売っていますか?", - "ru": "Что продаётся в этом магазине?", - "de": "Was wird in diesem Geschäft verkauft?", - "eo": "Kion vendas ĉi tiu butiko?" - }, - "freeform": { - "key": "shop" - }, - "mappings": [ - { - "if": { - "and": [ - "shop=convenience" - ] - }, - "then": { - "en": "Convenience store", - "fr": "Épicerie/superette", - "ja": "コンビニエンスストア", - "de": "Lebensmittelladen", - "nl": "Gemakswinkel" - } - }, - { - "if": { - "and": [ - "shop=supermarket" - ] - }, - "then": { - "en": "Supermarket", - "fr": "Supermarché", - "ru": "Супермаркет", - "ja": "スーパーマーケット", - "nl": "Supermarkt", - "de": "Supermarkt" - } - }, - { - "if": { - "and": [ - "shop=clothes" - ] - }, - "then": { - "en": "Clothing store", - "fr": "Magasin de vêtements", - "ru": "Магазин одежды", - "ja": "衣料品店", - "de": "Bekleidungsgeschäft", - "nl": "Kledingwinkel" - } - }, - { - "if": { - "and": [ - "shop=hairdresser" - ] - }, - "then": { - "en": "Hairdresser", - "fr": "Coiffeur", - "ru": "Парикмахерская", - "ja": "理容師", - "nl": "Kapper", - "de": "Friseur" - } - }, - { - "if": { - "and": [ - "shop=bakery" - ] - }, - "then": { - "en": "Bakery", - "fr": "Boulangerie", - "ja": "ベーカリー", - "nl": "Bakkerij", - "de": "Bäckerei", - "eo": "Bakejo" - } - }, - { - "if": { - "and": [ - "shop=car_repair" - ] - }, - "then": { - "en": "Car repair (garage)", - "fr": "Garage de réparation automobile", - "ja": "自動車修理(ガレージ)", - "de": "Autowerkstatt", - "fi": "Autokorjaamo", - "hu": "Autószerelő", - "id": "Bengkel Mobil", - "it": "Autofficina", - "nb_NO": "Bilverksted", - "nl": "Autogarage", - "pl": "Warsztat samochodowy", - "pt": "Oficina de automóveis", - "pt_BR": "Oficina Mecânica", - "ru": "Автомастерская", - "sv": "Bilverkstad" - } - }, - { - "if": { - "and": [ - "shop=car" - ] - }, - "then": { - "en": "Car dealer", - "fr": "Concessionnaire", - "ru": "Автосалон", - "ja": "自動車ディーラー", - "de": "Autohändler", - "nl": "Autodealer" - } - } - ], - "id": "shops-shop" - }, - { - "render": { - "en": "{phone}", - "fr": "{phone}", - "ca": "{phone}", - "id": "{phone}", - "ru": "{phone}", - "ja": "{phone}", - "de": "{phone}", - "eo": "{phone}", - "nl": "{phone}" - }, - "question": { - "en": "What is the phone number?", - "fr": "Quel est le numéro de téléphone ?", - "ja": "電話番号は何番ですか?", - "nl": "Wat is het telefoonnummer?", - "ru": "Какой телефон?", - "de": "Wie ist die Telefonnummer?", - "eo": "Kio estas la telefonnumero?" - }, - "freeform": { - "key": "phone", - "type": "phone" - }, - "id": "shops-phone" - }, - { - "render": { - "en": "{website}", - "fr": "{website}", - "ca": "{website}", - "id": "{website}", - "ru": "{website}", - "ja": "{website}", - "de": "{website}", - "eo": "{website}" - }, - "question": { - "en": "What is the website of this shop?", - "fr": "Quel est le site internet de ce magasin ?", - "ja": "このお店のホームページは何ですか?", - "nl": "Wat is de website van deze winkel?", - "ru": "Какой веб-сайт у этого магазина?", - "de": "Wie lautet die Webseite dieses Geschäfts?" - }, - "freeform": { - "key": "website", - "type": "url" - }, - "id": "shops-website" - }, - { - "render": { - "en": "{email}", - "fr": "{email}", - "id": "{email}", - "ru": "{email}", - "ja": "{email}", - "eo": "{email}", - "nl": "{email}" - }, - "question": { - "en": "What is the email address of this shop?", - "fr": "Quelle est l'adresse électronique de ce magasin ?", - "ja": "このお店のメールアドレスは何ですか?", - "ru": "Каков адрес электронной почты этого магазина?", - "nl": "Wat is het e-mailadres van deze winkel?", - "de": "Wie ist die Email-Adresse dieses Geschäfts?", - "eo": "Kio estas la retpoŝta adreso de ĉi tiu butiko?" - }, - "freeform": { - "key": "email", - "type": "email" - }, - "id": "shops-email" - }, - { - "render": { - "en": "{opening_hours_table(opening_hours)}", - "fr": "{opening_hours_table(opening_hours)}", - "ru": "{opening_hours_table(opening_hours)}", - "ja": "{opening_hours_table(opening_hours)}", - "nl": "{opening_hours_table(opening_hours)}" - }, - "question": { - "en": "What are the opening hours of this shop?", - "fr": "Quels sont les horaires d'ouverture de ce magasin ?", - "ja": "この店の営業時間は何時から何時までですか?", - "nl": "Wat zijn de openingsuren van deze winkel?", - "ru": "Каковы часы работы этого магазина?", - "de": "Wie sind die Öffnungszeiten dieses Geschäfts?" - }, - "freeform": { - "key": "opening_hours", - "type": "opening_hours" - }, - "id": "shops-opening_hours" - }, - "questions", - "reviews" - ], - "icon": { + }, + "description": { + "en": "Add a new shop", + "fr": "Ajouter un nouveau magasin", + "ru": "Добавить новый магазин", + "ja": "新しい店を追加する", + "nl": "Voeg een nieuwe winkel toe", + "de": "Ein neues Geschäft hinzufügen", + "eo": "Enmeti novan butikon" + } + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "amenity=", + "disused:amenity:={amenity}" + ] + } + }, + "allowMove": true, + "mapRendering": [ + { + "icon": { "render": "./assets/themes/shops/shop.svg" - }, - "iconOverlays": [ + }, + "iconBadges": [ { - "if": "opening_hours~*", - "then": "isOpen", - "badge": true + "if": "opening_hours~*", + "then": "isOpen" } - ], - "width": { - "render": "8" - }, - "iconSize": { + ], + "iconSize": { "render": "40,40,center" + }, + "location": [ + "point", + "centroid" + ] }, - "color": { + { + "color": { "render": "#00f" - }, - "presets": [ - { - "tags": [ - "shop=yes" - ], - "title": { - "en": "Shop", - "fr": "Magasin", - "ru": "Магазин", - "ja": "店", - "nl": "Winkel", - "de": "Geschäft", - "eo": "Butiko" - }, - "description": { - "en": "Add a new shop", - "fr": "Ajouter un nouveau magasin", - "ru": "Добавить новый магазин", - "ja": "新しい店を追加する", - "nl": "Voeg een nieuwe winkel toe", - "de": "Ein neues Geschäft hinzufügen", - "eo": "Enmeti novan butikon" - } - } - ], - "wayHandling": 2, - "deletion": { - "softDeletionTags": { - "and": [ - "amenity=", - "disused:amenity:={amenity}" - ] - } - }, - "allowMove": true + }, + "width": { + "render": "8" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/slow_roads/slow_roads.json b/assets/layers/slow_roads/slow_roads.json index 295a6e9363..88be0f2513 100644 --- a/assets/layers/slow_roads/slow_roads.json +++ b/assets/layers/slow_roads/slow_roads.json @@ -1,269 +1,278 @@ { - "id": "slow_roads", - "name": { - "nl": "Paadjes, trage wegen en autoluwe straten" + "id": "slow_roads", + "name": { + "nl": "Paadjes, trage wegen en autoluwe straten" + }, + "minzoom": 16, + "source": { + "osmTags": { + "and": [ + { + "or": [ + "highway=pedestrian", + "highway=footway", + "highway=path", + "highway=bridleway", + "highway=living_street", + "highway=track" + ] + }, + "access!=no", + "access!=private" + ] + } + }, + "title": { + "render": { + "nl": "Trage weg" }, - "icon": "./assets/layers/slow_roads/slow_road.svg", - "minzoom": 16, - "source": { - "osmTags": { - "and": [ - { - "or": [ - "highway=pedestrian", - "highway=footway", - "highway=path", - "highway=bridleway", - "highway=living_street", - "highway=track" - ] - }, - "access!=no", - "access!=private" - ] + "mappings": [ + { + "if": "name~*", + "then": { + "nl": "{name}" } - }, - "title": { - "render": { - "nl": "Trage weg" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "nl": "{name}" - } - }, - { - "if": "highway=footway", - "then": { - "nl": "Voetpad" - } - }, - { - "if": "highway=cycleway", - "then": { - "nl": "Fietspad" - } - }, - { - "if": "highway=pedestrian", - "then": { - "nl": "Voetgangersstraat" - } - }, - { - "if": "highway=living_street", - "then": { - "nl": "Woonerf" - } - }, - { - "if": "highway=path", - "then": "Klein pad" - } - ] - }, - "tagRenderings": [ - "images", - { - "id": "explanation", - "mappings": [ - { - "if": "highway=living_street", - "then": { - "nl:": "
Dit is een woonerf:
  • Voetgangers mogen hier de volledige breedte van de straat gebruiken
  • Gemotoriseerd verkeer mag maximaal 20km/h rijden
" - } - }, - { - "if": "highway=pedestrian", - "then": { - "nl": "Dit is een brede, autovrije straat" - } - }, - { - "if": "highway=footway", - "then": { - "nl": "Dit is een voetpaadje" - } - }, - { - "if": "highway=path", - "then": { - "nl": "Dit is een wegeltje of bospad" - } - }, - { - "if": "highway=bridleway", - "then": { - "nl": "Dit is een ruiterswegel" - } - }, - { - "if": "highway=track", - "then": { - "nl": "Dit is een tractorspoor of weg om landbouwgrond te bereikken" - } - } - ] - }, - { - "question": { - "nl": "Wat is de wegverharding van dit pad?" - }, - "render": { - "nl": "De ondergrond is {surface}", - "en": "The surface is {surface}", - "ru": "Поверхность - {surface}", - "fr": "La surface en {surface}", - "it": "La superficie è {surface}", - "de": "Die Oberfläche ist {surface}", - "eo": "La surfaco estas {surface}" - }, - "freeform": { - "key": "surface" - }, - "mappings": [ - { - "if": "surface=grass", - "then": { - "nl": "De ondergrond is gras", - "en": "The surface is grass", - "ru": "Поверхность - трава", - "fr": "La surface est en herbe", - "it": "La superficie è erba", - "de": "Die Oberfläche ist Gras", - "eo": "La surfaco estas herba" - } - }, - { - "if": "surface=ground", - "then": { - "nl": "De ondergrond is aarde", - "en": "The surface is ground", - "ru": "Поверхность - земля", - "fr": "La surface est en terre", - "it": "La superficie è terreno", - "de": "Die Oberfläche ist Erde" - } - }, - { - "if": "surface=unpaved", - "then": { - "nl": "De ondergrond is onverhard", - "en": "The surface is unpaved", - "fr": "La surface est non pavée", - "it": "La superficie è non pavimentata", - "de": "Die Oberfläche ist ohne festen Belag" - }, - "hideInAnswer": true - }, - { - "if": "surface=sand", - "then": { - "nl": "De ondergrond is zand", - "en": "The surface is sand", - "ru": "Поверхность - песок", - "fr": "La surface est en sable", - "it": "La superficie è sabbia", - "de": "Die Oberfläche ist Sand", - "eo": "La surfaco estas sabla" - } - }, - { - "if": "surface=paving_stones", - "then": { - "nl": "De ondergrond bestaat uit stoeptegels", - "en": "The surface is paving stones", - "ru": "Поверхность - брусчатка", - "it": "La superficie è pietre irregolari", - "fr": "La surface est en pierres pavées", - "de": "Die Oberfläche ist aus Pflastersteinen" - } - }, - { - "if": "surface=asphalt", - "then": { - "nl": "De ondergrond is asfalt", - "en": "The surface is asphalt", - "ru": "Поверхность - асфальт", - "it": "La superficie è asfalto", - "fr": "La surface est en bitume", - "de": "Die Oberfläche ist Asphalt" - } - }, - { - "if": "surface=concrete", - "then": { - "nl": "De ondergrond is beton", - "en": "The surface is concrete", - "ru": "Поверхность - бетон", - "fr": "La surface est en béton", - "it": "La superficie è calcestruzzo", - "de": "Die Oberfläche ist Beton", - "eo": "La surfaco estas betona" - } - }, - { - "if": "surface=paved", - "then": { - "nl": "De ondergrond is verhard", - "en": "The surface is paved", - "fr": "La surface est pavée", - "it": "La superficie è pavimentata", - "de": "Die Oberfläche ist gepflastert" - }, - "hideInAnswer": true - } - ], - "id": "slow_roads-surface" - }, - { - "id": "slow_road_is_lit", - "question": "Is deze weg 's nachts verlicht?", - "mappings": [ - { - "if": "lit=yes", - "then": "'s nachts verlicht" - }, - { - "if": "lit=no", - "then": "Niet verlicht" - } - ] + }, + { + "if": "highway=footway", + "then": { + "nl": "Voetpad" } - ], - "width": { + }, + { + "if": "highway=cycleway", + "then": { + "nl": "Fietspad" + } + }, + { + "if": "highway=pedestrian", + "then": { + "nl": "Voetgangersstraat" + } + }, + { + "if": "highway=living_street", + "then": { + "nl": "Woonerf" + } + }, + { + "if": "highway=path", + "then": "Klein pad" + } + ] + }, + "tagRenderings": [ + "images", + { + "id": "explanation", + "mappings": [ + { + "if": "highway=living_street", + "then": { + "nl:": "
Dit is een woonerf:
  • Voetgangers mogen hier de volledige breedte van de straat gebruiken
  • Gemotoriseerd verkeer mag maximaal 20km/h rijden
" + } + }, + { + "if": "highway=pedestrian", + "then": { + "nl": "Dit is een brede, autovrije straat" + } + }, + { + "if": "highway=footway", + "then": { + "nl": "Dit is een voetpaadje" + } + }, + { + "if": "highway=path", + "then": { + "nl": "Dit is een wegeltje of bospad" + } + }, + { + "if": "highway=bridleway", + "then": { + "nl": "Dit is een ruiterswegel" + } + }, + { + "if": "highway=track", + "then": { + "nl": "Dit is een tractorspoor of weg om landbouwgrond te bereikken" + } + } + ] + }, + { + "question": { + "nl": "Wat is de wegverharding van dit pad?" + }, + "render": { + "nl": "De ondergrond is {surface}", + "en": "The surface is {surface}", + "ru": "Поверхность - {surface}", + "fr": "La surface en {surface}", + "it": "La superficie è {surface}", + "de": "Die Oberfläche ist {surface}", + "eo": "La surfaco estas {surface}" + }, + "freeform": { + "key": "surface" + }, + "mappings": [ + { + "if": "surface=grass", + "then": { + "nl": "De ondergrond is gras", + "en": "The surface is grass", + "ru": "Поверхность - трава", + "fr": "La surface est en herbe", + "it": "La superficie è erba", + "de": "Die Oberfläche ist Gras", + "eo": "La surfaco estas herba" + } + }, + { + "if": "surface=ground", + "then": { + "nl": "De ondergrond is aarde", + "en": "The surface is ground", + "ru": "Поверхность - земля", + "fr": "La surface est en terre", + "it": "La superficie è terreno", + "de": "Die Oberfläche ist Erde" + } + }, + { + "if": "surface=unpaved", + "then": { + "nl": "De ondergrond is onverhard", + "en": "The surface is unpaved", + "fr": "La surface est non pavée", + "it": "La superficie è non pavimentata", + "de": "Die Oberfläche ist ohne festen Belag" + }, + "hideInAnswer": true + }, + { + "if": "surface=sand", + "then": { + "nl": "De ondergrond is zand", + "en": "The surface is sand", + "ru": "Поверхность - песок", + "fr": "La surface est en sable", + "it": "La superficie è sabbia", + "de": "Die Oberfläche ist Sand", + "eo": "La surfaco estas sabla" + } + }, + { + "if": "surface=paving_stones", + "then": { + "nl": "De ondergrond bestaat uit stoeptegels", + "en": "The surface is paving stones", + "ru": "Поверхность - брусчатка", + "it": "La superficie è pietre irregolari", + "fr": "La surface est en pierres pavées", + "de": "Die Oberfläche ist aus Pflastersteinen" + } + }, + { + "if": "surface=asphalt", + "then": { + "nl": "De ondergrond is asfalt", + "en": "The surface is asphalt", + "ru": "Поверхность - асфальт", + "it": "La superficie è asfalto", + "fr": "La surface est en bitume", + "de": "Die Oberfläche ist Asphalt" + } + }, + { + "if": "surface=concrete", + "then": { + "nl": "De ondergrond is beton", + "en": "The surface is concrete", + "ru": "Поверхность - бетон", + "fr": "La surface est en béton", + "it": "La superficie è calcestruzzo", + "de": "Die Oberfläche ist Beton", + "eo": "La surfaco estas betona" + } + }, + { + "if": "surface=paved", + "then": { + "nl": "De ondergrond is verhard", + "en": "The surface is paved", + "fr": "La surface est pavée", + "it": "La superficie è pavimentata", + "de": "Die Oberfläche ist gepflastert" + }, + "hideInAnswer": true + } + ], + "id": "slow_roads-surface" + }, + { + "id": "slow_road_is_lit", + "question": "Is deze weg 's nachts verlicht?", + "mappings": [ + { + "if": "lit=yes", + "then": "'s nachts verlicht" + }, + { + "if": "lit=no", + "then": "Niet verlicht" + } + ] + } + ], + "presets": [], + "mapRendering": [ + { + "icon": "./assets/layers/slow_roads/slow_road.svg", + "location": [ + "point" + ] + }, + { + "color": { + "render": "#eaba2a" + }, + "width": { "render": "7" - }, - "dashArray": { + }, + "dashArray": { "render": "", "mappings": [ - { - "if": "highway=cycleway", - "then": "" + { + "if": "highway=cycleway", + "then": "" + }, + { + "if": "highway=path", + "then": "0 12" + }, + { + "if": { + "or": [ + "highway=footway", + "highway=pedestrian" + ] }, - { - "if": "highway=path", - "then": "0 12" - }, - { - "if": { - "or": [ - "highway=footway", - "highway=pedestrian" - ] - }, - "then": "12 18" - }, - { - "if": "highway=living_street", - "then": "12 12 0 12" - } + "then": "12 18" + }, + { + "if": "highway=living_street", + "then": "12 12 0 12" + } ] - }, - "color": { - "render": "#eaba2a" - }, - "presets": [] + } + } + ] } \ No newline at end of file diff --git a/assets/layers/sport_pitch/license_info.json b/assets/layers/sport_pitch/license_info.json index b4d37f96ee..17c0c3c831 100644 --- a/assets/layers/sport_pitch/license_info.json +++ b/assets/layers/sport_pitch/license_info.json @@ -1,15 +1,4 @@ [ - { - "path": ".svg", - "license": "CC-BY-SA 4.0", - "authors": [ - "Gitte Loos (Createlli) in opdracht van Provincie Antwerpen " - ], - "sources": [ - "https://createlli.com/", - "https://www.provincieantwerpen.be/" - ] - }, { "path": "baseball.svg", "license": "CC-BY-SA 4.0", diff --git a/assets/layers/sport_pitch/sport_pitch.json b/assets/layers/sport_pitch/sport_pitch.json index 9a4f8c92ca..c3d7f38e1c 100644 --- a/assets/layers/sport_pitch/sport_pitch.json +++ b/assets/layers/sport_pitch/sport_pitch.json @@ -1,528 +1,532 @@ { - "id": "sport_pitch", - "name": { - "nl": "Sportterrein", - "fr": "Terrains de sport", - "en": "Sport pitches", - "ru": "Спортивные площадки", - "it": "Campi sportivi", - "de": "Sportplätze" - }, - "wayHandling": 1, - "minzoom": 12, - "source": { - "osmTags": { + "id": "sport_pitch", + "name": { + "nl": "Sportterrein", + "fr": "Terrains de sport", + "en": "Sport pitches", + "ru": "Спортивные площадки", + "it": "Campi sportivi", + "de": "Sportplätze" + }, + "minzoom": 12, + "source": { + "osmTags": { + "and": [ + "leisure=pitch" + ] + } + }, + "calculatedTags": [ + "_size_classification=Number(feat.properties._surface) < 200 ? 'small' : (Number(feat.properties._surface) < 750 ? 'medium' : 'large') " + ], + "title": { + "render": { + "nl": "Sportterrein", + "fr": "Terrain de sport", + "en": "Sport pitch", + "ru": "Спортивная площадка", + "it": "Campo sportivo", + "de": "Sportplatz" + } + }, + "description": { + "nl": "Een sportterrein", + "fr": "Un terrain de sport", + "en": "A sport pitch", + "it": "Un campo sportivo", + "ru": "Спортивная площадка", + "de": "Ein Sportplatz" + }, + "tagRenderings": [ + "images", + { + "render": { + "nl": "Hier kan men {sport} beoefenen", + "fr": "Ici on joue au {sport}", + "en": "{sport} is played here", + "it": "Qui si gioca a {sport}", + "de": "Hier wird {sport} gespielt" + }, + "freeform": { + "key": "sport" + }, + "question": { + "nl": "Welke sporten kan men hier beoefenen?", + "fr": "À quel sport peut-on jouer ici ?", + "en": "Which sport can be played here?", + "it": "Quale sport si gioca qui?", + "de": "Welche Sportarten können hier gespielt werden?" + }, + "multiAnswer": true, + "mappings": [ + { + "if": { "and": [ - "leisure=pitch" + "sport=basketball" ] + }, + "then": { + "nl": "Hier kan men basketbal spelen", + "fr": "Ici, on joue au basketball", + "en": "Basketball is played here", + "it": "Qui si gioca a basket", + "ru": "Здесь можно играть в баскетбол", + "de": "Hier wird Basketball gespielt" + } + }, + { + "if": { + "and": [ + "sport=soccer" + ] + }, + "then": { + "nl": "Hier kan men voetbal spelen", + "fr": "Ici, on joue au football", + "en": "Soccer is played here", + "it": "Qui si gioca a calcio", + "ru": "Здесь можно играть в футбол", + "de": "Hier wird Fußball gespielt" + } + }, + { + "if": { + "and": [ + "sport=table_tennis" + ] + }, + "then": { + "nl": "Dit is een pingpongtafel", + "fr": "C'est une table de ping-pong", + "en": "This is a pingpong table", + "ru": "Это стол для пинг-понга", + "it": "Questo è un tavolo da ping pong", + "de": "Dies ist eine Tischtennisplatte" + } + }, + { + "if": { + "and": [ + "sport=tennis" + ] + }, + "then": { + "nl": "Hier kan men tennis spelen", + "fr": "Ici, on joue au tennis", + "en": "Tennis is played here", + "it": "Qui si gioca a tennis", + "ru": "Здесь можно играть в теннис", + "de": "Hier wird Tennis gespielt" + } + }, + { + "if": { + "and": [ + "sport=korfball" + ] + }, + "then": { + "nl": "Hier kan men korfbal spelen", + "fr": "Ici, on joue au korfball", + "en": "Korfball is played here", + "it": "Qui si gioca a korfball", + "ru": "Здесь можно играть в корфбол", + "de": "Hier wird Kopfball gespielt" + } + }, + { + "if": { + "and": [ + "sport=basket" + ] + }, + "then": { + "nl": "Hier kan men basketbal beoefenen", + "fr": "Ici, on joue au basketball", + "en": "Basketball is played here", + "it": "Qui si gioca a basket", + "ru": "Здесь можно играть в баскетбол", + "de": "Hier wird Basketball gespielt" + }, + "hideInAnswer": true } + ], + "id": "sport_pitch-sport" }, - "calculatedTags": [ - "_size_classification=Number(feat.properties._surface) < 200 ? 'small' : (Number(feat.properties._surface) < 750 ? 'medium' : 'large') " - ], - "title": { - "render": { - "nl": "Sportterrein", - "fr": "Terrain de sport", - "en": "Sport pitch", - "ru": "Спортивная площадка", - "it": "Campo sportivo", - "de": "Sportplatz" + { + "question": { + "nl": "Wat is de ondergrond van dit sportveld?", + "fr": "De quelle surface est fait ce terrain de sport ?", + "en": "Which is the surface of this sport pitch?", + "it": "Qual è la superficie di questo campo sportivo?", + "ru": "Какое покрытие на этой спортивной площадке?", + "de": "Was ist die Oberfläche dieses Sportplatzes?" + }, + "render": { + "nl": "De ondergrond is {surface}", + "fr": "La surface est {surface}", + "en": "The surface is {surface}", + "ru": "Поверхность - {surface}", + "it": "La superficie è {surface}", + "de": "Die Oberfläche ist {surface}" + }, + "freeform": { + "key": "surface" + }, + "mappings": [ + { + "if": "surface=grass", + "then": { + "nl": "De ondergrond is gras", + "fr": "La surface est de l'herbe", + "en": "The surface is grass", + "ru": "Поверхность - трава", + "it": "La superficie è erba", + "de": "Die Oberfläche ist Gras" + } + }, + { + "if": "surface=sand", + "then": { + "nl": "De ondergrond is zand", + "fr": "La surface est du sable", + "en": "The surface is sand", + "ru": "Поверхность - песок", + "it": "La superficie è sabbia", + "de": "Die Oberfläche ist Sand" + } + }, + { + "if": "surface=paving_stones", + "then": { + "nl": "De ondergrond bestaat uit stoeptegels", + "fr": "La surface est des pavés", + "en": "The surface is paving stones", + "ru": "Поверхность - брусчатка", + "it": "La superficie è pietre irregolari", + "de": "Die Oberfläche ist aus Pflastersteinen" + } + }, + { + "if": "surface=asphalt", + "then": { + "nl": "De ondergrond is asfalt", + "fr": "La surface est de l'asphalte", + "en": "The surface is asphalt", + "ru": "Поверхность - асфальт", + "it": "La superficie è asfalto", + "de": "Die Oberfläche ist Asphalt" + } + }, + { + "if": "surface=concrete", + "then": { + "nl": "De ondergrond is beton", + "fr": "La surface est du béton", + "en": "The surface is concrete", + "ru": "Поверхность - бетон", + "it": "La superficie è calcestruzzo", + "de": "Die Oberfläche ist Beton" + } } + ], + "id": "sport_pitch-surface" }, - "description": { - "nl": "Een sportterrein", - "fr": "Un terrain de sport", - "en": "A sport pitch", - "it": "Un campo sportivo", + { + "id": "sport-pitch-access", + "question": { + "nl": "Is dit sportterrein publiek toegankelijk?", + "fr": "Est-ce que ce terrain de sport est accessible au public ?", + "en": "Is this sport pitch publicly accessible?", + "it": "Questo campo sportivo è aperto al pubblico?", + "ru": "Есть ли свободный доступ к этой спортивной площадке?", + "de": "Ist dieser Sportplatz öffentlich zugänglich?" + }, + "mappings": [ + { + "if": "access=public", + "then": { + "nl": "Publiek toegankelijk", + "fr": "Accessible au public", + "en": "Public access", + "it": "Aperto al pubblico", + "ru": "Свободный доступ", + "de": "Öffentlicher Zugang" + } + }, + { + "if": "access=limited", + "then": { + "nl": "Beperkt toegankelijk (enkel na reservatie, tijdens bepaalde uren, ...)", + "fr": "Accès limité (par exemple uniquement sur réservation, à certains horaires…)", + "en": "Limited access (e.g. only with an appointment, during certain hours, ...)", + "it": "Accesso limitato (p.es. solo con prenotazione, in certi orari, ...)", + "ru": "Ограниченный доступ (напр., только по записи, в определённые часы, ...)", + "de": "Eingeschränkter Zugang (z. B. nur mit Termin, zu bestimmten Zeiten, ...)" + } + }, + { + "if": "access=members", + "then": { + "nl": "Enkel toegankelijk voor leden van de bijhorende sportclub", + "fr": "Accessible uniquement aux membres du club", + "en": "Only accessible for members of the club", + "it": "Accesso limitato ai membri dell'associazione", + "ru": "Доступ только членам клуба", + "de": "Zugang nur für Vereinsmitglieder" + } + }, + { + "if": "access=private", + "then": { + "nl": "Privaat en niet toegankelijk", + "fr": "Privé - Pas accessible au public", + "en": "Private - not accessible to the public", + "it": "Privato - non aperto al pubblico", + "de": "Privat - kein öffentlicher Zugang" + } + } + ] + }, + { + "id": "sport-pitch-reservation", + "question": { + "nl": "Moet men reserveren om gebruik te maken van dit sportveld?", + "fr": "Doit-on réserver pour utiliser ce terrain de sport ?", + "en": "Does one have to make an appointment to use this sport pitch?", + "it": "È necessario prenotarsi per usare questo campo sportivo?", + "ru": "Нужна ли предварительная запись для доступа на эту спортивную площадку?", + "de": "Muss man einen Termin vereinbaren, um diesen Sportplatz zu benutzen?" + }, + "condition": { + "and": [ + "access!=public", + "access!=private", + "access!=members" + ] + }, + "mappings": [ + { + "if": "reservation=required", + "then": { + "nl": "Reserveren is verplicht om gebruik te maken van dit sportterrein", + "fr": "Il est obligatoire de réserver pour utiliser ce terrain de sport", + "en": "Making an appointment is obligatory to use this sport pitch", + "it": "La prenotazione è obbligatoria per usare questo campo sportivo", + "de": "Für die Nutzung des Sportplatzes ist eine Voranmeldung erforderlich" + } + }, + { + "if": "reservation=recommended", + "then": { + "nl": "Reserveren is sterk aangeraden om gebruik te maken van dit sportterrein", + "fr": "Il est recommendé de réserver pour utiliser ce terrain de sport", + "en": "Making an appointment is recommended when using this sport pitch", + "it": "La prenotazione è consigliata per usare questo campo sportivo", + "ru": "Желательна предварительная запись для доступа на эту спортивную площадку", + "de": "Für die Nutzung des Sportplatzes wird eine Voranmeldung empfohlen" + } + }, + { + "if": "reservation=yes", + "then": { + "nl": "Reserveren is mogelijk, maar geen voorwaarde", + "fr": "Il est possible de réserver, mais ce n'est pas nécéssaire pour utiliser ce terrain de sport", + "en": "Making an appointment is possible, but not necessary to use this sport pitch", + "it": "La prenotazione è consentita, ma non è obbligatoria per usare questo campo sportivo", + "ru": "Предварительная запись для доступа на эту спортивную площадку возможна, но не обязательна", + "de": "Eine Voranmeldung ist möglich, aber nicht notwendig, um diesen Sportplatz zu nutzen" + } + }, + { + "if": "reservation=no", + "then": { + "nl": "Reserveren is niet mogelijk", + "fr": "On ne peut pas réserver", + "en": "Making an appointment is not possible", + "it": "Non è possibile prenotare", + "ru": "Невозможна предварительная запись", + "de": "Termine nach Vereinbarung nicht möglich" + } + } + ] + }, + { + "question": { + "nl": "Wat is het telefoonnummer van de bevoegde dienst of uitbater?", + "fr": "Quel est le numéro de téléphone du gérant ?", + "en": "What is the phone number of the operator?", + "it": "Qual è il numero di telefono del gestore?", + "de": "Wie ist die Telefonnummer des Betreibers?" + }, + "freeform": { + "key": "phone", + "type": "phone" + }, + "render": "{phone}", + "id": "sport_pitch-phone" + }, + { + "question": { + "nl": "Wat is het email-adres van de bevoegde dienst of uitbater?", + "fr": "Quelle est l'adresse courriel du gérant ?", + "en": "What is the email address of the operator?", + "it": "Qual è l'indirizzo email del gestore?", + "de": "Wie ist die Email-Adresse des Betreibers?" + }, + "freeform": { + "key": "email", + "type": "email" + }, + "render": "{email}", + "id": "sport_pitch-email" + }, + { + "question": { + "nl": "Wanneer is dit sportveld toegankelijk?", + "fr": "Quand ce terrain est-il accessible ?", + "en": "When is this pitch accessible?", + "it": "Quando è aperto questo campo sportivo?", + "ru": "В какое время доступна эта площадка?", + "de": "Wann ist dieser Sportplatz zugänglich?" + }, + "render": "Openingsuren: {opening_hours_table()}", + "freeform": { + "key": "opening_hours", + "type": "opening_hours" + }, + "mappings": [ + { + "if": "opening_hours=", + "then": "24/7 toegankelijk", + "hideInAnswer": true + }, + { + "if": "opening_hours=24/7", + "then": { + "nl": "24/7 toegankelijk", + "fr": "Accessible en permanence", + "en": "Always accessible", + "ru": "Всегда доступен", + "it": "Sempre aperto", + "de": "Immer zugänglich" + } + } + ], + "condition": "access~*", + "id": "sport_pitch-opening_hours" + }, + "questions", + { + "id": "sport-pitch-reviews", + "render": "{reviews(name, sportpitch)}" + } + ], + "presets": [ + { + "title": { + "nl": "Ping-pong tafel", + "fr": "Table de ping-pong", + "en": "Tabletennis table", + "it": "Tavolo da tennistavolo", + "ru": "Стол для настольного тенниса", + "de": "Tischtennisplatte" + }, + "tags": [ + "leisure=pitch", + "sport=table_tennis" + ] + }, + { + "title": { + "nl": "Sportterrein", + "fr": "Terrain de sport", + "en": "Sport pitch", "ru": "Спортивная площадка", - "de": "Ein Sportplatz" - }, - "tagRenderings": [ - "images", - { - "render": { - "nl": "Hier kan men {sport} beoefenen", - "fr": "Ici on joue au {sport}", - "en": "{sport} is played here", - "it": "Qui si gioca a {sport}", - "de": "Hier wird {sport} gespielt" - }, - "freeform": { - "key": "sport" - }, - "question": { - "nl": "Welke sporten kan men hier beoefenen?", - "fr": "À quel sport peut-on jouer ici ?", - "en": "Which sport can be played here?", - "it": "Quale sport si gioca qui?", - "de": "Welche Sportarten können hier gespielt werden?" - }, - "multiAnswer": true, - "mappings": [ - { - "if": { - "and": [ - "sport=basketball" - ] - }, - "then": { - "nl": "Hier kan men basketbal spelen", - "fr": "Ici, on joue au basketball", - "en": "Basketball is played here", - "it": "Qui si gioca a basket", - "ru": "Здесь можно играть в баскетбол", - "de": "Hier wird Basketball gespielt" - } - }, - { - "if": { - "and": [ - "sport=soccer" - ] - }, - "then": { - "nl": "Hier kan men voetbal spelen", - "fr": "Ici, on joue au football", - "en": "Soccer is played here", - "it": "Qui si gioca a calcio", - "ru": "Здесь можно играть в футбол", - "de": "Hier wird Fußball gespielt" - } - }, - { - "if": { - "and": [ - "sport=table_tennis" - ] - }, - "then": { - "nl": "Dit is een pingpongtafel", - "fr": "C'est une table de ping-pong", - "en": "This is a pingpong table", - "ru": "Это стол для пинг-понга", - "it": "Questo è un tavolo da ping pong", - "de": "Dies ist eine Tischtennisplatte" - } - }, - { - "if": { - "and": [ - "sport=tennis" - ] - }, - "then": { - "nl": "Hier kan men tennis spelen", - "fr": "Ici, on joue au tennis", - "en": "Tennis is played here", - "it": "Qui si gioca a tennis", - "ru": "Здесь можно играть в теннис", - "de": "Hier wird Tennis gespielt" - } - }, - { - "if": { - "and": [ - "sport=korfball" - ] - }, - "then": { - "nl": "Hier kan men korfbal spelen", - "fr": "Ici, on joue au korfball", - "en": "Korfball is played here", - "it": "Qui si gioca a korfball", - "ru": "Здесь можно играть в корфбол", - "de": "Hier wird Kopfball gespielt" - } - }, - { - "if": { - "and": [ - "sport=basket" - ] - }, - "then": { - "nl": "Hier kan men basketbal beoefenen", - "fr": "Ici, on joue au basketball", - "en": "Basketball is played here", - "it": "Qui si gioca a basket", - "ru": "Здесь можно играть в баскетбол", - "de": "Hier wird Basketball gespielt" - }, - "hideInAnswer": true - } - ], - "id": "sport_pitch-sport" - }, - { - "question": { - "nl": "Wat is de ondergrond van dit sportveld?", - "fr": "De quelle surface est fait ce terrain de sport ?", - "en": "Which is the surface of this sport pitch?", - "it": "Qual è la superficie di questo campo sportivo?", - "ru": "Какое покрытие на этой спортивной площадке?", - "de": "Was ist die Oberfläche dieses Sportplatzes?" - }, - "render": { - "nl": "De ondergrond is {surface}", - "fr": "La surface est {surface}", - "en": "The surface is {surface}", - "ru": "Поверхность - {surface}", - "it": "La superficie è {surface}", - "de": "Die Oberfläche ist {surface}" - }, - "freeform": { - "key": "surface" - }, - "mappings": [ - { - "if": "surface=grass", - "then": { - "nl": "De ondergrond is gras", - "fr": "La surface est de l'herbe", - "en": "The surface is grass", - "ru": "Поверхность - трава", - "it": "La superficie è erba", - "de": "Die Oberfläche ist Gras" - } - }, - { - "if": "surface=sand", - "then": { - "nl": "De ondergrond is zand", - "fr": "La surface est du sable", - "en": "The surface is sand", - "ru": "Поверхность - песок", - "it": "La superficie è sabbia", - "de": "Die Oberfläche ist Sand" - } - }, - { - "if": "surface=paving_stones", - "then": { - "nl": "De ondergrond bestaat uit stoeptegels", - "fr": "La surface est des pavés", - "en": "The surface is paving stones", - "ru": "Поверхность - брусчатка", - "it": "La superficie è pietre irregolari", - "de": "Die Oberfläche ist aus Pflastersteinen" - } - }, - { - "if": "surface=asphalt", - "then": { - "nl": "De ondergrond is asfalt", - "fr": "La surface est de l'asphalte", - "en": "The surface is asphalt", - "ru": "Поверхность - асфальт", - "it": "La superficie è asfalto", - "de": "Die Oberfläche ist Asphalt" - } - }, - { - "if": "surface=concrete", - "then": { - "nl": "De ondergrond is beton", - "fr": "La surface est du béton", - "en": "The surface is concrete", - "ru": "Поверхность - бетон", - "it": "La superficie è calcestruzzo", - "de": "Die Oberfläche ist Beton" - } - } - ], - "id": "sport_pitch-surface" - }, - { - "id": "sport-pitch-access", - "question": { - "nl": "Is dit sportterrein publiek toegankelijk?", - "fr": "Est-ce que ce terrain de sport est accessible au public ?", - "en": "Is this sport pitch publicly accessible?", - "it": "Questo campo sportivo è aperto al pubblico?", - "ru": "Есть ли свободный доступ к этой спортивной площадке?", - "de": "Ist dieser Sportplatz öffentlich zugänglich?" - }, - "mappings": [ - { - "if": "access=public", - "then": { - "nl": "Publiek toegankelijk", - "fr": "Accessible au public", - "en": "Public access", - "it": "Aperto al pubblico", - "ru": "Свободный доступ", - "de": "Öffentlicher Zugang" - } - }, - { - "if": "access=limited", - "then": { - "nl": "Beperkt toegankelijk (enkel na reservatie, tijdens bepaalde uren, ...)", - "fr": "Accès limité (par exemple uniquement sur réservation, à certains horaires…)", - "en": "Limited access (e.g. only with an appointment, during certain hours, ...)", - "it": "Accesso limitato (p.es. solo con prenotazione, in certi orari, ...)", - "ru": "Ограниченный доступ (напр., только по записи, в определённые часы, ...)", - "de": "Eingeschränkter Zugang (z. B. nur mit Termin, zu bestimmten Zeiten, ...)" - } - }, - { - "if": "access=members", - "then": { - "nl": "Enkel toegankelijk voor leden van de bijhorende sportclub", - "fr": "Accessible uniquement aux membres du club", - "en": "Only accessible for members of the club", - "it": "Accesso limitato ai membri dell'associazione", - "ru": "Доступ только членам клуба", - "de": "Zugang nur für Vereinsmitglieder" - } - }, - { - "if": "access=private", - "then": { - "nl": "Privaat en niet toegankelijk", - "fr": "Privé - Pas accessible au public", - "en": "Private - not accessible to the public", - "it": "Privato - non aperto al pubblico", - "de": "Privat - kein öffentlicher Zugang" - } - } - ] - }, - { - "id": "sport-pitch-reservation", - "question": { - "nl": "Moet men reserveren om gebruik te maken van dit sportveld?", - "fr": "Doit-on réserver pour utiliser ce terrain de sport ?", - "en": "Does one have to make an appointment to use this sport pitch?", - "it": "È necessario prenotarsi per usare questo campo sportivo?", - "ru": "Нужна ли предварительная запись для доступа на эту спортивную площадку?", - "de": "Muss man einen Termin vereinbaren, um diesen Sportplatz zu benutzen?" - }, - "condition": { - "and": [ - "access!=public", - "access!=private", - "access!=members" - ] - }, - "mappings": [ - { - "if": "reservation=required", - "then": { - "nl": "Reserveren is verplicht om gebruik te maken van dit sportterrein", - "fr": "Il est obligatoire de réserver pour utiliser ce terrain de sport", - "en": "Making an appointment is obligatory to use this sport pitch", - "it": "La prenotazione è obbligatoria per usare questo campo sportivo", - "de": "Für die Nutzung des Sportplatzes ist eine Voranmeldung erforderlich" - } - }, - { - "if": "reservation=recommended", - "then": { - "nl": "Reserveren is sterk aangeraden om gebruik te maken van dit sportterrein", - "fr": "Il est recommendé de réserver pour utiliser ce terrain de sport", - "en": "Making an appointment is recommended when using this sport pitch", - "it": "La prenotazione è consigliata per usare questo campo sportivo", - "ru": "Желательна предварительная запись для доступа на эту спортивную площадку", - "de": "Für die Nutzung des Sportplatzes wird eine Voranmeldung empfohlen" - } - }, - { - "if": "reservation=yes", - "then": { - "nl": "Reserveren is mogelijk, maar geen voorwaarde", - "fr": "Il est possible de réserver, mais ce n'est pas nécéssaire pour utiliser ce terrain de sport", - "en": "Making an appointment is possible, but not necessary to use this sport pitch", - "it": "La prenotazione è consentita, ma non è obbligatoria per usare questo campo sportivo", - "ru": "Предварительная запись для доступа на эту спортивную площадку возможна, но не обязательна", - "de": "Eine Voranmeldung ist möglich, aber nicht notwendig, um diesen Sportplatz zu nutzen" - } - }, - { - "if": "reservation=no", - "then": { - "nl": "Reserveren is niet mogelijk", - "fr": "On ne peut pas réserver", - "en": "Making an appointment is not possible", - "it": "Non è possibile prenotare", - "ru": "Невозможна предварительная запись", - "de": "Termine nach Vereinbarung nicht möglich" - } - } - ] - }, - { - "question": { - "nl": "Wat is het telefoonnummer van de bevoegde dienst of uitbater?", - "fr": "Quel est le numéro de téléphone du gérant ?", - "en": "What is the phone number of the operator?", - "it": "Qual è il numero di telefono del gestore?", - "de": "Wie ist die Telefonnummer des Betreibers?" - }, - "freeform": { - "key": "phone", - "type": "phone" - }, - "render": "{phone}", - "id": "sport_pitch-phone" - }, - { - "question": { - "nl": "Wat is het email-adres van de bevoegde dienst of uitbater?", - "fr": "Quelle est l'adresse courriel du gérant ?", - "en": "What is the email address of the operator?", - "it": "Qual è l'indirizzo email del gestore?", - "de": "Wie ist die Email-Adresse des Betreibers?" - }, - "freeform": { - "key": "email", - "type": "email" - }, - "render": "{email}", - "id": "sport_pitch-email" - }, - { - "question": { - "nl": "Wanneer is dit sportveld toegankelijk?", - "fr": "Quand ce terrain est-il accessible ?", - "en": "When is this pitch accessible?", - "it": "Quando è aperto questo campo sportivo?", - "ru": "В какое время доступна эта площадка?", - "de": "Wann ist dieser Sportplatz zugänglich?" - }, - "render": "Openingsuren: {opening_hours_table()}", - "freeform": { - "key": "opening_hours", - "type": "opening_hours" - }, - "mappings": [ - { - "if": "opening_hours=", - "then": "24/7 toegankelijk", - "hideInAnswer": true - }, - { - "if": "opening_hours=24/7", - "then": { - "nl": "24/7 toegankelijk", - "fr": "Accessible en permanence", - "en": "Always accessible", - "ru": "Всегда доступен", - "it": "Sempre aperto", - "de": "Immer zugänglich" - } - } - ], - "condition": "access~*", - "id": "sport_pitch-opening_hours" - }, - "questions", - { - "id": "sport-pitch-reviews", - "render": "{reviews(name, sportpitch)}" - } - ], - "icon": { + "it": "Campo sportivo", + "de": "Sportplatz" + }, + "tags": [ + "leisure=pitch", + "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" + ] + } + ], + "mapRendering": [ + { + "icon": { "render": "circle:white;./assets/layers/sport_pitch/sport_pitch.svg", "mappings": [ - { - "if": { - "or": [ - "sport=baseball", - "sport=basketball", - "sport=beachvolleyball", - "sport=boules", - "sport=skateboard", - "sport=soccer", - "sport=table_tennis", - "sport=tennis", - "sport=volleyball" - ] - }, - "then": "circle:white;./assets/layers/sport_pitch/{sport}.svg" - } - ] - }, - "iconOverlays": [ - { + { "if": { - "and": [ - "opening_hours!=24/7", - "opening_hours~*" - ] + "or": [ + "sport=baseball", + "sport=basketball", + "sport=beachvolleyball", + "sport=boules", + "sport=skateboard", + "sport=soccer", + "sport=table_tennis", + "sport=tennis", + "sport=volleyball" + ] }, - "then": "isOpen", - "badge": true + "then": "circle:white;./assets/layers/sport_pitch/{sport}.svg" + } + ] + }, + "iconBadges": [ + { + "if": { + "and": [ + "opening_hours!=24/7", + "opening_hours~*" + ] + }, + "then": "isOpen" }, { - "if": { - "or": [ - "access=customers", - "access=private", - "access=no" - ] - }, - "then": "circle:white;./assets/layers/sport_pitch/lock.svg", - "badge": true + "if": { + "or": [ + "access=customers", + "access=private", + "access=no" + ] + }, + "then": "circle:white;./assets/layers/sport_pitch/lock.svg" } - ], - "width": { - "render": "1" - }, - "iconSize": { + ], + "iconSize": { "render": "25,25,center", "mappings": [ - { - "if": { - "or": [ - "_size_classification=medium", - "id~node/.*" - ] - }, - "then": "40,40,center" + { + "if": { + "or": [ + "_size_classification=medium", + "id~node/.*" + ] }, - { - "if": "_size_classification=small", - "then": "25,25,center" - }, - { - "if": "_size_classification=large", - "then": "50,50,center" - } + "then": "32,32,center" + }, + { + "if": "_size_classification=small", + "then": "25,25,center" + }, + { + "if": "_size_classification=large", + "then": "40,40,center" + } ] + }, + "location": [ + "point", + "centroid" + ] }, - "color": { - "render": "#7cb82f" - }, - "presets": [ - { - "title": { - "nl": "Ping-pong tafel", - "fr": "Table de ping-pong", - "en": "Tabletennis table", - "it": "Tavolo da tennistavolo", - "ru": "Стол для настольного тенниса", - "de": "Tischtennisplatte" - }, - "tags": [ - "leisure=pitch", - "sport=table_tennis" - ] - }, - { - "title": { - "nl": "Sportterrein", - "fr": "Terrain de sport", - "en": "Sport pitch", - "ru": "Спортивная площадка", - "it": "Campo sportivo", - "de": "Sportplatz" - }, - "tags": [ - "leisure=pitch", - "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" - ] - } - ] + { + "color": "#00cc00", + "width": "1", + "fill": "false" + } + ] } \ No newline at end of file diff --git a/assets/layers/street_lamps/bent_pole_1.svg b/assets/layers/street_lamps/bent_pole_1.svg new file mode 100644 index 0000000000..c702d8b440 --- /dev/null +++ b/assets/layers/street_lamps/bent_pole_1.svg @@ -0,0 +1,99 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/street_lamps/bent_pole_2.svg b/assets/layers/street_lamps/bent_pole_2.svg new file mode 100644 index 0000000000..f015028aa1 --- /dev/null +++ b/assets/layers/street_lamps/bent_pole_2.svg @@ -0,0 +1,137 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/street_lamps/license_info.json b/assets/layers/street_lamps/license_info.json new file mode 100644 index 0000000000..34ca9cd83a --- /dev/null +++ b/assets/layers/street_lamps/license_info.json @@ -0,0 +1,36 @@ +[ + { + "path": "bent_pole_1.svg", + "license": "CC0", + "authors": [ + "Robin van der Linde" + ], + "sources": [] + }, + { + "path": "bent_pole_2.svg", + "license": "CC0", + "authors": [ + "Robin van der Linde" + ], + "sources": [] + }, + { + "path": "straight_pole.svg", + "license": "CC0", + "authors": [ + "Robin van der Linde" + ], + "sources": [] + }, + { + "path": "street_lamp.svg", + "license": "CC0", + "authors": [ + "Yohan Boniface" + ], + "sources": [ + "https://github.com/hotosm/HDM-CartoCSS/blob/master/icons/poi/street_lamp.svg" + ] + } +] \ No newline at end of file diff --git a/assets/layers/street_lamps/straight_pole.svg b/assets/layers/street_lamps/straight_pole.svg new file mode 100644 index 0000000000..38c0300415 --- /dev/null +++ b/assets/layers/street_lamps/straight_pole.svg @@ -0,0 +1,159 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/street_lamps/street_lamp.svg b/assets/layers/street_lamps/street_lamp.svg new file mode 100644 index 0000000000..2942456b4e --- /dev/null +++ b/assets/layers/street_lamps/street_lamp.svg @@ -0,0 +1,6 @@ + + + + diff --git a/assets/layers/street_lamps/street_lamps.json b/assets/layers/street_lamps/street_lamps.json new file mode 100644 index 0000000000..a880d499b4 --- /dev/null +++ b/assets/layers/street_lamps/street_lamps.json @@ -0,0 +1,374 @@ +{ + "id": "street_lamps", + "name": { + "en": "Street Lamps", + "nl": "Straatlantaarns" + }, + "source": { + "osmTags": "highway=street_lamp" + }, + "minZoom": 16, + "title": { + "render": { + "en": "Street Lamp", + "nl": "Straatlantaarn" + }, + "mappings": [ + { + "if": "ref~*", + "then": { + "en": "Street Lamp {ref}", + "nl": "Straatlantaarn {ref}" + } + } + ] + }, + "mapRendering": [ + { + "location": [ + "point", + "centroid" + ], + "icon": "./assets/layers/street_lamps/street_lamp.svg", + "iconBadges": [ + { + "if": "light:colour~*", + "then": "circle:{light:colour}" + } + ], + "iconSize": "40,40,bottom" + } + ], + "presets": [ + { + "title": { + "en": "street lamp", + "nl": "straatlantaarn" + }, + "tags": [ + "highway=street_lamp" + ], + "preciseInput": true + } + ], + "tagRenderings": [ + { + "id": "ref", + "render": { + "en": "This street lamp has the reference number {ref}", + "nl": "Deze straatlantaarn heeft het nummer {ref}" + }, + "question": { + "en": "What is the reference number of this street lamp?", + "nl": "Wat is het nummer van deze straatlantaarn?" + }, + "freeform": { + "key": "ref" + } + }, + { + "id": "support", + "question": { + "en": "How is this street lamp mounted?", + "nl": "Hoe is deze straatlantaarn gemonteerd?" + }, + "mappings": [ + { + "if": "support=catenary", + "then": { + "en": "This lamp is suspended using cables", + "nl": "Deze lantaarn hangt aan kabels" + } + }, + { + "if": "support=ceiling", + "then": { + "en": "This lamp is mounted on a ceiling", + "nl": "Deze lantaarn hangt aan een plafond" + } + }, + { + "if": "support=ground", + "then": { + "en": "This lamp is mounted in the ground", + "nl": "Deze lantaarn zit in de grond" + } + }, + { + "if": "support=pedestal", + "then": { + "en": "This lamp is mounted on a short pole (mostly < 1.5m)", + "nl": "Deze lantaarn zit op een korte paal (meestal < 1.5m)" + } + }, + { + "if": "support=pole", + "then": { + "en": "This lamp is mounted on a pole", + "nl": "Deze lantaarn zit op een paal" + } + }, + { + "if": "support=wall", + "then": { + "en": "This lamp is mounted directly to the wall", + "nl": "Deze lantaarn hangt direct aan de muur" + } + }, + { + "if": "support=wall_mount", + "then": { + "en": "This lamp is mounted to the wall using a metal bar", + "nl": "Deze lantaarn hangt aan de muur met een metalen balk" + } + } + ] + }, + { + "id": "lamp_mount", + "question": { + "en": "How is this lamp mounted to the pole?", + "nl": "Hoe zit deze lantaarn aan de paal?" + }, + "condition": "support=pole", + "mappings": [ + { + "if": "lamp_mount=straight_mast", + "then": { + "en": "This lamp sits atop of a straight mast", + "nl": "Deze lantaarn zit boven op een rechte paal" + } + }, + { + "if": "lamp_mount=bent_mast", + "then": { + "en": "This lamp sits at the end of a bent mast", + "nl": "Deze lantaarn zit aan het eind van een gebogen paal" + } + } + ] + }, + { + "id": "method", + "question": { + "en": "What kind of lighting does this lamp use?", + "nl": "Wat voor verlichting gebruikt deze lantaarn?" + }, + "mappings": [ + { + "if": "light:method=electric", + "then": { + "en": "This lamp is lit electrically", + "nl": "Deze lantaarn is elektrisch verlicht" + }, + "hideInAnswer": true + }, + { + "if": "light:method=LED", + "then": { + "en": "This lamp uses LEDs", + "nl": "Deze lantaarn gebruikt LEDs" + } + }, + { + "if": "light:method=incandescent", + "then": { + "en": "This lamp uses incandescent lighting", + "nl": "Deze lantaarn gebruikt gloeilampen" + } + }, + { + "if": "light:method=halogen", + "then": { + "en": "This lamp uses halogen lighting", + "nl": "Deze lantaarn gebruikt halogeen verlichting" + } + }, + { + "if": "light:method=discharge", + "then": { + "en": "This lamp uses discharge lamps (unknown type)", + "nl": "Deze lantaarn gebruikt gasontladingslampen (onbekend type)" + } + }, + { + "if": "light:method=mercury", + "then": { + "en": "This lamp uses a mercury-vapour lamp (lightly blueish)", + "nl": "Deze lantaarn gebruikt een kwiklamp (enigszins blauwachtig)" + } + }, + { + "if": "light:method=metal-halide", + "then": { + "en": "This lamp uses metal-halide lamps (bright white)", + "nl": "Deze lantaarn gebruikt metaalhalidelampen" + } + }, + { + "if": "light:method=fluorescent", + "then": { + "en": "This lamp uses fluorescent lighting", + "nl": "Deze lantaarn gebruikt fluorescentieverlichting (TL en spaarlamp)" + } + }, + { + "if": "light:method=sodium", + "then": { + "en": "This lamp uses sodium lamps (unknown type)", + "nl": "Deze lantaarn gebruikt natriumlampen (onbekend type)" + } + }, + { + "if": "light:method=low_pressure_sodium", + "then": { + "en": "This lamp uses low pressure sodium lamps (monochrome orange)", + "nl": "Deze lantaarn gebruikt lagedruknatriumlampen (monochroom oranje)" + } + }, + { + "if": "light:method=high_pressure_sodium", + "then": { + "en": "This lamp uses high pressure sodium lamps (orange with white)", + "nl": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)" + } + }, + { + "if": "light:method=gas", + "then": { + "en": "This lamp is lit using gas", + "nl": "Deze lantaarn wordt verlicht met gas" + } + } + ] + }, + { + "id": "colour", + "question": { + "en": "What colour light does this lamp emit?", + "nl": "Wat voor kleur licht geeft deze lantaarn?" + }, + "render": { + "en": "This lamp emits {light:colour} light", + "nl": "Deze lantaarn geeft {light:colour} licht" + }, + "freeform": { + "key": "light:colour", + "type": "color" + }, + "mappings": [ + { + "if": "light:colour=white", + "then": { + "en": "This lamp emits white light", + "nl": "Deze lantaarn geeft wit licht" + } + }, + { + "if": "light:colour=green", + "then": { + "en": "This lamp emits green light", + "nl": "Deze lantaarn geeft groen licht" + } + }, + { + "if": "light:colour=orange", + "then": { + "en": "This lamp emits orange light", + "nl": "Deze lantaarn geeft oranje licht" + } + } + ] + }, + { + "id": "count", + "render": { + "en": "This lamp has {light:count} fixtures", + "nl": "Deze lantaarn heeft {light:count} lampen" + }, + "question": { + "en": "How many fixtures does this light have?", + "nl": "Hoeveel lampen heeft deze lantaarn?" + }, + "condition": "support=pole", + "freeform": { + "key": "light:count", + "type": "pnat" + }, + "mappings": [ + { + "if": "light:count=1", + "then": { + "en": "This lamp has 1 fixture", + "nl": "Deze lantaarn heeft 1 lamp" + } + }, + { + "if": "light:count=2", + "then": { + "en": "This lamp has 2 fixtures", + "nl": "Deze lantaarn heeft 2 lampen" + } + } + ] + }, + { + "id": "lit", + "question": { + "en": "When is this lamp lit?", + "nl": "Wanneer is deze lantaarn verlicht?" + }, + "mappings": [ + { + "if": "light:lit=dusk-dawn", + "then": { + "en": "This lamp is lit at night", + "nl": "Deze lantaarn is 's nachts verlicht" + } + }, + { + "if": "light:lit=24/7", + "then": { + "en": "This lamp is lit 24/7", + "nl": "Deze lantaarn is 24/7 verlicht" + } + }, + { + "if": "light:lit=motion", + "then": { + "en": "This lamp is lit based on motion", + "nl": "Deze lantaarn is verlicht op basis van beweging" + } + }, + { + "if": "light:lit=demand", + "then": { + "en": "This lamp is lit based on demand (e.g. with a pushbutton)", + "nl": "Deze lantaarn is verlicht op verzoek (bijv. met een drukknop)" + } + } + ] + }, + { + "id": "direction", + "render": { + "en": "This lamp points towards {light:direction}", + "nl": "Deze lantaarn is gericht naar {light:direction}" + }, + "question": { + "en": "Where does this lamp point to?", + "nl": "Waar is deze lamp heengericht?" + }, + "condition": "light:count=1", + "freeform": { + "key": "light:direction", + "type": "direction" + } + } + ], + "deletion": true, + "allowMove": { + "enableImproveAccuracy": true, + "enableRelocation": false + } +} \ No newline at end of file diff --git a/assets/layers/surveillance_camera/surveillance_camera.json b/assets/layers/surveillance_camera/surveillance_camera.json index 68808c0d97..637192b723 100644 --- a/assets/layers/surveillance_camera/surveillance_camera.json +++ b/assets/layers/surveillance_camera/surveillance_camera.json @@ -1,516 +1,525 @@ { - "id": "surveillance_camera", - "name": { - "en": "Surveillance camera's", - "nl": "Bewakingscamera's", - "ru": "Камеры наблюдения", - "fr": "Caméras de surveillance", - "it": "Videocamere di sorveglianza", - "de": "Überwachungskameras" - }, - "minzoom": 12, - "source": { - "osmTags": { + "id": "surveillance_camera", + "name": { + "en": "Surveillance camera's", + "nl": "Bewakingscamera's", + "ru": "Камеры наблюдения", + "fr": "Caméras de surveillance", + "it": "Videocamere di sorveglianza", + "de": "Überwachungskameras" + }, + "minzoom": 12, + "source": { + "osmTags": { + "and": [ + "man_made=surveillance", + { + "or": [ + "surveillance:type=camera", + "surveillance:type=ALPR", + "surveillance:type=ANPR" + ] + } + ] + } + }, + "title": { + "render": { + "en": "Surveillance Camera", + "nl": "Bewakingscamera", + "ru": "Камера наблюдения", + "fr": "Caméra de surveillance", + "it": "Videocamera di sorveglianza", + "de": "Überwachungskamera" + } + }, + "tagRenderings": [ + "images", + { + "question": { + "en": "What kind of camera is this?", + "nl": "Wat voor soort camera is dit?", + "fr": "Quel genre de caméra est-ce ?", + "it": "Di che tipo di videocamera si tratta?", + "ru": "Какая это камера?", + "de": "Um welche Kameratyp handelt se sich?" + }, + "mappings": [ + { + "if": { "and": [ - "man_made=surveillance", - { - "or": [ - "surveillance:type=camera", - "surveillance:type=ALPR", - "surveillance:type=ANPR" - ] - } + "camera:type=fixed" ] + }, + "then": { + "en": "A fixed (non-moving) camera", + "nl": "Een vaste camera", + "fr": "Une caméra fixe (non mobile)", + "it": "Una videocamera fissa (non semovente)", + "de": "Eine fest montierte (nicht bewegliche) Kamera" + } + }, + { + "if": { + "and": [ + "camera:type=dome" + ] + }, + "then": { + "en": "A dome camera (which can turn)", + "nl": "Een dome (bolvormige camera die kan draaien)", + "fr": "Une caméra dôme (qui peut tourner)", + "it": "Una videocamera a cupola (che può ruotare)", + "ru": "Камера с поворотным механизмом", + "de": "Eine Kuppelkamera (drehbar)" + } + }, + { + "if": { + "and": [ + "camera:type=panning" + ] + }, + "then": { + "en": "A panning camera", + "nl": "Een camera die (met een motor) van links naar rechts kan draaien", + "ru": "Панорамная камера", + "fr": "Une caméra panoramique", + "it": "Una videocamera panoramica", + "de": "Eine bewegliche Kamera" + } } + ], + "id": "Camera type: fixed; panning; dome" }, - "title": { - "render": { - "en": "Surveillance Camera", - "nl": "Bewakingscamera", - "ru": "Камера наблюдения", - "fr": "Caméra de surveillance", - "it": "Videocamera di sorveglianza", - "de": "Überwachungskamera" + { + "question": { + "en": "In which geographical direction does this camera film?", + "nl": "In welke geografische richting filmt deze camera?", + "fr": "Dans quelle direction géographique cette caméra filme-t-elle ?", + "it": "In quale direzione geografica punta questa videocamera?", + "de": "In welche Himmelsrichtung ist diese Kamera ausgerichtet?" + }, + "render": { + "en": "Films to a compass heading of {camera:direction}", + "nl": "Filmt in kompasrichting {camera:direction}", + "fr": "Filme dans une direction {camera:direction}", + "it": "Punta in direzione {camera:direction}" + }, + "condition": { + "or": [ + "camera:direction~*", + "direction~*", + "camera:type!=dome", + { + "and": [ + "camera:type=dome", + "camera:mount=wall" + ] + } + ] + }, + "freeform": { + "key": "camera:direction", + "type": "direction" + }, + "mappings": [ + { + "if": { + "and": [ + "camera:direction=", + "direction~*" + ] + }, + "then": { + "en": "Films to a compass heading of {direction}", + "nl": "Filmt in kompasrichting {direction}", + "fr": "Filme dans une direction {direction}", + "it": "Punta in direzione {direction}" + }, + "hideInAnswer": true } + ], + "id": "camera_direction" }, - "tagRenderings": [ - "images", + { + "freeform": { + "key": "operator" + }, + "question": { + "en": "Who operates this CCTV?", + "nl": "Wie beheert deze bewakingscamera?", + "fr": "Qui exploite ce système de vidéosurveillance ?", + "it": "Chi gestisce questa videocamera a circuito chiuso?", + "de": "Wer betreibt diese CCTV Kamera?" + }, + "render": { + "en": "Operated by {operator}", + "nl": "Beheer door {operator}", + "fr": "Exploité par {operator}", + "it": "È gestita da {operator}", + "de": "Betrieben von {operator}" + }, + "id": "Operator" + }, + { + "question": { + "en": "What kind of surveillance is this camera", + "nl": "Wat soort bewaking wordt hier uitgevoerd?", + "fr": "Quel genre de surveillance est cette caméra", + "it": "Che cosa sorveglia questa videocamera", + "de": "Um was für eine Überwachungskamera handelt es sich" + }, + "mappings": [ { - "question": { - "en": "What kind of camera is this?", - "nl": "Wat voor soort camera is dit?", - "fr": "Quel genre de caméra est-ce ?", - "it": "Di che tipo di videocamera si tratta?", - "ru": "Какая это камера?", - "de": "Um welche Kameratyp handelt se sich?" - }, - "mappings": [ - { - "if": { - "and": [ - "camera:type=fixed" - ] - }, - "then": { - "en": "A fixed (non-moving) camera", - "nl": "Een vaste camera", - "fr": "Une caméra fixe (non mobile)", - "it": "Una videocamera fissa (non semovente)", - "de": "Eine fest montierte (nicht bewegliche) Kamera" - } - }, - { - "if": { - "and": [ - "camera:type=dome" - ] - }, - "then": { - "en": "A dome camera (which can turn)", - "nl": "Een dome (bolvormige camera die kan draaien)", - "fr": "Une caméra dôme (qui peut tourner)", - "it": "Una videocamera a cupola (che può ruotare)", - "ru": "Камера с поворотным механизмом", - "de": "Eine Kuppelkamera (drehbar)" - } - }, - { - "if": { - "and": [ - "camera:type=panning" - ] - }, - "then": { - "en": "A panning camera", - "nl": "Een camera die (met een motor) van links naar rechts kan draaien", - "ru": "Панорамная камера", - "fr": "Une caméra panoramique", - "it": "Una videocamera panoramica", - "de": "Eine bewegliche Kamera" - } - } - ], - "id": "Camera type: fixed; panning; dome" + "if": { + "and": [ + "surveillance=public" + ] + }, + "then": { + "en": "A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or tunnel,...", + "nl": "Bewaking van de publieke ruilmte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel...", + "fr": "Une zone publique est surveillée, telle qu'une rue, un pont, une place, un parc, une gare, un couloir ou un tunnel public…", + "it": "Sorveglia un'area pubblica, come una strada, un ponte, una piazza, un parco, una stazione, un passaggio o un sottopasso pubblico, ...", + "de": "Überwacht wird ein öffentlicher Bereich, z. B. eine Straße, eine Brücke, ein Platz, ein Park, ein Bahnhof, ein öffentlicher Korridor oder Tunnel,..." + } }, { - "question": { - "en": "In which geographical direction does this camera film?", - "nl": "In welke geografische richting filmt deze camera?", - "fr": "Dans quelle direction géographique cette caméra filme-t-elle ?", - "it": "In quale direzione geografica punta questa videocamera?", - "de": "In welche Himmelsrichtung ist diese Kamera ausgerichtet?" - }, - "render": { - "en": "Films to a compass heading of {camera:direction}", - "nl": "Filmt in kompasrichting {camera:direction}", - "fr": "Filme dans une direction {camera:direction}", - "it": "Punta in direzione {camera:direction}" - }, - "condition": { - "or": [ - "camera:direction~*", - "direction~*", - "camera:type!=dome", - { - "and": [ - "camera:type=dome", - "camera:mount=wall" - ] - } - ] - }, - "freeform": { - "key": "camera:direction", - "type": "direction" - }, - "mappings": [ - { - "if": { - "and": [ - "camera:direction=", - "direction~*" - ] - }, - "then": { - "en": "Films to a compass heading of {direction}", - "nl": "Filmt in kompasrichting {direction}", - "fr": "Filme dans une direction {direction}", - "it": "Punta in direzione {direction}" - }, - "hideInAnswer": true - } - ], - "id": "direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view" + "if": { + "and": [ + "surveillance=outdoor" + ] + }, + "then": { + "en": "An outdoor, yet private area is surveilled (e.g. a parking lot, a fuel station, courtyard, entrance, private driveway, ...)", + "nl": "Een buitenruimte met privaat karakter (zoals een privé-oprit, een parking, tankstation, ...)", + "fr": "Une zone extérieure, mais privée, est surveillée (par exemple, un parking, une station-service, une cour, une entrée, une allée privée, etc.)", + "it": "Sorveglia un'area esterna di proprietà privata (un parcheggio, una stazione di servizio, un cortile, un ingresso, un vialetto privato, ...)", + "de": "Ein privater Außenbereich wird überwacht (z. B. ein Parkplatz, eine Tankstelle, ein Innenhof, ein Eingang, eine private Einfahrt, ...)" + } }, { - "freeform": { - "key": "operator" - }, - "question": { - "en": "Who operates this CCTV?", - "nl": "Wie beheert deze bewakingscamera?", - "fr": "Qui exploite ce système de vidéosurveillance ?", - "it": "Chi gestisce questa videocamera a circuito chiuso?", - "de": "Wer betreibt diese CCTV Kamera?" - }, - "render": { - "en": "Operated by {operator}", - "nl": "Beheer door {operator}", - "fr": "Exploité par {operator}", - "it": "È gestita da {operator}", - "de": "Betrieben von {operator}" - }, - "id": "Operator" - }, - { - "question": { - "en": "What kind of surveillance is this camera", - "nl": "Wat soort bewaking wordt hier uitgevoerd?", - "fr": "Quel genre de surveillance est cette caméra", - "it": "Che cosa sorveglia questa videocamera", - "de": "Um was für eine Überwachungskamera handelt es sich" - }, - "mappings": [ - { - "if": { - "and": [ - "surveillance=public" - ] - }, - "then": { - "en": "A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or tunnel,...", - "nl": "Bewaking van de publieke ruilmte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel...", - "fr": "Une zone publique est surveillée, telle qu'une rue, un pont, une place, un parc, une gare, un couloir ou un tunnel public…", - "it": "Sorveglia un'area pubblica, come una strada, un ponte, una piazza, un parco, una stazione, un passaggio o un sottopasso pubblico, ...", - "de": "Überwacht wird ein öffentlicher Bereich, z. B. eine Straße, eine Brücke, ein Platz, ein Park, ein Bahnhof, ein öffentlicher Korridor oder Tunnel,..." - } - }, - { - "if": { - "and": [ - "surveillance=outdoor" - ] - }, - "then": { - "en": "An outdoor, yet private area is surveilled (e.g. a parking lot, a fuel station, courtyard, entrance, private driveway, ...)", - "nl": "Een buitenruimte met privaat karakter (zoals een privé-oprit, een parking, tankstation, ...)", - "fr": "Une zone extérieure, mais privée, est surveillée (par exemple, un parking, une station-service, une cour, une entrée, une allée privée, etc.)", - "it": "Sorveglia un'area esterna di proprietà privata (un parcheggio, una stazione di servizio, un cortile, un ingresso, un vialetto privato, ...)", - "de": "Ein privater Außenbereich wird überwacht (z. B. ein Parkplatz, eine Tankstelle, ein Innenhof, ein Eingang, eine private Einfahrt, ...)" - } - }, - { - "if": { - "and": [ - "surveillance=indoor" - ] - }, - "then": { - "nl": "Een private binnenruimte wordt bewaakt, bv. een winkel, een parkeergarage, ...", - "en": "A private indoor area is surveilled, e.g. a shop, a private underground parking, ...", - "fr": "Une zone intérieure privée est surveillée, par exemple un magasin, un parking souterrain privé…", - "it": "Sorveglia un ambiente interno di proprietà privata, per esempio un negozio, un parcheggio sotterraneo privato, ...", - "de": "Ein privater Innenbereich wird überwacht, z. B. ein Geschäft, eine private Tiefgarage, ..." - } - } - ], - "id": "Surveillance type: public, outdoor, indoor" - }, - { - "question": { - "en": "Is the public space surveilled by this camera an indoor or outdoor space?", - "nl": "Bevindt de bewaakte publieke ruimte camera zich binnen of buiten?", - "fr": "L'espace public surveillé par cette caméra est-il un espace intérieur ou extérieur ?", - "it": "Lo spazio pubblico sorvegliato da questa videocamera è all'aperto o al chiuso?", - "de": "Handelt es sich bei dem von dieser Kamera überwachten öffentlichen Raum um einen Innen- oder Außenbereich?" - }, - "condition": { - "and": [ - "surveillance:type=public" - ] - }, - "mappings": [ - { - "if": "indoor=yes", - "then": { - "en": "This camera is located indoors", - "nl": "Deze camera bevindt zich binnen", - "fr": "Cette caméra est située à l'intérieur", - "it": "Questa videocamera si trova al chiuso", - "de": "Diese Kamera befindet sich im Innenraum" - } - }, - { - "if": "indoor=no", - "then": { - "en": "This camera is located outdoors", - "nl": "Deze camera bevindt zich buiten", - "fr": "Cette caméra est située à l'extérieur", - "it": "Questa videocamera si trova all'aperto", - "ru": "Эта камера расположена снаружи", - "de": "Diese Kamera befindet sich im Freien" - } - }, - { - "if": "indoor=", - "then": { - "en": "This camera is probably located outdoors", - "nl": "Deze camera bevindt zich waarschijnlijk buiten", - "fr": "Cette caméra est probablement située à l'extérieur", - "it": "Questa videocamera si trova probabilmente all'esterno", - "ru": "Возможно, эта камера расположена снаружи", - "de": "Diese Kamera ist möglicherweise im Freien" - }, - "hideInAnswer": true - } - ], - "id": "Indoor camera? This isn't clear for 'public'-cameras" - }, - { - "question": { - "en": "On which level is this camera located?", - "nl": "Op welke verdieping bevindt deze camera zich?", - "fr": "À quel niveau se trouve cette caméra ?", - "it": "A che piano si trova questa videocamera?", - "de": "Auf welcher Ebene befindet sich diese Kamera?" - }, - "render": { - "en": "Located on level {level}", - "nl": "Bevindt zich op verdieping {level}", - "fr": "Situé au niveau {level}", - "it": "Si trova al piano {level}", - "de": "Befindet sich auf Ebene {level}" - }, - "freeform": { - "key": "level", - "type": "nat" - }, - "condition": { - "or": [ - "indoor=yes", - "surveillance:type=ye" - ] - }, - "id": "Level" - }, - { - "question": { - "en": "What exactly is surveilled here?", - "nl": "Wat wordt hier precies bewaakt?", - "fr": "Qu'est-ce qui est surveillé ici ?", - "it": "Che cosa è sorvegliato qui?", - "de": "Was genau wird hier überwacht?" - }, - "freeform": { - "key": "surveillance:zone" - }, - "render": { - "en": " Surveills a {surveillance:zone}", - "nl": "Bewaakt een {surveillance:zone}", - "fr": " Surveille un(e) {surveillance:zone}", - "it": " Sorveglia una {surveillance:zone}", - "de": " Überwacht ein/e {surveillance:zone}" - }, - "mappings": [ - { - "if": { - "and": [ - "surveillance:zone=parking" - ] - }, - "then": { - "en": "Surveills a parking", - "nl": "Bewaakt een parking", - "fr": "Surveille un parking", - "it": "Sorveglia un parcheggio", - "de": "Überwacht einen Parkplatz" - } - }, - { - "if": { - "and": [ - "surveillance:zone=traffic" - ] - }, - "then": { - "en": "Surveills the traffic", - "nl": "Bewaakt het verkeer", - "fr": "Surveille la circulation", - "it": "Sorveglia il traffico", - "de": "Überwacht den Verkehr" - } - }, - { - "if": { - "and": [ - "surveillance:zone=entrance" - ] - }, - "then": { - "en": "Surveills an entrance", - "nl": "Bewaakt een ingang", - "fr": "Surveille une entrée", - "it": "Sorveglia un ingresso", - "de": "Überwacht einen Eingang" - } - }, - { - "if": { - "and": [ - "surveillance:zone=corridor" - ] - }, - "then": { - "en": "Surveills a corridor", - "nl": "Bewaakt een gang", - "fr": "Surveille un couloir", - "it": "Sorveglia un corridoio", - "de": "Überwacht einen Gang" - } - }, - { - "if": { - "and": [ - "surveillance:zone=public_transport_platform" - ] - }, - "then": { - "en": "Surveills a public tranport platform", - "nl": "Bewaakt een perron of bushalte", - "fr": "Surveille un quai de transport public", - "it": "Sorveglia una pensilina del trasporto pubblico", - "de": "Überwacht eine Haltestelle" - } - }, - { - "if": { - "and": [ - "surveillance:zone=shop" - ] - }, - "then": { - "en": "Surveills a shop", - "nl": "Bewaakt een winkel", - "fr": "Surveille un magasin", - "it": "Sorveglia un negozio", - "de": "Überwacht ein Geschäft" - } - } - ], - "id": "Surveillance:zone" - }, - { - "question": { - "en": "How is this camera placed?", - "nl": "Hoe is deze camera geplaatst?", - "fr": "Comment cette caméra est-elle placée ?", - "it": "Com'è posizionata questa telecamera?", - "ru": "Как расположена эта камера?", - "de": "Wie ist diese Kamera montiert?" - }, - "render": { - "en": "Mounting method: {mount}", - "nl": "Montage: {camera:mount}", - "fr": "Méthode de montage : {mount}", - "it": "Metodo di montaggio: {mount}", - "de": "Montageart: {mount}" - }, - "freeform": { - "key": "camera:mount" - }, - "mappings": [ - { - "if": "camera:mount=wall", - "then": { - "en": "This camera is placed against a wall", - "nl": "Deze camera hangt aan een muur", - "fr": "Cette caméra est placée contre un mur", - "it": "Questa telecamera è posizionata contro un muro", - "de": "Diese Kamera ist an einer Wand montiert" - } - }, - { - "if": "camera:mount=pole", - "then": { - "en": "This camera is placed one a pole", - "nl": "Deze camera staat op een paal", - "fr": "Cette caméra est placée sur un poteau", - "it": "Questa telecamera è posizionata su un palo", - "de": "Diese Kamera ist an einer Stange montiert" - } - }, - { - "if": "camera:mount=ceiling", - "then": { - "en": "This camera is placed on the ceiling", - "nl": "Deze camera hangt aan het plafond", - "fr": "Cette caméra est placée au plafond", - "it": "Questa telecamera è posizionata sul soffitto", - "de": "Diese Kamera ist an der Decke montiert" - } - } - ], - "id": "camera:mount" + "if": { + "and": [ + "surveillance=indoor" + ] + }, + "then": { + "nl": "Een private binnenruimte wordt bewaakt, bv. een winkel, een parkeergarage, ...", + "en": "A private indoor area is surveilled, e.g. a shop, a private underground parking, ...", + "fr": "Une zone intérieure privée est surveillée, par exemple un magasin, un parking souterrain privé…", + "it": "Sorveglia un ambiente interno di proprietà privata, per esempio un negozio, un parcheggio sotterraneo privato, ...", + "de": "Ein privater Innenbereich wird überwacht, z. B. ein Geschäft, eine private Tiefgarage, ..." + } } - ], - "icon": { + ], + "id": "Surveillance type: public, outdoor, indoor" + }, + { + "question": { + "en": "Is the public space surveilled by this camera an indoor or outdoor space?", + "nl": "Bevindt de bewaakte publieke ruimte camera zich binnen of buiten?", + "fr": "L'espace public surveillé par cette caméra est-il un espace intérieur ou extérieur ?", + "it": "Lo spazio pubblico sorvegliato da questa videocamera è all'aperto o al chiuso?", + "de": "Handelt es sich bei dem von dieser Kamera überwachten öffentlichen Raum um einen Innen- oder Außenbereich?" + }, + "condition": { + "and": [ + "surveillance:type=public" + ] + }, + "mappings": [ + { + "if": "indoor=yes", + "then": { + "en": "This camera is located indoors", + "nl": "Deze camera bevindt zich binnen", + "fr": "Cette caméra est située à l'intérieur", + "it": "Questa videocamera si trova al chiuso", + "de": "Diese Kamera befindet sich im Innenraum" + } + }, + { + "if": "indoor=no", + "then": { + "en": "This camera is located outdoors", + "nl": "Deze camera bevindt zich buiten", + "fr": "Cette caméra est située à l'extérieur", + "it": "Questa videocamera si trova all'aperto", + "ru": "Эта камера расположена снаружи", + "de": "Diese Kamera befindet sich im Freien" + } + }, + { + "if": "indoor=", + "then": { + "en": "This camera is probably located outdoors", + "nl": "Deze camera bevindt zich waarschijnlijk buiten", + "fr": "Cette caméra est probablement située à l'extérieur", + "it": "Questa videocamera si trova probabilmente all'esterno", + "ru": "Возможно, эта камера расположена снаружи", + "de": "Diese Kamera ist möglicherweise im Freien" + }, + "hideInAnswer": true + } + ], + "id": "is_indoor" + }, + { + "question": { + "en": "On which level is this camera located?", + "nl": "Op welke verdieping bevindt deze camera zich?", + "fr": "À quel niveau se trouve cette caméra ?", + "it": "A che piano si trova questa videocamera?", + "de": "Auf welcher Ebene befindet sich diese Kamera?" + }, + "render": { + "en": "Located on level {level}", + "nl": "Bevindt zich op verdieping {level}", + "fr": "Situé au niveau {level}", + "it": "Si trova al piano {level}", + "de": "Befindet sich auf Ebene {level}" + }, + "freeform": { + "key": "level", + "type": "nat" + }, + "condition": { + "or": [ + "indoor=yes", + "surveillance:type=ye" + ] + }, + "id": "Level" + }, + { + "question": { + "en": "What exactly is surveilled here?", + "nl": "Wat wordt hier precies bewaakt?", + "fr": "Qu'est-ce qui est surveillé ici ?", + "it": "Che cosa è sorvegliato qui?", + "de": "Was genau wird hier überwacht?" + }, + "freeform": { + "key": "surveillance:zone" + }, + "render": { + "en": " Surveills a {surveillance:zone}", + "nl": "Bewaakt een {surveillance:zone}", + "fr": " Surveille un(e) {surveillance:zone}", + "it": " Sorveglia una {surveillance:zone}", + "de": " Überwacht ein/e {surveillance:zone}" + }, + "mappings": [ + { + "if": { + "and": [ + "surveillance:zone=parking" + ] + }, + "then": { + "en": "Surveills a parking", + "nl": "Bewaakt een parking", + "fr": "Surveille un parking", + "it": "Sorveglia un parcheggio", + "de": "Überwacht einen Parkplatz" + } + }, + { + "if": { + "and": [ + "surveillance:zone=traffic" + ] + }, + "then": { + "en": "Surveills the traffic", + "nl": "Bewaakt het verkeer", + "fr": "Surveille la circulation", + "it": "Sorveglia il traffico", + "de": "Überwacht den Verkehr" + } + }, + { + "if": { + "and": [ + "surveillance:zone=entrance" + ] + }, + "then": { + "en": "Surveills an entrance", + "nl": "Bewaakt een ingang", + "fr": "Surveille une entrée", + "it": "Sorveglia un ingresso", + "de": "Überwacht einen Eingang" + } + }, + { + "if": { + "and": [ + "surveillance:zone=corridor" + ] + }, + "then": { + "en": "Surveills a corridor", + "nl": "Bewaakt een gang", + "fr": "Surveille un couloir", + "it": "Sorveglia un corridoio", + "de": "Überwacht einen Gang" + } + }, + { + "if": { + "and": [ + "surveillance:zone=public_transport_platform" + ] + }, + "then": { + "en": "Surveills a public tranport platform", + "nl": "Bewaakt een perron of bushalte", + "fr": "Surveille un quai de transport public", + "it": "Sorveglia una pensilina del trasporto pubblico", + "de": "Überwacht eine Haltestelle" + } + }, + { + "if": { + "and": [ + "surveillance:zone=shop" + ] + }, + "then": { + "en": "Surveills a shop", + "nl": "Bewaakt een winkel", + "fr": "Surveille un magasin", + "it": "Sorveglia un negozio", + "de": "Überwacht ein Geschäft" + } + } + ], + "id": "Surveillance:zone" + }, + { + "question": { + "en": "How is this camera placed?", + "nl": "Hoe is deze camera geplaatst?", + "fr": "Comment cette caméra est-elle placée ?", + "it": "Com'è posizionata questa telecamera?", + "ru": "Как расположена эта камера?", + "de": "Wie ist diese Kamera montiert?" + }, + "render": { + "en": "Mounting method: {camera:mount}", + "nl": "Montage: {camera:mount}", + "fr": "Méthode de montage : {camera:mount}", + "it": "Metodo di montaggio: {camera:mount}", + "de": "Montageart: {camera:mount}" + }, + "freeform": { + "key": "camera:mount" + }, + "mappings": [ + { + "if": "camera:mount=wall", + "then": { + "en": "This camera is placed against a wall", + "nl": "Deze camera hangt aan een muur", + "fr": "Cette caméra est placée contre un mur", + "it": "Questa telecamera è posizionata contro un muro", + "de": "Diese Kamera ist an einer Wand montiert" + } + }, + { + "if": "camera:mount=pole", + "then": { + "en": "This camera is placed one a pole", + "nl": "Deze camera staat op een paal", + "fr": "Cette caméra est placée sur un poteau", + "it": "Questa telecamera è posizionata su un palo", + "de": "Diese Kamera ist an einer Stange montiert" + } + }, + { + "if": "camera:mount=ceiling", + "then": { + "en": "This camera is placed on the ceiling", + "nl": "Deze camera hangt aan het plafond", + "fr": "Cette caméra est placée au plafond", + "it": "Questa telecamera è posizionata sul soffitto", + "de": "Diese Kamera ist an der Decke montiert" + } + } + ], + "id": "camera:mount" + } + ], + "presets": [ + { + "tags": [ + "man_made=surveillance", + "surveillance:type=camera" + ], + "title": "Surveillance camera" + } + ], + "mapRendering": [ + { + "icon": { "render": "./assets/themes/surveillance/logo.svg", "mappings": [ - { - "if": "camera:type=dome", - "then": "./assets/themes/surveillance/dome.svg" - }, - { - "if": "_direction:leftright=right", - "then": "./assets/themes/surveillance/cam_right.svg" - }, - { - "if": "_direction:leftright=left", - "then": "./assets/themes/surveillance/cam_left.svg" - } + { + "if": "camera:type=dome", + "then": "./assets/themes/surveillance/dome.svg" + }, + { + "if": "_direction:leftright=right", + "then": "./assets/themes/surveillance/cam_right.svg" + }, + { + "if": "_direction:leftright=left", + "then": "./assets/themes/surveillance/cam_left.svg" + } ] - }, - "rotation": { + }, + "iconSize": { + "mappings": [ + { + "if": "camera:type=dome", + "then": "50,50,center" + }, + { + "if": "_direction:leftright~*", + "then": "100,35,center" + } + ], + "render": "50,50,center" + }, + "location": [ + "point", + "centroid" + ], + "rotation": { "#": "Note: {camera:direction} is substituted by a number, giving the string 'calc(123deg + 90deg)' ; it is this string that is used as css property, which interprets the calc", "render": "calc({_direction:numerical}deg + 90deg)", "mappings": [ - { - "if": "camera:type=dome", - "then": "0" - }, - { - "if": "_direction:leftright=right", - "then": "calc({_direction:numerical}deg - 90deg)" - } + { + "if": "camera:type=dome", + "then": "0" + }, + { + "if": "_direction:leftright=right", + "then": "calc({_direction:numerical}deg - 90deg)" + } ] + } }, - "width": { - "render": "8" - }, - "iconSize": { - "mappings": [ - { - "if": "camera:type=dome", - "then": "50,50,center" - }, - { - "if": "_direction:leftright~*", - "then": "100,35,center" - } - ], - "render": "50,50,center" - }, - "color": { + { + "color": { "render": "#f00" - }, - "presets": [ - { - "tags": [ - "man_made=surveillance", - "surveillance:type=camera" - ], - "title": "Surveillance camera" - } - ], - "wayHandling": 2 + }, + "width": { + "render": "8" + } + } + ] } \ No newline at end of file diff --git a/assets/layers/toilet/toilet.json b/assets/layers/toilet/toilet.json index e3da8e4182..6031051680 100644 --- a/assets/layers/toilet/toilet.json +++ b/assets/layers/toilet/toilet.json @@ -1,523 +1,583 @@ { - "id": "toilet", - "name": { - "en": "Toilets", - "de": "Toiletten", - "fr": "Toilettes", - "nl": "Toiletten", - "ru": "Туалеты", - "it": "Servizi igienici" + "id": "toilet", + "name": { + "en": "Toilets", + "de": "Toiletten", + "fr": "Toilettes", + "nl": "Toiletten", + "ru": "Туалеты", + "it": "Servizi igienici" + }, + "minzoom": 12, + "source": { + "osmTags": "amenity=toilets" + }, + "title": { + "render": { + "en": "Toilet", + "de": "Toilette", + "fr": "Toilettes", + "nl": "Toilet", + "ru": "Туалет", + "it": "Servizi igienici" + } + }, + "presets": [ + { + "title": { + "en": "toilet", + "de": "toilette", + "fr": "toilettes", + "nl": "toilet", + "ru": "tуалет", + "it": "servizi igienici" + }, + "tags": [ + "amenity=toilets" + ], + "description": { + "en": "A publicly accessible toilet or restroom", + "de": "Eine öffentlich zugängliche Toilette", + "fr": "Des toilettes", + "nl": "Een publieke toilet", + "it": "Servizi igienici aperti al pubblico", + "ru": "Туалет или комната отдыха со свободным доступом" + } }, - "minzoom": 12, - "source": { - "osmTags": "amenity=toilets" - }, - "title": { - "render": { - "en": "Toilet", - "de": "Toilette", - "fr": "Toilettes", - "nl": "Toilet", - "ru": "Туалет", - "it": "Servizi igienici" + { + "title": { + "en": "toilets with wheelchair accessible toilet", + "de": "toiletten mit rollstuhlgerechter Toilette", + "fr": "toilettes accessible aux personnes à mobilité réduite", + "nl": "een rolstoeltoegankelijke toilet", + "it": "servizi igienici accessibili per persone in sedia a rotelle", + "ru": "tуалет с доступом для пользователей кресел-колясок" + }, + "tags": [ + "amenity=toilets", + "wheelchair=yes" + ], + "description": { + "en": "A restroom which has at least one wheelchair-accessible toilet", + "de": "Eine Toilettenanlage mit mindestens einer rollstuhlgerechten Toilette", + "fr": "Toilettes avec au moins un WC accessible aux personnes à mobilité réduite", + "nl": "Deze toiletten hebben op zijn minst één rolstoeltoegankelijke WC", + "it": "Servizi igienici che hanno almeno una toilette accessibile a persone in sedia a rotelle" + } + } + ], + "tagRenderings": [ + "images", + { + "question": { + "en": "Are these toilets publicly accessible?", + "de": "Sind diese Toiletten öffentlich zugänglich?", + "fr": "Ces toilettes sont-elles accessibles au public ?", + "nl": "Zijn deze toiletten publiek toegankelijk?", + "it": "Questi servizi igienici sono aperti al pubblico?", + "ru": "Есть ли свободный доступ к этим туалетам?" + }, + "render": { + "en": "Access is {access}", + "de": "Zugang ist {access}", + "fr": "L'accès est {access}", + "nl": "Toegankelijkheid is {access}", + "it": "L'accesso è {access}" + }, + "freeform": { + "key": "access", + "addExtraTags": [ + "fixme=the tag access was filled out by the user and might need refinement" + ] + }, + "mappings": [ + { + "if": "access=yes", + "then": { + "en": "Public access", + "de": "Öffentlicher Zugang", + "fr": "Accès publique", + "nl": "Publiek toegankelijk", + "it": "Accesso pubblico", + "ru": "Свободный доступ" + } + }, + { + "if": "access=customers", + "then": { + "en": "Only access to customers", + "de": "Nur Zugang für Kunden", + "fr": "Accès réservé aux clients", + "nl": "Enkel toegang voor klanten", + "it": "Accesso riservato ai clienti e alle clienti" + } + }, + { + "if": "access=no", + "then": { + "en": "Not accessible", + "de": "Nicht zugänglich", + "fr": "Toilettes privées", + "nl": "Niet toegankelijk", + "ru": "Недоступно", + "it": "Non accessibile" + } + }, + { + "if": "access=key", + "then": { + "en": "Accessible, but one has to ask a key to enter", + "de": "Zugänglich, aber man muss einen Schlüssel für die Eingabe verlangen", + "fr": "Accessible, mais vous devez demander la clé", + "nl": "Toegankelijk na het vragen van de sleutel", + "it": "Accessibile, ma occorre chiedere una chiave per accedere" + } + }, + { + "if": "access=public", + "then": { + "en": "Public access", + "de": "Öffentlicher Zugang", + "fr": "Accès publique", + "nl": "Publiek toegankelijk", + "it": "Accesso pubblico", + "ru": "Свободный доступ" + }, + "hideInAnswer": true } + ], + "id": "toilet-access" }, - "icon": { + { + "id": "toilets-fee", + "question": { + "en": "Are these toilets free to use?", + "de": "Können diese Toiletten kostenlos benutzt werden?", + "fr": "Ces toilettes sont-elles payantes ?", + "nl": "Zijn deze toiletten gratis te gebruiken?", + "it": "Questi servizi igienici sono gratuiti?" + }, + "mappings": [ + { + "then": { + "en": "These are paid toilets", + "de": "Dies sind bezahlte Toiletten", + "fr": "Toilettes payantes", + "nl": "Men moet betalen om deze toiletten te gebruiken", + "ru": "Это платные туалеты", + "it": "Questi servizi igienici sono a pagamento" + }, + "if": "fee=yes" + }, + { + "if": "fee=no", + "then": { + "en": "Free to use", + "de": "Kostenlose Nutzung", + "fr": "Toilettes gratuites", + "nl": "Gratis te gebruiken", + "it": "Gratis" + } + } + ] + }, + { + "question": { + "en": "How much does one have to pay for these toilets?", + "de": "Wie viel muss man für diese Toiletten bezahlen?", + "fr": "Quel est le prix d'accès de ces toilettes ?", + "nl": "Hoeveel moet men betalen om deze toiletten te gebruiken?", + "it": "Quanto costa l'accesso a questi servizi igienici?", + "ru": "Сколько стоит посещение туалета?" + }, + "render": { + "en": "The fee is {charge}", + "de": "Die Gebühr beträgt {charge}", + "fr": "Le prix est {charge}", + "nl": "De toiletten gebruiken kost {charge}", + "it": "La tariffa è {charge}", + "ru": "Стоимость {charge}" + }, + "condition": "fee=yes", + "freeform": { + "key": "charge", + "type": "string" + }, + "id": "toilet-charge" + }, + { + "builtin": "payment-options", + "override": { + "condition": "fee=yes" + } + }, + { + "id": "Opening-hours", + "question": { + "en": "When are these toilets opened?", + "nl": "Wanneer zijn deze toiletten open?" + }, + "render": "{opening_hours_table()}", + "freeform": { + "key": "opening_hours", + "type": "opening_hours" + }, + "mappings": [ + { + "if": "opening_hours=24/7", + "then": { + "en": "Opened 24/7", + "nl": "Altijd open" + } + } + ] + }, + { + "id": "toilets-wheelchair", + "question": { + "en": "Is there a dedicated toilet for wheelchair users", + "de": "Gibt es eine Toilette für Rollstuhlfahrer?", + "fr": "Y a-t-il des toilettes réservées aux personnes en fauteuil roulant ?", + "nl": "Is er een rolstoeltoegankelijke toilet voorzien?", + "it": "C'è un WC riservato alle persone in sedia a rotelle" + }, + "mappings": [ + { + "then": { + "en": "There is a dedicated toilet for wheelchair users", + "de": "Es gibt eine Toilette für Rollstuhlfahrer", + "fr": "Il y a des toilettes réservées pour les personnes à mobilité réduite", + "nl": "Er is een toilet voor rolstoelgebruikers", + "it": "C'è un WC riservato alle persone in sedia a rotelle" + }, + "if": "wheelchair=yes" + }, + { + "if": "wheelchair=no", + "then": { + "en": "No wheelchair access", + "de": "Kein Zugang für Rollstuhlfahrer", + "fr": "Non accessible aux personnes à mobilité réduite", + "nl": "Niet toegankelijk voor rolstoelgebruikers", + "it": "Non accessibile in sedia a rotelle", + "ru": "Недоступно пользователям кресел-колясок" + } + } + ] + }, + { + "id": "toilets-type", + "question": { + "en": "Which kind of toilets are this?", + "de": "Welche Art von Toiletten sind das?", + "fr": "De quel type sont ces toilettes ?", + "nl": "Welke toiletten zijn dit?", + "it": "Di che tipo di servizi igienici si tratta?", + "ru": "Какие это туалеты?" + }, + "mappings": [ + { + "if": "toilets:position=seated", + "then": { + "en": "There are only seated toilets", + "de": "Es gibt nur Sitztoiletten", + "fr": "Il y a uniquement des sièges de toilettes", + "nl": "Er zijn enkel WC's om op te zitten", + "it": "Ci sono solo WC con sedile" + } + }, + { + "if": "toilets:position=urinal", + "then": { + "en": "There are only urinals here", + "de": "Hier gibt es nur Pissoirs", + "fr": "Il y a uniquement des urinoirs", + "nl": "Er zijn enkel urinoirs", + "it": "Ci sono solo urinali" + } + }, + { + "if": "toilets:position=squat", + "then": { + "en": "There are only squat toilets here", + "de": "Es gibt hier nur Hocktoiletten", + "fr": "Il y a uniquement des toilettes turques", + "nl": "Er zijn enkel hurktoiletten", + "it": "Ci sono solo turche" + } + }, + { + "if": "toilets:position=seated;urinal", + "then": { + "en": "Both seated toilets and urinals are available here", + "de": "Sowohl Sitztoiletten als auch Pissoirs sind hier verfügbar", + "fr": "Il y a des sièges de toilettes et des urinoirs", + "nl": "Er zijn zowel urinoirs als zittoiletten", + "it": "Ci sono sia sedili, sia urinali" + } + } + ] + }, + { + "id": "toilets-changing-table", + "question": { + "en": "Is a changing table (to change diapers) available?", + "de": "Ist ein Wickeltisch (zum Wechseln der Windeln) vorhanden?", + "fr": "Ces toilettes disposent-elles d'une table à langer ?", + "nl": "Is er een luiertafel beschikbaar?", + "it": "È disponibile un fasciatoio (per cambiare i pannolini)?" + }, + "mappings": [ + { + "then": { + "en": "A changing table is available", + "de": "Ein Wickeltisch ist verfügbar", + "fr": "Une table à langer est disponible", + "nl": "Er is een luiertafel", + "it": "È disponibile un fasciatoio" + }, + "if": "changing_table=yes" + }, + { + "if": "changing_table=no", + "then": { + "en": "No changing table is available", + "de": "Es ist kein Wickeltisch verfügbar", + "fr": "Aucune table à langer", + "nl": "Geen luiertafel", + "it": "Non è disponibile un fasciatoio" + } + } + ] + }, + { + "question": { + "en": "Where is the changing table located?", + "de": "Wo befindet sich der Wickeltisch?", + "fr": "Où se situe la table à langer ?", + "nl": "Waar bevindt de luiertafel zich?", + "it": "Dove si trova il fasciatoio?" + }, + "render": { + "en": "The changing table is located at {changing_table:location}", + "de": "Die Wickeltabelle befindet sich in {changing_table:location}", + "fr": "Emplacement de la table à langer : {changing_table:location}", + "nl": "De luiertafel bevindt zich in {changing_table:location}", + "it": "Il fasciatoio si trova presso {changing_table:location}" + }, + "condition": "changing_table=yes", + "freeform": { + "key": "changing_table:location" + }, + "mappings": [ + { + "then": { + "en": "The changing table is in the toilet for women. ", + "de": "Der Wickeltisch befindet sich in der Damentoilette. ", + "fr": "La table à langer est dans les toilettes pour femmes. ", + "nl": "De luiertafel bevindt zich in de vrouwentoiletten ", + "it": "Il fasciatoio è nei servizi igienici femminili. " + }, + "if": "changing_table:location=female_toilet" + }, + { + "then": { + "en": "The changing table is in the toilet for men. ", + "de": "Der Wickeltisch befindet sich in der Herrentoilette. ", + "fr": "La table à langer est dans les toilettes pour hommes. ", + "nl": "De luiertafel bevindt zich in de herentoiletten ", + "it": "Il fasciatoio è nei servizi igienici maschili. " + }, + "if": "changing_table:location=male_toilet" + }, + { + "if": "changing_table:location=wheelchair_toilet", + "then": { + "en": "The changing table is in the toilet for wheelchair users. ", + "de": "Der Wickeltisch befindet sich in der Toilette für Rollstuhlfahrer. ", + "fr": "La table à langer est dans les toilettes pour personnes à mobilité réduite. ", + "nl": "De luiertafel bevindt zich in de rolstoeltoegankelijke toilet ", + "it": "Il fasciatoio è nei servizi igienici per persone in sedia a rotelle. " + } + }, + { + "if": "changing_table:location=dedicated_room", + "then": { + "en": "The changing table is in a dedicated room. ", + "de": "Der Wickeltisch befindet sich in einem eigenen Raum. ", + "fr": "La table à langer est dans un espace dédié. ", + "nl": "De luiertafel bevindt zich in een daartoe voorziene kamer ", + "it": "Il fasciatoio è in una stanza dedicata. " + } + } + ], + "id": "toilet-changing_table:location" + }, + { + "id": "toilet-handwashing", + "question": { + "en": "Do these toilets have a sink to wash your hands?", + "nl": "Hebben deze toiletten een lavabo om de handen te wassen?", + "de": "Verfügt diese Toilette über ein Waschbecken?" + }, + "mappings": [ + { + "if": "toilets:handwashing=yes", + "then": { + "en": "This toilets have a sink to wash your hands", + "nl": "Deze toiletten hebben een lavabo waar men de handen kan wassen", + "de": "Diese Toilette verfügt über ein Waschbecken" + } + }, + { + "if": "toilets:handwashing=no", + "then": { + "en": "This toilets don't have a sink to wash your hands", + "nl": "Deze toiletten hebben geen lavabo waar men de handen kan wassen", + "de": "Diese Toilette verfügt über kein Waschbecken" + } + } + ] + }, + { + "id": "toilet-has-paper", + "question": { + "en": "Does one have to bring their own toilet paper to this toilet?", + "nl": "Moet je je eigen toiletpapier meenemen naar deze toilet?", + "de": "Muss man für diese Toilette sein eigenes Toilettenpapier mitbringen?" + }, + "mappings": [ + { + "if": "toilets:paper_supplied=yes", + "then": { + "en": "This toilet is equipped with toilet paper", + "nl": "Deze toilet is voorzien van toiletpapier" + } + }, + { + "if": "toilets:paper_supplied=no", + "then": { + "en": "You have to bring your own toilet paper to this toilet", + "nl": "Je moet je eigen toiletpapier meebrengen naar deze toilet", + "de": "Für diese Toilette müssen Sie Ihr eigenes Toilettenpapier mitbringen" + } + } + ], + "condition": { + "#": "Urinals normally don't have toilet paper", + "and": [ + "toilets:position!=urinal" + ] + } + } + ], + "filter": [ + { + "id": "wheelchair", + "options": [ + { + "question": { + "en": "Wheelchair accessible", + "nl": "Rolstoel toegankelijk", + "de": "Rollstuhlgerecht" + }, + "osmTags": "wheelchair=yes" + } + ] + }, + { + "id": "changing_table", + "options": [ + { + "question": { + "en": "Has a changing table", + "nl": "Heeft een luiertafel", + "de": "Hat einen Wickeltisch" + }, + "osmTags": "changing_table=yes" + } + ] + }, + { + "id": "free", + "options": [ + { + "question": { + "en": "Free to use", + "nl": "Gratis toegankelijk", + "de": "Nutzung kostenlos" + }, + "osmTags": { + "or": [ + "fee=no", + "fee=0", + "charge=0" + ] + } + } + ] + }, + { + "id": "is_open", + "options": [ + { + "question": { + "nl": "Nu geopened", + "en": "Opened now" + }, + "osmTags": { + "or": [ + "opening_hours=", + "_isOpen=yes" + ] + } + } + ] + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity:={amenity}", + "amenity=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { "render": "./assets/layers/toilet/toilets.svg", "mappings": [ - { - "if": "wheelchair=yes", - "then": "circle:white;./assets/layers/toilet/wheelchair.svg" + { + "if": "wheelchair=yes", + "then": "circle:white;./assets/layers/toilet/wheelchair.svg" + }, + { + "if": { + "or": [ + "toilets:position=urinals", + "toilets:position=urinal" + ] }, - { - "if": { - "or": [ - "toilets:position=urinals", - "toilets:position=urinal" - ] - }, - "then": "./assets/layers/toilet/urinal.svg" - } + "then": "./assets/layers/toilet/urinal.svg" + } ] - }, - "color": { - "render": "#0000ff" - }, - "wayHandling": 1, - "presets": [ + }, + "iconBadges": [ { - "title": { - "en": "toilet", - "de": "toilette", - "fr": "toilettes", - "nl": "toilet", - "ru": "tуалет", - "it": "servizi igienici" - }, - "tags": [ - "amenity=toilets" - ], - "description": { - "en": "A publicly accessible toilet or restroom", - "de": "Eine öffentlich zugängliche Toilette", - "fr": "Des toilettes", - "nl": "Een publieke toilet", - "it": "Servizi igienici aperti al pubblico", - "ru": "Туалет или комната отдыха со свободным доступом" - } - }, - { - "title": { - "en": "toilets with wheelchair accessible toilet", - "de": "toiletten mit rollstuhlgerechter Toilette", - "fr": "toilettes accessible aux personnes à mobilité réduite", - "nl": "een rolstoeltoegankelijke toilet", - "it": "servizi igienici accessibili per persone in sedia a rotelle", - "ru": "tуалет с доступом для пользователей кресел-колясок" - }, - "tags": [ - "amenity=toilets", - "wheelchair=yes" - ], - "description": { - "en": "A restroom which has at least one wheelchair-accessible toilet", - "de": "Eine Toilettenanlage mit mindestens einer rollstuhlgerechten Toilette", - "fr": "Toilettes avec au moins un WC accessible aux personnes à mobilité réduite", - "nl": "Deze toiletten hebben op zijn minst één rolstoeltoegankelijke WC", - "it": "Servizi igienici che hanno almeno una toilette accessibile a persone in sedia a rotelle" - } + "if": "opening_hours~*", + "then": "isOpen" } - ], - "tagRenderings": [ - "images", - { - "question": { - "en": "Are these toilets publicly accessible?", - "de": "Sind diese Toiletten öffentlich zugänglich?", - "fr": "Ces toilettes sont-elles accessibles au public ?", - "nl": "Zijn deze toiletten publiek toegankelijk?", - "it": "Questi servizi igienici sono aperti al pubblico?", - "ru": "Есть ли свободный доступ к этим туалетам?" - }, - "render": { - "en": "Access is {access}", - "de": "Zugang ist {access}", - "fr": "L'accès est {access}", - "nl": "Toegankelijkheid is {access}", - "it": "L'accesso è {access}" - }, - "freeform": { - "key": "access", - "addExtraTags": [ - "fixme=the tag access was filled out by the user and might need refinement" - ] - }, - "mappings": [ - { - "if": "access=yes", - "then": { - "en": "Public access", - "de": "Öffentlicher Zugang", - "fr": "Accès publique", - "nl": "Publiek toegankelijk", - "it": "Accesso pubblico", - "ru": "Свободный доступ" - } - }, - { - "if": "access=customers", - "then": { - "en": "Only access to customers", - "de": "Nur Zugang für Kunden", - "fr": "Accès réservé aux clients", - "nl": "Enkel toegang voor klanten", - "it": "Accesso riservato ai clienti e alle clienti" - } - }, - { - "if": "access=no", - "then": { - "en": "Not accessible", - "de": "Nicht zugänglich", - "fr": "Toilettes privées", - "nl": "Niet toegankelijk", - "ru": "Недоступно", - "it": "Non accessibile" - } - }, - { - "if": "access=key", - "then": { - "en": "Accessible, but one has to ask a key to enter", - "de": "Zugänglich, aber man muss einen Schlüssel für die Eingabe verlangen", - "fr": "Accessible, mais vous devez demander la clé", - "nl": "Toegankelijk na het vragen van de sleutel", - "it": "Accessibile, ma occorre chiedere una chiave per accedere" - } - }, - { - "if": "access=public", - "then": { - "en": "Public access", - "de": "Öffentlicher Zugang", - "fr": "Accès publique", - "nl": "Publiek toegankelijk", - "it": "Accesso pubblico", - "ru": "Свободный доступ" - }, - "hideInAnswer": true - } - ], - "id": "toilet-access" - }, - { - "id": "toilets-fee", - "question": { - "en": "Are these toilets free to use?", - "de": "Können diese Toiletten kostenlos benutzt werden?", - "fr": "Ces toilettes sont-elles payantes ?", - "nl": "Zijn deze toiletten gratis te gebruiken?", - "it": "Questi servizi igienici sono gratuiti?" - }, - "mappings": [ - { - "then": { - "en": "These are paid toilets", - "de": "Dies sind bezahlte Toiletten", - "fr": "Toilettes payantes", - "nl": "Men moet betalen om deze toiletten te gebruiken", - "ru": "Это платные туалеты", - "it": "Questi servizi igienici sono a pagamento" - }, - "if": "fee=yes" - }, - { - "if": "fee=no", - "then": { - "en": "Free to use", - "de": "Kostenlose Nutzung", - "fr": "Toilettes gratuites", - "nl": "Gratis te gebruiken", - "it": "Gratis" - } - } - ] - }, - { - "question": { - "en": "How much does one have to pay for these toilets?", - "de": "Wie viel muss man für diese Toiletten bezahlen?", - "fr": "Quel est le prix d'accès de ces toilettes ?", - "nl": "Hoeveel moet men betalen om deze toiletten te gebruiken?", - "it": "Quanto costa l'accesso a questi servizi igienici?", - "ru": "Сколько стоит посещение туалета?" - }, - "render": { - "en": "The fee is {charge}", - "de": "Die Gebühr beträgt {charge}", - "fr": "Le prix est {charge}", - "nl": "De toiletten gebruiken kost {charge}", - "it": "La tariffa è {charge}", - "ru": "Стоимость {charge}" - }, - "condition": "fee=yes", - "freeform": { - "key": "charge", - "type": "string" - }, - "id": "toilet-charge" - }, - { - "id": "toilets-wheelchair", - "question": { - "en": "Is there a dedicated toilet for wheelchair users", - "de": "Gibt es eine Toilette für Rollstuhlfahrer?", - "fr": "Y a-t-il des toilettes réservées aux personnes en fauteuil roulant ?", - "nl": "Is er een rolstoeltoegankelijke toilet voorzien?", - "it": "C'è un WC riservato alle persone in sedia a rotelle" - }, - "mappings": [ - { - "then": { - "en": "There is a dedicated toilet for wheelchair users", - "de": "Es gibt eine Toilette für Rollstuhlfahrer", - "fr": "Il y a des toilettes réservées pour les personnes à mobilité réduite", - "nl": "Er is een toilet voor rolstoelgebruikers", - "it": "C'è un WC riservato alle persone in sedia a rotelle" - }, - "if": "wheelchair=yes" - }, - { - "if": "wheelchair=no", - "then": { - "en": "No wheelchair access", - "de": "Kein Zugang für Rollstuhlfahrer", - "fr": "Non accessible aux personnes à mobilité réduite", - "nl": "Niet toegankelijk voor rolstoelgebruikers", - "it": "Non accessibile in sedia a rotelle", - "ru": "Недоступно пользователям кресел-колясок" - } - } - ] - }, - { - "id": "toilets-type", - "question": { - "en": "Which kind of toilets are this?", - "de": "Welche Art von Toiletten sind das?", - "fr": "De quel type sont ces toilettes ?", - "nl": "Welke toiletten zijn dit?", - "it": "Di che tipo di servizi igienici si tratta?", - "ru": "Какие это туалеты?" - }, - "mappings": [ - { - "if": "toilets:position=seated", - "then": { - "en": "There are only seated toilets", - "de": "Es gibt nur Sitztoiletten", - "fr": "Il y a uniquement des sièges de toilettes", - "nl": "Er zijn enkel WC's om op te zitten", - "it": "Ci sono solo WC con sedile" - } - }, - { - "if": "toilets:position=urinal", - "then": { - "en": "There are only urinals here", - "de": "Hier gibt es nur Pissoirs", - "fr": "Il y a uniquement des urinoirs", - "nl": "Er zijn enkel urinoirs", - "it": "Ci sono solo urinali" - } - }, - { - "if": "toilets:position=squat", - "then": { - "en": "There are only squat toilets here", - "de": "Es gibt hier nur Hocktoiletten", - "fr": "Il y a uniquement des toilettes turques", - "nl": "Er zijn enkel hurktoiletten", - "it": "Ci sono solo turche" - } - }, - { - "if": "toilets:position=seated;urinal", - "then": { - "en": "Both seated toilets and urinals are available here", - "de": "Sowohl Sitztoiletten als auch Pissoirs sind hier verfügbar", - "fr": "Il y a des sièges de toilettes et des urinoirs", - "nl": "Er zijn zowel urinoirs als zittoiletten", - "it": "Ci sono sia sedili, sia urinali" - } - } - ] - }, - { - "id": "toilets-changing-table", - "question": { - "en": "Is a changing table (to change diapers) available?", - "de": "Ist ein Wickeltisch (zum Wechseln der Windeln) vorhanden?", - "fr": "Ces toilettes disposent-elles d'une table à langer ?", - "nl": "Is er een luiertafel beschikbaar?", - "it": "È disponibile un fasciatoio (per cambiare i pannolini)?" - }, - "mappings": [ - { - "then": { - "en": "A changing table is available", - "de": "Ein Wickeltisch ist verfügbar", - "fr": "Une table à langer est disponible", - "nl": "Er is een luiertafel", - "it": "È disponibile un fasciatoio" - }, - "if": "changing_table=yes" - }, - { - "if": "changing_table=no", - "then": { - "en": "No changing table is available", - "de": "Es ist kein Wickeltisch verfügbar", - "fr": "Aucune table à langer", - "nl": "Geen luiertafel", - "it": "Non è disponibile un fasciatoio" - } - } - ] - }, - { - "question": { - "en": "Where is the changing table located?", - "de": "Wo befindet sich der Wickeltisch?", - "fr": "Où se situe la table à langer ?", - "nl": "Waar bevindt de luiertafel zich?", - "it": "Dove si trova il fasciatoio?" - }, - "render": { - "en": "The changing table is located at {changing_table:location}", - "de": "Die Wickeltabelle befindet sich in {changing_table:location}", - "fr": "Emplacement de la table à langer : {changing_table:location}", - "nl": "De luiertafel bevindt zich in {changing_table:location}", - "it": "Il fasciatoio si trova presso {changing_table:location}" - }, - "condition": "changing_table=yes", - "freeform": { - "key": "changing_table:location" - }, - "mappings": [ - { - "then": { - "en": "The changing table is in the toilet for women. ", - "de": "Der Wickeltisch befindet sich in der Damentoilette. ", - "fr": "La table à langer est dans les toilettes pour femmes. ", - "nl": "De luiertafel bevindt zich in de vrouwentoiletten ", - "it": "Il fasciatoio è nei servizi igienici femminili. " - }, - "if": "changing_table:location=female_toilet" - }, - { - "then": { - "en": "The changing table is in the toilet for men. ", - "de": "Der Wickeltisch befindet sich in der Herrentoilette. ", - "fr": "La table à langer est dans les toilettes pour hommes. ", - "nl": "De luiertafel bevindt zich in de herentoiletten ", - "it": "Il fasciatoio è nei servizi igienici maschili. " - }, - "if": "changing_table:location=male_toilet" - }, - { - "if": "changing_table:location=wheelchair_toilet", - "then": { - "en": "The changing table is in the toilet for wheelchair users. ", - "de": "Der Wickeltisch befindet sich in der Toilette für Rollstuhlfahrer. ", - "fr": "La table à langer est dans les toilettes pour personnes à mobilité réduite. ", - "nl": "De luiertafel bevindt zich in de rolstoeltoegankelijke toilet ", - "it": "Il fasciatoio è nei servizi igienici per persone in sedia a rotelle. " - } - }, - { - "if": "changing_table:location=dedicated_room", - "then": { - "en": "The changing table is in a dedicated room. ", - "de": "Der Wickeltisch befindet sich in einem eigenen Raum. ", - "fr": "La table à langer est dans un espace dédié. ", - "nl": "De luiertafel bevindt zich in een daartoe voorziene kamer ", - "it": "Il fasciatoio è in una stanza dedicata. " - } - } - ], - "id": "toilet-changing_table:location" - }, - { - "id": "toilet-handwashing", - "question": { - "en": "Do these toilets have a sink to wash your hands?", - "nl": "Hebben deze toiletten een lavabo om de handen te wassen?", - "de": "Verfügt diese Toilette über ein Waschbecken?" - }, - "mappings": [ - { - "if": "toilets:handwashing=yes", - "then": { - "en": "This toilets have a sink to wash your hands", - "nl": "Deze toiletten hebben een lavabo waar men de handen kan wassen", - "de": "Diese Toilette verfügt über ein Waschbecken" - } - }, - { - "if": "toilets:handwashing=no", - "then": { - "en": "This toilets don't have a sink to wash your hands", - "nl": "Deze toiletten hebben geen lavabo waar men de handen kan wassen", - "de": "Diese Toilette verfügt über kein Waschbecken" - } - } - ] - }, - { - "id": "toilet-has-paper", - "question": { - "en": "Does one have to bring their own toilet paper to this toilet?", - "nl": "Moet je je eigen toiletpappier meenemen naar deze toilet?", - "de": "Muss man für diese Toilette sein eigenes Toilettenpapier mitbringen?" - }, - "mappings": [ - { - "if": "toilets:paper_supplied=yes", - "then": { - "en": "Toilet paper is equipped with toilet paper", - "nl": "Deze toilet is voorzien van toiletpapier" - } - }, - { - "if": "toilets:paper_supplied=no", - "then": { - "en": "You have to bring your own toilet paper to this toilet", - "nl": "Je moet je eigen toiletpapier meebrengen naar deze toilet", - "de": "Für diese Toilette müssen Sie Ihr eigenes Toilettenpapier mitbringen" - } - } - ] - } - ], - "filter": [ - { - "id": "wheelchair", - "options": [ - { - "question": { - "en": "Wheelchair accessible", - "nl": "Rolstoel toegankelijk", - "de": "Rollstuhlgerecht" - }, - "osmTags": "wheelchair=yes" - } - ] - }, - { - "id": "changing_table", - "options": [ - { - "question": { - "en": "Has a changing table", - "nl": "Heeft een luiertafel", - "de": "Hat einen Wickeltisch" - }, - "osmTags": "changing_table=yes" - } - ] - }, - { - "id": "free", - "options": [ - { - "question": { - "en": "Free to use", - "nl": "Gratis toegankelijk", - "de": "Nutzung kostenlos" - }, - "osmTags": { - "or": [ - "fee=no", - "fee=0", - "charge=0" - ] - } - } - ] - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity:={amenity}", - "amenity=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + ], + "location": [ + "point", + "centroid" + ] } + ] } \ No newline at end of file diff --git a/assets/layers/toilet/wheelchair.svg b/assets/layers/toilet/wheelchair.svg index d113492add..2c191b1905 100644 --- a/assets/layers/toilet/wheelchair.svg +++ b/assets/layers/toilet/wheelchair.svg @@ -2,54 +2,53 @@ image/svg+xml + rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> + id="defs9"/> + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="999" + id="namedview7" + showgrid="false" + inkscape:zoom="0.8559553" + inkscape:cx="-16.568588" + inkscape:cy="292.29436" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="layer2"/> \ No newline at end of file + inkscape:connector-curvature="0" + style="clip-rule:evenodd;fill:#000000;fill-rule:evenodd;stroke-width:0.66635805" + d="m 310.84431,395.24795 c -20.28873,40.10642 -62.75413,66.52908 -108.0502,66.52908 -66.52908,0 -120.790412,-54.26133 -120.790412,-120.79041 0,-46.71209 28.310452,-90.1207 70.555212,-109.36341 l 2.73376,35.67521 c -24.98647,15.74498 -40.3895,44.15435 -40.3895,73.93288 0,48.26215 39.36263,87.62413 87.62413,87.62413 44.15407,0 81.80523,-33.88535 86.93958,-77.35545 z" + id="path4"/> \ No newline at end of file diff --git a/assets/layers/trail/trail.json b/assets/layers/trail/trail.json index 79c0c92176..4ff87d1053 100644 --- a/assets/layers/trail/trail.json +++ b/assets/layers/trail/trail.json @@ -1,217 +1,225 @@ { - "id": "trail", - "name": { - "en": "Trails", - "nl": "Wandeltochten", - "ru": "Тропы", - "de": "Wanderwege" + "id": "trail", + "name": { + "en": "Trails", + "nl": "Wandeltochten", + "ru": "Тропы", + "de": "Wanderwege" + }, + "minzoom": 12, + "source": { + "osmTags": { + "and": [ + { + "or": [ + "route=hiking", + "route=bycicle", + "route=horse" + ] + } + ] + } + }, + "title": { + "render": { + "en": "Trail", + "nl": "Wandeltocht", + "ru": "Тропа", + "de": "Wanderweg" }, - "minzoom": 12, - "source": { - "osmTags": { + "mappings": [ + { + "if": "name~*", + "then": "{name}" + } + ] + }, + "tagRenderings": [ + "images", + { + "id": "trail-length", + "render": { + "en": "The trail is {_length:km} kilometers long", + "nl": "Deze wandeling is {_length:km} kilometer lang", + "de": "Der Wanderweg ist {_length:km} Kilometer lang" + } + }, + { + "question": { + "nl": "Wat is de naam van deze wandeling?" + }, + "render": { + "nl": "Deze wandeling heet {name}" + }, + "freeform": { + "key": "name" + }, + "id": "Name" + }, + { + "render": { + "nl": "Beheer door {operator}" + }, + "question": { + "nl": "Wie beheert deze wandeltocht?" + }, + "freeform": { + "key": "operator" + }, + "mappings": [ + { + "if": { "and": [ - { - "or": [ - "route=hiking", - "route=bycicle", - "route=horse" - ] - } + "operator=Natuurpunt" ] + }, + "then": { + "nl": "Dit gebied wordt beheerd door Natuurpunt" + } + }, + { + "if": { + "and": [ + "operator~(n|N)atuurpunt.*" + ] + }, + "then": { + "nl": "Dit gebied wordt beheerd door {operator}" + }, + "hideInAnswer": true } + ], + "id": "Operator tag" }, - "title": { - "render": { - "en": "Trail", - "nl": "Wandeltocht", - "ru": "Тропа", - "de": "Wanderweg" - }, - "mappings": [ - { - "if": "name~*", - "then": "{name}" - } - ] - }, - "tagRenderings": [ - "images", + { + "question": { + "nl": "Welke kleur heeft deze wandeling?" + }, + "render": { + "nl": "Deze wandeling heeft kleur {colour}" + }, + "freeform": { + "key": "colour", + "type": "color" + }, + "mappings": [ { - "id": "trail-length", - "render": { - "en": "The trail is {_length:km} kilometers long", - "nl": "Deze wandeling is {_length:km} kilometer lang", - "de": "Der Wanderweg ist {_length:km} Kilometer lang" - } + "if": "colour=blue", + "then": { + "nl": "Blauwe wandeling", + "en": "Blue trail", + "de": "Blauer Weg" + } }, { - "question": { - "nl": "Wat is de naam van deze wandeling?" - }, - "render": { - "nl": "Deze wandeling heet {name}" - }, - "freeform": { - "key": "name" - }, - "id": "Name" + "if": "colour=red", + "then": { + "nl": "Rode wandeling", + "en": "Red trail", + "de": "Roter Weg" + } }, { - "render": { - "nl": "Beheer door {operator}" - }, - "question": { - "nl": "Wie beheert deze wandeltocht?" - }, - "freeform": { - "key": "operator" - }, - "mappings": [ - { - "if": { - "and": [ - "operator=Natuurpunt" - ] - }, - "then": { - "nl": "Dit gebied wordt beheerd door Natuurpunt" - } - }, - { - "if": { - "and": [ - "operator~(n|N)atuurpunt.*" - ] - }, - "then": { - "nl": "Dit gebied wordt beheerd door {operator}" - }, - "hideInAnswer": true - } - ], - "id": "Operator tag" + "if": "colour=green", + "then": { + "nl": "Groene wandeling", + "en": "Green trail", + "de": "Grüner Weg" + } }, { - "question": { - "nl": "Welke kleur heeft deze wandeling?" - }, - "render": { - "nl": "Deze wandeling heeft kleur {colour}" - }, - "freeform": { - "key": "colour", - "type": "color" - }, - "mappings": [ - { - "if": "colour=blue", - "then": { - "nl": "Blauwe wandeling", - "en": "Blue trail", - "de": "Blauer Weg" - } - }, - { - "if": "colour=red", - "then": { - "nl": "Rode wandeling", - "en": "Red trail", - "de": "Roter Weg" - } - }, - { - "if": "colour=green", - "then": { - "nl": "Groene wandeling", - "en": "Green trail", - "de": "Grüner Weg" - } - }, - { - "if": "colour=yellow", - "then": { - "nl": "Gele wandeling", - "en": "Yellow trail", - "de": "Gelber Weg" - } - } - ], - "id": "Color" - }, - { - "question": { - "nl": "Is deze wandeling toegankelijk met de rolstoel?" - }, - "mappings": [ - { - "then": { - "nl": "deze wandeltocht is toegankelijk met de rolstoel" - }, - "if": "wheelchair=yes" - }, - { - "then": { - "nl": "deze wandeltocht is niet toegankelijk met de rolstoel" - }, - "if": "wheelchair=no" - } - ], - "id": "Wheelchair access" - }, - { - "question": { - "nl": "Is deze wandeltocht toegankelijk met de buggy?" - }, - "mappings": [ - { - "then": { - "nl": "deze wandeltocht is toegankelijk met de buggy" - }, - "if": "pushchair=yes" - }, - { - "then": { - "nl": "deze wandeltocht is niet toegankelijk met de buggy" - }, - "if": "pushchair=no" - } - ], - "id": "pushchair access" + "if": "colour=yellow", + "then": { + "nl": "Gele wandeling", + "en": "Yellow trail", + "de": "Gelber Weg" + } } - ], - "icon": { + ], + "id": "Color" + }, + { + "question": { + "nl": "Is deze wandeling toegankelijk met de rolstoel?" + }, + "mappings": [ + { + "then": { + "nl": "deze wandeltocht is toegankelijk met de rolstoel" + }, + "if": "wheelchair=yes" + }, + { + "then": { + "nl": "deze wandeltocht is niet toegankelijk met de rolstoel" + }, + "if": "wheelchair=no" + } + ], + "id": "Wheelchair access" + }, + { + "question": { + "nl": "Is deze wandeltocht toegankelijk met de buggy?" + }, + "mappings": [ + { + "then": { + "nl": "deze wandeltocht is toegankelijk met de buggy" + }, + "if": "pushchair=yes" + }, + { + "then": { + "nl": "deze wandeltocht is niet toegankelijk met de buggy" + }, + "if": "pushchair=no" + } + ], + "id": "pushchair access" + } + ], + "description": { + "nl": "Aangeduide wandeltochten" + }, + "mapRendering": [ + { + "icon": { "render": "./assets/layers/trail/trail.svg", "mappings": [ - { - "if": "wheelchair=yes", - "then": "./assets/layers/trail/wheelchair.svg" - }, - { - "if": "pushchair=yes", - "then": "./assets/layers/trail/pushchair.svg" - } + { + "if": "wheelchair=yes", + "then": "./assets/layers/trail/wheelchair.svg" + }, + { + "if": "pushchair=yes", + "then": "./assets/layers/trail/pushchair.svg" + } ] - }, - "description": { - "nl": "Aangeduide wandeltochten" - }, - "wayHandling": 0, - "width": { - "render": "3" - }, - "iconSize": { + }, + "iconSize": { "render": "35,35,center" + }, + "location": [ + "point" + ] }, - "color": { + { + "color": { "render": "#335D9F", "mappings": [ - { - "if": "colour~*", - "then": "{colour}" - } + { + "if": "colour~*", + "then": "{colour}" + } ] - }, - "dashArray": { + }, + "width": { + "render": "3" + }, + "dashArray": { "render": "5 5" + } } + ] } \ No newline at end of file diff --git a/assets/layers/tree_node/tree_node.json b/assets/layers/tree_node/tree_node.json index 1104d7bd16..b7e2201a49 100644 --- a/assets/layers/tree_node/tree_node.json +++ b/assets/layers/tree_node/tree_node.json @@ -1,622 +1,623 @@ { - "id": "tree_node", - "name": { + "id": "tree_node", + "name": { + "nl": "Boom", + "en": "Tree", + "it": "Albero", + "ru": "Дерево", + "fr": "Arbre", + "de": "Baum" + }, + "minzoom": 16, + "source": { + "osmTags": { + "and": [ + "natural=tree" + ] + } + }, + "title": { + "render": { + "nl": "Boom", + "en": "Tree", + "it": "Albero", + "ru": "Дерево", + "fr": "Arbre", + "de": "Baum", + "eo": "Arbo" + }, + "mappings": [ + { + "if": "name~*", + "then": { + "nl": "{name}", + "en": "{name}", + "ca": "{name}", + "de": "{name}", + "fr": "{name}", + "it": "{name}", + "ru": "{name}", + "id": "{name}", + "eo": "{name}" + } + } + ] + }, + "tagRenderings": [ + "images", + { + "id": "tree-height", + "render": { + "nl": "Hoogte: {height}", + "en": "Height: {height}", + "it": "Altezza: {height}", + "ru": "Высота: {height}", + "fr": "Hauteur : {height}", + "de": "Höhe: {height}" + }, + "condition": { + "and": [ + "height~*" + ] + }, + "mappings": [ + { + "if": { + "and": [ + "height~^[0-9.]+$" + ] + }, + "then": { + "nl": "Hoogte: {height} m", + "en": "Height: {height} m", + "it": "Altezza: {height} m", + "ru": "Высота: {height} м", + "fr": "Hauteur : {height} m", + "de": "Höhe: {height} m" + } + } + ] + }, + { + "id": "tree-leaf_type", + "question": { + "nl": "Is dit een naald- of loofboom?", + "en": "Is this a broadleaved or needleleaved tree?", + "it": "Si tratta di un albero latifoglia o aghifoglia?", + "fr": "Cet arbre est-il un feuillu ou un résineux ?", + "de": "Ist dies ein Laub- oder Nadelbaum?" + }, + "mappings": [ + { + "if": { + "and": [ + "leaf_type=broadleaved" + ] + }, + "then": { + "nl": "\"\"/ Loofboom", + "en": "\"\"/ Broadleaved", + "it": "\"\"/ Latifoglia", + "fr": "\"\"/ Feuillu", + "de": "\"\"/ Laubbaum" + } + }, + { + "if": { + "and": [ + "leaf_type=needleleaved" + ] + }, + "then": { + "nl": "\"\"/ Naaldboom", + "en": "\"\"/ Needleleaved", + "it": "\"\"/ Aghifoglia", + "fr": "\"\"/ Résineux", + "de": "\"\"/ Nadelbaum" + } + }, + { + "if": { + "and": [ + "leaf_type=leafless" + ] + }, + "then": { + "nl": "\"\"/ Permanent bladloos", + "en": "\"\"/ Permanently leafless", + "it": "\"\"/ Privo di foglie (permanente)", + "fr": "\"\"/ Sans feuilles (Permanent)", + "de": "\"\"/ Dauerhaft blattlos" + }, + "hideInAnswer": true + } + ] + }, + { + "id": "tree-denotation", + "question": { + "nl": "Hoe significant is deze boom? Kies het eerste antwoord dat van toepassing is.", + "en": "How significant is this tree? Choose the first answer that applies.", + "it": "Quanto significativo è questo albero? Scegli la prima risposta che corrisponde.", + "fr": "Quelle est l'importance de cet arbre ? Choisissez la première réponse qui s'applique.", + "de": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft." + }, + "mappings": [ + { + "if": { + "and": [ + "denotation=landmark" + ] + }, + "then": { + "nl": "De boom valt op door zijn grootte of prominente locatie. Hij is nuttig voor navigatie.", + "en": "The tree is remarkable due to its size or prominent location. It is useful for navigation.", + "it": "È un albero notevole per le sue dimensioni o per la posizione prominente. È utile alla navigazione.", + "fr": "L'arbre est remarquable en raison de sa taille ou de son emplacement proéminent. Il est utile pour la navigation.", + "de": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung." + } + }, + { + "if": { + "and": [ + "denotation=natural_monument" + ] + }, + "then": { + "nl": "De boom is een natuurlijk monument, bijvoorbeeld doordat hij bijzonder oud of van een waardevolle soort is.", + "en": "The tree is a natural monument, e.g. because it is especially old, or of a valuable species.", + "it": "L’albero è un monumento naturale, ad esempio perché specialmente antico o appartenente a specie importanti.", + "fr": "Cet arbre est un monument naturel (ex : âge, espèce, etc…)", + "de": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört." + } + }, + { + "if": { + "and": [ + "denotation=agricultural" + ] + }, + "then": { + "nl": "De boom wordt voor landbouwdoeleinden gebruikt, bijvoorbeeld in een boomgaard.", + "en": "The tree is used for agricultural purposes, e.g. in an orchard.", + "it": "L’albero è usato per scopi agricoli, ad esempio in un frutteto.", + "fr": "Cet arbre est utilisé à but d’agriculture (ex : dans un verger)", + "de": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage." + } + }, + { + "if": { + "and": [ + "denotation=park" + ] + }, + "then": { + "nl": "De boom staat in een park of dergelijke (begraafplaats, schoolterrein, …).", + "en": "The tree is in a park or similar (cemetery, school grounds, …).", + "it": "L’albero è in un parco o qualcosa di simile (cimitero, aree didattiche, etc.).", + "fr": "Cet arbre est dans un parc ou une aire similaire (ex : cimetière, cour d’école, …).", + "de": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)." + } + }, + { + "if": { + "and": [ + "denotation=garden" + ] + }, + "then": { + "nl": "De boom staat in de tuin bij een woning/flatgebouw.", + "en": "The tree is a residential garden.", + "it": "L’albero è un giardino residenziale.", + "fr": "Cet arbre est dans une cour résidentielle." + } + }, + { + "if": { + "and": [ + "denotation=avenue" + ] + }, + "then": { + "nl": "Dit is een laanboom.", + "en": "This is a tree along an avenue.", + "it": "Fa parte di un viale alberato.", + "fr": "C'est un arbre le long d'une avenue.", + "de": "Dieser Baum steht entlang einer Straße." + } + }, + { + "if": { + "and": [ + "denotation=urban" + ] + }, + "then": { + "nl": "De boom staat in een woonkern.", + "en": "The tree is an urban area.", + "it": "L’albero si trova in un’area urbana.", + "fr": "L'arbre est une zone urbaine." + } + }, + { + "if": { + "and": [ + "denotation=none" + ] + }, + "then": { + "nl": "De boom staat buiten een woonkern.", + "en": "The tree is outside of an urban area.", + "it": "L’albero si trova fuori dall’area urbana.", + "fr": "Cet arbre est en zone rurale.", + "de": "Dieser Baum steht außerhalb eines städtischen Gebiets." + } + } + ] + }, + { + "id": "tree-decidouous", + "question": { + "nl": "Is deze boom groenblijvend of bladverliezend?", + "en": "Is this tree evergreen or deciduous?", + "it": "È un sempreverde o caduco?", + "ru": "Это дерево вечнозелёное или листопадное?", + "fr": "L’arbre est-il à feuillage persistant ou caduc ?", + "de": "Ist dies ein Nadelbaum oder ein Laubbaum?" + }, + "mappings": [ + { + "if": { + "and": [ + "leaf_cycle=deciduous" + ] + }, + "then": { + "nl": "Bladverliezend: de boom is een periode van het jaar kaal.", + "en": "Deciduous: the tree loses its leaves for some time of the year.", + "it": "Caduco: l’albero perde le sue foglie per un periodo dell’anno.", + "ru": "Листопадное: у дерева опадают листья в определённое время года.", + "fr": "Caduc : l’arbre perd son feuillage une partie de l’année.", + "de": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter." + } + }, + { + "if": { + "and": [ + "leaf_cycle=evergreen" + ] + }, + "then": { + "nl": "Groenblijvend.", + "en": "Evergreen.", + "it": "Sempreverde.", + "fr": "À feuilles persistantes.", + "ru": "Вечнозелёное.", + "de": "immergrüner Baum." + } + } + ], + "condition": { + "and": [ + "leaf_type!~^leafless$" + ] + } + }, + { + "render": { + "nl": "Naam: {name}", + "en": "Name: {name}", + "it": "Nome: {name}", + "ru": "Название: {name}", + "fr": "Nom : {name}", + "id": "Nama: {name}", + "de": "Name: {name}", + "eo": "Nomo: {name}" + }, + "question": { + "nl": "Heeft de boom een naam?", + "en": "Does the tree have a name?", + "it": "L’albero ha un nome?", + "fr": "L'arbre a-t-il un nom ?", + "ru": "Есть ли у этого дерева название?", + "de": "Hat der Baum einen Namen?" + }, + "freeform": { + "key": "name", + "addExtraTags": [ + "noname=" + ] + }, + "mappings": [ + { + "if": { + "and": [ + "name=", + "noname=yes" + ] + }, + "then": { + "nl": "De boom heeft geen naam.", + "en": "The tree does not have a name.", + "it": "L’albero non ha un nome.", + "fr": "L'arbre n'a pas de nom.", + "ru": "У этого дерева нет названия.", + "de": "Der Baum hat keinen Namen." + } + } + ], + "condition": { + "or": [ + "denotation=landmark", + "denotation=natural_monument", + "name~*" + ] + }, + "id": "tree_node-name" + }, + { + "id": "tree-heritage", + "question": { + "nl": "Is deze boom erkend als erfgoed?", + "en": "Is this tree registered heritage?", + "it": "Quest’albero è registrato come patrimonio?", + "fr": "Cet arbre est-il inscrit au patrimoine ?", + "de": "Ist dieser Baum ein Naturdenkmal?" + }, + "mappings": [ + { + "if": { + "and": [ + "heritage=4", + "heritage:operator=OnroerendErfgoed" + ] + }, + "then": { + "nl": "\"\"/ Erkend als houtig erfgoed door Onroerend Erfgoed Vlaanderen", + "en": "\"\"/ Registered as heritage by Onroerend Erfgoed Flanders", + "it": "\"\"/Registrato come patrimonio da Onroerend Erfgoed Flanders", + "fr": "\"\"/ Fait partie du patrimoine par Onroerend Erfgoed", + "de": "\"\"/ Als Denkmal registriert von der Onroerend Erfgoed Flandern" + } + }, + { + "if": { + "and": [ + "heritage=4", + "heritage:operator=aatl" + ] + }, + "then": { + "nl": "Erkend als natuurlijk erfgoed door Directie Cultureel Erfgoed Brussel", + "en": "Registered as heritage by Direction du Patrimoine culturel Brussels", + "it": "Registrato come patrimonio da Direction du Patrimoine culturel di Bruxelles", + "fr": "Enregistré comme patrimoine par la Direction du Patrimoine culturel Bruxelles", + "de": "Als Denkmal registriert von der Direction du Patrimoine culturel Brüssel" + } + }, + { + "if": { + "and": [ + "heritage=yes", + "heritage:operator=" + ] + }, + "then": { + "nl": "Erkend als erfgoed door een andere organisatie", + "en": "Registered as heritage by a different organisation", + "it": "Registrato come patrimonio da un’organizzazione differente", + "fr": "Enregistré comme patrimoine par une autre organisation", + "de": "Von einer anderen Organisation als Denkmal registriert" + } + }, + { + "if": { + "and": [ + "heritage=no", + "heritage:operator=" + ] + }, + "then": { + "nl": "Niet erkend als erfgoed", + "en": "Not registered as heritage", + "it": "Non è registrato come patrimonio", + "fr": "Non enregistré comme patrimoine", + "de": "Nicht als Denkmal registriert" + } + }, + { + "if": { + "and": [ + "heritage~*" + ] + }, + "then": { + "nl": "Erkend als erfgoed door een andere organisatie", + "en": "Registered as heritage by a different organisation", + "it": "Registrato come patrimonio da un’organizzazione differente", + "fr": "Enregistré comme patrimoine par une autre organisation", + "de": "Von einer anderen Organisation als Denkmal registriert" + }, + "hideInAnswer": true + } + ], + "condition": { + "or": [ + "denotation=landmark", + "denotation=natural_monument" + ] + } + }, + { + "render": { + "nl": "\"\"/ Onroerend Erfgoed-ID: {ref:OnroerendErfgoed}", + "en": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", + "it": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", + "ru": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", + "fr": "\"\"/ Identifiant Onroerend Erfgoed : {ref:OnroerendErfgoed}" + }, + "question": { + "nl": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?", + "en": "What is the ID issued by Onroerend Erfgoed Flanders?", + "it": "Qual è l’ID rilasciato da Onroerend Erfgoed Flanders?", + "fr": "Quel est son identifiant donné par Onroerend Erfgoed ?", + "de": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?" + }, + "freeform": { + "key": "ref:OnroerendErfgoed", + "type": "nat" + }, + "condition": { + "and": [ + "heritage=4", + "heritage:operator=OnroerendErfgoed" + ] + }, + "id": "tree_node-ref:OnroerendErfgoed" + }, + { + "render": { + "nl": "\"\"/ Wikidata: {wikidata}", + "en": "\"\"/ Wikidata: {wikidata}", + "it": "\"\"/ Wikidata: {wikidata}", + "ru": "\"\"/ Wikidata: {wikidata}", + "fr": "\"\"/ Wikidata : {wikidata}", + "de": "\"\"/ Wikidata: {wikidata}" + }, + "question": { + "nl": "Wat is het Wikidata-ID van deze boom?", + "en": "What is the Wikidata ID for this tree?", + "it": "Qual è l’ID Wikidata per questo albero?", + "fr": "Quel est l'identifiant Wikidata de cet arbre ?", + "de": "Was ist das passende Wikidata Element zu diesem Baum?" + }, + "freeform": { + "key": "wikidata", + "type": "wikidata" + }, + "condition": { + "or": [ + "denotation=landmark", + "denotation=natural_monument", + "wikidata~*" + ] + }, + "id": "tree_node-wikidata" + } + ], + "presets": [ + { + "tags": [ + "natural=tree", + "leaf_type=broadleaved" + ], + "title": { + "nl": "Loofboom", + "en": "Broadleaved tree", + "it": "Albero latifoglia", + "fr": "Arbre feuillu", + "ru": "Лиственное дерево", + "de": "Laubbaum" + }, + "description": { + "nl": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.", + "en": "A tree of a species with leaves, such as oak or populus.", + "it": "Un albero di una specie con foglie larghe come la quercia o il pioppo.", + "fr": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier.", + "de": "Ein Baum mit Blättern, z. B. Eiche oder Buche." + }, + "preciseInput": { + "preferredBackground": "photo" + } + }, + { + "tags": [ + "natural=tree", + "leaf_type=needleleaved" + ], + "title": { + "nl": "Naaldboom", + "en": "Needleleaved tree", + "it": "Albero aghifoglia", + "ru": "Хвойное дерево", + "fr": "Arbre résineux", + "de": "Nadelbaum" + }, + "description": { + "nl": "Een boom van een soort met naalden, bijvoorbeeld den of spar.", + "en": "A tree of a species with needles, such as pine or spruce.", + "it": "Un albero di una specie con aghi come il pino o l’abete.", + "ru": "Дерево с хвоей (иглами), например, сосна или ель.", + "fr": "Une espèce d’arbre avec des épines comme le pin ou l’épicéa.", + "de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte." + }, + "preciseInput": { + "preferredBackground": "photo" + } + }, + { + "tags": [ + "natural=tree" + ], + "title": { "nl": "Boom", "en": "Tree", "it": "Albero", "ru": "Дерево", "fr": "Arbre", + "id": "Pohon", "de": "Baum" - }, - "minzoom": 16, - "source": { - "osmTags": { - "and": [ - "natural=tree" - ] - } - }, - "title": { - "render": { - "nl": "Boom", - "en": "Tree", - "it": "Albero", - "ru": "Дерево", - "fr": "Arbre", - "de": "Baum", - "eo": "Arbo" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "nl": "{name}", - "en": "{name}", - "ca": "{name}", - "de": "{name}", - "fr": "{name}", - "it": "{name}", - "ru": "{name}", - "id": "{name}", - "eo": "{name}" - } - } - ] - }, - "tagRenderings": [ - "images", - { - "id": "tree-height", - "render": { - "nl": "Hoogte: {height}", - "en": "Height: {height}", - "it": "Altezza: {height}", - "ru": "Высота: {height}", - "fr": "Hauteur : {height}", - "de": "Höhe: {height}" - }, - "condition": { - "and": [ - "height~*" - ] - }, - "mappings": [ - { - "if": { - "and": [ - "height~^[0-9.]+$" - ] - }, - "then": { - "nl": "Hoogte: {height} m", - "en": "Height: {height} m", - "it": "Altezza: {height} m", - "ru": "Высота: {height} м", - "fr": "Hauteur : {height} m", - "de": "Höhe: {height} m" - } - } - ] - }, - { - "id": "tree-leaf_type", - "question": { - "nl": "Is dit een naald- of loofboom?", - "en": "Is this a broadleaved or needleleaved tree?", - "it": "Si tratta di un albero latifoglia o aghifoglia?", - "fr": "Cet arbre est-il un feuillu ou un résineux ?", - "de": "Ist dies ein Laub- oder Nadelbaum?" - }, - "mappings": [ - { - "if": { - "and": [ - "leaf_type=broadleaved" - ] - }, - "then": { - "nl": "\"\"/ Loofboom", - "en": "\"\"/ Broadleaved", - "it": "\"\"/ Latifoglia", - "fr": "\"\"/ Feuillu", - "de": "\"\"/ Laubbaum" - } - }, - { - "if": { - "and": [ - "leaf_type=needleleaved" - ] - }, - "then": { - "nl": "\"\"/ Naaldboom", - "en": "\"\"/ Needleleaved", - "it": "\"\"/ Aghifoglia", - "fr": "\"\"/ Résineux", - "de": "\"\"/ Nadelbaum" - } - }, - { - "if": { - "and": [ - "leaf_type=leafless" - ] - }, - "then": { - "nl": "\"\"/ Permanent bladloos", - "en": "\"\"/ Permanently leafless", - "it": "\"\"/ Privo di foglie (permanente)", - "fr": "\"\"/ Sans feuilles (Permanent)", - "de": "\"\"/ Dauerhaft blattlos" - }, - "hideInAnswer": true - } - ] - }, - { - "id": "tree-denotation", - "question": { - "nl": "Hoe significant is deze boom? Kies het eerste antwoord dat van toepassing is.", - "en": "How significant is this tree? Choose the first answer that applies.", - "it": "Quanto significativo è questo albero? Scegli la prima risposta che corrisponde.", - "fr": "Quelle est l'importance de cet arbre ? Choisissez la première réponse qui s'applique.", - "de": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft." - }, - "mappings": [ - { - "if": { - "and": [ - "denotation=landmark" - ] - }, - "then": { - "nl": "De boom valt op door zijn grootte of prominente locatie. Hij is nuttig voor navigatie.", - "en": "The tree is remarkable due to its size or prominent location. It is useful for navigation.", - "it": "È un albero notevole per le sue dimensioni o per la posizione prominente. È utile alla navigazione.", - "fr": "L'arbre est remarquable en raison de sa taille ou de son emplacement proéminent. Il est utile pour la navigation.", - "de": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung." - } - }, - { - "if": { - "and": [ - "denotation=natural_monument" - ] - }, - "then": { - "nl": "De boom is een natuurlijk monument, bijvoorbeeld doordat hij bijzonder oud of van een waardevolle soort is.", - "en": "The tree is a natural monument, e.g. because it is especially old, or of a valuable species.", - "it": "L’albero è un monumento naturale, ad esempio perché specialmente antico o appartenente a specie importanti.", - "fr": "Cet arbre est un monument naturel (ex : âge, espèce, etc…)", - "de": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört." - } - }, - { - "if": { - "and": [ - "denotation=agricultural" - ] - }, - "then": { - "nl": "De boom wordt voor landbouwdoeleinden gebruikt, bijvoorbeeld in een boomgaard.", - "en": "The tree is used for agricultural purposes, e.g. in an orchard.", - "it": "L’albero è usato per scopi agricoli, ad esempio in un frutteto.", - "fr": "Cet arbre est utilisé à but d’agriculture (ex : dans un verger)", - "de": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage." - } - }, - { - "if": { - "and": [ - "denotation=park" - ] - }, - "then": { - "nl": "De boom staat in een park of dergelijke (begraafplaats, schoolterrein, …).", - "en": "The tree is in a park or similar (cemetery, school grounds, …).", - "it": "L’albero è in un parco o qualcosa di simile (cimitero, aree didattiche, etc.).", - "fr": "Cet arbre est dans un parc ou une aire similaire (ex : cimetière, cour d’école, …).", - "de": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)." - } - }, - { - "if": { - "and": [ - "denotation=garden" - ] - }, - "then": { - "nl": "De boom staat in de tuin bij een woning/flatgebouw.", - "en": "The tree is a residential garden.", - "it": "L’albero è un giardino residenziale.", - "fr": "Cet arbre est dans une cour résidentielle." - } - }, - { - "if": { - "and": [ - "denotation=avenue" - ] - }, - "then": { - "nl": "Dit is een laanboom.", - "en": "This is a tree along an avenue.", - "it": "Fa parte di un viale alberato.", - "fr": "C'est un arbre le long d'une avenue.", - "de": "Dieser Baum steht entlang einer Straße." - } - }, - { - "if": { - "and": [ - "denotation=urban" - ] - }, - "then": { - "nl": "De boom staat in een woonkern.", - "en": "The tree is an urban area.", - "it": "L’albero si trova in un’area urbana.", - "fr": "L'arbre est une zone urbaine." - } - }, - { - "if": { - "and": [ - "denotation=none" - ] - }, - "then": { - "nl": "De boom staat buiten een woonkern.", - "en": "The tree is outside of an urban area.", - "it": "L’albero si trova fuori dall’area urbana.", - "fr": "Cet arbre est en zone rurale.", - "de": "Dieser Baum steht außerhalb eines städtischen Gebiets." - } - } - ] - }, - { - "id": "tree-decidouous", - "question": { - "nl": "Is deze boom groenblijvend of bladverliezend?", - "en": "Is this tree evergreen or deciduous?", - "it": "È un sempreverde o caduco?", - "ru": "Это дерево вечнозелёное или листопадное?", - "fr": "L’arbre est-il à feuillage persistant ou caduc ?", - "de": "Ist dies ein Nadelbaum oder ein Laubbaum?" - }, - "mappings": [ - { - "if": { - "and": [ - "leaf_cycle=deciduous" - ] - }, - "then": { - "nl": "Bladverliezend: de boom is een periode van het jaar kaal.", - "en": "Deciduous: the tree loses its leaves for some time of the year.", - "it": "Caduco: l’albero perde le sue foglie per un periodo dell’anno.", - "ru": "Листопадное: у дерева опадают листья в определённое время года.", - "fr": "Caduc : l’arbre perd son feuillage une partie de l’année.", - "de": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter." - } - }, - { - "if": { - "and": [ - "leaf_cycle=evergreen" - ] - }, - "then": { - "nl": "Groenblijvend.", - "en": "Evergreen.", - "it": "Sempreverde.", - "fr": "À feuilles persistantes.", - "ru": "Вечнозелёное.", - "de": "immergrüner Baum." - } - } - ], - "condition": { - "and": [ - "leaf_type!~^leafless$" - ] - } - }, - { - "render": { - "nl": "Naam: {name}", - "en": "Name: {name}", - "it": "Nome: {name}", - "ru": "Название: {name}", - "fr": "Nom : {name}", - "id": "Nama: {name}", - "de": "Name: {name}", - "eo": "Nomo: {name}" - }, - "question": { - "nl": "Heeft de boom een naam?", - "en": "Does the tree have a name?", - "it": "L’albero ha un nome?", - "fr": "L'arbre a-t-il un nom ?", - "ru": "Есть ли у этого дерева название?", - "de": "Hat der Baum einen Namen?" - }, - "freeform": { - "key": "name", - "addExtraTags": [ - "noname=" - ] - }, - "mappings": [ - { - "if": { - "and": [ - "name=", - "noname=yes" - ] - }, - "then": { - "nl": "De boom heeft geen naam.", - "en": "The tree does not have a name.", - "it": "L’albero non ha un nome.", - "fr": "L'arbre n'a pas de nom.", - "ru": "У этого дерева нет названия.", - "de": "Der Baum hat keinen Namen." - } - } - ], - "condition": { - "or": [ - "denotation=landmark", - "denotation=natural_monument", - "name~*" - ] - }, - "id": "tree_node-name" - }, - { - "id": "tree-heritage", - "question": { - "nl": "Is deze boom erkend als erfgoed?", - "en": "Is this tree registered heritage?", - "it": "Quest’albero è registrato come patrimonio?", - "fr": "Cet arbre est-il inscrit au patrimoine ?", - "de": "Ist dieser Baum ein Naturdenkmal?" - }, - "mappings": [ - { - "if": { - "and": [ - "heritage=4", - "heritage:operator=OnroerendErfgoed" - ] - }, - "then": { - "nl": "\"\"/ Erkend als houtig erfgoed door Onroerend Erfgoed Vlaanderen", - "en": "\"\"/ Registered as heritage by Onroerend Erfgoed Flanders", - "it": "\"\"/Registrato come patrimonio da Onroerend Erfgoed Flanders", - "fr": "\"\"/ Fait partie du patrimoine par Onroerend Erfgoed", - "de": "\"\"/ Als Denkmal registriert von der Onroerend Erfgoed Flandern" - } - }, - { - "if": { - "and": [ - "heritage=4", - "heritage:operator=aatl" - ] - }, - "then": { - "nl": "Erkend als natuurlijk erfgoed door Directie Cultureel Erfgoed Brussel", - "en": "Registered as heritage by Direction du Patrimoine culturel Brussels", - "it": "Registrato come patrimonio da Direction du Patrimoine culturel di Bruxelles", - "fr": "Enregistré comme patrimoine par la Direction du Patrimoine culturel Bruxelles", - "de": "Als Denkmal registriert von der Direction du Patrimoine culturel Brüssel" - } - }, - { - "if": { - "and": [ - "heritage=yes", - "heritage:operator=" - ] - }, - "then": { - "nl": "Erkend als erfgoed door een andere organisatie", - "en": "Registered as heritage by a different organisation", - "it": "Registrato come patrimonio da un’organizzazione differente", - "fr": "Enregistré comme patrimoine par une autre organisation", - "de": "Von einer anderen Organisation als Denkmal registriert" - } - }, - { - "if": { - "and": [ - "heritage=no", - "heritage:operator=" - ] - }, - "then": { - "nl": "Niet erkend als erfgoed", - "en": "Not registered as heritage", - "it": "Non è registrato come patrimonio", - "fr": "Non enregistré comme patrimoine", - "de": "Nicht als Denkmal registriert" - } - }, - { - "if": { - "and": [ - "heritage~*" - ] - }, - "then": { - "nl": "Erkend als erfgoed door een andere organisatie", - "en": "Registered as heritage by a different organisation", - "it": "Registrato come patrimonio da un’organizzazione differente", - "fr": "Enregistré comme patrimoine par une autre organisation", - "de": "Von einer anderen Organisation als Denkmal registriert" - }, - "hideInAnswer": true - } - ], - "condition": { - "or": [ - "denotation=landmark", - "denotation=natural_monument" - ] - } - }, - { - "render": { - "nl": "\"\"/ Onroerend Erfgoed-ID: {ref:OnroerendErfgoed}", - "en": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", - "it": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", - "ru": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", - "fr": "\"\"/ Identifiant Onroerend Erfgoed : {ref:OnroerendErfgoed}", - "de": "" - }, - "question": { - "nl": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?", - "en": "What is the ID issued by Onroerend Erfgoed Flanders?", - "it": "Qual è l’ID rilasciato da Onroerend Erfgoed Flanders?", - "fr": "Quel est son identifiant donné par Onroerend Erfgoed ?", - "de": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?" - }, - "freeform": { - "key": "ref:OnroerendErfgoed", - "type": "nat" - }, - "condition": { - "and": [ - "heritage=4", - "heritage:operator=OnroerendErfgoed" - ] - }, - "id": "tree_node-ref:OnroerendErfgoed" - }, - { - "render": { - "nl": "\"\"/ Wikidata: {wikidata}", - "en": "\"\"/ Wikidata: {wikidata}", - "it": "\"\"/ Wikidata: {wikidata}", - "ru": "\"\"/ Wikidata: {wikidata}", - "fr": "\"\"/ Wikidata : {wikidata}" - }, - "question": { - "nl": "Wat is het Wikidata-ID van deze boom?", - "en": "What is the Wikidata ID for this tree?", - "it": "Qual è l’ID Wikidata per questo albero?", - "fr": "Quel est l'identifiant Wikidata de cet arbre ?", - "de": "Was ist das passende Wikidata Element zu diesem Baum?" - }, - "freeform": { - "key": "wikidata", - "type": "wikidata" - }, - "condition": { - "or": [ - "denotation=landmark", - "denotation=natural_monument", - "wikidata~*" - ] - }, - "id": "tree_node-wikidata" - } - ], - "icon": { + }, + "description": { + "nl": "Wanneer je niet zeker bent of het nu een loof- of naaldboom is.", + "en": "If you're not sure whether it's a broadleaved or needleleaved tree.", + "it": "Qualora non si sia sicuri se si tratta di un albero latifoglia o aghifoglia.", + "fr": "Si vous n'êtes pas sûr(e) de savoir s'il s'agit d'un arbre à feuilles larges ou à aiguilles.", + "ru": "Если вы не уверены в том, лиственное это дерево или хвойное.", + "de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt." + }, + "preciseInput": { + "preferredBackground": "photo" + } + } + ], + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "deletion": { + "minNeededChangesets": 5 + }, + "mapRendering": [ + { + "icon": { "render": "circle:#ffffff;./assets/themes/trees/unknown.svg", "mappings": [ - { - "if": { - "and": [ - "leaf_type=broadleaved" - ] - }, - "then": "circle:#ffffff;./assets/themes/trees/broadleaved.svg" - }, - { - "if": { - "and": [ - "leaf_type=needleleaved" - ] - }, - "then": "circle:#ffffff;./assets/themes/trees/needleleaved.svg" - } - ] - }, - "wayHandling": 1, - "width": { - "render": "8" - }, - "iconSize": { - "render": "40,40,bottom" - }, - "color": { - "render": "#00f" - }, - "presets": [ - { - "tags": [ - "natural=tree", + { + "if": { + "and": [ "leaf_type=broadleaved" - ], - "title": { - "nl": "Loofboom", - "en": "Broadleaved tree", - "it": "Albero latifoglia", - "fr": "Arbre feuillu", - "ru": "Лиственное дерево", - "de": "Laubbaum" + ] }, - "description": { - "nl": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.", - "en": "A tree of a species with leaves, such as oak or populus.", - "it": "Un albero di una specie con foglie larghe come la quercia o il pioppo.", - "fr": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier.", - "de": "Ein Baum mit Blättern, z. B. Eiche oder Buche." - }, - "preciseInput": { - "preferredBackground": "photo" - } - }, - { - "tags": [ - "natural=tree", + "then": "circle:#ffffff;./assets/themes/trees/broadleaved.svg" + }, + { + "if": { + "and": [ "leaf_type=needleleaved" - ], - "title": { - "nl": "Naaldboom", - "en": "Needleleaved tree", - "it": "Albero aghifoglia", - "ru": "Хвойное дерево", - "fr": "Arbre résineux", - "de": "Nadelbaum" + ] }, - "description": { - "nl": "Een boom van een soort met naalden, bijvoorbeeld den of spar.", - "en": "A tree of a species with needles, such as pine or spruce.", - "it": "Un albero di una specie con aghi come il pino o l’abete.", - "ru": "Дерево с хвоей (иглами), например, сосна или ель.", - "fr": "Une espèce d’arbre avec des épines comme le pin ou l’épicéa.", - "de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte." - }, - "preciseInput": { - "preferredBackground": "photo" - } - }, - { - "tags": [ - "natural=tree" - ], - "title": { - "nl": "Boom", - "en": "Tree", - "it": "Albero", - "ru": "Дерево", - "fr": "Arbre", - "id": "Pohon", - "de": "Baum" - }, - "description": { - "nl": "Wanneer je niet zeker bent of het nu een loof- of naaldboom is.", - "en": "If you're not sure whether it's a broadleaved or needleleaved tree.", - "it": "Qualora non si sia sicuri se si tratta di un albero latifoglia o aghifoglia.", - "fr": "Si vous n'êtes pas sûr(e) de savoir s'il s'agit d'un arbre à feuilles larges ou à aiguilles.", - "ru": "Если вы не уверены в том, лиственное это дерево или хвойное.", - "de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt." - }, - "preciseInput": { - "preferredBackground": "photo" - } - } - ], - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true - }, - "deletion": { - "minNeededChangesets": 5 + "then": "circle:#ffffff;./assets/themes/trees/needleleaved.svg" + } + ] + }, + "iconSize": { + "render": "40,40,bottom" + }, + "location": [ + "point", + "centroid" + ] } + ] } \ No newline at end of file diff --git a/assets/layers/type_node/type_node.json b/assets/layers/type_node/type_node.json new file mode 100644 index 0000000000..4609041eda --- /dev/null +++ b/assets/layers/type_node/type_node.json @@ -0,0 +1,12 @@ +{ + "id": "type_node", + "description": "This is a priviliged meta_layer which exports _every_ point in OSM. This only works if zoomed below the point that the full tile is loaded (and not loaded via Overpass). Note that this point will also contain a property `parent_ways` which contains all the ways this node is part of as a list. This is mainly used for extremely specialized themes, which do advanced conflations. Expert use only.", + "minzoom": 18, + "source": { + "osmTags": "id~node/.*" + }, + "mapRendering": null, + "name": "All OSM Nodes", + "title": "OSM node {id}", + "tagRendering": [] +} \ No newline at end of file diff --git a/assets/layers/viewpoint/viewpoint.json b/assets/layers/viewpoint/viewpoint.json index d16d88cfb2..b3f077b748 100644 --- a/assets/layers/viewpoint/viewpoint.json +++ b/assets/layers/viewpoint/viewpoint.json @@ -1,76 +1,85 @@ { - "id": "viewpoint", - "name": { + "id": "viewpoint", + "name": { + "en": "Viewpoint", + "nl": "Uitzicht", + "de": "Aussichtspunkt", + "fr": "Point de vue", + "it": "Punto panoramico", + "ru": "Смотровая площадка", + "id": "Sudut pandang", + "eo": "Vidpunkto" + }, + "description": { + "en": "A nice viewpoint or nice view. Ideal to add an image if no other category fits", + "nl": "Een mooi uitzicht - ideaal om een foto toe te voegen wanneer iets niet in een andere categorie past", + "de": "Ein schöner Aussichtspunkt oder eine schöne Aussicht. Ideal zum Hinzufügen eines Bildes, wenn keine andere Kategorie passt", + "fr": "Un beau point de vue ou une belle vue. Idéal pour ajouter une image si aucune autre catégorie ne convient", + "it": "Un punto panoramico che offre una bella vista. L'ideale è aggiungere un'immagine, se nessun'altra categoria è appropriata" + }, + "source": { + "osmTags": "tourism=viewpoint" + }, + "minzoom": 14, + "wayhandling": 2, + "presets": [ + { + "title": { "en": "Viewpoint", "nl": "Uitzicht", "de": "Aussichtspunkt", "fr": "Point de vue", - "it": "Punto panoramico", "ru": "Смотровая площадка", - "id": "Sudut pandang", - "eo": "Vidpunkto" + "it": "Punto panoramico", + "id": "Sudut pandang" + }, + "tags": [ + "tourism=viewpoint" + ] + } + ], + "title": { + "render": { + "en": "Viewpoint", + "nl": "Uitzicht", + "de": "Aussichtspunkt", + "fr": "Point de vue", + "ru": "Смотровая площадка", + "it": "Punto panoramico", + "id": "Sudut pandang", + "eo": "Vidpunkto" + } + }, + "tagRenderings": [ + "images", + { + "question": { + "en": "Do you want to add a description?", + "nl": "Zijn er bijzonderheden die je wilt toevoegen?", + "de": "Möchten Sie eine Beschreibung hinzufügen?", + "ru": "Вы хотите добавить описание?", + "fr": "Voulez-vous ajouter une description ?", + "it": "Vuoi aggiungere una descrizione?", + "id": "Apakah Anda ingin menambahkan deskripsi?" + }, + "render": "{description}", + "freeform": { + "key": "description" + }, + "id": "viewpoint-description" + } + ], + "mapRendering": [ + { + "icon": "./assets/layers/viewpoint/viewpoint.svg", + "iconSize": "20,20,center", + "location": [ + "point" + ] }, - "description": { - "en": "A nice viewpoint or nice view. Ideal to add an image if no other category fits", - "nl": "Een mooi uitzicht - ideaal om een foto toe te voegen wanneer iets niet in een andere categorie past", - "de": "Ein schöner Aussichtspunkt oder eine schöne Aussicht. Ideal zum Hinzufügen eines Bildes, wenn keine andere Kategorie passt", - "fr": "Un beau point de vue ou une belle vue. Idéal pour ajouter une image si aucune autre catégorie ne convient", - "it": "Un punto panoramico che offre una bella vista. L'ideale è aggiungere un'immagine, se nessun'altra categoria è appropriata" - }, - "source": { - "osmTags": "tourism=viewpoint" - }, - "minzoom": 14, - "icon": "./assets/layers/viewpoint/viewpoint.svg", - "iconSize": "20,20,center", - "color": "#ffffff", - "width": "5", - "wayhandling": 2, - "presets": [ - { - "title": { - "en": "Viewpoint", - "nl": "Uitzicht", - "de": "Aussichtspunkt", - "fr": "Point de vue", - "ru": "Смотровая площадка", - "it": "Punto panoramico", - "id": "Sudut pandang" - }, - "tags": [ - "tourism=viewpoint" - ] - } - ], - "title": { - "render": { - "en": "Viewpoint", - "nl": "Uitzicht", - "de": "Aussichtspunkt", - "fr": "Point de vue", - "ru": "Смотровая площадка", - "it": "Punto panoramico", - "id": "Sudut pandang", - "eo": "Vidpunkto" - } - }, - "tagRenderings": [ - "images", - { - "question": { - "en": "Do you want to add a description?", - "nl": "Zijn er bijzonderheden die je wilt toevoegen?", - "de": "Möchten Sie eine Beschreibung hinzufügen?", - "ru": "Вы хотите добавить описание?", - "fr": "Voulez-vous ajouter une description ?", - "it": "Vuoi aggiungere una descrizione?", - "id": "Apakah Anda ingin menambahkan deskripsi?" - }, - "render": "{description}", - "freeform": { - "key": "description" - }, - "id": "viewpoint-description" - } - ] + { + "color": "#ffffff", + "width": "5" + } + ] } \ No newline at end of file diff --git a/assets/layers/village_green/village_green.json b/assets/layers/village_green/village_green.json index 9aa60fca48..061ea1612a 100644 --- a/assets/layers/village_green/village_green.json +++ b/assets/layers/village_green/village_green.json @@ -1,39 +1,48 @@ { - "id": "village_green", - "name": { - "nl": "Speelweide" + "id": "village_green", + "name": { + "nl": "Speelweide" + }, + "source": { + "osmTags": "landuse=village_green" + }, + "minzoom": 0, + "title": { + "render": { + "nl": "Speelweide" }, - "source": { - "osmTags": "landuse=village_green" - }, - "minzoom": 0, - "title": { - "render": { - "nl": "Speelweide" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "nl": "{name}" - } - } - ] - }, - "icon": "./assets/themes/playgrounds/playground.svg", - "iconSize": "40,40,center", - "width": "1", - "color": "#937f20", - "wayHandling": 2, - "tagRenderings": [ - "images", - { - "id": "village_green-explanation", - "render": "Dit is een klein stukje openbaar groen waar je mag spelen, picnicken, zitten, ..." - }, - { - "id": "village_green-reviews", - "render": "{reviews(name, landuse=village_green )}" + "mappings": [ + { + "if": "name~*", + "then": { + "nl": "{name}" } + } ] + }, + "tagRenderings": [ + "images", + { + "id": "village_green-explanation", + "render": "Dit is een klein stukje openbaar groen waar je mag spelen, picnicken, zitten, ..." + }, + { + "id": "village_green-reviews", + "render": "{reviews(name, landuse=village_green )}" + } + ], + "mapRendering": [ + { + "icon": "./assets/themes/playgrounds/playground.svg", + "iconSize": "40,40,center", + "location": [ + "point", + "centroid" + ] + }, + { + "color": "#937f20", + "width": "1" + } + ] } \ No newline at end of file diff --git a/assets/layers/visitor_information_centre/visitor_information_centre.json b/assets/layers/visitor_information_centre/visitor_information_centre.json index 13b62e4583..8275a78c61 100644 --- a/assets/layers/visitor_information_centre/visitor_information_centre.json +++ b/assets/layers/visitor_information_centre/visitor_information_centre.json @@ -1,73 +1,77 @@ { - "id": "visitor_information_centre", - "name": { - "en": "Visitor Information Centre", - "nl": "Bezoekerscentrum", - "de": "Besucherinformationszentrum" - }, - "minzoom": 12, - "source": { - "osmTags": { - "and": [ - { - "or": [ - "information=visitor_centre", - "information=office" - ] - } - ] + "id": "visitor_information_centre", + "name": { + "en": "Visitor Information Centre", + "nl": "Bezoekerscentrum", + "de": "Besucherinformationszentrum" + }, + "minzoom": 12, + "source": { + "osmTags": { + "and": [ + { + "or": [ + "information=visitor_centre", + "information=office" + ] } + ] + } + }, + "title": { + "render": { + "nl": "{name}", + "en": "{name}", + "de": "{name}", + "ru": "{name}", + "eo": "{name}" }, - "title": { - "render": { - "nl": "{name}", - "en": "{name}", - "de": "{name}", - "ru": "{name}", - "eo": "{name}" + "mappings": [ + { + "if": { + "and": [ + "name:nl~*" + ] }, - "mappings": [ - { - "if": { - "and": [ - "name:nl~*" - ] - }, - "then": { - "nl": "{name:nl}" - } - }, - { - "if": { - "and": [ - "name~*" - ] - }, - "then": { - "nl": "{name}", - "en": "{name}", - "de": "{name}", - "ru": "{name}", - "eo": "{name}" - } - } - ] - }, - "description": { - "en": "A visitor center offers information about a specific attraction or place of interest where it is located.", - "nl": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd.", - "de": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet." - }, - "tagRenderings": [], - "icon": { + "then": { + "nl": "{name:nl}" + } + }, + { + "if": { + "and": [ + "name~*" + ] + }, + "then": { + "nl": "{name}", + "en": "{name}", + "de": "{name}", + "ru": "{name}", + "eo": "{name}" + } + } + ] + }, + "description": { + "en": "A visitor center offers information about a specific attraction or place of interest where it is located.", + "nl": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd.", + "de": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet." + }, + "tagRenderings": [], + "presets": [], + "mapRendering": [ + { + "icon": { "render": "./assets/layers/visitor_information_centre/information.svg" - }, - "iconSize": { + }, + "iconSize": { "render": "40,40,center" - }, - "color": { - "render": "#E64C00" - }, - "presets": [], - "wayHandling": 1 + }, + "location": [ + "point", + "centroid" + ] + } + ] } \ No newline at end of file diff --git a/assets/layers/waste_basket/waste_basket.json b/assets/layers/waste_basket/waste_basket.json index 3aee9637fd..49a365d2be 100644 --- a/assets/layers/waste_basket/waste_basket.json +++ b/assets/layers/waste_basket/waste_basket.json @@ -1,203 +1,211 @@ { - "id": "waste_basket", - "name": { + "id": "waste_basket", + "name": { + "en": "Waste Basket", + "nl": "Vuilnisbak", + "ru": "Контейнер для мусора", + "de": "Abfalleimer", + "eo": "Rubujo" + }, + "minzoom": 17, + "source": { + "osmTags": { + "and": [ + "amenity=waste_basket" + ] + } + }, + "title": { + "render": { + "en": "Waste Basket", + "nl": "Vuilnisbak", + "ru": "Контейнер для мусора", + "de": "Abfalleimer" + } + }, + "description": { + "en": "This is a public waste basket, thrash can, where you can throw away your thrash.", + "nl": "Dit is een publieke vuilnisbak waar je je afval kan weggooien.", + "de": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können." + }, + "tagRenderings": [ + { + "id": "waste-basket-waste-types", + "question": { + "en": "What kind of waste basket is this?", + "nl": "Wat voor soort vuilnisbak is dit?", + "de": "Um was für einen Abfalleimer handelt es sich?" + }, + "multiAnswer": true, + "mappings": [ + { + "if": "waste=", + "then": { + "en": "A waste basket for general waste", + "nl": "Een vuilnisbak voor zwerfvuil", + "de": "Ein Abfalleimer für allgemeinen Müll" + }, + "hideInAnswer": true + }, + { + "if": "waste=trash", + "then": { + "en": "A waste basket for general waste", + "nl": "Een vuilnisbak voor zwerfvuil", + "de": "Ein Abfalleimer für allgemeinen Müll" + } + }, + { + "if": "waste=dog_excrement", + "then": { + "en": "A waste basket for dog excrements", + "nl": "Een vuilnisbak specifiek voor hondenuitwerpselen", + "de": "Ein Abfalleimer für Hundekot" + } + }, + { + "if": "waste=cigarettes", + "then": { + "en": "A waste basket for cigarettes", + "nl": "Een vuilnisbak voor sigarettenpeuken", + "de": "Mülleimer für Zigaretten" + } + }, + { + "if": "waste=drugs", + "then": { + "en": "A waste basket for drugs", + "nl": "Een vuilnisbak voor (vervallen) medicatie en drugs", + "de": "Mülleimer für Drogen" + } + }, + { + "if": "waste=sharps", + "then": { + "en": "A waste basket for needles and other sharp objects", + "nl": "Een vuilnisbak voor injectienaalden en andere scherpe voorwerpen", + "de": "Ein Abfalleimer für Nadeln und andere scharfe Gegenstände" + } + } + ] + }, + { + "id": "dispensing_dog_bags", + "question": { + "en": "Does this waste basket have a dispenser for dog excrement bags?", + "nl": "Heeft deze vuilnisbak een verdeler voor hondenpoepzakjes?", + "de": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?" + }, + "condition": { + "or": [ + "waste=dog_excrement", + "waste=trash", + "waste=" + ] + }, + "mappings": [ + { + "if": { + "and": [ + "vending=dog_excrement_bag", + "not:vending=" + ] + }, + "then": { + "en": "This waste basket has a dispenser for (dog) excrement bags", + "nl": "Deze vuilnisbak heeft een verdeler voor hondenpoepzakjes", + "de": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel" + } + }, + { + "if": { + "and": [ + "not:vending=dog_excrement_bag", + "vending=" + ] + }, + "then": { + "en": "This waste basket does not have a dispenser for (dog) excrement bags", + "nl": "Deze vuilnisbak heeft geenverdeler voor hondenpoepzakjes", + "de": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel" + } + }, + { + "if": "vending=", + "then": { + "en": "This waste basket does not have a dispenser for (dog) excrement bags", + "nl": "Deze vuilnisbaak heeft waarschijnlijk geen verdeler voor hondenpoepzakjes", + "de": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel" + }, + "hideInAnwer": true + } + ] + } + ], + "presets": [ + { + "tags": [ + "amenity=waste_basket" + ], + "title": { "en": "Waste Basket", "nl": "Vuilnisbak", "ru": "Контейнер для мусора", "de": "Abfalleimer", "eo": "Rubujo" + }, + "presiceInput": { + "preferredBackground": "photo" + } + } + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity:={amenity}", + "amenity=" + ] }, - "minzoom": 17, - "source": { - "osmTags": { - "and": [ - "amenity=waste_basket" - ] - } - }, - "title": { - "render": { - "en": "Waste Basket", - "nl": "Vuilnisbak", - "ru": "Контейнер для мусора", - "de": "Abfalleimer" - } - }, - "description": { - "en": "This is a public waste basket, thrash can, where you can throw away your thrash.", - "nl": "Dit is een publieke vuilnisbak waar je je afval kan weggooien.", - "de": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können." - }, - "tagRenderings": [ - { - "id": "waste-basket-waste-types", - "question": { - "en": "What kind of waste basket is this?", - "nl": "Wat voor soort vuilnisbak is dit?", - "de": "Um was für einen Abfalleimer handelt es sich?" - }, - "multiAnswer": true, - "mappings": [ - { - "if": "waste=", - "then": { - "en": "A waste basket for general waste", - "nl": "Een vuilnisbak voor zwerfvuil", - "de": "Ein Abfalleimer für allgemeinen Müll" - }, - "hideInAnswer": true - }, - { - "if": "waste=trash", - "then": { - "en": "A waste basket for general waste", - "nl": "Een vuilnisbak voor zwerfvuil", - "de": "Ein Abfalleimer für allgemeinen Müll" - } - }, - { - "if": "waste=dog_excrement", - "then": { - "en": "A waste basket for dog excrements", - "nl": "Een vuilnisbak specifiek voor hondenuitwerpselen", - "de": "Ein Abfalleimer für Hundekot" - } - }, - { - "if": "waste=cigarettes", - "then": { - "en": "A waste basket for cigarettes", - "nl": "Een vuilnisbak voor sigarettenpeuken", - "de": "Mülleimer für Zigaretten" - } - }, - { - "if": "waste=drugs", - "then": { - "en": "A waste basket for drugs", - "nl": "Een vuilnisbak voor (vervallen) medicatie en drugs", - "de": "Mülleimer für Drogen" - } - }, - { - "if": "waste=sharps", - "then": { - "en": "A waste basket for needles and other sharp objects", - "nl": "Een vuilnisbak voor injectienaalden en andere scherpe voorwerpen", - "de": "Ein Abfalleimer für Nadeln und andere scharfe Gegenstände" - } - } - ] - }, - { - "id": "dispensing_dog_bags", - "question": { - "en": "Does this waste basket have a dispenser for dog excrement bags?", - "nl": "Heeft deze vuilnisbak een verdeler voor hondenpoepzakjes?", - "de": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?" - }, - "condition": { - "or": [ - "waste=dog_excrement", - "waste=trash", - "waste=" - ] - }, - "mappings": [ - { - "if": { - "and": [ - "vending=dog_excrement_bag", - "not:vending=" - ] - }, - "then": { - "en": "This waste basket has a dispenser for (dog) excrement bags", - "nl": "Deze vuilnisbak heeft een verdeler voor hondenpoepzakjes", - "de": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel" - } - }, - { - "if": { - "and": [ - "not:vending=dog_excrement_bag", - "vending=" - ] - }, - "then": { - "en": "This waste basket does not have a dispenser for (dog) excrement bags", - "nl": "Deze vuilbak heeft geen verdeler voor hondenpoepzakjes", - "de": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel" - } - }, - { - "if": "vending=", - "then": { - "en": "This waste basket does not have a dispenser for (dog) excrement bags", - "nl": "Deze vuilnisbak heeft geen verdeler voor hondenpoepzakjes", - "de": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel" - }, - "hideInAnwer": true - } - ] - } - ], - "icon": { + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + }, + "mapRendering": [ + { + "icon": { "render": "./assets/themes/waste_basket/waste_basket.svg" - }, - "width": { - "render": "8" - }, - "iconSize": { + }, + "iconSize": { "render": "40,40,center", "mappings": [ - { - "if": { - "and": [ - "amenity=waste_basket" - ] - }, - "then": { - "en": "Waste Basket", - "nl": "Vuilnisbak", - "ru": "Контейнер для мусора", - "de": "Abfalleimer", - "eo": "Rubujo" - } - } - ] - }, - "color": { - "render": "#00f" - }, - "presets": [ - { - "tags": [ + { + "if": { + "and": [ "amenity=waste_basket" - ], - "title": { - "en": "Waste Basket", - "nl": "Vuilnisbak", - "ru": "Контейнер для мусора", - "de": "Abfalleimer", - "eo": "Rubujo" + ] }, - "presiceInput": { - "preferredBackground": "photo" + "then": { + "en": "Waste Basket", + "nl": "Vuilnisbak", + "ru": "Контейнер для мусора", + "de": "Abfalleimer" } - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity:={amenity}", - "amenity=" - ] - }, - "neededChangesets": 1 + } + ] + }, + "location": [ + "point" + ] }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true + { + "color": { + "render": "#00f" + }, + "width": { + "render": "8" + } } + ] } \ No newline at end of file diff --git a/assets/layers/watermill/watermill.json b/assets/layers/watermill/watermill.json index 1804424a70..2654f82325 100644 --- a/assets/layers/watermill/watermill.json +++ b/assets/layers/watermill/watermill.json @@ -1,175 +1,180 @@ { - "id": "watermill", - "name": { - "nl": "Watermolens", - "en": "Watermill", - "de": "Wassermühle", - "ru": "Водяная мельница" - }, - "minzoom": 12, - "source": { - "osmTags": { - "and": [ - "man_made=watermill" - ] - } - }, - "title": { - "render": { - "nl": "Watermolens" - }, - "mappings": [ - { - "if": { - "and": [ - "name:nl~*" - ] - }, - "then": { - "nl": "{name:nl}" - } - }, - { - "if": { - "and": [ - "name~*" - ] - }, - "then": { - "nl": "{name}" - } - } - ] - }, - "description": { - "nl": "Watermolens" - }, - "tagRenderings": [ - "images", - { - "render": { - "nl": "De toegankelijkheid van dit gebied is: {access:description}" - }, - "question": { - "nl": "Is dit gebied toegankelijk?" - }, - "freeform": { - "key": "access:description" - }, - "mappings": [ - { - "if": { - "and": [ - "access=yes", - "fee=" - ] - }, - "then": { - "nl": "Vrij toegankelijk" - } - }, - { - "if": { - "and": [ - "access=no", - "fee=" - ] - }, - "then": { - "nl": "Niet toegankelijk" - } - }, - { - "if": { - "and": [ - "access=private", - "fee=" - ] - }, - "then": { - "nl": "Niet toegankelijk, want privégebied" - } - }, - { - "if": { - "and": [ - "access=permissive", - "fee=" - ] - }, - "then": { - "nl": "Toegankelijk, ondanks dat het privegebied is" - } - }, - { - "if": { - "and": [ - "access=guided", - "fee=" - ] - }, - "then": { - "nl": "Enkel toegankelijk met een gids of tijdens een activiteit" - } - }, - { - "if": { - "and": [ - "access=yes", - "fee=yes" - ] - }, - "then": { - "nl": "Toegankelijk mits betaling" - } - } - ], - "id": "Access tag" - }, - { - "render": { - "nl": "Beheer door {operator}" - }, - "question": { - "nl": "Wie beheert dit pad?" - }, - "freeform": { - "key": "operator" - }, - "mappings": [ - { - "if": { - "and": [ - "operator=Natuurpunt" - ] - }, - "then": { - "nl": "Dit gebied wordt beheerd door Natuurpunt" - } - }, - { - "if": { - "and": [ - "operator~(n|N)atuurpunt.*" - ] - }, - "then": { - "nl": "Dit gebied wordt beheerd door {operator}" - }, - "hideInAnswer": true - } - ], - "id": "Operator tag" - } - ], - "wayHandling": 1, - "icon": { - "render": "./assets/layers/watermill/watermill.svg" - }, - "iconSize": { - "render": "50,50,center" - }, - "color": { - "render": "#FFC0CB" + "id": "watermill", + "name": { + "nl": "Watermolens", + "en": "Watermill", + "de": "Wassermühle", + "ru": "Водяная мельница", + "id": "Kincir Air" + }, + "minzoom": 12, + "source": { + "osmTags": { + "and": [ + "man_made=watermill" + ] } + }, + "title": { + "render": { + "nl": "Watermolens" + }, + "mappings": [ + { + "if": { + "and": [ + "name:nl~*" + ] + }, + "then": { + "nl": "{name:nl}" + } + }, + { + "if": { + "and": [ + "name~*" + ] + }, + "then": { + "nl": "{name}" + } + } + ] + }, + "description": { + "nl": "Watermolens" + }, + "tagRenderings": [ + "images", + { + "render": { + "nl": "De toegankelijkheid van dit gebied is: {access:description}" + }, + "question": { + "nl": "Is dit gebied toegankelijk?" + }, + "freeform": { + "key": "access:description" + }, + "mappings": [ + { + "if": { + "and": [ + "access=yes", + "fee=" + ] + }, + "then": { + "nl": "Vrij toegankelijk" + } + }, + { + "if": { + "and": [ + "access=no", + "fee=" + ] + }, + "then": { + "nl": "Niet toegankelijk" + } + }, + { + "if": { + "and": [ + "access=private", + "fee=" + ] + }, + "then": { + "nl": "Niet toegankelijk, want privégebied" + } + }, + { + "if": { + "and": [ + "access=permissive", + "fee=" + ] + }, + "then": { + "nl": "Toegankelijk, ondanks dat het privegebied is" + } + }, + { + "if": { + "and": [ + "access=guided", + "fee=" + ] + }, + "then": { + "nl": "Enkel toegankelijk met een gids of tijdens een activiteit" + } + }, + { + "if": { + "and": [ + "access=yes", + "fee=yes" + ] + }, + "then": { + "nl": "Toegankelijk mits betaling" + } + } + ], + "id": "Access tag" + }, + { + "render": { + "nl": "Beheer door {operator}" + }, + "question": { + "nl": "Wie beheert dit pad?" + }, + "freeform": { + "key": "operator" + }, + "mappings": [ + { + "if": { + "and": [ + "operator=Natuurpunt" + ] + }, + "then": { + "nl": "Dit gebied wordt beheerd door Natuurpunt" + } + }, + { + "if": { + "and": [ + "operator~(n|N)atuurpunt.*" + ] + }, + "then": { + "nl": "Dit gebied wordt beheerd door {operator}" + }, + "hideInAnswer": true + } + ], + "id": "Operator tag" + } + ], + "mapRendering": [ + { + "icon": { + "render": "./assets/layers/watermill/watermill.svg" + }, + "iconSize": { + "render": "50,50,center" + }, + "location": [ + "point", + "centroid" + ] + } + ] } \ No newline at end of file diff --git a/assets/svg/blocked.svg b/assets/svg/blocked.svg index 36ac431e66..b552364073 100644 --- a/assets/svg/blocked.svg +++ b/assets/svg/blocked.svg @@ -2,828 +2,827 @@ - - - - - - image/svg+xml - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="86.927155mm" + height="94.009796mm" + viewBox="0 0 86.927157 94.009797" + version="1.1" + id="svg8" + sodipodi:docname="blocked.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + + + + + + image/svg+xml + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-116.61719,-98.361256)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/assets/svg/close.svg b/assets/svg/close.svg index ded2ef0e4e..9ccf69a14b 100644 --- a/assets/svg/close.svg +++ b/assets/svg/close.svg @@ -2,80 +2,79 @@ - - - - - - - - - image/svg+xml - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="100" + height="100" + viewBox="0 0 26.458333 26.458334" + version="1.1" + id="svg8" + sodipodi:docname="close.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets/svg/delete_not_allowed.svg b/assets/svg/delete_not_allowed.svg index 6f1b3a4865..e6e9d9322a 100644 --- a/assets/svg/delete_not_allowed.svg +++ b/assets/svg/delete_not_allowed.svg @@ -1,86 +1,85 @@ - - - - image/svg+xml - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + viewBox="0 -256 2801.2319 2801.2319" + id="svg3741" + version="1.1" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="2801.2319" + height="2801.2319" + sodipodi:docname="delete_not_allowed.svg"> + + + + image/svg+xml + + + + + + + cx="1405.9852" + cy="1149.9852" + id="circle4-3" + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:28.47442627;stroke-opacity:1" + r="1395.2467"/> - - + id="g881" + transform="matrix(1.255247,0,0,1.255247,149.11911,-316.26492)"> + + + + + + - diff --git a/assets/svg/gender_bi.svg b/assets/svg/gender_bi.svg index 9ae9cf5c19..033f83fadb 100644 --- a/assets/svg/gender_bi.svg +++ b/assets/svg/gender_bi.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/gender_female.svg b/assets/svg/gender_female.svg index 6af923135d..57b9e57b7f 100644 --- a/assets/svg/gender_female.svg +++ b/assets/svg/gender_female.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/gender_inter.svg b/assets/svg/gender_inter.svg index 95f3932de4..00be6806e5 100644 --- a/assets/svg/gender_inter.svg +++ b/assets/svg/gender_inter.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/gender_male.svg b/assets/svg/gender_male.svg index b70e6e50ac..ff408991d1 100644 --- a/assets/svg/gender_male.svg +++ b/assets/svg/gender_male.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/gender_queer.svg b/assets/svg/gender_queer.svg index c8bcf16b72..7073042e46 100644 --- a/assets/svg/gender_queer.svg +++ b/assets/svg/gender_queer.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/gender_trans.svg b/assets/svg/gender_trans.svg index d39540182a..6d6d3d4f99 100644 --- a/assets/svg/gender_trans.svg +++ b/assets/svg/gender_trans.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/hand.svg b/assets/svg/hand.svg index bbef4187a0..9e2c50c2c9 100644 --- a/assets/svg/hand.svg +++ b/assets/svg/hand.svg @@ -1,30 +1,29 @@ - - - - image/svg+xml - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://www.w3.org/2000/svg" + id="svg6" + height="39.557907" + width="28.561806" + version="1.1"> + + + + image/svg+xml + + + + + + + diff --git a/assets/svg/josm_logo.svg b/assets/svg/josm_logo.svg index 671e70faee..0922d76799 100644 --- a/assets/svg/josm_logo.svg +++ b/assets/svg/josm_logo.svg @@ -1,5 +1,6 @@ - JOSM Logotype 2019 diff --git a/assets/svg/liberapay.svg b/assets/svg/liberapay.svg new file mode 100644 index 0000000000..0374269c9a --- /dev/null +++ b/assets/svg/liberapay.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/assets/svg/license_info.json b/assets/svg/license_info.json index 4ac61d303e..136970870a 100644 --- a/assets/svg/license_info.json +++ b/assets/svg/license_info.json @@ -1,144 +1,4 @@ [ - { - "path": "Ornament-Horiz-0.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-0.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-1.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-1.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-2.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-2.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-3.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-3.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-4.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-4.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-5.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-5.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-6.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, - { - "path": "Ornament-Horiz-6.svg", - "license": "CC-BY", - "authors": [ - "Nightwolfdezines" - ], - "sources": [ - "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" - ] - }, { "path": "SocialImageForeground.svg", "license": "CC-BY-SA", @@ -715,12 +575,6 @@ "https://www.iconpacks.net/free-icon-pack/gender-107.html" ] }, - { - "path": "gender_intersekse.svg", - "license": "CC0", - "authors": [], - "sources": [] - }, { "path": "gender_male.svg", "license": "CC0", @@ -879,20 +733,22 @@ ], "sources": [] }, + { + "path": "liberapay.svg", + "license": "Logo (all rights reserved)", + "authors": [ + "LiberaPay" + ], + "sources": [ + "https://liberapay.com/" + ] + }, { "path": "loading.svg", "license": "CC0; trivial", "authors": [], "sources": [] }, - { - "path": "location-circle.svg", - "license": "CC0", - "authors": [ - "Pol Labaut" - ], - "sources": [] - }, { "path": "location-empty.svg", "license": "CC0", @@ -1019,14 +875,6 @@ "https://www.mapillary.com/" ] }, - { - "path": "min-zoom.svg", - "license": "CC0", - "authors": [ - "Hannah Declerck" - ], - "sources": [] - }, { "path": "min.svg", "license": "CC0; trivial", @@ -1203,14 +1051,6 @@ "authors": [], "sources": [] }, - { - "path": "plus-zoom.svg", - "license": "CC0", - "authors": [ - "Hannah Declerck" - ], - "sources": [] - }, { "path": "plus.svg", "license": "CC0; trivial", @@ -1411,6 +1251,22 @@ "https://www.onlinewebfonts.com/icon/197818" ] }, + { + "path": "teardrop.svg", + "license": "CC0", + "authors": [ + "Pieter Vander Vennet" + ], + "sources": [] + }, + { + "path": "teardrop_with_hole_green.svg", + "license": "CC0", + "authors": [ + "Pieter Vander Vennet" + ], + "sources": [] + }, { "path": "translate.svg", "license": "CC-BY-SA 3.0", diff --git a/assets/svg/loading.svg b/assets/svg/loading.svg index 27dc3ac6c0..d06aa4471c 100644 --- a/assets/svg/loading.svg +++ b/assets/svg/loading.svg @@ -1,78 +1,78 @@ - - - - image/svg+xml - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24.022156 24.021992" + version="1.1" + id="svg9" + sodipodi:docname="loading.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="24.022156" + height="24.021992"> + + + + image/svg+xml + + + + + + + + + + + diff --git a/assets/svg/move-arrows.svg b/assets/svg/move-arrows.svg index d7a8333f4e..d31f779ce6 100644 --- a/assets/svg/move-arrows.svg +++ b/assets/svg/move-arrows.svg @@ -2,114 +2,113 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="150.52238" + height="150" + viewBox="0 0 39.825713 39.687501" + version="1.1" + id="svg8" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="move-arrows.svg"> + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/assets/svg/move.svg b/assets/svg/move.svg index 806cb7d634..097261675f 100644 --- a/assets/svg/move.svg +++ b/assets/svg/move.svg @@ -1,7 +1,7 @@ - - move - - + + move + + diff --git a/assets/svg/move_confirm.svg b/assets/svg/move_confirm.svg index 5aa8ac888d..f38038b637 100644 --- a/assets/svg/move_confirm.svg +++ b/assets/svg/move_confirm.svg @@ -1,281 +1,280 @@ - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - move - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="20" + height="20" + viewBox="0 0 20 20" + version="1.1" + id="svg6" + sodipodi:docname="move_confirm.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + move + - + d="M19 10l-4-3v2h-4V5h2l-3-4-3 4h2v4H5V7l-4 3 4 3v-2h4v4H7l3 4 3-4h-2v-4h4v2l4-3z" + id="path4"/> + + + + diff --git a/assets/svg/move_not_allowed.svg b/assets/svg/move_not_allowed.svg index 1abd15a036..ace1ddd2a3 100644 --- a/assets/svg/move_not_allowed.svg +++ b/assets/svg/move_not_allowed.svg @@ -1,285 +1,284 @@ - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - move - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="20" + height="20" + viewBox="0 0 20 20" + version="1.1" + id="svg6" + sodipodi:docname="move_not_allowed.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + move + - - + d="M19 10l-4-3v2h-4V5h2l-3-4-3 4h2v4H5V7l-4 3 4 3v-2h4v4H7l3 4 3-4h-2v-4h4v2l4-3z" + id="path4"/> + + + + + diff --git a/assets/svg/osm-logo.svg b/assets/svg/osm-logo.svg index 982a4fb329..246a824401 100644 --- a/assets/svg/osm-logo.svg +++ b/assets/svg/osm-logo.svg @@ -2,7 +2,8 @@ - - - - image/svg+xml - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="97.287025" + height="97.287033" + viewBox="0 0 97.287025 97.287033" + version="1.1" + id="svg132" + style="fill:none" + sodipodi:docname="plus.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + + + + image/svg+xml + + + + + + + + diff --git a/assets/svg/relocation.svg b/assets/svg/relocation.svg index c9caaffcb4..44ca579a1a 100644 --- a/assets/svg/relocation.svg +++ b/assets/svg/relocation.svg @@ -1,61 +1,64 @@ image/svg+xml + rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> + + - \ No newline at end of file + d="M 15.968433,9.4957631 14.991526,8.5195302 V 6.1271188 c 0,-0.3705509 -0.303177,-0.6737288 -0.673729,-0.6737288 h -0.673728 c -0.370553,0 -0.67373,0.3031779 -0.67373,0.6737288 v 0.372572 L 11.622881,5.1535806 C 11.438954,4.9797587 11.270522,4.7796611 10.949152,4.7796611 c -0.321369,0 -0.489801,0.2000976 -0.67373,0.3739195 L 5.9298726,9.4957631 c -0.2102033,0.21896 -0.3705508,0.378636 -0.3705508,0.6737279 0,0.379309 0.2910508,0.673729 0.6737289,0.673729 h 0.6737287 v 4.042372 c 0,0.370553 0.303178,0.67373 0.6737289,0.67373 h 2.0211871 v -3.368645 c 0,-0.37055 0.303178,-0.673727 0.6737266,-0.673727 h 1.347459 c 0.37055,0 0.673728,0.303177 0.673728,0.673727 v 3.368645 h 2.021188 c 0.370552,0 0.673729,-0.303177 0.673729,-0.67373 V 10.84322 h 0.673729 c 0.382678,0 0.673729,-0.29442 0.673729,-0.673729 0,-0.2950919 -0.160347,-0.4547679 -0.370551,-0.6737279 z" + id="path2" + inkscape:connector-curvature="0" + style="stroke-width:0.67372882"/> + + + \ No newline at end of file diff --git a/assets/svg/scissors.svg b/assets/svg/scissors.svg index 7c8df5cd0d..584b512401 100644 --- a/assets/svg/scissors.svg +++ b/assets/svg/scissors.svg @@ -1 +1,6 @@ - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/assets/svg/teardrop.svg b/assets/svg/teardrop.svg new file mode 100644 index 0000000000..87cc9fc399 --- /dev/null +++ b/assets/svg/teardrop.svg @@ -0,0 +1,103 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/assets/svg/teardrop_with_hole_green.svg b/assets/svg/teardrop_with_hole_green.svg new file mode 100644 index 0000000000..88d908a607 --- /dev/null +++ b/assets/svg/teardrop_with_hole_green.svg @@ -0,0 +1,129 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/assets/tagRenderings/icons.json b/assets/tagRenderings/icons.json index c1b9d5e273..06b97f81ad 100644 --- a/assets/tagRenderings/icons.json +++ b/assets/tagRenderings/icons.json @@ -1,4 +1,11 @@ { + "defaultIcons": ["phonelink", + "emaillink", + "wikipedialink", + "osmlink", + "sharelink" + ], + "wikipedialink": { "render": "WP", "condition": { diff --git a/assets/tagRenderings/questions.json b/assets/tagRenderings/questions.json index 89a178c676..4415089c4b 100644 --- a/assets/tagRenderings/questions.json +++ b/assets/tagRenderings/questions.json @@ -1,7 +1,13 @@ { + "questions": { + "id": "questions" + }, "images": { "render": "{image_carousel()}{image_upload()}" }, + "export_as_gpx": { + "render": "{export_as_gpx()}" + }, "wikipedia": { "render": "{wikipedia():max-height:25rem}", "question": { @@ -361,6 +367,43 @@ "type": "opening_hours" } }, + "service:electricity": { + "#": "service:socket describes if a pub, restaurant or café offers electricity to their customers.", + "question": { + "en": "Does this amenity have electrical outlets, available to customers when they are inside?", + "nl": "Zijn er stekkers beschikbaar voor klanten die binnen zitten?" + }, + "mappings": [ + { + "then": { + "en": "There are plenty of domestic sockets available to customers seated indoors, where they can charge their electronics", + "nl": "Er zijn binnen veel stekkers beschikbaar voor klanten die electronica wensen op te laden" + }, + "if": "service:electricity=yes" + }, + { + "then": { + "en": "There are a few domestic sockets available to customers seated indoors, where they can charge their electronics", + "nl": "Er zijn binnen enkele stekkers beschikbaar voor klanten die electronica wensen op te laden" + }, + "if": "service:electricity=limited" + }, + { + "then": { + "en": "There are no sockets available indoors to customers, but charging might be possible if the staff is asked", + "nl": "Er zijn binnen geen stekkers beschikbaar, maar electronica opladen kan indien men dit aan het personeel vraagt" + }, + "if": "service:electricity=ask" + }, + { + "then": { + "en": "There are a no domestic sockets available to customers seated indoors", + "nl": "Er zijn binnen geen stekkers beschikbaar" + }, + "if": "service:electricity=no" + } + ] + }, "payment-options": { "question": { "en": "Which methods of payment are accepted here?", @@ -444,7 +487,7 @@ "fr": "Étage {level}", "pl": "Znajduje się na {level} piętrze", "sv": "Ligger på {level}:e våningen", - "pt": "Está no {nível}º andar", + "pt": "Está no {level}º andar", "eo": "En la {level}a etaĝo", "hu": "{level}. emeleten található", "it": "Si trova al piano numero {level}" diff --git a/assets/themes/aed/aed.json b/assets/themes/aed/aed.json index 8ca029588e..78513e08bc 100644 --- a/assets/themes/aed/aed.json +++ b/assets/themes/aed/aed.json @@ -13,7 +13,7 @@ "ru": "Открытая карта АВД (Автоматизированных внешних дефибрилляторов)", "ja": "オープンAEDマップ", "zh_Hant": "開放AED地圖", - "nb_NO": "Åpent AED-kart", + "nb_NO": "Åpne AED-kart", "sv": "Öppna AED-karta", "pl": "Otwórz mapę AED", "pt_BR": "Abrir mapa AED" diff --git a/assets/themes/aed/aed_brugge.json b/assets/themes/aed/aed_brugge.json index 2ccf774d84..c71b6f3f0d 100644 --- a/assets/themes/aed/aed_brugge.json +++ b/assets/themes/aed/aed_brugge.json @@ -15,9 +15,6 @@ "startLat": 51.25634, "startLon": 3.195682, "startZoom": 12, - "clustering": { - "maxZoom": 0 - }, "layers": [ "defibrillator", { @@ -33,21 +30,32 @@ "_has_closeby_feature=Number(feat.properties._closest_osm_aed_distance) < 25 ? 'yes' : 'no'" ], "title": "AED in Brugse dataset", - "icon": { - "render": "circle:red", - "mappings": [ - { - "if": "_has_closeby_feature=yes", - "then": "circle:#008000aa" - } - ] - }, - "iconSize": "20,20,center", "tagRenderings": [ "all_tags" + ], + "mapRendering": [ + { + "icon": { + "render": "circle:red", + "mappings": [ + { + "if": "_has_closeby_feature=yes", + "then": "circle:#008000aa" + } + ] + }, + "iconSize": "20,20,center", + "location": [ + "point" + ] + }, + {} ] } ], "hideFromOverview": true, - "defaultBackgroundId": "HDM_HOT" + "defaultBackgroundId": "HDM_HOT", + "clustering": { + "maxZoom": 0 + } } \ No newline at end of file diff --git a/assets/themes/artwork/artwork.json b/assets/themes/artwork/artwork.json index 87b8746117..86fe60be29 100644 --- a/assets/themes/artwork/artwork.json +++ b/assets/themes/artwork/artwork.json @@ -19,7 +19,7 @@ "en": "Welcome to Open Artwork Map, a map of statues, busts, grafittis and other artwork all over the world", "nl": "Welkom op de open kunstwerken-kaart, een kaart van standbeelden, bustes, graffiti en andere kunstwerken over de hele wereld", "fr": "Bienvenue sur la carte ouverte des œuvres d'art, une carte des statues, fresques, ... du monde entier", - "de": "Willkommen bei der Freien Kunstwerk-Karte, einer Karte von Statuen, Büsten, Grafitti, ... auf der ganzen Welt", + "de": "Willkommen bei der Freien Kunst-Karte, einer Karte mit Statuen, Büsten, Grafitti, ... auf der ganzen Welt", "id": "Selamat datang di Open Artwork Map, peta untuk patung, grafiti, dan karya seni lain di seluruh dunia", "it": "Benvenuto/a sulla mappa libera dell’arte, una mappa delle statue, i busti, i graffiti e le altre realizzazioni artistiche di tutto il mondo", "ru": "Добро пожаловать на Open Artwork Map, карту статуй, бюстов, граффити и других произведений искусства по всему миру", diff --git a/assets/themes/benches/benches.json b/assets/themes/benches/benches.json index eef8c2dc50..4aa4a6627e 100644 --- a/assets/themes/benches/benches.json +++ b/assets/themes/benches/benches.json @@ -10,7 +10,8 @@ "ja": "ベンチ", "zh_Hant": "長椅", "nb_NO": "Benker", - "pt_BR": "Bancadas" + "pt_BR": "Bancadas", + "id": "Bangku" }, "shortDescription": { "en": "A map of benches", @@ -44,7 +45,8 @@ "ja", "zh_Hant", "nb_NO", - "pt_BR" + "pt_BR", + "id" ], "maintainer": "Florian Edelmann", "icon": "./assets/themes/benches/bench_poi.svg", diff --git a/assets/themes/bookcases/bookcases.json b/assets/themes/bookcases/bookcases.json index 93a1d9f991..252f510485 100644 --- a/assets/themes/bookcases/bookcases.json +++ b/assets/themes/bookcases/bookcases.json @@ -29,7 +29,7 @@ "description": { "en": "A public bookcase is a small streetside cabinet, box, old phone boot or some other objects where books are stored. Everyone can place or take a book. This map aims to collect all these bookcases. You can discover new bookcases nearby and, with a free OpenStreetMap account, quickly add your favourite bookcases.", "nl": "Een boekenruilkast is een kastje waar iedereen een boek kan nemen of achterlaten. Op deze kaart kan je deze boekenruilkasten terugvinden en met een gratis OpenStreetMap-account, ook boekenruilkasten toevoegen of informatie verbeteren", - "de": "Ein Bücherschrank ist ein kleiner Schaltschrank, eine alte Telefonzelle oder eine andere Einrichtung, in der Bücher aufbewahrt werden. Jeder kann ein Buch hinstellen oder mitnehmen. Diese Karte zielt darauf ab, alle Orte mit Bücherschränken zu sammeln. Sie können neue Bücherschränke in der Nähe entdecken und mit einem kostenlosen OpenStreetMap-Konto schnell Ihre Lieblingsbücherschränke hinzufügen.", + "de": "Bücherschränke sind alte Schaltschränke, Telefonzellen oder andere Einrichtungen, zur Aufbewahrung von Büchern. Jeder kann Bücher abstellen oder mitnehmen. Die Karte zielt darauf ab, alle Orte mit Bücherschränken zu sammeln. Sie können neue Bücherschränke in der Nähe entdecken und mit einem kostenlosen OpenStreetMap-Konto schnell Ihre Lieblingsbücherschränke hinzufügen.", "fr": "Une microbibliothèques, également appelée boite à livre, est un élément de mobilier urbain (étagère, armoire, etc) dans lequel sont stockés des livres et autres objets en accès libre. Découvrez les boites à livres prêt de chez vous, ou ajouter en une nouvelle à l'aide de votre compte OpenStreetMap.", "ru": "Общественный книжный шкаф - это небольшой уличный шкаф, коробка, старый телефонный аппарат или другие предметы, где хранятся книги. Каждый может положить или взять книгу. Цель этой карты - собрать все эти книжные шкафы. Вы можете обнаружить новые книжные шкафы поблизости и, имея бесплатный аккаунт OpenStreetMap, быстро добавить свои любимые книжные шкафы.", "ja": "公共の本棚とは、本が保管されている小さな街角のキャビネット、箱、古い電話のトランク、その他の物のことです。誰でも本を置いたり持ったりすることができます。このマップは、すべての公共の本棚を収集することを目的としています。近くで新しい本棚を見つけることができ、無料のOpenStreetMapアカウントを使えば、お気に入りの本棚を簡単に追加できます。", diff --git a/assets/themes/buurtnatuur/buurtnatuur.json b/assets/themes/buurtnatuur/buurtnatuur.json index 0f1c8648a0..e331bdf604 100644 --- a/assets/themes/buurtnatuur/buurtnatuur.json +++ b/assets/themes/buurtnatuur/buurtnatuur.json @@ -74,42 +74,6 @@ "tagRenderings": [ "images" ], - "icon": { - "render": "circle:#ffffff;./assets/themes/buurtnatuur/nature_reserve.svg" - }, - "width": { - "render": "5" - }, - "iconSize": { - "render": "50,50,center" - }, - "color": { - "render": "#3c3", - "mappings": [ - { - "if": { - "and": [ - "name=", - "noname=", - "operator=", - "access=", - "access:description=", - "leisure=park" - ] - }, - "then": "#cc1100" - }, - { - "if": { - "and": [ - "name=", - "noname=" - ] - }, - "then": "#fccb37" - } - ] - }, "presets": [ { "tags": [ @@ -123,6 +87,51 @@ "nl": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt" } } + ], + "mapRendering": [ + { + "icon": { + "render": "circle:#ffffff;./assets/themes/buurtnatuur/nature_reserve.svg" + }, + "iconSize": { + "render": "50,50,center" + }, + "location": [ + "point" + ] + }, + { + "color": { + "render": "#3c3", + "mappings": [ + { + "if": { + "and": [ + "name=", + "noname=", + "operator=", + "access=", + "access:description=", + "leisure=park" + ] + }, + "then": "#cc1100" + }, + { + "if": { + "and": [ + "name=", + "noname=" + ] + }, + "then": "#fccb37" + } + ] + }, + "width": { + "render": "5" + } + } ] }, { @@ -185,29 +194,6 @@ "tagRenderings": [ "images" ], - "icon": { - "render": "circle:#ffffff;./assets/themes/buurtnatuur/park.svg" - }, - "width": { - "render": "5" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#3c3", - "mappings": [ - { - "if": { - "and": [ - "name=", - "noname=" - ] - }, - "then": "#fccb37" - } - ] - }, "presets": [ { "tags": [ @@ -221,6 +207,38 @@ "nl": "Voeg een ontbrekend park toe" } } + ], + "mapRendering": [ + { + "icon": { + "render": "circle:#ffffff;./assets/themes/buurtnatuur/park.svg" + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point" + ] + }, + { + "color": { + "render": "#3c3", + "mappings": [ + { + "if": { + "and": [ + "name=", + "noname=" + ] + }, + "then": "#fccb37" + } + ] + }, + "width": { + "render": "5" + } + } ] }, { @@ -284,47 +302,6 @@ "tagRenderings": [ "images" ], - "icon": { - "render": "circle:#ffffff;./assets/themes/buurtnatuur/forest.svg" - }, - "width": { - "render": "5" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#3a3", - "mappings": [ - { - "if": { - "and": [ - "operator=", - "access=", - "access:description=" - ] - }, - "then": "#cc1100" - }, - { - "if": { - "and": [ - "operator=" - ] - }, - "then": "#cccc00" - }, - { - "if": { - "and": [ - "name=", - "noname=" - ] - }, - "then": "#fccb37" - } - ] - }, "presets": [ { "tags": [ @@ -338,6 +315,56 @@ "nl": "Voeg een ontbrekend bos toe aan de kaart" } } + ], + "mapRendering": [ + { + "icon": { + "render": "circle:#ffffff;./assets/themes/buurtnatuur/forest.svg" + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point" + ] + }, + { + "color": { + "render": "#3a3", + "mappings": [ + { + "if": { + "and": [ + "operator=", + "access=", + "access:description=" + ] + }, + "then": "#cc1100" + }, + { + "if": { + "and": [ + "operator=" + ] + }, + "then": "#cccc00" + }, + { + "if": { + "and": [ + "name=", + "noname=" + ] + }, + "then": "#fccb37" + } + ] + }, + "width": { + "render": "5" + } + } ] }, "viewpoint" @@ -531,7 +558,7 @@ } }, { - "id": "Non-editable description {description}", + "id": "Non-editable description", "render": { "nl": "Extra info: {description}" }, @@ -540,7 +567,7 @@ } }, { - "id": "Editable description {description:0}", + "id": "Editable description", "question": "Is er extra info die je kwijt wil?
De naam van het gebied wordt in de volgende vraag gesteld", "render": { "nl": "Extra info via buurtnatuur.be: {description:0}" diff --git a/assets/themes/cafes_and_pubs/cafes_and_pubs.json b/assets/themes/cafes_and_pubs/cafes_and_pubs.json index f9dc739a90..206e1fa0e8 100644 --- a/assets/themes/cafes_and_pubs/cafes_and_pubs.json +++ b/assets/themes/cafes_and_pubs/cafes_and_pubs.json @@ -5,7 +5,8 @@ "en": "Cafés and pubs", "de": "Cafés und Kneipen", "it": "Caffè e pub", - "nb_NO": "Kafeer og kneiper" + "nb_NO": "Kafeer og kneiper", + "id": "Kafe dan pub" }, "description": { "nl": "Cafés, kroegen en drinkgelegenheden" @@ -15,7 +16,8 @@ "en", "de", "it", - "nb_NO" + "nb_NO", + "id" ], "maintainer": "", "icon": "./assets/layers/cafe_pub/pub.svg", diff --git a/assets/themes/campersite/campersite.json b/assets/themes/campersite/campersite.json index 8f6d236f87..e69fe6b96f 100644 --- a/assets/themes/campersite/campersite.json +++ b/assets/themes/campersite/campersite.json @@ -128,7 +128,7 @@ "it": "Questo luogo è chiamato {name}", "ru": "Это место называется {name}", "ja": "この場所は {name} と呼ばれています", - "fr": "Cet endroit s'appelle {nom}", + "fr": "Cet endroit s'appelle {name}", "zh_Hant": "這個地方叫做 {name}", "nl": "Deze plaats heet {name}", "pt_BR": "Este lugar é chamado de {name}", @@ -180,8 +180,7 @@ "nl": "Gebruik is betalend", "fr": "L’utilisation est payante", "pt_BR": "Você precisa pagar para usar", - "de": "Sie müssen für die Nutzung bezahlen", - "nb_NO": "Man må betale for bruk" + "de": "Sie müssen für die Nutzung bezahlen" } }, { @@ -336,8 +335,7 @@ "fr": "Cet endroit offre-t-il un accès à Internet ?", "zh_Hant": "這個地方有提網路連線嗎?", "pt_BR": "Este lugar fornece acesso a internet?", - "de": "Ist an diesem Ort ein Internetzugang vorhanden?", - "nb_NO": "Tilbyr dette stedet tilgang til Internett?" + "de": "Ist an diesem Ort ein Internetzugang vorhanden?" }, "mappings": [ { @@ -356,8 +354,7 @@ "fr": "Il y a un accès internet", "pt_BR": "Há acesso à internet", "de": "Internetzugang ist vorhanden", - "nl": "Er is internettoegang", - "nb_NO": "Det finnes tilgang til Internett" + "nl": "Er is internettoegang" } }, { @@ -377,8 +374,7 @@ "fr": "Il y a un accès internet", "pt_BR": "Há acesso à Internet", "de": "Internetzugang ist vorhanden", - "nl": "Er is internettoegang", - "nb_NO": "Det er tilgang til Internett" + "nl": "Er is internettoegang" }, "hideInAnswer": true }, @@ -397,8 +393,7 @@ "zh_Hant": "這裡沒有網路連線", "fr": "Il n’y a pas d’accès internet", "pt_BR": "Não há acesso à internet", - "de": "Kein Internetzugang vorhanden", - "nb_NO": "Det er tilgang til Internett" + "de": "Kein Internetzugang vorhanden" } } ] @@ -413,8 +408,7 @@ "zh_Hant": "你需要為網路連線付費嗎?", "fr": "L’accès internet est-il payant ?", "pt_BR": "Você tem que pagar pelo acesso à internet?", - "de": "Ist der Internetzugang gebührenpflichtig?", - "nb_NO": "Må man betale for tilgang til Internett?" + "de": "Ist der Internetzugang gebührenpflichtig?" }, "mappings": [ { @@ -431,8 +425,7 @@ "zh_Hant": "你需要額外付費來使用網路連線", "fr": "L’accès internet est en supplément", "pt_BR": "Você precisa pagar um extra pelo acesso à internet", - "de": "Der Internetzugang ist gebührenpflichtig", - "nb_NO": "Man må betale ekstra for tilgang til Internett" + "de": "Der Internetzugang ist gebührenpflichtig" } }, { @@ -449,8 +442,7 @@ "zh_Hant": "你不需要額外付費來使用網路連線", "fr": "L’accès internet est inclus", "pt_BR": "Você não precisa pagar um extra pelo acesso à internet", - "de": "Der Internetzugang ist kostenlos", - "nb_NO": "Man må ikke betale ekstra for tilgang til Internett" + "de": "Der Internetzugang ist kostenlos" } } ], @@ -643,28 +635,6 @@ "questions", "reviews" ], - "icon": { - "render": "circle:white;./assets/themes/campersite/caravan.svg", - "mappings": [ - { - "if": { - "and": [ - "fee=no" - ] - }, - "then": "circle:white;./assets/themes/campersite/caravan_green.svg" - } - ] - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -687,12 +657,43 @@ "ja": "新しい公式キャンプサイトを追加します。お客様のキャンピングカーで一泊する指定の場所です。本物のキャンプのように見えるかもしれないし、単なる駐車場のように見えるかもしれない。それらは全く署名されていないかもしれませんが、自治体の決定で定義されているだけです。夜を過ごすことが予想されないキャンパー向けの通常の駐車場は、キャンプサイトではない ", "it": "Aggiungi una nuova area di sosta ufficiale per camper. Si tratta di aree destinate alla sosta notturna dei camper. Potrebbe trattarsi di luoghi di campeggio o semplici parcheggi. Potrebbero anche non essere segnalati sul posto, ma semplicemente indicati in una delibera comunale. Un parcheggio destinato ai camper in cui non è però consentito trascorrere la notte -non- va considerato un'area di sosta per camper. ", "fr": "Ajouter une nouvelle aire de camping officielle, destinée à y passer la nuit avec un camping-car. Elle ne nécessite pas d’infrastructures particulières et peut être simplement désignée sous arrêté municipal, un simple parking ne suffit pas à rentrer dans cette catégorie ", - "de": "Fügen Sie einen neuen offiziellen Wohnmobilstellplatz hinzu. Dies sind ausgewiesene Plätze, an denen Sie in Ihrem Wohnmobil übernachten können. Sie können wie ein richtiger Campingplatz oder nur wie ein Parkplatz aussehen. Möglicherweise sind sie gar nicht ausgeschildert, sondern nur in einem Gemeindebeschluss festgelegt. Ein normaler Parkplatz für Wohnmobile, auf dem Übernachten nicht zulässig ist, ist kein Wohnmobilstellplatz. ", + "de": "Fügen Sie einen neuen offiziellen Wohnmobilstellplatz hinzu. Dies sind ausgewiesene Plätze, an denen Sie in Ihrem Wohnmobil übernachten können. Sie können wie ein richtiger Campingplatz oder nur wie ein Parkplatz aussehen. Möglicherweise sind sie gar nicht ausgeschildert, sondern nur in einem Gemeindebeschluss festgelegt. Ein normaler Parkplatz für Wohnmobile, auf dem übernachten nicht zulässig ist, ist kein Wohnmobilstellplatz. ", "nl": "Voeg een nieuwe officiële camperplaats toe. Dit zijn speciaal aangeduide plaatsen waar het toegestaan is om te overnachten met een camper. Ze kunnen er uitzien als een parking, of soms eerder als een camping. Soms staan ze niet ter plaatse aangeduid, maar heeft de gemeente wel degelijk beslist dat dit een camperplaats is. Een parking voor campers waar je niet mag overnachten is géén camperplaats. " } } ], - "wayHandling": 2 + "mapRendering": [ + { + "icon": { + "render": "circle:white;./assets/themes/campersite/caravan.svg", + "mappings": [ + { + "if": { + "and": [ + "fee=no" + ] + }, + "then": "circle:white;./assets/themes/campersite/caravan_green.svg" + } + ] + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#00f" + }, + "width": { + "render": "8" + } + } + ] }, { "id": "dumpstations", @@ -1059,18 +1060,6 @@ "id": "dumpstations-network" } ], - "icon": { - "render": "circle:white;./assets/themes/campersite/sanitary_dump_station.svg" - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "32,32,center" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -1091,6 +1080,27 @@ "de": "Fügen Sie eine neue sanitäre Entsorgungsstation hinzu. Hier können Camper Abwasser oder chemischen Toilettenabfälle entsorgen. Oft gibt es auch Trinkwasser und Strom." } } + ], + "mapRendering": [ + { + "icon": { + "render": "circle:white;./assets/themes/campersite/sanitary_dump_station.svg" + }, + "iconSize": { + "render": "32,32,center" + }, + "location": [ + "point" + ] + }, + { + "color": { + "render": "#00f" + }, + "width": { + "render": "8" + } + } ] } ], diff --git a/assets/themes/climbing/climbing.json b/assets/themes/climbing/climbing.json index 61263d3c4a..613f76d697 100644 --- a/assets/themes/climbing/climbing.json +++ b/assets/themes/climbing/climbing.json @@ -13,7 +13,7 @@ }, "description": { "nl": "Op deze kaart vind je verschillende klimgelegenheden, zoals klimzalen, bolderzalen en klimmen in de natuur", - "de": "Eine Karte mit verschiedenen Klettermöglichkeiten wie Kletterhallen, Kletterparks oder Felsen in der Natur.", + "de": "Eine Karte mit Klettermöglichkeiten wie Kletterhallen, Kletterparks oder Felsen.", "en": "On this map you will find various climbing opportunities such as climbing gyms, bouldering halls and rocks in nature.", "ru": "На этой карте вы найдете различные возможности для скалолазания, такие как скалодромы, залы для боулдеринга и скалы на природе.", "ja": "この地図には、自然の中のクライミングジム、ボルダリングホール、岩など、さまざまなクライミングの機会があります。", @@ -159,25 +159,6 @@ "phone", "opening_hours" ], - "icon": { - "render": "./assets/themes/climbing/club.svg" - }, - "iconOverlays": [ - { - "if": "opening_hours~*", - "then": "isOpen", - "badge": true - } - ], - "width": { - "render": "8" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -228,7 +209,26 @@ } } ], - "wayHandling": 1 + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/climbing/club.svg" + }, + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "isOpen" + } + ], + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point", + "centroid" + ] + } + ] }, { "id": "climbing_gym", @@ -318,21 +318,26 @@ "opening_hours", "reviews" ], - "icon": { - "render": "./assets/themes/climbing/climbing_gym.svg" - }, - "iconOverlays": [ + "mapRendering": [ { - "if": "opening_hours~*", - "then": "isOpen", - "badge": true + "icon": { + "render": "./assets/themes/climbing/climbing_gym.svg" + }, + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "isOpen" + } + ], + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point", + "centroid" + ] } - ], - "width": "0", - "iconSize": { - "render": "40,40,center" - }, - "wayHandling": 1 + ] }, { "id": "climbing_route", @@ -539,18 +544,6 @@ }, "reviews" ], - "icon": { - "render": "circle:white;./assets/themes/climbing/climbing_route.svg" - }, - "width": { - "render": "4" - }, - "iconSize": { - "render": "28,28,center" - }, - "color": { - "render": "#0f0" - }, "presets": [ { "title": { @@ -566,7 +559,28 @@ ] } ], - "wayHandling": 2 + "mapRendering": [ + { + "icon": { + "render": "circle:white;./assets/themes/climbing/climbing_route.svg" + }, + "iconSize": { + "render": "28,28,center" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#0f0" + }, + "width": { + "render": "4" + } + } + ] }, { "id": "climbing", @@ -699,7 +713,7 @@ "it": "

Contiene {_contained_climbing_routes_count} vie

    {_contained_climbing_routes}
" }, "condition": "_contained_climbing_routes~*", - "id": "Containe {_contained_climbing_routes_count} routes" + "id": "Contained_climbing_routes" }, { "render": { @@ -810,18 +824,6 @@ }, "reviews" ], - "icon": { - "render": "./assets/themes/climbing/climbing_no_rope.svg" - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#d38d5fAA" - }, "presets": [ { "tags": [ @@ -847,7 +849,6 @@ } } ], - "wayHandling": 2, "calculatedTags": [ "_contained_climbing_routes_properties=feat.overlapWith('climbing_route').map(f => f.feat.properties).map(p => {return {id: p.id, name: p.name, 'climbing:grade:french': p['climbing:grade:french'], 'climbing:length': p['climbing:length']} })", "_contained_climbing_routes=JSON.parse(feat.properties._contained_climbing_routes_properties ?? '[]').map(p => `
  • ${p.name ?? 'climbing route'} (${p['climbing:grade:french'] ?? 'unknown difficulty'}, ${p['climbing:length'] ?? 'unkown length'} meter)
  • `).join('')", @@ -855,6 +856,28 @@ "_difficulty_hist=JSON.parse(feat.properties._contained_climbing_routes_properties ?? '[]').map(p => p['climbing:grade:french'])", "_length_hist=JSON.parse(feat.properties._contained_climbing_routes_properties ?? '[]').map(p => p['climbing:length'])", "_contained_climbing_routes_count=JSON.parse(feat.properties._contained_climbing_routes_properties ?? '[]').length" + ], + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/climbing/climbing_no_rope.svg" + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#d38d5fAA" + }, + "width": { + "render": "8" + } + } ] }, { @@ -985,14 +1008,23 @@ ] } ], - "icon": "./assets/themes/climbing/climbing_unknown.svg", - "width": { - "render": "2" - }, - "color": { - "render": "#ddff55AA" - }, - "wayHandling": 0 + "mapRendering": [ + { + "icon": "./assets/themes/climbing/climbing_unknown.svg", + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#ddff55AA" + }, + "width": { + "render": "2" + } + } + ] } ], "overrideAll": { @@ -1303,7 +1335,7 @@ "it": "Qual è il livello della via più difficile qua, secondo il sistema di classificazione francese?" }, "render": { - "de": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:min} (französisch/belgisches System)", + "de": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:max} (französisch/belgisches System)", "en": "The maximal difficulty is {climbing:grade:french:max} according to the french/belgian system", "nl": "De maximale klimmoeilijkheid is {climbing:grade:french:max} volgens het Franse/Belgische systeem", "ja": "フランス/ベルギーのランク評価システムでは、最大の難易度は{climbing:grade:french:max}です", diff --git a/assets/themes/cycle_highways/cycle_highways.json b/assets/themes/cycle_highways/cycle_highways.json index 1660360f6d..266312e591 100644 --- a/assets/themes/cycle_highways/cycle_highways.json +++ b/assets/themes/cycle_highways/cycle_highways.json @@ -104,8 +104,7 @@ ], "name": { "en": "cycle highways", - "de": "Radschnellwege", - "it": "strade per velocipedi" + "de": "Radschnellwege" }, "source": { "osmTags": "cycle_network=BE-VLG:cycle_highway" @@ -114,43 +113,9 @@ "title": { "render": { "en": "cycle highway", - "de": "Radschnellweg", - "it": "strada per velocipedi" + "de": "Radschnellweg" } }, - "width": { - "render": "4" - }, - "color": { - "render": "#ff7392", - "mappings": [ - { - "if": "state=", - "then": "#00acfc" - }, - { - "if": "state=temporary", - "then": "#00acfc" - } - ] - }, - "dashArray": { - "render": "", - "mappings": [ - { - "if": "state=temporary", - "then": "12 10" - }, - { - "if": "note:state=has_highway_no", - "then": "0 8" - }, - { - "if": "note:state=has_highway_under_construction", - "then": "12 10" - } - ] - }, "filter": [ { "id": "name-alt", @@ -238,6 +203,43 @@ } ] } + ], + "mapRendering": [ + { + "color": { + "render": "#ff7392", + "mappings": [ + { + "if": "state=", + "then": "#00acfc" + }, + { + "if": "state=temporary", + "then": "#00acfc" + } + ] + }, + "width": { + "render": "4" + }, + "dashArray": { + "render": "", + "mappings": [ + { + "if": "state=temporary", + "then": "12 10" + }, + { + "if": "note:state=has_highway_no", + "then": "0 8" + }, + { + "if": "note:state=has_highway_under_construction", + "then": "12 10" + } + ] + } + } ] } ], diff --git a/assets/themes/cycle_infra/license_info.json b/assets/themes/cycle_infra/license_info.json index bdf527c7b3..d750dfa3f7 100644 --- a/assets/themes/cycle_infra/license_info.json +++ b/assets/themes/cycle_infra/license_info.json @@ -89,26 +89,6 @@ "https://commons.wikimedia.org/wiki/File:Belgian_traffic_sign_M7.svg" ] }, - { - "path": "Cycle_barrier_angular.png", - "license": "CC-BY-SA 4.0", - "authors": [ - "Supaplex030" - ], - "sources": [ - "https://wiki.openstreetmap.org/wiki/File:Cycle_barrier_angular.png" - ] - }, - { - "path": "Cycle_barrier_double.png", - "license": "CC-BY-SA 4.0", - "authors": [ - "Supaplex030" - ], - "sources": [ - "https://wiki.openstreetmap.org/wiki/File:Cycle_barrier_double.png" - ] - }, { "path": "Cycle_barrier_double.svg", "license": "CC0", diff --git a/assets/themes/cyclestreets/cyclestreets.json b/assets/themes/cyclestreets/cyclestreets.json index b935cc4801..a91d3af700 100644 --- a/assets/themes/cyclestreets/cyclestreets.json +++ b/assets/themes/cyclestreets/cyclestreets.json @@ -21,7 +21,7 @@ }, "description": { "nl": "Een fietsstraat is een straat waar
    • automobilisten geen fietsers mogen inhalen
    • Er een maximumsnelheid van 30km/u geldt
    • Fietsers gemotoriseerde voertuigen links mogen inhalen
    • Fietsers nog steeds voorrang aan rechts moeten verlenen - ook aan auto's en voetgangers op het zebrapad


    Op deze open kaart kan je alle gekende fietsstraten zien en kan je ontbrekende fietsstraten aanduiden. Om de kaart aan te passen, moet je je aanmelden met OpenStreetMap en helemaal inzoomen tot straatniveau. ", - "en": "A cyclestreet is a street where motorized traffic is not allowed to overtake cyclists. They are signposted by a special traffic sign. Cyclestreets can be found in the Netherlands and Belgium, but also in Germany and France. ", + "en": "A cyclestreet is is a street where motorized traffic is not allowed to overtake cyclists. They are signposted by a special traffic sign. Cyclestreets can be found in the Netherlands and Belgium, but also in Germany and France. ", "ja": "cyclestreetとは、自動車がサイクリストを追い越すことができない道です。専用の道路標識で表示されます。Cyclestreetsはオランダやベルギーにもありますが、ドイツやフランスにもあります。 ", "zh_Hant": "單車街道是機動車輛受限制,只允許單車通行的道路。通常會有路標顯示特別的交通指標。單車街道通常在荷蘭、比利時看到,但德國與法國也有。 ", "de": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr Radfahrer nicht überholen darf. Sie sind durch ein spezielles Verkehrsschild gekennzeichnet. Fahrradstraßen gibt es in den Niederlanden und Belgien, aber auch in Deutschland und Frankreich. ", @@ -85,11 +85,20 @@ "de": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr einen Radfahrer nicht überholen darf" }, "title": "{name}", - "icon": "./assets/themes/cyclestreets/F111.svg", - "color": "#0000ff", - "width": "10", "tagRenderings": [ "images" + ], + "mapRendering": [ + { + "icon": "./assets/themes/cyclestreets/F111.svg", + "location": [ + "point" + ] + }, + { + "color": "#0000ff", + "width": "10" + } ] }, { @@ -112,7 +121,6 @@ "nb_NO": "Denne gaten vil bli sykkelgate snart" }, "minzoom": 9, - "wayHandling": 0, "source": { "osmTags": "proposed:cyclestreet=yes" }, @@ -139,11 +147,20 @@ } ] }, - "icon": "./assets/themes/cyclestreets/F113.svg", - "color": "#09f9dd", - "width": "5", "tagRenderings": [ "images" + ], + "mapRendering": [ + { + "icon": "./assets/themes/cyclestreets/F113.svg", + "location": [ + "point" + ] + }, + { + "color": "#09f9dd", + "width": "5" + } ] }, { @@ -176,7 +193,6 @@ } }, "minzoom": 18, - "wayHandling": 0, "title": { "render": { "nl": "Straat", @@ -195,23 +211,32 @@ } ] }, - "icon": "./assets/svg/pencil.svg", - "width": "5", - "color": { - "render": "#aaaaaa", - "mappings": [ - { - "then": "#0000ff", - "if": "cyclestreet=yes" - }, - { - "then": "#09f9dd", - "if": "proposed:cyclestreet=yes" - } - ] - }, "tagRenderings": [ "images" + ], + "mapRendering": [ + { + "icon": "./assets/svg/pencil.svg", + "location": [ + "point" + ] + }, + { + "color": { + "render": "#aaaaaa", + "mappings": [ + { + "then": "#0000ff", + "if": "cyclestreet=yes" + }, + { + "then": "#09f9dd", + "if": "proposed:cyclestreet=yes" + } + ] + }, + "width": "5" + } ] } ], @@ -221,8 +246,8 @@ { "id": "is_cyclestreet", "question": { - "nl": "Is deze straat een fietsstraat?", - "en": "Is this street a cyclestreet?", + "nl": "Is de straat {name} een fietsstraat?", + "en": "Is the street {name} a cyclestreet?", "ja": "この通りはcyclestreetですか?", "nb_NO": "Er denne gaten en sykkelvei?", "de": "Ist diese Straße eine Fahrradstraße?", @@ -255,7 +280,7 @@ ] }, "then": { - "nl": "Deze straat i een fietsstraat", + "nl": "Deze straat is een fietsstraat", "en": "This street is a cyclestreet", "ja": "この通りはcyclestreetだ", "nb_NO": "Denne gaten er en sykkelvei", diff --git a/assets/themes/cyclofix/cyclofix.json b/assets/themes/cyclofix/cyclofix.json index 3b3ccea737..e6983ceeb6 100644 --- a/assets/themes/cyclofix/cyclofix.json +++ b/assets/themes/cyclofix/cyclofix.json @@ -1,15 +1,15 @@ { "id": "cyclofix", "title": { - "en": "Cyclofix — an open map for cyclists", + "en": "Cyclofix - an open map for cyclists", "nl": "Cyclofix - een open kaart voor fietsers", "fr": "Cyclofix - Une carte ouverte pour les cyclistes", "gl": "Cyclofix - Un mapa aberto para os ciclistas", - "de": "Cyclofix - eine freie Karte für Radfahrer", + "de": "Cyclofix — eine freie Karte für Radfahrer", "ru": "Cyclofix - открытая карта для велосипедистов", "ja": "Cyclofix - サイクリストのためのオープンマップ", "zh_Hant": "單車修正 - 單車騎士的開放地圖", - "it": "Cyclofix — una mappa libera per chi va in bici", + "it": "Cyclofix - una mappa libera per chi va in bici", "nb_NO": "Cyclofix — et åpent kart for syklister" }, "description": { @@ -17,7 +17,7 @@ "nl": "Het doel van deze kaart is om fietsers een gebruiksvriendelijke oplossing te bieden voor het vinden van de juiste infrastructuur voor hun behoeften.

    U kunt uw exacte locatie volgen (enkel mobiel) en in de linkerbenedenhoek categorieën selecteren die voor u relevant zijn. U kunt deze tool ook gebruiken om 'spelden' aan de kaart toe te voegen of te bewerken en meer gegevens te verstrekken door de vragen te beantwoorden.

    Alle wijzigingen die u maakt worden automatisch opgeslagen in de wereldwijde database van OpenStreetMap en kunnen door anderen vrij worden hergebruikt.

    Bekijk voor meer info over cyclofix ook cyclofix.osm.be.", "fr": "Le but de cette carte est de présenter aux cyclistes une solution facile à utiliser pour trouver l'infrastructure appropriée à leurs besoins.

    Vous pouvez suivre votre localisation précise (mobile uniquement) et sélectionner les couches qui vous concernent dans le coin inférieur gauche. Vous pouvez également utiliser cet outil pour ajouter ou modifier des épingles (points d'intérêt) sur la carte et fournir plus de données en répondant aux questions.

    Toutes les modifications que vous apportez seront automatiquement enregistrées dans la base de données mondiale d'OpenStreetMap et peuvent être librement réutilisées par d'autres.

    Pour plus d'informations sur le projet cyclofix, rendez-vous sur cyclofix.osm.be.", "gl": "O obxectivo deste mapa é amosar ós ciclistas unha solución doada de empregar para atopar a infraestrutura axeitada para as súas necesidades.

    Podes obter a túa localización precisa (só para dispositivos móbiles) e escoller as capas que sexan relevantes para ti na esquina inferior esquerda. Tamén podes empregar esta ferramenta para engadir ou editar puntos de interese ó mapa e fornecer máis datos respondendo as cuestións.

    Todas as modificacións que fagas serán gardadas de xeito automático na base de datos global do OpenStreetMap e outros poderán reutilizalos libremente.

    Para máis información sobre o proxecto cyclofix, vai a cyclofix.osm.be.", - "de": "Mit dieser Karte soll Radfahrern eine einfache Lösung bereitgestellt werden, um die passende Farradinfrastruktur zu finden.

    Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.

    Ihre Änderungen, werden automatisch in der Datenbank von OpenStreetMap gespeichert und können von anderen frei verwendet werden.

    Weitere Informationen über Cyclofix finden Sie unter cyclofix.osm.be.", + "de": "Mit dieser Karte wird Radfahrern eine einfache Lösung bereitgestellt, um die passende Fahrradinfrastruktur zu finden.

    Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können auch interessante Orte zur Karte hinzuzufügen oder bearbeiten und weitere Daten durch Beantwortung von Fragen bereitstellen.

    Ihre Änderungen, werden automatisch in OpenStreetMap gespeichert und können von anderen frei verwendet werden.

    Weitere Informationen über Cyclofix finden Sie unter cyclofix.osm.be.", "ja": "このマップの目的は、サイクリストのニーズに適した施設を見つけるための使いやすいソリューションを提供することです。

    正確な位置を追跡し(モバイルのみ)、左下コーナーで関連するレイヤを選択できます。このツールを使用して、マップにピン(注目点)を追加または編集したり、質問に答えることでより多くのデータを提供することもできます。

    変更内容はすべてOpenStreetMapのグローバルデータベースに自動的に保存され、他のユーザーが自由に再利用できます。

    cyclofixプロジェクトの詳細については、 cyclofix.osm.be を参照してください。", "zh_Hant": "這份地圖的目的是為單車騎士能夠輕易顯示滿足他們需求的相關設施。

    你可以追蹤你確切位置 (只有行動版),以及在左下角選擇相關的圖層。你可以使用這工具在地圖新增或編輯釘子,以及透過回答問題來提供更多資訊。

    所有你的變動都會自動存在開放街圖這全球資料圖,並且能被任何人自由取用。

    你可以到 cyclofix.osm.be 閱讀更多資訊。", "it": "Questa mappa offre a chi va in bici una soluzione semplice per trovare tutte le infrastrutture di cui ha bisogno.

    Puoi tracciare la tua posizione esatta (solo su mobile) e selezionare i livelli che ti interessano nell'angolo in basso a sinistra. Puoi anche usare questo strumento per aggiungere o modificare punti di interesse alla mappa e aggiungere nuove informazioni rispendendo alle domande.

    Tutte le modifiche che apporterai saranno automaticamente salvate nel database mondiale di OpenStreetMap e potranno essere liberamente riutilizzate da tutti e tutte.

    Per maggiori informazioni sul progetto ciclofix, visita cyclofix.osm.be." diff --git a/assets/themes/etymology.json b/assets/themes/etymology.json index 903dc0421c..4216ff041c 100644 --- a/assets/themes/etymology.json +++ b/assets/themes/etymology.json @@ -13,7 +13,7 @@ "it": "Qual è l’origine di un toponimo?" }, "description": { - "en": "On this map, you can see what an object is named after. The streets, buildings, ... come from OpenStreetMap which got linked with Wikidata. In the popup, you'll see the Wikipedia article (if it exists) or a Wikidata box of what the object is named after. If the object itself has a Wikipedia page, that'll be shown too.

    You can help contribute too!Zoom in enough and all streets will show up. You can click one and a Wikidata-search box will popup. With a few clicks, you can add an etymology link. Note that you need a free OpenStreetMap account to do this.", + "en": "On this map, you can see what an object is named after. The streets, buildings, ... come from OpenStreetMap which got linked with Wikidata. In the popup, you'll see the Wikipedia article (if it exists) or a wikidata box of what the object is named after. If the object itself has a wikipedia page, that'll be shown too.

    You can help contribute too!Zoom in enough and all streets will show up. You can click one and a Wikidata-search box will popup. With a few clicks, you can add an etymology link. Note that you need a free OpenStreetMap account to do this.", "nl": "Op deze kaart zie je waar een plaats naar is vernoemd. De straten, gebouwen, ... komen uit OpenStreetMap, waar een link naar Wikidata werd gelegd. In de popup zie je het Wikipedia-artikel van hetgeen naarwaar het vernoemd is of de Wikidata-box.

    Je kan zelf ook meehelpen!Als je ver inzoomt, krijg je alle straten te zien. Klik je een straat aan, dan krijg je een zoekfunctie waarmee je snel een nieuwe link kan leggen. Je hebt hiervoor een gratis OpenStreetMap account nodig.", "de": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.

    Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.", "it": "Su questa cartina sono visibili i nomi a cui sono riferiti gli oggetti. Le strade, gli edifici, etc. provengono da OpenStreetMap che è a sua volta collegata a Wikidata. Nel popup, se esiste, verrà mostrato l’articolo Wikipedia o l'elemento Wikidata a cui si riferisce il nome di quell’oggetto. Se l’oggetto stesso ha una pagina Wikpedia, anch’essa verrà mostrata.

    Anche tu puoi contribuire!Ingrandisci abbastanza e tutte le strade appariranno. Puoi cliccare su una e apparirà un popup con la ricerca Wikidata. Con pochi clic puoi aggiungere un collegamento etimologico. Tieni presente che per farlo, hai bisogno di un account gratuito su OpenStreetMap." diff --git a/assets/themes/facadegardens/facadegardens.json b/assets/themes/facadegardens/facadegardens.json index c5372d1aae..2ec4c03bf6 100644 --- a/assets/themes/facadegardens/facadegardens.json +++ b/assets/themes/facadegardens/facadegardens.json @@ -16,7 +16,7 @@ "zh_Hant": "這地圖顯示立面花園的照片以及其他像是方向、日照以及植栽種類等實用訊息。", "it": "Questa mappa mostra i giardini verticali, con foto e informazioni utili sulla loro orientazione, sull'illuminazione solare e sui tipi di piante.", "fr": "Cette carte indique les murs végétalisés avec des photos et des informations comme leur orientation, l’ensoleillement et le type de plantes.", - "de": "Diese Karte zeigt Fassadengärten mit Bildern und nützlichen Informationen über Ausrichtung, Sonneneinstrahlung und Pflanzenarten." + "de": "Diese Karte zeigt Fassadengärten mit Bildern und Details zu Ausrichtung, Sonneneinstrahlung und Pflanzen." }, "description": { "nl": "Ontharde voortuintjes, groene gevels en bomen ín de stad brengen naast rust ook een mooiere stad, een grotere biodiversiteit, een verkoelend effect en een betere luchtkwaliteit.
    Klimaan VZW en 'Mechelen Klimaatneutraal' willen met het project Klim(t)aan je Gevel bestaande en nieuwe geveltuintjes in kaart brengen als voorbeeld voor mensen zelf een tuintje willen aanleggen of voor stadwandelaars die houden van de natuur.
    Meer info over het project op klimaan.be.", @@ -87,44 +87,12 @@ "de": "Fassadengärten", "it": "Giardini verticali" }, - "iconOverlays": [ - { - "if": "plant~.*vine.*", - "then": "circle:white;./assets/themes/facadegardens/klimplant.svg", - "badge": true - }, - { - "if": "plant~.*groundcover.*", - "then": "circle:white;./assets/themes/facadegardens/bodembedekker.svg", - "badge": true - }, - { - "if": "edible=true", - "then": "circle:white;./assets/themes/facadegardens/eetbaar.svg", - "badge": true - }, - { - "if": "rain_barel=yes", - "then": "circle:white;./assets/themes/facadegardens/gevelton.svg", - "badge": true - }, - { - "if": "plant~.*shrub.*", - "then": "circle:white;./assets/themes/facadegardens/struik.svg", - "badge": true - }, - { - "if": "plant~.*flower.*", - "then": "circle:white;./assets/themes/facadegardens/bloei.svg", - "badge": true - } - ], "tagRenderings": [ "images", { "render": { "nl": "Oriëntatie: {direction} (waarbij 0=N en 90=O)", - "en": "Orientation: {direction} (where 0=N and 90=E)", + "en": "Orientation: {direction} (where 0=N and 90=O)", "ja": "方向: {direction} (0=N で 90=O)", "fr": "Orientation : {direction} (0 pour le Nord et 90 pour l’Ouest)", "de": "Ausrichtung: {direction} (wobei 0=N und 90=O)", @@ -402,44 +370,6 @@ "id": "facadegardens-description" } ], - "icon": { - "render": "circle:white;./assets/themes/facadegardens/geveltuin.svg", - "mappings": [ - { - "if": { - "and": [ - "direct_sunlight=yes" - ] - }, - "then": "circle:white;./assets/themes/facadegardens/zon.svg" - }, - { - "if": { - "and": [ - "direct_sunlight=partial" - ] - }, - "then": "circle:white;./assets/themes/facadegardens/halfzon.svg" - }, - { - "if": { - "and": [ - "direct_sunlight=no" - ] - }, - "then": "circle:white;./assets/themes/facadegardens/schaduw.svg" - } - ] - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "50,50,center" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -464,7 +394,72 @@ } } ], - "wayHandling": 1 + "mapRendering": [ + { + "icon": { + "render": "circle:white;./assets/themes/facadegardens/geveltuin.svg", + "mappings": [ + { + "if": { + "and": [ + "direct_sunlight=yes" + ] + }, + "then": "circle:white;./assets/themes/facadegardens/zon.svg" + }, + { + "if": { + "and": [ + "direct_sunlight=partial" + ] + }, + "then": "circle:white;./assets/themes/facadegardens/halfzon.svg" + }, + { + "if": { + "and": [ + "direct_sunlight=no" + ] + }, + "then": "circle:white;./assets/themes/facadegardens/schaduw.svg" + } + ] + }, + "iconBadges": [ + { + "if": "plant~.*vine.*", + "then": "circle:white;./assets/themes/facadegardens/klimplant.svg" + }, + { + "if": "plant~.*groundcover.*", + "then": "circle:white;./assets/themes/facadegardens/bodembedekker.svg" + }, + { + "if": "edible=true", + "then": "circle:white;./assets/themes/facadegardens/eetbaar.svg" + }, + { + "if": "rain_barel=yes", + "then": "circle:white;./assets/themes/facadegardens/gevelton.svg" + }, + { + "if": "plant~.*shrub.*", + "then": "circle:white;./assets/themes/facadegardens/struik.svg" + }, + { + "if": "plant~.*flower.*", + "then": "circle:white;./assets/themes/facadegardens/bloei.svg" + } + ], + "iconSize": { + "render": "50,50,center" + }, + "location": [ + "point", + "centroid" + ] + } + ] } ] } \ No newline at end of file diff --git a/assets/themes/fruit_trees/fruit_trees.json b/assets/themes/fruit_trees/fruit_trees.json index 9f9e84fab6..6e93dabe58 100644 --- a/assets/themes/fruit_trees/fruit_trees.json +++ b/assets/themes/fruit_trees/fruit_trees.json @@ -43,18 +43,6 @@ "tagRenderings": [ "images" ], - "icon": { - "render": "./assets/themes/buurtnatuur/forest.svg" - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -68,6 +56,27 @@ "nl": "Voeg een boomgaard toe (als punt - omtrek nog te tekenen)" } } + ], + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/buurtnatuur/forest.svg" + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point" + ] + }, + { + "color": { + "render": "#00f" + }, + "width": { + "render": "8" + } + } ] }, { @@ -146,18 +155,6 @@ "id": "fruitboom-ref" } ], - "icon": { - "render": "./assets/themes/fruit_trees/fruit_tree.svg" - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -170,6 +167,27 @@ "nl": "Voeg hier een boom toe" } } + ], + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/fruit_trees/fruit_tree.svg" + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point" + ] + }, + { + "color": { + "render": "#00f" + }, + "width": { + "render": "8" + } + } ] } ] diff --git a/assets/themes/ghostbikes/ghostbikes.json b/assets/themes/ghostbikes/ghostbikes.json index 2b5a81f535..9dc192b8ae 100644 --- a/assets/themes/ghostbikes/ghostbikes.json +++ b/assets/themes/ghostbikes/ghostbikes.json @@ -43,7 +43,7 @@ "description": { "en": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location.

    On this map, one can see all the ghost bikes which are known by OpenStreetMap. Is a ghost bike missing? Everyone can add or update information here - you only need to have a (free) OpenStreetMap account.", "nl": "Een Witte Fiets of Spookfiets is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat om een fiets die volledig wit is geschilderd en in de buurt van het ongeval werd geinstalleerd.

    Op deze kaart zie je alle witte fietsen die door OpenStreetMap gekend zijn. Ontbreekt er een Witte Fiets of wens je informatie aan te passen? Meld je dan aan met een (gratis) OpenStreetMap account.", - "de": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.

    Auf dieser Karte kann man alle Geisterräder sehen, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.", + "de": "Ein Geisterrad ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde.

    Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.", "ja": "ゴーストバイクは、交通事故で死亡したサイクリストを記念するもので、事故現場の近くに恒久的に置かれた白い自転車の形をしています。

    このマップには、OpenStreetMapで知られているゴーストバイクがすべて表示されます。ゴーストバイクは行方不明ですか?誰でもここで情報の追加や更新ができます。必要なのは(無料の)OpenStreetMapアカウントだけです。", "zh_Hant": "幽靈單車是用來紀念死於交通事故的單車騎士,在事發地點附近放置白色單車。

    在這份地圖上面,你可以看到所有在開放街圖已知的幽靈單車。有缺漏的幽靈單車嗎?所有人都可以在這邊新增或是更新資訊-只有你有(免費)開放街圖帳號。", "fr": "Les vélos fantômes sont des mémoriaux pour les cyclistes tuées sur la route, prenant la forme de vélos blancs placés à proximité des faits.

    Cette carte indique leur emplacement à partir d’OpenStreetMap. Il est possible de contribuer aux informations ici, sous réserve d’avoir un compte OpenStreetMap (gratuit).", @@ -57,5 +57,8 @@ "layers": [ "ghost_bike" ], - "defaultBackgroundId": "CartoDB.Positron" + "defaultBackgroundId": "CartoDB.Positron", + "clustering": { + "maxZoom": 0 + } } \ No newline at end of file diff --git a/assets/themes/grb_import/README.md b/assets/themes/grb_import/README.md index 2ed7bfbbfa..8481ce379b 100644 --- a/assets/themes/grb_import/README.md +++ b/assets/themes/grb_import/README.md @@ -1,4 +1,4 @@ - GRB Import helper +GRB Import helper =================== diff --git a/assets/themes/grb_import/grb.json b/assets/themes/grb_import/grb.json index 4f0d99d9db..0d6bd41bfd 100644 --- a/assets/themes/grb_import/grb.json +++ b/assets/themes/grb_import/grb.json @@ -7,10 +7,12 @@ "nl": "Grb Fixup" }, "description": { - "nl": "GRB Fixup" + "nl": "GRB Fixup", + "en": "This theme is an attempt to help automating the GRB import.
    Note that this is very hacky and 'steals' the GRB data from an external site; in order to do this, you need to install and activate this firefox extension for it to work." }, "language": [ - "nl" + "nl", + "en" ], "maintainer": "", "icon": "./assets/svg/bug.svg", @@ -20,13 +22,186 @@ "startZoom": 14, "widenFactor": 2, "socialImage": "", + "clustering": { + "maxZoom": 15 + }, + "overrideAll": { + "minzoom": 18 + }, + "trackAllNodes": true, + "enableGeolocation": false, "layers": [ + { + "builtin": "type_node", + "isShown": { + "render": "no" + }, + "override": { + "calculatedTags": [ + "_is_part_of_building=feat.get('parent_ways')?.some(p => p.building !== undefined && p.building !== '') ?? false", + "_is_part_of_building_passage=feat.get('parent_ways')?.some(p => p.tunnel === 'building_passage') ?? false", + "_is_part_of_highway=!feat.get('is_part_of_building_passage') && (feat.get('parent_ways')?.some(p => p.highway !== undefined && p.highway !== '') ?? false)", + "_is_part_of_landuse=feat.get('parent_ways')?.some(p => (p.landuse !== undefined && p.landuse !== '') || (p.natural !== undefined && p.natural !== '')) ?? false" + ], + "mapRendering": [ + { + "icon": "square:#00f", + "iconSize": "5,5,center", + "location": "point" + } + ] + } + }, + { + "id": "OSM-buildings", + "name": "All OSM-buildings", + "source": { + "osmTags": "building~*", + "maxCacheAge": 0 + }, + "mapRendering": [ + { + "width": { + "render": "2" + }, + "color": { + "render": "#00c", + "mappings": [ + { + "if": "building=house", + "then": "#a00" + }, + { + "if": "building=shed", + "then": "#563e02" + }, + { + "if": { + "or": [ + "building=garage", + "building=garages" + ] + }, + "then": "#f9bfbb" + }, + { + "if": "building=yes", + "then": "#0774f2" + } + ] + } + } + ], + "title": "OSM-gebouw", + "tagRenderings": [ + { + "id": "building type", + "freeform": { + "key": "building" + }, + "render": "The building type is {building}", + "question": { + "en": "What kind of building is this?" + }, + "mappings": [ + { + "if": "building=house", + "then": "A normal house" + }, + { + "if": "building=detached", + "then": "A house detached from other building" + }, + { + "if": "building=semidetached_house", + "then": "A house sharing only one wall with another house" + }, + { + "if": "building=apartments", + "then": "An apartment building - highrise for living" + }, + { + "if": "building=office", + "then": "An office building - highrise for work" + }, + { + "if": "building=apartments", + "then": "An apartment building" + }, + { + "if": "building=shed", + "then": "A small shed, e.g. in a garden" + }, + { + "if": "building=garage", + "then": "A single garage to park a car" + }, + { + "if": "building=garages", + "then": "A building containing only garages; typically they are all identical" + }, + { + "if": "building=yes", + "then": "A building - no specification" + } + ] + }, + "all_tags" + ] + }, + { + "id": "All OSM objects", + "name": "All OSM Objects", + "source": { + "osmTags": { + "and": [ + "id~*", + "landuse=", + "place=", + "disused:power=", + "power=", + "type!=boundary", + "boundary=", + { + "or": [ + "level=", + "level=0" + ] + }, + { + "or": [ + "layer=0", + "layer=" + ] + } + ] + }, + "maxCacheAge": 0 + }, + "mapRendering": [ + { + "color": { + "render": "#00c" + }, + "width": { + "render": "1" + } + } + ], + "title": { + "render": { + "*": "OSM-Object" + } + }, + "tagRenderings": [ + "all_tags" + ] + }, { "id": "osm-fixmes", "name": { "nl": "Fixmes op gebouwen" }, - "minzoom": 12, "source": { "maxCacheAge": 0, "osmTags": { @@ -178,26 +353,34 @@ } } ], - "label": { - "mappings": [ - { - "if": "addr:housenumber~*", - "then": "
    {addr:housenumber}
    " + "mapRendering": [ + { + "location": [ + "point", + "centroid" + ], + "label": { + "mappings": [ + { + "if": "addr:housenumber~*", + "then": "
    {addr:housenumber}
    " + } + ] + }, + "iconSize": { + "render": "40,40,center" } - ] - }, - "width": { - "render": "2" - }, - "iconSize": { - "render": "40,40,center" - }, - "dashes": "2 2", - "color": { - "render": "#00f" - }, - "wayHandling": 2, - "presets": [] + }, + { + "dashes": "2 2", + "color": { + "render": "#00f" + }, + "width": { + "render": "2" + } + } + ] }, { "id": "crab-addresses 2021-10-26", @@ -208,22 +391,253 @@ "geoJsonZoomLevel": 18, "maxCacheAge": 0 }, - "minzoom": 19, "name": "CRAB-addressen", "title": "CRAB-adres", - "icon": "circle:#bb3322", - "iconSize": "15,15,center", + "mapRendering": [ + { + "location": [ + "point", + "centroid" + ], + "icon": "circle:#bb3322", + "iconSize": "15,15,center" + } + ], + "calculatedTags": [ + "_embedded_in=feat.overlapWith('OSM-buildings')[0]?.feat?.properties ", + "_embedding_nr=feat.get('_embedded_in')['addr:housenumber']", + "_embedding_street=feat.get('_embedded_in')['addr:street']", + "_embedding_id=feat.get('_embedded_in').id" + ], + "isShown": { + "render": "yes", + "mappings": [ + { + "if": { + "and": [ + "_embedding_nr:={HUISNR}", + "_embedding_street:={STRAATNM}" + ] + }, + "then": "no" + } + ] + }, "tagRenderings": [ + { + "id": "render_crab", + "render": "Volgens het CRAB ligt hier {STRAATNM} {HUISNR} (label: {HNRLABEL})" + }, + { + "id": "render_embedded", + "render": "Het omliggende object met addres heeft {_embedding_street} {_embedding_nr}", + "condition": { + "and": [ + "_embedding_street~*", + "_embedding_nr~*" + ] + } + }, "all_tags", { "id": "import-button", - "render": "{import_button(addr:street=$STRAATNM; addr:housenumber=$HUISNR)}" + "render": "{import_button(OSM-buildings, addr:street=$STRAATNM; addr:housenumber=$HUISNR,Import this address,,,OSM-buildings,5)}" + }, + { + "id": "apply-button", + "render": "{tag_apply(addr:street=$STRAATNM; addr:housenumber=$HUISNR,Apply this address on the OSM-building,,_embedding_id)}", + "condition": "_embedded_in!=" + } + ] + }, + { + "id": "grb-fixmes", + "name": { + "nl": "Fixmes op gebouwen" + }, + "source": { + "maxCacheAge": 0, + "osmTags": { + "and": [ + "fixme~*", + "building~*" + ] + } + }, + "calculatedTags": [ + "_grbNumber=(feat.properties.fixme?.match(/GRB thinks that this has number ([^;]+)/ ) ?? ['','none']) [1]" + ], + "title": { + "render": { + "nl": "{addr:street} {addr:housenumber}" + }, + "mappings": [ + { + "if": { + "and": [ + "fixme~*" + ] + }, + "then": { + "nl": "{fixme}" + } + } + ] + }, + "description": { + "nl": "Dit gebouw heeft een foutmelding" + }, + "tagRenderings": [ + { + "id": "grb-housenumber", + "render": { + "nl": "Het huisnummer is {addr:housenumber}" + }, + "question": { + "nl": "Wat is het huisnummer?" + }, + "freeform": { + "key": "addr:housenumber" + }, + "mappings": [ + { + "if": { + "and": [ + "not:addr:housenumber=yes", + "addr:housenumber=" + ] + }, + "then": { + "nl": "Geen huisnummer" + } + }, + { + "if": { + "and": [ + "addr:housenumber:={_grbNumber}", + "fixme=" + ] + }, + "then": "Het huisnummer is {_grbNumber}, wat overeenkomt met het GRB", + "hideInAnswer": { + "or": [ + "_grbNumber=", + "_grbNumber=none", + "_grbNumber=no number" + ] + } + }, + { + "if": { + "and": [ + "addr:housenumber=", + "not:addr:housenumber=yes", + "fixme=" + ] + }, + "then": "Dit gebouw heeft geen nummer, net zoals in het GRB", + "hideInAnswer": "_grbNumber!=no number" + } + ] + }, + { + "id": "grb-unit", + "question": "Wat is de wooneenheid-aanduiding?", + "render": { + "nl": "De wooneenheid-aanduiding is {addr:unit} " + }, + "freeform": { + "key": "addr:unit" + }, + "mappings": [ + { + "if": "addr:unit=", + "then": "Geen wooneenheid-nummer" + } + ] + }, + { + "id": "grb-street", + "render": { + "nl": "De straat is {addr:street}" + }, + "freeform": { + "key": "addr:street" + }, + "question": { + "nl": "Wat is de straat?" + } + }, + { + "id": "grb-fixme", + "render": { + "nl": "De fixme is {fixme}" + }, + "question": { + "nl": "Wat zegt de fixme?" + }, + "freeform": { + "key": "fixme" + }, + "mappings": [ + { + "if": { + "and": [ + "fixme=" + ] + }, + "then": { + "nl": "Geen fixme" + } + } + ] + }, + { + "id": "grb-min-level", + "render": { + "nl": "Dit gebouw begint maar op de {building:min_level} verdieping" + }, + "question": { + "nl": "Hoeveel verdiepingen ontbreken?" + }, + "freeform": { + "key": "building:min_level", + "type": "pnat" + } + } + ], + "mapRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconSize": { + "render": "40,40,center" + }, + "label": { + "mappings": [ + { + "if": "addr:housenumber~*", + "then": "
    {addr:housenumber}
    " + } + ] + } + }, + { + "width": { + "render": "2" + }, + "color": { + "render": "#00f" + } } ] }, { "id": "GRB", "source": { + "osmTags": "HUISNR~*", "geoJson": "https://betadata.grbosm.site/grb?bbox={x_min},{y_min},{x_max},{y_max}", "geoJsonZoomLevel": 18, "mercatorCrs": true, @@ -231,12 +645,98 @@ }, "name": "GRB geometries", "title": "GRB outline", - "minzoom": 19, + "calculatedTags": [ + "_overlaps_with=feat.overlapWith('OSM-buildings').filter(f => f.overlap > 1 && (feat.get('_surface') < 20 || f.overlap / feat.get('_surface')) > 0.5)[0] ?? null", + "_overlap_absolute=feat.get('_overlaps_with')?.overlap", + "_overlap_percentage=Math.round(100 * feat.get('_overlap_absolute') / feat.get('_surface')) ", + "_osm_obj:source:ref=feat.get('_overlaps_with')?.feat?.properties['source:geometry:ref']", + "_osm_obj:source:date=feat.get('_overlaps_with')?.feat?.properties['source:geometry:date'].replace(/\\//g, '-')", + "_osm_obj:building=feat.get('_overlaps_with')?.feat?.properties.building", + "_osm_obj:id=feat.get('_overlaps_with')?.feat?.properties.id", + "_grb_ref=feat.properties['source:geometry:entity'] + '/' + feat.properties['source:geometry:oidn']", + "_imported_osm_object_found= feat.properties['_osm_obj:source:ref'] == feat.properties._grb_ref", + "_grb_date=feat.properties['source:geometry:date'].replace(/\\//g,'-')", + "_imported_osm_still_fresh= feat.properties['_osm_obj:source:date'] == feat.properties._grb_date", + "_target_building_type=feat.properties['_osm_obj:building'] === 'yes' ? feat.properties.building : (feat.properties['_osm_obj:building'] ?? feat.properties.building)" + ], "tagRenderings": [ + { + "id": "Building info", + "render": "This is a {building} detected by {detection_method}" + }, + { + "id": "overlapping building type", + "render": "
    The overlapping openstreetmap-building is a {_osm_obj:building} and covers {_overlap_percentage}% of the GRB building

    GRB geometry:

    {minimap(21, id):height:10rem;border-radius:1rem;overflow:hidden}

    OSM geometry:

    {minimap(21,_osm_obj:id):height:10rem;border-radius:1rem;overflow:hidden}", + "condition": "_overlaps_with!=null" + }, + { + "id": "apply-id", + "render": "{tag_apply(source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref,Mark the OSM-building as imported,,_osm_obj:id)}", + "condition": { + "and": [ + "_overlaps_with!=null" + ] + } + }, + { + "id": "apply-building-type", + "render": "{tag_apply(building=$building,Use the building type from GRB,,_osm_obj:id)}", + "condition": { + "and": [ + "_overlaps_with!=null", + "_osm_obj:building=yes", + "building!=yes" + ] + } + }, + { + "id": "Import-button", + "render": "{import_button(OSM-buildings,building=$building; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref, Upload this building to OpenStreetMap)}", + "mappings": [ + { + "if": "_overlaps_with!=null", + "then": "{import_button(OSM-buildings,building=$_target_building_type; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref, Replace the geometry in OpenStreetMap,,,_osm_obj:id)}" + } + ] + }, "all_tags" + ], + "isShown": { + "render": "yes", + "mappings": [ + { + "if": { + "and": [ + "_imported_osm_object_found=true", + "_imported_osm_still_fresh=true" + ] + }, + "then": "no" + } + ] + }, + "mapRendering": [ + { + "color": { + "render": "#00a", + "mappings": [ + { + "if": { + "and": [ + "_imported_osm_object_found=true", + "_imported_osm_still_fresh=true" + ] + }, + "then": "#0f0" + } + ] + } + } ] } ], "hideFromOverview": true, - "defaultBackgroundId": "AGIVFlandersGRB" + "defaultBackgroundId": "AGIVFlandersGRB", + "overpassMaxZoom": 15, + "osmApiTileSize": 17 } \ No newline at end of file diff --git a/assets/themes/hackerspaces/hackerspaces.json b/assets/themes/hackerspaces/hackerspaces.json index 9e0722aa90..c301c7b238 100644 --- a/assets/themes/hackerspaces/hackerspaces.json +++ b/assets/themes/hackerspaces/hackerspaces.json @@ -34,15 +34,13 @@ "id": "hackerspaces", "name": { "en": "Hackerspace", - "de": "Hackerspace", - "it": "Hackerspace" + "de": "Hackerspace" }, "minzoom": 8, "title": { "render": { "en": "Hackerspace", - "de": "Hackerspace", - "it": "Hackerspace" + "de": "Hackerspace" }, "mappings": [ { @@ -53,41 +51,35 @@ }, "then": { "en": " {name}", - "de": " {name}", - "eo": " {name}", - "it": " {name}" + "de": " {name}" } } ] }, "description": { "en": "Hackerspace", - "de": "Hackerspace", - "it": "Hackerspace" + "de": "Hackerspace" }, "tagRenderings": [ { "id": "is_makerspace", "question": { "en": "Is this a hackerspace or a makerspace?", - "de": "Ist dies ein Hackerspace oder ein Makerspace?", - "it": "È un hackerspace o un makerspace?" + "de": "Ist dies ein Hackerspace oder ein Makerspace?" }, "mappings": [ { "if": "hackerspace=makerspace", "then": { "en": "This is a makerspace", - "de": "Dies ist ein Makerspace", - "it": "Si tratta di un makerspace" + "de": "Dies ist ein Makerspace" } }, { "if": "hackerspace=", "then": { "en": "This is a traditional (software oriented) hackerspace", - "de": "Dies ist ein traditioneller (softwareorientierter) Hackerspace", - "it": "Si tratta di un hackerspace tradizionale (orientato al software)" + "de": "Dies ist ein traditioneller (softwareorientierter) Hackerspace" } } ] @@ -95,13 +87,11 @@ { "question": { "en": "What is the name of this hackerspace?", - "de": "Wie lautet der Name dieses Hackerspace?", - "it": "Qual è il nome di questo hackerspace?" + "de": "Wie lautet der Name dieses Hackerspace?" }, "render": { "en": "This hackerspace is named {name}", - "de": "Dieser Hackerspace heißt {name}", - "it": "Questo hackerspace si chiama {name}" + "de": "Dieser Hackerspace heißt {name}" }, "freeform": { "key": "name" @@ -114,8 +104,7 @@ { "question": { "en": "When is this hackerspace opened?", - "de": "Wann hat dieser Hackerspace geöffnet?", - "it": "Quando è aperto questo hackerspace?" + "de": "Wann hat dieser Hackerspace geöffnet?" }, "freeform": { "key": "opening_hours", @@ -123,9 +112,7 @@ }, "render": { "en": "{opening_hours_table()}", - "de": "{opening_hours_table()}", - "eo": "{opening_hours_table()}", - "it": "{opening_hours_table()}" + "de": "{opening_hours_table()}" }, "mappings": [ { @@ -136,8 +123,7 @@ }, "then": { "en": "Opened 24/7", - "de": "durchgehend geöffnet", - "it": "Aperto sempre" + "de": "durchgehend geöffnet" } } ], @@ -148,8 +134,7 @@ "id": "hs-club-mate", "question": { "en": "Does this hackerspace serve Club Mate?", - "de": "Gibt es in diesem Hackerspace Club Mate?", - "it": "In questo hackerspace si serve Club-Mate?" + "de": "Gibt es in diesem Hackerspace Club Mate?" }, "mappings": [ { @@ -160,8 +145,7 @@ }, "then": { "en": "This hackerspace serves club mate", - "de": "In diesem Hackerspace gibt es Club Mate", - "it": "In questo hackerspace viene servito Club-Mate" + "de": "In diesem Hackerspace gibt es Club Mate" } }, { @@ -172,8 +156,7 @@ }, "then": { "en": "This hackerspace does not serve club mate", - "de": "In diesem Hackerspace gibt es kein Club Mate", - "it": "In questo hackerspace non viene servito Club-Mate" + "de": "In diesem Hackerspace gibt es kein Club Mate" } } ] @@ -181,13 +164,11 @@ { "render": { "en": "This hackerspace was founded at {start_date}", - "de": "Dieser Hackerspace wurde gegründet am {start_date}", - "it": "Questo hackerspace è stato creato il {start_date}" + "de": "Dieser Hackerspace wurde gegründet am {start_date}" }, "question": { "en": "When was this hackerspace founded?", - "de": "Wann wurde dieser Hackerspace gegründet?", - "it": "Quando è stato creato questo hackerspace?" + "de": "Wann wurde dieser Hackerspace gegründet?" }, "freeform": { "key": "start_date", @@ -196,33 +177,6 @@ "id": "hackerspaces-start_date" } ], - "icon": { - "render": "./assets/themes/hackerspaces/glider.svg", - "mappings": [ - { - "if": { - "and": [ - "hackerspace=makerspace" - ] - }, - "then": { - "en": "./assets/themes/hackerspaces/led.png", - "de": "./assets/themes/hackerspaces/led.png", - "eo": "./assets/themes/hackerspaces/led.png", - "it": "./assets/themes/hackerspaces/led.png" - } - } - ] - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -230,13 +184,11 @@ ], "title": { "en": "Hackerspace", - "de": "Hackerspace", - "it": "Hackerspace" + "de": "Hackerspace" }, "description": { "en": "A hackerspace is an area where people interested in software gather", - "de": "Ein Hackerspace ist ein Ort, an dem sich Menschen treffen, die sich für Software interessieren", - "it": "Un hackerspace è un’area dove si ritrovano le persone interessate al software" + "de": "Ein Hackerspace ist ein Ort, an dem sich Menschen treffen, die sich für Software interessieren" } }, { @@ -246,24 +198,53 @@ ], "title": { "en": "Makerspace", - "de": "Makerspace", - "it": "Makerspace" + "de": "Makerspace" }, "description": { "en": "A makerspace is a place where DIY-enthusiasts gather to experiment with electronics such as arduino, LEDstrips, ...", - "de": "Ein Makerspace ist ein Ort, an dem Heimwerker-Enthusiasten zusammenkommen, um mit Elektronik zu experimentieren, wie Arduino, LED-Strips, ...", - "it": "Un makerspace è un luogo dove gli amanti del fai-da-te si ritrovano per sperimentare con dispositivi di elettronica come arduino, strisce LED, etc." + "de": "Ein Makerspace ist ein Ort, an dem Heimwerker-Enthusiasten zusammenkommen, um mit Elektronik zu experimentieren, wie Arduino, LED-Strips, ..." } } ], - "wayHandling": 2, "source": { "osmTags": { "and": [ "leisure=hackerspace" ] } - } + }, + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/hackerspaces/glider.svg", + "mappings": [ + { + "if": { + "and": [ + "hackerspace=makerspace" + ] + }, + "then": "./assets/themes/hackerspaces/led.png" + } + ] + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#00f" + }, + "width": { + "render": "8" + } + } + ] } ] } \ No newline at end of file diff --git a/assets/themes/hailhydrant/hailhydrant.json b/assets/themes/hailhydrant/hailhydrant.json index 1e5cbf5c33..bd398f508b 100644 --- a/assets/themes/hailhydrant/hailhydrant.json +++ b/assets/themes/hailhydrant/hailhydrant.json @@ -102,7 +102,7 @@ }, "render": { "en": "The hydrant color is {colour}", - "ja": "消火栓の色は{color}です", + "ja": "消火栓の色は{colour}です", "nb_NO": "Brannhydranter er {colour}", "ru": "Цвет гидранта {colour}", "fr": "La borne est {colour}", @@ -262,22 +262,12 @@ { "id": "hydrant-state", "question": { - "en": "Update the lifecycle status of the hydrant.", + "en": "Is this hydrant still working?", "ja": "消火栓のライフサイクルステータスを更新します。", "fr": "Mettre à jour l’état de la borne.", "de": "Aktualisieren Sie den Lebenszyklusstatus des Hydranten.", "it": "Aggiorna lo stato di funzionamento dell’idrante." }, - "render": { - "en": "Lifecycle status", - "ja": "ライフサイクルステータス", - "fr": "État", - "de": "Lebenszyklus-Status", - "it": "Stato di funzionamento" - }, - "freeform": { - "key": "disused:emergency" - }, "mappings": [ { "if": { @@ -286,7 +276,7 @@ ] }, "then": { - "en": "The hydrant is (fully or partially) working.", + "en": "The hydrant is (fully or partially) working", "ja": "消火栓は(完全にまたは部分的に)機能しています。", "ru": "Гидрант (полностью или частично) в рабочем состоянии.", "fr": "La borne est en état, ou partiellement en état, de fonctionner.", @@ -302,7 +292,7 @@ ] }, "then": { - "en": "The hydrant is unavailable.", + "en": "The hydrant is unavailable", "ja": "消火栓は使用できません。", "fr": "La borne est hors-service.", "de": "Der Hydrant ist nicht verfügbar.", @@ -317,7 +307,7 @@ ] }, "then": { - "en": "The hydrant has been removed.", + "en": "The hydrant has been removed", "ja": "消火栓が撤去されました。", "ru": "Гидрант демонтирован.", "fr": "La borne a été retirée.", @@ -329,18 +319,6 @@ }, "images" ], - "icon": { - "render": "./assets/themes/hailhydrant/hydrant.svg" - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "20,20,center" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -364,7 +342,28 @@ } } ], - "wayHandling": 2 + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/hailhydrant/hydrant.svg" + }, + "iconSize": { + "render": "20,20,center" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#00f" + }, + "width": { + "render": "8" + } + } + ] }, { "id": "extinguisher", @@ -464,18 +463,6 @@ }, "images" ], - "icon": { - "render": "./assets/themes/hailhydrant/Twemoji12_1f9ef.svg" - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "20,20,center" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -500,7 +487,20 @@ } } ], - "wayHandling": 1 + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/hailhydrant/Twemoji12_1f9ef.svg" + }, + "iconSize": { + "render": "20,20,center" + }, + "location": [ + "point", + "centroid" + ] + } + ] }, { "id": "fire_stations", @@ -521,7 +521,6 @@ ] } }, - "wayHandling": 2, "title": { "render": { "en": "Fire Station", @@ -714,18 +713,6 @@ }, "images" ], - "icon": { - "render": "./assets/themes/hailhydrant/Twemoji12_1f692.svg" - }, - "width": { - "render": "1" - }, - "iconSize": { - "render": "35,35,center" - }, - "color": { - "render": "#c22" - }, "presets": [ { "tags": [ @@ -748,6 +735,28 @@ "it": "Una caserma dei pompieri è un luogo dove si trovano i mezzi antincendio e i pompieri tra una missione e l’altra." } } + ], + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/hailhydrant/Twemoji12_1f692.svg" + }, + "iconSize": { + "render": "35,35,center" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#c22" + }, + "width": { + "render": "1" + } + } ] }, { @@ -938,18 +947,6 @@ }, "images" ], - "icon": { - "render": "./assets/themes/hailhydrant/Twemoji_1f691.svg" - }, - "width": { - "render": "1" - }, - "iconSize": { - "render": "35,35,center" - }, - "color": { - "render": "#00f" - }, "presets": [ { "tags": [ @@ -973,7 +970,28 @@ } } ], - "wayHandling": 2 + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/hailhydrant/Twemoji_1f691.svg" + }, + "iconSize": { + "render": "35,35,center" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#00f" + }, + "width": { + "render": "1" + } + } + ] } ], "defaultBackgroundId": "HDM_HOT" diff --git a/assets/themes/hailhydrant/logo.svg b/assets/themes/hailhydrant/logo.svg index 359f5df65b..0c153b65fe 100644 --- a/assets/themes/hailhydrant/logo.svg +++ b/assets/themes/hailhydrant/logo.svg @@ -1,6 +1,7 @@ - diff --git a/assets/themes/natuurpunt/natuurpunt.json b/assets/themes/natuurpunt/natuurpunt.json index 57e4af2f6f..c1331540e9 100644 --- a/assets/themes/natuurpunt/natuurpunt.json +++ b/assets/themes/natuurpunt/natuurpunt.json @@ -5,8 +5,8 @@ "nl": "Natuurgebieden", "en": "Nature Reserves", "de": "Naturschutzgebiete", - "it": "Riserve naturali", - "nb_NO": "Naturreservater" + "nb_NO": "Naturreservater", + "it": "Riserve naturali" }, "shortDescription": { "nl": "Deze kaart toont de natuurgebieden van Natuurpunt", @@ -17,8 +17,8 @@ "description": { "nl": "Op deze kaart vind je alle natuurgebieden die Natuurpunt ter beschikking stelt", "en": "On this map you can find all the nature reserves that Natuurpunt offers ", - "de": "Auf dieser Karte können Sie alle Naturschutzgebiete von Natuurpunt finden ", - "it": "In questa cartina è possibile trovare tutte le riserve naturali offerte da Natuupunt. " + "it": "In questa cartina è possibile trovare tutte le riserve naturali offerte da Natuupunt. ", + "de": "Auf dieser Karte können Sie alle Naturschutzgebiete von Natuurpunt finden " }, "language": [ "nl", @@ -42,9 +42,9 @@ "enablePdfDownload": true, "enableDownload": true, "hideFromOverview": true, - "#": "Disable clustering for this theme", "clustering": { - "maxZoom": 0 + "maxZoom": 0, + "#": "Disable clustering for this theme" }, "layers": [ { @@ -64,9 +64,13 @@ }, "minzoom": 13, "minzoomVisible": 0, - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg" - } + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg" + } + } + ] } }, { @@ -84,10 +88,14 @@ "isOsmCache": "duplicate" }, "minzoom": 1, - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg" - }, - "presets": [] + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg" + }, + "presets": [] + } + ] } }, { @@ -103,9 +111,13 @@ "isOsmCache": true }, "minzoom": 1, - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/information.svg" - } + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/information.svg" + } + } + ] } }, { @@ -122,19 +134,23 @@ "isOsmCache": true }, "minzoom": 10, - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/trail.svg", - "mappings": [ - { - "if": "wheelchair=yes", - "then": "circle:#FE6F32;./assets/themes/natuurpunt/walk_wheelchair.svg" - }, - { - "if": "pushchair=yes", - "then": "circle:#FE6F32;./assets/themes/natuurpunt/pushchair.svg" + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/trail.svg", + "mappings": [ + { + "if": "wheelchair=yes", + "then": "circle:#FE6F32;./assets/themes/natuurpunt/walk_wheelchair.svg" + }, + { + "if": "pushchair=yes", + "then": "circle:#FE6F32;./assets/themes/natuurpunt/pushchair.svg" + } + ] } - ] - } + } + ] } }, { @@ -146,19 +162,23 @@ "geoJsonZoomLevel": 12, "isOsmCache": true }, - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/toilets.svg", - "mappings": [ - { - "if": "wheelchair=yes", - "then": "circle:#FE6F32;./assets/themes/natuurpunt/wheelchair.svg" - }, - { - "if": "toilets:position=urinals", - "then": "circle:#FE6F32;./assets/themes/natuurpunt/urinal.svg" + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/toilets.svg", + "mappings": [ + { + "if": "wheelchair=yes", + "then": "circle:#FE6F32;./assets/themes/natuurpunt/wheelchair.svg" + }, + { + "if": "toilets:position=urinals", + "then": "circle:#FE6F32;./assets/themes/natuurpunt/urinal.svg" + } + ] } - ] - } + } + ] } }, { @@ -170,10 +190,14 @@ "geoJsonZoomLevel": 12, "isOsmCache": true }, - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/birdhide.svg", - "mappings": null - } + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/birdhide.svg", + "mappings": null + } + } + ] } }, { @@ -185,9 +209,13 @@ "geoJsonZoomLevel": 12, "isOsmCache": true }, - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/picnic_table.svg" - } + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/picnic_table.svg" + } + } + ] } }, { @@ -199,35 +227,39 @@ "geoJsonZoomLevel": 12, "isOsmCache": true }, - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/drips.svg" - } + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/drips.svg" + } + } + ] } }, { "builtin": "parking", "override": { "minzoom": "16", - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/parking.svg", - "mappings": [ - { - "if": "amenity=bicycle_parking", - "then": "circle:#FE6F32;./assets/themes/natuurpunt/parkingbike.svg" - } - ] - }, - "iconOverlays": [ + "mapRendering": [ { - "if": "amenity=motorcycle_parking", - "then": "circle:#335D9F;./assets/themes/natuurpunt/parkingmotor.svg", - "badge": true + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/parking.svg", + "mappings": [ + { + "if": "amenity=bicycle_parking", + "then": "circle:#FE6F32;./assets/themes/natuurpunt/parkingbike.svg" + } + ] + }, + "iconOverlays": [ + { + "if": "capacity:disabled=yes", + "then": "circle:#335D9F;./assets/themes/natuurpunt/parkingwheels.svg", + "badge": true + } + ] }, - { - "if": "capacity:disabled=yes", - "then": "circle:#335D9F;./assets/themes/natuurpunt/parkingwheels.svg", - "badge": true - } + null ] } }, @@ -240,9 +272,13 @@ "geoJsonZoomLevel": 12, "isOsmCache": true }, - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/information_board.svg" - } + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/information_board.svg" + } + } + ] } }, { @@ -254,9 +290,13 @@ "geoJsonZoomLevel": 12, "isOsmCache": true }, - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/bench.svg" - } + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/bench.svg" + } + } + ] } }, { @@ -268,9 +308,13 @@ "geoJsonZoomLevel": 12, "isOsmCache": true }, - "icon": { - "render": "circle:#FE6F32;./assets/themes/natuurpunt/watermill.svg" - } + "mapRendering": [ + { + "icon": { + "render": "circle:#FE6F32;./assets/themes/natuurpunt/watermill.svg" + } + } + ] } } ], diff --git a/assets/themes/openwindpowermap/openwindpowermap.json b/assets/themes/openwindpowermap/openwindpowermap.json index f777703d06..48d78c89bf 100644 --- a/assets/themes/openwindpowermap/openwindpowermap.json +++ b/assets/themes/openwindpowermap/openwindpowermap.json @@ -44,7 +44,6 @@ "osmTags": "generator:source=wind" }, "minzoom": 10, - "wayHandling": 1, "title": { "render": { "en": "wind turbine", @@ -65,16 +64,6 @@ } ] }, - "icon": "./assets/themes/openwindpowermap/wind_turbine.svg", - "iconSize": "40, 40, bottom", - "label": { - "mappings": [ - { - "if": "generator:output:electricity~^[0-9]+.*[W]$", - "then": "
    {generator:output:electricity}
    " - } - ] - }, "tagRenderings": [ { "id": "turbine-output", @@ -269,6 +258,24 @@ } ] } + ], + "mapRendering": [ + { + "icon": "./assets/themes/openwindpowermap/wind_turbine.svg", + "label": { + "mappings": [ + { + "if": "generator:output:electricity~^[0-9]+.*[W]$", + "then": "
    {generator:output:electricity}
    " + } + ] + }, + "iconSize": "40, 40, bottom", + "location": [ + "point", + "centroid" + ] + } ] } ], diff --git a/assets/themes/postboxes/post_office.svg b/assets/themes/postboxes/post_office.svg index ebdd76b493..fbf0b19436 100644 --- a/assets/themes/postboxes/post_office.svg +++ b/assets/themes/postboxes/post_office.svg @@ -1 +1,28 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/themes/postboxes/postbox.svg b/assets/themes/postboxes/postbox.svg index 05e6d95d4d..aaa8d5103a 100644 --- a/assets/themes/postboxes/postbox.svg +++ b/assets/themes/postboxes/postbox.svg @@ -1,7 +1,7 @@ - + - + - - - - - - - + + + - - - - - - - - + - - - + + + diff --git a/assets/themes/postboxes/postboxes.json b/assets/themes/postboxes/postboxes.json index a7b2a558d8..086b5f4235 100644 --- a/assets/themes/postboxes/postboxes.json +++ b/assets/themes/postboxes/postboxes.json @@ -3,8 +3,8 @@ "title": { "en": "Postbox and Post Office Map", "de": "Karte mit Briefkästen und Poststellen", - "it": "Buche delle lettere e uffici postali", - "nb_NO": "Postboks og postkontor-kart" + "nb_NO": "Postboks og postkontor-kart", + "it": "Buche delle lettere e uffici postali" }, "shortDescription": { "en": "A map showing postboxes and post offices", @@ -38,9 +38,7 @@ "id": "postboxes", "name": { "en": "Postboxes", - "de": "Brieflästen", - "it": "Buche delle lettere", - "nb_NO": "Postbokser" + "de": "Brieflästen" }, "minzoom": 12, "source": { @@ -49,16 +47,12 @@ "title": { "render": { "en": "Postbox", - "de": "Briefkasten", - "it": "Buca delle lettere", - "nb_NO": "Postboks" + "de": "Briefkasten" } }, "description": { "en": "The layer showing postboxes.", - "de": "Die Ebene zeigt Briefkästen.", - "it": "Il livello che mostra le buche delle lettere.", - "nb_NO": "Laget viser postbokser." + "de": "Die Ebene zeigt Briefkästen." }, "tagRenderings": [ "images", @@ -67,18 +61,6 @@ "render": "{minimap(18): height: 5rem; overflow: hidden; border-radius:3rem; }" } ], - "icon": { - "render": "./assets/themes/postboxes/postbox.svg" - }, - "width": { - "render": "1" - }, - "iconSize": { - "render": "40,40,bottom" - }, - "color": { - "render": "#DADADA" - }, "presets": [ { "tags": [ @@ -86,13 +68,10 @@ ], "title": { "en": "postbox", - "de": "Briefkasten", - "it": "Buca delle lettere", - "nb_NO": "postboks" + "de": "Briefkasten" } } ], - "wayHandling": 2, "deletion": { "softDeletionTags": { "and": [ @@ -100,15 +79,35 @@ "razed:amenity=post_box" ] } - } + }, + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/postboxes/postbox.svg" + }, + "iconSize": { + "render": "40,40,bottom" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#DADADA" + }, + "width": { + "render": "1" + } + } + ] }, { "id": "postoffices", "name": { "en": "Post offices", - "de": "Poststellen", - "it": "Uffici postali", - "nb_NO": "Postkontor" + "de": "Poststellen" }, "minzoom": 12, "source": { @@ -117,16 +116,12 @@ "title": { "render": { "en": "Post Office", - "de": "Poststelle", - "it": "Ufficio postale", - "nb_NO": "Postkontor" + "de": "Poststelle" } }, "description": { "en": "A layer showing post offices.", - "de": "Eine Ebene mit Postämtern.", - "it": "Un livello che mostra gli uffici postali.", - "nb_NO": "Et lag som viser postkontor." + "de": "Eine Ebene mit Postämtern." }, "tagRenderings": [ "images", @@ -136,49 +131,27 @@ }, { "render": { - "en": "Opening Hours: {opening_hours_table()}", - "it": "Orari di apertura: {opening_hours_table()}" + "en": "Opening Hours: {opening_hours_table()}" }, "freeform": { "key": "opening_hours", "type": "opening_hours" }, "question": { - "en": "What are the opening hours for this post office?", - "it": "Quali sono gli orari di apertura di questo ufficio postale?" + "en": "What are the opening hours for this post office?" }, "mappings": [ { "if": "opening_hours=24/7", "then": { "en": "24/7 opened (including holidays)", - "de": "durchgehend geöffnet (auch an Feiertagen)", - "it": "aperto 24/24h (feste incluse)" + "de": "durchgehend geöffnet (auch an Feiertagen)" } } ], "id": "OH" } ], - "icon": { - "render": "square:white;./assets/themes/postboxes/post_office.svg" - }, - "iconOverlays": [ - { - "if": "opening_hours~*", - "then": "isOpen", - "badge": true - } - ], - "width": { - "render": "1" - }, - "iconSize": { - "render": "40,40,bottom" - }, - "color": { - "render": "#DADADA" - }, "presets": [ { "tags": [ @@ -186,13 +159,10 @@ ], "title": { "en": "Post Office", - "de": "Poststelle", - "it": "Ufficio postale", - "nb_NO": "Postkontor" + "de": "Poststelle" } } ], - "wayHandling": 2, "filter": [ { "id": "is_open", @@ -200,13 +170,40 @@ { "question": { "en": "Currently open", - "de": "Aktuell geöffnet", - "it": "Aperto adesso" + "de": "Aktuell geöffnet" }, "osmTags": "_isOpen=yes" } ] } + ], + "mapRendering": [ + { + "icon": { + "render": "square:white;./assets/themes/postboxes/post_office.svg" + }, + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "isOpen" + } + ], + "iconSize": { + "render": "40,40,bottom" + }, + "location": [ + "point", + "centroid" + ] + }, + { + "color": { + "render": "#DADADA" + }, + "width": { + "render": "1" + } + } ] } ] diff --git a/assets/themes/sidewalks/sidewalks.json b/assets/themes/sidewalks/sidewalks.json new file mode 100644 index 0000000000..71f1baa3c2 --- /dev/null +++ b/assets/themes/sidewalks/sidewalks.json @@ -0,0 +1,184 @@ +{ + "id": "sidewalks", + "title": { + "en": "Sidewalks" + }, + "shortDescription": { + "en": "Sidewalk mapping" + }, + "description": { + "en": "Experimental theme" + }, + "language": [ + "en" + ], + "maintainer": "", + "icon": "./assets/svg/bug.svg", + "version": "0", + "startLat": 0, + "startLon": 0, + "startZoom": 1, + "widenFactor": 0.05, + "socialImage": "", + "hideFromOverview": true, + "layers": [ + { + "id": "sidewalks", + "name": { + "en": "Sidewalks" + }, + "minzoom": 12, + "source": { + "osmTags": { + "or": [ + "highway=residential", + "highway=unclassified", + "highway=tertiary", + "highway=secondary" + ] + } + }, + "title": { + "render": { + "en": "{name}" + }, + "mappings": [ + { + "if": "name=", + "then": "Nameless street" + } + ] + }, + "description": { + "en": "Layer showing sidewalks of highways" + }, + "tagRenderings": [ + { + "id": "streetname", + "render": { + "en": "This street is named {name}" + } + }, + { + "rewrite": { + "sourceString": "left|right", + "into": [ + "left", + "right" + ] + }, + "renderings": [ + { + "id": "sidewalk_minimap", + "render": "{sided_minimap(left|right):height:8rem;border-radius:0.5rem;overflow:hidden}" + }, + { + "id": "has_sidewalk", + "question": "Is there a sidewalk on this side of the road?", + "mappings": [ + { + "if": "sidewalk:left|right=yes", + "then": "Yes, there is a sidewalk on this side of the road" + }, + { + "if": "sidewalk:left|right=no", + "then": "No, there is no seperated sidewalk to walk on" + } + ] + }, + { + "id": "sidewalk_width", + "question": "What is the width of the sidewalk on this side of the road?", + "render": "This sidewalk is {sidewalk:left|right:width}m wide", + "condition": "sidewalk:left|right=yes", + "freeform": { + "key": "sidewalk:left|right:width", + "type": "length", + "helperArgs": [ + "21", + "map" + ] + } + } + ] + } + ], + "mapRendering": [ + { + "location": [ + "start", + "end" + ], + "icon": "circle:#ccc", + "iconSize": "3,3,center" + }, + { + "#": "The center line", + "color": "#ffffff55", + "width": 8, + "lineCap": "butt" + }, + { + "#": "left", + "color": { + "render": "#888" + }, + "dashArray": { + "render": "", + "mappings": [ + { + "if": "sidewalk:left=", + "then": "1,12" + } + ] + }, + "width": { + "render": 6, + "mappings": [ + { + "if": { + "or": [ + "sidewalk:left=no", + "sidewalk:left=separate" + ] + }, + "then": 0 + } + ] + }, + "offset": -6, + "lineCap": "butt" + }, + { + "color": "#888", + "dashArray": { + "render": "", + "mappings": [ + { + "if": "sidewalk:right=", + "then": "1,12" + } + ] + }, + "width": { + "render": 6, + "mappings": [ + { + "if": { + "or": [ + "sidewalk:right=no", + "sidewalk:right=separate" + ] + }, + "then": 0 + } + ] + }, + "lineCap": "butt", + "offset": 6 + } + ], + "allowSplit": true + } + ] +} \ No newline at end of file diff --git a/assets/themes/speelplekken/license_info.json b/assets/themes/speelplekken/license_info.json index fbdc72859e..2bfa81a9c0 100644 --- a/assets/themes/speelplekken/license_info.json +++ b/assets/themes/speelplekken/license_info.json @@ -73,17 +73,6 @@ "https://www.provincieantwerpen.be/" ] }, - { - "path": "walking_route.svg", - "license": "CC-BY-SA 4.0", - "authors": [ - "Gitte Loos (Createlli) in opdracht van Provincie Antwerpen " - ], - "sources": [ - "https://createlli.com/", - "https://www.provincieantwerpen.be/" - ] - }, { "path": "youtube.svg", "license": "Logo (all rights reserved)", diff --git a/assets/themes/speelplekken/speelplekken.json b/assets/themes/speelplekken/speelplekken.json index d25d24cf93..303c588a6f 100644 --- a/assets/themes/speelplekken/speelplekken.json +++ b/assets/themes/speelplekken/speelplekken.json @@ -33,10 +33,14 @@ "osmTags": "shadow=yes", "isOsmCache": false }, - "color": "#444444", - "width": { - "render": "1" - } + "mapRendering": [ + { + "color": "#444444", + "width": { + "render": "1" + } + } + ] }, { "builtin": "play_forest", @@ -138,7 +142,6 @@ }, { "id": "walking_routes", - "icon": "./assets/themes/speelplekken/walking_route.svg", "name": { "nl": "Wandelroutes van provincie Antwerpen" }, @@ -237,22 +240,26 @@ "questions", "reviews" ], - "color": { - "render": "#6d6", - "mappings": [ - { - "if": "color~*", - "then": "{color}" + "mapRendering": [ + { + "color": { + "render": "#6d6", + "mappings": [ + { + "if": "color~*", + "then": "{color}" + }, + { + "if": "colour~*", + "then": "{colour}" + } + ] }, - { - "if": "colour~*", - "then": "{colour}" + "width": { + "render": "9" } - ] - }, - "width": { - "render": "9" - } + } + ] } ], "clustering": { diff --git a/assets/themes/street_lighting/street_lighting.json b/assets/themes/street_lighting/street_lighting.json new file mode 100644 index 0000000000..586d26b68a --- /dev/null +++ b/assets/themes/street_lighting/street_lighting.json @@ -0,0 +1,183 @@ +{ + "id": "street_lighting", + "maintainer": "Robin van der Linde", + "version": "2021-10-22", + "language": [ + "en", + "nl" + ], + "title": { + "en": "Street Lighting", + "nl": "Straatverlichting" + }, + "description": { + "en": "On this map you can find everything about street lighting", + "nl": "Op deze kaart vind je alles over straatlantaarns" + }, + "icon": "./assets/layers/street_lamps/street_lamp.svg", + "startZoom": 19, + "startLat": 52.99319, + "startLon": 6.56113, + "layers": [ + "street_lamps", + { + "id": "lit_streets", + "name": { + "en": "Lit streets", + "nl": "Verlichte straten" + }, + "source": { + "osmTags": { + "and": [ + "highway!=", + "lit!=no", + "lit!=", + "service!=driveway" + ] + } + }, + "minZoom": 16, + "title": { + "render": { + "en": "Lit street", + "nl": "Verlichte straat" + }, + "mappings": [ + { + "if": "name~*", + "then": "{name}" + } + ] + }, + "mapRendering": [ + { + "color": "#ff0" + } + ], + "tagRenderings": [ + { + "id": "lit", + "question": { + "en": "Is this street lit?", + "nl": "Is deze straat verlicht?" + }, + "mappings": [ + { + "if": "lit=yes", + "then": { + "en": "This street is lit", + "nl": "Deze straat is verlicht" + } + }, + { + "if": "lit=no", + "then": { + "en": "This street is not lit", + "nl": "Deze straat is niet verlicht" + } + }, + { + "if": "lit=sunset-sunrise", + "then": { + "en": "This street is lit at night", + "nl": "Deze straat is 's nachts verlicht" + }, + "hideInAnswer": true + }, + { + "if": "lit=24/7", + "then": { + "en": "This street is lit 24/7", + "nl": "Deze straat is 24/7 verlicht" + } + } + ] + } + ], + "allowSplit": true + }, + { + "id": "all_streets", + "name": { + "en": "All streets", + "nl": "Alle straten" + }, + "source": { + "osmTags": { + "and": [ + "highway!=", + "service!=driveway", + "highway!=platform" + ] + } + }, + "minZoom": 19, + "title": { + "render": { + "en": "Street", + "nl": "Straat" + }, + "mappings": [ + { + "if": "name~*", + "then": "{name}" + } + ] + }, + "mapRendering": [ + { + "color": { + "render": "#a9a9a9", + "mappings": [ + { + "if": "lit=no", + "then": "#303030" + } + ] + } + } + ], + "tagRenderings": [ + { + "id": "lit", + "question": { + "en": "Is this street lit?", + "nl": "Is deze straat verlicht?" + }, + "mappings": [ + { + "if": "lit=yes", + "then": { + "en": "This street is lit", + "nl": "Deze straat is verlicht" + } + }, + { + "if": "lit=no", + "then": { + "en": "This street is not lit", + "nl": "Deze straat is niet verlicht" + } + }, + { + "if": "lit=sunset-sunrise", + "then": { + "en": "This street is lit at night", + "nl": "Deze straat is 's nachts verlicht" + }, + "hideInAnswer": true + }, + { + "if": "lit=24/7", + "then": { + "en": "This street is lit 24/7", + "nl": "Deze straat is 24/7 verlicht" + } + } + ] + } + ], + "allowSplit": true + } + ] +} \ No newline at end of file diff --git a/assets/themes/street_lighting/street_lighting_assen.json b/assets/themes/street_lighting/street_lighting_assen.json new file mode 100644 index 0000000000..7f98cdcd70 --- /dev/null +++ b/assets/themes/street_lighting/street_lighting_assen.json @@ -0,0 +1,61 @@ +{ + "id": "street_lighting_assen", + "maintainer": "Robin van der Linde", + "version": "2021-10-22", + "language": [ + "nl", + "en" + ], + "title": { + "nl": "Straatverlichting - Assen" + }, + "description": { + "nl": "Op deze kaart vind je alles over straatlantaarns + een dataset van Assen" + }, + "icon": "./assets/layers/street_lamps/street_lamp.svg", + "startZoom": 19, + "startLat": 52.99319, + "startLon": 6.56113, + "layers": [ + "street_lamps", + { + "id": "Assen", + "name": "Dataset Assen", + "source": { + "osmTags": "Lichtmastnummer~*", + "#geoJson": "https://opendata.arcgis.com/datasets/ba37cdb372064b3199c548b75d16a609_0.geojson", + "geoJson": "https://robinlinde.github.io/tiles/assen_street_lighting/{z}/{x}/{y}.json", + "geoJsonZoomLevel": 16, + "isOsmCache": false + }, + "calculatedTags": [ + "_closest_osm_street_lamp=feat.closest('street_lamps')?.properties?.id", + "_closest_osm_street_lamp_distance=feat.distanceTo(feat.properties._closest_osm_street_lamp) * 1000", + "_has_closeby_feature=Number(feat.properties._closest_osm_street_lamp_distance) < 5 ? 'yes' : 'no'" + ], + "title": "Straatlantaarn in dataset", + "mapRendering": [ + { + "location": [ + "point", + "centroid" + ], + "icon": { + "render": "circle:red", + "mappings": [ + { + "if": "_has_closeby_feature=yes", + "then": "circle:#008000aa" + } + ] + }, + "iconSize": "20,20,center" + } + ], + "tagRenderings": [ + "all_tags" + ] + } + ], + "hideFromOverview": true +} \ No newline at end of file diff --git a/assets/themes/toerisme_vlaanderen/custom.css b/assets/themes/toerisme_vlaanderen/custom.css new file mode 100644 index 0000000000..e030e7ed19 --- /dev/null +++ b/assets/themes/toerisme_vlaanderen/custom.css @@ -0,0 +1,3 @@ +.technical.questions { + display: none +} \ No newline at end of file diff --git a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json index 911cf7ac91..9f5f0c3cc4 100644 --- a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json +++ b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json @@ -3,6 +3,7 @@ "credits": "Commissioned theme for Toerisme Vlaandere", "maintainer": "MapComplete", "version": "0.0.1", + "customCss": "./assets/themes/toerisme_vlaanderen/custom.css", "language": [ "en", "nl" @@ -28,52 +29,14 @@ "startLon": 4.433, "widenFactor": 1.5, "layers": [ - { - "builtin": [ - "food", - "cafe_pub" - ], - "override": { - "minzoom": 17 - } - }, - { - "builtin": [ - "bench", - "picnic_table", - "waste_basket" - ], - "override": { - "minzoom": 19 - } - }, { "builtin": [ "charging_station", - "toilet", - "bike_repair_station" + "toilet" ], "override": { "minzoom": 14 } - }, - { - "builtin": [ - "playground" - ], - "override": { - "minzoom": 14, - "iconSize": "25,25,center" - } - }, - { - "builtin": [ - "binocular", - "observation_tower" - ], - "override": { - "minzoom": 10 - } } ], "hideFromOverview": true diff --git a/assets/themes/trees/trees.json b/assets/themes/trees/trees.json index 4cb72281e5..85b4a69bee 100644 --- a/assets/themes/trees/trees.json +++ b/assets/themes/trees/trees.json @@ -10,7 +10,8 @@ "zh_Hant": "樹木", "pl": "Drzewa", "de": "Bäume", - "nb_NO": "Trær" + "nb_NO": "Trær", + "id": "Pohon" }, "shortDescription": { "nl": "Breng bomen in kaart", @@ -45,7 +46,8 @@ "zh_Hant", "pl", "de", - "nb_NO" + "nb_NO", + "id" ], "maintainer": "Midgard", "icon": "./assets/themes/trees/logo.svg", diff --git a/assets/themes/uk_addresses/Commemorative_plaque_on_Elizabeth_House_-_geograph.org.uk_-_2693028.jpg b/assets/themes/uk_addresses/Commemorative_plaque_on_Elizabeth_House_-_geograph.org.uk_-_2693028.jpg new file mode 100644 index 0000000000..a51b9a8267 Binary files /dev/null and b/assets/themes/uk_addresses/Commemorative_plaque_on_Elizabeth_House_-_geograph.org.uk_-_2693028.jpg differ diff --git a/assets/themes/uk_addresses/Plaque,_Raphoe_House_-_geograph.org.uk_-_1925685.jpg b/assets/themes/uk_addresses/Plaque,_Raphoe_House_-_geograph.org.uk_-_1925685.jpg new file mode 100644 index 0000000000..c38517431b Binary files /dev/null and b/assets/themes/uk_addresses/Plaque,_Raphoe_House_-_geograph.org.uk_-_1925685.jpg differ diff --git a/assets/themes/uk_addresses/Plaque,_Séamus_Roddy_House_-_geograph.org.uk_-_2000318.jpg b/assets/themes/uk_addresses/Plaque,_Séamus_Roddy_House_-_geograph.org.uk_-_2000318.jpg new file mode 100644 index 0000000000..c4c68b90bf Binary files /dev/null and b/assets/themes/uk_addresses/Plaque,_Séamus_Roddy_House_-_geograph.org.uk_-_2000318.jpg differ diff --git a/assets/themes/uk_addresses/housenumber_add.svg b/assets/themes/uk_addresses/housenumber_add.svg index e156438b11..526c2378c5 100644 --- a/assets/themes/uk_addresses/housenumber_add.svg +++ b/assets/themes/uk_addresses/housenumber_add.svg @@ -1,289 +1,288 @@ - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + viewBox="0 0 94.602035 93.872619" + id="svg12" + sodipodi:docname="housenumber_add.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="94.602036" + height="93.87262"> + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + style="fill:none" + id="g912" + transform="matrix(0.45212065,0,0,0.45212065,50.29421,49.55511)"> + + + + - diff --git a/assets/themes/uk_addresses/housenumber_ok.svg b/assets/themes/uk_addresses/housenumber_ok.svg index bf5f1b9db0..b3f9447d41 100644 --- a/assets/themes/uk_addresses/housenumber_ok.svg +++ b/assets/themes/uk_addresses/housenumber_ok.svg @@ -1,75 +1,74 @@ - - - - image/svg+xml - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + viewBox="0 0 87.992996 87.883003" + id="svg12" + sodipodi:docname="housenumber_ok.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="87.992996" + height="87.883003"> + + + + image/svg+xml + + + + + + + + d="m 14.044,0 h 59.905 c 7.7801,0 14.044,6.2634 14.044,14.044 v 59.795 c 0,7.7801 -6.2634,14.044 -14.044,14.044 H 14.044 C 6.2639,87.883 0,81.6196 0,73.839 V 14.044 C 0,6.2639 6.2634,0 14.044,0 Z" + style="fill:#495aad;paint-order:normal" + id="path6" + inkscape:connector-curvature="0"/> - + d="m 8.747,22.773 v 42.233 c 7.0389,0 14.078,7.0389 14.078,14.078 h 42.233 c 0,-7.0389 7.0389,-14.078 14.078,-14.078 V 22.773 c -7.0389,0 -14.078,-7.0389 -14.078,-14.078 H 22.825 c 0,7.0389 -7.0389,14.078 -14.078,14.078 z" + id="path8" + inkscape:connector-curvature="0" + style="fill:none;stroke:#ffffff;stroke-width:5.01520014"/> + + + + diff --git a/assets/themes/uk_addresses/housenumber_text.svg b/assets/themes/uk_addresses/housenumber_text.svg index 56d57373ee..4becd5d9bf 100644 --- a/assets/themes/uk_addresses/housenumber_text.svg +++ b/assets/themes/uk_addresses/housenumber_text.svg @@ -1,72 +1,73 @@ - - - - image/svg+xml - - - - - - - - - + + + + image/svg+xml + + + + + + + + + OK + y="47.845253" /> + OK + diff --git a/assets/themes/uk_addresses/housenumber_unknown.svg b/assets/themes/uk_addresses/housenumber_unknown.svg index 0c6c0e5c46..1d39b086bc 100644 --- a/assets/themes/uk_addresses/housenumber_unknown.svg +++ b/assets/themes/uk_addresses/housenumber_unknown.svg @@ -1,70 +1,69 @@ - - - - image/svg+xml - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + viewBox="0 0 87.992996 87.883003" + id="svg12" + sodipodi:docname="housenumber.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="87.992996" + height="87.883003"> + + + + image/svg+xml + + + + + + - + d="m 14.044,0 h 59.905 c 7.7801,0 14.044,6.2634 14.044,14.044 v 59.795 c 0,7.7801 -6.2634,14.044 -14.044,14.044 H 14.044 C 6.2639,87.883 0,81.6196 0,73.839 V 14.044 C 0,6.2639 6.2634,0 14.044,0 Z" + style="fill:#495aad;paint-order:normal" + id="path6" + inkscape:connector-curvature="0"/> + + + + diff --git a/assets/themes/uk_addresses/housenumber_unknown_small.svg b/assets/themes/uk_addresses/housenumber_unknown_small.svg index f02f8e6434..ef3a91c53c 100644 --- a/assets/themes/uk_addresses/housenumber_unknown_small.svg +++ b/assets/themes/uk_addresses/housenumber_unknown_small.svg @@ -1,65 +1,64 @@ - - - - image/svg+xml - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + viewBox="0 0 87.992996 87.883003" + id="svg12" + sodipodi:docname="housenumber_unknown_small.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="87.992996" + height="87.883003"> + + + + image/svg+xml + + + + + + + + + diff --git a/assets/themes/uk_addresses/islington_small_piece.geojson b/assets/themes/uk_addresses/islington_small_piece.geojson index ced6a1fb13..b6c9c14b33 100644 --- a/assets/themes/uk_addresses/islington_small_piece.geojson +++ b/assets/themes/uk_addresses/islington_small_piece.geojson @@ -1,2163 +1,2162 @@ - { - "type": "FeatureCollection", - "generator": "JOSM", - "features": [ - { - "type": "Feature", - "properties": { - "inspireid": "44760782", - "uprn_count": "19" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08528530407, - 51.52103754846 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760166", - "uprn_count": "18" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08518862375, - 51.52302887251 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53875715", - "uprn_count": "176" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08768220681, - 51.52027207654 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "48199892", - "uprn_count": "32" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09051161088, - 51.52328524465 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760298", - "uprn_count": "21" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08519096645, - 51.52229137569 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760648", - "uprn_count": "43" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09039984580, - 51.52168966695 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760158", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08979845152, - 51.52470373164 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760268", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08584518403, - 51.52362781792 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760606", - "uprn_count": "34" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08574285775, - 51.52447487890 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760147", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08478417875, - 51.52230226544 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760181", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08597751642, - 51.52262480980 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "59756691", - "uprn_count": "68" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09000674703, - 51.52412334790 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53839893", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08632490840, - 51.51956380364 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760254", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08445931332, - 51.52362994921 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760985", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08550522898, - 51.52481338112 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53517508", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08531729267, - 51.52055437518 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760172", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08621709906, - 51.52245066605 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53815743", - "uprn_count": "28" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08609559738, - 51.52000280555 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760229", - "uprn_count": "2" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08466859613, - 51.52247735237 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "52054693", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08869160634, - 51.52496110557 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760329", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08610136910, - 51.52318693588 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760753", - "uprn_count": "9" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08538513949, - 51.52424009690 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760164", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09008514341, - 51.52505292621 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760216", - "uprn_count": "190" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08700282926, - 51.52503663329 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760279", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08530920735, - 51.52549852437 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613792", - "uprn_count": "72" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08833908631, - 51.52631952661 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760639", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08580868931, - 51.52429800891 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760153", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08456440427, - 51.52329504288 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760200", - "uprn_count": "95" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08770188351, - 51.52407460026 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "47582675", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08892578863, - 51.52706921088 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760263", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08583263531, - 51.52548367268 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613655", - "uprn_count": "18" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08843733386, - 51.52669877413 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760564", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09046694451, - 51.52125764642 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760143", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08576039998, - 51.52479998964 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "57943078", - "uprn_count": "80" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08990077541, - 51.52590434415 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760178", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08479378350, - 51.52288142387 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760247", - "uprn_count": "16" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08570423028, - 51.52383831047 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "60347715", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08913137569, - 51.52638282816 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760169", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08741982002, - 51.52232472527 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53876178", - "uprn_count": "14" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08848929384, - 51.51968662476 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "58831132", - "uprn_count": "120" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08811742827, - 51.52524678003 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760702", - "uprn_count": "17" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08626679662, - 51.52229285532 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "56996893", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08961930563, - 51.52736429296 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760161", - "uprn_count": "30" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08903973308, - 51.52443351442 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "57212602", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09025128250, - 51.52349660479 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760214", - "uprn_count": "30" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08491766007, - 51.52195690215 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760274", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08710416098, - 51.52394294309 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613782", - "uprn_count": "11" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08630939921, - 51.52567781493 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760635", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08591747289, - 51.52406421610 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760150", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08736624492, - 51.52184217908 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760190", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08950436522, - 51.52301269883 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53842347", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08629952517, - 51.51902467199 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760261", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08870422830, - 51.52481415717 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613643", - "uprn_count": "108" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08522752552, - 51.52590169102 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760506", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08680870061, - 51.52270885497 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53529840", - "uprn_count": "14" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08752332940, - 51.52076211974 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "55694053", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08582489157, - 51.52423214013 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760232", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08460415534, - 51.52252827681 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "55841333", - "uprn_count": "23" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09046401124, - 51.52500845422 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760366", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08665901033, - 51.52347731730 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760167", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08523817483, - 51.52199801036 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53875840", - "uprn_count": "21" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08790573136, - 51.52005170198 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760300", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08523971621, - 51.52550166079 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760673", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08740702488, - 51.52227145851 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760159", - "uprn_count": "37" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09015395806, - 51.52469077487 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760210", - "uprn_count": "10" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08735406455, - 51.52190815063 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760269", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08517606458, - 51.52360663718 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613767", - "uprn_count": "38" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08894666543, - 51.52728330710 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760630", - "uprn_count": "9" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08596436686, - 51.52399163027 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760148", - "uprn_count": "90" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08559244253, - 51.52179703997 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53555715", - "uprn_count": "23" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09069974009, - 51.52099643929 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "54843927", - "uprn_count": "36" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08536900467, - 51.52258204957 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760186", - "uprn_count": "60" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08749154622, - 51.52123763708 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "59797478", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08460319625, - 51.52285695300 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53842288", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08651616784, - 51.51911374360 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760258", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08880030229, - 51.52508388296 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760450", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08877219383, - 51.52489267275 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760989", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09008638232, - 51.52338474772 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53523418", - "uprn_count": "36" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08833393118, - 51.52076103473 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760173", - "uprn_count": "17" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08907044601, - 51.52478857712 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "56354285", - "uprn_count": "41" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08708248675, - 51.51950432943 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53815989", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08712150084, - 51.52007985063 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760230", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08459866660, - 51.52256307871 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53894914", - "uprn_count": "53" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08932705394, - 51.52020780589 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760340", - "uprn_count": "57" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08700821071, - 51.52470369200 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760757", - "uprn_count": "94" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08629573687, - 51.52185922605 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760165", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08568241478, - 51.52253231799 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760289", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08494465189, - 51.52548899801 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760645", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08589810776, - 51.52411473063 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "57797640", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08496788091, - 51.52179114697 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "56970529", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08673035105, - 51.52606173015 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760156", - "uprn_count": "11" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08743964400, - 51.52240633893 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53673626", - "uprn_count": "20" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08457962682, - 51.52315791127 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760202", - "uprn_count": "63" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08514280715, - 51.52153941124 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "47582725", - "uprn_count": "2" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08903179064, - 51.52700439325 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760266", - "uprn_count": "66" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08958919395, - 51.52486571171 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613662", - "uprn_count": "2" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09055456990, - 51.52704347329 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760589", - "uprn_count": "10" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08739339578, - 51.52221604989 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "47863432", - "uprn_count": "20" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08656652832, - 51.52377354927 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760179", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08735058986, - 51.52204111283 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760248", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08545068911, - 51.52547159555 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760404", - "uprn_count": "23" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08569047233, - 51.52316678822 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "60347880", - "uprn_count": "156" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08873887407, - 51.52589244765 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760981", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08508447894, - 51.52250703445 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53517488", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08540249619, - 51.52063943555 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760170", - "uprn_count": "23" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08950340680, - 51.52518881505 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53815719", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08580214812, - 51.51976909788 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760228", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08461864254, - 51.52260180398 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53877676", - "uprn_count": "29" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08850676500, - 51.52023902397 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760314", - "uprn_count": "15" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08872036555, - 51.52471439061 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760751", - "uprn_count": "180" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08677326589, - 51.52308738524 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760162", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08893070202, - 51.52527974813 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760215", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08750749576, - 51.52270832689 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760278", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08509855123, - 51.52550722342 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613787", - "uprn_count": "11" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09045829084, - 51.52773739133 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760638", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08587468014, - 51.52417859166 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760151", - "uprn_count": "15" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08738616252, - 51.52175540266 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760195", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08577241806, - 51.52228063806 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760262", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08881139622, - 51.52515946758 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613654", - "uprn_count": "30" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08841210101, - 51.52660740062 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760559", - "uprn_count": "2" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09036979446, - 51.52201621806 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760051", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08651408714, - 51.52230407716 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53530202", - "uprn_count": "21" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08558143776, - 51.52017053246 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760177", - "uprn_count": "115" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09011378562, - 51.52279114581 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760235", - "uprn_count": "41" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08631542933, - 51.52256625361 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760839", - "uprn_count": "19" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09069863118, - 51.52235527530 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760168", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08591546179, - 51.52346670045 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53876171", - "uprn_count": "112" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08780026547, - 51.51966975438 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760301", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08517005909, - 51.52550434483 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760686", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08683964335, - 51.52238336083 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760160", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08554780465, - 51.52227517161 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "54668028", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08868565970, - 51.52707814958 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760271", - "uprn_count": "9" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08511551871, - 51.52564108792 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613778", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08556279304, - 51.52566116202 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "58775318", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08476391706, - 51.52322955215 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760634", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08575556474, - 51.52523072818 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760149", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08736477713, - 51.52209660754 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "57099529", - "uprn_count": "14" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08747715586, - 51.52255778464 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760189", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08645676995, - 51.52485658336 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53842336", - "uprn_count": "16" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08644851873, - 51.51932417520 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "55728650", - "uprn_count": "15" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08606772431, - 51.51932747399 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760259", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08879089932, - 51.52501718371 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "56517732", - "uprn_count": "16" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08537944456, - 51.52045732895 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613640", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08508351171, - 51.52602201951 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760498", - "uprn_count": "9" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08737904118, - 51.52215533460 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "60457716", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08741608314, - 51.52162504468 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "50741600", - "uprn_count": "11" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08601118306, - 51.52237364065 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53528831", - "uprn_count": "18" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08796303430, - 51.52075390699 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760174", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08975339083, - 51.52521825973 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53815990", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08698937756, - 51.52000181841 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760231", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08485451783, - 51.52255188290 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "51082874", - "uprn_count": "15" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08930634369, - 51.52701309542 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760352", - "uprn_count": "14" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08734604831, - 51.52197314390 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "56669648", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08851621061, - 51.52684922637 - ] - } - } - ] + "type": "FeatureCollection", + "generator": "JOSM", + "features": [ + { + "type": "Feature", + "properties": { + "inspireid": "44760782", + "uprn_count": "19" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08528530407, + 51.52103754846 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760166", + "uprn_count": "18" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08518862375, + 51.52302887251 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53875715", + "uprn_count": "176" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08768220681, + 51.52027207654 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "48199892", + "uprn_count": "32" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09051161088, + 51.52328524465 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760298", + "uprn_count": "21" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08519096645, + 51.52229137569 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760648", + "uprn_count": "43" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09039984580, + 51.52168966695 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760158", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08979845152, + 51.52470373164 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760268", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08584518403, + 51.52362781792 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760606", + "uprn_count": "34" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08574285775, + 51.52447487890 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760147", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08478417875, + 51.52230226544 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760181", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08597751642, + 51.52262480980 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "59756691", + "uprn_count": "68" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09000674703, + 51.52412334790 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53839893", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08632490840, + 51.51956380364 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760254", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08445931332, + 51.52362994921 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760985", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08550522898, + 51.52481338112 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53517508", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08531729267, + 51.52055437518 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760172", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08621709906, + 51.52245066605 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53815743", + "uprn_count": "28" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08609559738, + 51.52000280555 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760229", + "uprn_count": "2" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08466859613, + 51.52247735237 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "52054693", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08869160634, + 51.52496110557 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760329", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08610136910, + 51.52318693588 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760753", + "uprn_count": "9" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08538513949, + 51.52424009690 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760164", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09008514341, + 51.52505292621 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760216", + "uprn_count": "190" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08700282926, + 51.52503663329 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760279", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08530920735, + 51.52549852437 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613792", + "uprn_count": "72" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08833908631, + 51.52631952661 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760639", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08580868931, + 51.52429800891 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760153", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08456440427, + 51.52329504288 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760200", + "uprn_count": "95" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08770188351, + 51.52407460026 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "47582675", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08892578863, + 51.52706921088 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760263", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08583263531, + 51.52548367268 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613655", + "uprn_count": "18" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08843733386, + 51.52669877413 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760564", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09046694451, + 51.52125764642 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760143", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08576039998, + 51.52479998964 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "57943078", + "uprn_count": "80" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08990077541, + 51.52590434415 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760178", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08479378350, + 51.52288142387 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760247", + "uprn_count": "16" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08570423028, + 51.52383831047 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "60347715", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08913137569, + 51.52638282816 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760169", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08741982002, + 51.52232472527 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53876178", + "uprn_count": "14" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08848929384, + 51.51968662476 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "58831132", + "uprn_count": "120" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08811742827, + 51.52524678003 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760702", + "uprn_count": "17" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08626679662, + 51.52229285532 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "56996893", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08961930563, + 51.52736429296 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760161", + "uprn_count": "30" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08903973308, + 51.52443351442 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "57212602", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09025128250, + 51.52349660479 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760214", + "uprn_count": "30" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08491766007, + 51.52195690215 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760274", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08710416098, + 51.52394294309 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613782", + "uprn_count": "11" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08630939921, + 51.52567781493 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760635", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08591747289, + 51.52406421610 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760150", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08736624492, + 51.52184217908 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760190", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08950436522, + 51.52301269883 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53842347", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08629952517, + 51.51902467199 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760261", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08870422830, + 51.52481415717 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613643", + "uprn_count": "108" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08522752552, + 51.52590169102 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760506", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08680870061, + 51.52270885497 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53529840", + "uprn_count": "14" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08752332940, + 51.52076211974 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "55694053", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08582489157, + 51.52423214013 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760232", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08460415534, + 51.52252827681 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "55841333", + "uprn_count": "23" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09046401124, + 51.52500845422 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760366", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08665901033, + 51.52347731730 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760167", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08523817483, + 51.52199801036 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53875840", + "uprn_count": "21" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08790573136, + 51.52005170198 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760300", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08523971621, + 51.52550166079 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760673", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08740702488, + 51.52227145851 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760159", + "uprn_count": "37" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09015395806, + 51.52469077487 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760210", + "uprn_count": "10" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08735406455, + 51.52190815063 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760269", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08517606458, + 51.52360663718 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613767", + "uprn_count": "38" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08894666543, + 51.52728330710 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760630", + "uprn_count": "9" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08596436686, + 51.52399163027 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760148", + "uprn_count": "90" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08559244253, + 51.52179703997 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53555715", + "uprn_count": "23" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09069974009, + 51.52099643929 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "54843927", + "uprn_count": "36" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08536900467, + 51.52258204957 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760186", + "uprn_count": "60" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08749154622, + 51.52123763708 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "59797478", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08460319625, + 51.52285695300 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53842288", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08651616784, + 51.51911374360 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760258", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08880030229, + 51.52508388296 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760450", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08877219383, + 51.52489267275 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760989", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09008638232, + 51.52338474772 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53523418", + "uprn_count": "36" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08833393118, + 51.52076103473 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760173", + "uprn_count": "17" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08907044601, + 51.52478857712 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "56354285", + "uprn_count": "41" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08708248675, + 51.51950432943 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53815989", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08712150084, + 51.52007985063 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760230", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08459866660, + 51.52256307871 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53894914", + "uprn_count": "53" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08932705394, + 51.52020780589 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760340", + "uprn_count": "57" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08700821071, + 51.52470369200 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760757", + "uprn_count": "94" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08629573687, + 51.52185922605 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760165", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08568241478, + 51.52253231799 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760289", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08494465189, + 51.52548899801 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760645", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08589810776, + 51.52411473063 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "57797640", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08496788091, + 51.52179114697 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "56970529", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08673035105, + 51.52606173015 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760156", + "uprn_count": "11" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08743964400, + 51.52240633893 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53673626", + "uprn_count": "20" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08457962682, + 51.52315791127 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760202", + "uprn_count": "63" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08514280715, + 51.52153941124 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "47582725", + "uprn_count": "2" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08903179064, + 51.52700439325 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760266", + "uprn_count": "66" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08958919395, + 51.52486571171 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613662", + "uprn_count": "2" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09055456990, + 51.52704347329 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760589", + "uprn_count": "10" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08739339578, + 51.52221604989 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "47863432", + "uprn_count": "20" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08656652832, + 51.52377354927 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760179", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08735058986, + 51.52204111283 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760248", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08545068911, + 51.52547159555 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760404", + "uprn_count": "23" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08569047233, + 51.52316678822 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "60347880", + "uprn_count": "156" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08873887407, + 51.52589244765 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760981", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08508447894, + 51.52250703445 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53517488", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08540249619, + 51.52063943555 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760170", + "uprn_count": "23" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08950340680, + 51.52518881505 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53815719", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08580214812, + 51.51976909788 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760228", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08461864254, + 51.52260180398 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53877676", + "uprn_count": "29" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08850676500, + 51.52023902397 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760314", + "uprn_count": "15" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08872036555, + 51.52471439061 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760751", + "uprn_count": "180" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08677326589, + 51.52308738524 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760162", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08893070202, + 51.52527974813 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760215", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08750749576, + 51.52270832689 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760278", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08509855123, + 51.52550722342 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613787", + "uprn_count": "11" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09045829084, + 51.52773739133 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760638", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08587468014, + 51.52417859166 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760151", + "uprn_count": "15" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08738616252, + 51.52175540266 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760195", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08577241806, + 51.52228063806 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760262", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08881139622, + 51.52515946758 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613654", + "uprn_count": "30" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08841210101, + 51.52660740062 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760559", + "uprn_count": "2" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09036979446, + 51.52201621806 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760051", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08651408714, + 51.52230407716 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53530202", + "uprn_count": "21" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08558143776, + 51.52017053246 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760177", + "uprn_count": "115" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09011378562, + 51.52279114581 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760235", + "uprn_count": "41" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08631542933, + 51.52256625361 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760839", + "uprn_count": "19" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09069863118, + 51.52235527530 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760168", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08591546179, + 51.52346670045 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53876171", + "uprn_count": "112" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08780026547, + 51.51966975438 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760301", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08517005909, + 51.52550434483 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760686", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08683964335, + 51.52238336083 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760160", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08554780465, + 51.52227517161 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "54668028", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08868565970, + 51.52707814958 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760271", + "uprn_count": "9" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08511551871, + 51.52564108792 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613778", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08556279304, + 51.52566116202 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "58775318", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08476391706, + 51.52322955215 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760634", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08575556474, + 51.52523072818 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760149", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08736477713, + 51.52209660754 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "57099529", + "uprn_count": "14" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08747715586, + 51.52255778464 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760189", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08645676995, + 51.52485658336 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53842336", + "uprn_count": "16" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08644851873, + 51.51932417520 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "55728650", + "uprn_count": "15" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08606772431, + 51.51932747399 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760259", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08879089932, + 51.52501718371 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "56517732", + "uprn_count": "16" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08537944456, + 51.52045732895 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613640", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08508351171, + 51.52602201951 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760498", + "uprn_count": "9" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08737904118, + 51.52215533460 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "60457716", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08741608314, + 51.52162504468 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "50741600", + "uprn_count": "11" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08601118306, + 51.52237364065 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53528831", + "uprn_count": "18" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08796303430, + 51.52075390699 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760174", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08975339083, + 51.52521825973 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53815990", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08698937756, + 51.52000181841 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760231", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08485451783, + 51.52255188290 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "51082874", + "uprn_count": "15" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08930634369, + 51.52701309542 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760352", + "uprn_count": "14" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08734604831, + 51.52197314390 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "56669648", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08851621061, + 51.52684922637 + ] + } + } + ] } \ No newline at end of file diff --git a/assets/themes/uk_addresses/license_info.json b/assets/themes/uk_addresses/license_info.json index 7d805cee45..4bcce8003e 100644 --- a/assets/themes/uk_addresses/license_info.json +++ b/assets/themes/uk_addresses/license_info.json @@ -1,4 +1,34 @@ [ + { + "path": "Commemorative_plaque_on_Elizabeth_House_-_geograph.org.uk_-_2693028.jpg", + "license": "CC-BY-SA 2.0 Unported", + "authors": [ + "Basher Eyre" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Commemorative_plaque_on_Elizabeth_House_-_geograph.org.uk_-_2693028.jpg" + ] + }, + { + "path": "Plaque,_Raphoe_House_-_geograph.org.uk_-_1925685.jpg", + "license": "CC-BY-SA 2.0", + "authors": [ + "Kenneth Allen" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Plaque,_Raphoe_House_-_geograph.org.uk_-_1925685.jpg" + ] + }, + { + "path": "Plaque,_Séamus_Roddy_House_-_geograph.org.uk_-_2000318.jpg", + "license": "CC-BY-SA 2.0 Unported", + "authors": [ + "Kenneth Allen" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Plaque,_S%C3%A9amus_Roddy_House_-_geograph.org.uk_-_2000318.jpg" + ] + }, { "path": "housenumber_add.svg", "license": "CC0", diff --git a/assets/themes/uk_addresses/uk_addresses.json b/assets/themes/uk_addresses/uk_addresses.json index 9f38e0bd30..6d3b5f6fcb 100644 --- a/assets/themes/uk_addresses/uk_addresses.json +++ b/assets/themes/uk_addresses/uk_addresses.json @@ -3,7 +3,8 @@ "title": { "en": "UK Addresses", "de": "Adressen in Großbritannien", - "it": "Indirizzi UK" + "it": "Indirizzi UK", + "id": "Alamat Inggris" }, "shortDescription": { "en": "Help to build an open dataset of UK addresses", @@ -14,14 +15,15 @@ "en": "Contribute to OpenStreetMap by filling out address information", "nl": "Draag bij aan OpenStreetMap door adresinformatie in te vullen", "de": "Tragen Sie zu OpenStreetMap bei, indem Sie Adressinformationen ausfüllen", - "it": "Contribuisci a OpenStreetMap inserendo le informazioni sull’indirizzo" + "it": "Contribuisci a OpenStreetMap inserendo le informazioni sull’indirizzo", + "id": "Berkontribusi untuk OpenStreetMap dengan mengisi informasi alamat" }, "language": [ "en", "de", "it", - "nl", - "nb_NO" + "id", + "nl" ], "maintainer": "Pieter Vander Vennet, Rob Nickerson, Russ Garrett", "icon": "./assets/themes/uk_addresses/housenumber_unknown.svg", @@ -46,16 +48,42 @@ "defaultState": false, "name": { "en": "Property boundaries by osmuk.org", - "de": "Grenzverläufe gemäß osmuk.org", - "it": "Confini delle proprietà di osmuk.org" + "de": "Grenzverläufe gemäß osmuk.org" } } ], "layers": [ + { + "id": "raw_inspire_polygons", + "source": { + "geoJson": "https://osm-uk-addresses.russss.dev/inspire/{z}/{x}/{y}.json", + "osmTags": "inspireid~*", + "geoJsonZoomLevel": 18, + "isOsmCache": false + }, + "minzoom": 18, + "calculatedTags": [ + "_has_address=feat.overlapWith('addresses').length > 0" + ], + "#mapRendering": [ + { + "width": 2, + "color": { + "render": "#00f", + "mappings": [ + { + "if": "_has_address=true", + "then": "#0f0" + } + ] + } + } + ], + "mapRendering": null + }, { "id": "to_import", "source": { - "#geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete/develop/assets/themes/uk_addresses/islington_small_piece.geojson", "geoJson": "https://osm-uk-addresses.russss.dev/addresses/{z}/{x}/{y}.json", "osmTags": "inspireid~*", "geoJsonZoomLevel": 16, @@ -63,46 +91,49 @@ }, "name": "Addresses to check", "minzoom": 14, - "wayHandling": 1, - "icon": { - "render": "./assets/themes/uk_addresses/housenumber_unknown.svg", - "mappings": [ - { - "if": "_embedding_object:id~*", - "then": "./assets/themes/uk_addresses/housenumber_unknown_small.svg" - }, - { - "if": "_imported=yes", - "then": "./assets/themes/uk_addresses/housenumber_unknown_small.svg" - } - ] - }, - "iconSize": { - "render": "40,40,center" - }, "title": { - "render": "Address to be determined" + "render": { + "en": "Address to be determined", + "id": "Alamat yang diketahui" + } }, "tagRenderings": [ { "id": "uk_addresses_explanation", - "render": "There probably is an address here" + "render": { + "en": "There probably is an address here" + } }, { "id": "uk_addresses_embedding_outline", "render": "An outline embedding this point with an address already exists in OpenStreetMap.
    This object has address {_embedding_object:addr:street} {_embedding_object:addr:housenumber}", + "mappings": [ + { + "if": "_embedding_object:id=true", + "then": { + "en": "The INSPIRE-polygon containing this point has at least one address contained" + } + }, + { + "if": "_embedding_object:id=false", + "then": { + "en": "The INSPIRE-polygon containing this point has no addresses contained" + } + } + ], "condition": "_embedding_object:id~*" }, { "id": "uk_addresses_import_button", - "render": "{import_button(ref:inspireid=$inspireid, Add this address, ./assets/themes/uk_addresses/housenumber_add.svg)}" + "render": "{import_button(addresses,ref:inspireid=$inspireid, Add this address, ./assets/themes/uk_addresses/housenumber_add.svg)}" } ], "calculatedTags": [ "_embedding_object=feat.overlapWith('addresses')[0]?.feat?.properties ?? null", "_embedding_object:addr:housenumber=JSON.parse(feat.properties._embedding_object)?.['addr:housenumber']", "_embedding_object:addr:street=JSON.parse(feat.properties._embedding_object)?.['addr:street']", - "_embedding_object:id=JSON.parse(feat.properties._embedding_object)?.id" + "_embedding_inspire_polygon_has_address=feat.overlapWith('raw_inspire_polygons')[0]?.feat?.properties?._has_address", + "_embedding_object:id=feat.get('_embedding_object')?.id ?? feat.properties._embedding_inspire_polygon_has_address" ], "filter": [ { @@ -113,21 +144,54 @@ "osmTags": { "and": [ "_imported=", - "_embedding_object:id=" + { + "or": [ + "_embedding_object:id=", + "_embedding_object:id=false" + ] + } ] } } ] } - ] + ], + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/uk_addresses/housenumber_unknown.svg", + "mappings": [ + { + "if": { + "and": [ + "_embedding_object:id~*", + "_embedding_object:id!=false" + ] + }, + "then": "./assets/themes/uk_addresses/housenumber_unknown_small.svg" + }, + { + "if": "_imported=yes", + "then": "./assets/themes/uk_addresses/housenumber_unknown_small.svg" + } + ] + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point", + "centroid" + ] + } + ], + "description": "Alamat" }, { "id": "addresses", "name": { "en": "Known addresses in OSM", - "de": "Bekannte Adressen in OSM", - "it": "Indirizzo presente su OSM", - "nb_NO": "Kjente adresser i OSM" + "de": "Bekannte Adressen in OSM" }, "minzoom": 18, "source": { @@ -148,25 +212,20 @@ "title": { "render": { "en": "Known address", - "de": "Bekannte Adresse", - "it": "Indirizzo conosciuto", - "nb_NO": "Kjent adresse" + "de": "Bekannte Adresse" } }, "description": { "en": "Addresses", "nl": "Adressen", - "de": "Adressen", - "it": "Indirizzi", - "nb_NO": "Adresser" + "de": "Adressen" }, "tagRenderings": [ { "id": "uk_addresses_explanation_osm", "render": { "en": "This address is saved in OpenStreetMap", - "de": "Diese Adresse ist in OpenStreetMap gespeichert", - "it": "Questo indirizzo è salvato su OpenStreetMap" + "de": "Diese Adresse ist in OpenStreetMap gespeichert" } }, { @@ -174,13 +233,11 @@ "render": { "en": "The housenumber is {addr:housenumber}", "nl": "Het huisnummer is {addr:housenumber}", - "de": "Die Hausnummer ist {addr:housenumber}", - "it": "Il numero civico è {addr:housenumber}" + "de": "Die Hausnummer ist {addr:housenumber}" }, "question": { "en": "What is the number of this house?", - "de": "Wie lautet die Nummer dieses Hauses?", - "it": "Qual è il numero civico di questa casa?" + "de": "Wie lautet die Nummer dieses Hauses?" }, "freeform": { "key": "addr:housenumber", @@ -198,23 +255,47 @@ "then": { "en": "This building has no house number", "nl": "Dit gebouw heeft geen huisnummer", - "de": "Dieses Gebäude hat keine Hausnummer", - "it": "Questo edificio non ha indirizzo" + "de": "Dieses Gebäude hat keine Hausnummer" } } ] }, + { + "id": "uk_addresses_housename", + "question": "What is the name of this house?
    This is normally indicated on a plaque.
    Do NOT add names of inhabitants!
    ", + "render": "This house is named {addr:housename}", + "freeform": { + "key": "addr:housename", + "addExtraTags": [ + "nohousename=" + ] + }, + "mappings": [ + { + "if": "nohousename=yes", + "then": "This building has no housename" + }, + { + "if": { + "and": [ + "addr:housename=", + "nohousenumber!=yes" + ] + }, + "then": "This building has no housename", + "hideInAnswer": true + } + ] + }, { "id": "uk_addresses_street", "render": { "en": "This address is in street {addr:street}", - "de": "Diese Adresse befindet sich in der Straße {addr:street}", - "it": "L’indirizzo è in via {addr:street}" + "de": "Diese Adresse befindet sich in der Straße {addr:street}" }, "question": { "en": "What street is this address located in?", - "de": "In welcher Straße befindet sich diese Adresse?", - "it": "Qual è la via in cui si trova?" + "de": "In welcher Straße befindet sich diese Adresse?" }, "freeform": { "key": "addr:street" @@ -241,52 +322,84 @@ "nohousenumber!~yes" ] } + }, + { + "id": "fixme", + "render": "Fixme description{fixme}", + "question": { + "en": "What should be fixed here? Please explain" + }, + "freeform": { + "key": "fixme" + }, + "mappings": [ + { + "if": "fixme=", + "then": "No fixme - write something here to explain complicated cases" + } + ] + }, + "questions", + { + "id": "address-sign-image", + "render": { + "en": "{image_carousel(image:address)}
    {image_upload(image:address, Add image of the address)}" + } } ], - "icon": { - "render": "./assets/themes/uk_addresses/housenumber_ok.svg", - "mappings": [ - { - "if": { - "or": [ - { - "and": [ - "addr:housenumber=", - "nohousenumber!=yes" + "mapRendering": [ + { + "icon": { + "render": "./assets/themes/uk_addresses/housenumber_ok.svg", + "mappings": [ + { + "if": { + "or": [ + { + "and": [ + "addr:housenumber=", + "nohousenumber!=yes" + ] + }, + "addr:street=" ] }, - "addr:street=" - ] - }, - "then": "./assets/themes/uk_addresses/housenumber_unknown.svg" - } - ] - }, - "width": { - "render": "8" - }, - "iconSize": { - "render": "40,40,center" - }, - "color": { - "render": "#00f", - "mappings": [ - { - "if": { - "or": [ - { - "and": [ - "addr:housenumber=", - "nohousenumber!=yes" + "then": "./assets/themes/uk_addresses/housenumber_unknown.svg" + } + ] + }, + "iconSize": { + "render": "40,40,center" + }, + "location": [ + "point" + ] + }, + { + "color": { + "render": "#00f", + "mappings": [ + { + "if": { + "or": [ + { + "and": [ + "addr:housenumber=", + "nohousenumber!=yes" + ] + }, + "addr:street=" ] }, - "addr:street=" - ] - }, - "then": "#ff0" + "then": "#ff0" + } + ] + }, + "width": { + "render": "8" } - ] - } + } + ] }, { "id": "named_streets", @@ -299,12 +412,18 @@ ] } }, - "color": { - "render": "#ccc" - }, - "width": { - "render": "0" - } + "mapRendering": [ + { + "color": { + "render": "#ccc" + }, + "width": { + "render": "0" + } + } + ] } - ] + ], + "enableShareScreen": false, + "enableMoreQuests": false } \ No newline at end of file diff --git a/assets/welcome_message.json b/assets/welcome_message.json index d2a3fc2577..0d53ded19a 100644 --- a/assets/welcome_message.json +++ b/assets/welcome_message.json @@ -29,9 +29,6 @@ "message": "In more normal circumstances, there would be a very cool gathering in Leipzig around this time with thousands of tech-minded people. However, due to some well-known circumstances, it is a virtual-only event this year as well. However, there might be a local hackerspace nearby to fill in this void", "featured_theme": "hackerspaces" }, - - - { "start_date": "2021-11-01", "end_date": "2021-11-07", diff --git a/css/index-tailwind-output.css b/css/index-tailwind-output.css index ee61e9cea2..72f9f9cfb1 100644 --- a/css/index-tailwind-output.css +++ b/css/index-tailwind-output.css @@ -748,6 +748,14 @@ video { right: 0.75rem; } +.bottom-0 { + bottom: 0px; +} + +.right-1\/3 { + right: 33.333333%; +} + .top-0 { top: 0px; } @@ -760,10 +768,6 @@ video { right: 0px; } -.bottom-0 { - bottom: 0px; -} - .isolate { isolation: isolate; } @@ -856,10 +860,22 @@ video { margin-left: 0.75rem; } +.mt-1 { + margin-top: 0.25rem; +} + .mr-4 { margin-right: 1rem; } +.mt-4 { + margin-top: 1rem; +} + +.ml-2 { + margin-left: 0.5rem; +} + .mt-3 { margin-top: 0.75rem; } @@ -880,26 +896,14 @@ video { margin-bottom: 2.5rem; } -.mt-1 { - margin-top: 0.25rem; -} - .mt-0 { margin-top: 0px; } -.ml-2 { - margin-left: 0.5rem; -} - .mb-4 { margin-bottom: 1rem; } -.mt-4 { - margin-top: 1rem; -} - .mb-8 { margin-bottom: 2rem; } @@ -988,6 +992,10 @@ video { height: 2rem; } +.h-1\/2 { + height: 50%; +} + .h-12 { height: 3rem; } @@ -1044,6 +1052,10 @@ video { width: 2rem; } +.w-0 { + width: 0px; +} + .w-12 { width: 3rem; } @@ -1056,10 +1068,6 @@ video { width: 2.75rem; } -.w-0 { - width: 0px; -} - .w-16 { width: 4rem; } @@ -1409,14 +1417,6 @@ video { padding-right: 0.25rem; } -.pt-6 { - padding-top: 1.5rem; -} - -.pb-3 { - padding-bottom: 0.75rem; -} - .pl-5 { padding-left: 1.25rem; } @@ -1441,10 +1441,6 @@ video { padding-right: 0px; } -.pb-2 { - padding-bottom: 0.5rem; -} - .pt-0\.5 { padding-top: 0.125rem; } @@ -1453,6 +1449,10 @@ video { padding-top: 0px; } +.pb-2 { + padding-bottom: 0.5rem; +} + .pr-2 { padding-right: 0.5rem; } @@ -1482,6 +1482,11 @@ video { line-height: 1.75rem; } +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + .text-sm { font-size: 0.875rem; line-height: 1.25rem; @@ -1497,11 +1502,6 @@ video { line-height: 1.5rem; } -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - .text-4xl { font-size: 2.25rem; line-height: 2.5rem; @@ -1585,14 +1585,14 @@ video { text-decoration: underline; } -.opacity-0 { - opacity: 0; -} - .opacity-50 { opacity: 0.5; } +.opacity-0 { + opacity: 0; +} + .opacity-40 { opacity: 0.4; } @@ -1801,6 +1801,15 @@ html, body { display: block ruby; } +.badge { +} + +.badge svg { + /*Workaround for leaflet*/ + width: unset !important; + height: 100% !important; +} + svg, img { box-sizing: content-box; width: 100%; @@ -1989,12 +1998,6 @@ li::marker { padding: 0.15em 0.3em; } -.question form { - display: inline-block; - max-width: 90vw; - width: 100%; -} - .invalid { box-shadow: 0 0 10px #ff5353; height: -webkit-min-content; diff --git a/css/tagrendering.css b/css/tagrendering.css index 6e154e6c17..fa8106f58b 100644 --- a/css/tagrendering.css +++ b/css/tagrendering.css @@ -11,8 +11,14 @@ color: var(--subtle-detail-color-contrast); padding: 1em; border-radius: 1em; - font-size: larger; + font-size: larger !important; + overflow-wrap: initial; +} +.question form { + display: inline-block; + max-width: 90vw; + width: 100%; } .question svg { diff --git a/index.css b/index.css index 108f02fe27..6efe3035a1 100644 --- a/index.css +++ b/index.css @@ -20,7 +20,7 @@ .z-above-controls { z-index: 10001 } - + .w-160 { width: 40rem; } @@ -91,6 +91,15 @@ html, body { display: block ruby; } +.badge { +} + +.badge svg { + /*Workaround for leaflet*/ + width: unset !important; + height: 100% !important; +} + svg, img { box-sizing: content-box; width: 100%; @@ -280,12 +289,6 @@ li::marker { padding: 0.15em 0.3em; } -.question form { - display: inline-block; - max-width: 90vw; - width: 100%; -} - .invalid { box-shadow: 0 0 10px #ff5353; height: min-content; @@ -361,12 +364,12 @@ li::marker { opacity: 0; transform: rotate(-30deg); } - + 6% { opacity: 1; transform: rotate(-30deg); } - + 12% { opacity: 1; transform: rotate(-45deg); @@ -387,7 +390,7 @@ li::marker { opacity: 0; transform: rotate(-30deg); } - + 100% { opacity: 0; transform: rotate(-30deg); diff --git a/index.html b/index.html index 499018fe67..68e3f9fc4b 100644 --- a/index.html +++ b/index.html @@ -11,8 +11,8 @@ - - + + diff --git a/index.ts b/index.ts index a383eaac26..6496e1cdca 100644 --- a/index.ts +++ b/index.ts @@ -1,7 +1,6 @@ import {FixedUiElement} from "./UI/Base/FixedUiElement"; import {QueryParameters} from "./Logic/Web/QueryParameters"; import Combine from "./UI/Base/Combine"; -import ValidatedTextField from "./UI/Input/ValidatedTextField"; import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers"; import MinimapImplementation from "./UI/Base/MinimapImplementation"; import CountryCoder from "latlon2country/index"; @@ -10,10 +9,11 @@ import {Utils} from "./Utils"; import AllThemesGui from "./UI/AllThemesGui"; import DetermineLayout from "./Logic/DetermineLayout"; import LayoutConfig from "./Models/ThemeConfig/LayoutConfig"; -import DefaultGUI, {DefaultGuiState} from "./UI/DefaultGUI"; +import DefaultGUI from "./UI/DefaultGUI"; import State from "./State"; import AvailableBaseLayersImplementation from "./Logic/Actors/AvailableBaseLayersImplementation"; import ShowOverlayLayerImplementation from "./UI/ShowDataLayer/ShowOverlayLayerImplementation"; +import {DefaultGuiState} from "./UI/DefaultGuiState"; // Workaround for a stupid crash: inject some functions which would give stupid circular dependencies or crash the other nodejs scripts running from console MinimapImplementation.initialize() @@ -35,11 +35,11 @@ if (location.href.startsWith("http://buurtnatuur.be")) { class Init { public static Init(layoutToUse: LayoutConfig, encoded: string) { - if(layoutToUse === null){ + if (layoutToUse === null) { // Something went wrong, error message is already on screen return; } - + if (layoutToUse === undefined) { // No layout found new AllThemesGui() @@ -65,11 +65,12 @@ class Init { const guiState = new DefaultGuiState() State.state = new State(layoutToUse); + DefaultGuiState.state = guiState; // This 'leaks' the global state via the window object, useful for debugging // @ts-ignore window.mapcomplete_state = State.state; - new DefaultGUI(State.state, guiState) + new DefaultGUI(State.state, guiState) if (encoded !== undefined && encoded.length > 10) { // We save the layout to the user settings and local storage @@ -78,13 +79,8 @@ class Init { .GetLongPreference("installed-theme-" + layoutToUse.id) .setData(encoded); }); - } - - } - - } diff --git a/langs/de.json b/langs/de.json index 72539a7301..6d0addc481 100644 --- a/langs/de.json +++ b/langs/de.json @@ -1,288 +1,288 @@ { - "image": { - "addPicture": "Bild hinzufügen", - "uploadingPicture": "Bild wird hochgeladen…", - "uploadingMultiple": "{count} Bilder hochladen…", - "pleaseLogin": "Bitte einloggen, um ein Bild hinzuzufügen", - "willBePublished": "Ihr Bild wird veröffentlicht: ", - "cco": "als 'Public Domain'", - "ccbs": "unter der 'CC-BY-SA-Lizenz'", - "ccb": "unter der 'CC-BY-Lizenz'", - "uploadFailed": "Wir konnten Ihr Bild nicht hochladen. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.", - "respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.", - "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!", - "dontDelete": "Abbrechen", - "doDelete": "Bild entfernen", - "isDeleted": "Gelöscht", - "uploadMultipleDone": "{count} Bilder wurden hinzugefügt. Vielen Dank für die Hilfe!", - "toBig": "Ihr Bild ist zu groß, da es {actual_size} ist. Bitte verwenden Sie Bilder von höchstens {max_size}" + "image": { + "addPicture": "Bild hinzufügen", + "uploadingPicture": "Bild wird hochgeladen…", + "uploadingMultiple": "{count} Bilder hochladen…", + "pleaseLogin": "Bitte einloggen, um ein Bild hinzuzufügen", + "willBePublished": "Ihr Bild wird veröffentlicht: ", + "cco": "als 'Public Domain'", + "ccbs": "unter der 'CC-BY-SA-Lizenz'", + "ccb": "unter der 'CC-BY-Lizenz'", + "uploadFailed": "Wir konnten Ihr Bild nicht hochladen. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.", + "respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.", + "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!", + "dontDelete": "Abbrechen", + "doDelete": "Bild entfernen", + "isDeleted": "Gelöscht", + "uploadMultipleDone": "{count} Bilder wurden hinzugefügt. Vielen Dank für die Hilfe!", + "toBig": "Ihr Bild ist zu groß, da es {actual_size} ist. Bitte verwenden Sie Bilder von höchstens {max_size}" + }, + "centerMessage": { + "loadingData": "Daten werden geladen…", + "zoomIn": "Ausschnitt vergrößern, um Daten anzuzeigen oder zu bearbeiten", + "ready": "Erledigt!", + "retrying": "Laden von Daten fehlgeschlagen. Erneuter Versuch in {count} Sekunden …" + }, + "index": { + "#": "Dieser Text wird über die Thema-Auswahlschaltfläche gezeigt, wenn kein Thema geladen ist", + "title": "Willkommen bei MapComplete", + "intro": "MapComplete ist eine OpenStreetMap-Anwendung, mit der Informationen zu Objekten eines bestimmten Themas angezeigt und angepasst werden können.", + "pickTheme": "Wähle unten ein Thema, um zu starten.", + "featuredThemeTitle": "Diese Woche im Blickpunkt" + }, + "general": { + "loginWithOpenStreetMap": "Bei OpenStreetMap anmelden", + "welcomeBack": "Sie sind eingeloggt, willkommen zurück!", + "loginToStart": "Anmelden, um diese Frage zu beantworten", + "search": { + "search": "Einen Ort suchen", + "searching": "Suchen …", + "nothing": "Nichts gefunden…", + "error": "Etwas ging schief…" }, - "centerMessage": { - "loadingData": "Daten werden geladen…", - "zoomIn": "Ausschnitt vergrößern, um Daten anzuzeigen oder zu bearbeiten", - "ready": "Erledigt!", - "retrying": "Laden von Daten fehlgeschlagen. Erneuter Versuch in {count} Sekunden …" + "returnToTheMap": "Zurück zur Karte", + "save": "Speichern", + "cancel": "Abbrechen", + "skip": "Frage überspringen", + "oneSkippedQuestion": "Eine Frage wurde übersprungen", + "skippedQuestions": "Einige Fragen wurden übersprungen", + "number": "Zahl", + "osmLinkTooltip": "Dieses Element auf OpenStreetMap durchsuchen für den Verlauf und weitere Bearbeitungsmöglichkeiten", + "add": { + "addNew": "Hier eine neue {category} hinzufügen", + "title": "Punkt hinzufügen?", + "intro": "Sie haben irgendwo geklickt, wo noch keine Daten bekannt sind.
    ", + "pleaseLogin": "Bitte loggen Sie sich ein, um einen neuen Punkt hinzuzufügen", + "zoomInFurther": "Weiter einzoomen, um einen Punkt hinzuzufügen.", + "stillLoading": "Die Daten werden noch geladen. Bitte warten Sie etwas, bevor Sie einen neuen Punkt hinzufügen.", + "confirmIntro": "

    Hier einen {title} hinzufügen?

    Der Punkt, den Sie hier anlegen, wird für alle sichtbar sein. Bitte fügen Sie der Karte nur dann Dinge hinzu, wenn sie wirklich existieren. Viele Anwendungen verwenden diese Daten.", + "confirmButton": "Fügen Sie hier eine {category} hinzu.
    Ihre Ergänzung ist für alle sichtbar
    ", + "openLayerControl": "Das Ebenen-Kontrollkästchen öffnen", + "layerNotEnabled": "Die Ebene {layer} ist nicht aktiviert. Aktivieren Sie diese Ebene, um einen Punkt hinzuzufügen", + "addNewMapLabel": "Neues Element hinzufügen", + "presetInfo": "Der neue POI hat {tags}", + "disableFiltersExplanation": "Einige Elemente können durch einen Filter ausgeblendet sein", + "disableFilters": "Alle Filter deaktivieren", + "hasBeenImported": "Dieser Punkt wurde bereits importiert", + "zoomInMore": "Vergrößern Sie die Ansicht, um dieses Element zu importieren", + "warnVisibleForEveryone": "Ihre Ergänzung wird für alle sichtbar sein" }, - "index": { - "#": "Dieser Text wird über die Thema-Auswahlschaltfläche gezeigt, wenn kein Thema geladen ist", - "title": "Willkommen bei MapComplete", - "intro": "MapComplete ist eine OpenStreetMap-Anwendung, mit der Informationen zu Objekten eines bestimmten Themas angezeigt und angepasst werden können.", - "pickTheme": "Wähle unten ein Thema, um zu starten.", - "featuredThemeTitle": "Diese Woche im Blickpunkt" + "pickLanguage": "Sprache wählen: ", + "about": "OpenStreetMap für ein bestimmtes Thema einfach bearbeiten und hinzufügen", + "nameInlineQuestion": "Der Name dieser {category} ist $$$", + "noNameCategory": "{category} ohne Namen", + "questions": { + "phoneNumberOf": "Wie lautet die Telefonnummer der {category}?", + "phoneNumberIs": "Die Telefonnummer der {category} lautet {phone}", + "websiteOf": "Was ist die Website der {category}?", + "websiteIs": "Webseite: {website}", + "emailOf": "Wie lautet die E-Mail-Adresse der {category}?", + "emailIs": "Die E-Mail-Adresse dieser {category} lautet {email}" }, - "general": { - "loginWithOpenStreetMap": "Bei OpenStreetMap anmelden", - "welcomeBack": "Sie sind eingeloggt, willkommen zurück!", - "loginToStart": "Anmelden, um diese Frage zu beantworten", - "search": { - "search": "Einen Ort suchen", - "searching": "Suchen …", - "nothing": "Nichts gefunden…", - "error": "Etwas ging schief…" - }, - "returnToTheMap": "Zurück zur Karte", - "save": "Speichern", - "cancel": "Abbrechen", - "skip": "Frage überspringen", - "oneSkippedQuestion": "Eine Frage wurde übersprungen", - "skippedQuestions": "Einige Fragen wurden übersprungen", - "number": "Zahl", - "osmLinkTooltip": "Dieses Element auf OpenStreetMap durchsuchen für den Verlauf und weitere Bearbeitungsmöglichkeiten", - "add": { - "addNew": "Hier eine neue {category} hinzufügen", - "title": "Punkt hinzufügen?", - "intro": "Sie haben irgendwo geklickt, wo noch keine Daten bekannt sind.
    ", - "pleaseLogin": "Bitte loggen Sie sich ein, um einen neuen Punkt hinzuzufügen", - "zoomInFurther": "Weiter einzoomen, um einen Punkt hinzuzufügen.", - "stillLoading": "Die Daten werden noch geladen. Bitte warten Sie etwas, bevor Sie einen neuen Punkt hinzufügen.", - "confirmIntro": "

    Hier einen {title} hinzufügen?

    Der Punkt, den Sie hier anlegen, wird für alle sichtbar sein. Bitte fügen Sie der Karte nur dann Dinge hinzu, wenn sie wirklich existieren. Viele Anwendungen verwenden diese Daten.", - "confirmButton": "Fügen Sie hier eine {category} hinzu.
    Ihre Ergänzung ist für alle sichtbar
    ", - "openLayerControl": "Das Ebenen-Kontrollkästchen öffnen", - "layerNotEnabled": "Die Ebene {layer} ist nicht aktiviert. Aktivieren Sie diese Ebene, um einen Punkt hinzuzufügen", - "addNewMapLabel": "Neues Element hinzufügen", - "presetInfo": "Der neue POI hat {tags}", - "disableFiltersExplanation": "Einige Elemente können durch einen Filter ausgeblendet sein", - "disableFilters": "Alle Filter deaktivieren", - "hasBeenImported": "Dieser Punkt wurde bereits importiert", - "zoomInMore": "Vergrößern Sie die Ansicht, um dieses Element zu importieren", - "warnVisibleForEveryone": "Ihre Ergänzung wird für alle sichtbar sein" - }, - "pickLanguage": "Sprache wählen: ", - "about": "OpenStreetMap für ein bestimmtes Thema einfach bearbeiten und hinzufügen", - "nameInlineQuestion": "Der Name dieser {category} ist $$$", - "noNameCategory": "{category} ohne Namen", - "questions": { - "phoneNumberOf": "Wie lautet die Telefonnummer der {category}?", - "phoneNumberIs": "Die Telefonnummer der {category} lautet {phone}", - "websiteOf": "Was ist die Website der {category}?", - "websiteIs": "Webseite: {website}", - "emailOf": "Wie lautet die E-Mail-Adresse der {category}?", - "emailIs": "Die E-Mail-Adresse dieser {category} lautet {email}" - }, - "openStreetMapIntro": "

    Eine freie Karte

    Wäre es nicht toll, wenn es eine freie Karte gäbe, die von jedem angepasst und genutzt werden könnte? Eine Karte, zu der jeder Informationen hinzufügen kann? Dann bräuchte man all diese Webseiten mit unterschiedlichen, eingeschränkten und veralteten Karten nicht mehr.

    OpenStreetMap ist diese freie Karte. Alle Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Webseite basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.

    Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram, ...<br/>Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!

    Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.

    ", - "sharescreen": { - "intro": "

    Diese Karte teilen

    Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:", - "addToHomeScreen": "

    Zum Startbildschirm hinzufügen

    Sie können diese Webseite zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der Adressleiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.", - "embedIntro": "

    Auf Ihrer Website einbetten

    Bitte betten Sie diese Karte in Ihre Webseite ein.
    Wir ermutigen Sie, es zu tun - Sie müssen nicht einmal um Erlaubnis fragen.
    Es ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie.", - "copiedToClipboard": "Link in die Zwischenablage kopiert", - "thanksForSharing": "Danke für das Teilen!", - "editThisTheme": "Dieses Thema bearbeiten", - "editThemeDescription": "Fragen zu diesem Kartenthema hinzufügen oder ändern", - "fsUserbadge": "Anmelde-Knopf aktivieren", - "fsSearch": "Suchleiste aktivieren", - "fsWelcomeMessage": "Popup der Begrüßungsnachricht und zugehörige Registerkarten anzeigen", - "fsLayers": "Aktivieren der Layersteuerung", - "fsLayerControlToggle": "Mit der erweiterten Ebenenkontrolle beginnen", - "fsAddNew": "Schaltfläche 'neuen POI hinzufügen' aktivieren", - "fsGeolocation": "Die Schaltfläche 'Mich geolokalisieren' aktivieren (nur für Mobil)", - "fsIncludeCurrentBackgroundMap": "Die aktuelle Hintergrundwahl einschließen {name}", - "fsIncludeCurrentLayers": "Die aktuelle Ebenenauswahl einbeziehen", - "fsIncludeCurrentLocation": "Aktuelle Position einbeziehen" - }, - "morescreen": { - "intro": "

    Mehr thematische Karten?

    Sammeln Sie gerne Geodaten?
    Es sind weitere Themen verfügbar.", - "requestATheme": "Wenn Sie ein benutzerdefiniertes Thema wünschen, fordern Sie es im Issue Tracker an", - "streetcomplete": "Eine andere, ähnliche Anwendung ist StreetComplete.", - "createYourOwnTheme": "Erstellen Sie Ihr eigenes MapComplete-Thema von Grund auf neu", - "previouslyHiddenTitle": "Zuvor besuchte versteckte Themen", - "hiddenExplanation": "Diese Themen sind nur für Personen zugänglich, die einen Link erhalten haben. Sie haben {hidden_discovered} von {total_hidden} versteckten Themen entdeckt." - }, - "readYourMessages": "Bitte lesen Sie alle Ihre OpenStreetMap-Nachrichten, bevor Sie einen neuen Punkt hinzufügen.", - "fewChangesBefore": "Bitte beantworten Sie ein paar Fragen zu bestehenden Punkten, bevor Sie einen neuen Punkt hinzufügen.", - "goToInbox": "Posteingang öffnen", - "getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen", - "getStartedNewAccount": " oder ein neues Konto anlegen", - "noTagsSelected": "Keine Tags ausgewählt", - "customThemeIntro": "

    Benutzerdefinierte Themes

    Dies sind zuvor besuchte benutzergenerierte Themen.", - "aboutMapcomplete": "

    Über MapComplete

    Mit MapComplete können Sie OpenStreetMap mit Informationen zu einem einzigen Thema anreichern. Beantworten Sie ein paar Fragen, und innerhalb von Minuten werden Ihre Beiträge rund um den Globus verfügbar sein! Der Themen-Maintainer definiert Elemente, Fragen und Sprachen für das Thema.

    Mehr erfahren

    MapComplete bietet immer den nächsten Schritt, um mehr über OpenStreetMap zu erfahren.

    • Wenn es in eine Website eingebettet wird, verlinkt der Iframe zu einer Vollbildversion von MapComplete
    • Die Vollbildversion bietet Informationen über OpenStreetMap
    • Das Betrachten funktioniert ohne Login, aber das Bearbeiten erfordert ein OSM-Login.
    • Wenn Sie nicht eingeloggt sind, werden Sie aufgefordert, sich anzumelden
    • Nach der Beantwortung einer einzelnen Frage können Sie der Karte neue Punkte hinzufügen
    • Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt sind


    Haben Sie ein Problem bemerkt? Haben Sie einen Funktionswunsch? Möchten Sie bei der Übersetzung helfen? Besuchen Sie den Quellcode oder den Issue Tracker

    Möchten Sie Ihren Fortschritt sehen? Verfolgen Sie die Anzahl der Änderungen auf OsmCha.

    ", - "backgroundMap": "Hintergrundkarte", - "layerSelection": { - "zoomInToSeeThisLayer": "Ausschnitt vergrößern, um diese Ebene anzuzeigen", - "title": "Ebenen auswählen" - }, - "weekdays": { - "abbreviations": { - "monday": "Mo", - "tuesday": "Di", - "wednesday": "Mi", - "thursday": "Do", - "friday": "Fr", - "saturday": "Sa", - "sunday": "So" - }, - "monday": "Montag", - "tuesday": "Dienstag", - "wednesday": "Mittwoch", - "thursday": "Donnerstag", - "friday": "Freitag", - "saturday": "Samstag", - "sunday": "Sonntag" - }, - "opening_hours": { - "error_loading": "Fehler: Diese Öffnungszeiten können nicht angezeigt werden.", - "open_during_ph": "An Feiertagen ist diese Einrichtung", - "opensAt": "von", - "openTill": "bis", - "not_all_rules_parsed": "Die Öffnungszeiten dieses Geschäfts sind abweichend. Die folgenden Regeln werden im Eingabeelement ignoriert:", - "closed_until": "Geschlossen bis {date}", - "closed_permanently": "Geschlossen auf unbestimmte Zeit", - "open_24_7": "Durchgehend geöffnet", - "ph_not_known": " ", - "ph_closed": "geschlossen", - "ph_open": "geöffnet", - "loadingCountry": "Land ermitteln…", - "ph_open_as_usual": "geöffnet wie üblich" - }, - "attribution": { - "mapContributionsByAndHidden": "Die aktuell sichtbaren Daten wurden editiert durch {contributors} und {hiddenCount} weitere Beitragende", - "mapContributionsBy": "Die aktuell sichtbaren Daten wurden editiert durch {contributors}", - "iconAttribution": { - "title": "Verwendete Icons" - }, - "attributionTitle": "Danksagung", - "codeContributionsBy": "MapComplete wurde von {contributors} und {hiddenCount} weiteren Beitragenden erstellt", - "themeBy": "Thema betreut von {author}", - "attributionContent": "

    Alle Daten wurden bereitgestellt von OpenStreetMap, frei verwendbar unter der Open Database License.

    " - }, - "download": { - "downloadCSVHelper": "Kompatibel mit LibreOffice Calc, Excel, …", - "downloadCSV": "Sichtbare Daten als CSV herunterladen", - "downloadAsPdfHelper": "Ideal zum Drucken der aktuellen Karte", - "downloadGeoJsonHelper": "Kompatibel mit QGIS, ArcGIS, ESRI, …", - "downloadAsPdf": "PDF der aktuellen Karte herunterladen", - "downloadGeojson": "Sichtbare Daten als GeoJSON herunterladen", - "includeMetaData": "Metadaten übernehmen (letzter Bearbeiter, berechnete Werte, ...)", - "noDataLoaded": "Noch keine Daten geladen. Download ist in Kürze verfügbar", - "licenseInfo": "

    Copyright-Hinweis

    Die bereitgestellten Daten sind unter ODbL verfügbar. Die Wiederverwendung ist für jeden Zweck frei, aber
    • die Namensnennung © OpenStreetMap contributors ist erforderlich
    • Jede Änderung unter der gleichen Lizenz veröffentlicht werden
    Bitte lesen Sie den vollständigen Copyright-Hinweis für weitere Details.", - "title": "Sichtbare Daten herunterladen", - "exporting": "Exportieren…" - }, - "pdf": { - "versionInfo": "v{version} - erstellt am {date}", - "attr": "Kartendaten © OpenStreetMap Contributors, wiederverwendbar unter ODbL", - "generatedWith": "Erstellt mit MapComplete.osm.be", - "attrBackground": "Hintergrund-Ebene: {background}" - }, - "loginOnlyNeededToEdit": "zum Bearbeiten der Karte", - "wikipedia": { - "wikipediaboxTitle": "Wikipedia", - "searchWikidata": "Suche auf Wikidata", - "loading": "Wikipedia laden...", - "noResults": "Nichts gefunden für {search}", - "doSearch": "Suche oben, um Ergebnisse zu sehen", - "noWikipediaPage": "Dieses Wikidata-Element hat noch keine entsprechende Wikipedia-Seite.", - "createNewWikidata": "Einen neuen Wikidata-Eintrag erstellen", - "failed": "Laden des Wikipedia-Eintrags fehlgeschlagen" - }, - "testing": "Testen - Änderungen werden nicht gespeichert", - "openTheMap": "Karte öffnen", - "loading": "Laden...", - "histogram": { - "error_loading": "Das Histogramm konnte nicht geladen werden" - } + "openStreetMapIntro": "

    Eine offene Karte

    Eine Karte, die jeder frei nutzen und bearbeiten kann. Ein einziger Ort, um alle Geoinformationen zu speichern. Unterschiedliche, kleine, inkompatible und veraltete Karten werden nirgendwo gebraucht.

    OpenStreetMap ist nicht die feindliche Karte. Die Kartendaten können frei verwendet werden (mit Benennung und Veröffentlichung von Änderungen an diesen Daten). Jeder kann neue Daten hinzufügen und Fehler korrigieren. Diese Webseite nutzt OpenStreetMap. Alle Daten stammen von dort, und Ihre Antworten und Korrekturen werden überall verwendet.

    Viele Menschen und Anwendungen nutzen bereits OpenStreetMap: Organic Maps, OsmAnd, aber auch die Karten bei Facebook, Instagram, Apple-maps und Bing-maps werden (teilweise) von OpenStreetMap bereichert.

    ", + "sharescreen": { + "intro": "

    Diese Karte teilen

    Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:", + "addToHomeScreen": "

    Zum Startbildschirm hinzufügen

    Sie können diese Webseite zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der Adressleiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.", + "embedIntro": "

    Auf Ihrer Website einbetten

    Bitte betten Sie diese Karte in Ihre Webseite ein.
    Wir ermutigen Sie, es zu tun - Sie müssen nicht einmal um Erlaubnis fragen.
    Es ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie.", + "copiedToClipboard": "Link in die Zwischenablage kopiert", + "thanksForSharing": "Danke für das Teilen!", + "editThisTheme": "Dieses Thema bearbeiten", + "editThemeDescription": "Fragen zu diesem Kartenthema hinzufügen oder ändern", + "fsUserbadge": "Anmelde-Knopf aktivieren", + "fsSearch": "Suchleiste aktivieren", + "fsWelcomeMessage": "Popup der Begrüßungsnachricht und zugehörige Registerkarten anzeigen", + "fsLayers": "Aktivieren der Layersteuerung", + "fsLayerControlToggle": "Mit der erweiterten Ebenenkontrolle beginnen", + "fsAddNew": "Schaltfläche 'neuen POI hinzufügen' aktivieren", + "fsGeolocation": "Die Schaltfläche 'Mich geolokalisieren' aktivieren (nur für Mobil)", + "fsIncludeCurrentBackgroundMap": "Die aktuelle Hintergrundwahl einschließen {name}", + "fsIncludeCurrentLayers": "Die aktuelle Ebenenauswahl einbeziehen", + "fsIncludeCurrentLocation": "Aktuelle Position einbeziehen" }, - "favourite": { - "panelIntro": "

    Ihr persönliches Thema

    Aktivieren Sie Ihre Lieblingsebenen aus allen offiziellen Themen", - "loginNeeded": "

    Anmelden

    Ein persönliches Layout ist nur für OpenStreetMap-Benutzer verfügbar", - "reload": "Daten neu laden" + "morescreen": { + "intro": "

    Mehr thematische Karten?

    Sammeln Sie gerne Geodaten?
    Es sind weitere Themen verfügbar.", + "requestATheme": "Wenn Sie ein benutzerdefiniertes Thema wünschen, fordern Sie es im Issue Tracker an", + "streetcomplete": "Eine andere, ähnliche Anwendung ist StreetComplete.", + "createYourOwnTheme": "Erstellen Sie Ihr eigenes MapComplete-Thema von Grund auf neu", + "previouslyHiddenTitle": "Zuvor besuchte versteckte Themen", + "hiddenExplanation": "Diese Themen sind nur für Personen zugänglich, die einen Link erhalten haben. Sie haben {hidden_discovered} von {total_hidden} versteckten Themen entdeckt." }, - "reviews": { - "title": "{count} Rezensionen", - "title_singular": "Eine Rezension", - "name_required": "Der Name des Objekts ist notwendig, um eine Bewertung erstellen zu können", - "no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!", - "write_a_comment": "Schreibe einen Kommentar…", - "no_rating": "Keine Bewertung vorhanden", - "posting_as": "Angemeldet als", - "i_am_affiliated": "Ich bin angehörig
    Überprüfe, ob du Eigentümer, Ersteller, Angestellter etc. bist", - "saving_review": "Speichern…", - "saved": "Bewertung gespeichert. Danke fürs Teilen!", - "tos": "Mit deiner Rezension stimmst du den AGB und den Datenschutzrichtlinien von Mangrove.reviews zu", - "plz_login": "Anmelden, um eine Bewertung abzugeben", - "affiliated_reviewer_warning": "(Partner-Rezension)", - "attribution": "Rezensionen werden bereitgestellt von Mangrove Reviews und sind unter CC-BY 4.0 verfügbar." + "readYourMessages": "Bitte lesen Sie alle Ihre OpenStreetMap-Nachrichten, bevor Sie einen neuen Punkt hinzufügen.", + "fewChangesBefore": "Bitte beantworten Sie ein paar Fragen zu bestehenden Punkten, bevor Sie einen neuen Punkt hinzufügen.", + "goToInbox": "Posteingang öffnen", + "getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen", + "getStartedNewAccount": " oder ein neues Konto anlegen", + "noTagsSelected": "Keine Tags ausgewählt", + "customThemeIntro": "

    Benutzerdefinierte Themes

    Dies sind zuvor besuchte benutzergenerierte Themen.", + "aboutMapcomplete": "

    Über MapComplete

    Nutzen Sie es, um OpenStreetMap-Informationen zu einem einzigen Thema hinzuzufügen. Beantworten Sie Fragen, und innerhalb weniger Minuten sind Ihre Beiträge überall verfügbar. Der Theme-Maintainer definiert Elemente, Fragen und Sprachen dafür.

    Mehr erfahren

    MapComplete bietet immer den nächsten Schritt, um mehr über OpenStreetMap zu erfahren.

    • Wenn es in eine Website eingebettet wird, verlinkt der iframe zu einer Vollbildversion von MapComplete
    • Die Vollbildversion bietet Infos über OpenStreetMap
    • Das Betrachten funktioniert ohne Anmeldung, aber das Bearbeiten erfordert ein OSM-Konto.
    • Wenn Sie nicht angemeldet sind, werden Sie dazu aufgefordert
    • Sobald Sie eine Frage beantwortet haben, können Sie der Karte neue Punkte hinzufügen
    • Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt werden


    Haben Sie ein Problem bemerkt? Haben Sie einen Funktionswunsch? Möchten Sie bei der Übersetzung helfen? Besuchen Sie den Quellcode oder den Issue Tracker

    Möchten Sie Ihren Fortschritt sehen? Verfolgen Sie die Anzahl der Änderungen auf OsmCha.

    ", + "backgroundMap": "Hintergrundkarte", + "layerSelection": { + "zoomInToSeeThisLayer": "Ausschnitt vergrößern, um diese Ebene anzuzeigen", + "title": "Ebenen auswählen" }, - "delete": { - "explanations": { - "selectReason": "Bitte wähle aus, warum dieses Element gelöscht werden soll", - "hardDelete": "Dieser Punkt wird in OpenStreetMap gelöscht. Er kann von einem erfahrenen Mitwirkenden wiederhergestellt werden", - "softDelete": "Dieses Element wird aktualisiert und in dieser Anwendung ausgeblendet. {reason}" - }, - "reasons": { - "test": "Dies war ein Testpunkt - das Element war nie wirklich vorhanden", - "notFound": "Dieses Element konnte nicht gefunden werden", - "disused": "Dieses Element wird nicht mehr verwendet oder entfernt", - "duplicate": "Dieser Punkt ist ein Duplikat eines anderen Elements" - }, - "readMessages": "Du hast ungelesene Nachrichten. Bitte beachte diese, bevor Du einen Punkt löschst - vielleicht hat jemand eine Rückmeldung", - "loginToDelete": "Sie müssen angemeldet sein, um einen Punkt zu löschen", - "useSomethingElse": "Verwenden Sie zum Löschen stattdessen einen anderen OpenStreetMap-Editor", - "partOfOthers": "Dieser Punkt ist Teil eines Weges oder einer Relation und kann nicht direkt gelöscht werden.", - "loading": "Untersuchung der Eigenschaften, um zu prüfen, ob dieses Element gelöscht werden kann.", - "onlyEditedByLoggedInUser": "Dieser Punkt wurde nur von Ihnen selbst bearbeitet, Sie können ihn sicher löschen.", - "isntAPoint": "Es können nur Punkte gelöscht werden, das ausgewählte Element ist ein Weg, eine Fläche oder eine Relation.", - "cannotBeDeleted": "Dieses Element kann nicht gelöscht werden", - "delete": "Löschen", - "isDeleted": "Dieses Element wurde gelöscht", - "whyDelete": "Warum sollte dieser Punkt gelöscht werden?", - "cancel": "Abbrechen", - "safeDelete": "Dieser Punkt kann sicher gelöscht werden.", - "notEnoughExperience": "Dieser Punkt wurde von jemand anderem erstellt." + "weekdays": { + "abbreviations": { + "monday": "Mo", + "tuesday": "Di", + "wednesday": "Mi", + "thursday": "Do", + "friday": "Fr", + "saturday": "Sa", + "sunday": "So" + }, + "monday": "Montag", + "tuesday": "Dienstag", + "wednesday": "Mittwoch", + "thursday": "Donnerstag", + "friday": "Freitag", + "saturday": "Samstag", + "sunday": "Sonntag" }, - "move": { - "inviteToMove": { - "reasonRelocation": "Dieses Element an einen anderen Ort verschieben, weil es sich verlagert hat", - "generic": "Verschiebe diesen Punkt", - "reasonInaccurate": "Genauigkeit dieses Punktes verbessern" - }, - "partOfAWay": "Dieses Element ist Teil eines anderen Weges. Verwenden Sie einen anderen Editor, um es zu verschieben.", - "cannotBeMoved": "Dieses Element kann nicht verschoben werden.", - "cancel": "Verschieben abbrechen", - "whyMove": "Warum wollen Sie diesen Punkt verschieben?", - "pointIsMoved": "Der Punkt wurde verschoben", - "reasons": { - "reasonRelocation": "Das Element wurde an einen völlig anderen Ort verlegt", - "reasonInaccurate": "Der Standort dieses Elements ist ungenau und sollte um einige Meter verschoben werden" - }, - "loginToMove": "Sie müssen eingeloggt sein, um einen Punkt zu verschieben", - "zoomInFurther": "Weiter vergrößern, um die Verschiebung zu bestätigen", - "selectReason": "Warum verschieben Sie dieses Element?", - "inviteToMoveAgain": "Diesen Punkt erneut verschieben", - "moveTitle": "Diesen Punkt verschieben", - "confirmMove": "Hierhin verschieben", - "partOfRelation": "Dieses Element ist Teil einer Relation. Verwenden Sie einen anderen Editor, um es zu verschieben.", - "isWay": "Dieses Element ist ein Weg. Verwenden Sie einen anderen OpenStreetMap-Editor, um ihn zu verschieben.", - "isRelation": "Dieses Element ist eine Relation und kann nicht verschoben werden" + "opening_hours": { + "error_loading": "Fehler: Diese Öffnungszeiten können nicht angezeigt werden.", + "open_during_ph": "An Feiertagen ist diese Einrichtung", + "opensAt": "von", + "openTill": "bis", + "not_all_rules_parsed": "Die Öffnungszeiten dieses Geschäfts sind abweichend. Die folgenden Regeln werden im Eingabeelement ignoriert:", + "closed_until": "Geschlossen bis {date}", + "closed_permanently": "Geschlossen auf unbestimmte Zeit", + "open_24_7": "Durchgehend geöffnet", + "ph_not_known": " ", + "ph_closed": "geschlossen", + "ph_open": "geöffnet", + "loadingCountry": "Land ermitteln…", + "ph_open_as_usual": "geöffnet wie üblich" }, - "split": { - "split": "Teilen", - "cancel": "Abbrechen", - "loginToSplit": "Sie müssen angemeldet sein, um eine Straße aufzuteilen", - "splitTitle": "Wählen Sie auf der Karte aus, wo die Straße geteilt werden soll", - "hasBeenSplit": "Dieser Weg wurde geteilt", - "inviteToSplit": "Teilen Sie diese Straße in kleinere Segmente auf. Dies ermöglicht es, Straßenabschnitten unterschiedliche Eigenschaften zu geben." + "attribution": { + "mapContributionsByAndHidden": "Die aktuell sichtbaren Daten wurden editiert durch {contributors} und {hiddenCount} weitere Beitragende", + "mapContributionsBy": "Die aktuell sichtbaren Daten wurden editiert durch {contributors}", + "iconAttribution": { + "title": "Verwendete Icons" + }, + "attributionTitle": "Danksagung", + "codeContributionsBy": "MapComplete wurde von {contributors} und {hiddenCount} weiteren Beitragenden erstellt", + "themeBy": "Thema betreut von {author}", + "attributionContent": "

    Alle Daten wurden bereitgestellt von OpenStreetMap, frei verwendbar unter der Open Database License.

    " }, - "multi_apply": { - "autoApply": "Wenn Sie die Attribute {attr_names} ändern, werden diese Attribute automatisch auch auf {count} anderen Objekten geändert" + "download": { + "downloadCSVHelper": "Kompatibel mit LibreOffice Calc, Excel, …", + "downloadCSV": "Sichtbare Daten als CSV herunterladen", + "downloadAsPdfHelper": "Ideal zum Drucken der aktuellen Karte", + "downloadGeoJsonHelper": "Kompatibel mit QGIS, ArcGIS, ESRI, …", + "downloadAsPdf": "PDF der aktuellen Karte herunterladen", + "downloadGeojson": "Sichtbare Daten als GeoJSON herunterladen", + "includeMetaData": "Metadaten übernehmen (letzter Bearbeiter, berechnete Werte, ...)", + "noDataLoaded": "Noch keine Daten geladen. Download ist in Kürze verfügbar", + "licenseInfo": "

    Copyright-Hinweis

    Die bereitgestellten Daten sind unter ODbL verfügbar. Die Wiederverwendung ist für jeden Zweck frei, aber
    • die Namensnennung © OpenStreetMap contributors ist erforderlich
    • Jede Änderung unter der gleichen Lizenz veröffentlicht werden
    Bitte lesen Sie den vollständigen Copyright-Hinweis für weitere Details.", + "title": "Sichtbare Daten herunterladen", + "exporting": "Exportieren…" + }, + "pdf": { + "versionInfo": "v{version} - erstellt am {date}", + "attr": "Kartendaten © OpenStreetMap Contributors, wiederverwendbar unter ODbL", + "generatedWith": "Erstellt mit MapComplete.osm.be", + "attrBackground": "Hintergrund-Ebene: {background}" + }, + "loginOnlyNeededToEdit": "zum Bearbeiten der Karte", + "wikipedia": { + "wikipediaboxTitle": "Wikipedia", + "searchWikidata": "Suche auf Wikidata", + "loading": "Wikipedia laden...", + "noResults": "Nichts gefunden für {search}", + "doSearch": "Suche oben, um Ergebnisse zu sehen", + "noWikipediaPage": "Dieses Wikidata-Element hat noch keine entsprechende Wikipedia-Seite.", + "createNewWikidata": "Einen neuen Wikidata-Eintrag erstellen", + "failed": "Laden des Wikipedia-Eintrags fehlgeschlagen" + }, + "testing": "Testen - Änderungen werden nicht gespeichert", + "openTheMap": "Karte öffnen", + "loading": "Laden...", + "histogram": { + "error_loading": "Das Histogramm konnte nicht geladen werden" } -} + }, + "favourite": { + "panelIntro": "

    Ihr persönliches Thema

    Aktivieren Sie Ihre Lieblingsebenen aus allen offiziellen Themen", + "loginNeeded": "

    Anmelden

    Ein persönliches Layout ist nur für OpenStreetMap-Benutzer verfügbar", + "reload": "Daten neu laden" + }, + "reviews": { + "title": "{count} Rezensionen", + "title_singular": "Eine Rezension", + "name_required": "Der Name des Objekts ist notwendig, um eine Bewertung erstellen zu können", + "no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!", + "write_a_comment": "Schreibe einen Kommentar…", + "no_rating": "Keine Bewertung vorhanden", + "posting_as": "Angemeldet als", + "i_am_affiliated": "Ich bin angehörig
    Überprüfe, ob du Eigentümer, Ersteller, Angestellter etc. bist", + "saving_review": "Speichern…", + "saved": "Bewertung gespeichert. Danke fürs Teilen!", + "tos": "Mit deiner Rezension stimmst du den AGB und den Datenschutzrichtlinien von Mangrove.reviews zu", + "plz_login": "Anmelden, um eine Bewertung abzugeben", + "affiliated_reviewer_warning": "(Partner-Rezension)", + "attribution": "Rezensionen werden bereitgestellt von Mangrove Reviews und sind unter CC-BY 4.0 verfügbar." + }, + "delete": { + "explanations": { + "selectReason": "Bitte wähle aus, warum dieses Element gelöscht werden soll", + "hardDelete": "Dieser Punkt wird in OpenStreetMap gelöscht. Er kann von einem erfahrenen Mitwirkenden wiederhergestellt werden", + "softDelete": "Dieses Element wird aktualisiert und in dieser Anwendung ausgeblendet. {reason}" + }, + "reasons": { + "test": "Dies war ein Testpunkt - das Element war nie wirklich vorhanden", + "notFound": "Dieses Element konnte nicht gefunden werden", + "disused": "Dieses Element wird nicht mehr verwendet oder entfernt", + "duplicate": "Dieser Punkt ist ein Duplikat eines anderen Elements" + }, + "readMessages": "Du hast ungelesene Nachrichten. Bitte beachte diese, bevor Du einen Punkt löschst - vielleicht hat jemand eine Rückmeldung", + "loginToDelete": "Sie müssen angemeldet sein, um einen Punkt zu löschen", + "useSomethingElse": "Verwenden Sie zum Löschen stattdessen einen anderen OpenStreetMap-Editor", + "partOfOthers": "Dieser Punkt ist Teil eines Weges oder einer Relation und kann nicht direkt gelöscht werden.", + "loading": "Untersuchung der Eigenschaften, um zu prüfen, ob dieses Element gelöscht werden kann.", + "onlyEditedByLoggedInUser": "Dieser Punkt wurde nur von Ihnen selbst bearbeitet, Sie können ihn sicher löschen.", + "isntAPoint": "Es können nur Punkte gelöscht werden, das ausgewählte Element ist ein Weg, eine Fläche oder eine Relation.", + "cannotBeDeleted": "Dieses Element kann nicht gelöscht werden", + "delete": "Löschen", + "isDeleted": "Dieses Element wurde gelöscht", + "whyDelete": "Warum sollte dieser Punkt gelöscht werden?", + "cancel": "Abbrechen", + "safeDelete": "Dieser Punkt kann sicher gelöscht werden.", + "notEnoughExperience": "Dieser Punkt wurde von jemand anderem erstellt." + }, + "move": { + "inviteToMove": { + "reasonRelocation": "Dieses Element an einen anderen Ort verschieben, weil es sich verlagert hat", + "generic": "Verschiebe diesen Punkt", + "reasonInaccurate": "Genauigkeit dieses Punktes verbessern" + }, + "partOfAWay": "Dieses Element ist Teil eines anderen Weges. Verwenden Sie einen anderen Editor, um es zu verschieben.", + "cannotBeMoved": "Dieses Element kann nicht verschoben werden.", + "cancel": "Verschieben abbrechen", + "whyMove": "Warum wollen Sie diesen Punkt verschieben?", + "pointIsMoved": "Der Punkt wurde verschoben", + "reasons": { + "reasonRelocation": "Das Element wurde an einen völlig anderen Ort verlegt", + "reasonInaccurate": "Der Standort dieses Elements ist ungenau und sollte um einige Meter verschoben werden" + }, + "loginToMove": "Sie müssen eingeloggt sein, um einen Punkt zu verschieben", + "zoomInFurther": "Weiter vergrößern, um die Verschiebung zu bestätigen", + "selectReason": "Warum verschieben Sie dieses Element?", + "inviteToMoveAgain": "Diesen Punkt erneut verschieben", + "moveTitle": "Diesen Punkt verschieben", + "confirmMove": "Hierhin verschieben", + "partOfRelation": "Dieses Element ist Teil einer Relation. Verwenden Sie einen anderen Editor, um es zu verschieben.", + "isWay": "Dieses Element ist ein Weg. Verwenden Sie einen anderen OpenStreetMap-Editor, um ihn zu verschieben.", + "isRelation": "Dieses Element ist eine Relation und kann nicht verschoben werden" + }, + "split": { + "split": "Teilen", + "cancel": "Abbrechen", + "loginToSplit": "Sie müssen angemeldet sein, um eine Straße aufzuteilen", + "splitTitle": "Wählen Sie auf der Karte aus, wo die Straße geteilt werden soll", + "hasBeenSplit": "Dieser Weg wurde geteilt", + "inviteToSplit": "Teilen Sie diese Straße in kleinere Segmente auf. Dies ermöglicht es, Straßenabschnitten unterschiedliche Eigenschaften zu geben." + }, + "multi_apply": { + "autoApply": "Wenn Sie die Attribute {attr_names} ändern, werden diese Attribute automatisch auch auf {count} anderen Objekten geändert" + } +} \ No newline at end of file diff --git a/langs/en.json b/langs/en.json index 2c3eaea944..3072eb1ed9 100644 --- a/langs/en.json +++ b/langs/en.json @@ -1,295 +1,303 @@ { - "image": { - "addPicture": "Add picture", - "uploadingPicture": "Uploading your picture…", - "uploadingMultiple": "Uploading {count} pictures…", - "pleaseLogin": "Please log in to add a picture", - "willBePublished": "Your picture will be published: ", - "cco": "in the public domain", - "ccbs": "under the CC-BY-SA-license", - "ccb": "under the CC-BY-license", - "uploadFailed": "Could not upload your picture. Are you connected to the Internet, and allow third party API's? The Brave browser or the uMatrix plugin might block them.", - "respectPrivacy": "Do not photograph people nor license plates. Do not upload Google Maps, Google Streetview or other copyrighted sources.", - "uploadDone": "Your picture has been added. Thanks for helping out!", - "uploadMultipleDone": "{count} pictures have been added. Thanks for helping out!", - "dontDelete": "Cancel", - "doDelete": "Remove image", - "isDeleted": "Deleted", - "toBig": "Your image is too large as it is {actual_size}. Please use images of at most {max_size}" + "image": { + "addPicture": "Add picture", + "uploadingPicture": "Uploading your picture…", + "uploadingMultiple": "Uploading {count} pictures…", + "pleaseLogin": "Please log in to add a picture", + "willBePublished": "Your picture will be published: ", + "cco": "in the public domain", + "ccbs": "under the CC-BY-SA-license", + "ccb": "under the CC-BY-license", + "uploadFailed": "Could not upload your picture. Are you connected to the Internet, and allow third party API's? The Brave browser or the uMatrix plugin might block them.", + "respectPrivacy": "Do not photograph people nor license plates. Do not upload Google Maps, Google Streetview or other copyrighted sources.", + "uploadDone": "Your picture has been added. Thanks for helping out!", + "uploadMultipleDone": "{count} pictures have been added. Thanks for helping out!", + "dontDelete": "Cancel", + "doDelete": "Remove image", + "isDeleted": "Deleted", + "toBig": "Your image is too large as it is {actual_size}. Please use images of at most {max_size}" + }, + "centerMessage": { + "loadingData": "Loading data…", + "zoomIn": "Zoom in to view or edit the data", + "ready": "Done!", + "retrying": "Loading data failed. Trying again in {count} seconds…" + }, + "index": { + "#": "These texts are shown above the theme buttons when no theme is loaded", + "title": "Welcome to MapComplete", + "featuredThemeTitle": "Featured this week", + "intro": "MapComplete is an OpenStreetMap-viewer and editor, which shows you information about features of a specific theme and allows to update it.", + "pickTheme": "Pick a theme below to get started." + }, + "split": { + "split": "Split", + "cancel": "Cancel", + "inviteToSplit": "Split this road in smaller segments. This allows to give different properties to parts of the road.", + "loginToSplit": "You must be logged in to split a road", + "splitTitle": "Choose on the map where to split this road", + "hasBeenSplit": "This way has been split" + }, + "delete": { + "delete": "Delete", + "cancel": "Cancel", + "isDeleted": "This feature is deleted", + "cannotBeDeleted": "This feature can not be deleted", + "loginToDelete": "You must be logged in to delete a point", + "safeDelete": "This point can be safely deleted.", + "isntAPoint": "Only points can be deleted, the selected feature is a way, area or relation.", + "onlyEditedByLoggedInUser": "This point has only be edited by yourself, you can safely delete it.", + "notEnoughExperience": "This point was made by someone else.", + "useSomethingElse": "Use another OpenStreetMap-editor to delete it instead", + "partOfOthers": "This point is part of some way or relation and can not be deleted directly.", + "loading": "Inspecting properties to check if this feature can be deleted.", + "whyDelete": "Why should this point be deleted?", + "reasons": { + "test": "This was a testing point - the feature was never actually there", + "disused": "This feature is disused or removed", + "notFound": "This feature couldn't be found", + "duplicate": "This point is a duplicate of another feature" }, - "centerMessage": { - "loadingData": "Loading data…", - "zoomIn": "Zoom in to view or edit the data", - "ready": "Done!", - "retrying": "Loading data failed. Trying again in {count} seconds…" + "explanations": { + "selectReason": "Please, select why this feature should be deleted", + "hardDelete": "This point will be deleted in OpenStreetMap. It can be recovered by an experienced contributor", + "softDelete": "This feature will be updated and hidden from this application. {reason}" }, - "index": { - "#": "These texts are shown above the theme buttons when no theme is loaded", - "title": "Welcome to MapComplete", - "featuredThemeTitle": "Featured this week", - "intro": "MapComplete is an OpenStreetMap-viewer and editor, which shows you information about features of a specific theme and allows to update it.", - "pickTheme": "Pick a theme below to get started." + "readMessages": "You have unread messages. Read these before deleting a point - someone might have feedback" + }, + "general": { + "loading": "Loading...", + "pdf": { + "generatedWith": "Generated with MapComplete.osm.be", + "attr": "Map data © OpenStreetMap Contributors, reusable under ODbL", + "attrBackground": "Background layer: {background}", + "versionInfo": "v{version} - generated on {date}" }, - "split": { - "split": "Split", - "cancel": "Cancel", - "inviteToSplit": "Split this road in smaller segments. This allows to give different properties to parts of the road.", - "loginToSplit": "You must be logged in to split a road", - "splitTitle": "Choose on the map where to split this road", - "hasBeenSplit": "This way has been split" + "loginWithOpenStreetMap": "Login with OpenStreetMap", + "welcomeBack": "You are logged in, welcome back!", + "loginToStart": "Log in to answer this question", + "openStreetMapIntro": "

    An Open Map

    One that everyone can use and edit freely. A single place to store all geo-info. Different, small, incompatible and outdated maps are not needed anywhere.

    OpenStreetMap is not the enemy map. The map data can be used freely (with attribution and publication of changes to that data). Everyone can add new data and fix errors. This website uses OpenStreetMap. All the data is from there, and your answers and corrections are used all over.

    Many people and apps already use OpenStreetMap: Organic Maps, OsmAnd, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap.

    ", + "search": { + "search": "Search a location", + "searching": "Searching…", + "nothing": "Nothing found…", + "error": "Something went wrong…" }, - "delete": { - "delete": "Delete", - "cancel": "Cancel", - "isDeleted": "This feature is deleted", - "cannotBeDeleted": "This feature can not be deleted", - "loginToDelete": "You must be logged in to delete a point", - "safeDelete": "This point can be safely deleted.", - "isntAPoint": "Only points can be deleted, the selected feature is a way, area or relation.", - "onlyEditedByLoggedInUser": "This point has only be edited by yourself, you can safely delete it.", - "notEnoughExperience": "This point was made by someone else.", - "useSomethingElse": "Use another OpenStreetMap-editor to delete it instead", - "partOfOthers": "This point is part of some way or relation and can not be deleted directly.", - "loading": "Inspecting properties to check if this feature can be deleted.", - "whyDelete": "Why should this point be deleted?", - "reasons": { - "test": "This was a testing point - the feature was never actually there", - "disused": "This feature is disused or removed", - "notFound": "This feature couldn't be found", - "duplicate": "This point is a duplicate of another feature" - }, - "explanations": { - "selectReason": "Please, select why this feature should be deleted", - "hardDelete": "This point will be deleted in OpenStreetMap. It can be recovered by an experienced contributor", - "softDelete": "This feature will be updated and hidden from this application. {reason}" - }, - "readMessages": "You have unread messages. Read these before deleting a point - someone might have feedback" + "returnToTheMap": "Return to the map", + "save": "Save", + "cancel": "Cancel", + "skip": "Skip this question", + "oneSkippedQuestion": "One question is skipped", + "skippedQuestions": "Some questions are skipped", + "number": "number", + "osmLinkTooltip": "Browse this object on OpenStreetMap for history and more editing options", + "add": { + "addNewMapLabel": "Add new item", + "disableFiltersExplanation": "Some features might be hidden by a filter", + "disableFilters": "Disable all filters", + "addNew": "Add a new {category} here", + "presetInfo": "The new POI will have {tags}", + "warnVisibleForEveryone": "Your addition will be visible for everyone", + "title": "Add a new point?", + "intro": "You clicked somewhere where no data is known yet.
    ", + "pleaseLogin": "Please log in to add a new point", + "zoomInFurther": "Zoom in further to add a point.", + "stillLoading": "The data is still loading. Please wait a bit before you add a new point.", + "confirmIntro": "

    Add a {title} here?

    The point you create here will be visible for everyone. Please, only add things on to the map if they truly exist. A lot of applications use this data.", + "confirmButton": "Add a {category} here.
    Your addition is visible for everyone
    ", + "openLayerControl": "Open the layer control box", + "layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point", + "hasBeenImported": "This point has already been imported", + "zoomInMore": "Zoom in more to import this feature", + "wrongType": "This element is not a point or a way and can not be imported" }, - "general": { - "loading": "Loading...", - "pdf": { - "generatedWith": "Generated with MapComplete.osm.be", - "attr": "Map data © OpenStreetMap Contributors, reusable under ODbL", - "attrBackground": "Background layer: {background}", - "versionInfo": "v{version} - generated on {date}" - }, - "loginWithOpenStreetMap": "Login with OpenStreetMap", - "welcomeBack": "You are logged in, welcome back!", - "loginToStart": "Log in to answer this question", - "openStreetMapIntro": "

    An Open Map

    One that everyone can use and edit freely. A single place to store all geo-info. Different, small, incompatible and outdated maps are not needed anywhere.

    OpenStreetMap is not the enemy map. The map data can be used freely (with attribution and publication of changes to that data). Everyone can add new data and fix errors. This website uses OpenStreetMap. All the data is from there, and your answers and corrections are used all over.

    Many people and apps already use OpenStreetMap: Organic Maps, OsmAnd, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap.

    ", - "search": { - "search": "Search a location", - "searching": "Searching…", - "nothing": "Nothing found…", - "error": "Something went wrong…" - }, - "returnToTheMap": "Return to the map", - "save": "Save", - "cancel": "Cancel", - "skip": "Skip this question", - "oneSkippedQuestion": "One question is skipped", - "skippedQuestions": "Some questions are skipped", - "number": "number", - "osmLinkTooltip": "Browse this object on OpenStreetMap for history and more editing options", - "add": { - "addNewMapLabel": "Add new item", - "disableFiltersExplanation": "Some features might be hidden by a filter", - "disableFilters": "Disable all filters", - "addNew": "Add a new {category} here", - "presetInfo": "The new POI will have {tags}", - "warnVisibleForEveryone": "Your addition will be visible for everyone", - "title": "Add a new point?", - "intro": "You clicked somewhere where no data is known yet.
    ", - "pleaseLogin": "Please log in to add a new point", - "zoomInFurther": "Zoom in further to add a point.", - "stillLoading": "The data is still loading. Please wait a bit before you add a new point.", - "confirmIntro": "

    Add a {title} here?

    The point you create here will be visible for everyone. Please, only add things on to the map if they truly exist. A lot of applications use this data.", - "confirmButton": "Add a {category} here.
    Your addition is visible for everyone
    ", - "openLayerControl": "Open the layer control box", - "layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point", - "hasBeenImported": "This point has already been imported", - "zoomInMore": "Zoom in more to import this feature" - }, - "pickLanguage": "Choose a language: ", - "about": "Easily edit and add OpenStreetMap for a certain theme", - "nameInlineQuestion": "The name of this {category} is $$$", - "noNameCategory": "{category} without a name", - "questions": { - "phoneNumberOf": "What is the phone number of {category}?", - "phoneNumberIs": "The phone number of this {category} is {phone}", - "websiteOf": "What is the website of {category}?", - "websiteIs": "Website: {website}", - "emailOf": "What is the email address of {category}?", - "emailIs": "The email address of this {category} is {email}" - }, - "morescreen": { - "intro": "

    More thematic maps?

    Do you enjoy collecting geodata?
    There are more themes available.", - "requestATheme": "If you want a custom-built theme, request it in the issue tracker", - "streetcomplete": "Another, similar application is StreetComplete.", - "createYourOwnTheme": "Create your own MapComplete theme from scratch", - "previouslyHiddenTitle": "Previously visited hidden themes", - "hiddenExplanation": "These themes are only accessible to those with the link. You have discovered {hidden_discovered} of {total_hidden} hidden themes." - }, - "sharescreen": { - "intro": "

    Share this map

    Share this map by copying the link below and sending it to friends and family:", - "addToHomeScreen": "

    Add to your home screen

    You can easily add this website to your smartphone home screen for a native feel. Click the 'Add to home screen' button in the URL bar to do this.", - "embedIntro": "

    Embed on your website

    Please, embed this map into your website.
    We encourage you to do it - you don't even have to ask permission.
    It is free, and always will be. The more people are using this, the more valuable it becomes.", - "copiedToClipboard": "Link copied to clipboard", - "thanksForSharing": "Thanks for sharing!", - "editThisTheme": "Edit this theme", - "editThemeDescription": "Add or change questions to this map theme", - "fsUserbadge": "Enable the login button", - "fsSearch": "Enable the search bar", - "fsWelcomeMessage": "Show the welcome message popup and associated tabs", - "fsLayers": "Enable the layer control", - "fsLayerControlToggle": "Start with the layer control expanded", - "fsAddNew": "Enable the 'add new POI' button", - "fsGeolocation": "Enable the 'geolocate-me' button (mobile only)", - "fsIncludeCurrentBackgroundMap": "Include the current background choice {name}", - "fsIncludeCurrentLayers": "Include the current layer choices", - "fsIncludeCurrentLocation": "Include current location" - }, - "attribution": { - "attributionTitle": "Attribution notice", - "attributionContent": "

    All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.

    ", - "themeBy": "Theme maintained by {author}", - "iconAttribution": { - "title": "Used icons" - }, - "mapContributionsBy": "The current visible data has edits made by {contributors}", - "mapContributionsByAndHidden": "The current visible data has edits made by {contributors} and {hiddenCount} more contributors", - "codeContributionsBy": "MapComplete has been built by {contributors} and {hiddenCount} more contributors" - }, - "readYourMessages": "Please, read all your OpenStreetMap-messages before adding a new point.", - "fewChangesBefore": "Please, answer a few questions of existing points before adding a new point.", - "goToInbox": "Open inbox", - "getStartedLogin": "Log in with OpenStreetMap to get started", - "getStartedNewAccount": " or create a new account", - "noTagsSelected": "No tags selected", - "testing": "Testing - changes won't be saved", - "customThemeIntro": "

    Custom themes

    These are previously visited user-generated themes.", - "aboutMapcomplete": "

    About MapComplete

    Use it to add OpenStreetMap info on a single theme. Answer questions, and within minutes your contributions are available everywhere. The theme maintainer defines elements, questions and languages for it.

    Find out more

    MapComplete always offers the next step to learn more about OpenStreetMap.

    • When embedded in a website, the iframe links to a full-screen MapComplete
    • The fullscreen version offers info about OpenStreetMap
    • Viewing works without login, but editing requires an OSM account.
    • If you are not logged in, you are asked to do so
    • Once you answered a single question, you can add new points to the map
    • After a while, actual OSM-tags are shown, later linking to the wiki


    Did you notice an issue? Do you have a feature request? Want to help translate? Head over to the source code or issue tracker.

    Want to see your progress? Follow the edit count on OsmCha.

    ", - "backgroundMap": "Background map", - "openTheMap": "Open the map", - "loginOnlyNeededToEdit": "if you want to edit the map", - "layerSelection": { - "zoomInToSeeThisLayer": "Zoom in to see this layer", - "title": "Select layers" - }, - "download": { - "title": "Download visible data", - "downloadAsPdf": "Download a PDF of the current map", - "downloadAsPdfHelper": "Ideal to print the current map", - "downloadGeojson": "Download visible data as GeoJSON", - "exporting": "Exporting…", - "downloadGeoJsonHelper": "Compatible with QGIS, ArcGIS, ESRI, …", - "downloadCSV": "Download visible data as CSV", - "downloadCSVHelper": "Compatible with LibreOffice Calc, Excel, …", - "includeMetaData": "Include metadata (last editor, calculated values, …)", - "licenseInfo": "

    Copyright notice

    The provided data is available under ODbL. Reusing it is gratis for any purpose, but
    • the attribution © OpenStreetMap contributors is required
    • Any change must be use the license
    Please read the full copyright notice for details.", - "noDataLoaded": "No data is loaded yet. Download will be available soon" - }, - "weekdays": { - "abbreviations": { - "monday": "Mon", - "tuesday": "Tue", - "wednesday": "Wed", - "thursday": "Thu", - "friday": "Fri", - "saturday": "Sat", - "sunday": "Sun" - }, - "monday": "Monday", - "tuesday": "Tuesday", - "wednesday": "Wednesday", - "thursday": "Thursday", - "friday": "Friday", - "saturday": "Saturday", - "sunday": "Sunday" - }, - "opening_hours": { - "error_loading": "Error: could not visualize these opening hours.", - "open_during_ph": "During a public holiday, this amenity is", - "opensAt": "from", - "openTill": "till", - "not_all_rules_parsed": "The opening hours of this shop are complicated. The following rules are ignored in the input element:", - "closed_until": "Closed until {date}", - "closed_permanently": "Closed for an unkown duration", - "open_24_7": "Opened around the clock", - "ph_not_known": " ", - "ph_closed": "closed", - "ph_open": "opened", - "ph_open_as_usual": "opened as usual", - "loadingCountry": "Determining country…" - }, - "histogram": { - "error_loading": "Could not load the histogram" - }, - "wikipedia": { - "wikipediaboxTitle": "Wikipedia", - "failed": "Loading the Wikipedia entry failed", - "loading": "Loading Wikipedia...", - "noWikipediaPage": "This Wikidata item has no corresponding Wikipedia page yet.", - "searchWikidata": "Search on Wikidata", - "noResults": "Nothing found for {search}", - "doSearch": "Search above to see results", - "createNewWikidata": "Create a new Wikidata item" - } + "pickLanguage": "Choose a language: ", + "about": "Easily edit and add OpenStreetMap for a certain theme", + "nameInlineQuestion": "The name of this {category} is $$$", + "noNameCategory": "{category} without a name", + "questions": { + "phoneNumberOf": "What is the phone number of {category}?", + "phoneNumberIs": "The phone number of this {category} is {phone}", + "websiteOf": "What is the website of {category}?", + "websiteIs": "Website: {website}", + "emailOf": "What is the email address of {category}?", + "emailIs": "The email address of this {category} is {email}" }, - "favourite": { - "panelIntro": "

    Your personal theme

    Activate your favourite layers from all the official themes", - "loginNeeded": "

    Log in

    A personal layout is only available for OpenStreetMap users", - "reload": "Reload the data" + "morescreen": { + "intro": "

    More thematic maps?

    Do you enjoy collecting geodata?
    There are more themes available.", + "requestATheme": "If you want a custom-built theme, request it in the issue tracker", + "streetcomplete": "Another, similar application is StreetComplete.", + "createYourOwnTheme": "Create your own MapComplete theme from scratch", + "previouslyHiddenTitle": "Previously visited hidden themes", + "hiddenExplanation": "These themes are only accessible to those with the link. You have discovered {hidden_discovered} of {total_hidden} hidden themes." }, - "reviews": { - "title": "{count} reviews", - "title_singular": "One review", - "name_required": "A name is required in order to display and create reviews", - "no_reviews_yet": "There are no reviews yet. Be the first to write one and help open data and the business!", - "write_a_comment": "Leave a review…", - "no_rating": "No rating given", - "posting_as": "Posting as", - "i_am_affiliated": "I am affiliated with this object
    Check if you are an owner, creator, employee, …", - "affiliated_reviewer_warning": "(Affiliated review)", - "saving_review": "Saving…", - "saved": "Review saved. Thanks for sharing!", - "tos": "If you create a review, you agree to the TOS and privacy policy of Mangrove.reviews", - "attribution": "Reviews are powered by Mangrove Reviews and are available under CC-BY 4.0.", - "plz_login": "Log in to leave a review" + "sharescreen": { + "intro": "

    Share this map

    Share this map by copying the link below and sending it to friends and family:", + "addToHomeScreen": "

    Add to your home screen

    You can easily add this website to your smartphone home screen for a native feel. Click the 'Add to home screen' button in the URL bar to do this.", + "embedIntro": "

    Embed on your website

    Please, embed this map into your website.
    We encourage you to do it - you don't even have to ask permission.
    It is free, and always will be. The more people are using this, the more valuable it becomes.", + "copiedToClipboard": "Link copied to clipboard", + "thanksForSharing": "Thanks for sharing!", + "editThisTheme": "Edit this theme", + "editThemeDescription": "Add or change questions to this map theme", + "fsUserbadge": "Enable the login button", + "fsSearch": "Enable the search bar", + "fsWelcomeMessage": "Show the welcome message popup and associated tabs", + "fsLayers": "Enable the layer control", + "fsLayerControlToggle": "Start with the layer control expanded", + "fsAddNew": "Enable the 'add new POI' button", + "fsGeolocation": "Enable the 'geolocate-me' button (mobile only)", + "fsIncludeCurrentBackgroundMap": "Include the current background choice {name}", + "fsIncludeCurrentLayers": "Include the current layer choices", + "fsIncludeCurrentLocation": "Include current location" }, - "multi_apply": { - "autoApply": "When changing the attributes {attr_names}, these attributes will automatically be changed on {count} other objects too" + "attribution": { + "attributionTitle": "Attribution notice", + "attributionContent": "

    All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.

    ", + "themeBy": "Theme maintained by {author}", + "iconAttribution": { + "title": "Used icons" + }, + "mapContributionsBy": "The current visible data has edits made by {contributors}", + "mapContributionsByAndHidden": "The current visible data has edits made by {contributors} and {hiddenCount} more contributors", + "codeContributionsBy": "MapComplete has been built by {contributors} and {hiddenCount} more contributors", + "openOsmcha": "See latest edits made with {theme}", + "openMapillary": "Open Mapillary here", + "openIssueTracker": "File a bug", + "josmOpened": "JOSM is opened", + "josmNotOpened": "JOSM could not be reached. Make sure it is opened and remote control is enabled", + "editJosm": "Edit here with JOSM", + "editId": "Open the OpenStreetMap online editor here", + "donate": "Support MapComplete financially" }, - "move": { - "loginToMove": "You must be logged in to move a point", - "inviteToMoveAgain": "Move this point again", - "moveTitle": "Move this point", - "whyMove": "Why do you want to move this point?", - "confirmMove": "Move here", - "pointIsMoved": "The point has been moved", - "zoomInFurther": "Zoom in further to confirm this move", - "selectReason": "Why do you move this object?", - "reasons": { - "reasonRelocation": "The object has been relocated to a totally different location", - "reasonInaccurate": "The location of this object is inaccurate and should be moved a few meter" - }, - "inviteToMove": { - "generic": "Move this point", - "reasonInaccurate": "Improve the accuracy of this point", - "reasonRelocation": "Move this object to a another place because it has relocated" - }, - "cannotBeMoved": "This feature cannot be moved.", - "isWay": "This feature is a way. Use another OpenStreetMap editor to move it.", - "isRelation": "This feature is a relation and can not be moved", - "partOfAWay": "This feature is part of another way. Use another editor to move it.", - "partOfRelation": "This feature is part of a relation. Use another editor to move it.", - "cancel": "Cancel move" + "readYourMessages": "Please, read all your OpenStreetMap-messages before adding a new point.", + "fewChangesBefore": "Please, answer a few questions of existing points before adding a new point.", + "goToInbox": "Open inbox", + "getStartedLogin": "Log in with OpenStreetMap to get started", + "getStartedNewAccount": " or create a new account", + "noTagsSelected": "No tags selected", + "testing": "Testing - changes won't be saved", + "customThemeIntro": "

    Custom themes

    These are previously visited user-generated themes.", + "aboutMapcomplete": "

    About MapComplete

    Use it to add OpenStreetMap info on a single theme. Answer questions, and within minutes your contributions are available everywhere. The theme maintainer defines elements, questions and languages for it.

    Find out more

    MapComplete always offers the next step to learn more about OpenStreetMap.

    • When embedded in a website, the iframe links to a full-screen MapComplete
    • The fullscreen version offers info about OpenStreetMap
    • Viewing works without login, but editing requires an OSM account.
    • If you are not logged in, you are asked to do so
    • Once you answered a single question, you can add new points to the map
    • After a while, actual OSM-tags are shown, later linking to the wiki


    Did you notice an issue? Do you have a feature request? Want to help translate? Head over to the source code or issue tracker.

    Want to see your progress? Follow the edit count on OsmCha.

    ", + "backgroundMap": "Background map", + "openTheMap": "Open the map", + "loginOnlyNeededToEdit": "if you want to edit the map", + "layerSelection": { + "zoomInToSeeThisLayer": "Zoom in to see this layer", + "title": "Select layers" }, - "professional": { - "title": "Professional support with MapComplete", - "subheading": "What can MapComplete do for your organisation?" - - - + "download": { + "title": "Download visible data", + "downloadAsPdf": "Download a PDF of the current map", + "downloadAsPdfHelper": "Ideal to print the current map", + "downloadGeojson": "Download visible data as GeoJSON", + "downloadGpx":"Download as GPX-file", + "downloadGpxHelper":"A GPX-file can be used with most navigation devices and applications", + "exporting": "Exporting…", + "downloadGeoJsonHelper": "Compatible with QGIS, ArcGIS, ESRI, …", + "downloadCSV": "Download visible data as CSV", + "downloadCSVHelper": "Compatible with LibreOffice Calc, Excel, …", + "includeMetaData": "Include metadata (last editor, calculated values, …)", + "licenseInfo": "

    Copyright notice

    The provided data is available under ODbL. Reusing it is gratis for any purpose, but
    • the attribution © OpenStreetMap contributors is required
    • Any change must be use the license
    Please read the full copyright notice for details.", + "noDataLoaded": "No data is loaded yet. Download will be available soon" + }, + "weekdays": { + "abbreviations": { + "monday": "Mon", + "tuesday": "Tue", + "wednesday": "Wed", + "thursday": "Thu", + "friday": "Fri", + "saturday": "Sat", + "sunday": "Sun" + }, + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday" + }, + "opening_hours": { + "error_loading": "Error: could not visualize these opening hours.", + "open_during_ph": "During a public holiday, this is", + "opensAt": "from", + "openTill": "till", + "not_all_rules_parsed": "These opening hours are complicated. The following rules are ignored in the input element:", + "closed_until": "Closed until {date}", + "closed_permanently": "Closed for an unkown duration", + "open_24_7": "Opened around the clock", + "ph_not_known": " ", + "ph_closed": "closed", + "ph_open": "opened", + "ph_open_as_usual": "opened as usual", + "loadingCountry": "Determining country…" + }, + "histogram": { + "error_loading": "Could not load the histogram" + }, + "wikipedia": { + "wikipediaboxTitle": "Wikipedia", + "failed": "Loading the Wikipedia entry failed", + "loading": "Loading Wikipedia...", + "noWikipediaPage": "This Wikidata item has no corresponding Wikipedia page yet.", + "searchWikidata": "Search on Wikidata", + "noResults": "Nothing found for {search}", + "doSearch": "Search above to see results", + "createNewWikidata": "Create a new Wikidata item" + }, + "apply_button": { + "isApplied": "The changes are applied", + "appliedOnAnotherObject": "The object {id} will receive {tags}" } + }, + "favourite": { + "panelIntro": "

    Your personal theme

    Activate your favourite layers from all the official themes", + "loginNeeded": "

    Log in

    A personal layout is only available for OpenStreetMap users", + "reload": "Reload the data" + }, + "reviews": { + "title": "{count} reviews", + "title_singular": "One review", + "name_required": "A name is required in order to display and create reviews", + "no_reviews_yet": "There are no reviews yet. Be the first to write one and help open data and the business!", + "write_a_comment": "Leave a review…", + "no_rating": "No rating given", + "posting_as": "Posting as", + "i_am_affiliated": "I am affiliated with this object
    Check if you are an owner, creator, employee, …", + "affiliated_reviewer_warning": "(Affiliated review)", + "saving_review": "Saving…", + "saved": "Review saved. Thanks for sharing!", + "tos": "If you create a review, you agree to the TOS and privacy policy of Mangrove.reviews", + "attribution": "Reviews are powered by Mangrove Reviews and are available under CC-BY 4.0.", + "plz_login": "Log in to leave a review" + }, + "multi_apply": { + "autoApply": "When changing the attributes {attr_names}, these attributes will automatically be changed on {count} other objects too" + }, + "move": { + "loginToMove": "You must be logged in to move a point", + "inviteToMoveAgain": "Move this point again", + "moveTitle": "Move this point", + "whyMove": "Why do you want to move this point?", + "confirmMove": "Move here", + "pointIsMoved": "The point has been moved", + "zoomInFurther": "Zoom in further to confirm this move", + "selectReason": "Why do you move this object?", + "reasons": { + "reasonRelocation": "The object has been relocated to a totally different location", + "reasonInaccurate": "The location of this object is inaccurate and should be moved a few meter" + }, + "inviteToMove": { + "generic": "Move this point", + "reasonInaccurate": "Improve the accuracy of this point", + "reasonRelocation": "Move this object to a another place because it has relocated" + }, + "cannotBeMoved": "This feature cannot be moved.", + "isWay": "This feature is a way. Use another OpenStreetMap editor to move it.", + "isRelation": "This feature is a relation and can not be moved", + "partOfAWay": "This feature is part of another way. Use another editor to move it.", + "partOfRelation": "This feature is part of a relation. Use another editor to move it.", + "cancel": "Cancel move" + } } diff --git a/langs/eo.json b/langs/eo.json index 9c6a1e92de..b2d149e7dd 100644 --- a/langs/eo.json +++ b/langs/eo.json @@ -1,104 +1,104 @@ { - "image": { - "ccb": "laŭ la permesilo CC-BY", - "addPicture": "Aldoni bildon", - "uploadingPicture": "Alŝutante vian bildon…", - "dontDelete": "Nuligi", - "ccbs": "laŭ la permesilo CC-BY-SA", - "cco": "kiel publika havaĵo", - "pleaseLogin": "Bonvolu saluti por aldoni bildon", - "uploadingMultiple": "Alŝutante {count} bildojn…" + "image": { + "ccb": "laŭ la permesilo CC-BY", + "addPicture": "Aldoni bildon", + "uploadingPicture": "Alŝutante vian bildon…", + "dontDelete": "Nuligi", + "ccbs": "laŭ la permesilo CC-BY-SA", + "cco": "kiel publika havaĵo", + "pleaseLogin": "Bonvolu saluti por aldoni bildon", + "uploadingMultiple": "Alŝutante {count} bildojn…" + }, + "general": { + "opening_hours": { + "ph_open": "malfermita", + "opensAt": "ekde", + "openTill": "ĝis", + "ph_closed": "fermita", + "ph_not_known": " " }, - "general": { - "opening_hours": { - "ph_open": "malfermita", - "opensAt": "ekde", - "openTill": "ĝis", - "ph_closed": "fermita", - "ph_not_known": " " - }, - "questions": { - "websiteIs": "Retejo: {website}" - }, - "weekdays": { - "sunday": "dimanĉo", - "abbreviations": { - "friday": "ve", - "saturday": "sa", - "tuesday": "ma", - "wednesday": "me", - "thursday": "ĵa", - "sunday": "di", - "monday": "lu" - }, - "thursday": "ĵaŭdo", - "friday": "vendredo", - "saturday": "sabato", - "tuesday": "mardo", - "wednesday": "merkredo", - "monday": "lundo" - }, - "loading": "Ŝargante…", - "pdf": { - "generatedWith": "Generita per MapComplete.osm.be", - "versionInfo": "v{version} - generita je {date}", - "attrBackground": "Fona tavolo: {background}", - "attr": "Mapaj datenoj © Kontribuintoj al OpenStreetMap, reuzeblaj laŭ ODbL" - }, - "loginWithOpenStreetMap": "Saluti per OpenStreetMap", - "search": { - "search": "Serĉi lokon", - "nothing": "Nenio troviĝis…", - "error": "Io fiaskis…", - "searching": "Serĉante…" - }, - "returnToTheMap": "Reen al la mapo", - "save": "Konservi", - "skip": "Preterpasi ĉi tiun demandon", - "add": { - "title": "Enmeti novan punkton?" - }, - "pickLanguage": "Elektu lingvon: ", - "noNameCategory": "{category} sen nomo", - "sharescreen": { - "editThisTheme": "Modifi ĉi tiun etoson", - "fsSearch": "Ŝalti la serĉbreton", - "fsUserbadge": "Ŝalti la salutbutonon" - }, - "backgroundMap": "Fona mapo", - "openTheMap": "Malfermi la mapon", - "wikipedia": { - "wikipediaboxTitle": "Vikipedio", - "loading": "Ŝargante Vikipedion…", - "searchWikidata": "Serĉi Vikidatumojn", - "noResults": "Nenio troviĝis pri {search}" - }, - "cancel": "Nuligi", - "attribution": { - "iconAttribution": { - "title": "Uzitaj piktogramoj" - } - }, - "download": { - "exporting": "Elportante…" - } + "questions": { + "websiteIs": "Retejo: {website}" }, - "favourite": { - "reload": "Reŝargi la datenojn" + "weekdays": { + "sunday": "dimanĉo", + "abbreviations": { + "friday": "ve", + "saturday": "sa", + "tuesday": "ma", + "wednesday": "me", + "thursday": "ĵa", + "sunday": "di", + "monday": "lu" + }, + "thursday": "ĵaŭdo", + "friday": "vendredo", + "saturday": "sabato", + "tuesday": "mardo", + "wednesday": "merkredo", + "monday": "lundo" }, - "reviews": { - "saving_review": "Konservante…", - "title": "{count} recenzoj", - "title_singular": "Unu recenzo" + "loading": "Ŝargante…", + "pdf": { + "generatedWith": "Generita per MapComplete.osm.be", + "versionInfo": "v{version} - generita je {date}", + "attrBackground": "Fona tavolo: {background}", + "attr": "Mapaj datenoj © Kontribuintoj al OpenStreetMap, reuzeblaj laŭ ODbL" }, - "centerMessage": { - "ready": "Farite!", - "loadingData": "Ŝargante datenojn…" + "loginWithOpenStreetMap": "Saluti per OpenStreetMap", + "search": { + "search": "Serĉi lokon", + "nothing": "Nenio troviĝis…", + "error": "Io fiaskis…", + "searching": "Serĉante…" }, - "index": { - "title": "Bonvenon al MapComplete" + "returnToTheMap": "Reen al la mapo", + "save": "Konservi", + "skip": "Preterpasi ĉi tiun demandon", + "add": { + "title": "Enmeti novan punkton?" }, - "delete": { - "cancel": "Nuligi" + "pickLanguage": "Elektu lingvon: ", + "noNameCategory": "{category} sen nomo", + "sharescreen": { + "editThisTheme": "Modifi ĉi tiun etoson", + "fsSearch": "Ŝalti la serĉbreton", + "fsUserbadge": "Ŝalti la salutbutonon" + }, + "backgroundMap": "Fona mapo", + "openTheMap": "Malfermi la mapon", + "wikipedia": { + "wikipediaboxTitle": "Vikipedio", + "loading": "Ŝargante Vikipedion…", + "searchWikidata": "Serĉi Vikidatumojn", + "noResults": "Nenio troviĝis pri {search}" + }, + "cancel": "Nuligi", + "attribution": { + "iconAttribution": { + "title": "Uzitaj piktogramoj" + } + }, + "download": { + "exporting": "Elportante…" } + }, + "favourite": { + "reload": "Reŝargi la datenojn" + }, + "reviews": { + "saving_review": "Konservante…", + "title": "{count} recenzoj", + "title_singular": "Unu recenzo" + }, + "centerMessage": { + "ready": "Farite!", + "loadingData": "Ŝargante datenojn…" + }, + "index": { + "title": "Bonvenon al MapComplete" + }, + "delete": { + "cancel": "Nuligi" + } } diff --git a/langs/fr.json b/langs/fr.json index 82b456e729..45c9c27114 100644 --- a/langs/fr.json +++ b/langs/fr.json @@ -1,181 +1,181 @@ { - "image": { - "addPicture": "Ajoutez une photo", - "uploadingPicture": "Mise en ligne de votre photo…", - "uploadingMultiple": "Mise en ligne de {count} photos…", - "pleaseLogin": "Connectez-vous pour téléverser une photo", - "willBePublished": "Votre photo va être publiée : ", - "cco": "dans le domaine public", - "ccbs": "sous la license CC-BY-SA", - "ccb": "sous la license CC-BY", - "uploadFailed": "L'ajout de la photo a échoué. Avez-vous accès à Internet ? Les API tierces sont-elles autorisées ? Le navigateur Brave ou UMatrix peuvent les bloquer.", - "respectPrivacy": "Merci de respecter la vie privée. Ne publiez pas les plaques d'immatriculation.", - "uploadDone": "Votre photo est ajoutée. Merci beaucoup !", - "dontDelete": "Annuler", - "doDelete": "Supprimer l'image", - "isDeleted": "Supprimé" + "image": { + "addPicture": "Ajoutez une photo", + "uploadingPicture": "Mise en ligne de votre photo…", + "uploadingMultiple": "Mise en ligne de {count} photos…", + "pleaseLogin": "Connectez-vous pour téléverser une photo", + "willBePublished": "Votre photo va être publiée : ", + "cco": "dans le domaine public", + "ccbs": "sous la license CC-BY-SA", + "ccb": "sous la license CC-BY", + "uploadFailed": "L'ajout de la photo a échoué. Avez-vous accès à Internet ? Les API tierces sont-elles autorisées ? Le navigateur Brave ou UMatrix peuvent les bloquer.", + "respectPrivacy": "Merci de respecter la vie privée. Ne publiez pas les plaques d'immatriculation.", + "uploadDone": "Votre photo est ajoutée. Merci beaucoup !", + "dontDelete": "Annuler", + "doDelete": "Supprimer l'image", + "isDeleted": "Supprimé" + }, + "centerMessage": { + "loadingData": "Chargement des données…", + "zoomIn": "Rapprochez-vous sur la carte pour voir ou éditer les données", + "ready": "Fini !", + "retrying": "Le chargement a échoué. Nouvel essai dans {count} secondes…" + }, + "index": { + "#": "Ces textes sont affichés au dessus des boutons de thème quand aucun thème n'est chargé", + "title": "Bienvenue sur MapComplete", + "intro": "MapComplete est une application qui permet de voir des informations d'OpenStreetMap sur un thème spécifique et de les éditer.", + "pickTheme": "Choisissez un thème ci-dessous pour commencer." + }, + "general": { + "loginWithOpenStreetMap": "Se connecter avec OpenStreeMap", + "welcomeBack": "Vous êtes connecté. Bienvenue !", + "loginToStart": "Connectez-vous pour répondre à cette question", + "search": { + "search": "Chercher un lieu", + "searching": "Chargement…", + "nothing": "Rien n'a été trouvé…", + "error": "Quelque chose n'a pas marché…" }, - "centerMessage": { - "loadingData": "Chargement des données…", - "zoomIn": "Rapprochez-vous sur la carte pour voir ou éditer les données", - "ready": "Fini !", - "retrying": "Le chargement a échoué. Nouvel essai dans {count} secondes…" + "returnToTheMap": "Retourner sur la carte", + "save": "Sauvegarder", + "cancel": "Annuler", + "skip": "Passer la question", + "oneSkippedQuestion": "Une question a été passée", + "skippedQuestions": "Questions passées", + "number": "nombre", + "osmLinkTooltip": "Voir l'historique de cet objet sur OpenStreetMap et plus d'options d'édition", + "add": { + "addNew": "Ajouter un/une {category} ici", + "title": "Ajouter un nouveau point ?", + "intro": "Vous avez cliqué sur un endroit où il n'y a pas encore de données.
    ", + "pleaseLogin": "Vous devez vous connecter pour ajouter un point", + "zoomInFurther": "Rapprochez vous pour ajouter un point.", + "stillLoading": "Chargement des données en cours. Patientez un instant avant d'ajouter un nouveau point.", + "confirmIntro": "

    Ajouter un/une {title} ici?

    Le point que vous ajouterez sera visible par tout le monde. Merci de vous assurer que ce point existe réellement. Beaucoup d'autres applications utilisent ces données.", + "confirmButton": "Ajouter un/une {category} ici.
    Votre ajout sera visible par tout le monde
    ", + "openLayerControl": "Ouvrir la panneau de contrôle", + "layerNotEnabled": "La couche {layer} est désactivée. Activez-la pour ajouter un point" }, - "index": { - "#": "Ces textes sont affichés au dessus des boutons de thème quand aucun thème n'est chargé", - "title": "Bienvenue sur MapComplete", - "intro": "MapComplete est une application qui permet de voir des informations d'OpenStreetMap sur un thème spécifique et de les éditer.", - "pickTheme": "Choisissez un thème ci-dessous pour commencer." + "pickLanguage": "Choisir la langue : ", + "about": "Éditer facilement et ajouter OpenStreetMap pour un certain thème", + "nameInlineQuestion": "Le nom de cet/cette {category} est $$$", + "noNameCategory": "{category} sans nom", + "questions": { + "phoneNumberOf": "Quel est le numéro de téléphone de {category} ?", + "phoneNumberIs": "Le numéro de téléphone de {category} est {phone}", + "websiteOf": "Quel est le site internet de {category} ?", + "websiteIs": "Site Web : {website}", + "emailOf": "Quelle est l'adresse électronique de {category} ?", + "emailIs": "L'adresse électronique de {category} est {email}" }, - "general": { - "loginWithOpenStreetMap": "Se connecter avec OpenStreeMap", - "welcomeBack": "Vous êtes connecté. Bienvenue !", - "loginToStart": "Connectez-vous pour répondre à cette question", - "search": { - "search": "Chercher un lieu", - "searching": "Chargement…", - "nothing": "Rien n'a été trouvé…", - "error": "Quelque chose n'a pas marché…" - }, - "returnToTheMap": "Retourner sur la carte", - "save": "Sauvegarder", - "cancel": "Annuler", - "skip": "Passer la question", - "oneSkippedQuestion": "Une question a été passée", - "skippedQuestions": "Questions passées", - "number": "nombre", - "osmLinkTooltip": "Voir l'historique de cet objet sur OpenStreetMap et plus d'options d'édition", - "add": { - "addNew": "Ajouter un/une {category} ici", - "title": "Ajouter un nouveau point ?", - "intro": "Vous avez cliqué sur un endroit où il n'y a pas encore de données.
    ", - "pleaseLogin": "Vous devez vous connecter pour ajouter un point", - "zoomInFurther": "Rapprochez vous pour ajouter un point.", - "stillLoading": "Chargement des données en cours. Patientez un instant avant d'ajouter un nouveau point.", - "confirmIntro": "

    Ajouter un/une {title} ici?

    Le point que vous ajouterez sera visible par tout le monde. Merci de vous assurer que ce point existe réellement. Beaucoup d'autres applications utilisent ces données.", - "confirmButton": "Ajouter un/une {category} ici.
    Votre ajout sera visible par tout le monde
    ", - "openLayerControl": "Ouvrir la panneau de contrôle", - "layerNotEnabled": "La couche {layer} est désactivée. Activez-la pour ajouter un point" - }, - "pickLanguage": "Choisir la langue : ", - "about": "Éditer facilement et ajouter OpenStreetMap pour un certain thème", - "nameInlineQuestion": "Le nom de cet/cette {category} est $$$", - "noNameCategory": "{category} sans nom", - "questions": { - "phoneNumberOf": "Quel est le numéro de téléphone de {category} ?", - "phoneNumberIs": "Le numéro de téléphone de {category} est {phone}", - "websiteOf": "Quel est le site internet de {category} ?", - "websiteIs": "Site Web : {website}", - "emailOf": "Quelle est l'adresse électronique de {category} ?", - "emailIs": "L'adresse électronique de {category} est {email}" - }, - "openStreetMapIntro": "

    Une carte ouverte

    Ne serait-il pas génial d'avoir sur une carte que tout le monde pourrait éditer ouvertement ? Une seule et unique plateforme regroupant toutes les informations géographiques ? Ainsi nous n'aurons plus besoin de toutes ces cartes petites et incompatibles (souvent non mises à jour).

    OpenStreetMap est la carte qu'il vous faut ! Toutes les données de cette carte peuvent être utilisé gratuitement (avec d'attribution et de publication des changements de données). De plus tout le monde est libre d'ajouter de nouvelles données et de corriger les erreurs. Ce site internet utilise également OpenStreetMap. Toutes les données en proviennent et tous les ajouts et modifications y seront également ajoutés.

    De nombreux individus et applications utilisent déjà OpenStreetMap : Maps.me, OsmAnd, mais aussi les cartes de Facebook, Instagram, Apple-maps et Bing-maps sont (en partie) supportés par OpenStreetMap. Si vous modifiez quelque chose ici, ces changements seront incorporés dans ces applications dès leurs mises à jour !

    ", - "attribution": { - "attributionTitle": "Crédits", - "attributionContent": "

    Toutes les données sont fournies par OpenStreetMap, librement réutilisables sous Open DataBase License.

    ", - "themeBy": "Thème maintenu par {author}", - "iconAttribution": { - "title": "Icônes utilisées" - }, - "mapContributionsByAndHidden": "La partie actuellement visible des données comporte des modifications par {contributors} et {hiddenCount} contributeurs de plus", - "mapContributionsBy": "La partie actuellement visible des données comporte des modifications par {contributors}", - "codeContributionsBy": "MapComplete a été construit par {contributors} et {hiddenCount} autres contributeurs" - }, - "sharescreen": { - "intro": "

    Partager cette carte

    Partagez cette carte en copiant le lien suivant et envoyez-le à vos amis :", - "addToHomeScreen": "

    Ajouter à votre page d'accueil

    Vous pouvez facilement ajouter la carte à votre écran d'accueil de téléphone. Cliquer sur le boutton 'ajouter à l'ecran d'accueil' dans la barre d'adresse pour éffectuer cette tâche.", - "embedIntro": "

    Incorporer à votre site Web

    Ajouter la carte à votre site Web.
    Nous vous y encourageons – pas besoin de permission.
    C'est gratuit et pour toujours. Plus des personnes l'utilisent, mieux c'est.", - "copiedToClipboard": "Lien copié dans le presse-papier", - "thanksForSharing": "Merci d'avoir partagé !", - "editThisTheme": "Editer ce thème", - "editThemeDescription": "Ajouter ou modifier des questions à ce thème", - "fsUserbadge": "Activer le bouton de connexion", - "fsSearch": "Activer la barre de recherche", - "fsWelcomeMessage": "Afficher le message de bienvenue et les onglets associés", - "fsLayers": "Activer le contrôle des couches", - "fsLayerControlToggle": "Démarrer avec le contrôle des couches ouvert", - "fsAddNew": "Activer le bouton 'ajouter un POI'", - "fsGeolocation": "Activer le bouton 'Localisez-moi' (seulement sur mobile)", - "fsIncludeCurrentBackgroundMap": "Include le choix actuel d'arrière plan {name}", - "fsIncludeCurrentLayers": "Inclure la couche selectionnée", - "fsIncludeCurrentLocation": "Inclure l'emplacement actuel" - }, - "morescreen": { - "intro": "

    Plus de thèmes ?

    Vous aimez collecter des données géographiques ?
    Il y a plus de thèmes disponibles.", - "requestATheme": "Si vous voulez une autre carte thématique, demandez-la dans le suivi des problèmes", - "streetcomplete": "Une autre application similaire est StreetComplete.", - "createYourOwnTheme": "Créez votre propre MapComplete carte" - }, - "readYourMessages": "Merci de lire tous vos messages sur OpenStreetMap avant d'ajouter un nouveau point.", - "fewChangesBefore": "Merci de répondre à quelques questions à propos de points déjà existants avant d'ajouter de nouveaux points.", - "goToInbox": "Ouvrir les messages", - "getStartedLogin": "Connectez-vous avec OpenStreetMap pour commencer", - "getStartedNewAccount": " ou créez un compte", - "noTagsSelected": "Aucune balise sélectionnée", - "customThemeIntro": "

    Thèmes personnalisés

    Vous avez déjà visité ces thèmes personnalisés.", - "aboutMapcomplete": "

    À propos de MapComplete

    Avec MapComplete vous pouvez enrichir OpenStreetMap d'informations sur un thème unique. Répondez à quelques questions, et en quelques minutes vos contributions seront disponible dans le monde entier ! Le concepteur du thème définis les éléments, questions et langues pour le thème.

    En savoir plus

    MapComplete propose toujours l'étape suivante pour en apprendre plus sur OpenStreetMap.

    • Lorsqu'il est intégré dans un site Web, l'<i>iframe</i> pointe vers MapComplete en plein écran
    • La version plein écran donne des informations sur OpenStreetMap
    • Il est possible de regarder sans se connecter, mais l'édition demande une connexion à OSM.
    • Si vous n'êtes pas connecté, il vous est demandé de le faire
    • Une fois que vous avez répondu à une seule question, vous pouvez ajouter de nouveaux points à la carte
    • Au bout d'un moment, les vrais tags OSM sont montrés, qui pointent ensuite vers le wiki


    Vous avez remarqué un problème ? Vous souhaitez demander une fonctionnalité ? Vous voulez aider à traduire ? Allez voir le code source ou l'<i>issue tracker.</i>

    Vous voulez visualiser votre progression ? Suivez le compteur d'édition sur OsmCha.

    ", - "backgroundMap": "Carte de fonds", - "layerSelection": { - "zoomInToSeeThisLayer": "Aggrandissez la carte pour voir cette couche", - "title": "Selectionner des couches" - }, - "weekdays": { - "abbreviations": { - "monday": "Lun", - "tuesday": "Mar", - "wednesday": "Mer", - "thursday": "Jeu", - "friday": "Ven", - "saturday": "Sam", - "sunday": "Dim" - }, - "monday": "Lundi", - "tuesday": "Mardi", - "wednesday": "Mercredi", - "thursday": "Jeudi", - "friday": "Vendredi", - "saturday": "Samedi", - "sunday": "Dimanche" - }, - "opening_hours": { - "error_loading": "Erreur : impossible de visualiser ces horaires d'ouverture.", - "open_during_ph": "Pendant les congés, ce lieu est", - "opensAt": "à partir de", - "openTill": "jusqu'à", - "not_all_rules_parsed": "Les heures d'ouvertures de ce magasin sont trop compliquées. Les heures suivantes ont été ignorées :", - "closed_until": "Fermé jusqu'au {date}", - "closed_permanently": "Fermé", - "open_24_7": "Ouvert en permanence", - "ph_closed": "fermé", - "ph_open": "ouvert", - "ph_not_known": " " - } + "openStreetMapIntro": "

    Une carte ouverte

    Ne serait-il pas génial d'avoir sur une carte que tout le monde pourrait éditer ouvertement ? Une seule et unique plateforme regroupant toutes les informations géographiques ? Ainsi nous n'aurons plus besoin de toutes ces cartes petites et incompatibles (souvent non mises à jour).

    OpenStreetMap est la carte qu'il vous faut ! Toutes les données de cette carte peuvent être utilisé gratuitement (avec d'attribution et de publication des changements de données). De plus tout le monde est libre d'ajouter de nouvelles données et de corriger les erreurs. Ce site internet utilise également OpenStreetMap. Toutes les données en proviennent et tous les ajouts et modifications y seront également ajoutés.

    De nombreux individus et applications utilisent déjà OpenStreetMap : Maps.me, OsmAnd, mais aussi les cartes de Facebook, Instagram, Apple-maps et Bing-maps sont (en partie) supportés par OpenStreetMap. Si vous modifiez quelque chose ici, ces changements seront incorporés dans ces applications dès leurs mises à jour !

    ", + "attribution": { + "attributionTitle": "Crédits", + "attributionContent": "

    Toutes les données sont fournies par OpenStreetMap, librement réutilisables sous Open DataBase License.

    ", + "themeBy": "Thème maintenu par {author}", + "iconAttribution": { + "title": "Icônes utilisées" + }, + "mapContributionsByAndHidden": "La partie actuellement visible des données comporte des modifications par {contributors} et {hiddenCount} contributeurs de plus", + "mapContributionsBy": "La partie actuellement visible des données comporte des modifications par {contributors}", + "codeContributionsBy": "MapComplete a été construit par {contributors} et {hiddenCount} autres contributeurs" }, - "favourite": { - "panelIntro": "

    Votre thème personnel

    Activer vos couches favorites depuis les thèmes officiels", - "loginNeeded": "

    Connexion

    La mise en forme personnalisée requiert un compte OpenStreetMap", - "reload": "Recharger les données" + "sharescreen": { + "intro": "

    Partager cette carte

    Partagez cette carte en copiant le lien suivant et envoyez-le à vos amis :", + "addToHomeScreen": "

    Ajouter à votre page d'accueil

    Vous pouvez facilement ajouter la carte à votre écran d'accueil de téléphone. Cliquer sur le boutton 'ajouter à l'ecran d'accueil' dans la barre d'adresse pour éffectuer cette tâche.", + "embedIntro": "

    Incorporer à votre site Web

    Ajouter la carte à votre site Web.
    Nous vous y encourageons – pas besoin de permission.
    C'est gratuit et pour toujours. Plus des personnes l'utilisent, mieux c'est.", + "copiedToClipboard": "Lien copié dans le presse-papier", + "thanksForSharing": "Merci d'avoir partagé !", + "editThisTheme": "Editer ce thème", + "editThemeDescription": "Ajouter ou modifier des questions à ce thème", + "fsUserbadge": "Activer le bouton de connexion", + "fsSearch": "Activer la barre de recherche", + "fsWelcomeMessage": "Afficher le message de bienvenue et les onglets associés", + "fsLayers": "Activer le contrôle des couches", + "fsLayerControlToggle": "Démarrer avec le contrôle des couches ouvert", + "fsAddNew": "Activer le bouton 'ajouter un POI'", + "fsGeolocation": "Activer le bouton 'Localisez-moi' (seulement sur mobile)", + "fsIncludeCurrentBackgroundMap": "Include le choix actuel d'arrière plan {name}", + "fsIncludeCurrentLayers": "Inclure la couche selectionnée", + "fsIncludeCurrentLocation": "Inclure l'emplacement actuel" }, - "reviews": { - "title": "{count} avis", - "title_singular": "Un avis", - "name_required": "Un nom est requis pour afficher et créer des avis", - "no_reviews_yet": "Il n'y a pas encore d'avis. Soyez le premier à en écrire un et aidez le lieu et les données ouvertes !", - "write_a_comment": "Laisser un avis…", - "no_rating": "Aucun score donné", - "posting_as": "Envoi en tant que", - "i_am_affiliated": "Je suis affilié à cet objet
    Cochez si vous en êtes le propriétaire, créateur, employé, …", - "affiliated_reviewer_warning": "(Avis affilié)", - "saving_review": "Enregistrement…", - "saved": "Avis enregistré. Merci du partage !", - "tos": "En publiant un avis, vous êtes d'accord avec les conditions d'utilisation et la politique de confidentialité de Mangrove.reviews", - "attribution": "Les avis sont fournis par Mangrove Reviews et sont disponibles sous licence CC-BY 4.0.", - "plz_login": "Connectez vous pour laisser un avis" + "morescreen": { + "intro": "

    Plus de thèmes ?

    Vous aimez collecter des données géographiques ?
    Il y a plus de thèmes disponibles.", + "requestATheme": "Si vous voulez une autre carte thématique, demandez-la dans le suivi des problèmes", + "streetcomplete": "Une autre application similaire est StreetComplete.", + "createYourOwnTheme": "Créez votre propre MapComplete carte" }, - "split": { - "cancel": "Annuler" + "readYourMessages": "Merci de lire tous vos messages sur OpenStreetMap avant d'ajouter un nouveau point.", + "fewChangesBefore": "Merci de répondre à quelques questions à propos de points déjà existants avant d'ajouter de nouveaux points.", + "goToInbox": "Ouvrir les messages", + "getStartedLogin": "Connectez-vous avec OpenStreetMap pour commencer", + "getStartedNewAccount": " ou créez un compte", + "noTagsSelected": "Aucune balise sélectionnée", + "customThemeIntro": "

    Thèmes personnalisés

    Vous avez déjà visité ces thèmes personnalisés.", + "aboutMapcomplete": "

    À propos de MapComplete

    Avec MapComplete vous pouvez enrichir OpenStreetMap d'informations sur un thème unique. Répondez à quelques questions, et en quelques minutes vos contributions seront disponible dans le monde entier ! Le concepteur du thème définis les éléments, questions et langues pour le thème.

    En savoir plus

    MapComplete propose toujours l'étape suivante pour en apprendre plus sur OpenStreetMap.

    • Lorsqu'il est intégré dans un site Web, l'<i>iframe</i> pointe vers MapComplete en plein écran
    • La version plein écran donne des informations sur OpenStreetMap
    • Il est possible de regarder sans se connecter, mais l'édition demande une connexion à OSM.
    • Si vous n'êtes pas connecté, il vous est demandé de le faire
    • Une fois que vous avez répondu à une seule question, vous pouvez ajouter de nouveaux points à la carte
    • Au bout d'un moment, les vrais tags OSM sont montrés, qui pointent ensuite vers le wiki


    Vous avez remarqué un problème ? Vous souhaitez demander une fonctionnalité ? Vous voulez aider à traduire ? Allez voir le code source ou l'<i>issue tracker.</i>

    Vous voulez visualiser votre progression ? Suivez le compteur d'édition sur OsmCha.

    ", + "backgroundMap": "Carte de fonds", + "layerSelection": { + "zoomInToSeeThisLayer": "Aggrandissez la carte pour voir cette couche", + "title": "Selectionner des couches" }, - "delete": { - "cancel": "Annuler" + "weekdays": { + "abbreviations": { + "monday": "Lun", + "tuesday": "Mar", + "wednesday": "Mer", + "thursday": "Jeu", + "friday": "Ven", + "saturday": "Sam", + "sunday": "Dim" + }, + "monday": "Lundi", + "tuesday": "Mardi", + "wednesday": "Mercredi", + "thursday": "Jeudi", + "friday": "Vendredi", + "saturday": "Samedi", + "sunday": "Dimanche" + }, + "opening_hours": { + "error_loading": "Erreur : impossible de visualiser ces horaires d'ouverture.", + "open_during_ph": "Pendant les congés, ce lieu est", + "opensAt": "à partir de", + "openTill": "jusqu'à", + "not_all_rules_parsed": "Les heures d'ouvertures de ce magasin sont trop compliquées. Les heures suivantes ont été ignorées :", + "closed_until": "Fermé jusqu'au {date}", + "closed_permanently": "Fermé", + "open_24_7": "Ouvert en permanence", + "ph_closed": "fermé", + "ph_open": "ouvert", + "ph_not_known": " " } + }, + "favourite": { + "panelIntro": "

    Votre thème personnel

    Activer vos couches favorites depuis les thèmes officiels", + "loginNeeded": "

    Connexion

    La mise en forme personnalisée requiert un compte OpenStreetMap", + "reload": "Recharger les données" + }, + "reviews": { + "title": "{count} avis", + "title_singular": "Un avis", + "name_required": "Un nom est requis pour afficher et créer des avis", + "no_reviews_yet": "Il n'y a pas encore d'avis. Soyez le premier à en écrire un et aidez le lieu et les données ouvertes !", + "write_a_comment": "Laisser un avis…", + "no_rating": "Aucun score donné", + "posting_as": "Envoi en tant que", + "i_am_affiliated": "Je suis affilié à cet objet
    Cochez si vous en êtes le propriétaire, créateur, employé, …", + "affiliated_reviewer_warning": "(Avis affilié)", + "saving_review": "Enregistrement…", + "saved": "Avis enregistré. Merci du partage !", + "tos": "En publiant un avis, vous êtes d'accord avec les conditions d'utilisation et la politique de confidentialité de Mangrove.reviews", + "attribution": "Les avis sont fournis par Mangrove Reviews et sont disponibles sous licence CC-BY 4.0.", + "plz_login": "Connectez vous pour laisser un avis" + }, + "split": { + "cancel": "Annuler" + }, + "delete": { + "cancel": "Annuler" + } } diff --git a/langs/gl.json b/langs/gl.json index a5b2c73e83..13725975fb 100644 --- a/langs/gl.json +++ b/langs/gl.json @@ -70,9 +70,9 @@ "emailIs": "O enderezo de correo electrónico de {category} é {email}" }, "index": { - "pickTheme": "Escolle un tema para comezar.", - "intro": "O MapComplete é un visor e editor do OpenStreetMap, que te amosa información sobre un tema específico.", - "title": "Benvido ao MapComplete" + "pickTheme": "Escolle un tema para comezar.", + "intro": "O MapComplete é un visor e editor do OpenStreetMap, que te amosa información sobre un tema específico.", + "title": "Benvido ao MapComplete" }, "openStreetMapIntro": "

    Un mapa aberto

    Non sería xenial se houbera un só mapa, que todos puideran empregar e editar de xeito libre?Un só lugar para almacenar toda a información xeográfica? Entón, todos eses sitios web con mapas diferentes, pequenos e incompatíbeis (que sempre están desactualizados) xa non serían necesarios.

    OpenStreetMap é ese mapa. Os datos do mapa pódense empregar de balde (con atribución e publicación de modificacións neses datos). Ademais diso, todos poden engadir de xeito ceibe novos datos e corrixir erros. Este sitio web tamén emprega o OpenStreetMap. Todos os datos proveñen de alí, e as túas respostas e correccións tamén serán engadidas alí.

    Moitas persoas e aplicacións xa empregan o OpenStreetMap: Maps.me, OsmAnd, pero tamén os mapas do Facebook, Instagram, Apple e Bing son (en parte) impulsados ​​polo OpenStreetMap. Se mudas algo aquí, tamén será reflexado nesas aplicacións, na súa seguinte actualización!

    ", "sharescreen": { diff --git a/langs/id.json b/langs/id.json index 096cbf6ce5..9c78ab6e7d 100644 --- a/langs/id.json +++ b/langs/id.json @@ -1,109 +1,109 @@ { - "general": { - "questions": { - "phoneNumberOf": "Apakah nombor telepon {category} ini?", - "websiteIs": "Website: {website}", - "emailOf": "Apa alamat email {category}?" - }, - "nameInlineQuestion": "Name {category} ini adalah $$$", - "pickLanguage": "Pilih bahasa: ", - "layerSelection": { - "title": "Pilih lapisan" - }, - "backgroundMap": "Peta latar belakang", - "search": { - "searching": "Sdg mencari…" - }, - "opening_hours": { - "ph_not_known": " ", - "ph_open": "buka", - "ph_closed": "tutup", - "open_24_7": "Dibuka sekitar jam", - "closed_permanently": "Ditutup sampai pemberitahuan lebih lanjut", - "openTill": "sampai", - "opensAt": "dari", - "closed_until": "Ditutup sampai {date}" - }, - "noTagsSelected": "Tidak ada tag yang dipilih", - "getStartedNewAccount": " atau membuat akun baru", - "getStartedLogin": "Masuk dengan OpenStreetMap untuk memulai", - "sharescreen": { - "fsIncludeCurrentLocation": "Sertakan lokasi saat ini", - "fsIncludeCurrentLayers": "Sertakan pilihan lapisan saat ini", - "fsIncludeCurrentBackgroundMap": "Sertakan pilihan latar belakang saat ini {name}", - "fsGeolocation": "Aktifkan tombol 'geolocate-me' (hanya seluler)", - "fsAddNew": "Aktifkan tombol 'tambah POI baru'", - "fsLayers": "Aktifkan kontrol lapisan", - "fsWelcomeMessage": "Tampilkan popup pesan selamat datang dan tab terkait", - "fsSearch": "Aktifkan bilah pencarian", - "fsUserbadge": "Aktifkan tombol masuk", - "editThemeDescription": "Tambahkan atau ubah pertanyaan ke tema peta ini", - "editThisTheme": "Sunting tema ini", - "thanksForSharing": "Terima kasih telah berbagi!", - "copiedToClipboard": "Tautan disalin ke papan klip" - }, - "goToInbox": "Buka kotak masuk", - "weekdays": { - "abbreviations": { - "sunday": "Min", - "saturday": "Sab", - "friday": "Jum", - "thursday": "Kam", - "wednesday": "Rab", - "tuesday": "Sel", - "monday": "Sen" - }, - "sunday": "Minggu", - "saturday": "Sabtu", - "friday": "Jum'at", - "thursday": "Kamis", - "wednesday": "Rabu", - "tuesday": "Selasa", - "monday": "Senin" - }, - "cancel": "Batal" + "general": { + "questions": { + "phoneNumberOf": "Apakah nombor telepon {category} ini?", + "websiteIs": "Website: {website}", + "emailOf": "Apa alamat email {category}?" }, - "image": { - "doDelete": "Buang gambar", - "ccb": "di bawah lisensi CC-BY", - "ccbs": "di bawah lisensi CC-BY-SA", - "cco": "di domain publik", - "willBePublished": "Gambarmu akan dipublikasikan: ", - "pleaseLogin": "Silakan masuk untuk menambah gambar", - "uploadingMultiple": "Mengunggah {count} gambar…", - "uploadingPicture": "Mengunggah gambar Anda…", - "addPicture": "Tambahkan foto", - "isDeleted": "Dihapus", - "dontDelete": "Batal" + "nameInlineQuestion": "Name {category} ini adalah $$$", + "pickLanguage": "Pilih bahasa: ", + "layerSelection": { + "title": "Pilih lapisan" }, - "centerMessage": { - "ready": "Selesai!", - "loadingData": "Memuat data…" + "backgroundMap": "Peta latar belakang", + "search": { + "searching": "Sdg mencari…" }, - "favourite": { - "reload": "Muat ulang data" + "opening_hours": { + "ph_not_known": " ", + "ph_open": "buka", + "ph_closed": "tutup", + "open_24_7": "Dibuka sekitar jam", + "closed_permanently": "Ditutup sampai pemberitahuan lebih lanjut", + "openTill": "sampai", + "opensAt": "dari", + "closed_until": "Ditutup sampai {date}" }, - "reviews": { - "attribution": "Ulasan didukung oleh Mangrove Reviews dan tersedia di bawah CC-BY 4.0.", - "tos": "Jika Anda membuat ulasan, Anda menyetujui TOS dan kebijakan privasi Mangrove.reviews", - "saved": " Ulasan disimpan. Terima kasih sudah berbagi! ", - "saving_review": "Menyimpan…", - "posting_as": "Posting sebagai", - "no_rating": "Tidak ada peringkat yang diberikan", - "write_a_comment": "Beri ulasan…", - "title_singular": "Satu ulasan", - "title": "{count} ulasan", - "plz_login": "Masuk untuk meninggalkan ulasan" + "noTagsSelected": "Tidak ada tag yang dipilih", + "getStartedNewAccount": " atau membuat akun baru", + "getStartedLogin": "Masuk dengan OpenStreetMap untuk memulai", + "sharescreen": { + "fsIncludeCurrentLocation": "Sertakan lokasi saat ini", + "fsIncludeCurrentLayers": "Sertakan pilihan lapisan saat ini", + "fsIncludeCurrentBackgroundMap": "Sertakan pilihan latar belakang saat ini {name}", + "fsGeolocation": "Aktifkan tombol 'geolocate-me' (hanya seluler)", + "fsAddNew": "Aktifkan tombol 'tambah POI baru'", + "fsLayers": "Aktifkan kontrol lapisan", + "fsWelcomeMessage": "Tampilkan popup pesan selamat datang dan tab terkait", + "fsSearch": "Aktifkan bilah pencarian", + "fsUserbadge": "Aktifkan tombol masuk", + "editThemeDescription": "Tambahkan atau ubah pertanyaan ke tema peta ini", + "editThisTheme": "Sunting tema ini", + "thanksForSharing": "Terima kasih telah berbagi!", + "copiedToClipboard": "Tautan disalin ke papan klip" }, - "index": { - "pickTheme": "Pilih tema di bawah ini untuk memulai.", - "intro": "MapComplete adalah penampil dan editor OpenStreetMap, yang menunjukkan informasi tentang tema tertentu.", - "title": "Selamat datang di MapComplete" + "goToInbox": "Buka kotak masuk", + "weekdays": { + "abbreviations": { + "sunday": "Min", + "saturday": "Sab", + "friday": "Jum", + "thursday": "Kam", + "wednesday": "Rab", + "tuesday": "Sel", + "monday": "Sen" + }, + "sunday": "Minggu", + "saturday": "Sabtu", + "friday": "Jum'at", + "thursday": "Kamis", + "wednesday": "Rabu", + "tuesday": "Selasa", + "monday": "Senin" }, - "split": { - "cancel": "Batal" - }, - "delete": { - "cancel": "Batal" - } + "cancel": "Batal" + }, + "image": { + "doDelete": "Buang gambar", + "ccb": "di bawah lisensi CC-BY", + "ccbs": "di bawah lisensi CC-BY-SA", + "cco": "di domain publik", + "willBePublished": "Gambarmu akan dipublikasikan: ", + "pleaseLogin": "Silakan masuk untuk menambah gambar", + "uploadingMultiple": "Mengunggah {count} gambar…", + "uploadingPicture": "Mengunggah gambar Anda…", + "addPicture": "Tambahkan foto", + "isDeleted": "Dihapus", + "dontDelete": "Batal" + }, + "centerMessage": { + "ready": "Selesai!", + "loadingData": "Memuat data…" + }, + "favourite": { + "reload": "Muat ulang data" + }, + "reviews": { + "attribution": "Ulasan didukung oleh Mangrove Reviews dan tersedia di bawah CC-BY 4.0.", + "tos": "Jika Anda membuat ulasan, Anda menyetujui TOS dan kebijakan privasi Mangrove.reviews", + "saved": " Ulasan disimpan. Terima kasih sudah berbagi! ", + "saving_review": "Menyimpan…", + "posting_as": "Posting sebagai", + "no_rating": "Tidak ada peringkat yang diberikan", + "write_a_comment": "Beri ulasan…", + "title_singular": "Satu ulasan", + "title": "{count} ulasan", + "plz_login": "Masuk untuk meninggalkan ulasan" + }, + "index": { + "pickTheme": "Pilih tema di bawah ini untuk memulai.", + "intro": "MapComplete adalah penampil dan editor OpenStreetMap, yang menunjukkan informasi tentang tema tertentu.", + "title": "Selamat datang di MapComplete" + }, + "split": { + "cancel": "Batal" + }, + "delete": { + "cancel": "Batal" + } } diff --git a/langs/it.json b/langs/it.json index dee1190af0..19d0394ed9 100644 --- a/langs/it.json +++ b/langs/it.json @@ -1,288 +1,288 @@ { - "reviews": { - "attribution": "Le recensioni sono fornite da Mangrove Reviews e sono disponibili con licenza CC-BY 4.0.", - "tos": "Quando pubblichi una recensione, accetti i termini di utilizzo e la informativa sulla privacy di Mangrove.reviews", - "plz_login": "Accedi per lasciare una recensione", - "saved": "Recensione salvata. Grazie per averla condivisa!", - "saving_review": "Salvataggio…", - "affiliated_reviewer_warning": "(Recensione di un affiliato)", - "i_am_affiliated": "Sono associato con questo oggetto
    Spunta se sei il proprietario, creatore, dipendente, etc.", - "posting_as": "Pubblica come", - "no_rating": "Nessun voto ricevuto", - "write_a_comment": "Lascia una recensione…", - "no_reviews_yet": "Non ci sono ancora recensioni. Sii il primo a scriverne una aiutando così i dati liberi e l’attività!", - "name_required": "È richiesto un nome per poter mostrare e creare recensioni", - "title_singular": "Una recensione", - "title": "{count} recensioni" + "reviews": { + "attribution": "Le recensioni sono fornite da Mangrove Reviews e sono disponibili con licenza CC-BY 4.0.", + "tos": "Quando pubblichi una recensione, accetti i termini di utilizzo e la informativa sulla privacy di Mangrove.reviews", + "plz_login": "Accedi per lasciare una recensione", + "saved": "Recensione salvata. Grazie per averla condivisa!", + "saving_review": "Salvataggio…", + "affiliated_reviewer_warning": "(Recensione di un affiliato)", + "i_am_affiliated": "Sono associato con questo oggetto
    Spunta se sei il proprietario, creatore, dipendente, etc.", + "posting_as": "Pubblica come", + "no_rating": "Nessun voto ricevuto", + "write_a_comment": "Lascia una recensione…", + "no_reviews_yet": "Non ci sono ancora recensioni. Sii il primo a scriverne una aiutando così i dati liberi e l’attività!", + "name_required": "È richiesto un nome per poter mostrare e creare recensioni", + "title_singular": "Una recensione", + "title": "{count} recensioni" + }, + "general": { + "aboutMapcomplete": "

    Informazioni su MapComplete

    Con MapComplete puoi arricchire OpenStreetMap con informazioni su un singolo argomento. Rispondi a poche domande e in pochi minuti i tuoi contributi saranno disponibili a tutto il mondo! L’utente gestore del tema definisce gli elementi, le domande e le lingue per quel tema.

    Scopri altro

    MapComplete propone sempre un passo in più per imparare qualcosa di nuovo su OpenStreetMap.

    • Quando viene incorporato in un sito web, il collegamento dell’iframe punta a MapComplete a tutto schermo
    • La versione a tutto schermo fornisce informazioni su OpenStreetMap
    • La visualizzazione non necessita di alcun accesso ma per modificare occorre aver effettuato l’accesso su OSM.
    • Se non hai effettuato l’accesso, ti verrà richiesto di farlo
    • Dopo aver risposto ad una sola domanda potrai aggiungere dei nuovi punti alla mappa
    • Dopo qualche momento verranno mostrate le etichette effettive, in seguito i collegamenti alla wiki


    Hai trovato un errore? Vuoi richiedere nuove funzionalità? Vuoi aiutare con la traduzione? Dai un’occhiata al codice sorgente oppure al tracker degli errori.

    Vuoi vedere i tuoi progressi?Segui il contatore delle modifiche su OsmCha.

    ", + "morescreen": { + "requestATheme": "Se hai bisogno di una mappa tematica personalizzata, puoi chiederla nel tracker degli errori", + "createYourOwnTheme": "Crea il tuo tema di MapComplete personalizzato da zero", + "streetcomplete": "Un’altra simile applicazione è StreetComplete.", + "intro": "

    Altre mappe tematiche?

    Ti diverti a raccogliere dati geografici?
    Sono disponibili altri temi.", + "previouslyHiddenTitle": "Temi nascosti precedentemente visitati", + "hiddenExplanation": "Questi temi sono solo accessibili se si dispone del collegamento. Hai scoperto {hidden_discovered} su {total_hidden} temi nascosti." }, - "general": { - "aboutMapcomplete": "

    Informazioni su MapComplete

    Con MapComplete puoi arricchire OpenStreetMap con informazioni su un singolo argomento. Rispondi a poche domande e in pochi minuti i tuoi contributi saranno disponibili a tutto il mondo! L’utente gestore del tema definisce gli elementi, le domande e le lingue per quel tema.

    Scopri altro

    MapComplete propone sempre un passo in più per imparare qualcosa di nuovo su OpenStreetMap.

    • Quando viene incorporato in un sito web, il collegamento dell’iframe punta a MapComplete a tutto schermo
    • La versione a tutto schermo fornisce informazioni su OpenStreetMap
    • La visualizzazione non necessita di alcun accesso ma per modificare occorre aver effettuato l’accesso su OSM.
    • Se non hai effettuato l’accesso, ti verrà richiesto di farlo
    • Dopo aver risposto ad una sola domanda potrai aggiungere dei nuovi punti alla mappa
    • Dopo qualche momento verranno mostrate le etichette effettive, in seguito i collegamenti alla wiki


    Hai trovato un errore? Vuoi richiedere nuove funzionalità? Vuoi aiutare con la traduzione? Dai un’occhiata al codice sorgente oppure al tracker degli errori.

    Vuoi vedere i tuoi progressi?Segui il contatore delle modifiche su OsmCha.

    ", - "morescreen": { - "requestATheme": "Se hai bisogno di una mappa tematica personalizzata, puoi chiederla nel tracker degli errori", - "createYourOwnTheme": "Crea il tuo tema di MapComplete personalizzato da zero", - "streetcomplete": "Un’altra simile applicazione è StreetComplete.", - "intro": "

    Altre mappe tematiche?

    Ti diverti a raccogliere dati geografici?
    Sono disponibili altri temi.", - "previouslyHiddenTitle": "Temi nascosti precedentemente visitati", - "hiddenExplanation": "Questi temi sono solo accessibili se si dispone del collegamento. Hai scoperto {hidden_discovered} su {total_hidden} temi nascosti." - }, - "sharescreen": { - "embedIntro": "

    Incorpora nel tuo sito web

    Siamo lieti se vorrai includere questa cartina nel tuo sito web.
    Ti incoraggiamo a farlo (non devi neanche chieder il permesso).
    È gratuito e lo sarà per sempre. Più persone lo useranno e più valore acquisirà.", - "addToHomeScreen": "

    Aggiungi alla tua schermata Home

    Puoi aggiungere facilmente questo sito web alla schermata Home del tuo smartphone. Per farlo, clicca sul pulsante ‘Aggiungi a schermata Home’ nella barra degli indirizzi.", - "fsIncludeCurrentLocation": "Includi la posizione attuale", - "fsIncludeCurrentBackgroundMap": "Includi lo sfondo attualmente selezionato {name}", - "fsIncludeCurrentLayers": "Includi i livelli correntemente selezionati", - "fsGeolocation": "Abilita il pusante ‘geo-localizzami’ (solo da mobile)", - "fsAddNew": "Abilita il pulsante ‘aggiungi nuovo PDI’", - "fsLayerControlToggle": "Inizia con il pannello dei livelli aperto", - "fsLayers": "Abilita il controllo dei livelli", - "fsWelcomeMessage": "Mostra il messaggio di benvenuto e le schede associate", - "fsSearch": "Abilita la barra di ricerca", - "fsUserbadge": "Abilita il pulsante di accesso", - "editThemeDescription": "Aggiungi o modifica le domande a questo tema della mappa", - "editThisTheme": "Modifica questo tema", - "thanksForSharing": "Grazie per la condivisione!", - "copiedToClipboard": "Collegamento copiato negli appunti", - "intro": "

    Condividi questa mappa

    Condividi questa mappa copiando il collegamento qua sotto e inviandolo ad amici o parenti:" - }, - "attribution": { - "attributionContent": "

    Tutti i dati sono forniti da OpenStreetMap, riutilizzabili liberamente con Open Database License

    ", - "attributionTitle": "Crediti", - "codeContributionsBy": "MapComplete è stato realizzato da {contributors} e {hiddenCount} altri collaboratori", - "mapContributionsByAndHidden": "I dati attualmente visibili sono stati modificati da {contributors} e {hiddenCount} altri contributori", - "mapContributionsBy": "I dati attualmente visibili sono stati creati da {contributors}", - "iconAttribution": { - "title": "Icone utilizzate" - }, - "themeBy": "Tema manutenuto da {author}" - }, - "openStreetMapIntro": "

    Una mappa libera

    Non sarebbe perfetto se esistesse una carta geografica che chiunque può modificare e utilizzare liberamente? Un unico posto in un cui conservare tutte le informazioni geografiche? In questo modo tutti questi siti web con mappe diverse, piccole e incompatibili (che sono sempre obsolete) diverrebbero istantaneamente inutili.

    OpenStreetMap è proprio questa mappa. I dati geografici possono essere usati liberamente (rispettando l’attribuzione e la pubblicazione delle modifiche di quei dati). In più, chiunque può aggiungere liberamente nuovi dati e correggere gli errori. Anche questo sito usa OpenStreetMap. Tutti i dati provengono da lì e le tue risposte e correzioni finiscono sempre lì.

    Moltissime persone e applicazioni già usano OpenStreetmap: Maps.me, OsmAnd ma anche le cartine di Facebook, Instagram, Apple e Bing si basano (parzialmente) su OpenStreetMap. Tutto quello che cambi qua si rifletterà anche su quelle applicazioni (non appena avranno aggiornato i loro dati!)

    ", - "opening_hours": { - "ph_open": "aperto", - "ph_closed": "chiuso", - "ph_not_known": " ", - "open_24_7": "Sempre aperto", - "closed_permanently": "Chiuso per un periodo sconosciuto", - "closed_until": "Chiuso fino al {date}", - "not_all_rules_parsed": "Gli orari di apertura di questo negozio sono complicati. Le seguenti regole sono state ignorate per l’oggetto in ingresso:", - "openTill": "fino a", - "opensAt": "da", - "open_during_ph": "Durante le festività questo luogo è", - "error_loading": "Errore: impossibile visualizzare questi orari di apertura.", - "ph_open_as_usual": "aperto come di consueto", - "loadingCountry": "Determinazione del Paese…" - }, - "weekdays": { - "sunday": "Domenica", - "saturday": "Sabato", - "friday": "Venerdì", - "thursday": "Giovedì", - "wednesday": "Mercoledì", - "tuesday": "Martedì", - "monday": "Lunedì", - "abbreviations": { - "sunday": "Dom", - "saturday": "Sab", - "friday": "Ven", - "thursday": "Gio", - "wednesday": "Mer", - "tuesday": "Mar", - "monday": "Lun" - } - }, - "layerSelection": { - "title": "Seleziona livelli", - "zoomInToSeeThisLayer": "Ingrandisci la mappa per vedere questo livello" - }, - "backgroundMap": "Mappa di sfondo", - "customThemeIntro": "

    Temi personalizzati

    Questi sono i temi degli utenti che hai già visitato.", - "noTagsSelected": "Nessuna etichetta selezionata", - "getStartedNewAccount": " oppure crea un nuovo account", - "getStartedLogin": "Accedi con OpenStreetMap per iniziare", - "goToInbox": "Apri posta in arrivo", - "fewChangesBefore": "Rispondi ad alcune domande di punti esistenti prima di aggiungere un nuovo punto.", - "readYourMessages": "Leggi tutti i tuoi messaggi OpenStreetMap prima di aggiungere un nuovo punto.", - "questions": { - "emailIs": "L’indirizzo email di questa {category} è {email}", - "emailOf": "Qual è l’indirizzo email di {category}?", - "websiteIs": "Sito web: {website}", - "websiteOf": "Qual è il sito web di {category}?", - "phoneNumberIs": "Il numero di telefono di questa {category} è {phone}", - "phoneNumberOf": "Qual è il numero di telefono di {category}?" - }, - "noNameCategory": "{category} senza nome", - "nameInlineQuestion": "Il nome di questa {category} è $$$", - "about": "Modifica e aggiungi con semplicità OpenStreetMap per un certo tema", - "pickLanguage": "Scegli una lingua: ", - "add": { - "layerNotEnabled": "Il livello {layer} non è abilitato. Abilita questo livello per aggiungere un punto", - "openLayerControl": "Apri il pannello di controllo dei livelli", - "confirmButton": "Aggiungi una {category} qua.
    La tua aggiunta è visibile a chiunque
    ", - "confirmIntro": "

    Aggiungere un {title} qua?

    Il punto che hai creato qua sarà visibile da chiunque. Per favore, aggiungi sulla mappa solo oggetti realmente esistenti. Molte applicazioni usano questi dati.", - "stillLoading": "Caricamento dei dati ancora in corso. Attendi un po’ prima di aggiungere un nuovo punto.", - "zoomInFurther": "Ingrandisci la mappa per aggiungere un punto.", - "pleaseLogin": "Accedi per aggiungere un punto", - "intro": "Hai cliccato in un punto dove non ci sono ancora dei dati.
    ", - "title": "Aggiungi un nuovo punto?", - "addNew": "Aggiungi una nuova {category} qua", - "presetInfo": "Il nuovo PDI avrà {tags}", - "warnVisibleForEveryone": "La tua aggiunta sarà visibile a tutti", - "zoomInMore": "Ingrandisci ancora per importare questo oggetto", - "hasBeenImported": "Questo punto è stato già importato", - "disableFilters": "Disabilita tutti i filtri", - "addNewMapLabel": "Aggiungi nuovo elemento", - "disableFiltersExplanation": "Alcuni oggetti potrebbero essere nascosti da un filtro" - }, - "osmLinkTooltip": "Visita questo oggetto su OpenStreetMap per la cronologia o altre opzioni di modifica", - "number": "numero", - "skippedQuestions": "Alcune domande sono state scartate", - "oneSkippedQuestion": "Una domanda è stata scartata", - "skip": "Salta questa domanda", - "cancel": "Annulla", - "save": "Salva", - "returnToTheMap": "Ritorna alla mappa", - "search": { - "error": "Qualcosa è andato storto…", - "nothing": "Non è stato trovato nulla…", - "searching": "Ricerca…", - "search": "Cerca un luogo" - }, - "loginToStart": "Accedi per rispondere alla domanda", - "welcomeBack": "Hai effettuato l’accesso. Bentornato/a!", - "loginWithOpenStreetMap": "Accedi con OpenStreetMap", - "loading": "Caricamento…", - "download": { - "downloadAsPdf": "Scarica un PDF della mappa corrente", - "downloadCSV": "Scarica i dati visibili come CSV", - "noDataLoaded": "Nessun dato è stato ancora caricato. Lo scaricamento sarà disponibile a breve", - "downloadGeojson": "Scarica i dati visibili come GeoJSON", - "downloadAsPdfHelper": "Ideale per stampare la mappa corrente", - "downloadGeoJsonHelper": "Compatibile con QGIS, ArcGIS, ESRI, etc.", - "title": "Scarica i dati visibili", - "downloadCSVHelper": "Compatibile con LibreOffice Calc, Excel, etc.", - "includeMetaData": "Includi metadati (ultimo utente, valori calcolati, etc.)", - "licenseInfo": "

    Informativa sul copyright

    I dati forniti sono disponibili con licenza ODbL. Il riutilizzo di tali dati è libero per qualsiasi scopo ma
    • è richiesta l’attribuzione © OpenStreetMap contributors
    • qualsiasi modifica di questi data deve essere rilasciata con la stessa licenza
    Per ulteriori dettagli si prega di leggere l’informativa completa sul copyright", - "exporting": "Esportazione in corso…" - }, - "testing": "Prova (le modifiche non verranno salvate)", - "pdf": { - "versionInfo": "v{version} - generato il {date}", - "attr": "Dati della mappa © OpenStreetMap Contributors, riutilizzabile con licenza ODbL", - "generatedWith": "Generato con MapComplete.osm.be", - "attrBackground": "Livello di sfondo: {background}" - }, - "openTheMap": "Apri la mappa", - "histogram": { - "error_loading": "Impossibile caricare l'istogramma" - }, - "wikipedia": { - "loading": "Caricamento Wikipedia…", - "noResults": "Nessun elemento trovato per {search}", - "doSearch": "Cerca qui sopra per vedere i risultati", - "noWikipediaPage": "Questo elemento Wikidata non ha ancora una pagina Wikipedia corrispondente.", - "searchWikidata": "Cerca su Wikidata", - "createNewWikidata": "Crea un nuovo elemento Wikidata", - "wikipediaboxTitle": "Wikipedia", - "failed": "Caricamento della voce Wikipedia fallito" - }, - "loginOnlyNeededToEdit": "se vuoi modificare la mappa" + "sharescreen": { + "embedIntro": "

    Incorpora nel tuo sito web

    Siamo lieti se vorrai includere questa cartina nel tuo sito web.
    Ti incoraggiamo a farlo (non devi neanche chieder il permesso).
    È gratuito e lo sarà per sempre. Più persone lo useranno e più valore acquisirà.", + "addToHomeScreen": "

    Aggiungi alla tua schermata Home

    Puoi aggiungere facilmente questo sito web alla schermata Home del tuo smartphone. Per farlo, clicca sul pulsante ‘Aggiungi a schermata Home’ nella barra degli indirizzi.", + "fsIncludeCurrentLocation": "Includi la posizione attuale", + "fsIncludeCurrentBackgroundMap": "Includi lo sfondo attualmente selezionato {name}", + "fsIncludeCurrentLayers": "Includi i livelli correntemente selezionati", + "fsGeolocation": "Abilita il pusante ‘geo-localizzami’ (solo da mobile)", + "fsAddNew": "Abilita il pulsante ‘aggiungi nuovo PDI’", + "fsLayerControlToggle": "Inizia con il pannello dei livelli aperto", + "fsLayers": "Abilita il controllo dei livelli", + "fsWelcomeMessage": "Mostra il messaggio di benvenuto e le schede associate", + "fsSearch": "Abilita la barra di ricerca", + "fsUserbadge": "Abilita il pulsante di accesso", + "editThemeDescription": "Aggiungi o modifica le domande a questo tema della mappa", + "editThisTheme": "Modifica questo tema", + "thanksForSharing": "Grazie per la condivisione!", + "copiedToClipboard": "Collegamento copiato negli appunti", + "intro": "

    Condividi questa mappa

    Condividi questa mappa copiando il collegamento qua sotto e inviandolo ad amici o parenti:" }, - "index": { - "#": "Questi testi sono mostrati sopra ai pulsanti del tema quando nessun tema è stato caricato", - "pickTheme": "Scegli un tema qui sotto per iniziare.", - "intro": "MapComplete è un visualizzatore/editore di OpenStreetMap che mostra le informazioni riguardanti gli oggetti di uno specifico tema e permette di aggiornarle.", - "title": "Benvenuto/a su MapComplete", - "featuredThemeTitle": "Questa settimana in vetrina" + "attribution": { + "attributionContent": "

    Tutti i dati sono forniti da OpenStreetMap, riutilizzabili liberamente con Open Database License

    ", + "attributionTitle": "Crediti", + "codeContributionsBy": "MapComplete è stato realizzato da {contributors} e {hiddenCount} altri collaboratori", + "mapContributionsByAndHidden": "I dati attualmente visibili sono stati modificati da {contributors} e {hiddenCount} altri contributori", + "mapContributionsBy": "I dati attualmente visibili sono stati creati da {contributors}", + "iconAttribution": { + "title": "Icone utilizzate" + }, + "themeBy": "Tema manutenuto da {author}" }, - "favourite": { - "reload": "Ricarica i dati", - "loginNeeded": "

    Accedi

    Il layout personale è disponibile soltanto per gli utenti OpenStreetMap", - "panelIntro": "

    Il tuo tema personale

    Attiva i tuoi livelli preferiti fra tutti i temi ufficiali" + "openStreetMapIntro": "

    Una mappa libera

    Non sarebbe perfetto se esistesse una carta geografica che chiunque può modificare e utilizzare liberamente? Un unico posto in un cui conservare tutte le informazioni geografiche? In questo modo tutti questi siti web con mappe diverse, piccole e incompatibili (che sono sempre obsolete) diverrebbero istantaneamente inutili.

    OpenStreetMap è proprio questa mappa. I dati geografici possono essere usati liberamente (rispettando l’attribuzione e la pubblicazione delle modifiche di quei dati). In più, chiunque può aggiungere liberamente nuovi dati e correggere gli errori. Anche questo sito usa OpenStreetMap. Tutti i dati provengono da lì e le tue risposte e correzioni finiscono sempre lì.

    Moltissime persone e applicazioni già usano OpenStreetmap: Maps.me, OsmAnd ma anche le cartine di Facebook, Instagram, Apple e Bing si basano (parzialmente) su OpenStreetMap. Tutto quello che cambi qua si rifletterà anche su quelle applicazioni (non appena avranno aggiornato i loro dati!)

    ", + "opening_hours": { + "ph_open": "aperto", + "ph_closed": "chiuso", + "ph_not_known": " ", + "open_24_7": "Sempre aperto", + "closed_permanently": "Chiuso per un periodo sconosciuto", + "closed_until": "Chiuso fino al {date}", + "not_all_rules_parsed": "Gli orari di apertura di questo negozio sono complicati. Le seguenti regole sono state ignorate per l’oggetto in ingresso:", + "openTill": "fino a", + "opensAt": "da", + "open_during_ph": "Durante le festività questo luogo è", + "error_loading": "Errore: impossibile visualizzare questi orari di apertura.", + "ph_open_as_usual": "aperto come di consueto", + "loadingCountry": "Determinazione del Paese…" }, - "centerMessage": { - "retrying": "Caricamento dei dati fallito. Nuovo tentativo tra {count} secondi…", - "ready": "Finito!", - "zoomIn": "Ingrandisci la mappa per vedere e modificare i dati", - "loadingData": "Caricamento dei dati…" + "weekdays": { + "sunday": "Domenica", + "saturday": "Sabato", + "friday": "Venerdì", + "thursday": "Giovedì", + "wednesday": "Mercoledì", + "tuesday": "Martedì", + "monday": "Lunedì", + "abbreviations": { + "sunday": "Dom", + "saturday": "Sab", + "friday": "Ven", + "thursday": "Gio", + "wednesday": "Mer", + "tuesday": "Mar", + "monday": "Lun" + } }, - "image": { - "isDeleted": "Cancellata", - "doDelete": "Rimuovi immagine", - "dontDelete": "Annulla", - "uploadDone": "La tua foto è stata aggiunta. Grazie per l’aiuto!", - "respectPrivacy": "Non fotografare persone o targhe dei veicoli. Non caricare da Google Maps, Google Streetview o da altre fonti coperte da copyright.", - "uploadFailed": "Impossibile caricare la tua foto. La connessione internet è attiva e le API di terze parti sono abilitate? Il browser Brave o il plugin uMatrix potrebbero bloccarle.", - "ccb": "con licenza CC-BY", - "ccbs": "con licenza CC-BY-SA", - "cco": "nel pubblico dominio", - "willBePublished": "La tua foto sarà pubblicata: ", - "pleaseLogin": "Accedi per caricare una foto", - "uploadingMultiple": "Caricamento di {count} foto…", - "uploadingPicture": "Caricamento della tua foto…", - "addPicture": "Aggiungi foto", - "uploadMultipleDone": "Sono state aggiunte {count} immagini. Grazie per l’aiuto!", - "toBig": "La tua immagine è troppo grande in quanto è di {actual_size}. Cerca di usare immagini non più grandi di {max_size}" + "layerSelection": { + "title": "Seleziona livelli", + "zoomInToSeeThisLayer": "Ingrandisci la mappa per vedere questo livello" }, - "delete": { - "reasons": { - "test": "Si tratta di un punto di prova (l’oggetto non è mai esistito in quel punto)", - "disused": "L’oggetto è in disuso o è stato smantellato", - "notFound": "Non è stato possibile trovare l’oggetto", - "duplicate": "Questo punto è un duplicato di un altro oggetto" - }, - "explanations": { - "selectReason": "Si prega di selezionare il motivo della rimozione di questo oggetto", - "hardDelete": "Questo punto verrà rimosso da OpenStreetMap. Un utente esperto potrebbe recuperarlo", - "softDelete": "Questo oggetto verrà aggiornato e nascosto da questa applicazione. {reason}" - }, - "loginToDelete": "Devi aver effettuato l’accesso per poter rimuovere un punto", - "safeDelete": "Questo punto può essere rimosso in sicurezza.", - "isntAPoint": "Solo i punti possono essere rimossi, l’oggetto selezionato è un percorso, un’area oppure una relazione.", - "onlyEditedByLoggedInUser": "Questo punto è stato modificato soltanto da te, puoi rimuoverlo in sicurezza.", - "notEnoughExperience": "Questo nodo è stato creato da un altro utente.", - "delete": "Rimuovi", - "isDeleted": "Questo oggetto è stato rimosso", - "cannotBeDeleted": "Questo oggetto non può essere rimosso", - "useSomethingElse": "Per rimuoverlo usa un altro editor OpenStreetMap", - "loading": "Controllo delle proprietà per verificare se questo oggetto può essere rimosso.", - "partOfOthers": "Questo punto fa parte di qualche percorso o relazione e non può essere rimosso direttamente.", - "whyDelete": "Perché questo nodo andrebbe rimosso?", - "cancel": "Annulla", - "readMessages": "Hai dei messaggi non letti. Leggili prima di rimuovere un punto (qualcuno potrebbe aver lasciato un commento)" + "backgroundMap": "Mappa di sfondo", + "customThemeIntro": "

    Temi personalizzati

    Questi sono i temi degli utenti che hai già visitato.", + "noTagsSelected": "Nessuna etichetta selezionata", + "getStartedNewAccount": " oppure crea un nuovo account", + "getStartedLogin": "Accedi con OpenStreetMap per iniziare", + "goToInbox": "Apri posta in arrivo", + "fewChangesBefore": "Rispondi ad alcune domande di punti esistenti prima di aggiungere un nuovo punto.", + "readYourMessages": "Leggi tutti i tuoi messaggi OpenStreetMap prima di aggiungere un nuovo punto.", + "questions": { + "emailIs": "L’indirizzo email di questa {category} è {email}", + "emailOf": "Qual è l’indirizzo email di {category}?", + "websiteIs": "Sito web: {website}", + "websiteOf": "Qual è il sito web di {category}?", + "phoneNumberIs": "Il numero di telefono di questa {category} è {phone}", + "phoneNumberOf": "Qual è il numero di telefono di {category}?" }, - "move": { - "loginToMove": "Devi aver effettuato l’accesso per spostare un punto", - "partOfAWay": "Quest’oggetto fa parte di un altro percorso. Usa un altro editor per spostarlo.", - "partOfRelation": "Quest’oggetto fa parte di una relazione. Usa un altro editor per spostarlo.", - "isWay": "Quest’oggetto è un percorso. Usa un altro editor OpenStreetMap per spostarlo.", - "isRelation": "Quest’oggetto è una relazione e non può essere spostato", - "cancel": "Annulla lo spostamento", - "pointIsMoved": "Questo punto è stato spostato", - "zoomInFurther": "Ingrandisci ulteriormente per confermare questo spostamento", - "moveTitle": "Sposta questo punto", - "whyMove": "Perché vuoi spostare questo punto?", - "confirmMove": "Spostalo qua", - "inviteToMove": { - "reasonInaccurate": "Migliora la precisione di questo punto", - "generic": "Sposta questo punto", - "reasonRelocation": "Sposta quest’oggetto in un altro luogo perché è stato ricollocato" - }, - "selectReason": "Perché vuoi spostare quest’oggetto?", - "reasons": { - "reasonInaccurate": "La posizione di questo oggetto non è precisa e dovrebbe essere spostato di alcuni metri", - "reasonRelocation": "Questo oggetto è stato ricollocato in una posizione totalmente differente" - }, - "inviteToMoveAgain": "Sposta di nuovo questo punto", - "cannotBeMoved": "Questo oggetto non può essere spostato." + "noNameCategory": "{category} senza nome", + "nameInlineQuestion": "Il nome di questa {category} è $$$", + "about": "Modifica e aggiungi con semplicità OpenStreetMap per un certo tema", + "pickLanguage": "Scegli una lingua: ", + "add": { + "layerNotEnabled": "Il livello {layer} non è abilitato. Abilita questo livello per aggiungere un punto", + "openLayerControl": "Apri il pannello di controllo dei livelli", + "confirmButton": "Aggiungi una {category} qua.
    La tua aggiunta è visibile a chiunque
    ", + "confirmIntro": "

    Aggiungere un {title} qua?

    Il punto che hai creato qua sarà visibile da chiunque. Per favore, aggiungi sulla mappa solo oggetti realmente esistenti. Molte applicazioni usano questi dati.", + "stillLoading": "Caricamento dei dati ancora in corso. Attendi un po’ prima di aggiungere un nuovo punto.", + "zoomInFurther": "Ingrandisci la mappa per aggiungere un punto.", + "pleaseLogin": "Accedi per aggiungere un punto", + "intro": "Hai cliccato in un punto dove non ci sono ancora dei dati.
    ", + "title": "Aggiungi un nuovo punto?", + "addNew": "Aggiungi una nuova {category} qua", + "presetInfo": "Il nuovo PDI avrà {tags}", + "warnVisibleForEveryone": "La tua aggiunta sarà visibile a tutti", + "zoomInMore": "Ingrandisci ancora per importare questo oggetto", + "hasBeenImported": "Questo punto è stato già importato", + "disableFilters": "Disabilita tutti i filtri", + "addNewMapLabel": "Aggiungi nuovo elemento", + "disableFiltersExplanation": "Alcuni oggetti potrebbero essere nascosti da un filtro" }, - "multi_apply": { - "autoApply": "Quando si modificano gli attributi {attr_names}, questi attributi vengono anche automaticamente cambiati su altri {count} oggetti" + "osmLinkTooltip": "Visita questo oggetto su OpenStreetMap per la cronologia o altre opzioni di modifica", + "number": "numero", + "skippedQuestions": "Alcune domande sono state scartate", + "oneSkippedQuestion": "Una domanda è stata scartata", + "skip": "Salta questa domanda", + "cancel": "Annulla", + "save": "Salva", + "returnToTheMap": "Ritorna alla mappa", + "search": { + "error": "Qualcosa è andato storto…", + "nothing": "Non è stato trovato nulla…", + "searching": "Ricerca…", + "search": "Cerca un luogo" }, - "split": { - "hasBeenSplit": "Questa strada è stata divisa", - "cancel": "Annulla", - "splitTitle": "Scegli sulla cartina il punto dove vuoi dividere la strada", - "inviteToSplit": "Dividi questa strada in segmenti più piccoli. Ciò permette di assegnare proprietà differenti a ciascun pezzo di strada.", - "split": "Dividi", - "loginToSplit": "Devi aver effettuato l’accesso per dividere una strada" - } + "loginToStart": "Accedi per rispondere alla domanda", + "welcomeBack": "Hai effettuato l’accesso. Bentornato/a!", + "loginWithOpenStreetMap": "Accedi con OpenStreetMap", + "loading": "Caricamento…", + "download": { + "downloadAsPdf": "Scarica un PDF della mappa corrente", + "downloadCSV": "Scarica i dati visibili come CSV", + "noDataLoaded": "Nessun dato è stato ancora caricato. Lo scaricamento sarà disponibile a breve", + "downloadGeojson": "Scarica i dati visibili come GeoJSON", + "downloadAsPdfHelper": "Ideale per stampare la mappa corrente", + "downloadGeoJsonHelper": "Compatibile con QGIS, ArcGIS, ESRI, etc.", + "title": "Scarica i dati visibili", + "downloadCSVHelper": "Compatibile con LibreOffice Calc, Excel, etc.", + "includeMetaData": "Includi metadati (ultimo utente, valori calcolati, etc.)", + "licenseInfo": "

    Informativa sul copyright

    I dati forniti sono disponibili con licenza ODbL. Il riutilizzo di tali dati è libero per qualsiasi scopo ma
    • è richiesta l’attribuzione © OpenStreetMap contributors
    • qualsiasi modifica di questi data deve essere rilasciata con la stessa licenza
    Per ulteriori dettagli si prega di leggere l’informativa completa sul copyright", + "exporting": "Esportazione in corso…" + }, + "testing": "Prova (le modifiche non verranno salvate)", + "pdf": { + "versionInfo": "v{version} - generato il {date}", + "attr": "Dati della mappa © OpenStreetMap Contributors, riutilizzabile con licenza ODbL", + "generatedWith": "Generato con MapComplete.osm.be", + "attrBackground": "Livello di sfondo: {background}" + }, + "openTheMap": "Apri la mappa", + "histogram": { + "error_loading": "Impossibile caricare l'istogramma" + }, + "wikipedia": { + "loading": "Caricamento Wikipedia…", + "noResults": "Nessun elemento trovato per {search}", + "doSearch": "Cerca qui sopra per vedere i risultati", + "noWikipediaPage": "Questo elemento Wikidata non ha ancora una pagina Wikipedia corrispondente.", + "searchWikidata": "Cerca su Wikidata", + "createNewWikidata": "Crea un nuovo elemento Wikidata", + "wikipediaboxTitle": "Wikipedia", + "failed": "Caricamento della voce Wikipedia fallito" + }, + "loginOnlyNeededToEdit": "se vuoi modificare la mappa" + }, + "index": { + "#": "Questi testi sono mostrati sopra ai pulsanti del tema quando nessun tema è stato caricato", + "pickTheme": "Scegli un tema qui sotto per iniziare.", + "intro": "MapComplete è un visualizzatore/editore di OpenStreetMap che mostra le informazioni riguardanti gli oggetti di uno specifico tema e permette di aggiornarle.", + "title": "Benvenuto/a su MapComplete", + "featuredThemeTitle": "Questa settimana in vetrina" + }, + "favourite": { + "reload": "Ricarica i dati", + "loginNeeded": "

    Accedi

    Il layout personale è disponibile soltanto per gli utenti OpenStreetMap", + "panelIntro": "

    Il tuo tema personale

    Attiva i tuoi livelli preferiti fra tutti i temi ufficiali" + }, + "centerMessage": { + "retrying": "Caricamento dei dati fallito. Nuovo tentativo tra {count} secondi…", + "ready": "Finito!", + "zoomIn": "Ingrandisci la mappa per vedere e modificare i dati", + "loadingData": "Caricamento dei dati…" + }, + "image": { + "isDeleted": "Cancellata", + "doDelete": "Rimuovi immagine", + "dontDelete": "Annulla", + "uploadDone": "La tua foto è stata aggiunta. Grazie per l’aiuto!", + "respectPrivacy": "Non fotografare persone o targhe dei veicoli. Non caricare da Google Maps, Google Streetview o da altre fonti coperte da copyright.", + "uploadFailed": "Impossibile caricare la tua foto. La connessione internet è attiva e le API di terze parti sono abilitate? Il browser Brave o il plugin uMatrix potrebbero bloccarle.", + "ccb": "con licenza CC-BY", + "ccbs": "con licenza CC-BY-SA", + "cco": "nel pubblico dominio", + "willBePublished": "La tua foto sarà pubblicata: ", + "pleaseLogin": "Accedi per caricare una foto", + "uploadingMultiple": "Caricamento di {count} foto…", + "uploadingPicture": "Caricamento della tua foto…", + "addPicture": "Aggiungi foto", + "uploadMultipleDone": "Sono state aggiunte {count} immagini. Grazie per l’aiuto!", + "toBig": "La tua immagine è troppo grande in quanto è di {actual_size}. Cerca di usare immagini non più grandi di {max_size}" + }, + "delete": { + "reasons": { + "test": "Si tratta di un punto di prova (l’oggetto non è mai esistito in quel punto)", + "disused": "L’oggetto è in disuso o è stato smantellato", + "notFound": "Non è stato possibile trovare l’oggetto", + "duplicate": "Questo punto è un duplicato di un altro oggetto" + }, + "explanations": { + "selectReason": "Si prega di selezionare il motivo della rimozione di questo oggetto", + "hardDelete": "Questo punto verrà rimosso da OpenStreetMap. Un utente esperto potrebbe recuperarlo", + "softDelete": "Questo oggetto verrà aggiornato e nascosto da questa applicazione. {reason}" + }, + "loginToDelete": "Devi aver effettuato l’accesso per poter rimuovere un punto", + "safeDelete": "Questo punto può essere rimosso in sicurezza.", + "isntAPoint": "Solo i punti possono essere rimossi, l’oggetto selezionato è un percorso, un’area oppure una relazione.", + "onlyEditedByLoggedInUser": "Questo punto è stato modificato soltanto da te, puoi rimuoverlo in sicurezza.", + "notEnoughExperience": "Questo nodo è stato creato da un altro utente.", + "delete": "Rimuovi", + "isDeleted": "Questo oggetto è stato rimosso", + "cannotBeDeleted": "Questo oggetto non può essere rimosso", + "useSomethingElse": "Per rimuoverlo usa un altro editor OpenStreetMap", + "loading": "Controllo delle proprietà per verificare se questo oggetto può essere rimosso.", + "partOfOthers": "Questo punto fa parte di qualche percorso o relazione e non può essere rimosso direttamente.", + "whyDelete": "Perché questo nodo andrebbe rimosso?", + "cancel": "Annulla", + "readMessages": "Hai dei messaggi non letti. Leggili prima di rimuovere un punto (qualcuno potrebbe aver lasciato un commento)" + }, + "move": { + "loginToMove": "Devi aver effettuato l’accesso per spostare un punto", + "partOfAWay": "Quest’oggetto fa parte di un altro percorso. Usa un altro editor per spostarlo.", + "partOfRelation": "Quest’oggetto fa parte di una relazione. Usa un altro editor per spostarlo.", + "isWay": "Quest’oggetto è un percorso. Usa un altro editor OpenStreetMap per spostarlo.", + "isRelation": "Quest’oggetto è una relazione e non può essere spostato", + "cancel": "Annulla lo spostamento", + "pointIsMoved": "Questo punto è stato spostato", + "zoomInFurther": "Ingrandisci ulteriormente per confermare questo spostamento", + "moveTitle": "Sposta questo punto", + "whyMove": "Perché vuoi spostare questo punto?", + "confirmMove": "Spostalo qua", + "inviteToMove": { + "reasonInaccurate": "Migliora la precisione di questo punto", + "generic": "Sposta questo punto", + "reasonRelocation": "Sposta quest’oggetto in un altro luogo perché è stato ricollocato" + }, + "selectReason": "Perché vuoi spostare quest’oggetto?", + "reasons": { + "reasonInaccurate": "La posizione di questo oggetto non è precisa e dovrebbe essere spostato di alcuni metri", + "reasonRelocation": "Questo oggetto è stato ricollocato in una posizione totalmente differente" + }, + "inviteToMoveAgain": "Sposta di nuovo questo punto", + "cannotBeMoved": "Questo oggetto non può essere spostato." + }, + "multi_apply": { + "autoApply": "Quando si modificano gli attributi {attr_names}, questi attributi vengono anche automaticamente cambiati su altri {count} oggetti" + }, + "split": { + "hasBeenSplit": "Questa strada è stata divisa", + "cancel": "Annulla", + "splitTitle": "Scegli sulla cartina il punto dove vuoi dividere la strada", + "inviteToSplit": "Dividi questa strada in segmenti più piccoli. Ciò permette di assegnare proprietà differenti a ciascun pezzo di strada.", + "split": "Dividi", + "loginToSplit": "Devi aver effettuato l’accesso per dividere una strada" + } } diff --git a/langs/layers/ca.json b/langs/layers/ca.json index aefba46283..b5dc2b0cb4 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -1,103 +1,103 @@ { - "defibrillator": { - "name": "Desfibril·ladors", - "presets": { - "0": { - "title": "Desfibril·lador" - } + "defibrillator": { + "name": "Desfibril·ladors", + "presets": { + "0": { + "title": "Desfibril·lador" + } + }, + "tagRenderings": { + "defibrillator-access": { + "mappings": { + "0": { + "then": "Accés lliure" + }, + "1": { + "then": "Publicament accessible" + }, + "2": { + "then": "Només accessible a clients" + }, + "3": { + "then": "No accessible al públic en general (ex. només accesible a treballadors, propietaris, ...)" + } }, - "tagRenderings": { - "defibrillator-access": { - "mappings": { - "0": { - "then": "Accés lliure" - }, - "1": { - "then": "Publicament accessible" - }, - "2": { - "then": "Només accessible a clients" - }, - "3": { - "then": "No accessible al públic en general (ex. només accesible a treballadors, propietaris, ...)" - } - }, - "question": "Està el desfibril·lador accessible lliurement?", - "render": "L'accés és {access}" - }, - "defibrillator-defibrillator:location": { - "question": "Dóna detalls d'on es pot trobar el desfibril·lador" - }, - "defibrillator-defibrillator:location:en": { - "question": "Dóna detalls d'on es pot trobar el desfibril·lador" - }, - "defibrillator-defibrillator:location:fr": { - "question": "Dóna detalls d'on es pot trobar el desfibril·lador" - }, - "defibrillator-indoors": { - "mappings": { - "0": { - "then": "Aquest desfibril·lador està a l'interior" - }, - "1": { - "then": "Aquest desfibril·lador està a l'exterior" - } - }, - "question": "Està el desfibril·lador a l'interior?" - }, - "defibrillator-level": { - "question": "A quina planta està el desfibril·lador localitzat?", - "render": "Aquest desfibril·lador és a la planta {level}" - } + "question": "Està el desfibril·lador accessible lliurement?", + "render": "L'accés és {access}" + }, + "defibrillator-defibrillator:location": { + "question": "Dóna detalls d'on es pot trobar el desfibril·lador" + }, + "defibrillator-defibrillator:location:en": { + "question": "Dóna detalls d'on es pot trobar el desfibril·lador" + }, + "defibrillator-defibrillator:location:fr": { + "question": "Dóna detalls d'on es pot trobar el desfibril·lador" + }, + "defibrillator-indoors": { + "mappings": { + "0": { + "then": "Aquest desfibril·lador està a l'interior" + }, + "1": { + "then": "Aquest desfibril·lador està a l'exterior" + } }, - "title": { - "render": "Desfibril·lador" - } + "question": "Està el desfibril·lador a l'interior?" + }, + "defibrillator-level": { + "question": "A quina planta està el desfibril·lador localitzat?", + "render": "Aquest desfibril·lador és a la planta {level}" + } }, - "ghost_bike": { - "tagRenderings": { - "ghost_bike-inscription": { - "render": "{inscription}" - } - } - }, - "nature_reserve": { - "tagRenderings": { - "Email": { - "render": "{email}" - }, - "phone": { - "render": "{phone}" - } - } - }, - "playground": { - "tagRenderings": { - "playground-email": { - "render": "{email}" - }, - "playground-phone": { - "render": "{phone}" - } - } - }, - "shops": { - "tagRenderings": { - "shops-phone": { - "render": "{phone}" - }, - "shops-website": { - "render": "{website}" - } - } - }, - "tree_node": { - "title": { - "mappings": { - "0": { - "then": "{name}" - } - } - } + "title": { + "render": "Desfibril·lador" } + }, + "ghost_bike": { + "tagRenderings": { + "ghost_bike-inscription": { + "render": "{inscription}" + } + } + }, + "nature_reserve": { + "tagRenderings": { + "Email": { + "render": "{email}" + }, + "phone": { + "render": "{phone}" + } + } + }, + "playground": { + "tagRenderings": { + "playground-email": { + "render": "{email}" + }, + "playground-phone": { + "render": "{phone}" + } + } + }, + "shops": { + "tagRenderings": { + "shops-phone": { + "render": "{phone}" + }, + "shops-website": { + "render": "{website}" + } + } + }, + "tree_node": { + "title": { + "mappings": { + "0": { + "then": "{name}" + } + } + } + } } \ No newline at end of file diff --git a/langs/layers/de.json b/langs/layers/de.json index d4bea545f9..1359693b3f 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -1,2867 +1,2876 @@ { - "artwork": { - "description": "Verschiedene Kunstwerke", - "name": "Kunstwerke", - "presets": { - "0": { - "title": "Kunstwerk" - } + "artwork": { + "description": "Verschiedene Kunstwerke", + "name": "Kunstwerke", + "presets": { + "0": { + "title": "Kunstwerk" + } + }, + "tagRenderings": { + "artwork-artist_name": { + "question": "Welcher Künstler hat das geschaffen?", + "render": "Erstellt von {artist_name}" + }, + "artwork-artwork_type": { + "mappings": { + "0": { + "then": "Architektur" + }, + "1": { + "then": "Wandbild" + }, + "2": { + "then": "Malerei" + }, + "3": { + "then": "Skulptur" + }, + "4": { + "then": "Statue" + }, + "5": { + "then": "Büste" + }, + "6": { + "then": "Stein" + }, + "7": { + "then": "Installation" + }, + "8": { + "then": "Graffiti" + }, + "9": { + "then": "Relief" + }, + "10": { + "then": "Azulejo (spanische dekorative Fliesenarbeit)" + }, + "11": { + "then": "Fliesenarbeit" + } }, - "tagRenderings": { - "artwork-artist_name": { - "question": "Welcher Künstler hat das geschaffen?", - "render": "Erstellt von {artist_name}" - }, - "artwork-artwork_type": { - "mappings": { - "0": { - "then": "Architektur" - }, - "1": { - "then": "Wandbild" - }, - "2": { - "then": "Malerei" - }, - "3": { - "then": "Skulptur" - }, - "4": { - "then": "Statue" - }, - "5": { - "then": "Büste" - }, - "6": { - "then": "Stein" - }, - "7": { - "then": "Installation" - }, - "8": { - "then": "Graffiti" - }, - "9": { - "then": "Relief" - }, - "10": { - "then": "Azulejo (spanische dekorative Fliesenarbeit)" - }, - "11": { - "then": "Fliesenarbeit" - } - }, - "question": "Was ist die Art dieses Kunstwerks?", - "render": "Dies ist ein {artwork_type}" - }, - "artwork-website": { - "question": "Gibt es eine Website mit weiteren Informationen über dieses Kunstwerk?", - "render": "Weitere Informationen auf dieser Webseite" - }, - "artwork-wikidata": { - "question": "Welcher Wikidata-Eintrag entspricht diesem Kunstwerk?", - "render": "Entspricht {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Kunstwerk {name}" - } - }, - "render": "Kunstwerk" + "question": "Was ist die Art dieses Kunstwerks?", + "render": "Dies ist ein {artwork_type}" + }, + "artwork-website": { + "question": "Gibt es eine Website mit weiteren Informationen über dieses Kunstwerk?", + "render": "Weitere Informationen auf dieser Webseite" + }, + "artwork-wikidata": { + "question": "Welcher Wikidata-Eintrag entspricht diesem Kunstwerk?", + "render": "Entspricht {wikidata}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Kunstwerk {name}" } - }, - "barrier": { - "description": "Hindernisse beim Fahrradfahren, wie zum Beispiel Poller und Fahrrad Barrieren", - "name": "Hindernisse", - "presets": { - "0": { - "description": "Ein Poller auf der Straße", - "title": "Poller" - }, - "1": { - "description": "Fahrradhindernis, das Radfahrer abbremst", - "title": "Fahrradhindernis" - } - }, - "tagRenderings": { - "Bollard type": { - "mappings": { - "0": { - "then": "Entfernbarer Poller" - }, - "1": { - "then": "Feststehender Poller" - }, - "2": { - "then": "Umlegbarer Poller" - }, - "3": { - "then": "Flexibler Poller, meist aus Kunststoff" - }, - "4": { - "then": "Ausfahrender Poller" - } - }, - "question": "Um was für einen Poller handelt es sich?" - }, - "Cycle barrier type": { - "mappings": { - "0": { - "then": "Einfach, nur zwei Barrieren mit einem Zwischenraum " - }, - "1": { - "then": "Doppelt, zwei Barrieren hintereinander " - }, - "2": { - "then": "Dreifach, drei Barrieren hintereinander " - }, - "3": { - "then": "Eine Durchfahrtsbeschränkung, Durchfahrtsbreite ist oben kleiner als unten " - } - }, - "question": "Um welche Art Fahrradhindernis handelt es sich?" - }, - "MaxWidth": { - "question": "Welche Durchfahrtsbreite hat das Hindernis?", - "render": "Maximale Durchfahrtsbreite: {maxwidth:physical} m" - }, - "Overlap (cyclebarrier)": { - "question": "Wie stark überschneiden sich die Barrieren?", - "render": "Überschneidung: {overlap} m" - }, - "Space between barrier (cyclebarrier)": { - "question": "Wie groß ist der Abstand zwischen den Barrieren (entlang der Straße)?", - "render": "Abstand zwischen den Barrieren (entlang der Straße): {width:separation} m" - }, - "Width of opening (cyclebarrier)": { - "question": "Wie breit ist die kleinste Öffnung neben den Barrieren?", - "render": "Breite der Öffnung: {width:opening} m" - }, - "bicycle=yes/no": { - "mappings": { - "0": { - "then": "Ein Radfahrer kann hindurchfahren." - }, - "1": { - "then": "Ein Radfahrer kann nicht hindurchfahren." - } - }, - "question": "Kann ein Radfahrer das Hindernis passieren?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Poller" - }, - "1": { - "then": "Barriere für Radfahrer" - } - }, - "render": "Hindernis" - } - }, - "bench": { - "name": "Sitzbänke", - "presets": { - "0": { - "title": "sitzbank" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Rückenlehne: Ja" - }, - "1": { - "then": "Rückenlehne: Nein" - } - }, - "question": "Hat diese Bank eine Rückenlehne?", - "render": "Rückenlehne" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "Farbe: braun" - }, - "1": { - "then": "Farbe: grün" - }, - "2": { - "then": "Farbe: grau" - }, - "3": { - "then": "Farbe: weiß" - }, - "4": { - "then": "Farbe: rot" - }, - "5": { - "then": "Farbe: schwarz" - }, - "6": { - "then": "Farbe: blau" - }, - "7": { - "then": "Farbe: gelb" - } - }, - "question": "Welche Farbe hat diese Sitzbank?", - "render": "Farbe: {colour}" - }, - "bench-direction": { - "question": "In welche Richtung schaut man, wenn man auf der Bank sitzt?", - "render": "Wenn man auf der Bank sitzt, schaut man in Richtung {direction}°." - }, - "bench-material": { - "mappings": { - "0": { - "then": "Material: Holz" - }, - "1": { - "then": "Material: Metall" - }, - "2": { - "then": "Material: Stein" - }, - "3": { - "then": "Material: Beton" - }, - "4": { - "then": "Material: Kunststoff" - }, - "5": { - "then": "Material: Stahl" - } - }, - "question": "Aus welchem Material besteht die Sitzbank (Sitzfläche)?", - "render": "Material: {material}" - }, - "bench-seats": { - "question": "Wie viele Sitzplätze hat diese Bank?", - "render": "{seats} Sitzplätze" - }, - "bench-survey:date": { - "question": "Wann wurde diese Bank zuletzt überprüft?", - "render": "Diese Bank wurde zuletzt überprüft am {survey:date}" - } - }, - "title": { - "render": "Sitzbank" - } - }, - "bench_at_pt": { - "name": "Sitzbänke bei Haltestellen", - "tagRenderings": { - "bench_at_pt-bench": { - "render": "Stehbank" - }, - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Sitzbank bei Haltestelle" - }, - "1": { - "then": "Sitzbank in Unterstand" - } - }, - "render": "Sitzbank" - } - }, - "bicycle_library": { - "description": "Eine Einrichtung, in der Fahrräder für längere Zeit geliehen werden können", - "name": "Fahrradbibliothek", - "presets": { - "0": { - "description": "Eine Fahrradbibliothek verfügt über eine Sammlung von Fahrrädern, die ausgeliehen werden können", - "title": "Fahrradbibliothek" - } - }, - "tagRenderings": { - "bicycle-library-target-group": { - "mappings": { - "0": { - "then": "Fahrräder für Kinder verfügbar" - }, - "1": { - "then": "Fahrräder für Erwachsene verfügbar" - }, - "2": { - "then": "Fahrräder für Behinderte verfügbar" - } - }, - "question": "Wer kann hier Fahrräder ausleihen?" - }, - "bicycle_library-charge": { - "mappings": { - "0": { - "then": "Das Ausleihen eines Fahrrads ist kostenlos" - }, - "1": { - "then": "Das Ausleihen eines Fahrrads kostet 20€ pro Jahr und 20€ Gebühr" - } - }, - "question": "Wie viel kostet das Ausleihen eines Fahrrads?", - "render": "Das Ausleihen eines Fahrrads kostet {charge}" - }, - "bicycle_library-name": { - "question": "Wie lautet der Name dieser Fahrradbibliothek?", - "render": "Diese Fahrradbibliothek heißt {name}" - } - }, - "title": { - "render": "Fahrradbibliothek" - } - }, - "bicycle_tube_vending_machine": { - "name": "Fahrradschlauch-Automat", - "presets": { - "0": { - "title": "Fahrradschlauch-Automat" - } - }, - "tagRenderings": { - "Still in use?": { - "mappings": { - "0": { - "then": "Dieser Automat funktioniert" - }, - "1": { - "then": "Dieser Automat ist kaputt" - }, - "2": { - "then": "Dieser Automat ist geschlossen" - } - }, - "question": "Ist dieser Automat noch in Betrieb?", - "render": "Der Betriebszustand ist {operational_status" - } - }, - "title": { - "render": "Fahrradschlauch-Automat" - } - }, - "bike_cafe": { - "name": "Fahrrad-Café", - "presets": { - "0": { - "title": "Fahrrad-Café" - } - }, - "tagRenderings": { - "bike_cafe-bike-pump": { - "mappings": { - "0": { - "then": "Dieses Fahrrad-Café bietet eine Fahrradpumpe an, die von jedem benutzt werden kann" - }, - "1": { - "then": "Dieses Fahrrad-Café bietet keine Fahrradpumpe an, die von jedem benutzt werden kann" - } - }, - "question": "Bietet dieses Fahrrad-Café eine Fahrradpumpe an, die von jedem benutzt werden kann?" - }, - "bike_cafe-email": { - "question": "Wie lautet die E-Mail-Adresse von {name}?" - }, - "bike_cafe-name": { - "question": "Wie heißt dieses Fahrrad-Café?", - "render": "Dieses Fahrrad-Café heißt {name}" - }, - "bike_cafe-opening_hours": { - "question": "Wann ist dieses Fahrradcafé geöffnet?" - }, - "bike_cafe-phone": { - "question": "Wie lautet die Telefonnummer von {name}?" - }, - "bike_cafe-repair-service": { - "mappings": { - "0": { - "then": "Dieses Fahrrad-Café repariert Fahrräder" - }, - "1": { - "then": "Dieses Fahrrad-Café repariert keine Fahrräder" - } - }, - "question": "Repariert dieses Fahrrad-Café Fahrräder?" - }, - "bike_cafe-repair-tools": { - "mappings": { - "0": { - "then": "Dieses Fahrrad-Café bietet Werkzeuge für die selbständige Reparatur an" - }, - "1": { - "then": "Dieses Fahrrad-Café bietet keine Werkzeuge für die selbständige Reparatur an" - } - }, - "question": "Gibt es hier Werkzeuge, um das eigene Fahrrad zu reparieren?" - }, - "bike_cafe-website": { - "question": "Was ist die Webseite von {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Fahrrad-Café {name}" - } - }, - "render": "Fahrrad-Café" - } - }, - "bike_cleaning": { - "name": "Fahrrad-Reinigungsdienst", - "presets": { - "0": { - "title": "Fahrrad-Reinigungsdienst" - } - }, - "title": { - "mappings": { - "0": { - "then": "Fahrrad-Reinigungsdienst{name}" - } - }, - "render": "Fahrrad-Reinigungsdienst" - } - }, - "bike_parking": { - "name": "Fahrrad-Parkplätze", - "presets": { - "0": { - "title": "Fahrrad-Parkplätze" - } - }, - "tagRenderings": { - "Access": { - "mappings": { - "0": { - "then": "Öffentlich zugänglich" - }, - "1": { - "then": "Der Zugang ist in erster Linie für Besucher eines Unternehmens bestimmt" - }, - "2": { - "then": "Der Zugang ist beschränkt auf Mitglieder einer Schule, eines Unternehmens oder einer Organisation" - } - }, - "question": "Wer kann diesen Fahrradparplatz nutzen?", - "render": "{access}" - }, - "Bicycle parking type": { - "mappings": { - "0": { - "then": "Fahrradbügel " - }, - "1": { - "then": "Metallgestänge " - }, - "2": { - "then": "Halter für Fahrradlenker " - }, - "3": { - "then": "Gestell " - }, - "4": { - "then": "Zweistufig " - }, - "5": { - "then": "Schuppen " - }, - "6": { - "then": "Poller " - }, - "7": { - "then": "Ein Bereich auf dem Boden, der für das Abstellen von Fahrrädern gekennzeichnet ist" - } - }, - "question": "Was ist die Art dieses Fahrrad-Parkplatzes?", - "render": "Dies ist ein Fahrrad-Parkplatz der Art: {bicycle_parking}" - }, - "Capacity": { - "question": "Wie viele Fahrräder passen auf diesen Fahrrad-Parkplatz (einschließlich möglicher Lastenfahrräder)?", - "render": "Platz für {capacity} Fahrräder" - }, - "Cargo bike capacity?": { - "question": "Wie viele Lastenfahrräder passen auf diesen Fahrrad-Parkplatz?", - "render": "Auf diesen Parkplatz passen {capacity:cargo_bike} Lastenfahrräder" - }, - "Cargo bike spaces?": { - "mappings": { - "0": { - "then": "Dieser Parkplatz bietet Platz für Lastenfahrräder" - }, - "1": { - "then": "Dieser Parkplatz verfügt über ausgewiesene (offizielle) Plätze für Lastenfahrräder." - }, - "2": { - "then": "Es ist nicht erlaubt, Lastenfahrräder zu parken" - } - }, - "question": "Gibt es auf diesem Fahrrad-Parkplatz Plätze für Lastenfahrräder?" - }, - "Is covered?": { - "mappings": { - "0": { - "then": "Dieser Parkplatz ist überdacht (er hat ein Dach)" - }, - "1": { - "then": "Dieser Parkplatz ist nicht überdacht" - } - }, - "question": "Ist dieser Parkplatz überdacht? Wählen Sie auch \"überdacht\" für Innenparkplätze." - }, - "Underground?": { - "mappings": { - "0": { - "then": "Tiefgarage" - }, - "1": { - "then": "Tiefgarage" - }, - "2": { - "then": "Ebenerdiges Parken" - }, - "3": { - "then": "Ebenerdiges Parken" - }, - "4": { - "then": "Parkplatz auf dem Dach" - } - }, - "question": "Wo befinden sich diese Fahrradabstellplätze?" - } - }, - "title": { - "render": "Fahrrad-Parkplätze" - } - }, - "bike_repair_station": { - "name": "Fahrradstationen (Reparatur, Pumpe oder beides)", - "presets": { - "0": { - "description": "Ein Gerät zum Aufpumpen von Reifen an einem festen Standort im öffentlichen Raum.

    Beispiele für Fahrradpumpen

    ", - "title": "Fahrradpumpe" - }, - "1": { - "description": "Ein Gerät mit Werkzeugen zur Reparatur von Fahrrädern kombiniert mit einer Pumpe an einem festen Standort. Die Werkzeuge sind oft mit Ketten gegen Diebstahl gesichert.

    Beispiel

    ", - "title": "Fahrrad-Reparaturstation und Pumpe" - }, - "2": { - "title": "Fahrrad-Reparaturstation ohne Pumpe" - } - }, - "tagRenderings": { - "Email maintainer": { - "render": "Melde diese Fahrradpumpe als kaputt" - }, - "Operational status": { - "mappings": { - "0": { - "then": "Die Fahrradpumpe ist kaputt" - }, - "1": { - "then": "Die Fahrradpumpe ist betriebsbereit" - } - }, - "question": "Ist die Fahrradpumpe noch funktionstüchtig?" - }, - "bike_repair_station-available-services": { - "mappings": { - "0": { - "then": "Es ist nur eine Pumpe vorhanden" - }, - "1": { - "then": "Es sind nur Werkzeuge (Schraubenzieher, Zangen...) vorhanden" - }, - "2": { - "then": "Es sind sowohl Werkzeuge als auch eine Pumpe vorhanden" - } - }, - "question": "Welche Einrichtungen stehen an dieser Fahrradstation zur Verfügung?" - }, - "bike_repair_station-bike-chain-tool": { - "mappings": { - "0": { - "then": "Es gibt ein Kettenwerkzeug" - }, - "1": { - "then": "Es gibt kein Kettenwerkzeug" - } - }, - "question": "Verfügt diese Fahrrad-Reparaturstation über Spezialwerkzeug zur Reparatur von Fahrradketten?" - }, - "bike_repair_station-bike-stand": { - "mappings": { - "0": { - "then": "Es gibt einen Haken oder Ständer" - }, - "1": { - "then": "Es gibt keinen Haken oder Ständer" - } - }, - "question": "Hat diese Fahrradstation einen Haken, an dem Sie Ihr Fahrrad aufhängen können, oder einen Ständer, um es anzuheben?" - }, - "bike_repair_station-electrical_pump": { - "mappings": { - "0": { - "then": "Manuelle Pumpe" - }, - "1": { - "then": "Elektrische Pumpe" - } - }, - "question": "Ist dies eine elektrische Fahrradpumpe?" - }, - "bike_repair_station-email": { - "question": "Wie lautet die E-Mail-Adresse des Betreuers?" - }, - "bike_repair_station-manometer": { - "mappings": { - "0": { - "then": "Es gibt ein Manometer" - }, - "1": { - "then": "Es gibt kein Manometer" - }, - "2": { - "then": "Es gibt ein Manometer, aber es ist kaputt" - } - }, - "question": "Verfügt die Pumpe über einen Druckanzeiger oder ein Manometer?" - }, - "bike_repair_station-opening_hours": { - "mappings": { - "0": { - "then": "Immer geöffnet" - }, - "1": { - "then": "Immer geöffnet" - } - }, - "question": "Wann ist diese Fahrradreparaturstelle geöffnet?" - }, - "bike_repair_station-operator": { - "question": "Wer wartet diese Fahrradpumpe?", - "render": "Gewartet von {operator}" - }, - "bike_repair_station-phone": { - "question": "Wie lautet die Telefonnummer des Betreibers?" - }, - "bike_repair_station-valves": { - "mappings": { - "0": { - "then": "Sklaverand (auch bekannt als Presta)" - }, - "1": { - "then": "Dunlop" - }, - "2": { - "then": "Schrader (Autos)" - } - }, - "question": "Welche Ventile werden unterstützt?", - "render": "Diese Pumpe unterstützt die folgenden Ventile: {valves}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Fahrrad-Reparaturstation" - }, - "1": { - "then": "Fahrrad-Reparaturstation" - }, - "2": { - "then": "Kaputte Pumpe" - }, - "3": { - "then": "Fahrradpumpe {name}" - }, - "4": { - "then": "Fahrradpumpe" - } - }, - "render": "Fahrradstation (Pumpe & Reparatur)" - } - }, - "bike_shop": { - "description": "Ein Geschäft, das speziell Fahrräder oder verwandte Artikel verkauft", - "name": "Fahrradwerkstatt/geschäft", - "presets": { - "0": { - "title": "Fahrradwerkstatt/geschäft" - } - }, - "tagRenderings": { - "bike_repair_bike-pump-service": { - "mappings": { - "0": { - "then": "Dieses Geschäft bietet eine Fahrradpumpe für alle an" - }, - "1": { - "then": "Dieses Geschäft bietet für niemanden eine Fahrradpumpe an" - }, - "2": { - "then": "Es gibt eine Fahrradpumpe, sie wird als separater Punkt angezeigt " - } - }, - "question": "Bietet dieses Geschäft eine Fahrradpumpe zur Benutzung für alle an?" - }, - "bike_repair_bike-wash": { - "mappings": { - "0": { - "then": "Dieses Geschäft reinigt Fahrräder" - }, - "1": { - "then": "Dieser Laden hat eine Anlage, in der man Fahrräder selbst reinigen kann" - }, - "2": { - "then": "Dieser Laden bietet keine Fahrradreinigung an" - } - }, - "question": "Werden hier Fahrräder gewaschen?" - }, - "bike_repair_rents-bikes": { - "mappings": { - "0": { - "then": "Dieses Geschäft vermietet Fahrräder" - }, - "1": { - "then": "Dieses Geschäft vermietet keine Fahrräder" - } - }, - "question": "Vermietet dieser Laden Fahrräder?" - }, - "bike_repair_repairs-bikes": { - "mappings": { - "0": { - "then": "Dieses Geschäft repariert Fahrräder" - }, - "1": { - "then": "Dieses Geschäft repariert keine Fahrräder" - }, - "2": { - "then": "Dieses Geschäft repariert nur hier gekaufte Fahrräder" - }, - "3": { - "then": "Dieses Geschäft repariert nur Fahrräder einer bestimmten Marke" - } - }, - "question": "Repariert dieses Geschäft Fahrräder?" - }, - "bike_repair_second-hand-bikes": { - "mappings": { - "0": { - "then": "Dieses Geschäft verkauft gebrauchte Fahrräder" - }, - "1": { - "then": "Dieses Geschäft verkauft keine gebrauchten Fahrräder" - }, - "2": { - "then": "Dieses Geschäft verkauft nur gebrauchte Fahrräder" - } - }, - "question": "Verkauft dieses Geschäft gebrauchte Fahrräder?" - }, - "bike_repair_sells-bikes": { - "mappings": { - "0": { - "then": "Dieses Geschäft verkauft Fahrräder" - }, - "1": { - "then": "Dieses Geschäft verkauft keine Fahrräder" - } - }, - "question": "Verkauft dieser Laden Fahrräder?" - }, - "bike_repair_tools-service": { - "mappings": { - "0": { - "then": "Dieses Geschäft bietet Werkzeuge für die Heimwerkerreparatur an" - }, - "1": { - "then": "Dieses Geschäft bietet keine Werkzeuge für Heimwerkerreparaturen an" - }, - "2": { - "then": "Werkzeuge für die Selbstreparatur sind nur verfügbar, wenn Sie das Fahrrad im Laden gekauft/gemietet haben" - } - }, - "question": "Gibt es hier Werkzeuge, um das eigene Fahrrad zu reparieren?" - }, - "bike_shop-email": { - "question": "Wie lautet die E-Mail-Adresse von {name}?" - }, - "bike_shop-is-bicycle_shop": { - "render": "Dieses Geschäft ist auf den Verkauf von {shop} spezialisiert und im Bereich Fahrrad tätig" - }, - "bike_shop-name": { - "question": "Wie heißt dieser Fahrradladen?", - "render": "Dieses Fahrradgeschäft heißt {name}" - }, - "bike_shop-phone": { - "question": "Wie lautet die Telefonnummer von {name}?" - }, - "bike_shop-website": { - "question": "Was ist die Webseite von {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Sportartikelgeschäft {name}" - }, - "2": { - "then": "Fahrradverleih{name}" - }, - "3": { - "then": "Fahrradwerkstatt {name}" - }, - "4": { - "then": "Fahrradgeschäft {name}" - }, - "5": { - "then": "Fahrradwerkstatt/geschäft {name}" - } - }, - "render": "Fahrradwerkstatt/geschäft" - } - }, - "bike_themed_object": { - "name": "Mit Fahrrad zusammenhängendes Objekt", - "title": { - "mappings": { - "1": { - "then": "Radweg" - } - }, - "render": "Mit Fahrrad zusammenhängendes Objekt" - } - }, - "binocular": { - "description": "Fernglas", - "name": "Ferngläser", - "presets": { - "0": { - "description": "Ein fest installiertes Teleskop oder Fernglas, für die öffentliche Nutzung. ", - "title": "Ferngläser" - } - }, - "tagRenderings": { - "binocular-charge": { - "mappings": { - "0": { - "then": "Kostenlose Nutzung" - } - }, - "question": "Wie viel muss man für die Nutzung dieser Ferngläser bezahlen?", - "render": "Die Benutzung dieses Fernglases kostet {charge}" - }, - "binocular-direction": { - "question": "In welche Richtung blickt man, wenn man durch dieses Fernglas schaut?", - "render": "Blick in Richtung {direction}°" - } - }, - "title": { - "render": "Ferngläser" - } - }, - "birdhide": { - "filter": { - "0": { - "options": { - "0": { - "question": "Zugänglich für Rollstuhlfahrer" - } - } - } - } - }, - "cafe_pub": { - "filter": { - "0": { - "options": { - "0": { - "question": "Jetzt geöffnet" - } - } - } - }, - "name": "Cafés und Kneipen", - "presets": { - "0": { - "title": "Kneipe" - }, - "1": { - "title": "Bar" - }, - "2": { - "title": "Café" - } - }, - "tagRenderings": { - "Classification": { - "question": "Was ist das für ein Café" - }, - "Name": { - "question": "Wie heißt diese Kneipe?", - "render": "Diese Kneipe heißt {name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - } - } - }, - "crossings": { - "description": "Übergänge für Fußgänger und Radfahrer", - "name": "Kreuzungen", - "presets": { - "0": { - "description": "Kreuzung für Fußgänger und/oder Radfahrer", - "title": "Kreuzung" - }, - "1": { - "description": "Ampel an einer Straße", - "title": "Ampel" - } - }, - "tagRenderings": { - "crossing-bicycle-allowed": { - "mappings": { - "0": { - "then": "Radfahrer können diese Kreuzung nutzen" - }, - "1": { - "then": "Radfahrer können diese Kreuzung nicht nutzen" - } - }, - "question": "Können Radfahrer diese Kreuzung nutzen?" - }, - "crossing-button": { - "mappings": { - "0": { - "then": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern" - }, - "1": { - "then": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern" - } - }, - "question": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?" - }, - "crossing-continue-through-red": { - "mappings": { - "0": { - "then": "Ein Radfahrer kann bei roter Ampel geradeaus fahren " - }, - "1": { - "then": "Ein Radfahrer kann bei roter Ampel geradeaus fahren" - }, - "2": { - "then": "Ein Radfahrer kann bei roter Ampel nicht geradeaus fahren" - } - }, - "question": "Kann ein Radfahrer bei roter Ampel geradeaus fahren?" - }, - "crossing-has-island": { - "mappings": { - "0": { - "then": "Der Übergang hat eine Verkehrsinsel" - }, - "1": { - "then": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern" - } - }, - "question": "Gibt es an diesem Übergang eine Verkehrsinsel?" - }, - "crossing-is-zebra": { - "mappings": { - "0": { - "then": "Dies ist ein Zebrastreifen" - }, - "1": { - "then": "Dies ist kein Zebrastreifen" - } - }, - "question": "Ist das ein Zebrastreifen?" - }, - "crossing-right-turn-through-red": { - "mappings": { - "0": { - "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen " - }, - "1": { - "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen" - }, - "2": { - "then": "Ein Radfahrer kann bei roter Ampel nicht rechts abbiegen" - } - }, - "question": "Kann ein Radfahrer bei roter Ampel rechts abbiegen?" - }, - "crossing-tactile": { - "mappings": { - "0": { - "then": "An dieser Kreuzung gibt es ein Blindenleitsystem" - }, - "1": { - "then": "Diese Kreuzung hat kein Blindenleitsystem" - }, - "2": { - "then": "Diese Kreuzung hat taktile Pflasterung, ist aber nicht korrekt" - } - }, - "question": "Gibt es an dieser Kreuzung ein Blindenleitsystem?" - }, - "crossing-type": { - "mappings": { - "0": { - "then": "Kreuzungen ohne Ampeln" - }, - "1": { - "then": "Kreuzungen mit Ampeln" - }, - "2": { - "then": "Zebrastreifen" - } - }, - "question": "Was ist das für eine Kreuzung?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Ampel" - }, - "1": { - "then": "Kreuzung mit Ampeln" - } - }, - "render": "Kreuzung" - } - }, - "cycleways_and_roads": { - "name": "Radwege und Straßen", - "tagRenderings": { - "Cycleway type for a road": { - "mappings": { - "0": { - "then": "Es gibt eine geteilte Fahrspur" - }, - "1": { - "then": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)" - }, - "2": { - "then": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist." - }, - "3": { - "then": "Hier ist ein getrennter Radweg vorhanden" - }, - "4": { - "then": "Es gibt keinen Radweg" - }, - "5": { - "then": "Es gibt keinen Radweg" - } - }, - "question": "Was für ein Radweg ist hier?" - }, - "Cycleway:smoothness": { - "mappings": { - "0": { - "then": "Geeignet für dünne Rollen: Rollerblades, Skateboard" - }, - "1": { - "then": "Geeignet für dünne Reifen: Rennrad" - }, - "2": { - "then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter" - }, - "3": { - "then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha" - }, - "4": { - "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen" - }, - "5": { - "then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen" - }, - "6": { - "then": "Geeignet für Geländefahrzeuge: Traktor, ATV" - }, - "7": { - "then": "Unpassierbar / Keine bereiften Fahrzeuge" - } - }, - "question": "Wie eben ist dieser Radweg?" - }, - "Cycleway:surface": { - "mappings": { - "0": { - "then": "Dieser Radweg hat keinen festen Belag" - }, - "1": { - "then": "Dieser Radweg hat einen festen Belag" - }, - "2": { - "then": "Der Radweg ist aus Asphalt" - }, - "3": { - "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen" - }, - "4": { - "then": "Der Radweg ist aus Beton" - }, - "5": { - "then": "Dieser Radweg besteht aus Kopfsteinpflaster" - }, - "6": { - "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster" - }, - "7": { - "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster" - }, - "8": { - "then": "Der Radweg ist aus Holz" - }, - "9": { - "then": "Der Radweg ist aus Schotter" - }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" - } - }, - "question": "Was ist der Belag dieses Radwegs?", - "render": "Der Radweg ist aus {cycleway:surface}" - }, - "Is this a cyclestreet? (For a road)": { - "mappings": { - "0": { - "then": "Dies ist eine Fahrradstraße in einer 30km/h Zone." - }, - "1": { - "then": "Dies ist eine Fahrradstraße" - }, - "2": { - "then": "Dies ist keine Fahrradstraße." - } - }, - "question": "Ist das eine Fahrradstraße?" - }, - "Maxspeed (for road)": { - "mappings": { - "0": { - "then": "Die Höchstgeschwindigkeit ist 20 km/h" - }, - "1": { - "then": "Die Höchstgeschwindigkeit ist 30 km/h" - }, - "2": { - "then": "Die Höchstgeschwindigkeit ist 50 km/h" - }, - "3": { - "then": "Die Höchstgeschwindigkeit ist 70 km/h" - }, - "4": { - "then": "Die Höchstgeschwindigkeit ist 90 km/h" - } - }, - "question": "Was ist die Höchstgeschwindigkeit auf dieser Straße?", - "render": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h" - }, - "Surface of the road": { - "mappings": { - "0": { - "then": "Dieser Radweg ist nicht befestigt" - }, - "1": { - "then": "Dieser Radweg hat einen festen Belag" - }, - "2": { - "then": "Der Radweg ist aus Asphalt" - }, - "3": { - "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen" - }, - "4": { - "then": "Der Radweg ist aus Beton" - }, - "5": { - "then": "Dieser Radweg besteht aus Kopfsteinpflaster" - }, - "6": { - "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster" - }, - "7": { - "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster" - }, - "8": { - "then": "Der Radweg ist aus Holz" - }, - "9": { - "then": "Der Radweg ist aus Schotter" - }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" - } - }, - "question": "Was ist der Belag dieser Straße?", - "render": "Der Radweg ist aus {surface}" - }, - "Surface of the street": { - "mappings": { - "0": { - "then": "Geeignet für dünne Rollen: Rollerblades, Skateboard" - }, - "1": { - "then": "Geeignet für dünne Reifen: Rennrad" - }, - "2": { - "then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter" - }, - "3": { - "then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha" - }, - "4": { - "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen" - }, - "5": { - "then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen" - }, - "6": { - "then": "Geeignet für spezielle Geländewagen: Traktor, ATV" - }, - "7": { - "then": "Unpassierbar / Keine bereiften Fahrzeuge" - } - }, - "question": "Wie eben ist diese Straße?" - }, - "cyclelan-segregation": { - "mappings": { - "0": { - "then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie" - }, - "1": { - "then": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie" - }, - "2": { - "then": "Der Radweg ist abgegrenzt durch eine Parkspur" - }, - "3": { - "then": "Dieser Radweg ist getrennt durch einen Bordstein" - } - }, - "question": "Wie ist der Radweg von der Straße abgegrenzt?" - }, - "cycleway-lane-track-traffic-signs": { - "mappings": { - "0": { - "then": "Vorgeschriebener Radweg " - }, - "1": { - "then": "Vorgeschriebener Radweg (mit Zusatzschild)
    " - }, - "2": { - "then": "Getrennter Fuß-/Radweg " - }, - "3": { - "then": "Gemeinsamer Fuß-/Radweg " - }, - "4": { - "then": "Kein Verkehrsschild vorhanden" - } - }, - "question": "Welches Verkehrszeichen hat dieser Radweg?" - }, - "cycleway-segregation": { - "mappings": { - "0": { - "then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie" - }, - "1": { - "then": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie" - }, - "2": { - "then": "Der Radweg ist abgegrenzt durch eine Parkspur" - }, - "3": { - "then": "Dieser Radweg ist getrennt durch einen Bordstein" - } - }, - "question": "Wie ist der Radweg von der Straße abgegrenzt?" - }, - "cycleway-traffic-signs": { - "mappings": { - "0": { - "then": "Vorgeschriebener Radweg " - }, - "1": { - "then": "Vorgeschriebener Radweg (mit Zusatzschild)
    " - }, - "2": { - "then": "Getrennter Fuß-/Radweg " - }, - "3": { - "then": "Gemeinsamer Fuß-/Radweg " - }, - "4": { - "then": "Kein Verkehrsschild vorhanden" - } - }, - "question": "Welches Verkehrszeichen hat dieser Radweg?" - }, - "cycleway-traffic-signs-D7-supplementary": { - "mappings": { - "1": { - "then": "" - }, - "6": { - "then": "Kein zusätzliches Verkehrszeichen vorhanden" - } - }, - "question": "Hat das Verkehrszeichen D7 () ein Zusatzzeichen?" - }, - "cycleway-traffic-signs-supplementary": { - "mappings": { - "6": { - "then": "Kein zusätzliches Verkehrszeichen vorhanden" - } - }, - "question": "Hat das Verkehrszeichen D7 () ein Zusatzzeichen?" - }, - "cycleways_and_roads-cycleway:buffer": { - "question": "Wie breit ist der Abstand zwischen Radweg und Straße?", - "render": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m" - }, - "is lit?": { - "mappings": { - "0": { - "then": "Diese Straße ist beleuchtet" - }, - "1": { - "then": "Diese Straße ist nicht beleuchtet" - }, - "2": { - "then": "Diese Straße ist nachts beleuchtet" - }, - "3": { - "then": "Diese Straße ist durchgehend beleuchtet" - } - }, - "question": "Ist diese Straße beleuchtet?" - }, - "width:carriageway": { - "question": "Wie groß ist die Fahrbahnbreite dieser Straße (in Metern)?
    Diese wird von Bordstein zu Bordstein gemessen und schließt daher die Breite von parallelen Parkspuren ein", - "render": "Die Fahrbahnbreite dieser Straße beträgt {width:carriageway}m" - } - }, - "title": { - "mappings": { - "0": { - "then": "Radweg" - }, - "1": { - "then": "Gemeinsame Fahrspur" - }, - "2": { - "then": "Fahrradspur" - }, - "3": { - "then": "Radweg neben der Straße" - }, - "4": { - "then": "Fahrradstraße" - } - }, - "render": "Radwege" - } - }, - "defibrillator": { - "name": "Defibrillatoren", - "presets": { - "0": { - "title": "Defibrillator" - } - }, - "tagRenderings": { - "defibrillator-access": { - "mappings": { - "0": { - "then": "Öffentlich zugänglich" - }, - "1": { - "then": "Öffentlich zugänglich" - }, - "2": { - "then": "Nur für Kunden zugänglich" - }, - "3": { - "then": "Nicht für die Öffentlichkeit zugänglich (z.B. nur für das Personal, die Eigentümer, ...)" - }, - "4": { - "then": "Nicht zugänglich, möglicherweise nur für betriebliche Nutzung" - } - }, - "question": "Ist dieser Defibrillator frei zugänglich?", - "render": "Zugang ist {access}" - }, - "defibrillator-defibrillator": { - "mappings": { - "0": { - "then": "Dies ist ein manueller Defibrillator für den professionellen Einsatz" - }, - "1": { - "then": "Dies ist ein normaler automatischer Defibrillator" - } - }, - "question": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?", - "render": "Es gibt keine Informationen über den Gerätetyp" - }, - "defibrillator-defibrillator:location": { - "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (in der lokalen Sprache)", - "render": "Zusätzliche Informationen über den Standort (in der Landessprache):
    {defibrillator:location}" - }, - "defibrillator-defibrillator:location:en": { - "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Englisch)", - "render": "Zusätzliche Informationen über den Standort (auf Englisch):
    {defibrillator:location}" - }, - "defibrillator-defibrillator:location:fr": { - "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Französisch)", - "render": "Zusätzliche Informationen zum Standort (auf Französisch):
    {defibrillator:Standort:fr}" - }, - "defibrillator-description": { - "question": "Gibt es nützliche Informationen für Benutzer, die Sie oben nicht beschreiben konnten? (leer lassen, wenn nein)", - "render": "Zusätzliche Informationen: {description}" - }, - "defibrillator-email": { - "question": "Wie lautet die E-Mail für Fragen zu diesem Defibrillator?", - "render": "E-Mail für Fragen zu diesem Defibrillator: {email}" - }, - "defibrillator-fixme": { - "question": "Gibt es einen Fehler in der Kartierung, den Sie hier nicht beheben konnten? (hinterlasse eine Notiz an OpenStreetMap-Experten)", - "render": "Zusätzliche Informationen für OpenStreetMap-Experten: {fixme}" - }, - "defibrillator-indoors": { - "mappings": { - "0": { - "then": "Dieser Defibrillator befindet sich im Gebäude" - }, - "1": { - "then": "Dieser Defibrillator befindet sich im Freien" - } - }, - "question": "Befindet sich dieser Defibrillator im Gebäude?" - }, - "defibrillator-level": { - "mappings": { - "0": { - "then": "Dieser Defibrillator befindet sich im Erdgeschoss" - }, - "1": { - "then": "Dieser Defibrillator befindet sich in der ersten Etage" - } - }, - "question": "In welchem Stockwerk befindet sich dieser Defibrillator?", - "render": "Dieser Defibrallator befindet sich im {level}. Stockwerk" - }, - "defibrillator-opening_hours": { - "mappings": { - "0": { - "then": "24/7 geöffnet (auch an Feiertagen)" - } - }, - "question": "Zu welchen Zeiten ist dieser Defibrillator verfügbar?", - "render": "{opening_hours_table(opening_hours)}" - }, - "defibrillator-phone": { - "question": "Wie lautet die Telefonnummer für Fragen zu diesem Defibrillator?", - "render": "Telefonnummer für Fragen zu diesem Defibrillator: {phone}" - }, - "defibrillator-ref": { - "question": "Wie lautet die offizielle Identifikationsnummer des Geräts? (falls am Gerät sichtbar)", - "render": "Offizielle Identifikationsnummer des Geräts: {ref}" - }, - "defibrillator-survey:date": { - "mappings": { - "0": { - "then": "Heute überprüft!" - } - }, - "question": "Wann wurde dieser Defibrillator zuletzt überprüft?", - "render": "Dieser Defibrillator wurde zuletzt am {survey:date} überprüft" - } - }, - "title": { - "render": "Defibrillator" - } - }, - "direction": { - "description": "Diese Ebene visualisiert Richtungen", - "name": "Visualisierung der Richtung" - }, - "drinking_water": { - "name": "Trinkwasserstelle", - "presets": { - "0": { - "title": "Trinkwasserstelle" - } - }, - "tagRenderings": { - "Bottle refill": { - "mappings": { - "0": { - "then": "Es ist einfach, Wasserflaschen nachzufüllen" - }, - "1": { - "then": "Wasserflaschen passen möglicherweise nicht" - } - }, - "question": "Wie einfach ist es, Wasserflaschen zu füllen?" - }, - "Still in use?": { - "mappings": { - "0": { - "then": "Diese Trinkwasserstelle funktioniert" - }, - "1": { - "then": "Diese Trinkwasserstelle ist kaputt" - }, - "2": { - "then": "Diese Trinkwasserstelle wurde geschlossen" - } - }, - "question": "Ist diese Trinkwasserstelle noch in Betrieb?", - "render": "Der Betriebsstatus ist {operational_status" - }, - "render-closest-drinking-water": { - "render": "Eine weitere Trinkwasserstelle liegt {_closest_other_drinking_water_distance} Meter entfernt" - } - }, - "title": { - "render": "Trinkwasserstelle" - } - }, - "etymology": { - "description": "Alle Objekte, die eine bekannte Namensherkunft haben", - "name": "Hat eine Namensherkunft", - "tagRenderings": { - "simple etymology": { - "mappings": { - "0": { - "then": "Der Ursprung dieses Namens ist in der gesamten Literatur unbekannt" - } - }, - "question": "Wonach ist dieses Objekt benannt?
    Das könnte auf einem Straßenschild stehen", - "render": "Benannt nach {name:etymology}" - }, - "wikipedia-etymology": { - "question": "Was ist das Wikidata-Element, nach dem dieses Objekt benannt ist?", - "render": "

    Wikipedia Artikel zur Namensherkunft

    {wikipedia(name:etymology:wikidata):max-height:20rem}" - } - } - }, - "food": { - "filter": { - "0": { - "options": { - "0": { - "question": "Aktuell geöffnet" - } - } - }, - "1": { - "options": { - "0": { - "question": "Hat vegetarische Speisen" - } - } - }, - "2": { - "options": { - "0": { - "question": "Bietet vegan Speisen an" - } - } - }, - "3": { - "options": { - "0": { - "question": "Hat halal Speisen" - } - } - } - }, - "name": "Restaurants und Fast Food", - "presets": { - "0": { - "description": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden", - "title": "Restaurant" - }, - "1": { - "description": "Ein Lebensmittelunternehmen, das sich auf schnellen Thekendienst und Essen zum Mitnehmen konzentriert", - "title": "Schnellimbiss" - }, - "2": { - "title": "Pommesbude" - } - }, - "tagRenderings": { - "Cuisine": { - "mappings": { - "0": { - "then": "Dies ist eine Pizzeria" - }, - "1": { - "then": "Dies ist eine Pommesbude" - }, - "2": { - "then": "Bietet vorwiegend Pastagerichte an" - } - }, - "question": "Welches Essen gibt es hier?", - "render": "An diesem Ort gibt es hauptsächlich {cuisine}" - }, - "Fastfood vs restaurant": { - "question": "Um was für ein Geschäft handelt es sich?" - }, - "Name": { - "question": "Wie heißt dieses Restaurant?", - "render": "Das Restaurant heißt {name}" - }, - "Takeaway": { - "mappings": { - "0": { - "then": "Dieses Geschäft bietet nur Artikel zur Mitnahme an" - }, - "1": { - "then": "Mitnahme möglich" - }, - "2": { - "then": "Mitnahme nicht möglich" - } - }, - "question": "Ist an diesem Ort Mitnahme möglich?" - }, - "Vegetarian (no friture)": { - "question": "Gibt es im das Restaurant vegetarische Speisen?" - }, - "friture-take-your-container": { - "mappings": { - "0": { - "then": "Sie können ihre eigenen Behälter mitbringen, um Ihre Bestellung zu erhalten, was Einwegverpackungsmaterial und damit Abfall spart" - }, - "1": { - "then": "Das Mitbringen eines eigenen Containers ist nicht erlaubt" - }, - "2": { - "then": "Sie müssen Ihren eigenen Behälter mitbringen, um hier zu bestellen." - } - }, - "question": "Wenn Sie Ihr eigenes Behältnis mitbringen (z. B. einen Kochtopf und kleine Töpfe), wird es dann zum Verpacken Ihrer Bestellung verwendet?
    " - }, - "halal (no friture)": { - "mappings": { - "0": { - "then": "Hier gibt es keine halal Speisen" - }, - "1": { - "then": "Hier gibt es wenige halal Speisen" - }, - "2": { - "then": "Es gibt halal Speisen" - }, - "3": { - "then": "Es gibt ausschließlich halal Speisen" - } - }, - "question": "Gibt es im das Restaurant halal Speisen?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Restaurant {name}" - }, - "1": { - "then": "Schnellrestaurant{name}" - } - } - } - }, - "ghost_bike": { - "name": "Geisterräder", - "presets": { - "0": { - "title": "Geisterrad" - } - }, - "tagRenderings": { - "ghost-bike-explanation": { - "render": "Ein Geisterrad ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde." - }, - "ghost_bike-inscription": { - "question": "Wie lautet die Inschrift auf diesem Geisterrad?", - "render": "{inscription}" - }, - "ghost_bike-name": { - "mappings": { - "0": { - "then": "Auf dem Fahrrad ist kein Name angegeben" - } - }, - "question": "An wen erinnert dieses Geisterrad?
    Bitte respektieren Sie die Privatsphäre - geben Sie den Namen nur an, wenn er weit verbreitet oder auf dem Fahrrad markiert ist. Den Familiennamen können Sie weglassen.
    ", - "render": "Im Gedenken an {name}" - }, - "ghost_bike-source": { - "question": "Auf welcher Webseite kann man mehr Informationen über das Geisterrad oder den Unfall finden?", - "render": "Mehr Informationen" - }, - "ghost_bike-start_date": { - "question": "Wann wurde dieses Geisterrad aufgestellt?", - "render": "Aufgestellt am {start_date}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Geisterrad im Gedenken an {name}" - } - }, - "render": "Geisterrad" - } - }, - "information_board": { - "name": "Informationstafeln", - "presets": { - "0": { - "title": "informationstafel" - } - }, - "title": { - "render": "Informationstafel" - } - }, - "map": { - "description": "Eine Karte, die für Touristen gedacht ist und dauerhaft im öffentlichen Raum aufgestellt ist", - "name": "Karten", - "presets": { - "0": { - "description": "Fehlende Karte hinzufügen", - "title": "Karte" - } - }, - "tagRenderings": { - "map-attribution": { - "mappings": { - "0": { - "then": "OpenStreetMap ist eindeutig attributiert, einschließlich der ODBL-Lizenz" - }, - "1": { - "then": "OpenStreetMap ist eindeutig attributiert, aber die Lizenz wird nicht erwähnt" - }, - "2": { - "then": "OpenStreetMap wurde nicht erwähnt, aber jemand hat einen OpenStreetMap-Aufkleber darauf geklebt" - }, - "3": { - "then": "Es gibt überhaupt keine Namensnennung" - }, - "4": { - "then": "Es gibt überhaupt keine Namensnennung" - } - }, - "question": "Ist die OpenStreetMap-Attribution vorhanden?" - }, - "map-map_source": { - "mappings": { - "0": { - "then": "Diese Karte basiert auf OpenStreetMap" - } - }, - "question": "Auf welchen Daten basiert diese Karte?", - "render": "Diese Karte basiert auf {map_source}" - } - }, - "title": { - "render": "Karte" - } - }, - "nature_reserve": { - "tagRenderings": { - "Curator": { - "question": "Wer ist der Verwalter dieses Naturschutzgebietes?
    Respektieren Sie die Privatsphäre - geben Sie nur dann einen Namen an, wenn dieser allgemein bekannt ist", - "render": "{curator} ist der Pfleger dieses Naturschutzgebietes" - }, - "Dogs?": { - "mappings": { - "0": { - "then": "Hunde müssen angeleint sein" - }, - "1": { - "then": "Hunde sind nicht erlaubt" - }, - "2": { - "then": "Hunde dürfen frei herumlaufen" - } - }, - "question": "Sind Hunde in diesem Naturschutzgebiet erlaubt?" - }, - "Email": { - "question": "An welche Email-Adresse kann man sich bei Fragen und Problemen zu diesem Naturschutzgebiet wenden?
    Respektieren Sie die Privatsphäre - geben Sie nur dann eine persönliche Email-Adresse an, wenn diese allgemein bekannt ist", - "render": "{email}" - }, - "Surface area": { - "render": "Grundfläche: {_surface:ha}ha" - }, - "Website": { - "question": "Auf welcher Webseite kann man mehr Informationen über dieses Naturschutzgebiet finden?" - }, - "phone": { - "question": "Welche Telefonnummer kann man bei Fragen und Problemen zu diesem Naturschutzgebiet anrufen?
    Respektieren Sie die Privatsphäre - geben Sie nur eine Telefonnummer an, wenn diese allgemein bekannt ist", - "render": "{phone}" - } - } - }, - "observation_tower": { - "description": "Türme zur Aussicht auf die umgebende Landschaft", - "name": "Aussichtstürme", - "presets": { - "0": { - "title": "Beobachtungsturm" - } - }, - "tagRenderings": { - "Fee": { - "mappings": { - "0": { - "then": "Eintritt kostenlos" - } - }, - "question": "Was kostet der Zugang zu diesem Turm?", - "render": "Der Besuch des Turms kostet {charge}" - }, - "Height": { - "question": "Wie hoch ist dieser Turm?", - "render": "Dieser Turm ist {height} hoch" - }, - "Operator": { - "question": "Wer betreibt diesen Turm?", - "render": "Betrieben von {operator}" - }, - "name": { - "mappings": { - "0": { - "then": "Dieser Turm hat keinen eigenen Namen" - } - }, - "question": "Wie heißt dieser Turm?", - "render": "Der Name dieses Turms lautet {name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Beobachtungsturm" - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " Meter" - } - } - } - } - }, - "picnic_table": { - "description": "Die Ebene zeigt Picknicktische an", - "name": "Picknick-Tische", - "presets": { - "0": { - "title": "picknicktisch" - } - }, - "tagRenderings": { - "picnic_table-material": { - "mappings": { - "0": { - "then": "Dies ist ein Picknicktisch aus Holz" - }, - "1": { - "then": "Dies ist ein Picknicktisch aus Beton" - } - }, - "question": "Aus welchem Material besteht dieser Picknicktisch?", - "render": "Dieser Picknicktisch besteht aus {material}" - } - }, - "title": { - "render": "Picknick-Tisch" - } - }, - "playground": { - "description": "Spielplätze", - "name": "Spielplätze", - "presets": { - "0": { - "title": "Spielplatz" - } - }, - "tagRenderings": { - "Playground-wheelchair": { - "mappings": { - "0": { - "then": "Vollständig zugänglich für Rollstuhlfahrer" - }, - "1": { - "then": "Eingeschränkte Zugänglichkeit für Rollstuhlfahrer" - }, - "2": { - "then": "Nicht zugänglich für Rollstuhlfahrer" - } - }, - "question": "Ist dieser Spielplatz für Rollstuhlfahrer zugänglich?" - }, - "playground-access": { - "mappings": { - "0": { - "then": "Zugänglich für die Allgemeinheit" - }, - "1": { - "then": "Zugänglich für die Allgemeinheit" - }, - "2": { - "then": "Nur für Kunden des Betreibers zugänglich" - }, - "3": { - "then": "Nur für Schüler der Schule zugänglich" - }, - "4": { - "then": "Nicht zugänglich" - } - }, - "question": "Ist dieser Spielplatz für die Allgemeinheit zugänglich?" - }, - "playground-email": { - "question": "Wie lautet die E-Mail Adresse des Spielplatzbetreuers?", - "render": "{email}" - }, - "playground-lit": { - "mappings": { - "0": { - "then": "Dieser Spielplatz ist nachts beleuchtet" - }, - "1": { - "then": "Dieser Spielplatz ist nachts nicht beleuchtet" - } - }, - "question": "Ist dieser Spielplatz nachts beleuchtet?" - }, - "playground-max_age": { - "question": "Bis zu welchem Alter dürfen Kinder auf diesem Spielplatz spielen?", - "render": "Zugang nur für Kinder bis maximal {max_age}" - }, - "playground-min_age": { - "question": "Ab welchem Alter dürfen Kinder auf diesem Spielplatz spielen?", - "render": "Zugang nur für Kinder ab {min_age} Jahren" - }, - "playground-opening_hours": { - "mappings": { - "0": { - "then": "Zugänglich von Sonnenaufgang bis Sonnenuntergang" - }, - "1": { - "then": "Immer zugänglich" - }, - "2": { - "then": "Immer zugänglich" - } - }, - "question": "Wann ist dieser Spielplatz zugänglich?" - }, - "playground-operator": { - "question": "Wer betreibt diesen Spielplatz?", - "render": "Betrieben von {operator}" - }, - "playground-phone": { - "question": "Wie lautet die Telefonnummer vom Betreiber des Spielplatzes?", - "render": "{phone}" - }, - "playground-surface": { - "mappings": { - "0": { - "then": "Die Oberfläche ist Gras" - }, - "1": { - "then": "Die Oberfläche ist Sand" - }, - "2": { - "then": "Die Oberfläche besteht aus Holzschnitzeln" - }, - "3": { - "then": "Die Oberfläche ist Pflastersteine" - }, - "4": { - "then": "Die Oberfläche ist Asphalt" - }, - "5": { - "then": "Die Oberfläche ist Beton" - }, - "6": { - "then": "Die Oberfläche ist unbefestigt" - }, - "7": { - "then": "Die Oberfläche ist befestigt" - } - }, - "question": "Welche Oberfläche hat dieser Spielplatz?
    Wenn es mehrere gibt, wähle die am häufigsten vorkommende aus", - "render": "Die Oberfläche ist {surface}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Spielplatz {name}" - } - }, - "render": "Spielplatz" - } - }, - "public_bookcase": { - "description": "Ein Bücherschrank am Straßenrand mit Büchern, für jedermann zugänglich", - "filter": { - "2": { - "options": { - "0": { - "question": "Innen oder Außen" - } - } - } - }, - "name": "Bücherschränke", - "presets": { - "0": { - "title": "Bücherschrank" - } - }, - "tagRenderings": { - "bookcase-booktypes": { - "mappings": { - "0": { - "then": "Vorwiegend Kinderbücher" - }, - "1": { - "then": "Vorwiegend Bücher für Erwachsene" - }, - "2": { - "then": "Sowohl Bücher für Kinder als auch für Erwachsene" - } - }, - "question": "Welche Art von Büchern sind in diesem öffentlichen Bücherschrank zu finden?" - }, - "bookcase-is-accessible": { - "mappings": { - "0": { - "then": "Öffentlich zugänglich" - }, - "1": { - "then": "Nur für Kunden zugänglich" - } - }, - "question": "Ist dieser öffentliche Bücherschrank frei zugänglich?" - }, - "bookcase-is-indoors": { - "mappings": { - "0": { - "then": "Dieser Bücherschrank befindet sich im Innenbereich" - }, - "1": { - "then": "Dieser Bücherschrank befindet sich im Freien" - }, - "2": { - "then": "Dieser Bücherschrank befindet sich im Freien" - } - }, - "question": "Befindet sich dieser Bücherschrank im Freien?" - }, - "public_bookcase-brand": { - "mappings": { - "0": { - "then": "Teil des Netzwerks 'Little Free Library'" - }, - "1": { - "then": "Dieser öffentliche Bücherschrank ist nicht Teil eines größeren Netzwerks" - } - }, - "question": "Ist dieser öffentliche Bücherschrank Teil eines größeren Netzwerks?", - "render": "Dieser Bücherschrank ist Teil von {brand}" - }, - "public_bookcase-capacity": { - "question": "Wie viele Bücher passen in diesen öffentlichen Bücherschrank?", - "render": "{capacity} Bücher passen in diesen Bücherschrank" - }, - "public_bookcase-name": { - "mappings": { - "0": { - "then": "Dieser Bücherschrank hat keinen Namen" - } - }, - "question": "Wie heißt dieser öffentliche Bücherschrank?", - "render": "Der Name dieses Bücherschrank lautet {name}" - }, - "public_bookcase-operator": { - "question": "Wer unterhält diesen öffentlichen Bücherschrank?", - "render": "Betrieben von {operator}" - }, - "public_bookcase-ref": { - "mappings": { - "0": { - "then": "Dieser Bücherschrank ist nicht Teil eines größeren Netzwerks" - } - }, - "question": "Wie lautet die Referenznummer dieses öffentlichen Bücherschranks?", - "render": "Die Referenznummer dieses öffentlichen Bücherschranks innerhalb {brand} lautet {ref}" - }, - "public_bookcase-start_date": { - "question": "Wann wurde dieser öffentliche Bücherschrank installiert?", - "render": "Installiert am {start_date}" - }, - "public_bookcase-website": { - "question": "Gibt es eine Website mit weiteren Informationen über diesen öffentlichen Bücherschrank?", - "render": "Weitere Informationen auf der Webseite" - } - }, - "title": { - "mappings": { - "0": { - "then": "Öffentlicher Bücherschrank {name}" - } - }, - "render": "Bücherschrank" - } - }, - "shops": { - "description": "Ein Geschäft", - "name": "Geschäft", - "presets": { - "0": { - "description": "Ein neues Geschäft hinzufügen", - "title": "Geschäft" - } - }, - "tagRenderings": { - "shops-email": { - "question": "Wie ist die Email-Adresse dieses Geschäfts?" - }, - "shops-name": { - "question": "Wie ist der Name dieses Geschäfts?" - }, - "shops-opening_hours": { - "question": "Wie sind die Öffnungszeiten dieses Geschäfts?" - }, - "shops-phone": { - "question": "Wie ist die Telefonnummer?", - "render": "{phone}" - }, - "shops-shop": { - "mappings": { - "0": { - "then": "Lebensmittelladen" - }, - "1": { - "then": "Supermarkt" - }, - "2": { - "then": "Bekleidungsgeschäft" - }, - "3": { - "then": "Friseur" - }, - "4": { - "then": "Bäckerei" - }, - "5": { - "then": "Autowerkstatt" - }, - "6": { - "then": "Autohändler" - } - }, - "question": "Was wird in diesem Geschäft verkauft?", - "render": "Dieses Geschäft verkauft {shop}" - }, - "shops-website": { - "question": "Wie lautet die Webseite dieses Geschäfts?", - "render": "{website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - }, - "1": { - "then": "{shop}" - } - }, - "render": "Geschäft" - } - }, - "slow_roads": { - "tagRenderings": { - "slow_roads-surface": { - "mappings": { - "0": { - "then": "Die Oberfläche ist Gras" - }, - "1": { - "then": "Die Oberfläche ist Erde" - }, - "2": { - "then": "Die Oberfläche ist ohne festen Belag" - }, - "3": { - "then": "Die Oberfläche ist Sand" - }, - "4": { - "then": "Die Oberfläche ist aus Pflastersteinen" - }, - "5": { - "then": "Die Oberfläche ist Asphalt" - }, - "6": { - "then": "Die Oberfläche ist Beton" - }, - "7": { - "then": "Die Oberfläche ist gepflastert" - } - }, - "render": "Die Oberfläche ist {surface}" - } - } - }, - "sport_pitch": { - "description": "Ein Sportplatz", - "name": "Sportplätze", - "presets": { - "0": { - "title": "Tischtennisplatte" - }, - "1": { - "title": "Sportplatz" - } - }, - "tagRenderings": { - "sport-pitch-access": { - "mappings": { - "0": { - "then": "Öffentlicher Zugang" - }, - "1": { - "then": "Eingeschränkter Zugang (z. B. nur mit Termin, zu bestimmten Zeiten, ...)" - }, - "2": { - "then": "Zugang nur für Vereinsmitglieder" - }, - "3": { - "then": "Privat - kein öffentlicher Zugang" - } - }, - "question": "Ist dieser Sportplatz öffentlich zugänglich?" - }, - "sport-pitch-reservation": { - "mappings": { - "0": { - "then": "Für die Nutzung des Sportplatzes ist eine Voranmeldung erforderlich" - }, - "1": { - "then": "Für die Nutzung des Sportplatzes wird eine Voranmeldung empfohlen" - }, - "2": { - "then": "Eine Voranmeldung ist möglich, aber nicht notwendig, um diesen Sportplatz zu nutzen" - }, - "3": { - "then": "Termine nach Vereinbarung nicht möglich" - } - }, - "question": "Muss man einen Termin vereinbaren, um diesen Sportplatz zu benutzen?" - }, - "sport_pitch-email": { - "question": "Wie ist die Email-Adresse des Betreibers?" - }, - "sport_pitch-opening_hours": { - "mappings": { - "1": { - "then": "Immer zugänglich" - } - }, - "question": "Wann ist dieser Sportplatz zugänglich?" - }, - "sport_pitch-phone": { - "question": "Wie ist die Telefonnummer des Betreibers?" - }, - "sport_pitch-sport": { - "mappings": { - "0": { - "then": "Hier wird Basketball gespielt" - }, - "1": { - "then": "Hier wird Fußball gespielt" - }, - "2": { - "then": "Dies ist eine Tischtennisplatte" - }, - "3": { - "then": "Hier wird Tennis gespielt" - }, - "4": { - "then": "Hier wird Kopfball gespielt" - }, - "5": { - "then": "Hier wird Basketball gespielt" - } - }, - "question": "Welche Sportarten können hier gespielt werden?", - "render": "Hier wird {sport} gespielt" - }, - "sport_pitch-surface": { - "mappings": { - "0": { - "then": "Die Oberfläche ist Gras" - }, - "1": { - "then": "Die Oberfläche ist Sand" - }, - "2": { - "then": "Die Oberfläche ist aus Pflastersteinen" - }, - "3": { - "then": "Die Oberfläche ist Asphalt" - }, - "4": { - "then": "Die Oberfläche ist Beton" - } - }, - "question": "Was ist die Oberfläche dieses Sportplatzes?", - "render": "Die Oberfläche ist {surface}" - } - }, - "title": { - "render": "Sportplatz" - } - }, - "surveillance_camera": { - "name": "Überwachungskameras", - "tagRenderings": { - "Camera type: fixed; panning; dome": { - "mappings": { - "0": { - "then": "Eine fest montierte (nicht bewegliche) Kamera" - }, - "1": { - "then": "Eine Kuppelkamera (drehbar)" - }, - "2": { - "then": "Eine bewegliche Kamera" - } - }, - "question": "Um welche Kameratyp handelt se sich?" - }, - "Indoor camera? This isn't clear for 'public'-cameras": { - "mappings": { - "0": { - "then": "Diese Kamera befindet sich im Innenraum" - }, - "1": { - "then": "Diese Kamera befindet sich im Freien" - }, - "2": { - "then": "Diese Kamera ist möglicherweise im Freien" - } - }, - "question": "Handelt es sich bei dem von dieser Kamera überwachten öffentlichen Raum um einen Innen- oder Außenbereich?" - }, - "Level": { - "question": "Auf welcher Ebene befindet sich diese Kamera?", - "render": "Befindet sich auf Ebene {level}" - }, - "Operator": { - "question": "Wer betreibt diese CCTV Kamera?", - "render": "Betrieben von {operator}" - }, - "Surveillance type: public, outdoor, indoor": { - "mappings": { - "0": { - "then": "Überwacht wird ein öffentlicher Bereich, z. B. eine Straße, eine Brücke, ein Platz, ein Park, ein Bahnhof, ein öffentlicher Korridor oder Tunnel,..." - }, - "1": { - "then": "Ein privater Außenbereich wird überwacht (z. B. ein Parkplatz, eine Tankstelle, ein Innenhof, ein Eingang, eine private Einfahrt, ...)" - }, - "2": { - "then": "Ein privater Innenbereich wird überwacht, z. B. ein Geschäft, eine private Tiefgarage, ..." - } - }, - "question": "Um was für eine Überwachungskamera handelt es sich" - }, - "Surveillance:zone": { - "mappings": { - "0": { - "then": "Überwacht einen Parkplatz" - }, - "1": { - "then": "Überwacht den Verkehr" - }, - "2": { - "then": "Überwacht einen Eingang" - }, - "3": { - "then": "Überwacht einen Gang" - }, - "4": { - "then": "Überwacht eine Haltestelle" - }, - "5": { - "then": "Überwacht ein Geschäft" - } - }, - "question": "Was genau wird hier überwacht?", - "render": " Überwacht ein/e {surveillance:zone}" - }, - "camera:mount": { - "mappings": { - "0": { - "then": "Diese Kamera ist an einer Wand montiert" - }, - "1": { - "then": "Diese Kamera ist an einer Stange montiert" - }, - "2": { - "then": "Diese Kamera ist an der Decke montiert" - } - }, - "question": "Wie ist diese Kamera montiert?", - "render": "Montageart: {mount}" - }, - "direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view": { - "question": "In welche Himmelsrichtung ist diese Kamera ausgerichtet?" - } - }, - "title": { - "render": "Überwachungskamera" - } - }, - "toilet": { - "filter": { - "0": { - "options": { - "0": { - "question": "Rollstuhlgerecht" - } - } - }, - "1": { - "options": { - "0": { - "question": "Hat einen Wickeltisch" - } - } - }, - "2": { - "options": { - "0": { - "question": "Nutzung kostenlos" - } - } - } - }, - "name": "Toiletten", - "presets": { - "0": { - "description": "Eine öffentlich zugängliche Toilette", - "title": "toilette" - }, - "1": { - "description": "Eine Toilettenanlage mit mindestens einer rollstuhlgerechten Toilette", - "title": "toiletten mit rollstuhlgerechter Toilette" - } - }, - "tagRenderings": { - "toilet-access": { - "mappings": { - "0": { - "then": "Öffentlicher Zugang" - }, - "1": { - "then": "Nur Zugang für Kunden" - }, - "2": { - "then": "Nicht zugänglich" - }, - "3": { - "then": "Zugänglich, aber man muss einen Schlüssel für die Eingabe verlangen" - }, - "4": { - "then": "Öffentlicher Zugang" - } - }, - "question": "Sind diese Toiletten öffentlich zugänglich?", - "render": "Zugang ist {access}" - }, - "toilet-changing_table:location": { - "mappings": { - "0": { - "then": "Der Wickeltisch befindet sich in der Damentoilette. " - }, - "1": { - "then": "Der Wickeltisch befindet sich in der Herrentoilette. " - }, - "2": { - "then": "Der Wickeltisch befindet sich in der Toilette für Rollstuhlfahrer. " - }, - "3": { - "then": "Der Wickeltisch befindet sich in einem eigenen Raum. " - } - }, - "question": "Wo befindet sich der Wickeltisch?", - "render": "Die Wickeltabelle befindet sich in {changing_table:location}" - }, - "toilet-charge": { - "question": "Wie viel muss man für diese Toiletten bezahlen?", - "render": "Die Gebühr beträgt {charge}" - }, - "toilet-handwashing": { - "mappings": { - "0": { - "then": "Diese Toilette verfügt über ein Waschbecken" - }, - "1": { - "then": "Diese Toilette verfügt über kein Waschbecken" - } - }, - "question": "Verfügt diese Toilette über ein Waschbecken?" - }, - "toilet-has-paper": { - "mappings": { - "1": { - "then": "Für diese Toilette müssen Sie Ihr eigenes Toilettenpapier mitbringen" - } - }, - "question": "Muss man für diese Toilette sein eigenes Toilettenpapier mitbringen?" - }, - "toilets-changing-table": { - "mappings": { - "0": { - "then": "Ein Wickeltisch ist verfügbar" - }, - "1": { - "then": "Es ist kein Wickeltisch verfügbar" - } - }, - "question": "Ist ein Wickeltisch (zum Wechseln der Windeln) vorhanden?" - }, - "toilets-fee": { - "mappings": { - "0": { - "then": "Dies sind bezahlte Toiletten" - }, - "1": { - "then": "Kostenlose Nutzung" - } - }, - "question": "Können diese Toiletten kostenlos benutzt werden?" - }, - "toilets-type": { - "mappings": { - "0": { - "then": "Es gibt nur Sitztoiletten" - }, - "1": { - "then": "Hier gibt es nur Pissoirs" - }, - "2": { - "then": "Es gibt hier nur Hocktoiletten" - }, - "3": { - "then": "Sowohl Sitztoiletten als auch Pissoirs sind hier verfügbar" - } - }, - "question": "Welche Art von Toiletten sind das?" - }, - "toilets-wheelchair": { - "mappings": { - "0": { - "then": "Es gibt eine Toilette für Rollstuhlfahrer" - }, - "1": { - "then": "Kein Zugang für Rollstuhlfahrer" - } - }, - "question": "Gibt es eine Toilette für Rollstuhlfahrer?" - } - }, - "title": { - "render": "Toilette" - } - }, - "trail": { - "name": "Wanderwege", - "tagRenderings": { - "Color": { - "mappings": { - "0": { - "then": "Blauer Weg" - }, - "1": { - "then": "Roter Weg" - }, - "2": { - "then": "Grüner Weg" - }, - "3": { - "then": "Gelber Weg" - } - } - }, - "trail-length": { - "render": "Der Wanderweg ist {_length:km} Kilometer lang" - } - }, - "title": { - "render": "Wanderweg" - } - }, - "tree_node": { - "name": "Baum", - "presets": { - "0": { - "description": "Ein Baum mit Blättern, z. B. Eiche oder Buche.", - "title": "Laubbaum" - }, - "1": { - "description": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte.", - "title": "Nadelbaum" - }, - "2": { - "description": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt.", - "title": "Baum" - } - }, - "tagRenderings": { - "tree-decidouous": { - "mappings": { - "0": { - "then": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter." - }, - "1": { - "then": "immergrüner Baum." - } - }, - "question": "Ist dies ein Nadelbaum oder ein Laubbaum?" - }, - "tree-denotation": { - "mappings": { - "0": { - "then": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung." - }, - "1": { - "then": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört." - }, - "2": { - "then": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage." - }, - "3": { - "then": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)." - }, - "5": { - "then": "Dieser Baum steht entlang einer Straße." - }, - "7": { - "then": "Dieser Baum steht außerhalb eines städtischen Gebiets." - } - }, - "question": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft." - }, - "tree-height": { - "mappings": { - "0": { - "then": "Höhe: {height} m" - } - }, - "render": "Höhe: {height}" - }, - "tree-heritage": { - "mappings": { - "0": { - "then": "\"\"/ Als Denkmal registriert von der Onroerend Erfgoed Flandern" - }, - "1": { - "then": "Als Denkmal registriert von der Direction du Patrimoine culturel Brüssel" - }, - "2": { - "then": "Von einer anderen Organisation als Denkmal registriert" - }, - "3": { - "then": "Nicht als Denkmal registriert" - }, - "4": { - "then": "Von einer anderen Organisation als Denkmal registriert" - } - }, - "question": "Ist dieser Baum ein Naturdenkmal?" - }, - "tree-leaf_type": { - "mappings": { - "0": { - "then": "\"\"/ Laubbaum" - }, - "1": { - "then": "\"\"/ Nadelbaum" - }, - "2": { - "then": "\"\"/ Dauerhaft blattlos" - } - }, - "question": "Ist dies ein Laub- oder Nadelbaum?" - }, - "tree_node-name": { - "mappings": { - "0": { - "then": "Der Baum hat keinen Namen." - } - }, - "question": "Hat der Baum einen Namen?", - "render": "Name: {name}" - }, - "tree_node-ref:OnroerendErfgoed": { - "question": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?", - "render": "" - }, - "tree_node-wikidata": { - "question": "Was ist das passende Wikidata Element zu diesem Baum?" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Baum" - } - }, - "viewpoint": { - "description": "Ein schöner Aussichtspunkt oder eine schöne Aussicht. Ideal zum Hinzufügen eines Bildes, wenn keine andere Kategorie passt", - "name": "Aussichtspunkt", - "presets": { - "0": { - "title": "Aussichtspunkt" - } - }, - "tagRenderings": { - "viewpoint-description": { - "question": "Möchten Sie eine Beschreibung hinzufügen?" - } - }, - "title": { - "render": "Aussichtspunkt" - } - }, - "visitor_information_centre": { - "description": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet.", - "name": "Besucherinformationszentrum", - "title": { - "mappings": { - "1": { - "then": "{name}" - } - }, - "render": "{name}" - } - }, - "waste_basket": { - "description": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können.", - "iconSize": { - "mappings": { - "0": { - "then": "Abfalleimer" - } - } - }, - "name": "Abfalleimer", - "presets": { - "0": { - "title": "Abfalleimer" - } - }, - "tagRenderings": { - "dispensing_dog_bags": { - "mappings": { - "0": { - "then": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel" - }, - "1": { - "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel" - }, - "2": { - "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel" - } - }, - "question": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?" - }, - "waste-basket-waste-types": { - "mappings": { - "0": { - "then": "Ein Abfalleimer für allgemeinen Müll" - }, - "1": { - "then": "Ein Abfalleimer für allgemeinen Müll" - }, - "2": { - "then": "Ein Abfalleimer für Hundekot" - }, - "3": { - "then": "Mülleimer für Zigaretten" - }, - "4": { - "then": "Mülleimer für Drogen" - }, - "5": { - "then": "Ein Abfalleimer für Nadeln und andere scharfe Gegenstände" - } - }, - "question": "Um was für einen Abfalleimer handelt es sich?" - } - }, - "title": { - "render": "Abfalleimer" - } - }, - "watermill": { - "name": "Wassermühle" + }, + "render": "Kunstwerk" } + }, + "barrier": { + "description": "Hindernisse beim Fahrradfahren, wie zum Beispiel Poller und Fahrrad Barrieren", + "name": "Hindernisse", + "presets": { + "0": { + "description": "Ein Poller auf der Straße", + "title": "Poller" + }, + "1": { + "description": "Fahrradhindernis, das Radfahrer abbremst", + "title": "Fahrradhindernis" + } + }, + "tagRenderings": { + "Bollard type": { + "mappings": { + "0": { + "then": "Entfernbarer Poller" + }, + "1": { + "then": "Feststehender Poller" + }, + "2": { + "then": "Umlegbarer Poller" + }, + "3": { + "then": "Flexibler Poller, meist aus Kunststoff" + }, + "4": { + "then": "Ausfahrender Poller" + } + }, + "question": "Um was für einen Poller handelt es sich?" + }, + "Cycle barrier type": { + "mappings": { + "0": { + "then": "Einfach, nur zwei Barrieren mit einem Zwischenraum " + }, + "1": { + "then": "Doppelt, zwei Barrieren hintereinander " + }, + "2": { + "then": "Dreifach, drei Barrieren hintereinander " + }, + "3": { + "then": "Eine Durchfahrtsbeschränkung, Durchfahrtsbreite ist oben kleiner als unten " + } + }, + "question": "Um welche Art Fahrradhindernis handelt es sich?" + }, + "MaxWidth": { + "question": "Welche Durchfahrtsbreite hat das Hindernis?", + "render": "Maximale Durchfahrtsbreite: {maxwidth:physical} m" + }, + "Overlap (cyclebarrier)": { + "question": "Wie stark überschneiden sich die Barrieren?", + "render": "Überschneidung: {overlap} m" + }, + "Space between barrier (cyclebarrier)": { + "question": "Wie groß ist der Abstand zwischen den Barrieren (entlang der Straße)?", + "render": "Abstand zwischen den Barrieren (entlang der Straße): {width:separation} m" + }, + "Width of opening (cyclebarrier)": { + "question": "Wie breit ist die kleinste Öffnung neben den Barrieren?", + "render": "Breite der Öffnung: {width:opening} m" + }, + "bicycle=yes/no": { + "mappings": { + "0": { + "then": "Ein Radfahrer kann hindurchfahren." + }, + "1": { + "then": "Ein Radfahrer kann nicht hindurchfahren." + } + }, + "question": "Kann ein Radfahrer das Hindernis passieren?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Poller" + }, + "1": { + "then": "Barriere für Radfahrer" + } + }, + "render": "Hindernis" + } + }, + "bench": { + "name": "Sitzbänke", + "presets": { + "0": { + "title": "sitzbank" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Rückenlehne: Ja" + }, + "1": { + "then": "Rückenlehne: Nein" + } + }, + "question": "Hat diese Bank eine Rückenlehne?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "Farbe: braun" + }, + "1": { + "then": "Farbe: grün" + }, + "2": { + "then": "Farbe: grau" + }, + "3": { + "then": "Farbe: weiß" + }, + "4": { + "then": "Farbe: rot" + }, + "5": { + "then": "Farbe: schwarz" + }, + "6": { + "then": "Farbe: blau" + }, + "7": { + "then": "Farbe: gelb" + } + }, + "question": "Welche Farbe hat diese Sitzbank?", + "render": "Farbe: {colour}" + }, + "bench-direction": { + "question": "In welche Richtung schaut man, wenn man auf der Bank sitzt?", + "render": "Wenn man auf der Bank sitzt, schaut man in Richtung {direction}°." + }, + "bench-material": { + "mappings": { + "0": { + "then": "Material: Holz" + }, + "1": { + "then": "Material: Metall" + }, + "2": { + "then": "Material: Stein" + }, + "3": { + "then": "Material: Beton" + }, + "4": { + "then": "Material: Kunststoff" + }, + "5": { + "then": "Material: Stahl" + } + }, + "question": "Aus welchem Material besteht die Sitzbank (Sitzfläche)?", + "render": "Material: {material}" + }, + "bench-seats": { + "question": "Wie viele Sitzplätze hat diese Bank?", + "render": "{seats} Sitzplätze" + }, + "bench-survey:date": { + "question": "Wann wurde diese Bank zuletzt überprüft?", + "render": "Diese Bank wurde zuletzt überprüft am {survey:date}" + } + }, + "title": { + "render": "Sitzbank" + } + }, + "bench_at_pt": { + "name": "Sitzbänke bei Haltestellen", + "tagRenderings": { + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "Stehbank" + } + } + }, + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Sitzbank bei Haltestelle" + }, + "1": { + "then": "Sitzbank in Unterstand" + } + }, + "render": "Sitzbank" + } + }, + "bicycle_library": { + "description": "Eine Einrichtung, in der Fahrräder für längere Zeit geliehen werden können", + "name": "Fahrradbibliothek", + "presets": { + "0": { + "description": "Eine Fahrradbibliothek verfügt über eine Sammlung von Fahrrädern, die ausgeliehen werden können", + "title": "Fahrradbibliothek" + } + }, + "tagRenderings": { + "bicycle-library-target-group": { + "mappings": { + "0": { + "then": "Fahrräder für Kinder verfügbar" + }, + "1": { + "then": "Fahrräder für Erwachsene verfügbar" + }, + "2": { + "then": "Fahrräder für Behinderte verfügbar" + } + }, + "question": "Wer kann hier Fahrräder ausleihen?" + }, + "bicycle_library-charge": { + "mappings": { + "0": { + "then": "Das Ausleihen eines Fahrrads ist kostenlos" + }, + "1": { + "then": "Das Ausleihen eines Fahrrads kostet 20€ pro Jahr und 20€ Gebühr" + } + }, + "question": "Wie viel kostet das Ausleihen eines Fahrrads?", + "render": "Das Ausleihen eines Fahrrads kostet {charge}" + }, + "bicycle_library-name": { + "question": "Wie lautet der Name dieser Fahrradbibliothek?", + "render": "Diese Fahrradbibliothek heißt {name}" + } + }, + "title": { + "render": "Fahrradbibliothek" + } + }, + "bicycle_tube_vending_machine": { + "name": "Fahrradschlauch-Automat", + "presets": { + "0": { + "title": "Fahrradschlauch-Automat" + } + }, + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "Dieser Automat funktioniert" + }, + "1": { + "then": "Dieser Automat ist kaputt" + }, + "2": { + "then": "Dieser Automat ist geschlossen" + } + }, + "question": "Ist dieser Automat noch in Betrieb?", + "render": "Der Betriebszustand ist {operational_status}" + } + }, + "title": { + "render": "Fahrradschlauch-Automat" + } + }, + "bike_cafe": { + "name": "Fahrrad-Café", + "presets": { + "0": { + "title": "Fahrrad-Café" + } + }, + "tagRenderings": { + "bike_cafe-bike-pump": { + "mappings": { + "0": { + "then": "Dieses Fahrrad-Café bietet eine Fahrradpumpe an, die von jedem benutzt werden kann" + }, + "1": { + "then": "Dieses Fahrrad-Café bietet keine Fahrradpumpe an, die von jedem benutzt werden kann" + } + }, + "question": "Bietet dieses Fahrrad-Café eine Fahrradpumpe an, die von jedem benutzt werden kann?" + }, + "bike_cafe-email": { + "question": "Wie lautet die E-Mail-Adresse von {name}?" + }, + "bike_cafe-name": { + "question": "Wie heißt dieses Fahrrad-Café?", + "render": "Dieses Fahrrad-Café heißt {name}" + }, + "bike_cafe-opening_hours": { + "question": "Wann ist dieses Fahrradcafé geöffnet?" + }, + "bike_cafe-phone": { + "question": "Wie lautet die Telefonnummer von {name}?" + }, + "bike_cafe-repair-service": { + "mappings": { + "0": { + "then": "Dieses Fahrrad-Café repariert Fahrräder" + }, + "1": { + "then": "Dieses Fahrrad-Café repariert keine Fahrräder" + } + }, + "question": "Repariert dieses Fahrrad-Café Fahrräder?" + }, + "bike_cafe-repair-tools": { + "mappings": { + "0": { + "then": "Dieses Fahrrad-Café bietet Werkzeuge für die selbständige Reparatur an" + }, + "1": { + "then": "Dieses Fahrrad-Café bietet keine Werkzeuge für die selbständige Reparatur an" + } + }, + "question": "Gibt es hier Werkzeuge, um das eigene Fahrrad zu reparieren?" + }, + "bike_cafe-website": { + "question": "Was ist die Webseite von {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Fahrrad-Café {name}" + } + }, + "render": "Fahrrad-Café" + } + }, + "bike_cleaning": { + "name": "Fahrrad-Reinigungsdienst", + "presets": { + "0": { + "title": "Fahrrad-Reinigungsdienst" + } + }, + "title": { + "mappings": { + "0": { + "then": "Fahrrad-Reinigungsdienst{name}" + } + }, + "render": "Fahrrad-Reinigungsdienst" + } + }, + "bike_parking": { + "name": "Fahrrad-Parkplätze", + "presets": { + "0": { + "title": "Fahrrad-Parkplätze" + } + }, + "tagRenderings": { + "Access": { + "mappings": { + "0": { + "then": "Öffentlich zugänglich" + }, + "1": { + "then": "Der Zugang ist in erster Linie für Besucher eines Unternehmens bestimmt" + }, + "2": { + "then": "Der Zugang ist beschränkt auf Mitglieder einer Schule, eines Unternehmens oder einer Organisation" + } + }, + "question": "Wer kann diesen Fahrradparplatz nutzen?", + "render": "{access}" + }, + "Bicycle parking type": { + "mappings": { + "0": { + "then": "Fahrradbügel " + }, + "1": { + "then": "Metallgestänge " + }, + "2": { + "then": "Halter für Fahrradlenker " + }, + "3": { + "then": "Gestell " + }, + "4": { + "then": "Zweistufig " + }, + "5": { + "then": "Schuppen " + }, + "6": { + "then": "Poller " + }, + "7": { + "then": "Ein Bereich auf dem Boden, der für das Abstellen von Fahrrädern gekennzeichnet ist" + } + }, + "question": "Was ist die Art dieses Fahrrad-Parkplatzes?", + "render": "Dies ist ein Fahrrad-Parkplatz der Art: {bicycle_parking}" + }, + "Capacity": { + "question": "Wie viele Fahrräder passen auf diesen Fahrrad-Parkplatz (einschließlich möglicher Lastenfahrräder)?", + "render": "Platz für {capacity} Fahrräder" + }, + "Cargo bike capacity?": { + "question": "Wie viele Lastenfahrräder passen auf diesen Fahrrad-Parkplatz?", + "render": "Auf diesen Parkplatz passen {capacity:cargo_bike} Lastenfahrräder" + }, + "Cargo bike spaces?": { + "mappings": { + "0": { + "then": "Dieser Parkplatz bietet Platz für Lastenfahrräder" + }, + "1": { + "then": "Dieser Parkplatz verfügt über ausgewiesene (offizielle) Plätze für Lastenfahrräder." + }, + "2": { + "then": "Es ist nicht erlaubt, Lastenfahrräder zu parken" + } + }, + "question": "Gibt es auf diesem Fahrrad-Parkplatz Plätze für Lastenfahrräder?" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "Dieser Parkplatz ist überdacht (er hat ein Dach)" + }, + "1": { + "then": "Dieser Parkplatz ist nicht überdacht" + } + }, + "question": "Ist dieser Parkplatz überdacht? Wählen Sie auch \"überdacht\" für Innenparkplätze." + }, + "Underground?": { + "mappings": { + "0": { + "then": "Tiefgarage" + }, + "1": { + "then": "Ebenerdiges Parken" + }, + "2": { + "then": "Parkplatz auf dem Dach" + }, + "3": { + "then": "Ebenerdiges Parken" + }, + "4": { + "then": "Parkplatz auf dem Dach" + } + }, + "question": "Wo befinden sich diese Fahrradabstellplätze?" + } + }, + "title": { + "render": "Fahrrad-Parkplätze" + } + }, + "bike_repair_station": { + "name": "Fahrradstationen (Reparatur, Pumpe oder beides)", + "presets": { + "0": { + "description": "Ein Gerät zum Aufpumpen von Reifen an einem festen Standort im öffentlichen Raum.

    Beispiele für Fahrradpumpen

    ", + "title": "Fahrradpumpe" + }, + "1": { + "description": "Ein Gerät mit Werkzeugen zur Reparatur von Fahrrädern kombiniert mit einer Pumpe an einem festen Standort. Die Werkzeuge sind oft mit Ketten gegen Diebstahl gesichert.

    Beispiel

    ", + "title": "Fahrrad-Reparaturstation und Pumpe" + }, + "2": { + "title": "Fahrrad-Reparaturstation ohne Pumpe" + } + }, + "tagRenderings": { + "Email maintainer": { + "render": "Melde diese Fahrradpumpe als kaputt" + }, + "Operational status": { + "mappings": { + "0": { + "then": "Die Fahrradpumpe ist kaputt" + }, + "1": { + "then": "Die Fahrradpumpe ist betriebsbereit" + } + }, + "question": "Ist die Fahrradpumpe noch funktionstüchtig?" + }, + "bike_repair_station-available-services": { + "mappings": { + "0": { + "then": "Es ist nur eine Pumpe vorhanden" + }, + "1": { + "then": "Es sind nur Werkzeuge (Schraubenzieher, Zangen...) vorhanden" + }, + "2": { + "then": "Es sind sowohl Werkzeuge als auch eine Pumpe vorhanden" + } + }, + "question": "Welche Einrichtungen stehen an dieser Fahrradstation zur Verfügung?" + }, + "bike_repair_station-bike-chain-tool": { + "mappings": { + "0": { + "then": "Es gibt ein Kettenwerkzeug" + }, + "1": { + "then": "Es gibt kein Kettenwerkzeug" + } + }, + "question": "Verfügt diese Fahrrad-Reparaturstation über Spezialwerkzeug zur Reparatur von Fahrradketten?" + }, + "bike_repair_station-bike-stand": { + "mappings": { + "0": { + "then": "Es gibt einen Haken oder Ständer" + }, + "1": { + "then": "Es gibt keinen Haken oder Ständer" + } + }, + "question": "Hat diese Fahrradstation einen Haken, an dem Sie Ihr Fahrrad aufhängen können, oder einen Ständer, um es anzuheben?" + }, + "bike_repair_station-electrical_pump": { + "mappings": { + "0": { + "then": "Manuelle Pumpe" + }, + "1": { + "then": "Elektrische Pumpe" + } + }, + "question": "Ist dies eine elektrische Fahrradpumpe?" + }, + "bike_repair_station-email": { + "question": "Wie lautet die E-Mail-Adresse des Betreuers?" + }, + "bike_repair_station-manometer": { + "mappings": { + "0": { + "then": "Es gibt ein Manometer" + }, + "1": { + "then": "Es gibt kein Manometer" + }, + "2": { + "then": "Es gibt ein Manometer, aber es ist kaputt" + } + }, + "question": "Verfügt die Pumpe über einen Druckanzeiger oder ein Manometer?" + }, + "bike_repair_station-opening_hours": { + "mappings": { + "0": { + "then": "Immer geöffnet" + }, + "1": { + "then": "Immer geöffnet" + } + }, + "question": "Wann ist diese Fahrradreparaturstelle geöffnet?" + }, + "bike_repair_station-operator": { + "question": "Wer wartet diese Fahrradpumpe?", + "render": "Gewartet von {operator}" + }, + "bike_repair_station-phone": { + "question": "Wie lautet die Telefonnummer des Betreibers?" + }, + "bike_repair_station-valves": { + "mappings": { + "0": { + "then": "Sklaverand (auch bekannt als Presta)" + }, + "1": { + "then": "Dunlop" + }, + "2": { + "then": "Schrader (Autos)" + } + }, + "question": "Welche Ventile werden unterstützt?", + "render": "Diese Pumpe unterstützt die folgenden Ventile: {valves}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Fahrrad-Reparaturstation" + }, + "1": { + "then": "Fahrrad-Reparaturstation" + }, + "2": { + "then": "Kaputte Pumpe" + }, + "3": { + "then": "Fahrradpumpe {name}" + }, + "4": { + "then": "Fahrradpumpe" + } + }, + "render": "Fahrradstation (Pumpe & Reparatur)" + } + }, + "bike_shop": { + "description": "Ein Geschäft, das speziell Fahrräder oder verwandte Artikel verkauft", + "name": "Fahrradwerkstatt/geschäft", + "presets": { + "0": { + "title": "Fahrradwerkstatt/geschäft" + } + }, + "tagRenderings": { + "bike_repair_bike-pump-service": { + "mappings": { + "0": { + "then": "Dieses Geschäft bietet eine Fahrradpumpe für alle an" + }, + "1": { + "then": "Dieses Geschäft bietet für niemanden eine Fahrradpumpe an" + }, + "2": { + "then": "Es gibt eine Fahrradpumpe, sie wird als separater Punkt angezeigt " + } + }, + "question": "Bietet dieses Geschäft eine Fahrradpumpe zur Benutzung für alle an?" + }, + "bike_repair_bike-wash": { + "mappings": { + "0": { + "then": "Dieses Geschäft reinigt Fahrräder" + }, + "1": { + "then": "Dieser Laden hat eine Anlage, in der man Fahrräder selbst reinigen kann" + }, + "2": { + "then": "Dieser Laden bietet keine Fahrradreinigung an" + } + }, + "question": "Werden hier Fahrräder gewaschen?" + }, + "bike_repair_rents-bikes": { + "mappings": { + "0": { + "then": "Dieses Geschäft vermietet Fahrräder" + }, + "1": { + "then": "Dieses Geschäft vermietet keine Fahrräder" + } + }, + "question": "Vermietet dieser Laden Fahrräder?" + }, + "bike_repair_repairs-bikes": { + "mappings": { + "0": { + "then": "Dieses Geschäft repariert Fahrräder" + }, + "1": { + "then": "Dieses Geschäft repariert keine Fahrräder" + }, + "2": { + "then": "Dieses Geschäft repariert nur hier gekaufte Fahrräder" + }, + "3": { + "then": "Dieses Geschäft repariert nur Fahrräder einer bestimmten Marke" + } + }, + "question": "Repariert dieses Geschäft Fahrräder?" + }, + "bike_repair_second-hand-bikes": { + "mappings": { + "0": { + "then": "Dieses Geschäft verkauft gebrauchte Fahrräder" + }, + "1": { + "then": "Dieses Geschäft verkauft keine gebrauchten Fahrräder" + }, + "2": { + "then": "Dieses Geschäft verkauft nur gebrauchte Fahrräder" + } + }, + "question": "Verkauft dieses Geschäft gebrauchte Fahrräder?" + }, + "bike_repair_sells-bikes": { + "mappings": { + "0": { + "then": "Dieses Geschäft verkauft Fahrräder" + }, + "1": { + "then": "Dieses Geschäft verkauft keine Fahrräder" + } + }, + "question": "Verkauft dieser Laden Fahrräder?" + }, + "bike_repair_tools-service": { + "mappings": { + "0": { + "then": "Dieses Geschäft bietet Werkzeuge für die Heimwerkerreparatur an" + }, + "1": { + "then": "Dieses Geschäft bietet keine Werkzeuge für Heimwerkerreparaturen an" + }, + "2": { + "then": "Werkzeuge für die Selbstreparatur sind nur verfügbar, wenn Sie das Fahrrad im Laden gekauft/gemietet haben" + } + }, + "question": "Gibt es hier Werkzeuge, um das eigene Fahrrad zu reparieren?" + }, + "bike_shop-email": { + "question": "Wie lautet die E-Mail-Adresse von {name}?" + }, + "bike_shop-is-bicycle_shop": { + "render": "Dieses Geschäft ist auf den Verkauf von {shop} spezialisiert und im Bereich Fahrrad tätig" + }, + "bike_shop-name": { + "question": "Wie heißt dieser Fahrradladen?", + "render": "Dieses Fahrradgeschäft heißt {name}" + }, + "bike_shop-phone": { + "question": "Wie lautet die Telefonnummer von {name}?" + }, + "bike_shop-website": { + "question": "Was ist die Webseite von {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Sportartikelgeschäft {name}" + }, + "2": { + "then": "Fahrradverleih{name}" + }, + "3": { + "then": "Fahrradwerkstatt {name}" + }, + "4": { + "then": "Fahrradgeschäft {name}" + }, + "5": { + "then": "Fahrradwerkstatt/geschäft {name}" + } + }, + "render": "Fahrradwerkstatt/geschäft" + } + }, + "bike_themed_object": { + "name": "Mit Fahrrad zusammenhängendes Objekt", + "title": { + "mappings": { + "1": { + "then": "Radweg" + } + }, + "render": "Mit Fahrrad zusammenhängendes Objekt" + } + }, + "binocular": { + "description": "Fernglas", + "name": "Ferngläser", + "presets": { + "0": { + "description": "Ein fest installiertes Teleskop oder Fernglas, für die öffentliche Nutzung. ", + "title": "Ferngläser" + } + }, + "tagRenderings": { + "binocular-charge": { + "mappings": { + "0": { + "then": "Kostenlose Nutzung" + } + }, + "question": "Wie viel muss man für die Nutzung dieser Ferngläser bezahlen?", + "render": "Die Benutzung dieses Fernglases kostet {charge}" + }, + "binocular-direction": { + "question": "In welche Richtung blickt man, wenn man durch dieses Fernglas schaut?", + "render": "Blick in Richtung {direction}°" + } + }, + "title": { + "render": "Ferngläser" + } + }, + "birdhide": { + "filter": { + "0": { + "options": { + "0": { + "question": "Zugänglich für Rollstuhlfahrer" + } + } + } + } + }, + "cafe_pub": { + "filter": { + "0": { + "options": { + "0": { + "question": "Jetzt geöffnet" + } + } + } + }, + "name": "Cafés und Kneipen", + "presets": { + "0": { + "title": "Kneipe" + }, + "1": { + "title": "Bar" + }, + "2": { + "title": "Café" + } + }, + "tagRenderings": { + "Classification": { + "question": "Was ist das für ein Café" + }, + "Name": { + "question": "Wie heißt diese Kneipe?", + "render": "Diese Kneipe heißt {name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + } + } + }, + "crossings": { + "description": "Übergänge für Fußgänger und Radfahrer", + "name": "Kreuzungen", + "presets": { + "0": { + "description": "Kreuzung für Fußgänger und/oder Radfahrer", + "title": "Kreuzung" + }, + "1": { + "description": "Ampel an einer Straße", + "title": "Ampel" + } + }, + "tagRenderings": { + "crossing-bicycle-allowed": { + "mappings": { + "0": { + "then": "Radfahrer können diese Kreuzung nutzen" + }, + "1": { + "then": "Radfahrer können diese Kreuzung nicht nutzen" + } + }, + "question": "Können Radfahrer diese Kreuzung nutzen?" + }, + "crossing-button": { + "mappings": { + "0": { + "then": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern" + }, + "1": { + "then": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern." + } + }, + "question": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?" + }, + "crossing-continue-through-red": { + "mappings": { + "0": { + "then": "Ein Radfahrer kann bei roter Ampel geradeaus fahren " + }, + "1": { + "then": "Ein Radfahrer kann bei roter Ampel geradeaus fahren" + }, + "2": { + "then": "Ein Radfahrer kann bei roter Ampel nicht geradeaus fahren" + } + }, + "question": "Kann ein Radfahrer bei roter Ampel geradeaus fahren?" + }, + "crossing-has-island": { + "mappings": { + "0": { + "then": "Der Übergang hat eine Verkehrsinsel" + }, + "1": { + "then": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern" + } + }, + "question": "Gibt es an diesem Übergang eine Verkehrsinsel?" + }, + "crossing-is-zebra": { + "mappings": { + "0": { + "then": "Dies ist ein Zebrastreifen" + }, + "1": { + "then": "Dies ist kein Zebrastreifen" + } + }, + "question": "Ist das ein Zebrastreifen?" + }, + "crossing-right-turn-through-red": { + "mappings": { + "0": { + "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen " + }, + "1": { + "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen" + }, + "2": { + "then": "Ein Radfahrer kann bei roter Ampel nicht rechts abbiegen" + } + }, + "question": "Kann ein Radfahrer bei roter Ampel rechts abbiegen?" + }, + "crossing-tactile": { + "mappings": { + "0": { + "then": "An dieser Kreuzung gibt es ein Blindenleitsystem" + }, + "1": { + "then": "Diese Kreuzung hat kein Blindenleitsystem" + }, + "2": { + "then": "Diese Kreuzung hat taktile Pflasterung, ist aber nicht korrekt" + } + }, + "question": "Gibt es an dieser Kreuzung ein Blindenleitsystem?" + }, + "crossing-type": { + "mappings": { + "0": { + "then": "Kreuzungen ohne Ampeln" + }, + "1": { + "then": "Kreuzungen mit Ampeln" + }, + "2": { + "then": "Zebrastreifen" + } + }, + "question": "Was ist das für eine Kreuzung?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Ampel" + }, + "1": { + "then": "Kreuzung mit Ampeln" + } + }, + "render": "Kreuzung" + } + }, + "cycleways_and_roads": { + "name": "Radwege und Straßen", + "tagRenderings": { + "Cycleway type for a road": { + "mappings": { + "0": { + "then": "Es gibt eine geteilte Fahrspur" + }, + "1": { + "then": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)" + }, + "2": { + "then": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist." + }, + "3": { + "then": "Hier ist ein getrennter Radweg vorhanden" + }, + "4": { + "then": "Es gibt keinen Radweg" + }, + "5": { + "then": "Es gibt keinen Radweg" + } + }, + "question": "Was für ein Radweg ist hier?" + }, + "Cycleway:smoothness": { + "mappings": { + "0": { + "then": "Geeignet für dünne Rollen: Rollerblades, Skateboard" + }, + "1": { + "then": "Geeignet für dünne Reifen: Rennrad" + }, + "2": { + "then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter" + }, + "3": { + "then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha" + }, + "4": { + "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen" + }, + "5": { + "then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen" + }, + "6": { + "then": "Geeignet für Geländefahrzeuge: Traktor, ATV" + }, + "7": { + "then": "Unpassierbar / Keine bereiften Fahrzeuge" + } + }, + "question": "Wie eben ist dieser Radweg?" + }, + "Cycleway:surface": { + "mappings": { + "0": { + "then": "Dieser Radweg hat keinen festen Belag" + }, + "1": { + "then": "Dieser Radweg hat einen festen Belag" + }, + "2": { + "then": "Der Radweg ist aus Asphalt" + }, + "3": { + "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen" + }, + "4": { + "then": "Der Radweg ist aus Beton" + }, + "5": { + "then": "Dieser Radweg besteht aus Kopfsteinpflaster" + }, + "6": { + "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster" + }, + "7": { + "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster" + }, + "8": { + "then": "Der Radweg ist aus Holz" + }, + "9": { + "then": "Der Radweg ist aus Schotter" + }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" + } + }, + "question": "Was ist der Belag dieses Radwegs?", + "render": "Der Radweg ist aus {cycleway:surface}" + }, + "Is this a cyclestreet? (For a road)": { + "mappings": { + "0": { + "then": "Dies ist eine Fahrradstraße in einer 30km/h Zone." + }, + "1": { + "then": "Dies ist eine Fahrradstraße" + }, + "2": { + "then": "Dies ist keine Fahrradstraße." + } + }, + "question": "Ist das eine Fahrradstraße?" + }, + "Maxspeed (for road)": { + "mappings": { + "0": { + "then": "Die Höchstgeschwindigkeit ist 20 km/h" + }, + "1": { + "then": "Die Höchstgeschwindigkeit ist 30 km/h" + }, + "2": { + "then": "Die Höchstgeschwindigkeit ist 50 km/h" + }, + "3": { + "then": "Die Höchstgeschwindigkeit ist 70 km/h" + }, + "4": { + "then": "Die Höchstgeschwindigkeit ist 90 km/h" + } + }, + "question": "Was ist die Höchstgeschwindigkeit auf dieser Straße?", + "render": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h" + }, + "Surface of the road": { + "mappings": { + "0": { + "then": "Dieser Radweg ist nicht befestigt" + }, + "1": { + "then": "Dieser Radweg hat einen festen Belag" + }, + "2": { + "then": "Der Radweg ist aus Asphalt" + }, + "3": { + "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen" + }, + "4": { + "then": "Der Radweg ist aus Beton" + }, + "5": { + "then": "Dieser Radweg besteht aus Kopfsteinpflaster" + }, + "6": { + "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster" + }, + "7": { + "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster" + }, + "8": { + "then": "Der Radweg ist aus Holz" + }, + "9": { + "then": "Der Radweg ist aus Schotter" + }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" + } + }, + "question": "Was ist der Belag dieser Straße?", + "render": "Der Radweg ist aus {surface}" + }, + "Surface of the street": { + "mappings": { + "0": { + "then": "Geeignet für dünne Rollen: Rollerblades, Skateboard" + }, + "1": { + "then": "Geeignet für dünne Reifen: Rennrad" + }, + "2": { + "then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter" + }, + "3": { + "then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha" + }, + "4": { + "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen" + }, + "5": { + "then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen" + }, + "6": { + "then": "Geeignet für spezielle Geländewagen: Traktor, ATV" + }, + "7": { + "then": "Unpassierbar / Keine bereiften Fahrzeuge" + } + }, + "question": "Wie eben ist diese Straße?" + }, + "cyclelan-segregation": { + "mappings": { + "0": { + "then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie" + }, + "1": { + "then": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie" + }, + "2": { + "then": "Der Radweg ist abgegrenzt durch eine Parkspur" + }, + "3": { + "then": "Dieser Radweg ist getrennt durch einen Bordstein" + } + }, + "question": "Wie ist der Radweg von der Straße abgegrenzt?" + }, + "cycleway-lane-track-traffic-signs": { + "mappings": { + "0": { + "then": "Vorgeschriebener Radweg " + }, + "1": { + "then": "Vorgeschriebener Radweg (mit Zusatzschild)
    " + }, + "2": { + "then": "Getrennter Fuß-/Radweg " + }, + "3": { + "then": "Gemeinsamer Fuß-/Radweg " + }, + "4": { + "then": "Kein Verkehrsschild vorhanden" + } + }, + "question": "Welches Verkehrszeichen hat dieser Radweg?" + }, + "cycleway-segregation": { + "mappings": { + "0": { + "then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie" + }, + "1": { + "then": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie" + }, + "2": { + "then": "Der Radweg ist abgegrenzt durch eine Parkspur" + }, + "3": { + "then": "Dieser Radweg ist getrennt durch einen Bordstein" + } + }, + "question": "Wie ist der Radweg von der Straße abgegrenzt?" + }, + "cycleway-traffic-signs": { + "mappings": { + "0": { + "then": "Vorgeschriebener Radweg " + }, + "1": { + "then": "Vorgeschriebener Radweg (mit Zusatzschild)
    " + }, + "2": { + "then": "Getrennter Fuß-/Radweg " + }, + "3": { + "then": "Gemeinsamer Fuß-/Radweg " + }, + "4": { + "then": "Kein Verkehrsschild vorhanden" + } + }, + "question": "Welches Verkehrszeichen hat dieser Radweg?" + }, + "cycleway-traffic-signs-D7-supplementary": { + "mappings": { + "1": { + "then": "" + }, + "6": { + "then": "Kein zusätzliches Verkehrszeichen vorhanden" + } + }, + "question": "Hat das Verkehrszeichen D7 () ein Zusatzzeichen?" + }, + "cycleway-traffic-signs-supplementary": { + "mappings": { + "6": { + "then": "Kein zusätzliches Verkehrszeichen vorhanden" + } + }, + "question": "Hat das Verkehrszeichen D7 () ein Zusatzzeichen?" + }, + "cycleways_and_roads-cycleway:buffer": { + "question": "Wie breit ist der Abstand zwischen Radweg und Straße?", + "render": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m" + }, + "is lit?": { + "mappings": { + "0": { + "then": "Diese Straße ist beleuchtet" + }, + "1": { + "then": "Diese Straße ist nicht beleuchtet" + }, + "2": { + "then": "Diese Straße ist nachts beleuchtet" + }, + "3": { + "then": "Diese Straße ist durchgehend beleuchtet" + } + }, + "question": "Ist diese Straße beleuchtet?" + }, + "width:carriageway": { + "question": "Wie groß ist die Fahrbahnbreite dieser Straße (in Metern)?
    Diese wird von Bordstein zu Bordstein gemessen und schließt daher die Breite von parallelen Parkspuren ein", + "render": "Die Fahrbahnbreite dieser Straße beträgt {width:carriageway}m" + } + }, + "title": { + "mappings": { + "0": { + "then": "Radweg" + }, + "1": { + "then": "Gemeinsame Fahrspur" + }, + "2": { + "then": "Fahrradspur" + }, + "3": { + "then": "Radweg neben der Straße" + }, + "4": { + "then": "Fahrradstraße" + } + }, + "render": "Radwege" + } + }, + "defibrillator": { + "name": "Defibrillatoren", + "presets": { + "0": { + "title": "Defibrillator" + } + }, + "tagRenderings": { + "defibrillator-access": { + "mappings": { + "0": { + "then": "Öffentlich zugänglich" + }, + "1": { + "then": "Öffentlich zugänglich" + }, + "2": { + "then": "Nur für Kunden zugänglich" + }, + "3": { + "then": "Nicht für die Öffentlichkeit zugänglich (z.B. nur für das Personal, die Eigentümer, ...)" + }, + "4": { + "then": "Nicht zugänglich, möglicherweise nur für betriebliche Nutzung" + } + }, + "question": "Ist dieser Defibrillator frei zugänglich?", + "render": "Zugang ist {access}" + }, + "defibrillator-defibrillator": { + "mappings": { + "0": { + "then": "Es gibt keine Informationen über den Gerätetyp" + }, + "1": { + "then": "Dies ist ein manueller Defibrillator für den professionellen Einsatz" + }, + "2": { + "then": "Dies ist ein normaler automatischer Defibrillator" + } + }, + "question": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?" + }, + "defibrillator-defibrillator:location": { + "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (in der lokalen Sprache)", + "render": "Zusätzliche Informationen über den Standort (in der Landessprache):
    {defibrillator:location}" + }, + "defibrillator-defibrillator:location:en": { + "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Englisch)", + "render": "Zusätzliche Informationen über den Standort (auf Englisch):
    {defibrillator:location:en}" + }, + "defibrillator-defibrillator:location:fr": { + "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Französisch)", + "render": "Zusätzliche Informationen zum Standort (auf Französisch):
    {defibrillator:location:fr}" + }, + "defibrillator-description": { + "question": "Gibt es nützliche Informationen für Benutzer, die Sie oben nicht beschreiben konnten? (leer lassen, wenn nein)", + "render": "Zusätzliche Informationen: {description}" + }, + "defibrillator-email": { + "question": "Wie lautet die E-Mail für Fragen zu diesem Defibrillator?", + "render": "E-Mail für Fragen zu diesem Defibrillator: {email}" + }, + "defibrillator-fixme": { + "question": "Gibt es einen Fehler in der Kartierung, den Sie hier nicht beheben konnten? (hinterlasse eine Notiz an OpenStreetMap-Experten)", + "render": "Zusätzliche Informationen für OpenStreetMap-Experten: {fixme}" + }, + "defibrillator-indoors": { + "mappings": { + "0": { + "then": "Dieser Defibrillator befindet sich im Gebäude" + }, + "1": { + "then": "Dieser Defibrillator befindet sich im Freien" + } + }, + "question": "Befindet sich dieser Defibrillator im Gebäude?" + }, + "defibrillator-level": { + "mappings": { + "0": { + "then": "Dieser Defibrillator befindet sich im Erdgeschoss" + }, + "1": { + "then": "Dieser Defibrillator befindet sich in der ersten Etage" + } + }, + "question": "In welchem Stockwerk befindet sich dieser Defibrillator?", + "render": "Dieser Defibrallator befindet sich im {level}. Stockwerk" + }, + "defibrillator-opening_hours": { + "mappings": { + "0": { + "then": "24/7 geöffnet (auch an Feiertagen)" + } + }, + "question": "Zu welchen Zeiten ist dieser Defibrillator verfügbar?", + "render": "{opening_hours_table(opening_hours)}" + }, + "defibrillator-phone": { + "question": "Wie lautet die Telefonnummer für Fragen zu diesem Defibrillator?", + "render": "Telefonnummer für Fragen zu diesem Defibrillator: {phone}" + }, + "defibrillator-ref": { + "question": "Wie lautet die offizielle Identifikationsnummer des Geräts? (falls am Gerät sichtbar)", + "render": "Offizielle Identifikationsnummer des Geräts: {ref}" + }, + "defibrillator-survey:date": { + "mappings": { + "0": { + "then": "Heute überprüft!" + } + }, + "question": "Wann wurde dieser Defibrillator zuletzt überprüft?", + "render": "Dieser Defibrillator wurde zuletzt am {survey:date} überprüft" + } + }, + "title": { + "render": "Defibrillator" + } + }, + "direction": { + "description": "Diese Ebene visualisiert Richtungen", + "name": "Visualisierung der Richtung" + }, + "drinking_water": { + "name": "Trinkwasserstelle", + "presets": { + "0": { + "title": "trinkwasser" + } + }, + "tagRenderings": { + "Bottle refill": { + "mappings": { + "0": { + "then": "Es ist einfach, Wasserflaschen nachzufüllen" + }, + "1": { + "then": "Wasserflaschen passen möglicherweise nicht" + } + }, + "question": "Wie einfach ist es, Wasserflaschen zu füllen?" + }, + "Still in use?": { + "mappings": { + "0": { + "then": "Diese Trinkwasserstelle funktioniert" + }, + "1": { + "then": "Diese Trinkwasserstelle ist kaputt" + }, + "2": { + "then": "Diese Trinkwasserstelle wurde geschlossen" + } + }, + "question": "Ist diese Trinkwasserstelle noch in Betrieb?", + "render": "Der Betriebsstatus ist {operational_status}/i>" + }, + "render-closest-drinking-water": { + "render": "Ein weiterer Trinkwasserbrunnen befindet sich in {_closest_other_drinking_water_distance} Meter" + } + }, + "title": { + "render": "Trinkwasserstelle" + } + }, + "etymology": { + "description": "Alle Objekte, die eine bekannte Namensherkunft haben", + "name": "Hat eine Namensherkunft", + "tagRenderings": { + "simple etymology": { + "mappings": { + "0": { + "then": "Der Ursprung dieses Namens ist in der gesamten Literatur unbekannt" + } + }, + "question": "Wonach ist dieses Objekt benannt?
    Das könnte auf einem Straßenschild stehen", + "render": "Benannt nach {name:etymology}" + }, + "wikipedia-etymology": { + "question": "Was ist das Wikidata-Element, nach dem dieses Objekt benannt ist?", + "render": "

    Wikipedia Artikel zur Namensherkunft

    {wikipedia(name:etymology:wikidata):max-height:20rem}" + } + } + }, + "food": { + "filter": { + "0": { + "options": { + "0": { + "question": "Aktuell geöffnet" + } + } + }, + "1": { + "options": { + "0": { + "question": "Hat vegetarische Speisen" + } + } + }, + "2": { + "options": { + "0": { + "question": "Bietet vegan Speisen an" + } + } + }, + "3": { + "options": { + "0": { + "question": "Hat halal Speisen" + } + } + } + }, + "name": "Restaurants und Fast Food", + "presets": { + "0": { + "description": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden", + "title": "Restaurant" + }, + "1": { + "description": "Ein Lebensmittelunternehmen, das sich auf schnellen Thekendienst und Essen zum Mitnehmen konzentriert", + "title": "Schnellimbiss" + }, + "2": { + "title": "Pommesbude" + } + }, + "tagRenderings": { + "Cuisine": { + "mappings": { + "0": { + "then": "Dies ist eine Pizzeria" + }, + "1": { + "then": "Dies ist eine Pommesbude" + }, + "2": { + "then": "Bietet vorwiegend Pastagerichte an" + } + }, + "question": "Welches Essen gibt es hier?", + "render": "An diesem Ort gibt es hauptsächlich {cuisine}" + }, + "Fastfood vs restaurant": { + "question": "Um was für ein Geschäft handelt es sich?" + }, + "Name": { + "question": "Wie heißt dieses Restaurant?", + "render": "Das Restaurant heißt {name}" + }, + "Takeaway": { + "mappings": { + "0": { + "then": "Dieses Geschäft bietet nur Artikel zur Mitnahme an" + }, + "1": { + "then": "Mitnahme möglich" + }, + "2": { + "then": "Mitnahme nicht möglich" + } + }, + "question": "Ist an diesem Ort Mitnahme möglich?" + }, + "Vegetarian (no friture)": { + "question": "Gibt es im das Restaurant vegetarische Speisen?" + }, + "friture-take-your-container": { + "mappings": { + "0": { + "then": "Sie können ihre eigenen Behälter mitbringen, um Ihre Bestellung zu erhalten, was Einwegverpackungsmaterial und damit Abfall spart" + }, + "1": { + "then": "Das Mitbringen eines eigenen Containers ist nicht erlaubt" + }, + "2": { + "then": "Sie müssen Ihren eigenen Behälter mitbringen, um hier zu bestellen." + } + }, + "question": "Wenn Sie Ihr eigenes Behältnis mitbringen (z. B. einen Kochtopf und kleine Töpfe), wird es dann zum Verpacken Ihrer Bestellung verwendet?
    " + }, + "halal (no friture)": { + "mappings": { + "0": { + "then": "Hier gibt es keine halal Speisen" + }, + "1": { + "then": "Hier gibt es wenige halal Speisen" + }, + "2": { + "then": "Es gibt halal Speisen" + }, + "3": { + "then": "Es gibt ausschließlich halal Speisen" + } + }, + "question": "Gibt es im das Restaurant halal Speisen?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Restaurant {name}" + }, + "1": { + "then": "Schnellrestaurant{name}" + } + } + } + }, + "ghost_bike": { + "name": "Geisterräder", + "presets": { + "0": { + "title": "Geisterrad" + } + }, + "tagRenderings": { + "ghost-bike-explanation": { + "render": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt wird." + }, + "ghost_bike-inscription": { + "question": "Wie lautet die Inschrift auf diesem Geisterrad?", + "render": "{inscription}" + }, + "ghost_bike-name": { + "mappings": { + "0": { + "then": "Auf dem Fahrrad ist kein Name angegeben" + } + }, + "question": "An wen erinnert dieses Geisterrad?
    Bitte respektieren Sie die Privatsphäre - geben Sie den Namen nur an, wenn er weit verbreitet oder auf dem Fahrrad markiert ist. Den Familiennamen können Sie weglassen.
    ", + "render": "Im Gedenken an {name}" + }, + "ghost_bike-source": { + "question": "Auf welcher Webseite kann man mehr Informationen über das Geisterrad oder den Unfall finden?", + "render": "Mehr Informationen" + }, + "ghost_bike-start_date": { + "question": "Wann wurde dieses Geisterrad aufgestellt?", + "render": "Aufgestellt am {start_date}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Geisterrad im Gedenken an {name}" + } + }, + "render": "Geisterrad" + } + }, + "information_board": { + "name": "Informationstafeln", + "presets": { + "0": { + "title": "informationstafel" + } + }, + "title": { + "render": "Informationstafel" + } + }, + "map": { + "description": "Eine Karte, die für Touristen gedacht ist und dauerhaft im öffentlichen Raum aufgestellt ist", + "name": "Karten", + "presets": { + "0": { + "description": "Fehlende Karte hinzufügen", + "title": "Karte" + } + }, + "tagRenderings": { + "map-attribution": { + "mappings": { + "0": { + "then": "OpenStreetMap ist eindeutig attributiert, einschließlich der ODBL-Lizenz" + }, + "1": { + "then": "OpenStreetMap ist eindeutig attributiert, aber die Lizenz wird nicht erwähnt" + }, + "2": { + "then": "OpenStreetMap wurde nicht erwähnt, aber jemand hat einen OpenStreetMap-Aufkleber darauf geklebt" + }, + "3": { + "then": "Es gibt überhaupt keine Namensnennung" + }, + "4": { + "then": "Es gibt überhaupt keine Namensnennung" + } + }, + "question": "Ist die OpenStreetMap-Attribution vorhanden?" + }, + "map-map_source": { + "mappings": { + "0": { + "then": "Diese Karte basiert auf OpenStreetMap" + } + }, + "question": "Auf welchen Daten basiert diese Karte?", + "render": "Diese Karte basiert auf {map_source}" + } + }, + "title": { + "render": "Karte" + } + }, + "nature_reserve": { + "tagRenderings": { + "Curator": { + "question": "Wer ist der Verwalter dieses Naturschutzgebietes?
    Respektieren Sie die Privatsphäre - geben Sie nur dann einen Namen an, wenn dieser allgemein bekannt ist", + "render": "{curator} ist der Pfleger dieses Naturschutzgebietes" + }, + "Dogs?": { + "mappings": { + "0": { + "then": "Hunde müssen angeleint sein" + }, + "1": { + "then": "Hunde sind nicht erlaubt" + }, + "2": { + "then": "Hunde dürfen frei herumlaufen" + } + }, + "question": "Sind Hunde in diesem Naturschutzgebiet erlaubt?" + }, + "Email": { + "question": "An welche Email-Adresse kann man sich bei Fragen und Problemen zu diesem Naturschutzgebiet wenden?
    Respektieren Sie die Privatsphäre - geben Sie nur dann eine persönliche Email-Adresse an, wenn diese allgemein bekannt ist", + "render": "{email}" + }, + "Surface area": { + "render": "Grundfläche: {_surface:ha}ha" + }, + "Website": { + "question": "Auf welcher Webseite kann man mehr Informationen über dieses Naturschutzgebiet finden?" + }, + "phone": { + "question": "Welche Telefonnummer kann man bei Fragen und Problemen zu diesem Naturschutzgebiet anrufen?
    Respektieren Sie die Privatsphäre - geben Sie nur eine Telefonnummer an, wenn diese allgemein bekannt ist", + "render": "{phone}" + } + } + }, + "observation_tower": { + "description": "Türme zur Aussicht auf die umgebende Landschaft", + "name": "Aussichtstürme", + "presets": { + "0": { + "title": "Beobachtungsturm" + } + }, + "tagRenderings": { + "Fee": { + "mappings": { + "0": { + "then": "Eintritt kostenlos" + } + }, + "question": "Was kostet der Zugang zu diesem Turm?", + "render": "Der Besuch des Turms kostet {charge}" + }, + "Height": { + "question": "Wie hoch ist dieser Turm?", + "render": "Dieser Turm ist {height} hoch" + }, + "Operator": { + "question": "Wer betreibt diesen Turm?", + "render": "Betrieben von {operator}" + }, + "name": { + "mappings": { + "0": { + "then": "Dieser Turm hat keinen eigenen Namen" + } + }, + "question": "Wie heißt dieser Turm?", + "render": "Der Name dieses Turms lautet {name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Beobachtungsturm" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " Meter" + } + } + } + } + }, + "picnic_table": { + "description": "Die Ebene zeigt Picknicktische an", + "name": "Picknick-Tische", + "presets": { + "0": { + "title": "picknicktisch" + } + }, + "tagRenderings": { + "picnic_table-material": { + "mappings": { + "0": { + "then": "Dies ist ein Picknicktisch aus Holz" + }, + "1": { + "then": "Dies ist ein Picknicktisch aus Beton" + } + }, + "question": "Aus welchem Material besteht dieser Picknicktisch?", + "render": "Dieser Picknicktisch besteht aus {material}" + } + }, + "title": { + "render": "Picknick-Tisch" + } + }, + "playground": { + "description": "Spielplätze", + "name": "Spielplätze", + "presets": { + "0": { + "title": "Spielplatz" + } + }, + "tagRenderings": { + "Playground-wheelchair": { + "mappings": { + "0": { + "then": "Vollständig zugänglich für Rollstuhlfahrer" + }, + "1": { + "then": "Eingeschränkte Zugänglichkeit für Rollstuhlfahrer" + }, + "2": { + "then": "Nicht zugänglich für Rollstuhlfahrer" + } + }, + "question": "Ist dieser Spielplatz für Rollstuhlfahrer zugänglich?" + }, + "playground-access": { + "mappings": { + "0": { + "then": "Zugänglich für die Allgemeinheit" + }, + "1": { + "then": "Zugänglich für die Allgemeinheit" + }, + "2": { + "then": "Nur für Kunden des Betreibers zugänglich" + }, + "3": { + "then": "Nur für Schüler der Schule zugänglich" + }, + "4": { + "then": "Nicht zugänglich" + } + }, + "question": "Ist dieser Spielplatz für die Allgemeinheit zugänglich?" + }, + "playground-email": { + "question": "Wie lautet die E-Mail Adresse des Spielplatzbetreuers?", + "render": "{email}" + }, + "playground-lit": { + "mappings": { + "0": { + "then": "Dieser Spielplatz ist nachts beleuchtet" + }, + "1": { + "then": "Dieser Spielplatz ist nachts nicht beleuchtet" + } + }, + "question": "Ist dieser Spielplatz nachts beleuchtet?" + }, + "playground-max_age": { + "question": "Bis zu welchem Alter dürfen Kinder auf diesem Spielplatz spielen?", + "render": "Zugang nur für Kinder bis maximal {max_age}" + }, + "playground-min_age": { + "question": "Ab welchem Alter dürfen Kinder auf diesem Spielplatz spielen?", + "render": "Zugang nur für Kinder ab {min_age} Jahren" + }, + "playground-opening_hours": { + "mappings": { + "0": { + "then": "Zugänglich von Sonnenaufgang bis Sonnenuntergang" + }, + "1": { + "then": "Immer zugänglich" + }, + "2": { + "then": "Immer zugänglich" + } + }, + "question": "Wann ist dieser Spielplatz zugänglich?" + }, + "playground-operator": { + "question": "Wer betreibt diesen Spielplatz?", + "render": "Betrieben von {operator}" + }, + "playground-phone": { + "question": "Wie lautet die Telefonnummer vom Betreiber des Spielplatzes?", + "render": "{phone}" + }, + "playground-surface": { + "mappings": { + "0": { + "then": "Die Oberfläche ist Gras" + }, + "1": { + "then": "Die Oberfläche ist Sand" + }, + "2": { + "then": "Die Oberfläche besteht aus Holzschnitzeln" + }, + "3": { + "then": "Die Oberfläche ist Pflastersteine" + }, + "4": { + "then": "Die Oberfläche ist Asphalt" + }, + "5": { + "then": "Die Oberfläche ist Beton" + }, + "6": { + "then": "Die Oberfläche ist unbefestigt" + }, + "7": { + "then": "Die Oberfläche ist befestigt" + } + }, + "question": "Welche Oberfläche hat dieser Spielplatz?
    Wenn es mehrere gibt, wähle die am häufigsten vorkommende aus", + "render": "Die Oberfläche ist {surface}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Spielplatz {name}" + } + }, + "render": "Spielplatz" + } + }, + "public_bookcase": { + "description": "Ein Bücherschrank am Straßenrand mit Büchern, für jedermann zugänglich", + "filter": { + "2": { + "options": { + "0": { + "question": "Innen oder Außen" + } + } + } + }, + "name": "Bücherschränke", + "presets": { + "0": { + "title": "Bücherschrank" + } + }, + "tagRenderings": { + "bookcase-booktypes": { + "mappings": { + "0": { + "then": "Vorwiegend Kinderbücher" + }, + "1": { + "then": "Vorwiegend Bücher für Erwachsene" + }, + "2": { + "then": "Sowohl Bücher für Kinder als auch für Erwachsene" + } + }, + "question": "Welche Art von Büchern sind in diesem öffentlichen Bücherschrank zu finden?" + }, + "bookcase-is-accessible": { + "mappings": { + "0": { + "then": "Öffentlich zugänglich" + }, + "1": { + "then": "Nur für Kunden zugänglich" + } + }, + "question": "Ist dieser öffentliche Bücherschrank frei zugänglich?" + }, + "bookcase-is-indoors": { + "mappings": { + "0": { + "then": "Dieser Bücherschrank befindet sich im Innenbereich" + }, + "1": { + "then": "Dieser Bücherschrank befindet sich im Freien" + }, + "2": { + "then": "Dieser Bücherschrank befindet sich im Freien" + } + }, + "question": "Befindet sich dieser Bücherschrank im Freien?" + }, + "public_bookcase-brand": { + "mappings": { + "0": { + "then": "Teil des Netzwerks 'Little Free Library'" + }, + "1": { + "then": "Dieser öffentliche Bücherschrank ist nicht Teil eines größeren Netzwerks" + } + }, + "question": "Ist dieser öffentliche Bücherschrank Teil eines größeren Netzwerks?", + "render": "Dieser Bücherschrank ist Teil von {brand}" + }, + "public_bookcase-capacity": { + "question": "Wie viele Bücher passen in diesen öffentlichen Bücherschrank?", + "render": "{capacity} Bücher passen in diesen Bücherschrank" + }, + "public_bookcase-name": { + "mappings": { + "0": { + "then": "Dieser Bücherschrank hat keinen Namen" + } + }, + "question": "Wie heißt dieser öffentliche Bücherschrank?", + "render": "Der Name dieses Bücherschrank lautet {name}" + }, + "public_bookcase-operator": { + "question": "Wer unterhält diesen öffentlichen Bücherschrank?", + "render": "Betrieben von {operator}" + }, + "public_bookcase-ref": { + "mappings": { + "0": { + "then": "Dieser Bücherschrank ist nicht Teil eines größeren Netzwerks" + } + }, + "question": "Wie lautet die Referenznummer dieses öffentlichen Bücherschranks?", + "render": "Die Referenznummer dieses öffentlichen Bücherschranks innerhalb {brand} lautet {ref}" + }, + "public_bookcase-start_date": { + "question": "Wann wurde dieser öffentliche Bücherschrank installiert?", + "render": "Installiert am {start_date}" + }, + "public_bookcase-website": { + "question": "Gibt es eine Website mit weiteren Informationen über diesen öffentlichen Bücherschrank?", + "render": "Weitere Informationen auf der Webseite" + } + }, + "title": { + "mappings": { + "0": { + "then": "Öffentlicher Bücherschrank {name}" + } + }, + "render": "Bücherschrank" + } + }, + "shops": { + "description": "Ein Geschäft", + "name": "Geschäft", + "presets": { + "0": { + "description": "Ein neues Geschäft hinzufügen", + "title": "Geschäft" + } + }, + "tagRenderings": { + "shops-email": { + "question": "Wie ist die Email-Adresse dieses Geschäfts?" + }, + "shops-name": { + "question": "Wie ist der Name dieses Geschäfts?" + }, + "shops-opening_hours": { + "question": "Wie sind die Öffnungszeiten dieses Geschäfts?" + }, + "shops-phone": { + "question": "Wie ist die Telefonnummer?", + "render": "{phone}" + }, + "shops-shop": { + "mappings": { + "0": { + "then": "Lebensmittelladen" + }, + "1": { + "then": "Supermarkt" + }, + "2": { + "then": "Bekleidungsgeschäft" + }, + "3": { + "then": "Friseur" + }, + "4": { + "then": "Bäckerei" + }, + "5": { + "then": "Autowerkstatt" + }, + "6": { + "then": "Autohändler" + } + }, + "question": "Was wird in diesem Geschäft verkauft?", + "render": "Dieses Geschäft verkauft {shop}" + }, + "shops-website": { + "question": "Wie lautet die Webseite dieses Geschäfts?", + "render": "{website}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "{shop}" + } + }, + "render": "Geschäft" + } + }, + "slow_roads": { + "tagRenderings": { + "slow_roads-surface": { + "mappings": { + "0": { + "then": "Die Oberfläche ist Gras" + }, + "1": { + "then": "Die Oberfläche ist Erde" + }, + "2": { + "then": "Die Oberfläche ist ohne festen Belag" + }, + "3": { + "then": "Die Oberfläche ist Sand" + }, + "4": { + "then": "Die Oberfläche ist aus Pflastersteinen" + }, + "5": { + "then": "Die Oberfläche ist Asphalt" + }, + "6": { + "then": "Die Oberfläche ist Beton" + }, + "7": { + "then": "Die Oberfläche ist gepflastert" + } + }, + "render": "Die Oberfläche ist {surface}" + } + } + }, + "sport_pitch": { + "description": "Ein Sportplatz", + "name": "Sportplätze", + "presets": { + "0": { + "title": "Tischtennisplatte" + }, + "1": { + "title": "Sportplatz" + } + }, + "tagRenderings": { + "sport-pitch-access": { + "mappings": { + "0": { + "then": "Öffentlicher Zugang" + }, + "1": { + "then": "Eingeschränkter Zugang (z. B. nur mit Termin, zu bestimmten Zeiten, ...)" + }, + "2": { + "then": "Zugang nur für Vereinsmitglieder" + }, + "3": { + "then": "Privat - kein öffentlicher Zugang" + } + }, + "question": "Ist dieser Sportplatz öffentlich zugänglich?" + }, + "sport-pitch-reservation": { + "mappings": { + "0": { + "then": "Für die Nutzung des Sportplatzes ist eine Voranmeldung erforderlich" + }, + "1": { + "then": "Für die Nutzung des Sportplatzes wird eine Voranmeldung empfohlen" + }, + "2": { + "then": "Eine Voranmeldung ist möglich, aber nicht notwendig, um diesen Sportplatz zu nutzen" + }, + "3": { + "then": "Termine nach Vereinbarung nicht möglich" + } + }, + "question": "Muss man einen Termin vereinbaren, um diesen Sportplatz zu benutzen?" + }, + "sport_pitch-email": { + "question": "Wie ist die Email-Adresse des Betreibers?" + }, + "sport_pitch-opening_hours": { + "mappings": { + "1": { + "then": "Immer zugänglich" + } + }, + "question": "Wann ist dieser Sportplatz zugänglich?" + }, + "sport_pitch-phone": { + "question": "Wie ist die Telefonnummer des Betreibers?" + }, + "sport_pitch-sport": { + "mappings": { + "0": { + "then": "Hier wird Basketball gespielt" + }, + "1": { + "then": "Hier wird Fußball gespielt" + }, + "2": { + "then": "Dies ist eine Tischtennisplatte" + }, + "3": { + "then": "Hier wird Tennis gespielt" + }, + "4": { + "then": "Hier wird Kopfball gespielt" + }, + "5": { + "then": "Hier wird Basketball gespielt" + } + }, + "question": "Welche Sportarten können hier gespielt werden?", + "render": "Hier wird {sport} gespielt" + }, + "sport_pitch-surface": { + "mappings": { + "0": { + "then": "Die Oberfläche ist Gras" + }, + "1": { + "then": "Die Oberfläche ist Sand" + }, + "2": { + "then": "Die Oberfläche ist aus Pflastersteinen" + }, + "3": { + "then": "Die Oberfläche ist Asphalt" + }, + "4": { + "then": "Die Oberfläche ist Beton" + } + }, + "question": "Was ist die Oberfläche dieses Sportplatzes?", + "render": "Die Oberfläche ist {surface}" + } + }, + "title": { + "render": "Sportplatz" + } + }, + "surveillance_camera": { + "name": "Überwachungskameras", + "tagRenderings": { + "Camera type: fixed; panning; dome": { + "mappings": { + "0": { + "then": "Eine fest montierte (nicht bewegliche) Kamera" + }, + "1": { + "then": "Eine Kuppelkamera (drehbar)" + }, + "2": { + "then": "Eine bewegliche Kamera" + } + }, + "question": "Um welche Kameratyp handelt se sich?" + }, + "Level": { + "question": "Auf welcher Ebene befindet sich diese Kamera?", + "render": "Befindet sich auf Ebene {level}" + }, + "Operator": { + "question": "Wer betreibt diese CCTV Kamera?", + "render": "Betrieben von {operator}" + }, + "Surveillance type: public, outdoor, indoor": { + "mappings": { + "0": { + "then": "Überwacht wird ein öffentlicher Bereich, z. B. eine Straße, eine Brücke, ein Platz, ein Park, ein Bahnhof, ein öffentlicher Korridor oder Tunnel,..." + }, + "1": { + "then": "Ein privater Außenbereich wird überwacht (z. B. ein Parkplatz, eine Tankstelle, ein Innenhof, ein Eingang, eine private Einfahrt, ...)" + }, + "2": { + "then": "Ein privater Innenbereich wird überwacht, z. B. ein Geschäft, eine private Tiefgarage, ..." + } + }, + "question": "Um was für eine Überwachungskamera handelt es sich" + }, + "Surveillance:zone": { + "mappings": { + "0": { + "then": "Überwacht einen Parkplatz" + }, + "1": { + "then": "Überwacht den Verkehr" + }, + "2": { + "then": "Überwacht einen Eingang" + }, + "3": { + "then": "Überwacht einen Gang" + }, + "4": { + "then": "Überwacht eine Haltestelle" + }, + "5": { + "then": "Überwacht ein Geschäft" + } + }, + "question": "Was genau wird hier überwacht?", + "render": " Überwacht ein/e {surveillance:zone}" + }, + "camera:mount": { + "mappings": { + "0": { + "then": "Diese Kamera ist an einer Wand montiert" + }, + "1": { + "then": "Diese Kamera ist an einer Stange montiert" + }, + "2": { + "then": "Diese Kamera ist an der Decke montiert" + } + }, + "question": "Wie ist diese Kamera montiert?", + "render": "Montageart: {camera:mount}" + }, + "camera_direction": { + "question": "In welche Himmelsrichtung ist diese Kamera ausgerichtet?" + }, + "is_indoor": { + "mappings": { + "0": { + "then": "Diese Kamera befindet sich im Innenraum" + }, + "1": { + "then": "Diese Kamera befindet sich im Freien" + }, + "2": { + "then": "Diese Kamera ist möglicherweise im Freien" + } + }, + "question": "Handelt es sich bei dem von dieser Kamera überwachten öffentlichen Raum um einen Innen- oder Außenbereich?" + } + }, + "title": { + "render": "Überwachungskamera" + } + }, + "toilet": { + "filter": { + "0": { + "options": { + "0": { + "question": "Rollstuhlgerecht" + } + } + }, + "1": { + "options": { + "0": { + "question": "Hat einen Wickeltisch" + } + } + }, + "2": { + "options": { + "0": { + "question": "Nutzung kostenlos" + } + } + } + }, + "name": "Toiletten", + "presets": { + "0": { + "description": "Eine öffentlich zugängliche Toilette", + "title": "toilette" + }, + "1": { + "description": "Eine Toilettenanlage mit mindestens einer rollstuhlgerechten Toilette", + "title": "toiletten mit rollstuhlgerechter Toilette" + } + }, + "tagRenderings": { + "toilet-access": { + "mappings": { + "0": { + "then": "Öffentlicher Zugang" + }, + "1": { + "then": "Nur Zugang für Kunden" + }, + "2": { + "then": "Nicht zugänglich" + }, + "3": { + "then": "Zugänglich, aber man muss einen Schlüssel für die Eingabe verlangen" + }, + "4": { + "then": "Öffentlicher Zugang" + } + }, + "question": "Sind diese Toiletten öffentlich zugänglich?", + "render": "Zugang ist {access}" + }, + "toilet-changing_table:location": { + "mappings": { + "0": { + "then": "Der Wickeltisch befindet sich in der Damentoilette. " + }, + "1": { + "then": "Der Wickeltisch befindet sich in der Herrentoilette. " + }, + "2": { + "then": "Der Wickeltisch befindet sich in der Toilette für Rollstuhlfahrer. " + }, + "3": { + "then": "Der Wickeltisch befindet sich in einem eigenen Raum. " + } + }, + "question": "Wo befindet sich der Wickeltisch?", + "render": "Die Wickeltabelle befindet sich in {changing_table:location}" + }, + "toilet-charge": { + "question": "Wie viel muss man für diese Toiletten bezahlen?", + "render": "Die Gebühr beträgt {charge}" + }, + "toilet-handwashing": { + "mappings": { + "0": { + "then": "Diese Toilette verfügt über ein Waschbecken" + }, + "1": { + "then": "Diese Toilette verfügt über kein Waschbecken" + } + }, + "question": "Verfügt diese Toilette über ein Waschbecken?" + }, + "toilet-has-paper": { + "mappings": { + "1": { + "then": "Für diese Toilette müssen Sie Ihr eigenes Toilettenpapier mitbringen" + } + }, + "question": "Muss man für diese Toilette sein eigenes Toilettenpapier mitbringen?" + }, + "toilets-changing-table": { + "mappings": { + "0": { + "then": "Ein Wickeltisch ist verfügbar" + }, + "1": { + "then": "Es ist kein Wickeltisch verfügbar" + } + }, + "question": "Ist ein Wickeltisch (zum Wechseln der Windeln) vorhanden?" + }, + "toilets-fee": { + "mappings": { + "0": { + "then": "Dies sind bezahlte Toiletten" + }, + "1": { + "then": "Kostenlose Nutzung" + } + }, + "question": "Können diese Toiletten kostenlos benutzt werden?" + }, + "toilets-type": { + "mappings": { + "0": { + "then": "Es gibt nur Sitztoiletten" + }, + "1": { + "then": "Hier gibt es nur Pissoirs" + }, + "2": { + "then": "Es gibt hier nur Hocktoiletten" + }, + "3": { + "then": "Sowohl Sitztoiletten als auch Pissoirs sind hier verfügbar" + } + }, + "question": "Welche Art von Toiletten sind das?" + }, + "toilets-wheelchair": { + "mappings": { + "0": { + "then": "Es gibt eine Toilette für Rollstuhlfahrer" + }, + "1": { + "then": "Kein Zugang für Rollstuhlfahrer" + } + }, + "question": "Gibt es eine Toilette für Rollstuhlfahrer?" + } + }, + "title": { + "render": "Toilette" + } + }, + "trail": { + "name": "Wanderwege", + "tagRenderings": { + "Color": { + "mappings": { + "0": { + "then": "Blauer Weg" + }, + "1": { + "then": "Roter Weg" + }, + "2": { + "then": "Grüner Weg" + }, + "3": { + "then": "Gelber Weg" + } + } + }, + "trail-length": { + "render": "Der Wanderweg ist {_length:km} Kilometer lang" + } + }, + "title": { + "render": "Wanderweg" + } + }, + "tree_node": { + "name": "Baum", + "presets": { + "0": { + "description": "Ein Baum mit Blättern, z. B. Eiche oder Buche.", + "title": "Laubbaum" + }, + "1": { + "description": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte.", + "title": "Nadelbaum" + }, + "2": { + "description": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt.", + "title": "Baum" + } + }, + "tagRenderings": { + "tree-decidouous": { + "mappings": { + "0": { + "then": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter." + }, + "1": { + "then": "immergrüner Baum." + } + }, + "question": "Ist dies ein Nadelbaum oder ein Laubbaum?" + }, + "tree-denotation": { + "mappings": { + "0": { + "then": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung." + }, + "1": { + "then": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört." + }, + "2": { + "then": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage." + }, + "3": { + "then": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)." + }, + "5": { + "then": "Dieser Baum steht entlang einer Straße." + }, + "7": { + "then": "Dieser Baum steht außerhalb eines städtischen Gebiets." + } + }, + "question": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft." + }, + "tree-height": { + "mappings": { + "0": { + "then": "Höhe: {height} m" + } + }, + "render": "Höhe: {height}" + }, + "tree-heritage": { + "mappings": { + "0": { + "then": "\"\"/ Als Denkmal registriert von der Onroerend Erfgoed Flandern" + }, + "1": { + "then": "Als Denkmal registriert von der Direction du Patrimoine culturel Brüssel" + }, + "2": { + "then": "Von einer anderen Organisation als Denkmal registriert" + }, + "3": { + "then": "Nicht als Denkmal registriert" + }, + "4": { + "then": "Von einer anderen Organisation als Denkmal registriert" + } + }, + "question": "Ist dieser Baum ein Naturdenkmal?" + }, + "tree-leaf_type": { + "mappings": { + "0": { + "then": "\"\"/ Laubbaum" + }, + "1": { + "then": "\"\"/ Nadelbaum" + }, + "2": { + "then": "\"\"/ Dauerhaft blattlos" + } + }, + "question": "Ist dies ein Laub- oder Nadelbaum?" + }, + "tree_node-name": { + "mappings": { + "0": { + "then": "Der Baum hat keinen Namen." + } + }, + "question": "Hat der Baum einen Namen?", + "render": "Name: {name}" + }, + "tree_node-ref:OnroerendErfgoed": { + "question": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?" + }, + "tree_node-wikidata": { + "question": "Was ist das passende Wikidata Element zu diesem Baum?", + "render": "\"\"/ Wikidata: {wikidata}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Baum" + } + }, + "viewpoint": { + "description": "Ein schöner Aussichtspunkt oder eine schöne Aussicht. Ideal zum Hinzufügen eines Bildes, wenn keine andere Kategorie passt", + "name": "Aussichtspunkt", + "presets": { + "0": { + "title": "Aussichtspunkt" + } + }, + "tagRenderings": { + "viewpoint-description": { + "question": "Möchten Sie eine Beschreibung hinzufügen?" + } + }, + "title": { + "render": "Aussichtspunkt" + } + }, + "visitor_information_centre": { + "description": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet.", + "name": "Besucherinformationszentrum", + "title": { + "mappings": { + "1": { + "then": "{name}" + } + }, + "render": "{name}" + } + }, + "waste_basket": { + "description": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können.", + "mapRendering": { + "0": { + "iconSize": { + "mappings": { + "0": { + "then": "Abfalleimer" + } + } + } + } + }, + "name": "Abfalleimer", + "presets": { + "0": { + "title": "Abfalleimer" + } + }, + "tagRenderings": { + "dispensing_dog_bags": { + "mappings": { + "0": { + "then": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel" + }, + "1": { + "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel" + }, + "2": { + "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel" + } + }, + "question": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?" + }, + "waste-basket-waste-types": { + "mappings": { + "0": { + "then": "Ein Abfalleimer für allgemeinen Müll" + }, + "1": { + "then": "Ein Abfalleimer für allgemeinen Müll" + }, + "2": { + "then": "Ein Abfalleimer für Hundekot" + }, + "3": { + "then": "Mülleimer für Zigaretten" + }, + "4": { + "then": "Mülleimer für Drogen" + }, + "5": { + "then": "Ein Abfalleimer für Nadeln und andere scharfe Gegenstände" + } + }, + "question": "Um was für einen Abfalleimer handelt es sich?" + } + }, + "title": { + "render": "Abfalleimer" + } + }, + "watermill": { + "name": "Wassermühle" + } } \ No newline at end of file diff --git a/langs/layers/en.json b/langs/layers/en.json index b7565463f8..096e4a99ef 100644 --- a/langs/layers/en.json +++ b/langs/layers/en.json @@ -1,3430 +1,4166 @@ { - "artwork": { - "description": "Diverse pieces of artwork", - "name": "Artworks", - "presets": { - "0": { - "title": "Artwork" - } + "artwork": { + "description": "Diverse pieces of artwork", + "name": "Artworks", + "presets": { + "0": { + "title": "Artwork" + } + }, + "tagRenderings": { + "artwork-artist_name": { + "question": "Which artist created this?", + "render": "Created by {artist_name}" + }, + "artwork-artwork_type": { + "mappings": { + "0": { + "then": "Architecture" + }, + "1": { + "then": "Mural" + }, + "2": { + "then": "Painting" + }, + "3": { + "then": "Sculpture" + }, + "4": { + "then": "Statue" + }, + "5": { + "then": "Bust" + }, + "6": { + "then": "Stone" + }, + "7": { + "then": "Installation" + }, + "8": { + "then": "Graffiti" + }, + "9": { + "then": "Relief" + }, + "10": { + "then": "Azulejo (Spanish decorative tilework)" + }, + "11": { + "then": "Tilework" + } }, - "tagRenderings": { - "artwork-artist_name": { - "question": "Which artist created this?", - "render": "Created by {artist_name}" - }, - "artwork-artwork_type": { - "mappings": { - "0": { - "then": "Architecture" - }, - "1": { - "then": "Mural" - }, - "2": { - "then": "Painting" - }, - "3": { - "then": "Sculpture" - }, - "4": { - "then": "Statue" - }, - "5": { - "then": "Bust" - }, - "6": { - "then": "Stone" - }, - "7": { - "then": "Installation" - }, - "8": { - "then": "Graffiti" - }, - "9": { - "then": "Relief" - }, - "10": { - "then": "Azulejo (Spanish decorative tilework)" - }, - "11": { - "then": "Tilework" - } - }, - "question": "What is the type of this artwork?", - "render": "This is a {artwork_type}" - }, - "artwork-website": { - "question": "Is there a website with more information about this artwork?", - "render": "More information on this website" - }, - "artwork-wikidata": { - "question": "Which Wikidata-entry corresponds with this artwork?", - "render": "Corresponds with {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Artwork {name}" - } - }, - "render": "Artwork" + "question": "What is the type of this artwork?", + "render": "This is a {artwork_type}" + }, + "artwork-website": { + "question": "Is there a website with more information about this artwork?", + "render": "More information on this website" + }, + "artwork-wikidata": { + "question": "Which Wikidata-entry corresponds with this artwork?", + "render": "Corresponds with {wikidata}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Artwork {name}" } - }, - "barrier": { - "description": "Obstacles while cycling, such as bollards and cycle barriers", - "name": "Barriers", - "presets": { - "0": { - "description": "A bollard in the road", - "title": "Bollard" - }, - "1": { - "description": "Cycle barrier, slowing down cyclists", - "title": "Cycle barrier" - } - }, - "tagRenderings": { - "Bollard type": { - "mappings": { - "0": { - "then": "Removable bollard" - }, - "1": { - "then": "Fixed bollard" - }, - "2": { - "then": "Bollard that can be folded down" - }, - "3": { - "then": "Flexible bollard, usually plastic" - }, - "4": { - "then": "Rising bollard" - } - }, - "question": "What kind of bollard is this?" - }, - "Cycle barrier type": { - "mappings": { - "0": { - "then": "Single, just two barriers with a space inbetween " - }, - "1": { - "then": "Double, two barriers behind each other " - }, - "2": { - "then": "Triple, three barriers behind each other " - }, - "3": { - "then": "Squeeze gate, gap is smaller at top, than at the bottom " - } - }, - "question": "What kind of cycling barrier is this?" - }, - "MaxWidth": { - "question": "How wide is the gap left over besides the barrier?", - "render": "Maximum width: {maxwidth:physical} m" - }, - "Overlap (cyclebarrier)": { - "question": "How much overlap do the barriers have?", - "render": "Overlap: {overlap} m" - }, - "Space between barrier (cyclebarrier)": { - "question": "How much space is there between the barriers (along the length of the road)?", - "render": "Space between barriers (along the length of the road): {width:separation} m" - }, - "Width of opening (cyclebarrier)": { - "question": "How wide is the smallest opening next to the barriers?", - "render": "Width of opening: {width:opening} m" - }, - "bicycle=yes/no": { - "mappings": { - "0": { - "then": "A cyclist can go past this." - }, - "1": { - "then": "A cyclist can not go past this." - } - }, - "question": "Can a bicycle go past this barrier?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Bollard" - }, - "1": { - "then": "Cycling Barrier" - } - }, - "render": "Barrier" - } - }, - "bench": { - "name": "Benches", - "presets": { - "0": { - "title": "bench" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Backrest: Yes" - }, - "1": { - "then": "Backrest: No" - } - }, - "question": "Does this bench have a backrest?", - "render": "Backrest" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "Colour: brown" - }, - "1": { - "then": "Colour: green" - }, - "2": { - "then": "Colour: gray" - }, - "3": { - "then": "Colour: white" - }, - "4": { - "then": "Colour: red" - }, - "5": { - "then": "Colour: black" - }, - "6": { - "then": "Colour: blue" - }, - "7": { - "then": "Colour: yellow" - } - }, - "question": "Which colour does this bench have?", - "render": "Colour: {colour}" - }, - "bench-direction": { - "question": "In which direction are you looking when sitting on the bench?", - "render": "When sitting on the bench, one looks towards {direction}°." - }, - "bench-material": { - "mappings": { - "0": { - "then": "Material: wood" - }, - "1": { - "then": "Material: metal" - }, - "2": { - "then": "Material: stone" - }, - "3": { - "then": "Material: concrete" - }, - "4": { - "then": "Material: plastic" - }, - "5": { - "then": "Material: steel" - } - }, - "question": "What is the bench (seating) made from?", - "render": "Material: {material}" - }, - "bench-seats": { - "question": "How many seats does this bench have?", - "render": "{seats} seats" - }, - "bench-survey:date": { - "question": "When was this bench last surveyed?", - "render": "This bench was last surveyed on {survey:date}" - } - }, - "title": { - "render": "Bench" - } - }, - "bench_at_pt": { - "name": "Benches at public transport stops", - "tagRenderings": { - "bench_at_pt-bench": { - "render": "Stand up bench" - }, - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Bench at public transport stop" - }, - "1": { - "then": "Bench in shelter" - } - }, - "render": "Bench" - } - }, - "bicycle_library": { - "description": "A facility where bicycles can be lent for longer period of times", - "name": "Bicycle library", - "presets": { - "0": { - "description": "A bicycle library has a collection of bikes which can be lent", - "title": "Fietsbibliotheek" - } - }, - "tagRenderings": { - "bicycle-library-target-group": { - "mappings": { - "0": { - "then": "Bikes for children available" - }, - "1": { - "then": "Bikes for adult available" - }, - "2": { - "then": "Bikes for disabled persons available" - } - }, - "question": "Who can lend bicycles here?" - }, - "bicycle_library-charge": { - "mappings": { - "0": { - "then": "Lending a bicycle is free" - }, - "1": { - "then": "Lending a bicycle costs €20/year and €20 warranty" - } - }, - "question": "How much does lending a bicycle cost?", - "render": "Lending a bicycle costs {charge}" - }, - "bicycle_library-name": { - "question": "What is the name of this bicycle library?", - "render": "This bicycle library is called {name}" - } - }, - "title": { - "render": "Bicycle library" - } - }, - "bicycle_tube_vending_machine": { - "name": "Bicycle tube vending machine", - "presets": { - "0": { - "title": "Bicycle tube vending machine" - } - }, - "tagRenderings": { - "Still in use?": { - "mappings": { - "0": { - "then": "This vending machine works" - }, - "1": { - "then": "This vending machine is broken" - }, - "2": { - "then": "This vending machine is closed" - } - }, - "question": "Is this vending machine still operational?", - "render": "The operational status is {operational_status" - } - }, - "title": { - "render": "Bicycle tube vending machine" - } - }, - "bike_cafe": { - "name": "Bike cafe", - "presets": { - "0": { - "title": "Bike cafe" - } - }, - "tagRenderings": { - "bike_cafe-bike-pump": { - "mappings": { - "0": { - "then": "This bike cafe offers a bike pump for anyone" - }, - "1": { - "then": "This bike cafe doesn't offer a bike pump for anyone" - } - }, - "question": "Does this bike cafe offer a bike pump for use by anyone?" - }, - "bike_cafe-email": { - "question": "What is the email address of {name}?" - }, - "bike_cafe-name": { - "question": "What is the name of this bike cafe?", - "render": "This bike cafe is called {name}" - }, - "bike_cafe-opening_hours": { - "question": "When it this bike café opened?" - }, - "bike_cafe-phone": { - "question": "What is the phone number of {name}?" - }, - "bike_cafe-repair-service": { - "mappings": { - "0": { - "then": "This bike cafe repairs bikes" - }, - "1": { - "then": "This bike cafe doesn't repair bikes" - } - }, - "question": "Does this bike cafe repair bikes?" - }, - "bike_cafe-repair-tools": { - "mappings": { - "0": { - "then": "This bike cafe offers tools for DIY repair" - }, - "1": { - "then": "This bike cafe doesn't offer tools for DIY repair" - } - }, - "question": "Are there tools here to repair your own bike?" - }, - "bike_cafe-website": { - "question": "What is the website of {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Bike cafe {name}" - } - }, - "render": "Bike cafe" - } - }, - "bike_cleaning": { - "name": "Bike cleaning service", - "presets": { - "0": { - "title": "Bike cleaning service" - } - }, - "title": { - "mappings": { - "0": { - "then": "Bike cleaning service {name}" - } - }, - "render": "Bike cleaning service" - } - }, - "bike_parking": { - "name": "Bike parking", - "presets": { - "0": { - "title": "Bike parking" - } - }, - "tagRenderings": { - "Access": { - "mappings": { - "0": { - "then": "Publicly accessible" - }, - "1": { - "then": "Access is primarily for visitors to a business" - }, - "2": { - "then": "Access is limited to members of a school, company or organisation" - } - }, - "question": "Who can use this bicycle parking?", - "render": "{access}" - }, - "Bicycle parking type": { - "mappings": { - "0": { - "then": "Staple racks " - }, - "1": { - "then": "Wheel rack/loops " - }, - "2": { - "then": "Handlebar holder " - }, - "3": { - "then": "Rack " - }, - "4": { - "then": "Two-tiered " - }, - "5": { - "then": "Shed " - }, - "6": { - "then": "Bollard " - }, - "7": { - "then": "An area on the floor which is marked for bicycle parking" - } - }, - "question": "What is the type of this bicycle parking?", - "render": "This is a bicycle parking of the type: {bicycle_parking}" - }, - "Capacity": { - "question": "How many bicycles fit in this bicycle parking (including possible cargo bicycles)?", - "render": "Place for {capacity} bikes" - }, - "Cargo bike capacity?": { - "question": "How many cargo bicycles fit in this bicycle parking?", - "render": "This parking fits {capacity:cargo_bike} cargo bikes" - }, - "Cargo bike spaces?": { - "mappings": { - "0": { - "then": "This parking has room for cargo bikes" - }, - "1": { - "then": "This parking has designated (official) spots for cargo bikes." - }, - "2": { - "then": "You're not allowed to park cargo bikes" - } - }, - "question": "Does this bicycle parking have spots for cargo bikes?" - }, - "Is covered?": { - "mappings": { - "0": { - "then": "This parking is covered (it has a roof)" - }, - "1": { - "then": "This parking is not covered" - } - }, - "question": "Is this parking covered? Also select \"covered\" for indoor parkings." - }, - "Underground?": { - "mappings": { - "0": { - "then": "Underground parking" - }, - "1": { - "then": "Underground parking" - }, - "2": { - "then": "Surface level parking" - }, - "3": { - "then": "Surface level parking" - }, - "4": { - "then": "Rooftop parking" - } - }, - "question": "What is the relative location of this bicycle parking?" - } - }, - "title": { - "render": "Bike parking" - } - }, - "bike_repair_station": { - "name": "Bike stations (repair, pump or both)", - "presets": { - "0": { - "description": "A device to inflate your tires on a fixed location in the public space.

    Examples of bicycle pumps

    ", - "title": "Bike pump" - }, - "1": { - "description": "A device with tools to repair your bike combined with a pump at a fixed location. The tools are often secured with chains against theft.

    Example

    ", - "title": "Bike repair station and pump" - }, - "2": { - "title": "Bike repair station without pump" - } - }, - "tagRenderings": { - "Email maintainer": { - "render": "Report this bicycle pump as broken" - }, - "Operational status": { - "mappings": { - "0": { - "then": "The bike pump is broken" - }, - "1": { - "then": "The bike pump is operational" - } - }, - "question": "Is the bike pump still operational?" - }, - "bike_repair_station-available-services": { - "mappings": { - "0": { - "then": "There is only a pump present" - }, - "1": { - "then": "There are only tools (screwdrivers, pliers...) present" - }, - "2": { - "then": "There are both tools and a pump present" - } - }, - "question": "Which services are available at this bike station?" - }, - "bike_repair_station-bike-chain-tool": { - "mappings": { - "0": { - "then": "There is a chain tool" - }, - "1": { - "then": "There is no chain tool" - } - }, - "question": "Does this bike repair station have a special tool to repair your bike chain?" - }, - "bike_repair_station-bike-stand": { - "mappings": { - "0": { - "then": "There is a hook or stand" - }, - "1": { - "then": "There is no hook or stand" - } - }, - "question": "Does this bike station have a hook to hang your bike on or a stand to raise it?" - }, - "bike_repair_station-electrical_pump": { - "mappings": { - "0": { - "then": "Manual pump" - }, - "1": { - "then": "Electrical pump" - } - }, - "question": "Is this an electric bike pump?" - }, - "bike_repair_station-email": { - "question": "What is the email address of the maintainer?" - }, - "bike_repair_station-manometer": { - "mappings": { - "0": { - "then": "There is a manometer" - }, - "1": { - "then": "There is no manometer" - }, - "2": { - "then": "There is manometer but it is broken" - } - }, - "question": "Does the pump have a pressure indicator or manometer?" - }, - "bike_repair_station-opening_hours": { - "mappings": { - "0": { - "then": "Always open" - }, - "1": { - "then": "Always open" - } - }, - "question": "When is this bicycle repair point open?" - }, - "bike_repair_station-operator": { - "question": "Who maintains this cycle pump?", - "render": "Maintained by {operator}" - }, - "bike_repair_station-phone": { - "question": "What is the phone number of the maintainer?" - }, - "bike_repair_station-valves": { - "mappings": { - "0": { - "then": "Sclaverand (also known as Presta)" - }, - "1": { - "then": "Dunlop" - }, - "2": { - "then": "Schrader (cars)" - } - }, - "question": "What valves are supported?", - "render": "This pump supports the following valves: {valves}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Bike repair station" - }, - "1": { - "then": "Bike repair station" - }, - "2": { - "then": "Broken pump" - }, - "3": { - "then": "Bicycle pump {name}" - }, - "4": { - "then": "Bicycle pump" - } - }, - "render": "Bike station (pump & repair)" - } - }, - "bike_shop": { - "description": "A shop specifically selling bicycles or related items", - "name": "Bike repair/shop", - "presets": { - "0": { - "title": "Bike repair/shop" - } - }, - "tagRenderings": { - "bike_repair_bike-pump-service": { - "mappings": { - "0": { - "then": "This shop offers a bike pump for anyone" - }, - "1": { - "then": "This shop doesn't offer a bike pump for anyone" - }, - "2": { - "then": "There is bicycle pump, it is shown as a separate point " - } - }, - "question": "Does this shop offer a bike pump for use by anyone?" - }, - "bike_repair_bike-wash": { - "mappings": { - "0": { - "then": "This shop cleans bicycles" - }, - "1": { - "then": "This shop has an installation where one can clean bicycles themselves" - }, - "2": { - "then": "This shop doesn't offer bicycle cleaning" - } - }, - "question": "Are bicycles washed here?" - }, - "bike_repair_rents-bikes": { - "mappings": { - "0": { - "then": "This shop rents out bikes" - }, - "1": { - "then": "This shop doesn't rent out bikes" - } - }, - "question": "Does this shop rent out bikes?" - }, - "bike_repair_repairs-bikes": { - "mappings": { - "0": { - "then": "This shop repairs bikes" - }, - "1": { - "then": "This shop doesn't repair bikes" - }, - "2": { - "then": "This shop only repairs bikes bought here" - }, - "3": { - "then": "This shop only repairs bikes of a certain brand" - } - }, - "question": "Does this shop repair bikes?" - }, - "bike_repair_second-hand-bikes": { - "mappings": { - "0": { - "then": "This shop sells second-hand bikes" - }, - "1": { - "then": "This shop doesn't sell second-hand bikes" - }, - "2": { - "then": "This shop only sells second-hand bikes" - } - }, - "question": "Does this shop sell second-hand bikes?" - }, - "bike_repair_sells-bikes": { - "mappings": { - "0": { - "then": "This shop sells bikes" - }, - "1": { - "then": "This shop doesn't sell bikes" - } - }, - "question": "Does this shop sell bikes?" - }, - "bike_repair_tools-service": { - "mappings": { - "0": { - "then": "This shop offers tools for DIY repair" - }, - "1": { - "then": "This shop doesn't offer tools for DIY repair" - }, - "2": { - "then": "Tools for DIY repair are only available if you bought/hire the bike in the shop" - } - }, - "question": "Are there tools here to repair your own bike?" - }, - "bike_shop-email": { - "question": "What is the email address of {name}?" - }, - "bike_shop-is-bicycle_shop": { - "render": "This shop is specialized in selling {shop} and does bicycle related activities" - }, - "bike_shop-name": { - "question": "What is the name of this bicycle shop?", - "render": "This bicycle shop is called {name}" - }, - "bike_shop-phone": { - "question": "What is the phone number of {name}?" - }, - "bike_shop-website": { - "question": "What is the website of {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Sport gear shop {name}" - }, - "2": { - "then": "Bicycle rental {name}" - }, - "3": { - "then": "Bike repair {name}" - }, - "4": { - "then": "Bike shop {name}" - }, - "5": { - "then": "Bike repair/shop {name}" - } - }, - "render": "Bike repair/shop" - } - }, - "bike_themed_object": { - "name": "Bike related object", - "title": { - "mappings": { - "1": { - "then": "Cycle track" - } - }, - "render": "Bike related object" - } - }, - "binocular": { - "description": "Binoculas", - "name": "Binoculars", - "presets": { - "0": { - "description": "A telescope or pair of binoculars mounted on a pole, available to the public to look around. ", - "title": "binoculars" - } - }, - "tagRenderings": { - "binocular-charge": { - "mappings": { - "0": { - "then": "Free to use" - } - }, - "question": "How much does one have to pay to use these binoculars?", - "render": "Using these binoculars costs {charge}" - }, - "binocular-direction": { - "question": "When looking through this binocular, in what direction does one look?", - "render": "Looks towards {direction}°" - } - }, - "title": { - "render": "Binoculars" - } - }, - "birdhide": { - "filter": { - "0": { - "options": { - "0": { - "question": "Wheelchair accessible" - } - } - } - } - }, - "cafe_pub": { - "filter": { - "0": { - "options": { - "0": { - "question": "Opened now" - } - } - } - }, - "name": "Cafés and pubs", - "presets": { - "0": { - "title": "pub" - }, - "1": { - "title": "bar" - }, - "2": { - "title": "cafe" - } - }, - "tagRenderings": { - "Classification": { - "question": "What kind of cafe is this" - }, - "Name": { - "question": "What is the name of this pub?", - "render": "This pub is named {name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - } - } - }, - "charging_station": { - "description": "A charging station", - "filter": { - "0": { - "options": { - "0": { - "question": "All vehicle types" - }, - "1": { - "question": "Charging station for bicycles" - }, - "2": { - "question": "Charging station for cars" - } - } - }, - "1": { - "options": { - "0": { - "question": "Only working charging stations" - } - } - }, - "2": { - "options": { - "0": { - "question": "All connectors" - }, - "1": { - "question": "Has a
    Schuko wall plug without ground pin (CEE7/4 type F)
    connector" - }, - "2": { - "question": "Has a
    European wall plug with ground pin (CEE7/4 type E)
    connector" - }, - "3": { - "question": "Has a
    Chademo
    connector" - }, - "4": { - "question": "Has a
    Type 1 with cable (J1772)
    connector" - }, - "5": { - "question": "Has a
    Type 1 without cable (J1772)
    connector" - }, - "6": { - "question": "Has a
    Type 1 CCS (aka Type 1 Combo)
    connector" - }, - "7": { - "question": "Has a
    Tesla Supercharger
    connector" - }, - "8": { - "question": "Has a
    Type 2 (mennekes)
    connector" - }, - "9": { - "question": "Has a
    Type 2 CCS (mennekes)
    connector" - }, - "10": { - "question": "Has a
    Type 2 with cable (mennekes)
    connector" - }, - "11": { - "question": "Has a
    Tesla Supercharger CCS (a branded type2_css)
    connector" - }, - "12": { - "question": "Has a
    Tesla Supercharger (destination)
    connector" - }, - "13": { - "question": "Has a
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    connector" - }, - "14": { - "question": "Has a
    USB to charge phones and small electronics
    connector" - }, - "15": { - "question": "Has a
    Bosch Active Connect with 3 pins and cable
    connector" - }, - "16": { - "question": "Has a
    Bosch Active Connect with 5 pins and cable
    connector" - } - } - } - }, - "name": "Charging stations", - "presets": { - "0": { - "title": "charging station with a normal european wall plug (meant to charge electrical bikes)" - }, - "1": { - "title": "charging station for e-bikes" - }, - "2": { - "title": "charging station for cars" - }, - "3": { - "title": "charging station" - } - }, - "tagRenderings": { - "Auth phone": { - "question": "What's the phone number for authentication call or SMS?", - "render": "Authenticate by calling or SMS'ing to {authentication:phone_call:number}" - }, - "Authentication": { - "mappings": { - "0": { - "then": "Authentication by a membership card" - }, - "1": { - "then": "Authentication by an app" - }, - "2": { - "then": "Authentication via phone call is available" - }, - "3": { - "then": "Authentication via SMS is available" - }, - "4": { - "then": "Authentication via NFC is available" - }, - "5": { - "then": "Authentication via Money Card is available" - }, - "6": { - "then": "Authentication via debit card is available" - }, - "7": { - "then": "Charging here is (also) possible without authentication" - } - }, - "question": "What kind of authentication is available at the charging station?" - }, - "Available_charging_stations (generated)": { - "mappings": { - "0": { - "then": "
    Schuko wall plug without ground pin (CEE7/4 type F)
    " - }, - "1": { - "then": "
    Schuko wall plug without ground pin (CEE7/4 type F)
    " - }, - "2": { - "then": "
    European wall plug with ground pin (CEE7/4 type E)
    " - }, - "3": { - "then": "
    European wall plug with ground pin (CEE7/4 type E)
    " - }, - "4": { - "then": "
    Chademo
    " - }, - "5": { - "then": "
    Chademo
    " - }, - "6": { - "then": "
    Type 1 with cable (J1772)
    " - }, - "7": { - "then": "
    Type 1 with cable (J1772)
    " - }, - "8": { - "then": "
    Type 1 without cable (J1772)
    " - }, - "9": { - "then": "
    Type 1 without cable (J1772)
    " - }, - "10": { - "then": "
    Type 1 CCS (aka Type 1 Combo)
    " - }, - "11": { - "then": "
    Type 1 CCS (aka Type 1 Combo)
    " - }, - "12": { - "then": "
    Tesla Supercharger
    " - }, - "13": { - "then": "
    Tesla Supercharger
    " - }, - "14": { - "then": "
    Type 2 (mennekes)
    " - }, - "15": { - "then": "
    Type 2 (mennekes)
    " - }, - "16": { - "then": "
    Type 2 CCS (mennekes)
    " - }, - "17": { - "then": "
    Type 2 CCS (mennekes)
    " - }, - "18": { - "then": "
    Type 2 with cable (mennekes)
    " - }, - "19": { - "then": "
    Type 2 with cable (mennekes)
    " - }, - "20": { - "then": "
    Tesla Supercharger CCS (a branded type2_css)
    " - }, - "21": { - "then": "
    Tesla Supercharger CCS (a branded type2_css)
    " - }, - "22": { - "then": "
    Tesla Supercharger (destination)
    " - }, - "23": { - "then": "
    Tesla Supercharger (destination)
    " - }, - "24": { - "then": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    " - }, - "25": { - "then": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    " - }, - "26": { - "then": "
    USB to charge phones and small electronics
    " - }, - "27": { - "then": "
    USB to charge phones and small electronics
    " - }, - "28": { - "then": "
    Bosch Active Connect with 3 pins and cable
    " - }, - "29": { - "then": "
    Bosch Active Connect with 3 pins and cable
    " - }, - "30": { - "then": "
    Bosch Active Connect with 5 pins and cable
    " - }, - "31": { - "then": "
    Bosch Active Connect with 5 pins and cable
    " - } - }, - "question": "Which charging connections are available here?" - }, - "Network": { - "mappings": { - "0": { - "then": "Not part of a bigger network" - }, - "1": { - "then": "Not part of a bigger network" - } - }, - "question": "Is this charging station part of a network?", - "render": "Part of the network {network}" - }, - "OH": { - "mappings": { - "0": { - "then": "24/7 opened (including holidays)" - } - }, - "question": "When is this charging station opened?" - }, - "Operational status": { - "mappings": { - "0": { - "then": "This charging station works" - }, - "1": { - "then": "This charging station is broken" - }, - "2": { - "then": "A charging station is planned here" - }, - "3": { - "then": "A charging station is constructed here" - }, - "4": { - "then": "This charging station has beed permanently disabled and is not in use anymore but is still visible" - } - }, - "question": "Is this charging point in use?" - }, - "Operator": { - "mappings": { - "0": { - "then": "Actually, {operator} is the network" - } - }, - "question": "Who is the operator of this charging station?", - "render": "This charging station is operated by {operator}" - }, - "Parking:fee": { - "mappings": { - "0": { - "then": "No additional parking cost while charging" - }, - "1": { - "then": "An additional parking fee should be paid while charging" - } - }, - "question": "Does one have to pay a parking fee while charging?" - }, - "Type": { - "mappings": { - "0": { - "then": "Bcycles can be charged here" - }, - "1": { - "then": "Cars can be charged here" - }, - "2": { - "then": "Scooters can be charged here" - }, - "3": { - "then": "Heavy good vehicles (such as trucks) can be charged here" - }, - "4": { - "then": "Buses can be charged here" - } - }, - "question": "Which vehicles are allowed to charge here?" - }, - "access": { - "mappings": { - "0": { - "then": "Anyone can use this charging station (payment might be needed)" - }, - "1": { - "then": "Anyone can use this charging station (payment might be needed)" - }, - "2": { - "then": "Only customers of the place this station belongs to can use this charging station
    E.g. a charging station operated by hotel which is only usable by their guests" - }, - "3": { - "then": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)" - } - }, - "question": "Who is allowed to use this charging station?", - "render": "Access is {access}" - }, - "capacity": { - "question": "How much vehicles can be charged here at the same time?", - "render": "{capacity} vehicles can be charged here at the same time" - }, - "charge": { - "question": "How much does one have to pay to use this charging station?", - "render": "Using this charging station costs {charge}" - }, - "email": { - "question": "What is the email address of the operator?", - "render": "In case of problems, send an email to {email}" - }, - "fee": { - "mappings": { - "0": { - "then": "Free to use" - }, - "1": { - "then": "Free to use (without authenticating)" - }, - "2": { - "then": "Free to use, but one has to authenticate" - }, - "3": { - "then": "Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station" - }, - "4": { - "then": "Paid use" - } - }, - "question": "Does one have to pay to use this charging station?" - }, - "maxstay": { - "mappings": { - "0": { - "then": "No timelimit on leaving your vehicle here" - } - }, - "question": "What is the maximum amount of time one is allowed to stay here?", - "render": "One can stay at most {canonical(maxstay)}" - }, - "payment-options": { - "override": { - "mappings+": { - "0": { - "then": "Payment is done using a dedicated app" - }, - "1": { - "then": "Payment is done using a membership card" - } - } - } - }, - "phone": { - "question": "What number can one call if there is a problem with this charging station?", - "render": "In case of problems, call {phone}" - }, - "plugs-0": { - "question": "How much plugs of type
    Schuko wall plug without ground pin (CEE7/4 type F)
    are available here?", - "render": "There are {socket:schuko} plugs of type
    Schuko wall plug without ground pin (CEE7/4 type F)
    available here" - }, - "plugs-1": { - "question": "How much plugs of type
    European wall plug with ground pin (CEE7/4 type E)
    are available here?", - "render": "There are {socket:typee} plugs of type
    European wall plug with ground pin (CEE7/4 type E)
    available here" - }, - "plugs-10": { - "question": "How much plugs of type
    Tesla Supercharger CCS (a branded type2_css)
    are available here?", - "render": "There are {socket:tesla_supercharger_ccs} plugs of type
    Tesla Supercharger CCS (a branded type2_css)
    available here" - }, - "plugs-11": { - "question": "How much plugs of type
    Tesla Supercharger (destination)
    are available here?", - "render": "There are {socket:tesla_destination} plugs of type
    Tesla Supercharger (destination)
    available here" - }, - "plugs-12": { - "question": "How much plugs of type
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    are available here?", - "render": "There are {socket:tesla_destination} plugs of type
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    available here" - }, - "plugs-13": { - "question": "How much plugs of type
    USB to charge phones and small electronics
    are available here?", - "render": "There are {socket:USB-A} plugs of type
    USB to charge phones and small electronics
    available here" - }, - "plugs-14": { - "question": "How much plugs of type
    Bosch Active Connect with 3 pins and cable
    are available here?", - "render": "There are {socket:bosch_3pin} plugs of type
    Bosch Active Connect with 3 pins and cable
    available here" - }, - "plugs-15": { - "question": "How much plugs of type
    Bosch Active Connect with 5 pins and cable
    are available here?", - "render": "There are {socket:bosch_5pin} plugs of type
    Bosch Active Connect with 5 pins and cable
    available here" - }, - "plugs-2": { - "question": "How much plugs of type
    Chademo
    are available here?", - "render": "There are {socket:chademo} plugs of type
    Chademo
    available here" - }, - "plugs-3": { - "question": "How much plugs of type
    Type 1 with cable (J1772)
    are available here?", - "render": "There are {socket:type1_cable} plugs of type
    Type 1 with cable (J1772)
    available here" - }, - "plugs-4": { - "question": "How much plugs of type
    Type 1 without cable (J1772)
    are available here?", - "render": "There are {socket:type1} plugs of type
    Type 1 without cable (J1772)
    available here" - }, - "plugs-5": { - "question": "How much plugs of type
    Type 1 CCS (aka Type 1 Combo)
    are available here?", - "render": "There are {socket:type1_combo} plugs of type
    Type 1 CCS (aka Type 1 Combo)
    available here" - }, - "plugs-6": { - "question": "How much plugs of type
    Tesla Supercharger
    are available here?", - "render": "There are {socket:tesla_supercharger} plugs of type
    Tesla Supercharger
    available here" - }, - "plugs-7": { - "question": "How much plugs of type
    Type 2 (mennekes)
    are available here?", - "render": "There are {socket:type2} plugs of type
    Type 2 (mennekes)
    available here" - }, - "plugs-8": { - "question": "How much plugs of type
    Type 2 CCS (mennekes)
    are available here?", - "render": "There are {socket:type2_combo} plugs of type
    Type 2 CCS (mennekes)
    available here" - }, - "plugs-9": { - "question": "How much plugs of type
    Type 2 with cable (mennekes)
    are available here?", - "render": "There are {socket:type2_cable} plugs of type
    Type 2 with cable (mennekes)
    available here" - }, - "ref": { - "question": "What is the reference number of this charging station?", - "render": "Reference number is {ref}" - }, - "website": { - "question": "What is the website where one can find more information about this charging station?", - "render": "More info on {website}" - } - }, - "title": { - "render": "Charging station" - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " minutes", - "humanSingular": " minute" - }, - "1": { - "human": " hours", - "humanSingular": " hour" - }, - "2": { - "human": " days", - "humanSingular": " day" - } - } - }, - "1": { - "applicableUnits": { - "0": { - "human": "Volts" - } - } - }, - "2": { - "applicableUnits": { - "0": { - "human": "A" - } - } - }, - "3": { - "applicableUnits": { - "0": { - "human": "kilowatt" - }, - "1": { - "human": "megawatt" - } - } - } - } - }, - "crossings": { - "description": "Crossings for pedestrians and cyclists", - "name": "Crossings", - "presets": { - "0": { - "description": "Crossing for pedestrians and/or cyclists", - "title": "Crossing" - }, - "1": { - "description": "Traffic signal on a road", - "title": "Traffic signal" - } - }, - "tagRenderings": { - "crossing-bicycle-allowed": { - "mappings": { - "0": { - "then": "A cyclist can use this crossing" - }, - "1": { - "then": "A cyclist can not use this crossing" - } - }, - "question": "Is this crossing also for bicycles?" - }, - "crossing-button": { - "mappings": { - "0": { - "then": "This traffic light has a button to request green light" - }, - "1": { - "then": "This traffic light does not have a button to request green light" - } - }, - "question": "Does this traffic light have a button to request green light?" - }, - "crossing-continue-through-red": { - "mappings": { - "0": { - "then": "A cyclist can go straight on if the light is red " - }, - "1": { - "then": "A cyclist can go straight on if the light is red" - }, - "2": { - "then": "A cyclist can not go straight on if the light is red" - } - }, - "question": "Can a cyclist go straight on when the light is red?" - }, - "crossing-has-island": { - "mappings": { - "0": { - "then": "This crossing has an island in the middle" - }, - "1": { - "then": "This crossing does not have an island in the middle" - } - }, - "question": "Does this crossing have an island in the middle?" - }, - "crossing-is-zebra": { - "mappings": { - "0": { - "then": "This is a zebra crossing" - }, - "1": { - "then": "This is not a zebra crossing" - } - }, - "question": "Is this is a zebra crossing?" - }, - "crossing-right-turn-through-red": { - "mappings": { - "0": { - "then": "A cyclist can turn right if the light is red " - }, - "1": { - "then": "A cyclist can turn right if the light is red" - }, - "2": { - "then": "A cyclist can not turn right if the light is red" - } - }, - "question": "Can a cyclist turn right when the light is red?" - }, - "crossing-tactile": { - "mappings": { - "0": { - "then": "This crossing has tactile paving" - }, - "1": { - "then": "This crossing does not have tactile paving" - }, - "2": { - "then": "This crossing has tactile paving, but is not correct" - } - }, - "question": "Does this crossing have tactile paving?" - }, - "crossing-type": { - "mappings": { - "0": { - "then": "Crossing, without traffic lights" - }, - "1": { - "then": "Crossing with traffic signals" - }, - "2": { - "then": "Zebra crossing" - } - }, - "question": "What kind of crossing is this?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Traffic signal" - }, - "1": { - "then": "Crossing with traffic signals" - } - }, - "render": "Crossing" - } - }, - "cycleways_and_roads": { - "name": "Cycleways and roads", - "tagRenderings": { - "Cycleway type for a road": { - "mappings": { - "0": { - "then": "There is a shared lane" - }, - "1": { - "then": "There is a lane next to the road (separated with paint)" - }, - "2": { - "then": "There is a track, but no cycleway drawn separately from this road on the map." - }, - "3": { - "then": "There is a separately drawn cycleway" - }, - "4": { - "then": "There is no cycleway" - }, - "5": { - "then": "There is no cycleway" - } - }, - "question": "What kind of cycleway is here?" - }, - "Cycleway:smoothness": { - "mappings": { - "0": { - "then": "Usable for thin rollers: rollerblade, skateboard" - }, - "1": { - "then": "Usable for thin wheels: racing bike" - }, - "2": { - "then": "Usable for normal wheels: city bike, wheelchair, scooter" - }, - "3": { - "then": "Usable for robust wheels: trekking bike, car, rickshaw" - }, - "4": { - "then": "Usable for vehicles with high clearance: light duty off-road vehicle" - }, - "5": { - "then": "Usable for off-road vehicles: heavy duty off-road vehicle" - }, - "6": { - "then": "Usable for specialized off-road vehicles: tractor, ATV" - }, - "7": { - "then": "Impassable / No wheeled vehicle" - } - }, - "question": "What is the smoothness of this cycleway?" - }, - "Cycleway:surface": { - "mappings": { - "0": { - "then": "This cycleway is unpaved" - }, - "1": { - "then": "This cycleway is paved" - }, - "2": { - "then": "This cycleway is made of asphalt" - }, - "3": { - "then": "This cycleway is made of smooth paving stones" - }, - "4": { - "then": "This cycleway is made of concrete" - }, - "5": { - "then": "This cycleway is made of cobblestone (unhewn or sett)" - }, - "6": { - "then": "This cycleway is made of raw, natural cobblestone" - }, - "7": { - "then": "This cycleway is made of flat, square cobblestone" - }, - "8": { - "then": "This cycleway is made of wood" - }, - "9": { - "then": "This cycleway is made of gravel" - }, - "10": { - "then": "This cycleway is made of fine gravel" - }, - "11": { - "then": "This cycleway is made of pebblestone" - }, - "12": { - "then": "This cycleway is made from raw ground" - } - }, - "question": "What is the surface of the cycleway made from?", - "render": "This cyleway is made of {cycleway:surface}" - }, - "Is this a cyclestreet? (For a road)": { - "mappings": { - "0": { - "then": "This is a cyclestreet, and a 30km/h zone." - }, - "1": { - "then": "This is a cyclestreet" - }, - "2": { - "then": "This is not a cyclestreet." - } - }, - "question": "Is this a cyclestreet?" - }, - "Maxspeed (for road)": { - "mappings": { - "0": { - "then": "The maximum speed is 20 km/h" - }, - "1": { - "then": "The maximum speed is 30 km/h" - }, - "2": { - "then": "The maximum speed is 50 km/h" - }, - "3": { - "then": "The maximum speed is 70 km/h" - }, - "4": { - "then": "The maximum speed is 90 km/h" - } - }, - "question": "What is the maximum speed in this street?", - "render": "The maximum speed on this road is {maxspeed} km/h" - }, - "Surface of the road": { - "mappings": { - "0": { - "then": "This cycleway is unhardened" - }, - "1": { - "then": "This cycleway is paved" - }, - "2": { - "then": "This cycleway is made of asphalt" - }, - "3": { - "then": "This cycleway is made of smooth paving stones" - }, - "4": { - "then": "This cycleway is made of concrete" - }, - "5": { - "then": "This cycleway is made of cobblestone (unhewn or sett)" - }, - "6": { - "then": "This cycleway is made of raw, natural cobblestone" - }, - "7": { - "then": "This cycleway is made of flat, square cobblestone" - }, - "8": { - "then": "This cycleway is made of wood" - }, - "9": { - "then": "This cycleway is made of gravel" - }, - "10": { - "then": "This cycleway is made of fine gravel" - }, - "11": { - "then": "This cycleway is made of pebblestone" - }, - "12": { - "then": "This cycleway is made from raw ground" - } - }, - "question": "What is the surface of the street made from?", - "render": "This road is made of {surface}" - }, - "Surface of the street": { - "mappings": { - "0": { - "then": "Usable for thin rollers: rollerblade, skateboard" - }, - "1": { - "then": "Usable for thin wheels: racing bike" - }, - "2": { - "then": "Usable for normal wheels: city bike, wheelchair, scooter" - }, - "3": { - "then": "Usable for robust wheels: trekking bike, car, rickshaw" - }, - "4": { - "then": "Usable for vehicles with high clearance: light duty off-road vehicle" - }, - "5": { - "then": "Usable for off-road vehicles: heavy duty off-road vehicle" - }, - "6": { - "then": "Usable for specialized off-road vehicles: tractor, ATV" - }, - "7": { - "then": "Impassable / No wheeled vehicle" - } - }, - "question": "What is the smoothness of this street?" - }, - "cyclelan-segregation": { - "mappings": { - "0": { - "then": "This cycleway is separated by a dashed line" - }, - "1": { - "then": "This cycleway is separated by a solid line" - }, - "2": { - "then": "This cycleway is separated by a parking lane" - }, - "3": { - "then": "This cycleway is separated by a kerb" - } - }, - "question": "How is this cycleway separated from the road?" - }, - "cycleway-lane-track-traffic-signs": { - "mappings": { - "0": { - "then": "Compulsory cycleway " - }, - "1": { - "then": "Compulsory cycleway (with supplementary sign)
    " - }, - "2": { - "then": "Segregated foot/cycleway " - }, - "3": { - "then": "Unsegregated foot/cycleway " - }, - "4": { - "then": "No traffic sign present" - } - }, - "question": "What traffic sign does this cycleway have?" - }, - "cycleway-segregation": { - "mappings": { - "0": { - "then": "This cycleway is separated by a dashed line" - }, - "1": { - "then": "This cycleway is separated by a solid line" - }, - "2": { - "then": "This cycleway is separated by a parking lane" - }, - "3": { - "then": "This cycleway is separated by a kerb" - } - }, - "question": "How is this cycleway separated from the road?" - }, - "cycleway-traffic-signs": { - "mappings": { - "0": { - "then": "Compulsory cycleway " - }, - "1": { - "then": "Compulsory cycleway (with supplementary sign)
    " - }, - "2": { - "then": "Segregated foot/cycleway " - }, - "3": { - "then": "Unsegregated foot/cycleway " - }, - "4": { - "then": "No traffic sign present" - } - }, - "question": "What traffic sign does this cycleway have?" - }, - "cycleway-traffic-signs-D7-supplementary": { - "mappings": { - "0": { - "then": "" - }, - "1": { - "then": "" - }, - "2": { - "then": "" - }, - "3": { - "then": "" - }, - "4": { - "then": "" - }, - "5": { - "then": "" - }, - "6": { - "then": "No supplementary traffic sign present" - } - }, - "question": "Does the traffic sign D7 () have a supplementary sign?" - }, - "cycleway-traffic-signs-supplementary": { - "mappings": { - "0": { - "then": "" - }, - "1": { - "then": "" - }, - "2": { - "then": "" - }, - "3": { - "then": "" - }, - "4": { - "then": "" - }, - "5": { - "then": "" - }, - "6": { - "then": "No supplementary traffic sign present" - } - }, - "question": "Does the traffic sign D7 () have a supplementary sign?" - }, - "cycleways_and_roads-cycleway:buffer": { - "question": "How wide is the gap between the cycleway and the road?", - "render": "The buffer besides this cycleway is {cycleway:buffer} m" - }, - "is lit?": { - "mappings": { - "0": { - "then": "This street is lit" - }, - "1": { - "then": "This road is not lit" - }, - "2": { - "then": "This road is lit at night" - }, - "3": { - "then": "This road is lit 24/7" - } - }, - "question": "Is this street lit?" - }, - "width:carriageway": { - "question": "What is the carriage width of this road (in meters)?
    This is measured curb to curb and thus includes the width of parallell parking lanes", - "render": "The carriage width of this road is {width:carriageway}m" - } - }, - "title": { - "mappings": { - "0": { - "then": "Cycleway" - }, - "1": { - "then": "Shared lane" - }, - "2": { - "then": "Bike lane" - }, - "3": { - "then": "Cycleway next to the road" - }, - "4": { - "then": "Cyclestreet" - } - }, - "render": "Cycleways" - } - }, - "defibrillator": { - "name": "Defibrillators", - "presets": { - "0": { - "title": "Defibrillator" - } - }, - "tagRenderings": { - "defibrillator-access": { - "mappings": { - "0": { - "then": "Publicly accessible" - }, - "1": { - "then": "Publicly accessible" - }, - "2": { - "then": "Only accessible to customers" - }, - "3": { - "then": "Not accessible to the general public (e.g. only accesible to staff, the owners, ...)" - }, - "4": { - "then": "Not accessible, possibly only for professional use" - } - }, - "question": "Is this defibrillator freely accessible?", - "render": "Access is {access}" - }, - "defibrillator-defibrillator": { - "mappings": { - "0": { - "then": "This is a manual defibrillator for professionals" - }, - "1": { - "then": "This is a normal automatic defibrillator" - } - }, - "question": "Is this a a regular automatic defibrillator or a manual defibrillator for professionals only?", - "render": "There is no info about the type of device" - }, - "defibrillator-defibrillator:location": { - "question": "Please give some explanation on where the defibrillator can be found (in the local language)", - "render": "Extra information about the location (in the local languagel):
    {defibrillator:location}" - }, - "defibrillator-defibrillator:location:en": { - "question": "Please give some explanation on where the defibrillator can be found (in English)", - "render": "Extra information about the location (in English):
    {defibrillator:location:en}" - }, - "defibrillator-defibrillator:location:fr": { - "question": "Please give some explanation on where the defibrillator can be found (in French)", - "render": "Extra information about the location (in French):
    {defibrillator:location:fr}" - }, - "defibrillator-description": { - "question": "Is there any useful information for users that you haven't been able to describe above? (leave blank if no)", - "render": "Additional information: {description}" - }, - "defibrillator-email": { - "question": "What is the email for questions about this defibrillator?", - "render": "Email for questions about this defibrillator: {email}" - }, - "defibrillator-fixme": { - "question": "Is there something wrong with how this is mapped, that you weren't able to fix here? (leave a note to OpenStreetMap experts)", - "render": "Extra information for OpenStreetMap experts: {fixme}" - }, - "defibrillator-indoors": { - "mappings": { - "0": { - "then": "This defibrillator is located indoors" - }, - "1": { - "then": "This defibrillator is located outdoors" - } - }, - "question": "Is this defibrillator located indoors?" - }, - "defibrillator-level": { - "mappings": { - "0": { - "then": "This defibrillator is on the ground floor" - }, - "1": { - "then": "This defibrillator is on the first floor" - } - }, - "question": "On which floor is this defibrillator located?", - "render": "This defibrillator is on floor {level}" - }, - "defibrillator-opening_hours": { - "mappings": { - "0": { - "then": "24/7 opened (including holidays)" - } - }, - "question": "At what times is this defibrillator available?", - "render": "{opening_hours_table(opening_hours)}" - }, - "defibrillator-phone": { - "question": "What is the phone number for questions about this defibrillator?", - "render": "Telephone for questions about this defibrillator: {phone}" - }, - "defibrillator-ref": { - "question": "What is the official identification number of the device? (if visible on device)", - "render": "Official identification number of the device: {ref}" - }, - "defibrillator-survey:date": { - "mappings": { - "0": { - "then": "Checked today!" - } - }, - "question": "When was this defibrillator last surveyed?", - "render": "This defibrillator was last surveyed on {survey:date}" - } - }, - "title": { - "render": "Defibrillator" - } - }, - "direction": { - "description": "This layer visualizes directions", - "name": "Direction visualization" - }, - "drinking_water": { - "name": "Drinking water", - "presets": { - "0": { - "title": "drinking water" - } - }, - "tagRenderings": { - "Bottle refill": { - "mappings": { - "0": { - "then": "It is easy to refill water bottles" - }, - "1": { - "then": "Water bottles may not fit" - } - }, - "question": "How easy is it to fill water bottles?" - }, - "Still in use?": { - "mappings": { - "0": { - "then": "This drinking water works" - }, - "1": { - "then": "This drinking water is broken" - }, - "2": { - "then": "This drinking water is closed" - } - }, - "question": "Is this drinking water spot still operational?", - "render": "The operational status is {operational_status" - }, - "render-closest-drinking-water": { - "render": "There is another drinking water fountain at {_closest_other_drinking_water_distance} meter" - } - }, - "title": { - "render": "Drinking water" - } - }, - "etymology": { - "description": "All objects which have an etymology known", - "name": "Has etymolgy", - "tagRenderings": { - "etymology_multi_apply": { - "render": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Auto-applying data on all segments with the same name, true)}" - }, - "simple etymology": { - "mappings": { - "0": { - "then": "The origin of this name is unknown in all literature" - } - }, - "question": "What is this object named after?
    This might be written on the street name sign", - "render": "Named after {name:etymology}" - }, - "street-name-sign-image": { - "render": "{image_carousel(image:streetsign)}
    {image_upload(image:streetsign, Add image of a street name sign)}" - }, - "wikipedia-etymology": { - "question": "What is the Wikidata-item that this object is named after?", - "render": "

    Wikipedia article of the name giver

    {wikipedia(name:etymology:wikidata):max-height:20rem}" - }, - "zoeken op inventaris onroerend erfgoed": { - "render": "Search on inventaris onroerend erfgoed" - } - } - }, - "food": { - "filter": { - "0": { - "options": { - "0": { - "question": "Opened now" - } - } - }, - "1": { - "options": { - "0": { - "question": "Has a vegetarian menu" - } - } - }, - "2": { - "options": { - "0": { - "question": "Has a vegan menu" - } - } - }, - "3": { - "options": { - "0": { - "question": "Has a halal menu" - } - } - } - }, - "name": "Restaurants and fast food", - "presets": { - "0": { - "description": "A formal eating place with sit-down facilities selling full meals served by waiters", - "title": "restaurant" - }, - "1": { - "description": "A food business concentrating on fast counter-only service and take-away food", - "title": "fastfood" - }, - "2": { - "title": "fries shop" - } - }, - "tagRenderings": { - "Cuisine": { - "mappings": { - "0": { - "then": "This is a pizzeria" - }, - "1": { - "then": "This is a friture" - }, - "2": { - "then": "Mainly serves pasta" - } - }, - "question": "Which food is served here?", - "render": "This place mostly serves {cuisine}" - }, - "Fastfood vs restaurant": { - "question": "What type of business is this?" - }, - "Name": { - "question": "What is the name of this restaurant?", - "render": "The name of this restaurant is {name}" - }, - "Takeaway": { - "mappings": { - "0": { - "then": "This is a take-away only business" - }, - "1": { - "then": "Take-away is possible here" - }, - "2": { - "then": "Take-away is not possible here" - } - }, - "question": "Does this place offer takea-way?" - }, - "Vegetarian (no friture)": { - "question": "Does this restaurant have a vegetarian option?" - }, - "friture-take-your-container": { - "mappings": { - "0": { - "then": "You can bring your own containers to get your order, saving on single-use packaging material and thus waste" - }, - "1": { - "then": "Bringing your own container is not allowed" - }, - "2": { - "then": "You must bring your own container to order here." - } - }, - "question": "If you bring your own container (such as a cooking pot and small pots), is it used to package your order?
    " - }, - "halal (no friture)": { - "mappings": { - "0": { - "then": "There are no halal options available" - }, - "1": { - "then": "There is a small halal menu" - }, - "2": { - "then": "There is a halal menu" - }, - "3": { - "then": "Only halal options are available" - } - }, - "question": "Does this restaurant offer a halal menu?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Restaurant {name}" - }, - "1": { - "then": "Fastfood {name}" - } - } - } - }, - "ghost_bike": { - "name": "Ghost bikes", - "presets": { - "0": { - "title": "Ghost bike" - } - }, - "tagRenderings": { - "ghost-bike-explanation": { - "render": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location." - }, - "ghost_bike-inscription": { - "question": "What is the inscription on this Ghost bike?", - "render": "{inscription}" - }, - "ghost_bike-name": { - "mappings": { - "0": { - "then": "No name is marked on the bike" - } - }, - "question": "Whom is remembered by this ghost bike?
    Please respect privacy - only fill out the name if it is widely published or marked on the cycle. Opt to leave out the family name.
    ", - "render": "In remembrance of {name}" - }, - "ghost_bike-source": { - "question": "On what webpage can one find more information about the Ghost bike or the accident?", - "render": "More information is available" - }, - "ghost_bike-start_date": { - "question": "When was this Ghost bike installed?", - "render": "Placed on {start_date}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Ghost bike in the remembrance of {name}" - } - }, - "render": "Ghost bike" - } - }, - "information_board": { - "name": "Information boards", - "presets": { - "0": { - "title": "information board" - } - }, - "title": { - "render": "Information board" - } - }, - "map": { - "description": "A map, meant for tourists which is permanently installed in the public space", - "name": "Maps", - "presets": { - "0": { - "description": "Add a missing map", - "title": "Map" - } - }, - "tagRenderings": { - "map-attribution": { - "mappings": { - "0": { - "then": "OpenStreetMap is clearly attributed, including the ODBL-license" - }, - "1": { - "then": "OpenStreetMap is clearly attributed, but the license is not mentioned" - }, - "2": { - "then": "OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it" - }, - "3": { - "then": "There is no attribution at all" - }, - "4": { - "then": "There is no attribution at all" - } - }, - "question": "Is the OpenStreetMap-attribution given?" - }, - "map-map_source": { - "mappings": { - "0": { - "then": "This map is based on OpenStreetMap" - } - }, - "question": "On which data is this map based?", - "render": "This map is based on {map_source}" - } - }, - "title": { - "render": "Map" - } - }, - "nature_reserve": { - "tagRenderings": { - "Curator": { - "question": "Whom is the curator of this nature reserve?
    Respect privacy - only fill out a name if this is widely published", - "render": "{curator} is the curator of this nature reserve" - }, - "Dogs?": { - "mappings": { - "0": { - "then": "Dogs have to be leashed" - }, - "1": { - "then": "No dogs allowed" - }, - "2": { - "then": "Dogs are allowed to roam freely" - } - }, - "question": "Are dogs allowed in this nature reserve?" - }, - "Email": { - "question": "What email adress can one send to with questions and problems with this nature reserve?
    Respect privacy - only fill out a personal email address if this is widely published", - "render": "{email}" - }, - "Surface area": { - "render": "Surface area: {_surface:ha}Ha" - }, - "Website": { - "question": "On which webpage can one find more information about this nature reserve?" - }, - "phone": { - "question": "What phone number can one call to with questions and problems with this nature reserve?
    Respect privacy - only fill out a personal phone number address if this is widely published", - "render": "{phone}" - } - } - }, - "observation_tower": { - "description": "Towers with a panoramic view", - "name": "Observation towers", - "presets": { - "0": { - "title": "observation tower" - } - }, - "tagRenderings": { - "Fee": { - "mappings": { - "0": { - "then": "Free to visit" - } - }, - "question": "How much does one have to pay to enter this tower?", - "render": "Visiting this tower costs {charge}" - }, - "Height": { - "question": "What is the height of this tower?", - "render": "This tower is {height} high" - }, - "Operator": { - "question": "Who maintains this tower?", - "render": "Maintained by {operator}" - }, - "name": { - "mappings": { - "0": { - "then": "This tower doesn't have a specific name" - } - }, - "question": "What is the name of this tower?", - "render": "This tower is called {name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Observation tower" - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " meter" - } - } - } - } - }, - "picnic_table": { - "description": "The layer showing picnic tables", - "name": "Picnic tables", - "presets": { - "0": { - "title": "picnic table" - } - }, - "tagRenderings": { - "picnic_table-material": { - "mappings": { - "0": { - "then": "This is a wooden picnic table" - }, - "1": { - "then": "This is a concrete picnic table" - } - }, - "question": "What material is this picnic table made of?", - "render": "This picnic table is made of {material}" - } - }, - "title": { - "render": "Picnic table" - } - }, - "playground": { - "description": "Playgrounds", - "name": "Playgrounds", - "presets": { - "0": { - "title": "Playground" - } - }, - "tagRenderings": { - "Playground-wheelchair": { - "mappings": { - "0": { - "then": "Completely accessible for wheelchair users" - }, - "1": { - "then": "Limited accessibility for wheelchair users" - }, - "2": { - "then": "Not accessible for wheelchair users" - } - }, - "question": "Is this playground accessible to wheelchair users?" - }, - "playground-access": { - "mappings": { - "0": { - "then": "Accessible to the general public" - }, - "1": { - "then": "Accessible to the general public" - }, - "2": { - "then": "Only accessible for clients of the operating business" - }, - "3": { - "then": "Only accessible to students of the school" - }, - "4": { - "then": "Not accessible" - } - }, - "question": "Is this playground accessible to the general public?" - }, - "playground-email": { - "question": "What is the email address of the playground maintainer?", - "render": "{email}" - }, - "playground-lit": { - "mappings": { - "0": { - "then": "This playground is lit at night" - }, - "1": { - "then": "This playground is not lit at night" - } - }, - "question": "Is this playground lit at night?" - }, - "playground-max_age": { - "question": "What is the maximum age allowed to access this playground?", - "render": "Accessible to kids of at most {max_age}" - }, - "playground-min_age": { - "question": "What is the minimum age required to access this playground?", - "render": "Accessible to kids older than {min_age} years" - }, - "playground-opening_hours": { - "mappings": { - "0": { - "then": "Accessible from sunrise till sunset" - }, - "1": { - "then": "Always accessible" - }, - "2": { - "then": "Always accessible" - } - }, - "question": "When is this playground accessible?" - }, - "playground-operator": { - "question": "Who operates this playground?", - "render": "Operated by {operator}" - }, - "playground-phone": { - "question": "What is the phone number of the playground maintainer?", - "render": "{phone}" - }, - "playground-surface": { - "mappings": { - "0": { - "then": "The surface is grass" - }, - "1": { - "then": "The surface is sand" - }, - "2": { - "then": "The surface consist of woodchips" - }, - "3": { - "then": "The surface is paving stones" - }, - "4": { - "then": "The surface is asphalt" - }, - "5": { - "then": "The surface is concrete" - }, - "6": { - "then": "The surface is unpaved" - }, - "7": { - "then": "The surface is paved" - } - }, - "question": "Which is the surface of this playground?
    If there are multiple, select the most occuring one", - "render": "The surface is {surface}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Playground {name}" - } - }, - "render": "Playground" - } - }, - "public_bookcase": { - "description": "A streetside cabinet with books, accessible to anyone", - "filter": { - "2": { - "options": { - "0": { - "question": "Indoor or outdoor" - } - } - } - }, - "name": "Bookcases", - "presets": { - "0": { - "title": "Bookcase" - } - }, - "tagRenderings": { - "bookcase-booktypes": { - "mappings": { - "0": { - "then": "Mostly children books" - }, - "1": { - "then": "Mostly books for adults" - }, - "2": { - "then": "Both books for kids and adults" - } - }, - "question": "What kind of books can be found in this public bookcase?" - }, - "bookcase-is-accessible": { - "mappings": { - "0": { - "then": "Publicly accessible" - }, - "1": { - "then": "Only accessible to customers" - } - }, - "question": "Is this public bookcase freely accessible?" - }, - "bookcase-is-indoors": { - "mappings": { - "0": { - "then": "This bookcase is located indoors" - }, - "1": { - "then": "This bookcase is located outdoors" - }, - "2": { - "then": "This bookcase is located outdoors" - } - }, - "question": "Is this bookcase located outdoors?" - }, - "public_bookcase-brand": { - "mappings": { - "0": { - "then": "Part of the network 'Little Free Library'" - }, - "1": { - "then": "This public bookcase is not part of a bigger network" - } - }, - "question": "Is this public bookcase part of a bigger network?", - "render": "This public bookcase is part of {brand}" - }, - "public_bookcase-capacity": { - "question": "How many books fit into this public bookcase?", - "render": "{capacity} books fit in this bookcase" - }, - "public_bookcase-name": { - "mappings": { - "0": { - "then": "This bookcase doesn't have a name" - } - }, - "question": "What is the name of this public bookcase?", - "render": "The name of this bookcase is {name}" - }, - "public_bookcase-operator": { - "question": "Who maintains this public bookcase?", - "render": "Operated by {operator}" - }, - "public_bookcase-ref": { - "mappings": { - "0": { - "then": "This bookcase is not part of a bigger network" - } - }, - "question": "What is the reference number of this public bookcase?", - "render": "The reference number of this public bookcase within {brand} is {ref}" - }, - "public_bookcase-start_date": { - "question": "When was this public bookcase installed?", - "render": "Installed on {start_date}" - }, - "public_bookcase-website": { - "question": "Is there a website with more information about this public bookcase?", - "render": "More info on the website" - } - }, - "title": { - "mappings": { - "0": { - "then": "Public bookcase {name}" - } - }, - "render": "Bookcase" - } - }, - "shops": { - "description": "A shop", - "name": "Shop", - "presets": { - "0": { - "description": "Add a new shop", - "title": "Shop" - } - }, - "tagRenderings": { - "shops-email": { - "question": "What is the email address of this shop?", - "render": "{email}" - }, - "shops-name": { - "question": "What is the name of this shop?" - }, - "shops-opening_hours": { - "question": "What are the opening hours of this shop?", - "render": "{opening_hours_table(opening_hours)}" - }, - "shops-phone": { - "question": "What is the phone number?", - "render": "{phone}" - }, - "shops-shop": { - "mappings": { - "0": { - "then": "Convenience store" - }, - "1": { - "then": "Supermarket" - }, - "2": { - "then": "Clothing store" - }, - "3": { - "then": "Hairdresser" - }, - "4": { - "then": "Bakery" - }, - "5": { - "then": "Car repair (garage)" - }, - "6": { - "then": "Car dealer" - } - }, - "question": "What does this shop sell?", - "render": "This shop sells {shop}" - }, - "shops-website": { - "question": "What is the website of this shop?", - "render": "{website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - }, - "1": { - "then": "{shop}" - } - }, - "render": "Shop" - } - }, - "slow_roads": { - "tagRenderings": { - "slow_roads-surface": { - "mappings": { - "0": { - "then": "The surface is grass" - }, - "1": { - "then": "The surface is ground" - }, - "2": { - "then": "The surface is unpaved" - }, - "3": { - "then": "The surface is sand" - }, - "4": { - "then": "The surface is paving stones" - }, - "5": { - "then": "The surface is asphalt" - }, - "6": { - "then": "The surface is concrete" - }, - "7": { - "then": "The surface is paved" - } - }, - "render": "The surface is {surface}" - } - } - }, - "sport_pitch": { - "description": "A sport pitch", - "name": "Sport pitches", - "presets": { - "0": { - "title": "Tabletennis table" - }, - "1": { - "title": "Sport pitch" - } - }, - "tagRenderings": { - "sport-pitch-access": { - "mappings": { - "0": { - "then": "Public access" - }, - "1": { - "then": "Limited access (e.g. only with an appointment, during certain hours, ...)" - }, - "2": { - "then": "Only accessible for members of the club" - }, - "3": { - "then": "Private - not accessible to the public" - } - }, - "question": "Is this sport pitch publicly accessible?" - }, - "sport-pitch-reservation": { - "mappings": { - "0": { - "then": "Making an appointment is obligatory to use this sport pitch" - }, - "1": { - "then": "Making an appointment is recommended when using this sport pitch" - }, - "2": { - "then": "Making an appointment is possible, but not necessary to use this sport pitch" - }, - "3": { - "then": "Making an appointment is not possible" - } - }, - "question": "Does one have to make an appointment to use this sport pitch?" - }, - "sport_pitch-email": { - "question": "What is the email address of the operator?" - }, - "sport_pitch-opening_hours": { - "mappings": { - "1": { - "then": "Always accessible" - } - }, - "question": "When is this pitch accessible?" - }, - "sport_pitch-phone": { - "question": "What is the phone number of the operator?" - }, - "sport_pitch-sport": { - "mappings": { - "0": { - "then": "Basketball is played here" - }, - "1": { - "then": "Soccer is played here" - }, - "2": { - "then": "This is a pingpong table" - }, - "3": { - "then": "Tennis is played here" - }, - "4": { - "then": "Korfball is played here" - }, - "5": { - "then": "Basketball is played here" - } - }, - "question": "Which sport can be played here?", - "render": "{sport} is played here" - }, - "sport_pitch-surface": { - "mappings": { - "0": { - "then": "The surface is grass" - }, - "1": { - "then": "The surface is sand" - }, - "2": { - "then": "The surface is paving stones" - }, - "3": { - "then": "The surface is asphalt" - }, - "4": { - "then": "The surface is concrete" - } - }, - "question": "Which is the surface of this sport pitch?", - "render": "The surface is {surface}" - } - }, - "title": { - "render": "Sport pitch" - } - }, - "surveillance_camera": { - "name": "Surveillance camera's", - "tagRenderings": { - "Camera type: fixed; panning; dome": { - "mappings": { - "0": { - "then": "A fixed (non-moving) camera" - }, - "1": { - "then": "A dome camera (which can turn)" - }, - "2": { - "then": "A panning camera" - } - }, - "question": "What kind of camera is this?" - }, - "Indoor camera? This isn't clear for 'public'-cameras": { - "mappings": { - "0": { - "then": "This camera is located indoors" - }, - "1": { - "then": "This camera is located outdoors" - }, - "2": { - "then": "This camera is probably located outdoors" - } - }, - "question": "Is the public space surveilled by this camera an indoor or outdoor space?" - }, - "Level": { - "question": "On which level is this camera located?", - "render": "Located on level {level}" - }, - "Operator": { - "question": "Who operates this CCTV?", - "render": "Operated by {operator}" - }, - "Surveillance type: public, outdoor, indoor": { - "mappings": { - "0": { - "then": "A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or tunnel,..." - }, - "1": { - "then": "An outdoor, yet private area is surveilled (e.g. a parking lot, a fuel station, courtyard, entrance, private driveway, ...)" - }, - "2": { - "then": "A private indoor area is surveilled, e.g. a shop, a private underground parking, ..." - } - }, - "question": "What kind of surveillance is this camera" - }, - "Surveillance:zone": { - "mappings": { - "0": { - "then": "Surveills a parking" - }, - "1": { - "then": "Surveills the traffic" - }, - "2": { - "then": "Surveills an entrance" - }, - "3": { - "then": "Surveills a corridor" - }, - "4": { - "then": "Surveills a public tranport platform" - }, - "5": { - "then": "Surveills a shop" - } - }, - "question": "What exactly is surveilled here?", - "render": " Surveills a {surveillance:zone}" - }, - "camera:mount": { - "mappings": { - "0": { - "then": "This camera is placed against a wall" - }, - "1": { - "then": "This camera is placed one a pole" - }, - "2": { - "then": "This camera is placed on the ceiling" - } - }, - "question": "How is this camera placed?", - "render": "Mounting method: {mount}" - }, - "direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view": { - "mappings": { - "0": { - "then": "Films to a compass heading of {direction}" - } - }, - "question": "In which geographical direction does this camera film?", - "render": "Films to a compass heading of {camera:direction}" - } - }, - "title": { - "render": "Surveillance Camera" - } - }, - "toilet": { - "filter": { - "0": { - "options": { - "0": { - "question": "Wheelchair accessible" - } - } - }, - "1": { - "options": { - "0": { - "question": "Has a changing table" - } - } - }, - "2": { - "options": { - "0": { - "question": "Free to use" - } - } - } - }, - "name": "Toilets", - "presets": { - "0": { - "description": "A publicly accessible toilet or restroom", - "title": "toilet" - }, - "1": { - "description": "A restroom which has at least one wheelchair-accessible toilet", - "title": "toilets with wheelchair accessible toilet" - } - }, - "tagRenderings": { - "toilet-access": { - "mappings": { - "0": { - "then": "Public access" - }, - "1": { - "then": "Only access to customers" - }, - "2": { - "then": "Not accessible" - }, - "3": { - "then": "Accessible, but one has to ask a key to enter" - }, - "4": { - "then": "Public access" - } - }, - "question": "Are these toilets publicly accessible?", - "render": "Access is {access}" - }, - "toilet-changing_table:location": { - "mappings": { - "0": { - "then": "The changing table is in the toilet for women. " - }, - "1": { - "then": "The changing table is in the toilet for men. " - }, - "2": { - "then": "The changing table is in the toilet for wheelchair users. " - }, - "3": { - "then": "The changing table is in a dedicated room. " - } - }, - "question": "Where is the changing table located?", - "render": "The changing table is located at {changing_table:location}" - }, - "toilet-charge": { - "question": "How much does one have to pay for these toilets?", - "render": "The fee is {charge}" - }, - "toilet-handwashing": { - "mappings": { - "0": { - "then": "This toilets have a sink to wash your hands" - }, - "1": { - "then": "This toilets don't have a sink to wash your hands" - } - }, - "question": "Do these toilets have a sink to wash your hands?" - }, - "toilet-has-paper": { - "mappings": { - "0": { - "then": "Toilet paper is equipped with toilet paper" - }, - "1": { - "then": "You have to bring your own toilet paper to this toilet" - } - }, - "question": "Does one have to bring their own toilet paper to this toilet?" - }, - "toilets-changing-table": { - "mappings": { - "0": { - "then": "A changing table is available" - }, - "1": { - "then": "No changing table is available" - } - }, - "question": "Is a changing table (to change diapers) available?" - }, - "toilets-fee": { - "mappings": { - "0": { - "then": "These are paid toilets" - }, - "1": { - "then": "Free to use" - } - }, - "question": "Are these toilets free to use?" - }, - "toilets-type": { - "mappings": { - "0": { - "then": "There are only seated toilets" - }, - "1": { - "then": "There are only urinals here" - }, - "2": { - "then": "There are only squat toilets here" - }, - "3": { - "then": "Both seated toilets and urinals are available here" - } - }, - "question": "Which kind of toilets are this?" - }, - "toilets-wheelchair": { - "mappings": { - "0": { - "then": "There is a dedicated toilet for wheelchair users" - }, - "1": { - "then": "No wheelchair access" - } - }, - "question": "Is there a dedicated toilet for wheelchair users" - } - }, - "title": { - "render": "Toilet" - } - }, - "trail": { - "name": "Trails", - "tagRenderings": { - "Color": { - "mappings": { - "0": { - "then": "Blue trail" - }, - "1": { - "then": "Red trail" - }, - "2": { - "then": "Green trail" - }, - "3": { - "then": "Yellow trail" - } - } - }, - "trail-length": { - "render": "The trail is {_length:km} kilometers long" - } - }, - "title": { - "render": "Trail" - } - }, - "tree_node": { - "name": "Tree", - "presets": { - "0": { - "description": "A tree of a species with leaves, such as oak or populus.", - "title": "Broadleaved tree" - }, - "1": { - "description": "A tree of a species with needles, such as pine or spruce.", - "title": "Needleleaved tree" - }, - "2": { - "description": "If you're not sure whether it's a broadleaved or needleleaved tree.", - "title": "Tree" - } - }, - "tagRenderings": { - "tree-decidouous": { - "mappings": { - "0": { - "then": "Deciduous: the tree loses its leaves for some time of the year." - }, - "1": { - "then": "Evergreen." - } - }, - "question": "Is this tree evergreen or deciduous?" - }, - "tree-denotation": { - "mappings": { - "0": { - "then": "The tree is remarkable due to its size or prominent location. It is useful for navigation." - }, - "1": { - "then": "The tree is a natural monument, e.g. because it is especially old, or of a valuable species." - }, - "2": { - "then": "The tree is used for agricultural purposes, e.g. in an orchard." - }, - "3": { - "then": "The tree is in a park or similar (cemetery, school grounds, …)." - }, - "4": { - "then": "The tree is a residential garden." - }, - "5": { - "then": "This is a tree along an avenue." - }, - "6": { - "then": "The tree is an urban area." - }, - "7": { - "then": "The tree is outside of an urban area." - } - }, - "question": "How significant is this tree? Choose the first answer that applies." - }, - "tree-height": { - "mappings": { - "0": { - "then": "Height: {height} m" - } - }, - "render": "Height: {height}" - }, - "tree-heritage": { - "mappings": { - "0": { - "then": "\"\"/ Registered as heritage by Onroerend Erfgoed Flanders" - }, - "1": { - "then": "Registered as heritage by Direction du Patrimoine culturel Brussels" - }, - "2": { - "then": "Registered as heritage by a different organisation" - }, - "3": { - "then": "Not registered as heritage" - }, - "4": { - "then": "Registered as heritage by a different organisation" - } - }, - "question": "Is this tree registered heritage?" - }, - "tree-leaf_type": { - "mappings": { - "0": { - "then": "\"\"/ Broadleaved" - }, - "1": { - "then": "\"\"/ Needleleaved" - }, - "2": { - "then": "\"\"/ Permanently leafless" - } - }, - "question": "Is this a broadleaved or needleleaved tree?" - }, - "tree_node-name": { - "mappings": { - "0": { - "then": "The tree does not have a name." - } - }, - "question": "Does the tree have a name?", - "render": "Name: {name}" - }, - "tree_node-ref:OnroerendErfgoed": { - "question": "What is the ID issued by Onroerend Erfgoed Flanders?", - "render": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}" - }, - "tree_node-wikidata": { - "question": "What is the Wikidata ID for this tree?", - "render": "\"\"/ Wikidata: {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Tree" - } - }, - "viewpoint": { - "description": "A nice viewpoint or nice view. Ideal to add an image if no other category fits", - "name": "Viewpoint", - "presets": { - "0": { - "title": "Viewpoint" - } - }, - "tagRenderings": { - "viewpoint-description": { - "question": "Do you want to add a description?" - } - }, - "title": { - "render": "Viewpoint" - } - }, - "visitor_information_centre": { - "description": "A visitor center offers information about a specific attraction or place of interest where it is located.", - "name": "Visitor Information Centre", - "title": { - "mappings": { - "1": { - "then": "{name}" - } - }, - "render": "{name}" - } - }, - "waste_basket": { - "description": "This is a public waste basket, thrash can, where you can throw away your thrash.", - "iconSize": { - "mappings": { - "0": { - "then": "Waste Basket" - } - } - }, - "name": "Waste Basket", - "presets": { - "0": { - "title": "Waste Basket" - } - }, - "tagRenderings": { - "dispensing_dog_bags": { - "mappings": { - "0": { - "then": "This waste basket has a dispenser for (dog) excrement bags" - }, - "1": { - "then": "This waste basket does not have a dispenser for (dog) excrement bags" - }, - "2": { - "then": "This waste basket does not have a dispenser for (dog) excrement bags" - } - }, - "question": "Does this waste basket have a dispenser for dog excrement bags?" - }, - "waste-basket-waste-types": { - "mappings": { - "0": { - "then": "A waste basket for general waste" - }, - "1": { - "then": "A waste basket for general waste" - }, - "2": { - "then": "A waste basket for dog excrements" - }, - "3": { - "then": "A waste basket for cigarettes" - }, - "4": { - "then": "A waste basket for drugs" - }, - "5": { - "then": "A waste basket for needles and other sharp objects" - } - }, - "question": "What kind of waste basket is this?" - } - }, - "title": { - "render": "Waste Basket" - } - }, - "watermill": { - "name": "Watermill" + }, + "render": "Artwork" } + }, + "barrier": { + "description": "Obstacles while cycling, such as bollards and cycle barriers", + "name": "Barriers", + "presets": { + "0": { + "description": "A bollard in the road", + "title": "Bollard" + }, + "1": { + "description": "Cycle barrier, slowing down cyclists", + "title": "Cycle barrier" + } + }, + "tagRenderings": { + "Bollard type": { + "mappings": { + "0": { + "then": "Removable bollard" + }, + "1": { + "then": "Fixed bollard" + }, + "2": { + "then": "Bollard that can be folded down" + }, + "3": { + "then": "Flexible bollard, usually plastic" + }, + "4": { + "then": "Rising bollard" + } + }, + "question": "What kind of bollard is this?" + }, + "Cycle barrier type": { + "mappings": { + "0": { + "then": "Single, just two barriers with a space inbetween " + }, + "1": { + "then": "Double, two barriers behind each other " + }, + "2": { + "then": "Triple, three barriers behind each other " + }, + "3": { + "then": "Squeeze gate, gap is smaller at top, than at the bottom " + } + }, + "question": "What kind of cycling barrier is this?" + }, + "MaxWidth": { + "question": "How wide is the gap left over besides the barrier?", + "render": "Maximum width: {maxwidth:physical} m" + }, + "Overlap (cyclebarrier)": { + "question": "How much overlap do the barriers have?", + "render": "Overlap: {overlap} m" + }, + "Space between barrier (cyclebarrier)": { + "question": "How much space is there between the barriers (along the length of the road)?", + "render": "Space between barriers (along the length of the road): {width:separation} m" + }, + "Width of opening (cyclebarrier)": { + "question": "How wide is the smallest opening next to the barriers?", + "render": "Width of opening: {width:opening} m" + }, + "bicycle=yes/no": { + "mappings": { + "0": { + "then": "A cyclist can go past this." + }, + "1": { + "then": "A cyclist can not go past this." + } + }, + "question": "Can a bicycle go past this barrier?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Bollard" + }, + "1": { + "then": "Cycling Barrier" + } + }, + "render": "Barrier" + } + }, + "bench": { + "name": "Benches", + "presets": { + "0": { + "title": "bench" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Backrest: Yes" + }, + "1": { + "then": "Backrest: No" + } + }, + "question": "Does this bench have a backrest?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "Colour: brown" + }, + "1": { + "then": "Colour: green" + }, + "2": { + "then": "Colour: gray" + }, + "3": { + "then": "Colour: white" + }, + "4": { + "then": "Colour: red" + }, + "5": { + "then": "Colour: black" + }, + "6": { + "then": "Colour: blue" + }, + "7": { + "then": "Colour: yellow" + } + }, + "question": "Which colour does this bench have?", + "render": "Colour: {colour}" + }, + "bench-direction": { + "question": "In which direction are you looking when sitting on the bench?", + "render": "When sitting on the bench, one looks towards {direction}°." + }, + "bench-material": { + "mappings": { + "0": { + "then": "Material: wood" + }, + "1": { + "then": "Material: metal" + }, + "2": { + "then": "Material: stone" + }, + "3": { + "then": "Material: concrete" + }, + "4": { + "then": "Material: plastic" + }, + "5": { + "then": "Material: steel" + } + }, + "question": "What is the bench (seating) made from?", + "render": "Material: {material}" + }, + "bench-seats": { + "question": "How many seats does this bench have?", + "render": "{seats} seats" + }, + "bench-survey:date": { + "question": "When was this bench last surveyed?", + "render": "This bench was last surveyed on {survey:date}" + } + }, + "title": { + "render": "Bench" + } + }, + "bench_at_pt": { + "name": "Benches at public transport stops", + "tagRenderings": { + "bench_at_pt-bench_type": { + "mappings": { + "0": { + "then": "There is a normal, sit-down bench here" + }, + "1": { + "then": "Stand up bench" + }, + "2": { + "then": "There is no bench here" + } + }, + "question": "What kind of bench is this?" + }, + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Bench at public transport stop" + }, + "1": { + "then": "Bench in shelter" + } + }, + "render": "Bench" + } + }, + "bicycle_library": { + "description": "A facility where bicycles can be lent for longer period of times", + "name": "Bicycle library", + "presets": { + "0": { + "description": "A bicycle library has a collection of bikes which can be lent", + "title": "Fietsbibliotheek" + } + }, + "tagRenderings": { + "bicycle-library-target-group": { + "mappings": { + "0": { + "then": "Bikes for children available" + }, + "1": { + "then": "Bikes for adult available" + }, + "2": { + "then": "Bikes for disabled persons available" + } + }, + "question": "Who can lend bicycles here?" + }, + "bicycle_library-charge": { + "mappings": { + "0": { + "then": "Lending a bicycle is free" + }, + "1": { + "then": "Lending a bicycle costs €20/year and €20 warranty" + } + }, + "question": "How much does lending a bicycle cost?", + "render": "Lending a bicycle costs {charge}" + }, + "bicycle_library-name": { + "question": "What is the name of this bicycle library?", + "render": "This bicycle library is called {name}" + } + }, + "title": { + "render": "Bicycle library" + } + }, + "bicycle_tube_vending_machine": { + "name": "Bicycle tube vending machine", + "presets": { + "0": { + "title": "Bicycle tube vending machine" + } + }, + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "This vending machine works" + }, + "1": { + "then": "This vending machine is broken" + }, + "2": { + "then": "This vending machine is closed" + } + }, + "question": "Is this vending machine still operational?", + "render": "The operational status is {operational_status}" + } + }, + "title": { + "render": "Bicycle tube vending machine" + } + }, + "bike_cafe": { + "name": "Bike cafe", + "presets": { + "0": { + "title": "Bike cafe" + } + }, + "tagRenderings": { + "bike_cafe-bike-pump": { + "mappings": { + "0": { + "then": "This bike cafe offers a bike pump for anyone" + }, + "1": { + "then": "This bike cafe doesn't offer a bike pump for anyone" + } + }, + "question": "Does this bike cafe offer a bike pump for use by anyone?" + }, + "bike_cafe-email": { + "question": "What is the email address of {name}?" + }, + "bike_cafe-name": { + "question": "What is the name of this bike cafe?", + "render": "This bike cafe is called {name}" + }, + "bike_cafe-opening_hours": { + "question": "When it this bike café opened?" + }, + "bike_cafe-phone": { + "question": "What is the phone number of {name}?" + }, + "bike_cafe-repair-service": { + "mappings": { + "0": { + "then": "This bike cafe repairs bikes" + }, + "1": { + "then": "This bike cafe doesn't repair bikes" + } + }, + "question": "Does this bike cafe repair bikes?" + }, + "bike_cafe-repair-tools": { + "mappings": { + "0": { + "then": "This bike cafe offers tools for DIY repair" + }, + "1": { + "then": "This bike cafe doesn't offer tools for DIY repair" + } + }, + "question": "Are there tools here to repair your own bike?" + }, + "bike_cafe-website": { + "question": "What is the website of {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Bike cafe {name}" + } + }, + "render": "Bike cafe" + } + }, + "bike_cleaning": { + "name": "Bike cleaning service", + "presets": { + "0": { + "title": "Bike cleaning service" + } + }, + "tagRenderings": { + "bike_cleaning-charge": { + "mappings": { + "0": { + "then": "Free to use cleaning service" + }, + "1": { + "then": "Free to use" + }, + "2": { + "then": "The cleaning service has a fee" + } + }, + "question": "How much does it cost to use the cleaning service?", + "render": "Using the cleaning service costs {charge}" + }, + "bike_cleaning-service:bicycle:cleaning:charge": { + "mappings": { + "0": { + "then": "The cleaning service is free to use" + }, + "1": { + "then": "Free to use" + }, + "2": { + "then": "The cleaning service has a fee, but the amount is not known" + } + }, + "question": "How much does it cost to use the cleaning service?", + "render": "Using the cleaning service costs {service:bicycle:cleaning:charge}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Bike cleaning service {name}" + } + }, + "render": "Bike cleaning service" + } + }, + "bike_parking": { + "name": "Bike parking", + "presets": { + "0": { + "title": "Bike parking" + } + }, + "tagRenderings": { + "Access": { + "mappings": { + "0": { + "then": "Publicly accessible" + }, + "1": { + "then": "Access is primarily for visitors to a business" + }, + "2": { + "then": "Access is limited to members of a school, company or organisation" + } + }, + "question": "Who can use this bicycle parking?", + "render": "{access}" + }, + "Bicycle parking type": { + "mappings": { + "0": { + "then": "Staple racks " + }, + "1": { + "then": "Wheel rack/loops " + }, + "2": { + "then": "Handlebar holder " + }, + "3": { + "then": "Rack " + }, + "4": { + "then": "Two-tiered " + }, + "5": { + "then": "Shed " + }, + "6": { + "then": "Bollard " + }, + "7": { + "then": "An area on the floor which is marked for bicycle parking" + } + }, + "question": "What is the type of this bicycle parking?", + "render": "This is a bicycle parking of the type: {bicycle_parking}" + }, + "Capacity": { + "question": "How many bicycles fit in this bicycle parking (including possible cargo bicycles)?", + "render": "Place for {capacity} bikes" + }, + "Cargo bike capacity?": { + "question": "How many cargo bicycles fit in this bicycle parking?", + "render": "This parking fits {capacity:cargo_bike} cargo bikes" + }, + "Cargo bike spaces?": { + "mappings": { + "0": { + "then": "This parking has room for cargo bikes" + }, + "1": { + "then": "This parking has designated (official) spots for cargo bikes." + }, + "2": { + "then": "You're not allowed to park cargo bikes" + } + }, + "question": "Does this bicycle parking have spots for cargo bikes?" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "This parking is covered (it has a roof)" + }, + "1": { + "then": "This parking is not covered" + } + }, + "question": "Is this parking covered? Also select \"covered\" for indoor parkings." + }, + "Underground?": { + "mappings": { + "0": { + "then": "Underground parking" + }, + "1": { + "then": "Surface level parking" + }, + "2": { + "then": "Rooftop parking" + }, + "3": { + "then": "Surface level parking" + }, + "4": { + "then": "Rooftop parking" + } + }, + "question": "What is the relative location of this bicycle parking?" + } + }, + "title": { + "render": "Bike parking" + } + }, + "bike_repair_station": { + "name": "Bike stations (repair, pump or both)", + "presets": { + "0": { + "description": "A device to inflate your tires on a fixed location in the public space.

    Examples of bicycle pumps

    ", + "title": "Bike pump" + }, + "1": { + "description": "A device with tools to repair your bike combined with a pump at a fixed location. The tools are often secured with chains against theft.

    Example

    ", + "title": "Bike repair station and pump" + }, + "2": { + "title": "Bike repair station without pump" + } + }, + "tagRenderings": { + "Email maintainer": { + "render": "Report this bicycle pump as broken" + }, + "Operational status": { + "mappings": { + "0": { + "then": "The bike pump is broken" + }, + "1": { + "then": "The bike pump is operational" + } + }, + "question": "Is the bike pump still operational?" + }, + "bike_repair_station-available-services": { + "mappings": { + "0": { + "then": "There is only a pump present" + }, + "1": { + "then": "There are only tools (screwdrivers, pliers...) present" + }, + "2": { + "then": "There are both tools and a pump present" + } + }, + "question": "Which services are available at this bike station?" + }, + "bike_repair_station-bike-chain-tool": { + "mappings": { + "0": { + "then": "There is a chain tool" + }, + "1": { + "then": "There is no chain tool" + } + }, + "question": "Does this bike repair station have a special tool to repair your bike chain?" + }, + "bike_repair_station-bike-stand": { + "mappings": { + "0": { + "then": "There is a hook or stand" + }, + "1": { + "then": "There is no hook or stand" + } + }, + "question": "Does this bike station have a hook to hang your bike on or a stand to raise it?" + }, + "bike_repair_station-electrical_pump": { + "mappings": { + "0": { + "then": "Manual pump" + }, + "1": { + "then": "Electrical pump" + } + }, + "question": "Is this an electric bike pump?" + }, + "bike_repair_station-email": { + "question": "What is the email address of the maintainer?" + }, + "bike_repair_station-manometer": { + "mappings": { + "0": { + "then": "There is a manometer" + }, + "1": { + "then": "There is no manometer" + }, + "2": { + "then": "There is manometer but it is broken" + } + }, + "question": "Does the pump have a pressure indicator or manometer?" + }, + "bike_repair_station-opening_hours": { + "mappings": { + "0": { + "then": "Always open" + }, + "1": { + "then": "Always open" + } + }, + "question": "When is this bicycle repair point open?" + }, + "bike_repair_station-operator": { + "question": "Who maintains this cycle pump?", + "render": "Maintained by {operator}" + }, + "bike_repair_station-phone": { + "question": "What is the phone number of the maintainer?" + }, + "bike_repair_station-valves": { + "mappings": { + "0": { + "then": "Sclaverand (also known as Presta)" + }, + "1": { + "then": "Dunlop" + }, + "2": { + "then": "Schrader (cars)" + } + }, + "question": "What valves are supported?", + "render": "This pump supports the following valves: {valves}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Bike repair station" + }, + "1": { + "then": "Bike repair station" + }, + "2": { + "then": "Broken pump" + }, + "3": { + "then": "Bicycle pump {name}" + }, + "4": { + "then": "Bicycle pump" + } + }, + "render": "Bike station (pump & repair)" + } + }, + "bike_shop": { + "description": "A shop specifically selling bicycles or related items", + "name": "Bike repair/shop", + "presets": { + "0": { + "title": "Bike repair/shop" + } + }, + "tagRenderings": { + "bike_repair_bike-pump-service": { + "mappings": { + "0": { + "then": "This shop offers a bike pump for anyone" + }, + "1": { + "then": "This shop doesn't offer a bike pump for anyone" + }, + "2": { + "then": "There is bicycle pump, it is shown as a separate point " + } + }, + "question": "Does this shop offer a bike pump for use by anyone?" + }, + "bike_repair_bike-wash": { + "mappings": { + "0": { + "then": "This shop cleans bicycles" + }, + "1": { + "then": "This shop has an installation where one can clean bicycles themselves" + }, + "2": { + "then": "This shop doesn't offer bicycle cleaning" + } + }, + "question": "Are bicycles washed here?" + }, + "bike_repair_rents-bikes": { + "mappings": { + "0": { + "then": "This shop rents out bikes" + }, + "1": { + "then": "This shop doesn't rent out bikes" + } + }, + "question": "Does this shop rent out bikes?" + }, + "bike_repair_repairs-bikes": { + "mappings": { + "0": { + "then": "This shop repairs bikes" + }, + "1": { + "then": "This shop doesn't repair bikes" + }, + "2": { + "then": "This shop only repairs bikes bought here" + }, + "3": { + "then": "This shop only repairs bikes of a certain brand" + } + }, + "question": "Does this shop repair bikes?" + }, + "bike_repair_second-hand-bikes": { + "mappings": { + "0": { + "then": "This shop sells second-hand bikes" + }, + "1": { + "then": "This shop doesn't sell second-hand bikes" + }, + "2": { + "then": "This shop only sells second-hand bikes" + } + }, + "question": "Does this shop sell second-hand bikes?" + }, + "bike_repair_sells-bikes": { + "mappings": { + "0": { + "then": "This shop sells bikes" + }, + "1": { + "then": "This shop doesn't sell bikes" + } + }, + "question": "Does this shop sell bikes?" + }, + "bike_repair_tools-service": { + "mappings": { + "0": { + "then": "This shop offers tools for DIY repair" + }, + "1": { + "then": "This shop doesn't offer tools for DIY repair" + }, + "2": { + "then": "Tools for DIY repair are only available if you bought/hire the bike in the shop" + } + }, + "question": "Are there tools here to repair your own bike?" + }, + "bike_shop-email": { + "question": "What is the email address of {name}?" + }, + "bike_shop-is-bicycle_shop": { + "render": "This shop is specialized in selling {shop} and does bicycle related activities" + }, + "bike_shop-name": { + "question": "What is the name of this bicycle shop?", + "render": "This bicycle shop is called {name}" + }, + "bike_shop-phone": { + "question": "What is the phone number of {name}?" + }, + "bike_shop-website": { + "question": "What is the website of {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Sport gear shop {name}" + }, + "2": { + "then": "Bicycle rental {name}" + }, + "3": { + "then": "Bike repair {name}" + }, + "4": { + "then": "Bike shop {name}" + }, + "5": { + "then": "Bike repair/shop {name}" + } + }, + "render": "Bike repair/shop" + } + }, + "bike_themed_object": { + "name": "Bike related object", + "title": { + "mappings": { + "1": { + "then": "Cycle track" + } + }, + "render": "Bike related object" + } + }, + "binocular": { + "description": "Binoculas", + "name": "Binoculars", + "presets": { + "0": { + "description": "A telescope or pair of binoculars mounted on a pole, available to the public to look around. ", + "title": "binoculars" + } + }, + "tagRenderings": { + "binocular-charge": { + "mappings": { + "0": { + "then": "Free to use" + } + }, + "question": "How much does one have to pay to use these binoculars?", + "render": "Using these binoculars costs {charge}" + }, + "binocular-direction": { + "question": "When looking through this binocular, in what direction does one look?", + "render": "Looks towards {direction}°" + } + }, + "title": { + "render": "Binoculars" + } + }, + "birdhide": { + "filter": { + "0": { + "options": { + "0": { + "question": "Wheelchair accessible" + } + } + } + } + }, + "cafe_pub": { + "filter": { + "0": { + "options": { + "0": { + "question": "Opened now" + } + } + } + }, + "name": "Cafés and pubs", + "presets": { + "0": { + "title": "pub" + }, + "1": { + "title": "bar" + }, + "2": { + "title": "cafe" + } + }, + "tagRenderings": { + "Classification": { + "question": "What kind of cafe is this" + }, + "Name": { + "question": "What is the name of this pub?", + "render": "This pub is named {name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + } + } + }, + "charging_station": { + "description": "A charging station", + "filter": { + "0": { + "options": { + "0": { + "question": "All vehicle types" + }, + "1": { + "question": "Charging station for bicycles" + }, + "2": { + "question": "Charging station for cars" + } + } + }, + "1": { + "options": { + "0": { + "question": "Only working charging stations" + } + } + }, + "2": { + "options": { + "0": { + "question": "All connectors" + }, + "1": { + "question": "Has a
    Schuko wall plug without ground pin (CEE7/4 type F)
    connector" + }, + "2": { + "question": "Has a
    European wall plug with ground pin (CEE7/4 type E)
    connector" + }, + "3": { + "question": "Has a
    Chademo
    connector" + }, + "4": { + "question": "Has a
    Type 1 with cable (J1772)
    connector" + }, + "5": { + "question": "Has a
    Type 1 without cable (J1772)
    connector" + }, + "6": { + "question": "Has a
    Type 1 CCS (aka Type 1 Combo)
    connector" + }, + "7": { + "question": "Has a
    Tesla Supercharger
    connector" + }, + "8": { + "question": "Has a
    Type 2 (mennekes)
    connector" + }, + "9": { + "question": "Has a
    Type 2 CCS (mennekes)
    connector" + }, + "10": { + "question": "Has a
    Type 2 with cable (mennekes)
    connector" + }, + "11": { + "question": "Has a
    Tesla Supercharger CCS (a branded type2_css)
    connector" + }, + "12": { + "question": "Has a
    Tesla Supercharger (destination)
    connector" + }, + "13": { + "question": "Has a
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    connector" + }, + "14": { + "question": "Has a
    USB to charge phones and small electronics
    connector" + }, + "15": { + "question": "Has a
    Bosch Active Connect with 3 pins and cable
    connector" + }, + "16": { + "question": "Has a
    Bosch Active Connect with 5 pins and cable
    connector" + } + } + } + }, + "name": "Charging stations", + "presets": { + "0": { + "title": "charging station with a normal european wall plug (meant to charge electrical bikes)" + }, + "1": { + "title": "charging station for e-bikes" + }, + "2": { + "title": "charging station for cars" + }, + "3": { + "title": "charging station" + } + }, + "tagRenderings": { + "Auth phone": { + "question": "What's the phone number for authentication call or SMS?", + "render": "Authenticate by calling or SMS'ing to {authentication:phone_call:number}" + }, + "Authentication": { + "mappings": { + "0": { + "then": "Authentication by a membership card" + }, + "1": { + "then": "Authentication by an app" + }, + "2": { + "then": "Authentication via phone call is available" + }, + "3": { + "then": "Authentication via SMS is available" + }, + "4": { + "then": "Authentication via NFC is available" + }, + "5": { + "then": "Authentication via Money Card is available" + }, + "6": { + "then": "Authentication via debit card is available" + }, + "7": { + "then": "Charging here is (also) possible without authentication" + } + }, + "question": "What kind of authentication is available at the charging station?" + }, + "Available_charging_stations (generated)": { + "mappings": { + "0": { + "then": "
    Schuko wall plug without ground pin (CEE7/4 type F)
    " + }, + "1": { + "then": "
    Schuko wall plug without ground pin (CEE7/4 type F)
    " + }, + "2": { + "then": "
    European wall plug with ground pin (CEE7/4 type E)
    " + }, + "3": { + "then": "
    European wall plug with ground pin (CEE7/4 type E)
    " + }, + "4": { + "then": "
    Chademo
    " + }, + "5": { + "then": "
    Chademo
    " + }, + "6": { + "then": "
    Type 1 with cable (J1772)
    " + }, + "7": { + "then": "
    Type 1 with cable (J1772)
    " + }, + "8": { + "then": "
    Type 1 without cable (J1772)
    " + }, + "9": { + "then": "
    Type 1 without cable (J1772)
    " + }, + "10": { + "then": "
    Type 1 CCS (aka Type 1 Combo)
    " + }, + "11": { + "then": "
    Type 1 CCS (aka Type 1 Combo)
    " + }, + "12": { + "then": "
    Tesla Supercharger
    " + }, + "13": { + "then": "
    Tesla Supercharger
    " + }, + "14": { + "then": "
    Type 2 (mennekes)
    " + }, + "15": { + "then": "
    Type 2 (mennekes)
    " + }, + "16": { + "then": "
    Type 2 CCS (mennekes)
    " + }, + "17": { + "then": "
    Type 2 CCS (mennekes)
    " + }, + "18": { + "then": "
    Type 2 with cable (mennekes)
    " + }, + "19": { + "then": "
    Type 2 with cable (mennekes)
    " + }, + "20": { + "then": "
    Tesla Supercharger CCS (a branded type2_css)
    " + }, + "21": { + "then": "
    Tesla Supercharger CCS (a branded type2_css)
    " + }, + "22": { + "then": "
    Tesla Supercharger (destination)
    " + }, + "23": { + "then": "
    Tesla Supercharger (destination)
    " + }, + "24": { + "then": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    " + }, + "25": { + "then": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    " + }, + "26": { + "then": "
    USB to charge phones and small electronics
    " + }, + "27": { + "then": "
    USB to charge phones and small electronics
    " + }, + "28": { + "then": "
    Bosch Active Connect with 3 pins and cable
    " + }, + "29": { + "then": "
    Bosch Active Connect with 3 pins and cable
    " + }, + "30": { + "then": "
    Bosch Active Connect with 5 pins and cable
    " + }, + "31": { + "then": "
    Bosch Active Connect with 5 pins and cable
    " + } + }, + "question": "Which charging connections are available here?" + }, + "Network": { + "mappings": { + "0": { + "then": "Not part of a bigger network" + }, + "1": { + "then": "Not part of a bigger network" + } + }, + "question": "Is this charging station part of a network?", + "render": "Part of the network {network}" + }, + "OH": { + "mappings": { + "0": { + "then": "24/7 opened (including holidays)" + } + }, + "question": "When is this charging station opened?" + }, + "Operational status": { + "mappings": { + "0": { + "then": "This charging station works" + }, + "1": { + "then": "This charging station is broken" + }, + "2": { + "then": "A charging station is planned here" + }, + "3": { + "then": "A charging station is constructed here" + }, + "4": { + "then": "This charging station has beed permanently disabled and is not in use anymore but is still visible" + } + }, + "question": "Is this charging point in use?" + }, + "Operator": { + "mappings": { + "0": { + "then": "Actually, {operator} is the network" + } + }, + "question": "Who is the operator of this charging station?", + "render": "This charging station is operated by {operator}" + }, + "Parking:fee": { + "mappings": { + "0": { + "then": "No additional parking cost while charging" + }, + "1": { + "then": "An additional parking fee should be paid while charging" + } + }, + "question": "Does one have to pay a parking fee while charging?" + }, + "Type": { + "mappings": { + "0": { + "then": "Bcycles can be charged here" + }, + "1": { + "then": "Cars can be charged here" + }, + "2": { + "then": "Scooters can be charged here" + }, + "3": { + "then": "Heavy good vehicles (such as trucks) can be charged here" + }, + "4": { + "then": "Buses can be charged here" + } + }, + "question": "Which vehicles are allowed to charge here?" + }, + "access": { + "mappings": { + "0": { + "then": "Anyone can use this charging station (payment might be needed)" + }, + "1": { + "then": "Anyone can use this charging station (payment might be needed)" + }, + "2": { + "then": "Only customers of the place this station belongs to can use this charging station
    E.g. a charging station operated by hotel which is only usable by their guests" + }, + "3": { + "then": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)" + } + }, + "question": "Who is allowed to use this charging station?", + "render": "Access is {access}" + }, + "capacity": { + "question": "How much vehicles can be charged here at the same time?", + "render": "{capacity} vehicles can be charged here at the same time" + }, + "charge": { + "question": "How much does one have to pay to use this charging station?", + "render": "Using this charging station costs {charge}" + }, + "current-0": { + "mappings": { + "0": { + "then": "
    Schuko wall plug without ground pin (CEE7/4 type F)
    outputs at most 16 A" + } + }, + "question": "What current do the plugs with
    Schuko wall plug without ground pin (CEE7/4 type F)
    offer?", + "render": "
    Schuko wall plug without ground pin (CEE7/4 type F)
    outputs at most {socket:schuko:current}A" + }, + "current-1": { + "mappings": { + "0": { + "then": "
    European wall plug with ground pin (CEE7/4 type E)
    outputs at most 16 A" + } + }, + "question": "What current do the plugs with
    European wall plug with ground pin (CEE7/4 type E)
    offer?", + "render": "
    European wall plug with ground pin (CEE7/4 type E)
    outputs at most {socket:typee:current}A" + }, + "current-10": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger CCS (a branded type2_css)
    outputs at most 125 A" + }, + "1": { + "then": "
    Tesla Supercharger CCS (a branded type2_css)
    outputs at most 350 A" + } + }, + "question": "What current do the plugs with
    Tesla Supercharger CCS (a branded type2_css)
    offer?", + "render": "
    Tesla Supercharger CCS (a branded type2_css)
    outputs at most {socket:tesla_supercharger_ccs:current}A" + }, + "current-11": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger (destination)
    outputs at most 125 A" + }, + "1": { + "then": "
    Tesla Supercharger (destination)
    outputs at most 350 A" + } + }, + "question": "What current do the plugs with
    Tesla Supercharger (destination)
    offer?", + "render": "
    Tesla Supercharger (destination)
    outputs at most {socket:tesla_destination:current}A" + }, + "current-12": { + "mappings": { + "0": { + "then": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    outputs at most 16 A" + }, + "1": { + "then": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    outputs at most 32 A" + } + }, + "question": "What current do the plugs with
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    offer?", + "render": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    outputs at most {socket:tesla_destination:current}A" + }, + "current-13": { + "mappings": { + "0": { + "then": "
    USB to charge phones and small electronics
    outputs at most 1 A" + }, + "1": { + "then": "
    USB to charge phones and small electronics
    outputs at most 2 A" + } + }, + "question": "What current do the plugs with
    USB to charge phones and small electronics
    offer?", + "render": "
    USB to charge phones and small electronics
    outputs at most {socket:USB-A:current}A" + }, + "current-14": { + "question": "What current do the plugs with
    Bosch Active Connect with 3 pins and cable
    offer?", + "render": "
    Bosch Active Connect with 3 pins and cable
    outputs at most {socket:bosch_3pin:current}A" + }, + "current-15": { + "question": "What current do the plugs with
    Bosch Active Connect with 5 pins and cable
    offer?", + "render": "
    Bosch Active Connect with 5 pins and cable
    outputs at most {socket:bosch_5pin:current}A" + }, + "current-2": { + "mappings": { + "0": { + "then": "
    Chademo
    outputs at most 120 A" + } + }, + "question": "What current do the plugs with
    Chademo
    offer?", + "render": "
    Chademo
    outputs at most {socket:chademo:current}A" + }, + "current-3": { + "mappings": { + "0": { + "then": "
    Type 1 with cable (J1772)
    outputs at most 32 A" + } + }, + "question": "What current do the plugs with
    Type 1 with cable (J1772)
    offer?", + "render": "
    Type 1 with cable (J1772)
    outputs at most {socket:type1_cable:current}A" + }, + "current-4": { + "mappings": { + "0": { + "then": "
    Type 1 without cable (J1772)
    outputs at most 32 A" + } + }, + "question": "What current do the plugs with
    Type 1 without cable (J1772)
    offer?", + "render": "
    Type 1 without cable (J1772)
    outputs at most {socket:type1:current}A" + }, + "current-5": { + "mappings": { + "0": { + "then": "
    Type 1 CCS (aka Type 1 Combo)
    outputs at most 50 A" + }, + "1": { + "then": "
    Type 1 CCS (aka Type 1 Combo)
    outputs at most 125 A" + } + }, + "question": "What current do the plugs with
    Type 1 CCS (aka Type 1 Combo)
    offer?", + "render": "
    Type 1 CCS (aka Type 1 Combo)
    outputs at most {socket:type1_combo:current}A" + }, + "current-6": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger
    outputs at most 125 A" + }, + "1": { + "then": "
    Tesla Supercharger
    outputs at most 350 A" + } + }, + "question": "What current do the plugs with
    Tesla Supercharger
    offer?", + "render": "
    Tesla Supercharger
    outputs at most {socket:tesla_supercharger:current}A" + }, + "current-7": { + "mappings": { + "0": { + "then": "
    Type 2 (mennekes)
    outputs at most 16 A" + }, + "1": { + "then": "
    Type 2 (mennekes)
    outputs at most 32 A" + } + }, + "question": "What current do the plugs with
    Type 2 (mennekes)
    offer?", + "render": "
    Type 2 (mennekes)
    outputs at most {socket:type2:current}A" + }, + "current-8": { + "mappings": { + "0": { + "then": "
    Type 2 CCS (mennekes)
    outputs at most 125 A" + }, + "1": { + "then": "
    Type 2 CCS (mennekes)
    outputs at most 350 A" + } + }, + "question": "What current do the plugs with
    Type 2 CCS (mennekes)
    offer?", + "render": "
    Type 2 CCS (mennekes)
    outputs at most {socket:type2_combo:current}A" + }, + "current-9": { + "mappings": { + "0": { + "then": "
    Type 2 with cable (mennekes)
    outputs at most 16 A" + }, + "1": { + "then": "
    Type 2 with cable (mennekes)
    outputs at most 32 A" + } + }, + "question": "What current do the plugs with
    Type 2 with cable (mennekes)
    offer?", + "render": "
    Type 2 with cable (mennekes)
    outputs at most {socket:type2_cable:current}A" + }, + "email": { + "question": "What is the email address of the operator?", + "render": "In case of problems, send an email to {email}" + }, + "fee": { + "mappings": { + "0": { + "then": "Free to use" + }, + "1": { + "then": "Free to use (without authenticating)" + }, + "2": { + "then": "Free to use, but one has to authenticate" + }, + "3": { + "then": "Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station" + }, + "4": { + "then": "Paid use" + } + }, + "question": "Does one have to pay to use this charging station?" + }, + "maxstay": { + "mappings": { + "0": { + "then": "No timelimit on leaving your vehicle here" + } + }, + "question": "What is the maximum amount of time one is allowed to stay here?", + "render": "One can stay at most {canonical(maxstay)}" + }, + "payment-options": { + "override": { + "mappings+": { + "0": { + "then": "Payment is done using a dedicated app" + }, + "1": { + "then": "Payment is done using a membership card" + } + } + } + }, + "phone": { + "question": "What number can one call if there is a problem with this charging station?", + "render": "In case of problems, call {phone}" + }, + "plugs-0": { + "question": "How much plugs of type
    Schuko wall plug without ground pin (CEE7/4 type F)
    are available here?", + "render": "There are {socket:schuko} plugs of type
    Schuko wall plug without ground pin (CEE7/4 type F)
    available here" + }, + "plugs-1": { + "question": "How much plugs of type
    European wall plug with ground pin (CEE7/4 type E)
    are available here?", + "render": "There are {socket:typee} plugs of type
    European wall plug with ground pin (CEE7/4 type E)
    available here" + }, + "plugs-10": { + "question": "How much plugs of type
    Tesla Supercharger CCS (a branded type2_css)
    are available here?", + "render": "There are {socket:tesla_supercharger_ccs} plugs of type
    Tesla Supercharger CCS (a branded type2_css)
    available here" + }, + "plugs-11": { + "question": "How much plugs of type
    Tesla Supercharger (destination)
    are available here?", + "render": "There are {socket:tesla_destination} plugs of type
    Tesla Supercharger (destination)
    available here" + }, + "plugs-12": { + "question": "How much plugs of type
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    are available here?", + "render": "There are {socket:tesla_destination} plugs of type
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    available here" + }, + "plugs-13": { + "question": "How much plugs of type
    USB to charge phones and small electronics
    are available here?", + "render": "There are {socket:USB-A} plugs of type
    USB to charge phones and small electronics
    available here" + }, + "plugs-14": { + "question": "How much plugs of type
    Bosch Active Connect with 3 pins and cable
    are available here?", + "render": "There are {socket:bosch_3pin} plugs of type
    Bosch Active Connect with 3 pins and cable
    available here" + }, + "plugs-15": { + "question": "How much plugs of type
    Bosch Active Connect with 5 pins and cable
    are available here?", + "render": "There are {socket:bosch_5pin} plugs of type
    Bosch Active Connect with 5 pins and cable
    available here" + }, + "plugs-2": { + "question": "How much plugs of type
    Chademo
    are available here?", + "render": "There are {socket:chademo} plugs of type
    Chademo
    available here" + }, + "plugs-3": { + "question": "How much plugs of type
    Type 1 with cable (J1772)
    are available here?", + "render": "There are {socket:type1_cable} plugs of type
    Type 1 with cable (J1772)
    available here" + }, + "plugs-4": { + "question": "How much plugs of type
    Type 1 without cable (J1772)
    are available here?", + "render": "There are {socket:type1} plugs of type
    Type 1 without cable (J1772)
    available here" + }, + "plugs-5": { + "question": "How much plugs of type
    Type 1 CCS (aka Type 1 Combo)
    are available here?", + "render": "There are {socket:type1_combo} plugs of type
    Type 1 CCS (aka Type 1 Combo)
    available here" + }, + "plugs-6": { + "question": "How much plugs of type
    Tesla Supercharger
    are available here?", + "render": "There are {socket:tesla_supercharger} plugs of type
    Tesla Supercharger
    available here" + }, + "plugs-7": { + "question": "How much plugs of type
    Type 2 (mennekes)
    are available here?", + "render": "There are {socket:type2} plugs of type
    Type 2 (mennekes)
    available here" + }, + "plugs-8": { + "question": "How much plugs of type
    Type 2 CCS (mennekes)
    are available here?", + "render": "There are {socket:type2_combo} plugs of type
    Type 2 CCS (mennekes)
    available here" + }, + "plugs-9": { + "question": "How much plugs of type
    Type 2 with cable (mennekes)
    are available here?", + "render": "There are {socket:type2_cable} plugs of type
    Type 2 with cable (mennekes)
    available here" + }, + "power-output-0": { + "mappings": { + "0": { + "then": "
    Schuko wall plug without ground pin (CEE7/4 type F)
    outputs at most 3.6 kw" + } + }, + "question": "What power output does a single plug of type
    Schuko wall plug without ground pin (CEE7/4 type F)
    offer?", + "render": "
    Schuko wall plug without ground pin (CEE7/4 type F)
    outputs at most {socket:schuko:output}" + }, + "power-output-1": { + "mappings": { + "0": { + "then": "
    European wall plug with ground pin (CEE7/4 type E)
    outputs at most 3 kw" + }, + "1": { + "then": "
    European wall plug with ground pin (CEE7/4 type E)
    outputs at most 22 kw" + } + }, + "question": "What power output does a single plug of type
    European wall plug with ground pin (CEE7/4 type E)
    offer?", + "render": "
    European wall plug with ground pin (CEE7/4 type E)
    outputs at most {socket:typee:output}" + }, + "power-output-10": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger CCS (a branded type2_css)
    outputs at most 50 kw" + } + }, + "question": "What power output does a single plug of type
    Tesla Supercharger CCS (a branded type2_css)
    offer?", + "render": "
    Tesla Supercharger CCS (a branded type2_css)
    outputs at most {socket:tesla_supercharger_ccs:output}" + }, + "power-output-11": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger (destination)
    outputs at most 120 kw" + }, + "1": { + "then": "
    Tesla Supercharger (destination)
    outputs at most 150 kw" + }, + "2": { + "then": "
    Tesla Supercharger (destination)
    outputs at most 250 kw" + } + }, + "question": "What power output does a single plug of type
    Tesla Supercharger (destination)
    offer?", + "render": "
    Tesla Supercharger (destination)
    outputs at most {socket:tesla_destination:output}" + }, + "power-output-12": { + "mappings": { + "0": { + "then": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    outputs at most 11 kw" + }, + "1": { + "then": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    outputs at most 22 kw" + } + }, + "question": "What power output does a single plug of type
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    offer?", + "render": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    outputs at most {socket:tesla_destination:output}" + }, + "power-output-13": { + "mappings": { + "0": { + "then": "
    USB to charge phones and small electronics
    outputs at most 5w" + }, + "1": { + "then": "
    USB to charge phones and small electronics
    outputs at most 10w" + } + }, + "question": "What power output does a single plug of type
    USB to charge phones and small electronics
    offer?", + "render": "
    USB to charge phones and small electronics
    outputs at most {socket:USB-A:output}" + }, + "power-output-14": { + "question": "What power output does a single plug of type
    Bosch Active Connect with 3 pins and cable
    offer?", + "render": "
    Bosch Active Connect with 3 pins and cable
    outputs at most {socket:bosch_3pin:output}" + }, + "power-output-15": { + "question": "What power output does a single plug of type
    Bosch Active Connect with 5 pins and cable
    offer?", + "render": "
    Bosch Active Connect with 5 pins and cable
    outputs at most {socket:bosch_5pin:output}" + }, + "power-output-2": { + "mappings": { + "0": { + "then": "
    Chademo
    outputs at most 50 kw" + } + }, + "question": "What power output does a single plug of type
    Chademo
    offer?", + "render": "
    Chademo
    outputs at most {socket:chademo:output}" + }, + "power-output-3": { + "mappings": { + "0": { + "then": "
    Type 1 with cable (J1772)
    outputs at most 3.7 kw" + }, + "1": { + "then": "
    Type 1 with cable (J1772)
    outputs at most 7 kw" + } + }, + "question": "What power output does a single plug of type
    Type 1 with cable (J1772)
    offer?", + "render": "
    Type 1 with cable (J1772)
    outputs at most {socket:type1_cable:output}" + }, + "power-output-4": { + "mappings": { + "0": { + "then": "
    Type 1 without cable (J1772)
    outputs at most 3.7 kw" + }, + "1": { + "then": "
    Type 1 without cable (J1772)
    outputs at most 6.6 kw" + }, + "2": { + "then": "
    Type 1 without cable (J1772)
    outputs at most 7 kw" + }, + "3": { + "then": "
    Type 1 without cable (J1772)
    outputs at most 7.2 kw" + } + }, + "question": "What power output does a single plug of type
    Type 1 without cable (J1772)
    offer?", + "render": "
    Type 1 without cable (J1772)
    outputs at most {socket:type1:output}" + }, + "power-output-5": { + "mappings": { + "0": { + "then": "
    Type 1 CCS (aka Type 1 Combo)
    outputs at most 50 kw" + }, + "1": { + "then": "
    Type 1 CCS (aka Type 1 Combo)
    outputs at most 62.5 kw" + }, + "2": { + "then": "
    Type 1 CCS (aka Type 1 Combo)
    outputs at most 150 kw" + }, + "3": { + "then": "
    Type 1 CCS (aka Type 1 Combo)
    outputs at most 350 kw" + } + }, + "question": "What power output does a single plug of type
    Type 1 CCS (aka Type 1 Combo)
    offer?", + "render": "
    Type 1 CCS (aka Type 1 Combo)
    outputs at most {socket:type1_combo:output}" + }, + "power-output-6": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger
    outputs at most 120 kw" + }, + "1": { + "then": "
    Tesla Supercharger
    outputs at most 150 kw" + }, + "2": { + "then": "
    Tesla Supercharger
    outputs at most 250 kw" + } + }, + "question": "What power output does a single plug of type
    Tesla Supercharger
    offer?", + "render": "
    Tesla Supercharger
    outputs at most {socket:tesla_supercharger:output}" + }, + "power-output-7": { + "mappings": { + "0": { + "then": "
    Type 2 (mennekes)
    outputs at most 11 kw" + }, + "1": { + "then": "
    Type 2 (mennekes)
    outputs at most 22 kw" + } + }, + "question": "What power output does a single plug of type
    Type 2 (mennekes)
    offer?", + "render": "
    Type 2 (mennekes)
    outputs at most {socket:type2:output}" + }, + "power-output-8": { + "mappings": { + "0": { + "then": "
    Type 2 CCS (mennekes)
    outputs at most 50 kw" + } + }, + "question": "What power output does a single plug of type
    Type 2 CCS (mennekes)
    offer?", + "render": "
    Type 2 CCS (mennekes)
    outputs at most {socket:type2_combo:output}" + }, + "power-output-9": { + "mappings": { + "0": { + "then": "
    Type 2 with cable (mennekes)
    outputs at most 11 kw" + }, + "1": { + "then": "
    Type 2 with cable (mennekes)
    outputs at most 22 kw" + } + }, + "question": "What power output does a single plug of type
    Type 2 with cable (mennekes)
    offer?", + "render": "
    Type 2 with cable (mennekes)
    outputs at most {socket:type2_cable:output}" + }, + "questions": { + "render": "

    Technical questions

    The questions below are very technical. Feel free to ignore them
    {questions}" + }, + "ref": { + "question": "What is the reference number of this charging station?", + "render": "Reference number is {ref}" + }, + "voltage-0": { + "mappings": { + "0": { + "then": "
    Schuko wall plug without ground pin (CEE7/4 type F)
    outputs 230 volt" + } + }, + "question": "What voltage do the plugs with
    Schuko wall plug without ground pin (CEE7/4 type F)
    offer?", + "render": "
    Schuko wall plug without ground pin (CEE7/4 type F)
    outputs {socket:schuko:voltage} volt" + }, + "voltage-1": { + "mappings": { + "0": { + "then": "
    European wall plug with ground pin (CEE7/4 type E)
    outputs 230 volt" + } + }, + "question": "What voltage do the plugs with
    European wall plug with ground pin (CEE7/4 type E)
    offer?", + "render": "
    European wall plug with ground pin (CEE7/4 type E)
    outputs {socket:typee:voltage} volt" + }, + "voltage-10": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger CCS (a branded type2_css)
    outputs 500 volt" + }, + "1": { + "then": "
    Tesla Supercharger CCS (a branded type2_css)
    outputs 920 volt" + } + }, + "question": "What voltage do the plugs with
    Tesla Supercharger CCS (a branded type2_css)
    offer?", + "render": "
    Tesla Supercharger CCS (a branded type2_css)
    outputs {socket:tesla_supercharger_ccs:voltage} volt" + }, + "voltage-11": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger (destination)
    outputs 480 volt" + } + }, + "question": "What voltage do the plugs with
    Tesla Supercharger (destination)
    offer?", + "render": "
    Tesla Supercharger (destination)
    outputs {socket:tesla_destination:voltage} volt" + }, + "voltage-12": { + "mappings": { + "0": { + "then": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    outputs 230 volt" + }, + "1": { + "then": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    outputs 400 volt" + } + }, + "question": "What voltage do the plugs with
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    offer?", + "render": "
    Tesla supercharger (destination (A Type 2 with cable branded as tesla)
    outputs {socket:tesla_destination:voltage} volt" + }, + "voltage-13": { + "mappings": { + "0": { + "then": "
    USB to charge phones and small electronics
    outputs 5 volt" + } + }, + "question": "What voltage do the plugs with
    USB to charge phones and small electronics
    offer?", + "render": "
    USB to charge phones and small electronics
    outputs {socket:USB-A:voltage} volt" + }, + "voltage-14": { + "question": "What voltage do the plugs with
    Bosch Active Connect with 3 pins and cable
    offer?", + "render": "
    Bosch Active Connect with 3 pins and cable
    outputs {socket:bosch_3pin:voltage} volt" + }, + "voltage-15": { + "question": "What voltage do the plugs with
    Bosch Active Connect with 5 pins and cable
    offer?", + "render": "
    Bosch Active Connect with 5 pins and cable
    outputs {socket:bosch_5pin:voltage} volt" + }, + "voltage-2": { + "mappings": { + "0": { + "then": "
    Chademo
    outputs 500 volt" + } + }, + "question": "What voltage do the plugs with
    Chademo
    offer?", + "render": "
    Chademo
    outputs {socket:chademo:voltage} volt" + }, + "voltage-3": { + "mappings": { + "0": { + "then": "
    Type 1 with cable (J1772)
    outputs 200 volt" + }, + "1": { + "then": "
    Type 1 with cable (J1772)
    outputs 240 volt" + } + }, + "question": "What voltage do the plugs with
    Type 1 with cable (J1772)
    offer?", + "render": "
    Type 1 with cable (J1772)
    outputs {socket:type1_cable:voltage} volt" + }, + "voltage-4": { + "mappings": { + "0": { + "then": "
    Type 1 without cable (J1772)
    outputs 200 volt" + }, + "1": { + "then": "
    Type 1 without cable (J1772)
    outputs 240 volt" + } + }, + "question": "What voltage do the plugs with
    Type 1 without cable (J1772)
    offer?", + "render": "
    Type 1 without cable (J1772)
    outputs {socket:type1:voltage} volt" + }, + "voltage-5": { + "mappings": { + "0": { + "then": "
    Type 1 CCS (aka Type 1 Combo)
    outputs 400 volt" + }, + "1": { + "then": "
    Type 1 CCS (aka Type 1 Combo)
    outputs 1000 volt" + } + }, + "question": "What voltage do the plugs with
    Type 1 CCS (aka Type 1 Combo)
    offer?", + "render": "
    Type 1 CCS (aka Type 1 Combo)
    outputs {socket:type1_combo:voltage} volt" + }, + "voltage-6": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger
    outputs 480 volt" + } + }, + "question": "What voltage do the plugs with
    Tesla Supercharger
    offer?", + "render": "
    Tesla Supercharger
    outputs {socket:tesla_supercharger:voltage} volt" + }, + "voltage-7": { + "mappings": { + "0": { + "then": "
    Type 2 (mennekes)
    outputs 230 volt" + }, + "1": { + "then": "
    Type 2 (mennekes)
    outputs 400 volt" + } + }, + "question": "What voltage do the plugs with
    Type 2 (mennekes)
    offer?", + "render": "
    Type 2 (mennekes)
    outputs {socket:type2:voltage} volt" + }, + "voltage-8": { + "mappings": { + "0": { + "then": "
    Type 2 CCS (mennekes)
    outputs 500 volt" + }, + "1": { + "then": "
    Type 2 CCS (mennekes)
    outputs 920 volt" + } + }, + "question": "What voltage do the plugs with
    Type 2 CCS (mennekes)
    offer?", + "render": "
    Type 2 CCS (mennekes)
    outputs {socket:type2_combo:voltage} volt" + }, + "voltage-9": { + "mappings": { + "0": { + "then": "
    Type 2 with cable (mennekes)
    outputs 230 volt" + }, + "1": { + "then": "
    Type 2 with cable (mennekes)
    outputs 400 volt" + } + }, + "question": "What voltage do the plugs with
    Type 2 with cable (mennekes)
    offer?", + "render": "
    Type 2 with cable (mennekes)
    outputs {socket:type2_cable:voltage} volt" + }, + "website": { + "question": "What is the website where one can find more information about this charging station?", + "render": "More info on {website}" + } + }, + "title": { + "render": "Charging station" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " minutes", + "humanSingular": " minute" + }, + "1": { + "human": " hours", + "humanSingular": " hour" + }, + "2": { + "human": " days", + "humanSingular": " day" + } + } + }, + "1": { + "applicableUnits": { + "0": { + "human": "Volts" + } + } + }, + "2": { + "applicableUnits": { + "0": { + "human": "A" + } + } + }, + "3": { + "applicableUnits": { + "0": { + "human": "kilowatt" + }, + "1": { + "human": "megawatt" + } + } + } + } + }, + "crossings": { + "description": "Crossings for pedestrians and cyclists", + "name": "Crossings", + "presets": { + "0": { + "description": "Crossing for pedestrians and/or cyclists", + "title": "Crossing" + }, + "1": { + "description": "Traffic signal on a road", + "title": "Traffic signal" + } + }, + "tagRenderings": { + "crossing-bicycle-allowed": { + "mappings": { + "0": { + "then": "A cyclist can use this crossing" + }, + "1": { + "then": "A cyclist can not use this crossing" + } + }, + "question": "Is this crossing also for bicycles?" + }, + "crossing-button": { + "mappings": { + "0": { + "then": "This traffic light has a button to request green light" + }, + "1": { + "then": "This traffic light does not have a button to request green light" + } + }, + "question": "Does this traffic light have a button to request green light?" + }, + "crossing-continue-through-red": { + "mappings": { + "0": { + "then": "A cyclist can go straight on if the light is red " + }, + "1": { + "then": "A cyclist can go straight on if the light is red" + }, + "2": { + "then": "A cyclist can not go straight on if the light is red" + } + }, + "question": "Can a cyclist go straight on when the light is red?" + }, + "crossing-has-island": { + "mappings": { + "0": { + "then": "This crossing has an island in the middle" + }, + "1": { + "then": "This crossing does not have an island in the middle" + } + }, + "question": "Does this crossing have an island in the middle?" + }, + "crossing-is-zebra": { + "mappings": { + "0": { + "then": "This is a zebra crossing" + }, + "1": { + "then": "This is not a zebra crossing" + } + }, + "question": "Is this is a zebra crossing?" + }, + "crossing-right-turn-through-red": { + "mappings": { + "0": { + "then": "A cyclist can turn right if the light is red " + }, + "1": { + "then": "A cyclist can turn right if the light is red" + }, + "2": { + "then": "A cyclist can not turn right if the light is red" + } + }, + "question": "Can a cyclist turn right when the light is red?" + }, + "crossing-tactile": { + "mappings": { + "0": { + "then": "This crossing has tactile paving" + }, + "1": { + "then": "This crossing does not have tactile paving" + }, + "2": { + "then": "This crossing has tactile paving, but is not correct" + } + }, + "question": "Does this crossing have tactile paving?" + }, + "crossing-type": { + "mappings": { + "0": { + "then": "Crossing, without traffic lights" + }, + "1": { + "then": "Crossing with traffic signals" + }, + "2": { + "then": "Zebra crossing" + } + }, + "question": "What kind of crossing is this?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Traffic signal" + }, + "1": { + "then": "Crossing with traffic signals" + } + }, + "render": "Crossing" + } + }, + "cycleways_and_roads": { + "name": "Cycleways and roads", + "tagRenderings": { + "Cycleway type for a road": { + "mappings": { + "0": { + "then": "There is a shared lane" + }, + "1": { + "then": "There is a lane next to the road (separated with paint)" + }, + "2": { + "then": "There is a track, but no cycleway drawn separately from this road on the map." + }, + "3": { + "then": "There is a separately drawn cycleway" + }, + "4": { + "then": "There is no cycleway" + }, + "5": { + "then": "There is no cycleway" + } + }, + "question": "What kind of cycleway is here?" + }, + "Cycleway:smoothness": { + "mappings": { + "0": { + "then": "Usable for thin rollers: rollerblade, skateboard" + }, + "1": { + "then": "Usable for thin wheels: racing bike" + }, + "2": { + "then": "Usable for normal wheels: city bike, wheelchair, scooter" + }, + "3": { + "then": "Usable for robust wheels: trekking bike, car, rickshaw" + }, + "4": { + "then": "Usable for vehicles with high clearance: light duty off-road vehicle" + }, + "5": { + "then": "Usable for off-road vehicles: heavy duty off-road vehicle" + }, + "6": { + "then": "Usable for specialized off-road vehicles: tractor, ATV" + }, + "7": { + "then": "Impassable / No wheeled vehicle" + } + }, + "question": "What is the smoothness of this cycleway?" + }, + "Cycleway:surface": { + "mappings": { + "0": { + "then": "This cycleway is unpaved" + }, + "1": { + "then": "This cycleway is paved" + }, + "2": { + "then": "This cycleway is made of asphalt" + }, + "3": { + "then": "This cycleway is made of smooth paving stones" + }, + "4": { + "then": "This cycleway is made of concrete" + }, + "5": { + "then": "This cycleway is made of cobblestone (unhewn or sett)" + }, + "6": { + "then": "This cycleway is made of raw, natural cobblestone" + }, + "7": { + "then": "This cycleway is made of flat, square cobblestone" + }, + "8": { + "then": "This cycleway is made of wood" + }, + "9": { + "then": "This cycleway is made of gravel" + }, + "10": { + "then": "This cycleway is made of fine gravel" + }, + "11": { + "then": "This cycleway is made of pebblestone" + }, + "12": { + "then": "This cycleway is made from raw ground" + } + }, + "question": "What is the surface of the cycleway made from?", + "render": "This cyleway is made of {cycleway:surface}" + }, + "Is this a cyclestreet? (For a road)": { + "mappings": { + "0": { + "then": "This is a cyclestreet, and a 30km/h zone." + }, + "1": { + "then": "This is a cyclestreet" + }, + "2": { + "then": "This is not a cyclestreet." + } + }, + "question": "Is this a cyclestreet?" + }, + "Maxspeed (for road)": { + "mappings": { + "0": { + "then": "The maximum speed is 20 km/h" + }, + "1": { + "then": "The maximum speed is 30 km/h" + }, + "2": { + "then": "The maximum speed is 50 km/h" + }, + "3": { + "then": "The maximum speed is 70 km/h" + }, + "4": { + "then": "The maximum speed is 90 km/h" + } + }, + "question": "What is the maximum speed in this street?", + "render": "The maximum speed on this road is {maxspeed} km/h" + }, + "Surface of the road": { + "mappings": { + "0": { + "then": "This cycleway is unhardened" + }, + "1": { + "then": "This cycleway is paved" + }, + "2": { + "then": "This cycleway is made of asphalt" + }, + "3": { + "then": "This cycleway is made of smooth paving stones" + }, + "4": { + "then": "This cycleway is made of concrete" + }, + "5": { + "then": "This cycleway is made of cobblestone (unhewn or sett)" + }, + "6": { + "then": "This cycleway is made of raw, natural cobblestone" + }, + "7": { + "then": "This cycleway is made of flat, square cobblestone" + }, + "8": { + "then": "This cycleway is made of wood" + }, + "9": { + "then": "This cycleway is made of gravel" + }, + "10": { + "then": "This cycleway is made of fine gravel" + }, + "11": { + "then": "This cycleway is made of pebblestone" + }, + "12": { + "then": "This cycleway is made from raw ground" + } + }, + "question": "What is the surface of the street made from?", + "render": "This road is made of {surface}" + }, + "Surface of the street": { + "mappings": { + "0": { + "then": "Usable for thin rollers: rollerblade, skateboard" + }, + "1": { + "then": "Usable for thin wheels: racing bike" + }, + "2": { + "then": "Usable for normal wheels: city bike, wheelchair, scooter" + }, + "3": { + "then": "Usable for robust wheels: trekking bike, car, rickshaw" + }, + "4": { + "then": "Usable for vehicles with high clearance: light duty off-road vehicle" + }, + "5": { + "then": "Usable for off-road vehicles: heavy duty off-road vehicle" + }, + "6": { + "then": "Usable for specialized off-road vehicles: tractor, ATV" + }, + "7": { + "then": "Impassable / No wheeled vehicle" + } + }, + "question": "What is the smoothness of this street?" + }, + "cyclelan-segregation": { + "mappings": { + "0": { + "then": "This cycleway is separated by a dashed line" + }, + "1": { + "then": "This cycleway is separated by a solid line" + }, + "2": { + "then": "This cycleway is separated by a parking lane" + }, + "3": { + "then": "This cycleway is separated by a kerb" + } + }, + "question": "How is this cycleway separated from the road?" + }, + "cycleway-lane-track-traffic-signs": { + "mappings": { + "0": { + "then": "Compulsory cycleway " + }, + "1": { + "then": "Compulsory cycleway (with supplementary sign)
    " + }, + "2": { + "then": "Segregated foot/cycleway " + }, + "3": { + "then": "Unsegregated foot/cycleway " + }, + "4": { + "then": "No traffic sign present" + } + }, + "question": "What traffic sign does this cycleway have?" + }, + "cycleway-segregation": { + "mappings": { + "0": { + "then": "This cycleway is separated by a dashed line" + }, + "1": { + "then": "This cycleway is separated by a solid line" + }, + "2": { + "then": "This cycleway is separated by a parking lane" + }, + "3": { + "then": "This cycleway is separated by a kerb" + } + }, + "question": "How is this cycleway separated from the road?" + }, + "cycleway-traffic-signs": { + "mappings": { + "0": { + "then": "Compulsory cycleway " + }, + "1": { + "then": "Compulsory cycleway (with supplementary sign)
    " + }, + "2": { + "then": "Segregated foot/cycleway " + }, + "3": { + "then": "Unsegregated foot/cycleway " + }, + "4": { + "then": "No traffic sign present" + } + }, + "question": "What traffic sign does this cycleway have?" + }, + "cycleway-traffic-signs-D7-supplementary": { + "mappings": { + "0": { + "then": "" + }, + "1": { + "then": "" + }, + "2": { + "then": "" + }, + "3": { + "then": "" + }, + "4": { + "then": "" + }, + "5": { + "then": "" + }, + "6": { + "then": "No supplementary traffic sign present" + } + }, + "question": "Does the traffic sign D7 () have a supplementary sign?" + }, + "cycleway-traffic-signs-supplementary": { + "mappings": { + "0": { + "then": "" + }, + "1": { + "then": "" + }, + "2": { + "then": "" + }, + "3": { + "then": "" + }, + "4": { + "then": "" + }, + "5": { + "then": "" + }, + "6": { + "then": "No supplementary traffic sign present" + } + }, + "question": "Does the traffic sign D7 () have a supplementary sign?" + }, + "cycleways_and_roads-cycleway:buffer": { + "question": "How wide is the gap between the cycleway and the road?", + "render": "The buffer besides this cycleway is {cycleway:buffer} m" + }, + "is lit?": { + "mappings": { + "0": { + "then": "This street is lit" + }, + "1": { + "then": "This road is not lit" + }, + "2": { + "then": "This road is lit at night" + }, + "3": { + "then": "This road is lit 24/7" + } + }, + "question": "Is this street lit?" + }, + "width:carriageway": { + "question": "What is the carriage width of this road (in meters)?
    This is measured curb to curb and thus includes the width of parallell parking lanes", + "render": "The carriage width of this road is {width:carriageway}m" + } + }, + "title": { + "mappings": { + "0": { + "then": "Cycleway" + }, + "1": { + "then": "Shared lane" + }, + "2": { + "then": "Bike lane" + }, + "3": { + "then": "Cycleway next to the road" + }, + "4": { + "then": "Cyclestreet" + } + }, + "render": "Cycleways" + } + }, + "defibrillator": { + "name": "Defibrillators", + "presets": { + "0": { + "title": "Defibrillator" + } + }, + "tagRenderings": { + "defibrillator-access": { + "mappings": { + "0": { + "then": "Publicly accessible" + }, + "1": { + "then": "Publicly accessible" + }, + "2": { + "then": "Only accessible to customers" + }, + "3": { + "then": "Not accessible to the general public (e.g. only accesible to staff, the owners, ...)" + }, + "4": { + "then": "Not accessible, possibly only for professional use" + } + }, + "question": "Is this defibrillator freely accessible?", + "render": "Access is {access}" + }, + "defibrillator-defibrillator": { + "mappings": { + "0": { + "then": "There is no info about the type of device" + }, + "1": { + "then": "This is a manual defibrillator for professionals" + }, + "2": { + "then": "This is a normal automatic defibrillator" + }, + "3": { + "then": "This is a special type of defibrillator: {defibrillator}" + } + }, + "question": "Is this a a regular automatic defibrillator or a manual defibrillator for professionals only?" + }, + "defibrillator-defibrillator:location": { + "question": "Please give some explanation on where the defibrillator can be found (in the local language)", + "render": "Extra information about the location (in the local languagel):
    {defibrillator:location}" + }, + "defibrillator-defibrillator:location:en": { + "question": "Please give some explanation on where the defibrillator can be found (in English)", + "render": "Extra information about the location (in English):
    {defibrillator:location:en}" + }, + "defibrillator-defibrillator:location:fr": { + "question": "Please give some explanation on where the defibrillator can be found (in French)", + "render": "Extra information about the location (in French):
    {defibrillator:location:fr}" + }, + "defibrillator-description": { + "question": "Is there any useful information for users that you haven't been able to describe above? (leave blank if no)", + "render": "Additional information: {description}" + }, + "defibrillator-email": { + "question": "What is the email for questions about this defibrillator?", + "render": "Email for questions about this defibrillator: {email}" + }, + "defibrillator-fixme": { + "question": "Is there something wrong with how this is mapped, that you weren't able to fix here? (leave a note to OpenStreetMap experts)", + "render": "Extra information for OpenStreetMap experts: {fixme}" + }, + "defibrillator-indoors": { + "mappings": { + "0": { + "then": "This defibrillator is located indoors" + }, + "1": { + "then": "This defibrillator is located outdoors" + } + }, + "question": "Is this defibrillator located indoors?" + }, + "defibrillator-level": { + "mappings": { + "0": { + "then": "This defibrillator is on the ground floor" + }, + "1": { + "then": "This defibrillator is on the first floor" + } + }, + "question": "On which floor is this defibrillator located?", + "render": "This defibrillator is on floor {level}" + }, + "defibrillator-opening_hours": { + "mappings": { + "0": { + "then": "24/7 opened (including holidays)" + } + }, + "question": "At what times is this defibrillator available?", + "render": "{opening_hours_table(opening_hours)}" + }, + "defibrillator-phone": { + "question": "What is the phone number for questions about this defibrillator?", + "render": "Telephone for questions about this defibrillator: {phone}" + }, + "defibrillator-ref": { + "question": "What is the official identification number of the device? (if visible on device)", + "render": "Official identification number of the device: {ref}" + }, + "defibrillator-survey:date": { + "mappings": { + "0": { + "then": "Checked today!" + } + }, + "question": "When was this defibrillator last surveyed?", + "render": "This defibrillator was last surveyed on {survey:date}" + } + }, + "title": { + "render": "Defibrillator" + } + }, + "direction": { + "description": "This layer visualizes directions", + "name": "Direction visualization" + }, + "drinking_water": { + "name": "Drinking water", + "presets": { + "0": { + "title": "drinking water" + } + }, + "tagRenderings": { + "Bottle refill": { + "mappings": { + "0": { + "then": "It is easy to refill water bottles" + }, + "1": { + "then": "Water bottles may not fit" + } + }, + "question": "How easy is it to fill water bottles?" + }, + "Still in use?": { + "mappings": { + "0": { + "then": "This drinking water works" + }, + "1": { + "then": "This drinking water is broken" + }, + "2": { + "then": "This drinking water is closed" + } + }, + "question": "Is this drinking water spot still operational?", + "render": "The operational status is {operational_status}" + }, + "render-closest-drinking-water": { + "render": "There is another drinking water fountain at {_closest_other_drinking_water_distance} meter" + } + }, + "title": { + "render": "Drinking water" + } + }, + "etymology": { + "description": "All objects which have an etymology known", + "name": "Has etymolgy", + "tagRenderings": { + "etymology_multi_apply": { + "render": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Auto-applying data on all segments with the same name, true)}" + }, + "simple etymology": { + "mappings": { + "0": { + "then": "The origin of this name is unknown in all literature" + } + }, + "question": "What is this object named after?
    This might be written on the street name sign", + "render": "Named after {name:etymology}" + }, + "street-name-sign-image": { + "render": "{image_carousel(image:streetsign)}
    {image_upload(image:streetsign, Add image of a street name sign)}" + }, + "wikipedia-etymology": { + "question": "What is the Wikidata-item that this object is named after?", + "render": "

    Wikipedia article of the name giver

    {wikipedia(name:etymology:wikidata):max-height:20rem}" + }, + "zoeken op inventaris onroerend erfgoed": { + "render": "Search on inventaris onroerend erfgoed" + } + } + }, + "food": { + "filter": { + "0": { + "options": { + "0": { + "question": "Opened now" + } + } + }, + "1": { + "options": { + "0": { + "question": "Has a vegetarian menu" + } + } + }, + "2": { + "options": { + "0": { + "question": "Has a vegan menu" + } + } + }, + "3": { + "options": { + "0": { + "question": "Has a halal menu" + } + } + } + }, + "name": "Restaurants and fast food", + "presets": { + "0": { + "description": "A formal eating place with sit-down facilities selling full meals served by waiters", + "title": "restaurant" + }, + "1": { + "description": "A food business concentrating on fast counter-only service and take-away food", + "title": "fastfood" + }, + "2": { + "title": "fries shop" + } + }, + "tagRenderings": { + "Cuisine": { + "mappings": { + "0": { + "then": "This is a pizzeria" + }, + "1": { + "then": "This is a friture" + }, + "2": { + "then": "Mainly serves pasta" + } + }, + "question": "Which food is served here?", + "render": "This place mostly serves {cuisine}" + }, + "Fastfood vs restaurant": { + "question": "What type of business is this?" + }, + "Name": { + "question": "What is the name of this restaurant?", + "render": "The name of this restaurant is {name}" + }, + "Takeaway": { + "mappings": { + "0": { + "then": "This is a take-away only business" + }, + "1": { + "then": "Take-away is possible here" + }, + "2": { + "then": "Take-away is not possible here" + } + }, + "question": "Does this place offer takea-way?" + }, + "Vegetarian (no friture)": { + "question": "Does this restaurant have a vegetarian option?" + }, + "friture-take-your-container": { + "mappings": { + "0": { + "then": "You can bring your own containers to get your order, saving on single-use packaging material and thus waste" + }, + "1": { + "then": "Bringing your own container is not allowed" + }, + "2": { + "then": "You must bring your own container to order here." + } + }, + "question": "If you bring your own container (such as a cooking pot and small pots), is it used to package your order?
    " + }, + "halal (no friture)": { + "mappings": { + "0": { + "then": "There are no halal options available" + }, + "1": { + "then": "There is a small halal menu" + }, + "2": { + "then": "There is a halal menu" + }, + "3": { + "then": "Only halal options are available" + } + }, + "question": "Does this restaurant offer a halal menu?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Restaurant {name}" + }, + "1": { + "then": "Fastfood {name}" + } + } + } + }, + "ghost_bike": { + "name": "Ghost bikes", + "presets": { + "0": { + "title": "Ghost bike" + } + }, + "tagRenderings": { + "ghost-bike-explanation": { + "render": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location." + }, + "ghost_bike-inscription": { + "question": "What is the inscription on this Ghost bike?", + "render": "{inscription}" + }, + "ghost_bike-name": { + "mappings": { + "0": { + "then": "No name is marked on the bike" + } + }, + "question": "Whom is remembered by this ghost bike?
    Please respect privacy - only fill out the name if it is widely published or marked on the cycle. Opt to leave out the family name.
    ", + "render": "In remembrance of {name}" + }, + "ghost_bike-source": { + "question": "On what webpage can one find more information about the Ghost bike or the accident?", + "render": "More information is available" + }, + "ghost_bike-start_date": { + "question": "When was this Ghost bike installed?", + "render": "Placed on {start_date}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Ghost bike in the remembrance of {name}" + } + }, + "render": "Ghost bike" + } + }, + "gps_track": { + "tagRenderings": { + "Privacy notice": { + "render": "This is the path you've travelled since this website is opened. Don't worry - this is only visible to you and no one else. Your location data is never sent off-device." + } + } + }, + "information_board": { + "name": "Information boards", + "presets": { + "0": { + "title": "information board" + } + }, + "title": { + "render": "Information board" + } + }, + "map": { + "description": "A map, meant for tourists which is permanently installed in the public space", + "name": "Maps", + "presets": { + "0": { + "description": "Add a missing map", + "title": "Map" + } + }, + "tagRenderings": { + "map-attribution": { + "mappings": { + "0": { + "then": "OpenStreetMap is clearly attributed, including the ODBL-license" + }, + "1": { + "then": "OpenStreetMap is clearly attributed, but the license is not mentioned" + }, + "2": { + "then": "OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it" + }, + "3": { + "then": "There is no attribution at all" + }, + "4": { + "then": "There is no attribution at all" + } + }, + "question": "Is the OpenStreetMap-attribution given?" + }, + "map-map_source": { + "mappings": { + "0": { + "then": "This map is based on OpenStreetMap" + } + }, + "question": "On which data is this map based?", + "render": "This map is based on {map_source}" + } + }, + "title": { + "render": "Map" + } + }, + "nature_reserve": { + "tagRenderings": { + "Curator": { + "question": "Whom is the curator of this nature reserve?
    Respect privacy - only fill out a name if this is widely published", + "render": "{curator} is the curator of this nature reserve" + }, + "Dogs?": { + "mappings": { + "0": { + "then": "Dogs have to be leashed" + }, + "1": { + "then": "No dogs allowed" + }, + "2": { + "then": "Dogs are allowed to roam freely" + } + }, + "question": "Are dogs allowed in this nature reserve?" + }, + "Email": { + "question": "What email adress can one send to with questions and problems with this nature reserve?
    Respect privacy - only fill out a personal email address if this is widely published", + "render": "{email}" + }, + "Surface area": { + "render": "Surface area: {_surface:ha}Ha" + }, + "Website": { + "question": "On which webpage can one find more information about this nature reserve?" + }, + "phone": { + "question": "What phone number can one call to with questions and problems with this nature reserve?
    Respect privacy - only fill out a personal phone number address if this is widely published", + "render": "{phone}" + } + } + }, + "observation_tower": { + "description": "Towers with a panoramic view", + "name": "Observation towers", + "presets": { + "0": { + "title": "observation tower" + } + }, + "tagRenderings": { + "Fee": { + "mappings": { + "0": { + "then": "Free to visit" + } + }, + "question": "How much does one have to pay to enter this tower?", + "render": "Visiting this tower costs {charge}" + }, + "Height": { + "question": "What is the height of this tower?", + "render": "This tower is {height} high" + }, + "Operator": { + "question": "Who maintains this tower?", + "render": "Maintained by {operator}" + }, + "name": { + "mappings": { + "0": { + "then": "This tower doesn't have a specific name" + } + }, + "question": "What is the name of this tower?", + "render": "This tower is called {name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Observation tower" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " meter" + } + } + } + } + }, + "parking": { + "description": "A layer showing car parkings", + "presets": { + "0": { + "title": "car parking" + } + }, + "title": { + "render": "Car parking" + } + }, + "picnic_table": { + "description": "The layer showing picnic tables", + "name": "Picnic tables", + "presets": { + "0": { + "title": "picnic table" + } + }, + "tagRenderings": { + "picnic_table-material": { + "mappings": { + "0": { + "then": "This is a wooden picnic table" + }, + "1": { + "then": "This is a concrete picnic table" + } + }, + "question": "What material is this picnic table made of?", + "render": "This picnic table is made of {material}" + } + }, + "title": { + "render": "Picnic table" + } + }, + "playground": { + "description": "Playgrounds", + "name": "Playgrounds", + "presets": { + "0": { + "title": "Playground" + } + }, + "tagRenderings": { + "Playground-wheelchair": { + "mappings": { + "0": { + "then": "Completely accessible for wheelchair users" + }, + "1": { + "then": "Limited accessibility for wheelchair users" + }, + "2": { + "then": "Not accessible for wheelchair users" + } + }, + "question": "Is this playground accessible to wheelchair users?" + }, + "playground-access": { + "mappings": { + "0": { + "then": "Accessible to the general public" + }, + "1": { + "then": "Accessible to the general public" + }, + "2": { + "then": "Only accessible for clients of the operating business" + }, + "3": { + "then": "Only accessible to students of the school" + }, + "4": { + "then": "Not accessible" + } + }, + "question": "Is this playground accessible to the general public?" + }, + "playground-email": { + "question": "What is the email address of the playground maintainer?", + "render": "{email}" + }, + "playground-lit": { + "mappings": { + "0": { + "then": "This playground is lit at night" + }, + "1": { + "then": "This playground is not lit at night" + } + }, + "question": "Is this playground lit at night?" + }, + "playground-max_age": { + "question": "What is the maximum age allowed to access this playground?", + "render": "Accessible to kids of at most {max_age}" + }, + "playground-min_age": { + "question": "What is the minimum age required to access this playground?", + "render": "Accessible to kids older than {min_age} years" + }, + "playground-opening_hours": { + "mappings": { + "0": { + "then": "Accessible from sunrise till sunset" + }, + "1": { + "then": "Always accessible" + }, + "2": { + "then": "Always accessible" + } + }, + "question": "When is this playground accessible?" + }, + "playground-operator": { + "question": "Who operates this playground?", + "render": "Operated by {operator}" + }, + "playground-phone": { + "question": "What is the phone number of the playground maintainer?", + "render": "{phone}" + }, + "playground-surface": { + "mappings": { + "0": { + "then": "The surface is grass" + }, + "1": { + "then": "The surface is sand" + }, + "2": { + "then": "The surface consist of woodchips" + }, + "3": { + "then": "The surface is paving stones" + }, + "4": { + "then": "The surface is asphalt" + }, + "5": { + "then": "The surface is concrete" + }, + "6": { + "then": "The surface is unpaved" + }, + "7": { + "then": "The surface is paved" + } + }, + "question": "Which is the surface of this playground?
    If there are multiple, select the most occuring one", + "render": "The surface is {surface}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Playground {name}" + } + }, + "render": "Playground" + } + }, + "public_bookcase": { + "description": "A streetside cabinet with books, accessible to anyone", + "filter": { + "2": { + "options": { + "0": { + "question": "Indoor or outdoor" + } + } + } + }, + "name": "Bookcases", + "presets": { + "0": { + "title": "Bookcase" + } + }, + "tagRenderings": { + "bookcase-booktypes": { + "mappings": { + "0": { + "then": "Mostly children books" + }, + "1": { + "then": "Mostly books for adults" + }, + "2": { + "then": "Both books for kids and adults" + } + }, + "question": "What kind of books can be found in this public bookcase?" + }, + "bookcase-is-accessible": { + "mappings": { + "0": { + "then": "Publicly accessible" + }, + "1": { + "then": "Only accessible to customers" + } + }, + "question": "Is this public bookcase freely accessible?" + }, + "bookcase-is-indoors": { + "mappings": { + "0": { + "then": "This bookcase is located indoors" + }, + "1": { + "then": "This bookcase is located outdoors" + }, + "2": { + "then": "This bookcase is located outdoors" + } + }, + "question": "Is this bookcase located outdoors?" + }, + "public_bookcase-brand": { + "mappings": { + "0": { + "then": "Part of the network 'Little Free Library'" + }, + "1": { + "then": "This public bookcase is not part of a bigger network" + } + }, + "question": "Is this public bookcase part of a bigger network?", + "render": "This public bookcase is part of {brand}" + }, + "public_bookcase-capacity": { + "question": "How many books fit into this public bookcase?", + "render": "{capacity} books fit in this bookcase" + }, + "public_bookcase-name": { + "mappings": { + "0": { + "then": "This bookcase doesn't have a name" + } + }, + "question": "What is the name of this public bookcase?", + "render": "The name of this bookcase is {name}" + }, + "public_bookcase-operator": { + "question": "Who maintains this public bookcase?", + "render": "Operated by {operator}" + }, + "public_bookcase-ref": { + "mappings": { + "0": { + "then": "This bookcase is not part of a bigger network" + } + }, + "question": "What is the reference number of this public bookcase?", + "render": "The reference number of this public bookcase within {brand} is {ref}" + }, + "public_bookcase-start_date": { + "question": "When was this public bookcase installed?", + "render": "Installed on {start_date}" + }, + "public_bookcase-website": { + "question": "Is there a website with more information about this public bookcase?", + "render": "More info on the website" + } + }, + "title": { + "mappings": { + "0": { + "then": "Public bookcase {name}" + } + }, + "render": "Bookcase" + } + }, + "shops": { + "description": "A shop", + "name": "Shop", + "presets": { + "0": { + "description": "Add a new shop", + "title": "Shop" + } + }, + "tagRenderings": { + "shops-email": { + "question": "What is the email address of this shop?", + "render": "{email}" + }, + "shops-name": { + "question": "What is the name of this shop?" + }, + "shops-opening_hours": { + "question": "What are the opening hours of this shop?", + "render": "{opening_hours_table(opening_hours)}" + }, + "shops-phone": { + "question": "What is the phone number?", + "render": "{phone}" + }, + "shops-shop": { + "mappings": { + "0": { + "then": "Convenience store" + }, + "1": { + "then": "Supermarket" + }, + "2": { + "then": "Clothing store" + }, + "3": { + "then": "Hairdresser" + }, + "4": { + "then": "Bakery" + }, + "5": { + "then": "Car repair (garage)" + }, + "6": { + "then": "Car dealer" + } + }, + "question": "What does this shop sell?", + "render": "This shop sells {shop}" + }, + "shops-website": { + "question": "What is the website of this shop?", + "render": "{website}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "{shop}" + } + }, + "render": "Shop" + } + }, + "slow_roads": { + "tagRenderings": { + "slow_roads-surface": { + "mappings": { + "0": { + "then": "The surface is grass" + }, + "1": { + "then": "The surface is ground" + }, + "2": { + "then": "The surface is unpaved" + }, + "3": { + "then": "The surface is sand" + }, + "4": { + "then": "The surface is paving stones" + }, + "5": { + "then": "The surface is asphalt" + }, + "6": { + "then": "The surface is concrete" + }, + "7": { + "then": "The surface is paved" + } + }, + "render": "The surface is {surface}" + } + } + }, + "sport_pitch": { + "description": "A sport pitch", + "name": "Sport pitches", + "presets": { + "0": { + "title": "Tabletennis table" + }, + "1": { + "title": "Sport pitch" + } + }, + "tagRenderings": { + "sport-pitch-access": { + "mappings": { + "0": { + "then": "Public access" + }, + "1": { + "then": "Limited access (e.g. only with an appointment, during certain hours, ...)" + }, + "2": { + "then": "Only accessible for members of the club" + }, + "3": { + "then": "Private - not accessible to the public" + } + }, + "question": "Is this sport pitch publicly accessible?" + }, + "sport-pitch-reservation": { + "mappings": { + "0": { + "then": "Making an appointment is obligatory to use this sport pitch" + }, + "1": { + "then": "Making an appointment is recommended when using this sport pitch" + }, + "2": { + "then": "Making an appointment is possible, but not necessary to use this sport pitch" + }, + "3": { + "then": "Making an appointment is not possible" + } + }, + "question": "Does one have to make an appointment to use this sport pitch?" + }, + "sport_pitch-email": { + "question": "What is the email address of the operator?" + }, + "sport_pitch-opening_hours": { + "mappings": { + "1": { + "then": "Always accessible" + } + }, + "question": "When is this pitch accessible?" + }, + "sport_pitch-phone": { + "question": "What is the phone number of the operator?" + }, + "sport_pitch-sport": { + "mappings": { + "0": { + "then": "Basketball is played here" + }, + "1": { + "then": "Soccer is played here" + }, + "2": { + "then": "This is a pingpong table" + }, + "3": { + "then": "Tennis is played here" + }, + "4": { + "then": "Korfball is played here" + }, + "5": { + "then": "Basketball is played here" + } + }, + "question": "Which sport can be played here?", + "render": "{sport} is played here" + }, + "sport_pitch-surface": { + "mappings": { + "0": { + "then": "The surface is grass" + }, + "1": { + "then": "The surface is sand" + }, + "2": { + "then": "The surface is paving stones" + }, + "3": { + "then": "The surface is asphalt" + }, + "4": { + "then": "The surface is concrete" + } + }, + "question": "Which is the surface of this sport pitch?", + "render": "The surface is {surface}" + } + }, + "title": { + "render": "Sport pitch" + } + }, + "street_lamps": { + "name": "Street Lamps", + "presets": { + "0": { + "title": "street lamp" + } + }, + "tagRenderings": { + "colour": { + "mappings": { + "0": { + "then": "This lamp emits white light" + }, + "1": { + "then": "This lamp emits green light" + }, + "2": { + "then": "This lamp emits orange light" + } + }, + "question": "What colour light does this lamp emit?", + "render": "This lamp emits {light:colour} light" + }, + "count": { + "mappings": { + "0": { + "then": "This lamp has 1 fixture" + }, + "1": { + "then": "This lamp has 2 fixtures" + } + }, + "question": "How many fixtures does this light have?", + "render": "This lamp has {light:count} fixtures" + }, + "direction": { + "question": "Where does this lamp point to?", + "render": "This lamp points towards {light:direction}" + }, + "lamp_mount": { + "mappings": { + "0": { + "then": "This lamp sits atop of a straight mast" + }, + "1": { + "then": "This lamp sits at the end of a bent mast" + } + }, + "question": "How is this lamp mounted to the pole?" + }, + "lit": { + "mappings": { + "0": { + "then": "This lamp is lit at night" + }, + "1": { + "then": "This lamp is lit 24/7" + }, + "2": { + "then": "This lamp is lit based on motion" + }, + "3": { + "then": "This lamp is lit based on demand (e.g. with a pushbutton)" + } + }, + "question": "When is this lamp lit?" + }, + "method": { + "mappings": { + "0": { + "then": "This lamp is lit electrically" + }, + "1": { + "then": "This lamp uses LEDs" + }, + "2": { + "then": "This lamp uses incandescent lighting" + }, + "3": { + "then": "This lamp uses halogen lighting" + }, + "4": { + "then": "This lamp uses discharge lamps (unknown type)" + }, + "5": { + "then": "This lamp uses a mercury-vapour lamp (lightly blueish)" + }, + "6": { + "then": "This lamp uses metal-halide lamps (bright white)" + }, + "7": { + "then": "This lamp uses fluorescent lighting" + }, + "8": { + "then": "This lamp uses sodium lamps (unknown type)" + }, + "9": { + "then": "This lamp uses low pressure sodium lamps (monochrome orange)" + }, + "10": { + "then": "This lamp uses high pressure sodium lamps (orange with white)" + }, + "11": { + "then": "This lamp is lit using gas" + } + }, + "question": "What kind of lighting does this lamp use?" + }, + "ref": { + "question": "What is the reference number of this street lamp?", + "render": "This street lamp has the reference number {ref}" + }, + "support": { + "mappings": { + "0": { + "then": "This lamp is suspended using cables" + }, + "1": { + "then": "This lamp is mounted on a ceiling" + }, + "2": { + "then": "This lamp is mounted in the ground" + }, + "3": { + "then": "This lamp is mounted on a short pole (mostly < 1.5m)" + }, + "4": { + "then": "This lamp is mounted on a pole" + }, + "5": { + "then": "This lamp is mounted directly to the wall" + }, + "6": { + "then": "This lamp is mounted to the wall using a metal bar" + } + }, + "question": "How is this street lamp mounted?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Street Lamp {ref}" + } + }, + "render": "Street Lamp" + } + }, + "surveillance_camera": { + "name": "Surveillance camera's", + "tagRenderings": { + "Camera type: fixed; panning; dome": { + "mappings": { + "0": { + "then": "A fixed (non-moving) camera" + }, + "1": { + "then": "A dome camera (which can turn)" + }, + "2": { + "then": "A panning camera" + } + }, + "question": "What kind of camera is this?" + }, + "Level": { + "question": "On which level is this camera located?", + "render": "Located on level {level}" + }, + "Operator": { + "question": "Who operates this CCTV?", + "render": "Operated by {operator}" + }, + "Surveillance type: public, outdoor, indoor": { + "mappings": { + "0": { + "then": "A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or tunnel,..." + }, + "1": { + "then": "An outdoor, yet private area is surveilled (e.g. a parking lot, a fuel station, courtyard, entrance, private driveway, ...)" + }, + "2": { + "then": "A private indoor area is surveilled, e.g. a shop, a private underground parking, ..." + } + }, + "question": "What kind of surveillance is this camera" + }, + "Surveillance:zone": { + "mappings": { + "0": { + "then": "Surveills a parking" + }, + "1": { + "then": "Surveills the traffic" + }, + "2": { + "then": "Surveills an entrance" + }, + "3": { + "then": "Surveills a corridor" + }, + "4": { + "then": "Surveills a public tranport platform" + }, + "5": { + "then": "Surveills a shop" + } + }, + "question": "What exactly is surveilled here?", + "render": " Surveills a {surveillance:zone}" + }, + "camera:mount": { + "mappings": { + "0": { + "then": "This camera is placed against a wall" + }, + "1": { + "then": "This camera is placed one a pole" + }, + "2": { + "then": "This camera is placed on the ceiling" + } + }, + "question": "How is this camera placed?", + "render": "Mounting method: {camera:mount}" + }, + "camera_direction": { + "mappings": { + "0": { + "then": "Films to a compass heading of {direction}" + } + }, + "question": "In which geographical direction does this camera film?", + "render": "Films to a compass heading of {camera:direction}" + }, + "is_indoor": { + "mappings": { + "0": { + "then": "This camera is located indoors" + }, + "1": { + "then": "This camera is located outdoors" + }, + "2": { + "then": "This camera is probably located outdoors" + } + }, + "question": "Is the public space surveilled by this camera an indoor or outdoor space?" + } + }, + "title": { + "render": "Surveillance Camera" + } + }, + "toilet": { + "filter": { + "0": { + "options": { + "0": { + "question": "Wheelchair accessible" + } + } + }, + "1": { + "options": { + "0": { + "question": "Has a changing table" + } + } + }, + "2": { + "options": { + "0": { + "question": "Free to use" + } + } + }, + "3": { + "options": { + "0": { + "question": "Opened now" + } + } + } + }, + "name": "Toilets", + "presets": { + "0": { + "description": "A publicly accessible toilet or restroom", + "title": "toilet" + }, + "1": { + "description": "A restroom which has at least one wheelchair-accessible toilet", + "title": "toilets with wheelchair accessible toilet" + } + }, + "tagRenderings": { + "Opening-hours": { + "mappings": { + "0": { + "then": "Opened 24/7" + } + }, + "question": "When are these toilets opened?" + }, + "toilet-access": { + "mappings": { + "0": { + "then": "Public access" + }, + "1": { + "then": "Only access to customers" + }, + "2": { + "then": "Not accessible" + }, + "3": { + "then": "Accessible, but one has to ask a key to enter" + }, + "4": { + "then": "Public access" + } + }, + "question": "Are these toilets publicly accessible?", + "render": "Access is {access}" + }, + "toilet-changing_table:location": { + "mappings": { + "0": { + "then": "The changing table is in the toilet for women. " + }, + "1": { + "then": "The changing table is in the toilet for men. " + }, + "2": { + "then": "The changing table is in the toilet for wheelchair users. " + }, + "3": { + "then": "The changing table is in a dedicated room. " + } + }, + "question": "Where is the changing table located?", + "render": "The changing table is located at {changing_table:location}" + }, + "toilet-charge": { + "question": "How much does one have to pay for these toilets?", + "render": "The fee is {charge}" + }, + "toilet-handwashing": { + "mappings": { + "0": { + "then": "This toilets have a sink to wash your hands" + }, + "1": { + "then": "This toilets don't have a sink to wash your hands" + } + }, + "question": "Do these toilets have a sink to wash your hands?" + }, + "toilet-has-paper": { + "mappings": { + "0": { + "then": "This toilet is equipped with toilet paper" + }, + "1": { + "then": "You have to bring your own toilet paper to this toilet" + } + }, + "question": "Does one have to bring their own toilet paper to this toilet?" + }, + "toilets-changing-table": { + "mappings": { + "0": { + "then": "A changing table is available" + }, + "1": { + "then": "No changing table is available" + } + }, + "question": "Is a changing table (to change diapers) available?" + }, + "toilets-fee": { + "mappings": { + "0": { + "then": "These are paid toilets" + }, + "1": { + "then": "Free to use" + } + }, + "question": "Are these toilets free to use?" + }, + "toilets-type": { + "mappings": { + "0": { + "then": "There are only seated toilets" + }, + "1": { + "then": "There are only urinals here" + }, + "2": { + "then": "There are only squat toilets here" + }, + "3": { + "then": "Both seated toilets and urinals are available here" + } + }, + "question": "Which kind of toilets are this?" + }, + "toilets-wheelchair": { + "mappings": { + "0": { + "then": "There is a dedicated toilet for wheelchair users" + }, + "1": { + "then": "No wheelchair access" + } + }, + "question": "Is there a dedicated toilet for wheelchair users" + } + }, + "title": { + "render": "Toilet" + } + }, + "trail": { + "name": "Trails", + "tagRenderings": { + "Color": { + "mappings": { + "0": { + "then": "Blue trail" + }, + "1": { + "then": "Red trail" + }, + "2": { + "then": "Green trail" + }, + "3": { + "then": "Yellow trail" + } + } + }, + "trail-length": { + "render": "The trail is {_length:km} kilometers long" + } + }, + "title": { + "render": "Trail" + } + }, + "tree_node": { + "name": "Tree", + "presets": { + "0": { + "description": "A tree of a species with leaves, such as oak or populus.", + "title": "Broadleaved tree" + }, + "1": { + "description": "A tree of a species with needles, such as pine or spruce.", + "title": "Needleleaved tree" + }, + "2": { + "description": "If you're not sure whether it's a broadleaved or needleleaved tree.", + "title": "Tree" + } + }, + "tagRenderings": { + "tree-decidouous": { + "mappings": { + "0": { + "then": "Deciduous: the tree loses its leaves for some time of the year." + }, + "1": { + "then": "Evergreen." + } + }, + "question": "Is this tree evergreen or deciduous?" + }, + "tree-denotation": { + "mappings": { + "0": { + "then": "The tree is remarkable due to its size or prominent location. It is useful for navigation." + }, + "1": { + "then": "The tree is a natural monument, e.g. because it is especially old, or of a valuable species." + }, + "2": { + "then": "The tree is used for agricultural purposes, e.g. in an orchard." + }, + "3": { + "then": "The tree is in a park or similar (cemetery, school grounds, …)." + }, + "4": { + "then": "The tree is a residential garden." + }, + "5": { + "then": "This is a tree along an avenue." + }, + "6": { + "then": "The tree is an urban area." + }, + "7": { + "then": "The tree is outside of an urban area." + } + }, + "question": "How significant is this tree? Choose the first answer that applies." + }, + "tree-height": { + "mappings": { + "0": { + "then": "Height: {height} m" + } + }, + "render": "Height: {height}" + }, + "tree-heritage": { + "mappings": { + "0": { + "then": "\"\"/ Registered as heritage by Onroerend Erfgoed Flanders" + }, + "1": { + "then": "Registered as heritage by Direction du Patrimoine culturel Brussels" + }, + "2": { + "then": "Registered as heritage by a different organisation" + }, + "3": { + "then": "Not registered as heritage" + }, + "4": { + "then": "Registered as heritage by a different organisation" + } + }, + "question": "Is this tree registered heritage?" + }, + "tree-leaf_type": { + "mappings": { + "0": { + "then": "\"\"/ Broadleaved" + }, + "1": { + "then": "\"\"/ Needleleaved" + }, + "2": { + "then": "\"\"/ Permanently leafless" + } + }, + "question": "Is this a broadleaved or needleleaved tree?" + }, + "tree_node-name": { + "mappings": { + "0": { + "then": "The tree does not have a name." + } + }, + "question": "Does the tree have a name?", + "render": "Name: {name}" + }, + "tree_node-ref:OnroerendErfgoed": { + "question": "What is the ID issued by Onroerend Erfgoed Flanders?", + "render": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}" + }, + "tree_node-wikidata": { + "question": "What is the Wikidata ID for this tree?", + "render": "\"\"/ Wikidata: {wikidata}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Tree" + } + }, + "viewpoint": { + "description": "A nice viewpoint or nice view. Ideal to add an image if no other category fits", + "name": "Viewpoint", + "presets": { + "0": { + "title": "Viewpoint" + } + }, + "tagRenderings": { + "viewpoint-description": { + "question": "Do you want to add a description?" + } + }, + "title": { + "render": "Viewpoint" + } + }, + "visitor_information_centre": { + "description": "A visitor center offers information about a specific attraction or place of interest where it is located.", + "name": "Visitor Information Centre", + "title": { + "mappings": { + "1": { + "then": "{name}" + } + }, + "render": "{name}" + } + }, + "waste_basket": { + "description": "This is a public waste basket, thrash can, where you can throw away your thrash.", + "mapRendering": { + "0": { + "iconSize": { + "mappings": { + "0": { + "then": "Waste Basket" + } + } + } + } + }, + "name": "Waste Basket", + "presets": { + "0": { + "title": "Waste Basket" + } + }, + "tagRenderings": { + "dispensing_dog_bags": { + "mappings": { + "0": { + "then": "This waste basket has a dispenser for (dog) excrement bags" + }, + "1": { + "then": "This waste basket does not have a dispenser for (dog) excrement bags" + }, + "2": { + "then": "This waste basket does not have a dispenser for (dog) excrement bags" + } + }, + "question": "Does this waste basket have a dispenser for dog excrement bags?" + }, + "waste-basket-waste-types": { + "mappings": { + "0": { + "then": "A waste basket for general waste" + }, + "1": { + "then": "A waste basket for general waste" + }, + "2": { + "then": "A waste basket for dog excrements" + }, + "3": { + "then": "A waste basket for cigarettes" + }, + "4": { + "then": "A waste basket for drugs" + }, + "5": { + "then": "A waste basket for needles and other sharp objects" + } + }, + "question": "What kind of waste basket is this?" + } + }, + "title": { + "render": "Waste Basket" + } + }, + "watermill": { + "name": "Watermill" + } } \ No newline at end of file diff --git a/langs/layers/eo.json b/langs/layers/eo.json index f43552cc5e..f801770b80 100644 --- a/langs/layers/eo.json +++ b/langs/layers/eo.json @@ -1,192 +1,185 @@ { - "bench": { - "tagRenderings": { - "bench-colour": { - "mappings": { - "0": { - "then": "Koloro: bruna" - }, - "1": { - "then": "Koloro: verda" - }, - "2": { - "then": "Koloro: griza" - }, - "3": { - "then": "Koloro: blanka" - }, - "4": { - "then": "Koloro: ruĝa" - }, - "5": { - "then": "Koloro: nigra" - }, - "6": { - "then": "Koloro: blua" - }, - "7": { - "then": "Koloro: flava" - } - }, - "render": "Koloro: {colour}" - }, - "bench-material": { - "mappings": { - "0": { - "then": "Materialo: ligna" - }, - "1": { - "then": "Materialo: metala" - }, - "2": { - "then": "Materialo: ŝtona" - }, - "3": { - "then": "Materialo: betona" - }, - "4": { - "then": "Materialo: plasta" - }, - "5": { - "then": "Materialo: ŝtala" - } - }, - "render": "Materialo: {material}" - } - } - }, - "bench_at_pt": { - "tagRenderings": { - "bench_at_pt-name": { - "render": "{name}" - } - } - }, - "bicycle_library": { - "presets": { - "0": { - "title": "Fietsbibliotheek" - } - } - }, - "bike_parking": { - "tagRenderings": { - "Access": { - "render": "{access}" - } - } - }, - "ghost_bike": { - "name": "Fantombiciklo", - "title": { - "render": "Fantombiciklo" - } - }, - "shops": { - "description": "Butiko", - "name": "Butiko", - "presets": { - "0": { - "description": "Enmeti novan butikon", - "title": "Butiko" - } + "bench": { + "tagRenderings": { + "bench-colour": { + "mappings": { + "0": { + "then": "Koloro: bruna" + }, + "1": { + "then": "Koloro: verda" + }, + "2": { + "then": "Koloro: griza" + }, + "3": { + "then": "Koloro: blanka" + }, + "4": { + "then": "Koloro: ruĝa" + }, + "5": { + "then": "Koloro: nigra" + }, + "6": { + "then": "Koloro: blua" + }, + "7": { + "then": "Koloro: flava" + } }, - "tagRenderings": { - "shops-email": { - "question": "Kio estas la retpoŝta adreso de ĉi tiu butiko?", - "render": "{email}" - }, - "shops-phone": { - "question": "Kio estas la telefonnumero?", - "render": "{phone}" - }, - "shops-shop": { - "mappings": { - "4": { - "then": "Bakejo" - } - }, - "question": "Kion vendas ĉi tiu butiko?", - "render": "Ĉi tiu butiko vendas {shop}" - }, - "shops-website": { - "render": "{website}" - } + "render": "Koloro: {colour}" + }, + "bench-material": { + "mappings": { + "0": { + "then": "Materialo: ligna" + }, + "1": { + "then": "Materialo: metala" + }, + "2": { + "then": "Materialo: ŝtona" + }, + "3": { + "then": "Materialo: betona" + }, + "4": { + "then": "Materialo: plasta" + }, + "5": { + "then": "Materialo: ŝtala" + } }, - "title": { - "mappings": { - "0": { - "then": "{name}" - }, - "1": { - "then": "{shop}" - } - }, - "render": "Butiko" - } - }, - "slow_roads": { - "tagRenderings": { - "slow_roads-surface": { - "mappings": { - "0": { - "then": "La surfaco estas herba" - }, - "3": { - "then": "La surfaco estas sabla" - }, - "6": { - "then": "La surfaco estas betona" - } - }, - "render": "La surfaco estas {surface}" - } - } - }, - "tree_node": { - "tagRenderings": { - "tree_node-name": { - "render": "Nomo: {name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Arbo" - } - }, - "viewpoint": { - "name": "Vidpunkto", - "title": { - "render": "Vidpunkto" - } - }, - "visitor_information_centre": { - "title": { - "mappings": { - "1": { - "then": "{name}" - } - }, - "render": "{name}" - } - }, - "waste_basket": { - "iconSize": { - "mappings": { - "0": { - "then": "Rubujo" - } - } - }, - "name": "Rubujo", - "presets": { - "0": { - "title": "Rubujo" - } - } + "render": "Materialo: {material}" + } } + }, + "bench_at_pt": { + "tagRenderings": { + "bench_at_pt-name": { + "render": "{name}" + } + } + }, + "bicycle_library": { + "presets": { + "0": { + "title": "Fietsbibliotheek" + } + } + }, + "bike_parking": { + "tagRenderings": { + "Access": { + "render": "{access}" + } + } + }, + "ghost_bike": { + "name": "Fantombiciklo", + "title": { + "render": "Fantombiciklo" + } + }, + "shops": { + "description": "Butiko", + "name": "Butiko", + "presets": { + "0": { + "description": "Enmeti novan butikon", + "title": "Butiko" + } + }, + "tagRenderings": { + "shops-email": { + "question": "Kio estas la retpoŝta adreso de ĉi tiu butiko?", + "render": "{email}" + }, + "shops-phone": { + "question": "Kio estas la telefonnumero?", + "render": "{phone}" + }, + "shops-shop": { + "mappings": { + "4": { + "then": "Bakejo" + } + }, + "question": "Kion vendas ĉi tiu butiko?", + "render": "Ĉi tiu butiko vendas {shop}" + }, + "shops-website": { + "render": "{website}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "{shop}" + } + }, + "render": "Butiko" + } + }, + "slow_roads": { + "tagRenderings": { + "slow_roads-surface": { + "mappings": { + "0": { + "then": "La surfaco estas herba" + }, + "3": { + "then": "La surfaco estas sabla" + }, + "6": { + "then": "La surfaco estas betona" + } + }, + "render": "La surfaco estas {surface}" + } + } + }, + "tree_node": { + "tagRenderings": { + "tree_node-name": { + "render": "Nomo: {name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Arbo" + } + }, + "viewpoint": { + "name": "Vidpunkto", + "title": { + "render": "Vidpunkto" + } + }, + "visitor_information_centre": { + "title": { + "mappings": { + "1": { + "then": "{name}" + } + }, + "render": "{name}" + } + }, + "waste_basket": { + "name": "Rubujo", + "presets": { + "0": { + "title": "Rubujo" + } + } + } } \ No newline at end of file diff --git a/langs/layers/es.json b/langs/layers/es.json index f5a7196b87..ef10b5f045 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -1,144 +1,143 @@ { - "artwork": { - "description": "Diversas piezas de obras de arte", - "name": "Obras de arte", - "presets": { - "0": { - "title": "Obra de arte" - } - }, - "tagRenderings": { - "artwork-artwork_type": { - "question": "Cuál es el tipo de esta obra de arte?", - "render": "Esta es un {artwork_type}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Obra de arte {nombre}" - } - }, - "render": "Obra de arte" - } + "artwork": { + "description": "Diversas piezas de obras de arte", + "name": "Obras de arte", + "presets": { + "0": { + "title": "Obra de arte" + } }, - "bench": { - "name": "Bancos", - "presets": { - "0": { - "title": "banco" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Respaldo: Si" - }, - "1": { - "then": "Respaldo: No" - } - }, - "question": "¿Este banco tiene un respaldo?", - "render": "Respaldo" - }, - "bench-material": { - "mappings": { - "0": { - "then": "Material: madera" - }, - "1": { - "then": "Material: metal" - }, - "2": { - "then": "Material: piedra" - }, - "3": { - "then": "Material: concreto" - }, - "4": { - "then": "Material: plastico" - }, - "5": { - "then": "Material: acero" - } - }, - "render": "Material: {material}" - }, - "bench-seats": { - "question": "¿Cuántos asientos tiene este banco?", - "render": "{seats} asientos" - } - }, - "title": { - "render": "Banco" - } + "tagRenderings": { + "artwork-artwork_type": { + "question": "Cuál es el tipo de esta obra de arte?", + "render": "Esta es un {artwork_type}" + } }, - "bench_at_pt": { - "name": "Bancos en una parada de transporte público", - "title": { - "render": "Banco" - } - }, - "defibrillator": { - "name": "Desfibriladores", - "presets": { - "0": { - "title": "Desfibrilador" - } - }, - "tagRenderings": { - "defibrillator-access": { - "mappings": { - "0": { - "then": "Acceso libre" - }, - "1": { - "then": "Publicament accesible" - }, - "2": { - "then": "Sólo accesible a clientes" - }, - "3": { - "then": "No accesible al público en general (ex. sólo accesible a trabajadores, propietarios, ...)" - } - }, - "question": "¿Está el desfibrilador accesible libremente?", - "render": "El acceso es {access}" - }, - "defibrillator-defibrillator:location": { - "question": "Da detalles de dónde se puede encontrar el desfibrilador (en el idioma local)" - }, - "defibrillator-defibrillator:location:en": { - "question": "Da detalles de dónde se puede encontrar el desfibrilador (en ingles)" - }, - "defibrillator-defibrillator:location:fr": { - "question": "Da detalles de dónde se puede encontrar el desfibrilador (en frances)" - }, - "defibrillator-indoors": { - "mappings": { - "0": { - "then": "Este desfibrilador está en interior" - }, - "1": { - "then": "Este desfibrilador está en exterior" - } - }, - "question": "¿Esté el desfibrilador en interior?" - }, - "defibrillator-level": { - "question": "¿En qué planta se encuentra el defibrilador localizado?", - "render": "El desfibrilador se encuentra en la planta {level}" - } - }, - "title": { - "render": "Desfibrilador" - } - }, - "ghost_bike": { - "name": "Bicicleta blanca", - "title": { - "render": "Bicicleta blanca" + "title": { + "mappings": { + "0": { + "then": "Obra de arte {nombre}" } + }, + "render": "Obra de arte" } + }, + "bench": { + "name": "Bancos", + "presets": { + "0": { + "title": "banco" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Respaldo: Si" + }, + "1": { + "then": "Respaldo: No" + } + }, + "question": "¿Este banco tiene un respaldo?" + }, + "bench-material": { + "mappings": { + "0": { + "then": "Material: madera" + }, + "1": { + "then": "Material: metal" + }, + "2": { + "then": "Material: piedra" + }, + "3": { + "then": "Material: concreto" + }, + "4": { + "then": "Material: plastico" + }, + "5": { + "then": "Material: acero" + } + }, + "render": "Material: {material}" + }, + "bench-seats": { + "question": "¿Cuántos asientos tiene este banco?", + "render": "{seats} asientos" + } + }, + "title": { + "render": "Banco" + } + }, + "bench_at_pt": { + "name": "Bancos en una parada de transporte público", + "title": { + "render": "Banco" + } + }, + "defibrillator": { + "name": "Desfibriladores", + "presets": { + "0": { + "title": "Desfibrilador" + } + }, + "tagRenderings": { + "defibrillator-access": { + "mappings": { + "0": { + "then": "Acceso libre" + }, + "1": { + "then": "Publicament accesible" + }, + "2": { + "then": "Sólo accesible a clientes" + }, + "3": { + "then": "No accesible al público en general (ex. sólo accesible a trabajadores, propietarios, ...)" + } + }, + "question": "¿Está el desfibrilador accesible libremente?", + "render": "El acceso es {access}" + }, + "defibrillator-defibrillator:location": { + "question": "Da detalles de dónde se puede encontrar el desfibrilador (en el idioma local)" + }, + "defibrillator-defibrillator:location:en": { + "question": "Da detalles de dónde se puede encontrar el desfibrilador (en ingles)" + }, + "defibrillator-defibrillator:location:fr": { + "question": "Da detalles de dónde se puede encontrar el desfibrilador (en frances)" + }, + "defibrillator-indoors": { + "mappings": { + "0": { + "then": "Este desfibrilador está en interior" + }, + "1": { + "then": "Este desfibrilador está en exterior" + } + }, + "question": "¿Esté el desfibrilador en interior?" + }, + "defibrillator-level": { + "question": "¿En qué planta se encuentra el defibrilador localizado?", + "render": "El desfibrilador se encuentra en la planta {level}" + } + }, + "title": { + "render": "Desfibrilador" + } + }, + "ghost_bike": { + "name": "Bicicleta blanca", + "title": { + "render": "Bicicleta blanca" + } + } } \ No newline at end of file diff --git a/langs/layers/fi.json b/langs/layers/fi.json index 4c5b4a409a..518882d48c 100644 --- a/langs/layers/fi.json +++ b/langs/layers/fi.json @@ -1,131 +1,130 @@ { - "artwork": { - "presets": { - "0": { - "title": "Taideteos" - } - }, - "title": { - "mappings": { - "0": { - "then": "Taideteos {name}" - } - }, - "render": "Taideteos" - } + "artwork": { + "presets": { + "0": { + "title": "Taideteos" + } }, - "bench": { - "name": "Penkit", - "presets": { - "0": { - "title": "penkki" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Selkänoja: kyllä" - }, - "1": { - "then": "Selkänoja: ei" - } - }, - "render": "Selkänoja" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "Väri: ruskea" - }, - "1": { - "then": "Väri: vihreä" - }, - "2": { - "then": "Väri: harmaa" - }, - "3": { - "then": "Väri: valkoinen" - }, - "4": { - "then": "Väri: punainen" - }, - "5": { - "then": "Väri: musta" - }, - "6": { - "then": "Väri: sininen" - }, - "7": { - "then": "Väri: keltainen" - } - }, - "render": "Väri: {colour}" - }, - "bench-material": { - "mappings": { - "0": { - "then": "Materiaali: puu" - }, - "2": { - "then": "Materiaali: kivi" - }, - "3": { - "then": "Materiaali: betoni" - }, - "4": { - "then": "Materiaali: muovi" - }, - "5": { - "then": "Materiaali: teräs" - } - }, - "render": "Materiaali: {material}" - } - }, - "title": { - "render": "Penkki" - } - }, - "bench_at_pt": { - "tagRenderings": { - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "render": "Penkki" - } - }, - "bike_parking": { - "tagRenderings": { - "Access": { - "render": "{access}" - } - } - }, - "bike_repair_station": { - "presets": { - "0": { - "title": "Pyöräpumppu" - } - } - }, - "ghost_bike": { - "name": "Haamupyörä", - "title": { - "render": "Haamupyörä" - } - }, - "shops": { - "tagRenderings": { - "shops-shop": { - "mappings": { - "5": { - "then": "Autokorjaamo" - } - } - } + "title": { + "mappings": { + "0": { + "then": "Taideteos {name}" } + }, + "render": "Taideteos" } + }, + "bench": { + "name": "Penkit", + "presets": { + "0": { + "title": "penkki" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Selkänoja: kyllä" + }, + "1": { + "then": "Selkänoja: ei" + } + } + }, + "bench-colour": { + "mappings": { + "0": { + "then": "Väri: ruskea" + }, + "1": { + "then": "Väri: vihreä" + }, + "2": { + "then": "Väri: harmaa" + }, + "3": { + "then": "Väri: valkoinen" + }, + "4": { + "then": "Väri: punainen" + }, + "5": { + "then": "Väri: musta" + }, + "6": { + "then": "Väri: sininen" + }, + "7": { + "then": "Väri: keltainen" + } + }, + "render": "Väri: {colour}" + }, + "bench-material": { + "mappings": { + "0": { + "then": "Materiaali: puu" + }, + "2": { + "then": "Materiaali: kivi" + }, + "3": { + "then": "Materiaali: betoni" + }, + "4": { + "then": "Materiaali: muovi" + }, + "5": { + "then": "Materiaali: teräs" + } + }, + "render": "Materiaali: {material}" + } + }, + "title": { + "render": "Penkki" + } + }, + "bench_at_pt": { + "tagRenderings": { + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "render": "Penkki" + } + }, + "bike_parking": { + "tagRenderings": { + "Access": { + "render": "{access}" + } + } + }, + "bike_repair_station": { + "presets": { + "0": { + "title": "Pyöräpumppu" + } + } + }, + "ghost_bike": { + "name": "Haamupyörä", + "title": { + "render": "Haamupyörä" + } + }, + "shops": { + "tagRenderings": { + "shops-shop": { + "mappings": { + "5": { + "then": "Autokorjaamo" + } + } + } + } + } } \ No newline at end of file diff --git a/langs/layers/fr.json b/langs/layers/fr.json index 164cb92090..1f6ea34ce1 100644 --- a/langs/layers/fr.json +++ b/langs/layers/fr.json @@ -1,1933 +1,1938 @@ { - "artwork": { - "description": "Diverses œuvres d'art", - "name": "Œuvres d'art", - "presets": { - "0": { - "title": "Œuvre d'art" - } - }, - "tagRenderings": { - "artwork-artist_name": { - "question": "Quel artiste a créé cette œuvre ?", - "render": "Créé par {artist_name}" - }, - "artwork-artwork_type": { - "mappings": { - "0": { - "then": "Architecture" - }, - "1": { - "then": "Peinture murale" - }, - "2": { - "then": "Peinture" - }, - "3": { - "then": "Sculpture" - }, - "4": { - "then": "Statue" - }, - "5": { - "then": "Buste" - }, - "6": { - "then": "Rocher" - }, - "7": { - "then": "Installation" - }, - "8": { - "then": "Graffiti" - }, - "9": { - "then": "Relief" - }, - "10": { - "then": "Azulejo (faïence latine)" - }, - "11": { - "then": "Carrelage" - } - }, - "question": "Quel est le type de cette œuvre d'art?", - "render": "Type d'œuvre : {artwork_type}" - }, - "artwork-website": { - "question": "Existe-t-il un site web où trouver plus d'informations sur cette œuvre d'art ?", - "render": "Plus d'info sûr ce site web" - }, - "artwork-wikidata": { - "question": "Quelle entrée Wikidata correspond à cette œuvre d'art ?", - "render": "Correspond à {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Œuvre d'art {name}" - } - }, - "render": "Œuvre d'art" - } + "artwork": { + "description": "Diverses œuvres d'art", + "name": "Œuvres d'art", + "presets": { + "0": { + "title": "Œuvre d'art" + } }, - "bench": { - "name": "Bancs", - "presets": { - "0": { - "title": "banc" - } + "tagRenderings": { + "artwork-artist_name": { + "question": "Quel artiste a créé cette œuvre ?", + "render": "Créé par {artist_name}" + }, + "artwork-artwork_type": { + "mappings": { + "0": { + "then": "Architecture" + }, + "1": { + "then": "Peinture murale" + }, + "2": { + "then": "Peinture" + }, + "3": { + "then": "Sculpture" + }, + "4": { + "then": "Statue" + }, + "5": { + "then": "Buste" + }, + "6": { + "then": "Rocher" + }, + "7": { + "then": "Installation" + }, + "8": { + "then": "Graffiti" + }, + "9": { + "then": "Relief" + }, + "10": { + "then": "Azulejo (faïence latine)" + }, + "11": { + "then": "Carrelage" + } }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Dossier : Oui" - }, - "1": { - "then": "Dossier : Non" - } - }, - "question": "Ce banc dispose-t-il d'un dossier ?", - "render": "Dossier" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "Couleur : marron" - }, - "1": { - "then": "Couleur : verte" - }, - "2": { - "then": "Couleur : gris" - }, - "3": { - "then": "Couleur : blanc" - }, - "4": { - "then": "Couleur : rouge" - }, - "5": { - "then": "Couleur : noire" - }, - "6": { - "then": "Couleur : bleu" - }, - "7": { - "then": "Couleur : jaune" - } - }, - "question": "Quelle est la couleur de ce banc ?", - "render": "Couleur : {colour}" - }, - "bench-direction": { - "question": "Dans quelle direction regardez-vous quand vous êtes assis sur le banc ?", - "render": "Assis sur le banc, on regarde vers {direction}°." - }, - "bench-material": { - "mappings": { - "0": { - "then": "Matériau : bois" - }, - "1": { - "then": "Matériau : métal" - }, - "2": { - "then": "Matériau : pierre" - }, - "3": { - "then": "Matériau : béton" - }, - "4": { - "then": "Matériau : plastique" - }, - "5": { - "then": "Matériau : acier" - } - }, - "question": "De quel matériau ce banc est-il fait ?", - "render": "Matériau : {material}" - }, - "bench-seats": { - "question": "De combien de places dispose ce banc ?", - "render": "{seats} places" - }, - "bench-survey:date": { - "question": "Quand ce banc a-t-il été contrôlé pour la dernière fois ?", - "render": "Ce banc a été contrôlé pour la dernière fois le {survey:date}" - } - }, - "title": { - "render": "Banc" - } + "question": "Quel est le type de cette œuvre d'art?", + "render": "Type d'œuvre : {artwork_type}" + }, + "artwork-website": { + "question": "Existe-t-il un site web où trouver plus d'informations sur cette œuvre d'art ?", + "render": "Plus d'info sûr ce site web" + }, + "artwork-wikidata": { + "question": "Quelle entrée Wikidata correspond à cette œuvre d'art ?", + "render": "Correspond à {wikidata}" + } }, - "bench_at_pt": { - "name": "Bancs des arrêts de transport en commun", - "tagRenderings": { - "bench_at_pt-bench": { - "render": "Banc assis debout" - }, - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Banc d'un arrêt de transport en commun" - }, - "1": { - "then": "Banc dans un abri" - } - }, - "render": "Banc" - } - }, - "bicycle_library": { - "description": "Un lieu où des vélos peuvent être empruntés pour un temps plus long", - "name": "Vélothèque", - "presets": { - "0": { - "description": "Une vélothèque a une flotte de vélos qui peuvent être empruntés", - "title": "Vélothèque" - } - }, - "tagRenderings": { - "bicycle-library-target-group": { - "mappings": { - "0": { - "then": "Vélos pour enfants disponibles" - }, - "1": { - "then": "Vélos pour adultes disponibles" - }, - "2": { - "then": "Vélos pour personnes handicapées disponibles" - } - }, - "question": "Qui peut emprunter des vélos ici ?" - }, - "bicycle_library-charge": { - "mappings": { - "0": { - "then": "L'emprunt de vélo est gratuit" - }, - "1": { - "then": "Emprunter un vélo coûte 20 €/an et 20 € de garantie" - } - }, - "question": "Combien coûte l'emprunt d'un vélo ?", - "render": "Emprunter un vélo coûte {charge}" - }, - "bicycle_library-name": { - "question": "Quel est le nom de cette vélothèque ?", - "render": "Cette vélothèque s'appelle {name}" - } - }, - "title": { - "render": "Vélothèque" - } - }, - "bicycle_tube_vending_machine": { - "name": "Distributeur automatique de chambre à air de vélo", - "presets": { - "0": { - "title": "Distributeur automatique de chambre à air de vélo" - } - }, - "tagRenderings": { - "Still in use?": { - "mappings": { - "0": { - "then": "Le distributeur automatique fonctionne" - }, - "1": { - "then": "Le distributeur automatique est en panne" - }, - "2": { - "then": "Le distributeur automatique est fermé" - } - }, - "question": "Cette machine est-elle encore opérationelle ?", - "render": "L'état opérationnel est {operational_status}" - } - }, - "title": { - "render": "Distributeur automatique de chambre à air de vélo" - } - }, - "bike_cafe": { - "name": "Café vélo", - "presets": { - "0": { - "title": "Café Vélo" - } - }, - "tagRenderings": { - "bike_cafe-bike-pump": { - "mappings": { - "0": { - "then": "Ce Café vélo offre une pompe en libre accès" - }, - "1": { - "then": "Ce Café vélo n'offre pas de pompe en libre accès" - } - }, - "question": "Est-ce que ce Café vélo propose une pompe en libre accès ?" - }, - "bike_cafe-email": { - "question": "Quelle est l'adresse électronique de {name} ?" - }, - "bike_cafe-name": { - "question": "Quel est le nom de ce Café vélo ?", - "render": "Ce Café vélo s'appelle {name}" - }, - "bike_cafe-opening_hours": { - "question": "Quand ce Café vélo est-t-il ouvert ?" - }, - "bike_cafe-phone": { - "question": "Quel est le numéro de téléphone de {name} ?" - }, - "bike_cafe-repair-service": { - "mappings": { - "0": { - "then": "Ce Café vélo répare les vélos" - }, - "1": { - "then": "Ce Café vélo ne répare pas les vélos" - } - }, - "question": "Est-ce que ce Café vélo répare les vélos ?" - }, - "bike_cafe-repair-tools": { - "mappings": { - "0": { - "then": "Ce Café vélo propose des outils pour réparer son vélo soi-même" - }, - "1": { - "then": "Ce Café vélo ne propose pas d'outils pour réparer son vélo soi-même" - } - }, - "question": "Est-ce qu'il y a des outils pour réparer soi-même son vélo ?" - }, - "bike_cafe-website": { - "question": "Quel est le site web de {name} ?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Café Vélo {name}" - } - }, - "render": "Café Vélo" - } - }, - "bike_cleaning": { - "name": "Service de nettoyage de vélo", - "presets": { - "0": { - "title": "Service de nettoyage de vélo" - } - }, - "title": { - "mappings": { - "0": { - "then": "Service de nettoyage de vélo {name}" - } - }, - "render": "Service de nettoyage de vélo" - } - }, - "bike_parking": { - "name": "Parking à vélo", - "presets": { - "0": { - "title": "Parking à vélo" - } - }, - "tagRenderings": { - "Access": { - "mappings": { - "0": { - "then": "Accessible publiquement" - }, - "1": { - "then": "Accès destiné principalement aux visiteurs d'un lieu" - }, - "2": { - "then": "Accès limité aux membres d'une école, entreprise ou organisation" - } - }, - "question": "Qui peut utiliser ce parking à vélo ?", - "render": "{access}" - }, - "Bicycle parking type": { - "mappings": { - "0": { - "then": "Arceaux " - }, - "1": { - "then": "Pinces-roues " - }, - "2": { - "then": "Support guidon " - }, - "3": { - "then": "Râtelier " - }, - "4": { - "then": "Superposé " - }, - "5": { - "then": "Abri " - }, - "6": { - "then": "Potelet " - }, - "7": { - "then": "Zone au sol qui est marquée pour le stationnement des vélos" - } - }, - "question": "Quel type de parking à vélos est-ce ?", - "render": "Ceci est un parking à vélo de type {bicycle_parking}" - }, - "Capacity": { - "question": "Combien de vélos entrent dans ce parking à vélos (y compris les éventuels vélos de transport) ?", - "render": "Place pour {capacity} vélos" - }, - "Cargo bike capacity?": { - "question": "Combien de vélos de transport entrent dans ce parking à vélos ?", - "render": "Ce parking a de la place pour {capacity:cargo_bike} vélos de transport" - }, - "Cargo bike spaces?": { - "mappings": { - "0": { - "then": "Ce parking a de la place pour les vélos cargo" - }, - "1": { - "then": "Ce parking a des emplacements (officiellement) destinés aux vélos cargo." - }, - "2": { - "then": "Il est interdit de garer des vélos cargo" - } - }, - "question": "Est-ce que ce parking à vélo a des emplacements pour des vélos cargo ?" - }, - "Is covered?": { - "mappings": { - "0": { - "then": "Ce parking est couvert (il a un toit)" - }, - "1": { - "then": "Ce parking n'est pas couvert" - } - }, - "question": "Ce parking est-il couvert ? Sélectionnez aussi \"couvert\" pour les parkings en intérieur." - }, - "Underground?": { - "mappings": { - "0": { - "then": "Parking souterrain" - }, - "1": { - "then": "Parking souterrain" - }, - "2": { - "then": "Parking en surface" - }, - "3": { - "then": "Parking en surface" - }, - "4": { - "then": "Parking sur un toit" - } - }, - "question": "Quelle est la position relative de ce parking à vélo ?" - } - }, - "title": { - "render": "Parking à vélo" - } - }, - "bike_repair_station": { - "name": "Station velo (réparation, pompe à vélo)", - "presets": { - "0": { - "description": "Un dispositif pour gonfler vos pneus sur un emplacement fixe dans l'espace public.

    Exemples de pompes à vélo

    ", - "title": "Pompe à vélo" - }, - "1": { - "description": "Un dispositif avec des outils pour réparer votre vélo combiné à une pompe a un emplacement fixe. Les outils sont souvent attachés par une chaîne pour empêcher le vol.

    Exemple

    ", - "title": "Point de réparation vélo avec pompe" - }, - "2": { - "title": "Point de réparation vélo sans pompe" - } - }, - "tagRenderings": { - "Operational status": { - "mappings": { - "0": { - "then": "La pompe à vélo est cassée" - }, - "1": { - "then": "La pompe est opérationnelle" - } - }, - "question": "La pompe à vélo fonctionne-t-elle toujours ?" - }, - "bike_repair_station-available-services": { - "mappings": { - "0": { - "then": "Il y a seulement une pompe" - }, - "1": { - "then": "Il y a seulement des outils (tournevis, pinces...)" - }, - "2": { - "then": "Il y a des outils et une pompe" - } - }, - "question": "Quels services sont valables à cette station vélo ?" - }, - "bike_repair_station-bike-chain-tool": { - "mappings": { - "0": { - "then": "Il y a un outil pour réparer la chaine" - }, - "1": { - "then": "Il n'y a pas d'outil pour réparer la chaine" - } - }, - "question": "Est-ce que cette station vélo a un outil specifique pour réparer la chaîne du vélo ?" - }, - "bike_repair_station-bike-stand": { - "mappings": { - "0": { - "then": "Il y a un crochet ou une accroche" - }, - "1": { - "then": "Il n'y pas de crochet ou d'accroche" - } - }, - "question": "Est-ce que cette station vélo à un crochet pour suspendre son vélo ou une accroche pour l'élevé ?" - }, - "bike_repair_station-electrical_pump": { - "mappings": { - "0": { - "then": "Pompe manuelle" - }, - "1": { - "then": "Pompe électrique" - } - }, - "question": "Est-ce que cette pompe est électrique ?" - }, - "bike_repair_station-manometer": { - "mappings": { - "0": { - "then": "Il y a un manomètre" - }, - "1": { - "then": "Il n'y a pas de manomètre" - }, - "2": { - "then": "Il y a un manomètre mais il est cassé" - } - }, - "question": "Est-ce que la pompe à un manomètre integré ?" - }, - "bike_repair_station-opening_hours": { - "mappings": { - "0": { - "then": "Ouvert en permanence" - }, - "1": { - "then": "Ouvert en permanence" - } - }, - "question": "Quand ce point de réparation de vélo est-il ouvert ?" - }, - "bike_repair_station-operator": { - "question": "Qui maintient cette pompe à vélo ?", - "render": "Mantenue par {operator}" - }, - "bike_repair_station-valves": { - "mappings": { - "0": { - "then": "Sclaverand (aussi appelé Presta)" - }, - "1": { - "then": "Dunlop" - }, - "2": { - "then": "Schrader (les valves de voitures)" - } - }, - "question": "Quelles valves sont compatibles ?", - "render": "Cette pompe est compatible avec les valves suivantes : {valves}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Point de réparation velo" - }, - "1": { - "then": "Point de réparation" - }, - "2": { - "then": "Pompe cassée" - }, - "3": { - "then": "Pompe de vélo {name}" - }, - "4": { - "then": "Pompe de vélo" - } - }, - "render": "Point station velo avec pompe" - } - }, - "bike_shop": { - "description": "Un magasin vendant spécifiquement des vélos ou des objets en lien", - "name": "Magasin ou réparateur de vélo", - "presets": { - "0": { - "title": "Magasin et réparateur de vélo" - } - }, - "tagRenderings": { - "bike_repair_bike-pump-service": { - "mappings": { - "0": { - "then": "Ce magasin offre une pompe en acces libre" - }, - "1": { - "then": "Ce magasin n'offre pas de pompe en libre accès" - }, - "2": { - "then": "Il y a une pompe à vélo, c'est indiqué comme un point séparé " - } - }, - "question": "Est-ce que ce magasin offre une pompe en accès libre ?" - }, - "bike_repair_bike-wash": { - "mappings": { - "0": { - "then": "Ce magasin lave les vélos" - }, - "1": { - "then": "Ce magasin a une installation pour laver soi même des vélos" - }, - "2": { - "then": "Ce magasin ne fait pas le nettoyage de vélo" - } - }, - "question": "Lave-t-on les vélos ici ?" - }, - "bike_repair_rents-bikes": { - "mappings": { - "0": { - "then": "Ce magasin loue des vélos" - }, - "1": { - "then": "Ce magasin ne loue pas de vélos" - } - }, - "question": "Est-ce ce magasin loue des vélos ?" - }, - "bike_repair_repairs-bikes": { - "mappings": { - "0": { - "then": "Ce magasin répare des vélos" - }, - "1": { - "then": "Ce magasin ne répare pas les vélos" - }, - "2": { - "then": "Ce magasin ne répare seulement les vélos achetés là-bas" - }, - "3": { - "then": "Ce magasin ne répare seulement des marques spécifiques" - } - }, - "question": "Est-ce que ce magasin répare des vélos ?" - }, - "bike_repair_second-hand-bikes": { - "mappings": { - "0": { - "then": "Ce magasin vend des vélos d'occasion" - }, - "1": { - "then": "Ce magasin ne vend pas de vélos d'occasion" - }, - "2": { - "then": "Ce magasin vend seulement des vélos d'occasion" - } - }, - "question": "Est-ce ce magasin vend des vélos d'occasion ?" - }, - "bike_repair_sells-bikes": { - "mappings": { - "0": { - "then": "Ce magasin vend des vélos" - }, - "1": { - "then": "Ce magasin ne vend pas de vélo" - } - }, - "question": "Est-ce que ce magasin vend des vélos ?" - }, - "bike_repair_tools-service": { - "mappings": { - "0": { - "then": "Ce magasin offre des outils pour réparer son vélo soi-même" - }, - "1": { - "then": "Ce magasin n'offre pas des outils pour réparer son vélo soi-même" - }, - "2": { - "then": "Des outils d'auto-réparation sont disponibles uniquement si vous avez acheté ou loué le vélo dans ce magasin" - } - }, - "question": "Est-ce qu'il y a des outils pour réparer son vélo dans ce magasin ?" - }, - "bike_shop-email": { - "question": "Quelle est l'adresse électronique de {name} ?" - }, - "bike_shop-is-bicycle_shop": { - "render": "Ce magasin est spécialisé dans la vente de {shop} et a des activités liées au vélo" - }, - "bike_shop-name": { - "question": "Quel est le nom du magasin de vélos ?", - "render": "Ce magasin s'appelle {name}" - }, - "bike_shop-phone": { - "question": "Quel est le numéro de téléphone de {name} ?" - }, - "bike_shop-website": { - "question": "Quel est le site web de {name} ?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Magasin de sport {name}" - }, - "2": { - "then": "Location de vélo {name}" - }, - "3": { - "then": "Réparateur de vélo {name}" - }, - "4": { - "then": "Magasin de vélo {name}" - }, - "5": { - "then": "Magasin ou réparateur de vélo {name}" - } - }, - "render": "Magasin ou réparateur de vélo" - } - }, - "bike_themed_object": { - "name": "Objet cycliste", - "title": { - "mappings": { - "1": { - "then": "Piste cyclable" - } - }, - "render": "Objet cycliste" - } - }, - "defibrillator": { - "name": "Défibrillateurs", - "presets": { - "0": { - "title": "Défibrillateur" - } - }, - "tagRenderings": { - "defibrillator-access": { - "mappings": { - "0": { - "then": "Librement accessible" - }, - "1": { - "then": "Librement accessible" - }, - "2": { - "then": "Réservé aux clients du lieu" - }, - "3": { - "then": "Non accessible au public (par exemple réservé au personnel, au propriétaire, ...)" - }, - "4": { - "then": "Pas accessible, peut-être uniquement à usage professionnel" - } - }, - "question": "Ce défibrillateur est-il librement accessible ?", - "render": "{access} accessible" - }, - "defibrillator-defibrillator": { - "mappings": { - "0": { - "then": "C'est un défibrillateur manuel pour professionnel" - }, - "1": { - "then": "C'est un défibrillateur automatique manuel" - } - }, - "question": "Est-ce un défibrillateur automatique normal ou un défibrillateur manuel à usage professionnel uniquement ?", - "render": "Il n'y a pas d'information sur le type de dispositif" - }, - "defibrillator-defibrillator:location": { - "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (dans la langue local)", - "render": "Informations supplémentaires à propos de l'emplacement (dans la langue locale) :
    {defibrillator:location}" - }, - "defibrillator-defibrillator:location:en": { - "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (en englais)", - "render": "Informations supplémentaires à propos de l'emplacement (en anglais) :
    {defibrillator:location}" - }, - "defibrillator-defibrillator:location:fr": { - "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (en français)", - "render": "Informations supplémentaires à propos de l'emplacement (en Français) :
    {defibrillator:location}" - }, - "defibrillator-description": { - "question": "Y a-t-il des informations utiles pour les utilisateurs que vous n'avez pas pu décrire ci-dessus ? (laisser vide sinon)", - "render": "Informations supplémentaires : {description}" - }, - "defibrillator-email": { - "question": "Quelle est l'adresse électronique pour des questions à propos de ce défibrillateur ?", - "render": "Adresse électronique pour des questions à propos de ce défibrillateur : {email}" - }, - "defibrillator-fixme": { - "question": "Y a-t-il quelque chose qui ne va pas dans la manière dont ça a été cartographié, et que vous n'avez pas pu réparer ici ? (laisser une note pour les experts d'OpenStreetMap)", - "render": "Informations supplémentaires pour les experts d'OpenStreetMap : {fixme}" - }, - "defibrillator-indoors": { - "mappings": { - "0": { - "then": "Ce défibrillateur est en intérieur (dans un batiment)" - }, - "1": { - "then": "Ce défibrillateur est situé en extérieur" - } - }, - "question": "Ce défibrillateur est-il disposé en intérieur ?" - }, - "defibrillator-level": { - "mappings": { - "0": { - "then": "Ce défibrillateur est au rez-de-chaussée" - }, - "1": { - "then": "Ce défibrillateur est au premier étage" - } - }, - "question": "À quel étage est situé ce défibrillateur ?", - "render": "Ce défibrillateur est à l'étage {level}" - }, - "defibrillator-opening_hours": { - "mappings": { - "0": { - "then": "Ouvert 24/7 (jours feriés inclus)" - } - }, - "question": "À quels horaires ce défibrillateur est-il accessible ?", - "render": "{opening_hours_table(opening_hours)}" - }, - "defibrillator-phone": { - "question": "Quel est le numéro de téléphone pour questions sur le défibrillateur ?", - "render": "Numéro de téléphone pour questions sur le défibrillateur : {phone}" - }, - "defibrillator-ref": { - "question": "Quel est le numéro d'identification officiel de ce dispositif ? (si il est visible sur le dispositif)", - "render": "Numéro d'identification officiel de ce dispositif : {ref}" - }, - "defibrillator-survey:date": { - "mappings": { - "0": { - "then": "Vérifié aujourd'hui !" - } - }, - "question": "Quand le défibrillateur a-t-il été vérifié pour la dernière fois ?", - "render": "Ce défibrillateur a été vérifié pour la dernière fois le {survey:date}" - } - }, - "title": { - "render": "Défibrillateur" - } - }, - "direction": { - "description": "Cette couche visualise les directions", - "name": "Visualisation de la direction" - }, - "drinking_water": { - "name": "Eau potable", - "presets": { - "0": { - "title": "eau potable" - } - }, - "tagRenderings": { - "Bottle refill": { - "mappings": { - "0": { - "then": "Il est facile de remplir les bouteilles d'eau" - }, - "1": { - "then": "Les bouteilles d'eau peuvent ne pas passer" - } - }, - "question": "Est-il facile de remplir des bouteilles d'eau ?" - }, - "Still in use?": { - "mappings": { - "0": { - "then": "Cette fontaine fonctionne" - }, - "1": { - "then": "Cette fontaine est cassée" - }, - "2": { - "then": "Cette fontaine est fermée" - } - }, - "question": "Ce point d'eau potable est-il toujours opérationnel ?", - "render": "L'état opérationnel est {operational_status" - }, - "render-closest-drinking-water": { - "render": "Une autre source d’eau potable est à {_closest_other_drinking_water_distance} mètres a>" - } - }, - "title": { - "render": "Eau potable" - } - }, - "food": { - "tagRenderings": { - "friture-oil": { - "mappings": { - "0": { - "then": "Huile végétale" - }, - "1": { - "then": "Graisse animale" - } - }, - "question": "Cette friteuse fonctionne-t-elle avec de la graisse animale ou végétale ?" - }, - "friture-take-your-container": { - "mappings": { - "0": { - "then": "Vous pouvez apporter vos contenants pour votre commande, limitant l’usage de matériaux à usage unique et les déchets" - }, - "1": { - "then": "Apporter ses propres contenants n’est pas permis" - }, - "2": { - "then": "Il est obligatoire d’apporter ses propres contenants" - } - }, - "question": "Est-il proposé d’utiliser ses propres contenants pour sa commande ?
    " - }, - "friture-vegan": { - "mappings": { - "0": { - "then": "Des collations végétaliens sont disponibles" - }, - "1": { - "then": "Quelques snacks végétaliens seulement" - }, - "2": { - "then": "Pas d'en-cas végétaliens disponibles" - } - }, - "question": "Cette friterie est-elle équipée de snacks végétaliens ?" - }, - "friture-vegetarian": { - "mappings": { - "0": { - "then": "Des collations végétariens sont disponibles" - }, - "1": { - "then": "Quelques snacks végétariens seulement" - }, - "2": { - "then": "Pas d'en-cas végétariens disponibles" - } - }, - "question": "Cette friterie est-elle équipée de snacks végétariens ?" - } - } - }, - "ghost_bike": { - "name": "Vélos fantômes", - "presets": { - "0": { - "title": "Vélo fantôme" - } - }, - "tagRenderings": { - "ghost-bike-explanation": { - "render": "Un vélo fantôme est un monument commémoratif pour un cycliste décédé dans un accident de la route, sous la forme d'un vélo blanc placé en permanence près du lieu de l'accident." - }, - "ghost_bike-inscription": { - "question": "Quelle est l'inscription sur ce vélo fantôme ?", - "render": "{inscription}" - }, - "ghost_bike-name": { - "mappings": { - "0": { - "then": "Aucun nom n'est marqué sur le vélo" - } - }, - "question": "À qui est dédié ce vélo fantôme ?
    Veuillez respecter la vie privée – ajoutez le nom seulement s'il est largement publié ou marqué sur le vélo. Choisissez de ne pas indiquer le nom de famille
    ", - "render": "En souvenir de {name}" - }, - "ghost_bike-source": { - "question": "Sur quelle page web peut-on trouver plus d'informations sur le Vélo fantôme ou l'accident ?", - "render": "
    Plus d'informations sont disponibles" - }, - "ghost_bike-start_date": { - "question": "Quand ce vélo fantôme a-t-il été installée ?", - "render": "Placé le {start_date}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Vélo fantôme en souvenir de {name}" - } - }, - "render": "Vélo fantôme" - } - }, - "information_board": { - "name": "Panneaux d'informations", - "presets": { - "0": { - "title": "panneau d'informations" - } - }, - "title": { - "render": "Panneau d'informations" - } - }, - "map": { - "description": "Une carte, destinée aux touristes, installée en permanence dans l'espace public", - "name": "Cartes", - "presets": { - "0": { - "description": "Ajouter une carte manquante", - "title": "Carte" - } - }, - "tagRenderings": { - "map-attribution": { - "mappings": { - "0": { - "then": "L’attribution est clairement inscrite ainsi que la licence ODBL" - }, - "1": { - "then": "L’attribution est clairement inscrite mais la licence est absente" - }, - "2": { - "then": "OpenStreetMap n’est pas mentionné, un sticker OpenStreetMap a été collé" - }, - "3": { - "then": "Il n'y a aucune attribution" - }, - "4": { - "then": "Il n'y a aucune attribution" - } - }, - "question": "L’attribution à OpenStreetMap est elle-présente ?" - }, - "map-map_source": { - "mappings": { - "0": { - "then": "Cette carte est basée sur OpenStreetMap" - } - }, - "question": "Sur quelles données cette carte est-elle basée ?", - "render": "Cette carte est basée sur {map_source}" - } - }, - "title": { - "render": "Carte" - } - }, - "nature_reserve": { - "tagRenderings": { - "Curator": { - "question": "Qui est en charge de la conservation de la réserve ?
    À ne remplir seulement que si le nom est diffusé au public", - "render": "{curator} est en charge de la conservation de la réserve" - }, - "Dogs?": { - "mappings": { - "0": { - "then": "Les chiens doivent être tenus en laisse" - }, - "1": { - "then": "Chiens interdits" - }, - "2": { - "then": "Les chiens sont autorisés à se promener librement" - } - }, - "question": "Les chiens sont-ils autorisés dans cette réserve naturelle ?" - }, - "Email": { - "question": "À quelle adresse courriel peut-on envoyer des questions et des problèmes concernant cette réserve naturelle ?
    Respecter la vie privée – renseignez une adresse électronique personnelle seulement si celle-ci est largement publiée", - "render": "{email}" - }, - "Surface area": { - "render": "Superficie : {_surface:ha} ha" - }, - "Website": { - "question": "Sur quelle page web peut-on trouver plus d'informations sur cette réserve naturelle ?" - }, - "phone": { - "question": "Quel numéro de téléphone peut-on appeler pour poser des questions et résoudre des problèmes concernant cette réserve naturelle ?
    Respecter la vie privée – renseignez un numéro de téléphone personnel seulement si celui-ci est largement publié", - "render": "{phone}" - } - } - }, - "picnic_table": { - "description": "La couche montrant les tables de pique-nique", - "name": "Tables de pique-nique", - "presets": { - "0": { - "title": "table de pique-nique" - } - }, - "tagRenderings": { - "picnic_table-material": { - "mappings": { - "0": { - "then": "C’est une table en bois" - }, - "1": { - "then": "C’est une table en béton" - } - }, - "question": "En quel matériau est faite la table de pique-nique ?", - "render": "La table est faite en {material}" - } - }, - "title": { - "render": "Table de pique-nique" - } - }, - "playground": { - "description": "Aire de jeu", - "name": "Aire de jeu", - "presets": { - "0": { - "title": "Terrain de jeux" - } - }, - "tagRenderings": { - "Playground-wheelchair": { - "mappings": { - "0": { - "then": "Entièrement accessible aux personnes en fauteuil roulant" - }, - "1": { - "then": "Accessibilité limitée pour les personnes en fauteuil roulant" - }, - "2": { - "then": "Non accessible aux personnes en fauteuil roulant" - } - }, - "question": "Ce terrain de jeux est-il accessible aux personnes en fauteuil roulant ?" - }, - "playground-access": { - "mappings": { - "0": { - "then": "Accessible au public" - }, - "1": { - "then": "Accessible au public" - }, - "2": { - "then": "Réservée aux clients" - }, - "3": { - "then": "Réservée aux élèves de l’école" - }, - "4": { - "then": "Non accessible" - } - }, - "question": "L’aire de jeu est-elle accessible au public ?" - }, - "playground-email": { - "question": "Quelle est l'adresse électronique du responsable de l'aire de jeux ?", - "render": "{email}" - }, - "playground-lit": { - "mappings": { - "0": { - "then": "L’aire de jeu est éclairée de nuit" - }, - "1": { - "then": "L’aire de jeu n’est pas éclairée de nuit" - } - }, - "question": "Ce terrain de jeux est-il éclairé la nuit ?" - }, - "playground-max_age": { - "question": "Quel est l’âge maximum autorisé pour utiliser l’aire de jeu ?", - "render": "Accessible aux enfants de {max_age} au maximum" - }, - "playground-min_age": { - "question": "Quel est l'âge minimal requis pour accéder à ce terrain de jeux ?", - "render": "Accessible aux enfants de plus de {min_age} ans" - }, - "playground-opening_hours": { - "mappings": { - "0": { - "then": "Accessible du lever au coucher du soleil" - }, - "1": { - "then": "Toujours accessible" - }, - "2": { - "then": "Toujours accessible" - } - }, - "question": "Quand ce terrain de jeux est-il accessible ?" - }, - "playground-operator": { - "question": "Qui est en charge de l’exploitation de l’aire de jeu ?", - "render": "Exploité par {operator}" - }, - "playground-phone": { - "question": "Quel est le numéro de téléphone du responsable du terrain de jeux ?", - "render": "{phone}" - }, - "playground-surface": { - "mappings": { - "0": { - "then": "La surface est en gazon" - }, - "1": { - "then": "La surface est en sable" - }, - "2": { - "then": "La surface est en copeaux de bois" - }, - "3": { - "then": "La surface est en pavés" - }, - "4": { - "then": "La surface est en bitume" - }, - "5": { - "then": "La surface est en béton" - }, - "6": { - "then": "La surface n’a pas de revêtement" - }, - "7": { - "then": "La surface a un revêtement" - } - }, - "question": "De quelle matière est la surface de l’aire de jeu ?
    Pour plusieurs matières, sélectionner la principale", - "render": "La surface est en {surface}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Aire de jeu {name}" - } - }, - "render": "Aire de jeu" - } - }, - "public_bookcase": { - "description": "Une armoire ou une boite contenant des livres en libre accès", - "name": "Microbibliothèque", - "presets": { - "0": { - "title": "Microbibliothèque" - } - }, - "tagRenderings": { - "bookcase-booktypes": { - "mappings": { - "0": { - "then": "Livres pour enfants" - }, - "1": { - "then": "Livres pour les adultes" - }, - "2": { - "then": "Livres pour enfants et adultes également" - } - }, - "question": "Quel type de livres peut-on dans cette microbibliothèque ?" - }, - "bookcase-is-accessible": { - "mappings": { - "0": { - "then": "Accèssible au public" - }, - "1": { - "then": "Accèssible aux clients" - } - }, - "question": "Cette microbibliothèque est-elle librement accèssible ?" - }, - "bookcase-is-indoors": { - "mappings": { - "0": { - "then": "Cette microbibliothèque est en intérieur" - }, - "1": { - "then": "Cette microbibliothèque est en extérieur" - }, - "2": { - "then": "Cette microbibliothèque est en extérieur" - } - }, - "question": "Cette microbiliothèque est-elle en extérieur ?" - }, - "public_bookcase-brand": { - "mappings": { - "0": { - "then": "Fait partie du réseau Little Free Library" - }, - "1": { - "then": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe" - } - }, - "question": "Cette microbibliothèque fait-elle partie d'un réseau/groupe ?", - "render": "Cette microbibliothèque fait partie du groupe {brand}" - }, - "public_bookcase-capacity": { - "question": "Combien de livres peuvent entrer dans cette microbibliothèque ?", - "render": "{capacity} livres peuvent entrer dans cette microbibliothèque" - }, - "public_bookcase-name": { - "mappings": { - "0": { - "then": "Cette microbibliothèque n'a pas de nom" - } - }, - "question": "Quel est le nom de cette microbibliothèque ?", - "render": "Le nom de cette microbibliothèque est {name}" - }, - "public_bookcase-operator": { - "question": "Qui entretien cette microbibliothèque ?", - "render": "Entretenue par {operator}" - }, - "public_bookcase-ref": { - "mappings": { - "0": { - "then": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe" - } - }, - "question": "Quelle est le numéro de référence de cette microbibliothèque ?", - "render": "Cette microbibliothèque du réseau {brand} possède le numéro {ref}" - }, - "public_bookcase-start_date": { - "question": "Quand a été installée cette microbibliothèque ?", - "render": "Installée le {start_date}" - }, - "public_bookcase-website": { - "question": "Y a-t-il un site web avec plus d'informations sur cette microbibliothèque ?", - "render": "Plus d'infos sur le site web" - } - }, - "title": { - "mappings": { - "0": { - "then": "Microbibliothèque {name}" - } - }, - "render": "Microbibliothèque" - } - }, - "shops": { - "description": "Un magasin", - "name": "Magasin", - "presets": { - "0": { - "description": "Ajouter un nouveau magasin", - "title": "Magasin" - } - }, - "tagRenderings": { - "shops-email": { - "question": "Quelle est l'adresse électronique de ce magasin ?", - "render": "{email}" - }, - "shops-name": { - "question": "Qu'est-ce que le nom de ce magasin?" - }, - "shops-opening_hours": { - "question": "Quels sont les horaires d'ouverture de ce magasin ?", - "render": "{opening_hours_table(opening_hours)}" - }, - "shops-phone": { - "question": "Quel est le numéro de téléphone ?", - "render": "{phone}" - }, - "shops-shop": { - "mappings": { - "0": { - "then": "Épicerie/superette" - }, - "1": { - "then": "Supermarché" - }, - "2": { - "then": "Magasin de vêtements" - }, - "3": { - "then": "Coiffeur" - }, - "4": { - "then": "Boulangerie" - }, - "5": { - "then": "Garage de réparation automobile" - }, - "6": { - "then": "Concessionnaire" - } - }, - "question": "Que vends ce magasin ?", - "render": "Ce magasin vends {shop}" - }, - "shops-website": { - "question": "Quel est le site internet de ce magasin ?", - "render": "{website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - }, - "1": { - "then": "{shop}" - } - }, - "render": "Magasin" - } - }, - "slow_roads": { - "tagRenderings": { - "slow_roads-surface": { - "mappings": { - "0": { - "then": "La surface est en herbe" - }, - "1": { - "then": "La surface est en terre" - }, - "2": { - "then": "La surface est non pavée" - }, - "3": { - "then": "La surface est en sable" - }, - "4": { - "then": "La surface est en pierres pavées" - }, - "5": { - "then": "La surface est en bitume" - }, - "6": { - "then": "La surface est en béton" - }, - "7": { - "then": "La surface est pavée" - } - }, - "render": "La surface en {surface}" - } - } - }, - "sport_pitch": { - "description": "Un terrain de sport", - "name": "Terrains de sport", - "presets": { - "0": { - "title": "Table de ping-pong" - }, - "1": { - "title": "Terrain de sport" - } - }, - "tagRenderings": { - "sport-pitch-access": { - "mappings": { - "0": { - "then": "Accessible au public" - }, - "1": { - "then": "Accès limité (par exemple uniquement sur réservation, à certains horaires…)" - }, - "2": { - "then": "Accessible uniquement aux membres du club" - }, - "3": { - "then": "Privé - Pas accessible au public" - } - }, - "question": "Est-ce que ce terrain de sport est accessible au public ?" - }, - "sport-pitch-reservation": { - "mappings": { - "0": { - "then": "Il est obligatoire de réserver pour utiliser ce terrain de sport" - }, - "1": { - "then": "Il est recommendé de réserver pour utiliser ce terrain de sport" - }, - "2": { - "then": "Il est possible de réserver, mais ce n'est pas nécéssaire pour utiliser ce terrain de sport" - }, - "3": { - "then": "On ne peut pas réserver" - } - }, - "question": "Doit-on réserver pour utiliser ce terrain de sport ?" - }, - "sport_pitch-email": { - "question": "Quelle est l'adresse courriel du gérant ?" - }, - "sport_pitch-opening_hours": { - "mappings": { - "1": { - "then": "Accessible en permanence" - } - }, - "question": "Quand ce terrain est-il accessible ?" - }, - "sport_pitch-phone": { - "question": "Quel est le numéro de téléphone du gérant ?" - }, - "sport_pitch-sport": { - "mappings": { - "0": { - "then": "Ici, on joue au basketball" - }, - "1": { - "then": "Ici, on joue au football" - }, - "2": { - "then": "C'est une table de ping-pong" - }, - "3": { - "then": "Ici, on joue au tennis" - }, - "4": { - "then": "Ici, on joue au korfball" - }, - "5": { - "then": "Ici, on joue au basketball" - } - }, - "question": "À quel sport peut-on jouer ici ?", - "render": "Ici on joue au {sport}" - }, - "sport_pitch-surface": { - "mappings": { - "0": { - "then": "La surface est de l'herbe" - }, - "1": { - "then": "La surface est du sable" - }, - "2": { - "then": "La surface est des pavés" - }, - "3": { - "then": "La surface est de l'asphalte" - }, - "4": { - "then": "La surface est du béton" - } - }, - "question": "De quelle surface est fait ce terrain de sport ?", - "render": "La surface est {surface}" - } - }, - "title": { - "render": "Terrain de sport" - } - }, - "surveillance_camera": { - "name": "Caméras de surveillance", - "tagRenderings": { - "Camera type: fixed; panning; dome": { - "mappings": { - "0": { - "then": "Une caméra fixe (non mobile)" - }, - "1": { - "then": "Une caméra dôme (qui peut tourner)" - }, - "2": { - "then": "Une caméra panoramique" - } - }, - "question": "Quel genre de caméra est-ce ?" - }, - "Indoor camera? This isn't clear for 'public'-cameras": { - "mappings": { - "0": { - "then": "Cette caméra est située à l'intérieur" - }, - "1": { - "then": "Cette caméra est située à l'extérieur" - }, - "2": { - "then": "Cette caméra est probablement située à l'extérieur" - } - }, - "question": "L'espace public surveillé par cette caméra est-il un espace intérieur ou extérieur ?" - }, - "Level": { - "question": "À quel niveau se trouve cette caméra ?", - "render": "Situé au niveau {level}" - }, - "Operator": { - "question": "Qui exploite ce système de vidéosurveillance ?", - "render": "Exploité par {operator}" - }, - "Surveillance type: public, outdoor, indoor": { - "mappings": { - "0": { - "then": "Une zone publique est surveillée, telle qu'une rue, un pont, une place, un parc, une gare, un couloir ou un tunnel public…" - }, - "1": { - "then": "Une zone extérieure, mais privée, est surveillée (par exemple, un parking, une station-service, une cour, une entrée, une allée privée, etc.)" - }, - "2": { - "then": "Une zone intérieure privée est surveillée, par exemple un magasin, un parking souterrain privé…" - } - }, - "question": "Quel genre de surveillance est cette caméra" - }, - "Surveillance:zone": { - "mappings": { - "0": { - "then": "Surveille un parking" - }, - "1": { - "then": "Surveille la circulation" - }, - "2": { - "then": "Surveille une entrée" - }, - "3": { - "then": "Surveille un couloir" - }, - "4": { - "then": "Surveille un quai de transport public" - }, - "5": { - "then": "Surveille un magasin" - } - }, - "question": "Qu'est-ce qui est surveillé ici ?", - "render": " Surveille un(e) {surveillance:zone}" - }, - "camera:mount": { - "mappings": { - "0": { - "then": "Cette caméra est placée contre un mur" - }, - "1": { - "then": "Cette caméra est placée sur un poteau" - }, - "2": { - "then": "Cette caméra est placée au plafond" - } - }, - "question": "Comment cette caméra est-elle placée ?", - "render": "Méthode de montage : {mount}" - }, - "direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view": { - "mappings": { - "0": { - "then": "Filme dans une direction {direction}" - } - }, - "question": "Dans quelle direction géographique cette caméra filme-t-elle ?", - "render": "Filme dans une direction {camera:direction}" - } - }, - "title": { - "render": "Caméra de surveillance" - } - }, - "toilet": { - "name": "Toilettes", - "presets": { - "0": { - "description": "Des toilettes", - "title": "toilettes" - }, - "1": { - "description": "Toilettes avec au moins un WC accessible aux personnes à mobilité réduite", - "title": "toilettes accessible aux personnes à mobilité réduite" - } - }, - "tagRenderings": { - "toilet-access": { - "mappings": { - "0": { - "then": "Accès publique" - }, - "1": { - "then": "Accès réservé aux clients" - }, - "2": { - "then": "Toilettes privées" - }, - "3": { - "then": "Accessible, mais vous devez demander la clé" - }, - "4": { - "then": "Accès publique" - } - }, - "question": "Ces toilettes sont-elles accessibles au public ?", - "render": "L'accès est {access}" - }, - "toilet-changing_table:location": { - "mappings": { - "0": { - "then": "La table à langer est dans les toilettes pour femmes. " - }, - "1": { - "then": "La table à langer est dans les toilettes pour hommes. " - }, - "2": { - "then": "La table à langer est dans les toilettes pour personnes à mobilité réduite. " - }, - "3": { - "then": "La table à langer est dans un espace dédié. " - } - }, - "question": "Où se situe la table à langer ?", - "render": "Emplacement de la table à langer : {changing_table:location}" - }, - "toilet-charge": { - "question": "Quel est le prix d'accès de ces toilettes ?", - "render": "Le prix est {charge}" - }, - "toilets-changing-table": { - "mappings": { - "0": { - "then": "Une table à langer est disponible" - }, - "1": { - "then": "Aucune table à langer" - } - }, - "question": "Ces toilettes disposent-elles d'une table à langer ?" - }, - "toilets-fee": { - "mappings": { - "0": { - "then": "Toilettes payantes" - }, - "1": { - "then": "Toilettes gratuites" - } - }, - "question": "Ces toilettes sont-elles payantes ?" - }, - "toilets-type": { - "mappings": { - "0": { - "then": "Il y a uniquement des sièges de toilettes" - }, - "1": { - "then": "Il y a uniquement des urinoirs" - }, - "2": { - "then": "Il y a uniquement des toilettes turques" - }, - "3": { - "then": "Il y a des sièges de toilettes et des urinoirs" - } - }, - "question": "De quel type sont ces toilettes ?" - }, - "toilets-wheelchair": { - "mappings": { - "0": { - "then": "Il y a des toilettes réservées pour les personnes à mobilité réduite" - }, - "1": { - "then": "Non accessible aux personnes à mobilité réduite" - } - }, - "question": "Y a-t-il des toilettes réservées aux personnes en fauteuil roulant ?" - } - }, - "title": { - "render": "Toilettes" - } - }, - "tree_node": { - "name": "Arbre", - "presets": { - "0": { - "description": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier.", - "title": "Arbre feuillu" - }, - "1": { - "description": "Une espèce d’arbre avec des épines comme le pin ou l’épicéa.", - "title": "Arbre résineux" - }, - "2": { - "description": "Si vous n'êtes pas sûr(e) de savoir s'il s'agit d'un arbre à feuilles larges ou à aiguilles.", - "title": "Arbre" - } - }, - "tagRenderings": { - "tree-decidouous": { - "mappings": { - "0": { - "then": "Caduc : l’arbre perd son feuillage une partie de l’année." - }, - "1": { - "then": "À feuilles persistantes." - } - }, - "question": "L’arbre est-il à feuillage persistant ou caduc ?" - }, - "tree-denotation": { - "mappings": { - "0": { - "then": "L'arbre est remarquable en raison de sa taille ou de son emplacement proéminent. Il est utile pour la navigation." - }, - "1": { - "then": "Cet arbre est un monument naturel (ex : âge, espèce, etc…)" - }, - "2": { - "then": "Cet arbre est utilisé à but d’agriculture (ex : dans un verger)" - }, - "3": { - "then": "Cet arbre est dans un parc ou une aire similaire (ex : cimetière, cour d’école, …)." - }, - "4": { - "then": "Cet arbre est dans une cour résidentielle." - }, - "5": { - "then": "C'est un arbre le long d'une avenue." - }, - "6": { - "then": "L'arbre est une zone urbaine." - }, - "7": { - "then": "Cet arbre est en zone rurale." - } - }, - "question": "Quelle est l'importance de cet arbre ? Choisissez la première réponse qui s'applique." - }, - "tree-height": { - "mappings": { - "0": { - "then": "Hauteur : {height} m" - } - }, - "render": "Hauteur : {height}" - }, - "tree-heritage": { - "mappings": { - "0": { - "then": "\"\"/ Fait partie du patrimoine par Onroerend Erfgoed" - }, - "1": { - "then": "Enregistré comme patrimoine par la Direction du Patrimoine culturel Bruxelles" - }, - "2": { - "then": "Enregistré comme patrimoine par une autre organisation" - }, - "3": { - "then": "Non enregistré comme patrimoine" - }, - "4": { - "then": "Enregistré comme patrimoine par une autre organisation" - } - }, - "question": "Cet arbre est-il inscrit au patrimoine ?" - }, - "tree-leaf_type": { - "mappings": { - "0": { - "then": "\"\"/ Feuillu" - }, - "1": { - "then": "\"\"/ Résineux" - }, - "2": { - "then": "\"\"/ Sans feuilles (Permanent)" - } - }, - "question": "Cet arbre est-il un feuillu ou un résineux ?" - }, - "tree_node-name": { - "mappings": { - "0": { - "then": "L'arbre n'a pas de nom." - } - }, - "question": "L'arbre a-t-il un nom ?", - "render": "Nom : {name}" - }, - "tree_node-ref:OnroerendErfgoed": { - "question": "Quel est son identifiant donné par Onroerend Erfgoed ?", - "render": "\"\"/ Identifiant Onroerend Erfgoed : {ref:OnroerendErfgoed}" - }, - "tree_node-wikidata": { - "question": "Quel est l'identifiant Wikidata de cet arbre ?", - "render": "\"\"/ Wikidata : {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Arbre" - } - }, - "viewpoint": { - "description": "Un beau point de vue ou une belle vue. Idéal pour ajouter une image si aucune autre catégorie ne convient", - "name": "Point de vue", - "presets": { - "0": { - "title": "Point de vue" - } - }, - "tagRenderings": { - "viewpoint-description": { - "question": "Voulez-vous ajouter une description ?" - } - }, - "title": { - "render": "Point de vue" + "title": { + "mappings": { + "0": { + "then": "Œuvre d'art {name}" } + }, + "render": "Œuvre d'art" } + }, + "bench": { + "name": "Bancs", + "presets": { + "0": { + "title": "banc" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Dossier : Oui" + }, + "1": { + "then": "Dossier : Non" + } + }, + "question": "Ce banc dispose-t-il d'un dossier ?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "Couleur : marron" + }, + "1": { + "then": "Couleur : verte" + }, + "2": { + "then": "Couleur : gris" + }, + "3": { + "then": "Couleur : blanc" + }, + "4": { + "then": "Couleur : rouge" + }, + "5": { + "then": "Couleur : noire" + }, + "6": { + "then": "Couleur : bleu" + }, + "7": { + "then": "Couleur : jaune" + } + }, + "question": "Quelle est la couleur de ce banc ?", + "render": "Couleur : {colour}" + }, + "bench-direction": { + "question": "Dans quelle direction regardez-vous quand vous êtes assis sur le banc ?", + "render": "Assis sur le banc, on regarde vers {direction}°." + }, + "bench-material": { + "mappings": { + "0": { + "then": "Matériau : bois" + }, + "1": { + "then": "Matériau : métal" + }, + "2": { + "then": "Matériau : pierre" + }, + "3": { + "then": "Matériau : béton" + }, + "4": { + "then": "Matériau : plastique" + }, + "5": { + "then": "Matériau : acier" + } + }, + "question": "De quel matériau ce banc est-il fait ?", + "render": "Matériau : {material}" + }, + "bench-seats": { + "question": "De combien de places dispose ce banc ?", + "render": "{seats} places" + }, + "bench-survey:date": { + "question": "Quand ce banc a-t-il été contrôlé pour la dernière fois ?", + "render": "Ce banc a été contrôlé pour la dernière fois le {survey:date}" + } + }, + "title": { + "render": "Banc" + } + }, + "bench_at_pt": { + "name": "Bancs des arrêts de transport en commun", + "tagRenderings": { + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "Banc assis debout" + } + } + }, + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Banc d'un arrêt de transport en commun" + }, + "1": { + "then": "Banc dans un abri" + } + }, + "render": "Banc" + } + }, + "bicycle_library": { + "description": "Un lieu où des vélos peuvent être empruntés pour un temps plus long", + "name": "Vélothèque", + "presets": { + "0": { + "description": "Une vélothèque a une flotte de vélos qui peuvent être empruntés", + "title": "Vélothèque" + } + }, + "tagRenderings": { + "bicycle-library-target-group": { + "mappings": { + "0": { + "then": "Vélos pour enfants disponibles" + }, + "1": { + "then": "Vélos pour adultes disponibles" + }, + "2": { + "then": "Vélos pour personnes handicapées disponibles" + } + }, + "question": "Qui peut emprunter des vélos ici ?" + }, + "bicycle_library-charge": { + "mappings": { + "0": { + "then": "L'emprunt de vélo est gratuit" + }, + "1": { + "then": "Emprunter un vélo coûte 20 €/an et 20 € de garantie" + } + }, + "question": "Combien coûte l'emprunt d'un vélo ?", + "render": "Emprunter un vélo coûte {charge}" + }, + "bicycle_library-name": { + "question": "Quel est le nom de cette vélothèque ?", + "render": "Cette vélothèque s'appelle {name}" + } + }, + "title": { + "render": "Vélothèque" + } + }, + "bicycle_tube_vending_machine": { + "name": "Distributeur automatique de chambre à air de vélo", + "presets": { + "0": { + "title": "Distributeur automatique de chambre à air de vélo" + } + }, + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "Le distributeur automatique fonctionne" + }, + "1": { + "then": "Le distributeur automatique est en panne" + }, + "2": { + "then": "Le distributeur automatique est fermé" + } + }, + "question": "Cette machine est-elle encore opérationelle ?", + "render": "L'état opérationnel est {operational_status}" + } + }, + "title": { + "render": "Distributeur automatique de chambre à air de vélo" + } + }, + "bike_cafe": { + "name": "Café vélo", + "presets": { + "0": { + "title": "Café Vélo" + } + }, + "tagRenderings": { + "bike_cafe-bike-pump": { + "mappings": { + "0": { + "then": "Ce Café vélo offre une pompe en libre accès" + }, + "1": { + "then": "Ce Café vélo n'offre pas de pompe en libre accès" + } + }, + "question": "Est-ce que ce Café vélo propose une pompe en libre accès ?" + }, + "bike_cafe-email": { + "question": "Quelle est l'adresse électronique de {name} ?" + }, + "bike_cafe-name": { + "question": "Quel est le nom de ce Café vélo ?", + "render": "Ce Café vélo s'appelle {name}" + }, + "bike_cafe-opening_hours": { + "question": "Quand ce Café vélo est-t-il ouvert ?" + }, + "bike_cafe-phone": { + "question": "Quel est le numéro de téléphone de {name} ?" + }, + "bike_cafe-repair-service": { + "mappings": { + "0": { + "then": "Ce Café vélo répare les vélos" + }, + "1": { + "then": "Ce Café vélo ne répare pas les vélos" + } + }, + "question": "Est-ce que ce Café vélo répare les vélos ?" + }, + "bike_cafe-repair-tools": { + "mappings": { + "0": { + "then": "Ce Café vélo propose des outils pour réparer son vélo soi-même" + }, + "1": { + "then": "Ce Café vélo ne propose pas d'outils pour réparer son vélo soi-même" + } + }, + "question": "Est-ce qu'il y a des outils pour réparer soi-même son vélo ?" + }, + "bike_cafe-website": { + "question": "Quel est le site web de {name} ?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Café Vélo {name}" + } + }, + "render": "Café Vélo" + } + }, + "bike_cleaning": { + "name": "Service de nettoyage de vélo", + "presets": { + "0": { + "title": "Service de nettoyage de vélo" + } + }, + "title": { + "mappings": { + "0": { + "then": "Service de nettoyage de vélo {name}" + } + }, + "render": "Service de nettoyage de vélo" + } + }, + "bike_parking": { + "name": "Parking à vélo", + "presets": { + "0": { + "title": "Parking à vélo" + } + }, + "tagRenderings": { + "Access": { + "mappings": { + "0": { + "then": "Accessible publiquement" + }, + "1": { + "then": "Accès destiné principalement aux visiteurs d'un lieu" + }, + "2": { + "then": "Accès limité aux membres d'une école, entreprise ou organisation" + } + }, + "question": "Qui peut utiliser ce parking à vélo ?", + "render": "{access}" + }, + "Bicycle parking type": { + "mappings": { + "0": { + "then": "Arceaux " + }, + "1": { + "then": "Pinces-roues " + }, + "2": { + "then": "Support guidon " + }, + "3": { + "then": "Râtelier " + }, + "4": { + "then": "Superposé " + }, + "5": { + "then": "Abri " + }, + "6": { + "then": "Potelet " + }, + "7": { + "then": "Zone au sol qui est marquée pour le stationnement des vélos" + } + }, + "question": "Quel type de parking à vélos est-ce ?", + "render": "Ceci est un parking à vélo de type {bicycle_parking}" + }, + "Capacity": { + "question": "Combien de vélos entrent dans ce parking à vélos (y compris les éventuels vélos de transport) ?", + "render": "Place pour {capacity} vélos" + }, + "Cargo bike capacity?": { + "question": "Combien de vélos de transport entrent dans ce parking à vélos ?", + "render": "Ce parking a de la place pour {capacity:cargo_bike} vélos de transport" + }, + "Cargo bike spaces?": { + "mappings": { + "0": { + "then": "Ce parking a de la place pour les vélos cargo" + }, + "1": { + "then": "Ce parking a des emplacements (officiellement) destinés aux vélos cargo." + }, + "2": { + "then": "Il est interdit de garer des vélos cargo" + } + }, + "question": "Est-ce que ce parking à vélo a des emplacements pour des vélos cargo ?" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "Ce parking est couvert (il a un toit)" + }, + "1": { + "then": "Ce parking n'est pas couvert" + } + }, + "question": "Ce parking est-il couvert ? Sélectionnez aussi \"couvert\" pour les parkings en intérieur." + }, + "Underground?": { + "mappings": { + "0": { + "then": "Parking souterrain" + }, + "1": { + "then": "Parking en surface" + }, + "2": { + "then": "Parking sur un toit" + }, + "3": { + "then": "Parking en surface" + }, + "4": { + "then": "Parking sur un toit" + } + }, + "question": "Quelle est la position relative de ce parking à vélo ?" + } + }, + "title": { + "render": "Parking à vélo" + } + }, + "bike_repair_station": { + "name": "Station velo (réparation, pompe à vélo)", + "presets": { + "0": { + "description": "Un dispositif pour gonfler vos pneus sur un emplacement fixe dans l'espace public.

    Exemples de pompes à vélo

    ", + "title": "Pompe à vélo" + }, + "1": { + "description": "Un dispositif avec des outils pour réparer votre vélo combiné à une pompe a un emplacement fixe. Les outils sont souvent attachés par une chaîne pour empêcher le vol.

    Exemple

    ", + "title": "Point de réparation vélo avec pompe" + }, + "2": { + "title": "Point de réparation vélo sans pompe" + } + }, + "tagRenderings": { + "Operational status": { + "mappings": { + "0": { + "then": "La pompe à vélo est cassée" + }, + "1": { + "then": "La pompe est opérationnelle" + } + }, + "question": "La pompe à vélo fonctionne-t-elle toujours ?" + }, + "bike_repair_station-available-services": { + "mappings": { + "0": { + "then": "Il y a seulement une pompe" + }, + "1": { + "then": "Il y a seulement des outils (tournevis, pinces...)" + }, + "2": { + "then": "Il y a des outils et une pompe" + } + }, + "question": "Quels services sont valables à cette station vélo ?" + }, + "bike_repair_station-bike-chain-tool": { + "mappings": { + "0": { + "then": "Il y a un outil pour réparer la chaine" + }, + "1": { + "then": "Il n'y a pas d'outil pour réparer la chaine" + } + }, + "question": "Est-ce que cette station vélo a un outil specifique pour réparer la chaîne du vélo ?" + }, + "bike_repair_station-bike-stand": { + "mappings": { + "0": { + "then": "Il y a un crochet ou une accroche" + }, + "1": { + "then": "Il n'y pas de crochet ou d'accroche" + } + }, + "question": "Est-ce que cette station vélo à un crochet pour suspendre son vélo ou une accroche pour l'élevé ?" + }, + "bike_repair_station-electrical_pump": { + "mappings": { + "0": { + "then": "Pompe manuelle" + }, + "1": { + "then": "Pompe électrique" + } + }, + "question": "Est-ce que cette pompe est électrique ?" + }, + "bike_repair_station-manometer": { + "mappings": { + "0": { + "then": "Il y a un manomètre" + }, + "1": { + "then": "Il n'y a pas de manomètre" + }, + "2": { + "then": "Il y a un manomètre mais il est cassé" + } + }, + "question": "Est-ce que la pompe à un manomètre integré ?" + }, + "bike_repair_station-opening_hours": { + "mappings": { + "0": { + "then": "Ouvert en permanence" + }, + "1": { + "then": "Ouvert en permanence" + } + }, + "question": "Quand ce point de réparation de vélo est-il ouvert ?" + }, + "bike_repair_station-operator": { + "question": "Qui maintient cette pompe à vélo ?", + "render": "Mantenue par {operator}" + }, + "bike_repair_station-valves": { + "mappings": { + "0": { + "then": "Sclaverand (aussi appelé Presta)" + }, + "1": { + "then": "Dunlop" + }, + "2": { + "then": "Schrader (les valves de voitures)" + } + }, + "question": "Quelles valves sont compatibles ?", + "render": "Cette pompe est compatible avec les valves suivantes : {valves}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Point de réparation velo" + }, + "1": { + "then": "Point de réparation" + }, + "2": { + "then": "Pompe cassée" + }, + "3": { + "then": "Pompe de vélo {name}" + }, + "4": { + "then": "Pompe de vélo" + } + }, + "render": "Point station velo avec pompe" + } + }, + "bike_shop": { + "description": "Un magasin vendant spécifiquement des vélos ou des objets en lien", + "name": "Magasin ou réparateur de vélo", + "presets": { + "0": { + "title": "Magasin et réparateur de vélo" + } + }, + "tagRenderings": { + "bike_repair_bike-pump-service": { + "mappings": { + "0": { + "then": "Ce magasin offre une pompe en acces libre" + }, + "1": { + "then": "Ce magasin n'offre pas de pompe en libre accès" + }, + "2": { + "then": "Il y a une pompe à vélo, c'est indiqué comme un point séparé " + } + }, + "question": "Est-ce que ce magasin offre une pompe en accès libre ?" + }, + "bike_repair_bike-wash": { + "mappings": { + "0": { + "then": "Ce magasin lave les vélos" + }, + "1": { + "then": "Ce magasin a une installation pour laver soi même des vélos" + }, + "2": { + "then": "Ce magasin ne fait pas le nettoyage de vélo" + } + }, + "question": "Lave-t-on les vélos ici ?" + }, + "bike_repair_rents-bikes": { + "mappings": { + "0": { + "then": "Ce magasin loue des vélos" + }, + "1": { + "then": "Ce magasin ne loue pas de vélos" + } + }, + "question": "Est-ce ce magasin loue des vélos ?" + }, + "bike_repair_repairs-bikes": { + "mappings": { + "0": { + "then": "Ce magasin répare des vélos" + }, + "1": { + "then": "Ce magasin ne répare pas les vélos" + }, + "2": { + "then": "Ce magasin ne répare seulement les vélos achetés là-bas" + }, + "3": { + "then": "Ce magasin ne répare seulement des marques spécifiques" + } + }, + "question": "Est-ce que ce magasin répare des vélos ?" + }, + "bike_repair_second-hand-bikes": { + "mappings": { + "0": { + "then": "Ce magasin vend des vélos d'occasion" + }, + "1": { + "then": "Ce magasin ne vend pas de vélos d'occasion" + }, + "2": { + "then": "Ce magasin vend seulement des vélos d'occasion" + } + }, + "question": "Est-ce ce magasin vend des vélos d'occasion ?" + }, + "bike_repair_sells-bikes": { + "mappings": { + "0": { + "then": "Ce magasin vend des vélos" + }, + "1": { + "then": "Ce magasin ne vend pas de vélo" + } + }, + "question": "Est-ce que ce magasin vend des vélos ?" + }, + "bike_repair_tools-service": { + "mappings": { + "0": { + "then": "Ce magasin offre des outils pour réparer son vélo soi-même" + }, + "1": { + "then": "Ce magasin n'offre pas des outils pour réparer son vélo soi-même" + }, + "2": { + "then": "Des outils d'auto-réparation sont disponibles uniquement si vous avez acheté ou loué le vélo dans ce magasin" + } + }, + "question": "Est-ce qu'il y a des outils pour réparer son vélo dans ce magasin ?" + }, + "bike_shop-email": { + "question": "Quelle est l'adresse électronique de {name} ?" + }, + "bike_shop-is-bicycle_shop": { + "render": "Ce magasin est spécialisé dans la vente de {shop} et a des activités liées au vélo" + }, + "bike_shop-name": { + "question": "Quel est le nom du magasin de vélos ?", + "render": "Ce magasin s'appelle {name}" + }, + "bike_shop-phone": { + "question": "Quel est le numéro de téléphone de {name} ?" + }, + "bike_shop-website": { + "question": "Quel est le site web de {name} ?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Magasin de sport {name}" + }, + "2": { + "then": "Location de vélo {name}" + }, + "3": { + "then": "Réparateur de vélo {name}" + }, + "4": { + "then": "Magasin de vélo {name}" + }, + "5": { + "then": "Magasin ou réparateur de vélo {name}" + } + }, + "render": "Magasin ou réparateur de vélo" + } + }, + "bike_themed_object": { + "name": "Objet cycliste", + "title": { + "mappings": { + "1": { + "then": "Piste cyclable" + } + }, + "render": "Objet cycliste" + } + }, + "defibrillator": { + "name": "Défibrillateurs", + "presets": { + "0": { + "title": "Défibrillateur" + } + }, + "tagRenderings": { + "defibrillator-access": { + "mappings": { + "0": { + "then": "Librement accessible" + }, + "1": { + "then": "Librement accessible" + }, + "2": { + "then": "Réservé aux clients du lieu" + }, + "3": { + "then": "Non accessible au public (par exemple réservé au personnel, au propriétaire, ...)" + }, + "4": { + "then": "Pas accessible, peut-être uniquement à usage professionnel" + } + }, + "question": "Ce défibrillateur est-il librement accessible ?", + "render": "{access} accessible" + }, + "defibrillator-defibrillator": { + "mappings": { + "0": { + "then": "Il n'y a pas d'information sur le type de dispositif" + }, + "1": { + "then": "C'est un défibrillateur manuel pour professionnel" + }, + "2": { + "then": "C'est un défibrillateur automatique manuel" + } + }, + "question": "Est-ce un défibrillateur automatique normal ou un défibrillateur manuel à usage professionnel uniquement ?" + }, + "defibrillator-defibrillator:location": { + "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (dans la langue local)", + "render": "Informations supplémentaires à propos de l'emplacement (dans la langue locale) :
    {defibrillator:location}" + }, + "defibrillator-defibrillator:location:en": { + "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (en englais)", + "render": "Informations supplémentaires à propos de l'emplacement (en anglais) :
    {defibrillator:location:en}" + }, + "defibrillator-defibrillator:location:fr": { + "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (en français)", + "render": "Informations supplémentaires à propos de l'emplacement (en Français) :
    {defibrillator:location:fr}" + }, + "defibrillator-description": { + "question": "Y a-t-il des informations utiles pour les utilisateurs que vous n'avez pas pu décrire ci-dessus ? (laisser vide sinon)", + "render": "Informations supplémentaires : {description}" + }, + "defibrillator-email": { + "question": "Quelle est l'adresse électronique pour des questions à propos de ce défibrillateur ?", + "render": "Adresse électronique pour des questions à propos de ce défibrillateur : {email}" + }, + "defibrillator-fixme": { + "question": "Y a-t-il quelque chose qui ne va pas dans la manière dont ça a été cartographié, et que vous n'avez pas pu réparer ici ? (laisser une note pour les experts d'OpenStreetMap)", + "render": "Informations supplémentaires pour les experts d'OpenStreetMap : {fixme}" + }, + "defibrillator-indoors": { + "mappings": { + "0": { + "then": "Ce défibrillateur est en intérieur (dans un batiment)" + }, + "1": { + "then": "Ce défibrillateur est situé en extérieur" + } + }, + "question": "Ce défibrillateur est-il disposé en intérieur ?" + }, + "defibrillator-level": { + "mappings": { + "0": { + "then": "Ce défibrillateur est au rez-de-chaussée" + }, + "1": { + "then": "Ce défibrillateur est au premier étage" + } + }, + "question": "À quel étage est situé ce défibrillateur ?", + "render": "Ce défibrillateur est à l'étage {level}" + }, + "defibrillator-opening_hours": { + "mappings": { + "0": { + "then": "Ouvert 24/7 (jours feriés inclus)" + } + }, + "question": "À quels horaires ce défibrillateur est-il accessible ?", + "render": "{opening_hours_table(opening_hours)}" + }, + "defibrillator-phone": { + "question": "Quel est le numéro de téléphone pour questions sur le défibrillateur ?", + "render": "Numéro de téléphone pour questions sur le défibrillateur : {phone}" + }, + "defibrillator-ref": { + "question": "Quel est le numéro d'identification officiel de ce dispositif ? (si il est visible sur le dispositif)", + "render": "Numéro d'identification officiel de ce dispositif : {ref}" + }, + "defibrillator-survey:date": { + "mappings": { + "0": { + "then": "Vérifié aujourd'hui !" + } + }, + "question": "Quand le défibrillateur a-t-il été vérifié pour la dernière fois ?", + "render": "Ce défibrillateur a été vérifié pour la dernière fois le {survey:date}" + } + }, + "title": { + "render": "Défibrillateur" + } + }, + "direction": { + "description": "Cette couche visualise les directions", + "name": "Visualisation de la direction" + }, + "drinking_water": { + "name": "Eau potable", + "presets": { + "0": { + "title": "eau potable" + } + }, + "tagRenderings": { + "Bottle refill": { + "mappings": { + "0": { + "then": "Il est facile de remplir les bouteilles d'eau" + }, + "1": { + "then": "Les bouteilles d'eau peuvent ne pas passer" + } + }, + "question": "Est-il facile de remplir des bouteilles d'eau ?" + }, + "Still in use?": { + "mappings": { + "0": { + "then": "Cette fontaine fonctionne" + }, + "1": { + "then": "Cette fontaine est cassée" + }, + "2": { + "then": "Cette fontaine est fermée" + } + }, + "question": "Ce point d'eau potable est-il toujours opérationnel ?", + "render": "L'état opérationnel est {operational_status}" + }, + "render-closest-drinking-water": { + "render": "Une autre source d’eau potable est à {_closest_other_drinking_water_distance} mètres a>" + } + }, + "title": { + "render": "Eau potable" + } + }, + "food": { + "tagRenderings": { + "friture-oil": { + "mappings": { + "0": { + "then": "Huile végétale" + }, + "1": { + "then": "Graisse animale" + } + }, + "question": "Cette friteuse fonctionne-t-elle avec de la graisse animale ou végétale ?" + }, + "friture-take-your-container": { + "mappings": { + "0": { + "then": "Vous pouvez apporter vos contenants pour votre commande, limitant l’usage de matériaux à usage unique et les déchets" + }, + "1": { + "then": "Apporter ses propres contenants n’est pas permis" + }, + "2": { + "then": "Il est obligatoire d’apporter ses propres contenants" + } + }, + "question": "Est-il proposé d’utiliser ses propres contenants pour sa commande ?
    " + }, + "friture-vegan": { + "mappings": { + "0": { + "then": "Des collations végétaliens sont disponibles" + }, + "1": { + "then": "Quelques snacks végétaliens seulement" + }, + "2": { + "then": "Pas d'en-cas végétaliens disponibles" + } + }, + "question": "Cette friterie est-elle équipée de snacks végétaliens ?" + }, + "friture-vegetarian": { + "mappings": { + "0": { + "then": "Des collations végétariens sont disponibles" + }, + "1": { + "then": "Quelques snacks végétariens seulement" + }, + "2": { + "then": "Pas d'en-cas végétariens disponibles" + } + }, + "question": "Cette friterie est-elle équipée de snacks végétariens ?" + } + } + }, + "ghost_bike": { + "name": "Vélos fantômes", + "presets": { + "0": { + "title": "Vélo fantôme" + } + }, + "tagRenderings": { + "ghost-bike-explanation": { + "render": "Un vélo fantôme est un monument commémoratif pour un cycliste décédé dans un accident de la route, sous la forme d'un vélo blanc placé en permanence près du lieu de l'accident." + }, + "ghost_bike-inscription": { + "question": "Quelle est l'inscription sur ce vélo fantôme ?", + "render": "{inscription}" + }, + "ghost_bike-name": { + "mappings": { + "0": { + "then": "Aucun nom n'est marqué sur le vélo" + } + }, + "question": "À qui est dédié ce vélo fantôme ?
    Veuillez respecter la vie privée – ajoutez le nom seulement s'il est largement publié ou marqué sur le vélo. Choisissez de ne pas indiquer le nom de famille
    ", + "render": "En souvenir de {name}" + }, + "ghost_bike-source": { + "question": "Sur quelle page web peut-on trouver plus d'informations sur le Vélo fantôme ou l'accident ?", + "render": "
    Plus d'informations sont disponibles" + }, + "ghost_bike-start_date": { + "question": "Quand ce vélo fantôme a-t-il été installée ?", + "render": "Placé le {start_date}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Vélo fantôme en souvenir de {name}" + } + }, + "render": "Vélo fantôme" + } + }, + "information_board": { + "name": "Panneaux d'informations", + "presets": { + "0": { + "title": "panneau d'informations" + } + }, + "title": { + "render": "Panneau d'informations" + } + }, + "map": { + "description": "Une carte, destinée aux touristes, installée en permanence dans l'espace public", + "name": "Cartes", + "presets": { + "0": { + "description": "Ajouter une carte manquante", + "title": "Carte" + } + }, + "tagRenderings": { + "map-attribution": { + "mappings": { + "0": { + "then": "L’attribution est clairement inscrite ainsi que la licence ODBL" + }, + "1": { + "then": "L’attribution est clairement inscrite mais la licence est absente" + }, + "2": { + "then": "OpenStreetMap n’est pas mentionné, un sticker OpenStreetMap a été collé" + }, + "3": { + "then": "Il n'y a aucune attribution" + }, + "4": { + "then": "Il n'y a aucune attribution" + } + }, + "question": "L’attribution à OpenStreetMap est elle-présente ?" + }, + "map-map_source": { + "mappings": { + "0": { + "then": "Cette carte est basée sur OpenStreetMap" + } + }, + "question": "Sur quelles données cette carte est-elle basée ?", + "render": "Cette carte est basée sur {map_source}" + } + }, + "title": { + "render": "Carte" + } + }, + "nature_reserve": { + "tagRenderings": { + "Curator": { + "question": "Qui est en charge de la conservation de la réserve ?
    À ne remplir seulement que si le nom est diffusé au public", + "render": "{curator} est en charge de la conservation de la réserve" + }, + "Dogs?": { + "mappings": { + "0": { + "then": "Les chiens doivent être tenus en laisse" + }, + "1": { + "then": "Chiens interdits" + }, + "2": { + "then": "Les chiens sont autorisés à se promener librement" + } + }, + "question": "Les chiens sont-ils autorisés dans cette réserve naturelle ?" + }, + "Email": { + "question": "À quelle adresse courriel peut-on envoyer des questions et des problèmes concernant cette réserve naturelle ?
    Respecter la vie privée – renseignez une adresse électronique personnelle seulement si celle-ci est largement publiée", + "render": "{email}" + }, + "Surface area": { + "render": "Superficie : {_surface:ha} ha" + }, + "Website": { + "question": "Sur quelle page web peut-on trouver plus d'informations sur cette réserve naturelle ?" + }, + "phone": { + "question": "Quel numéro de téléphone peut-on appeler pour poser des questions et résoudre des problèmes concernant cette réserve naturelle ?
    Respecter la vie privée – renseignez un numéro de téléphone personnel seulement si celui-ci est largement publié", + "render": "{phone}" + } + } + }, + "picnic_table": { + "description": "La couche montrant les tables de pique-nique", + "name": "Tables de pique-nique", + "presets": { + "0": { + "title": "table de pique-nique" + } + }, + "tagRenderings": { + "picnic_table-material": { + "mappings": { + "0": { + "then": "C’est une table en bois" + }, + "1": { + "then": "C’est une table en béton" + } + }, + "question": "En quel matériau est faite la table de pique-nique ?", + "render": "La table est faite en {material}" + } + }, + "title": { + "render": "Table de pique-nique" + } + }, + "playground": { + "description": "Aire de jeu", + "name": "Aire de jeu", + "presets": { + "0": { + "title": "Terrain de jeux" + } + }, + "tagRenderings": { + "Playground-wheelchair": { + "mappings": { + "0": { + "then": "Entièrement accessible aux personnes en fauteuil roulant" + }, + "1": { + "then": "Accessibilité limitée pour les personnes en fauteuil roulant" + }, + "2": { + "then": "Non accessible aux personnes en fauteuil roulant" + } + }, + "question": "Ce terrain de jeux est-il accessible aux personnes en fauteuil roulant ?" + }, + "playground-access": { + "mappings": { + "0": { + "then": "Accessible au public" + }, + "1": { + "then": "Accessible au public" + }, + "2": { + "then": "Réservée aux clients" + }, + "3": { + "then": "Réservée aux élèves de l’école" + }, + "4": { + "then": "Non accessible" + } + }, + "question": "L’aire de jeu est-elle accessible au public ?" + }, + "playground-email": { + "question": "Quelle est l'adresse électronique du responsable de l'aire de jeux ?", + "render": "{email}" + }, + "playground-lit": { + "mappings": { + "0": { + "then": "L’aire de jeu est éclairée de nuit" + }, + "1": { + "then": "L’aire de jeu n’est pas éclairée de nuit" + } + }, + "question": "Ce terrain de jeux est-il éclairé la nuit ?" + }, + "playground-max_age": { + "question": "Quel est l’âge maximum autorisé pour utiliser l’aire de jeu ?", + "render": "Accessible aux enfants de {max_age} au maximum" + }, + "playground-min_age": { + "question": "Quel est l'âge minimal requis pour accéder à ce terrain de jeux ?", + "render": "Accessible aux enfants de plus de {min_age} ans" + }, + "playground-opening_hours": { + "mappings": { + "0": { + "then": "Accessible du lever au coucher du soleil" + }, + "1": { + "then": "Toujours accessible" + }, + "2": { + "then": "Toujours accessible" + } + }, + "question": "Quand ce terrain de jeux est-il accessible ?" + }, + "playground-operator": { + "question": "Qui est en charge de l’exploitation de l’aire de jeu ?", + "render": "Exploité par {operator}" + }, + "playground-phone": { + "question": "Quel est le numéro de téléphone du responsable du terrain de jeux ?", + "render": "{phone}" + }, + "playground-surface": { + "mappings": { + "0": { + "then": "La surface est en gazon" + }, + "1": { + "then": "La surface est en sable" + }, + "2": { + "then": "La surface est en copeaux de bois" + }, + "3": { + "then": "La surface est en pavés" + }, + "4": { + "then": "La surface est en bitume" + }, + "5": { + "then": "La surface est en béton" + }, + "6": { + "then": "La surface n’a pas de revêtement" + }, + "7": { + "then": "La surface a un revêtement" + } + }, + "question": "De quelle matière est la surface de l’aire de jeu ?
    Pour plusieurs matières, sélectionner la principale", + "render": "La surface est en {surface}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Aire de jeu {name}" + } + }, + "render": "Aire de jeu" + } + }, + "public_bookcase": { + "description": "Une armoire ou une boite contenant des livres en libre accès", + "name": "Microbibliothèque", + "presets": { + "0": { + "title": "Microbibliothèque" + } + }, + "tagRenderings": { + "bookcase-booktypes": { + "mappings": { + "0": { + "then": "Livres pour enfants" + }, + "1": { + "then": "Livres pour les adultes" + }, + "2": { + "then": "Livres pour enfants et adultes également" + } + }, + "question": "Quel type de livres peut-on dans cette microbibliothèque ?" + }, + "bookcase-is-accessible": { + "mappings": { + "0": { + "then": "Accèssible au public" + }, + "1": { + "then": "Accèssible aux clients" + } + }, + "question": "Cette microbibliothèque est-elle librement accèssible ?" + }, + "bookcase-is-indoors": { + "mappings": { + "0": { + "then": "Cette microbibliothèque est en intérieur" + }, + "1": { + "then": "Cette microbibliothèque est en extérieur" + }, + "2": { + "then": "Cette microbibliothèque est en extérieur" + } + }, + "question": "Cette microbiliothèque est-elle en extérieur ?" + }, + "public_bookcase-brand": { + "mappings": { + "0": { + "then": "Fait partie du réseau Little Free Library" + }, + "1": { + "then": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe" + } + }, + "question": "Cette microbibliothèque fait-elle partie d'un réseau/groupe ?", + "render": "Cette microbibliothèque fait partie du groupe {brand}" + }, + "public_bookcase-capacity": { + "question": "Combien de livres peuvent entrer dans cette microbibliothèque ?", + "render": "{capacity} livres peuvent entrer dans cette microbibliothèque" + }, + "public_bookcase-name": { + "mappings": { + "0": { + "then": "Cette microbibliothèque n'a pas de nom" + } + }, + "question": "Quel est le nom de cette microbibliothèque ?", + "render": "Le nom de cette microbibliothèque est {name}" + }, + "public_bookcase-operator": { + "question": "Qui entretien cette microbibliothèque ?", + "render": "Entretenue par {operator}" + }, + "public_bookcase-ref": { + "mappings": { + "0": { + "then": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe" + } + }, + "question": "Quelle est le numéro de référence de cette microbibliothèque ?", + "render": "Cette microbibliothèque du réseau {brand} possède le numéro {ref}" + }, + "public_bookcase-start_date": { + "question": "Quand a été installée cette microbibliothèque ?", + "render": "Installée le {start_date}" + }, + "public_bookcase-website": { + "question": "Y a-t-il un site web avec plus d'informations sur cette microbibliothèque ?", + "render": "Plus d'infos sur le site web" + } + }, + "title": { + "mappings": { + "0": { + "then": "Microbibliothèque {name}" + } + }, + "render": "Microbibliothèque" + } + }, + "shops": { + "description": "Un magasin", + "name": "Magasin", + "presets": { + "0": { + "description": "Ajouter un nouveau magasin", + "title": "Magasin" + } + }, + "tagRenderings": { + "shops-email": { + "question": "Quelle est l'adresse électronique de ce magasin ?", + "render": "{email}" + }, + "shops-name": { + "question": "Qu'est-ce que le nom de ce magasin?" + }, + "shops-opening_hours": { + "question": "Quels sont les horaires d'ouverture de ce magasin ?", + "render": "{opening_hours_table(opening_hours)}" + }, + "shops-phone": { + "question": "Quel est le numéro de téléphone ?", + "render": "{phone}" + }, + "shops-shop": { + "mappings": { + "0": { + "then": "Épicerie/superette" + }, + "1": { + "then": "Supermarché" + }, + "2": { + "then": "Magasin de vêtements" + }, + "3": { + "then": "Coiffeur" + }, + "4": { + "then": "Boulangerie" + }, + "5": { + "then": "Garage de réparation automobile" + }, + "6": { + "then": "Concessionnaire" + } + }, + "question": "Que vends ce magasin ?", + "render": "Ce magasin vends {shop}" + }, + "shops-website": { + "question": "Quel est le site internet de ce magasin ?", + "render": "{website}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "{shop}" + } + }, + "render": "Magasin" + } + }, + "slow_roads": { + "tagRenderings": { + "slow_roads-surface": { + "mappings": { + "0": { + "then": "La surface est en herbe" + }, + "1": { + "then": "La surface est en terre" + }, + "2": { + "then": "La surface est non pavée" + }, + "3": { + "then": "La surface est en sable" + }, + "4": { + "then": "La surface est en pierres pavées" + }, + "5": { + "then": "La surface est en bitume" + }, + "6": { + "then": "La surface est en béton" + }, + "7": { + "then": "La surface est pavée" + } + }, + "render": "La surface en {surface}" + } + } + }, + "sport_pitch": { + "description": "Un terrain de sport", + "name": "Terrains de sport", + "presets": { + "0": { + "title": "Table de ping-pong" + }, + "1": { + "title": "Terrain de sport" + } + }, + "tagRenderings": { + "sport-pitch-access": { + "mappings": { + "0": { + "then": "Accessible au public" + }, + "1": { + "then": "Accès limité (par exemple uniquement sur réservation, à certains horaires…)" + }, + "2": { + "then": "Accessible uniquement aux membres du club" + }, + "3": { + "then": "Privé - Pas accessible au public" + } + }, + "question": "Est-ce que ce terrain de sport est accessible au public ?" + }, + "sport-pitch-reservation": { + "mappings": { + "0": { + "then": "Il est obligatoire de réserver pour utiliser ce terrain de sport" + }, + "1": { + "then": "Il est recommendé de réserver pour utiliser ce terrain de sport" + }, + "2": { + "then": "Il est possible de réserver, mais ce n'est pas nécéssaire pour utiliser ce terrain de sport" + }, + "3": { + "then": "On ne peut pas réserver" + } + }, + "question": "Doit-on réserver pour utiliser ce terrain de sport ?" + }, + "sport_pitch-email": { + "question": "Quelle est l'adresse courriel du gérant ?" + }, + "sport_pitch-opening_hours": { + "mappings": { + "1": { + "then": "Accessible en permanence" + } + }, + "question": "Quand ce terrain est-il accessible ?" + }, + "sport_pitch-phone": { + "question": "Quel est le numéro de téléphone du gérant ?" + }, + "sport_pitch-sport": { + "mappings": { + "0": { + "then": "Ici, on joue au basketball" + }, + "1": { + "then": "Ici, on joue au football" + }, + "2": { + "then": "C'est une table de ping-pong" + }, + "3": { + "then": "Ici, on joue au tennis" + }, + "4": { + "then": "Ici, on joue au korfball" + }, + "5": { + "then": "Ici, on joue au basketball" + } + }, + "question": "À quel sport peut-on jouer ici ?", + "render": "Ici on joue au {sport}" + }, + "sport_pitch-surface": { + "mappings": { + "0": { + "then": "La surface est de l'herbe" + }, + "1": { + "then": "La surface est du sable" + }, + "2": { + "then": "La surface est des pavés" + }, + "3": { + "then": "La surface est de l'asphalte" + }, + "4": { + "then": "La surface est du béton" + } + }, + "question": "De quelle surface est fait ce terrain de sport ?", + "render": "La surface est {surface}" + } + }, + "title": { + "render": "Terrain de sport" + } + }, + "surveillance_camera": { + "name": "Caméras de surveillance", + "tagRenderings": { + "Camera type: fixed; panning; dome": { + "mappings": { + "0": { + "then": "Une caméra fixe (non mobile)" + }, + "1": { + "then": "Une caméra dôme (qui peut tourner)" + }, + "2": { + "then": "Une caméra panoramique" + } + }, + "question": "Quel genre de caméra est-ce ?" + }, + "Level": { + "question": "À quel niveau se trouve cette caméra ?", + "render": "Situé au niveau {level}" + }, + "Operator": { + "question": "Qui exploite ce système de vidéosurveillance ?", + "render": "Exploité par {operator}" + }, + "Surveillance type: public, outdoor, indoor": { + "mappings": { + "0": { + "then": "Une zone publique est surveillée, telle qu'une rue, un pont, une place, un parc, une gare, un couloir ou un tunnel public…" + }, + "1": { + "then": "Une zone extérieure, mais privée, est surveillée (par exemple, un parking, une station-service, une cour, une entrée, une allée privée, etc.)" + }, + "2": { + "then": "Une zone intérieure privée est surveillée, par exemple un magasin, un parking souterrain privé…" + } + }, + "question": "Quel genre de surveillance est cette caméra" + }, + "Surveillance:zone": { + "mappings": { + "0": { + "then": "Surveille un parking" + }, + "1": { + "then": "Surveille la circulation" + }, + "2": { + "then": "Surveille une entrée" + }, + "3": { + "then": "Surveille un couloir" + }, + "4": { + "then": "Surveille un quai de transport public" + }, + "5": { + "then": "Surveille un magasin" + } + }, + "question": "Qu'est-ce qui est surveillé ici ?", + "render": " Surveille un(e) {surveillance:zone}" + }, + "camera:mount": { + "mappings": { + "0": { + "then": "Cette caméra est placée contre un mur" + }, + "1": { + "then": "Cette caméra est placée sur un poteau" + }, + "2": { + "then": "Cette caméra est placée au plafond" + } + }, + "question": "Comment cette caméra est-elle placée ?", + "render": "Méthode de montage : {camera:mount}" + }, + "camera_direction": { + "mappings": { + "0": { + "then": "Filme dans une direction {direction}" + } + }, + "question": "Dans quelle direction géographique cette caméra filme-t-elle ?", + "render": "Filme dans une direction {camera:direction}" + }, + "is_indoor": { + "mappings": { + "0": { + "then": "Cette caméra est située à l'intérieur" + }, + "1": { + "then": "Cette caméra est située à l'extérieur" + }, + "2": { + "then": "Cette caméra est probablement située à l'extérieur" + } + }, + "question": "L'espace public surveillé par cette caméra est-il un espace intérieur ou extérieur ?" + } + }, + "title": { + "render": "Caméra de surveillance" + } + }, + "toilet": { + "name": "Toilettes", + "presets": { + "0": { + "description": "Des toilettes", + "title": "toilettes" + }, + "1": { + "description": "Toilettes avec au moins un WC accessible aux personnes à mobilité réduite", + "title": "toilettes accessible aux personnes à mobilité réduite" + } + }, + "tagRenderings": { + "toilet-access": { + "mappings": { + "0": { + "then": "Accès publique" + }, + "1": { + "then": "Accès réservé aux clients" + }, + "2": { + "then": "Toilettes privées" + }, + "3": { + "then": "Accessible, mais vous devez demander la clé" + }, + "4": { + "then": "Accès publique" + } + }, + "question": "Ces toilettes sont-elles accessibles au public ?", + "render": "L'accès est {access}" + }, + "toilet-changing_table:location": { + "mappings": { + "0": { + "then": "La table à langer est dans les toilettes pour femmes. " + }, + "1": { + "then": "La table à langer est dans les toilettes pour hommes. " + }, + "2": { + "then": "La table à langer est dans les toilettes pour personnes à mobilité réduite. " + }, + "3": { + "then": "La table à langer est dans un espace dédié. " + } + }, + "question": "Où se situe la table à langer ?", + "render": "Emplacement de la table à langer : {changing_table:location}" + }, + "toilet-charge": { + "question": "Quel est le prix d'accès de ces toilettes ?", + "render": "Le prix est {charge}" + }, + "toilets-changing-table": { + "mappings": { + "0": { + "then": "Une table à langer est disponible" + }, + "1": { + "then": "Aucune table à langer" + } + }, + "question": "Ces toilettes disposent-elles d'une table à langer ?" + }, + "toilets-fee": { + "mappings": { + "0": { + "then": "Toilettes payantes" + }, + "1": { + "then": "Toilettes gratuites" + } + }, + "question": "Ces toilettes sont-elles payantes ?" + }, + "toilets-type": { + "mappings": { + "0": { + "then": "Il y a uniquement des sièges de toilettes" + }, + "1": { + "then": "Il y a uniquement des urinoirs" + }, + "2": { + "then": "Il y a uniquement des toilettes turques" + }, + "3": { + "then": "Il y a des sièges de toilettes et des urinoirs" + } + }, + "question": "De quel type sont ces toilettes ?" + }, + "toilets-wheelchair": { + "mappings": { + "0": { + "then": "Il y a des toilettes réservées pour les personnes à mobilité réduite" + }, + "1": { + "then": "Non accessible aux personnes à mobilité réduite" + } + }, + "question": "Y a-t-il des toilettes réservées aux personnes en fauteuil roulant ?" + } + }, + "title": { + "render": "Toilettes" + } + }, + "tree_node": { + "name": "Arbre", + "presets": { + "0": { + "description": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier.", + "title": "Arbre feuillu" + }, + "1": { + "description": "Une espèce d’arbre avec des épines comme le pin ou l’épicéa.", + "title": "Arbre résineux" + }, + "2": { + "description": "Si vous n'êtes pas sûr(e) de savoir s'il s'agit d'un arbre à feuilles larges ou à aiguilles.", + "title": "Arbre" + } + }, + "tagRenderings": { + "tree-decidouous": { + "mappings": { + "0": { + "then": "Caduc : l’arbre perd son feuillage une partie de l’année." + }, + "1": { + "then": "À feuilles persistantes." + } + }, + "question": "L’arbre est-il à feuillage persistant ou caduc ?" + }, + "tree-denotation": { + "mappings": { + "0": { + "then": "L'arbre est remarquable en raison de sa taille ou de son emplacement proéminent. Il est utile pour la navigation." + }, + "1": { + "then": "Cet arbre est un monument naturel (ex : âge, espèce, etc…)" + }, + "2": { + "then": "Cet arbre est utilisé à but d’agriculture (ex : dans un verger)" + }, + "3": { + "then": "Cet arbre est dans un parc ou une aire similaire (ex : cimetière, cour d’école, …)." + }, + "4": { + "then": "Cet arbre est dans une cour résidentielle." + }, + "5": { + "then": "C'est un arbre le long d'une avenue." + }, + "6": { + "then": "L'arbre est une zone urbaine." + }, + "7": { + "then": "Cet arbre est en zone rurale." + } + }, + "question": "Quelle est l'importance de cet arbre ? Choisissez la première réponse qui s'applique." + }, + "tree-height": { + "mappings": { + "0": { + "then": "Hauteur : {height} m" + } + }, + "render": "Hauteur : {height}" + }, + "tree-heritage": { + "mappings": { + "0": { + "then": "\"\"/ Fait partie du patrimoine par Onroerend Erfgoed" + }, + "1": { + "then": "Enregistré comme patrimoine par la Direction du Patrimoine culturel Bruxelles" + }, + "2": { + "then": "Enregistré comme patrimoine par une autre organisation" + }, + "3": { + "then": "Non enregistré comme patrimoine" + }, + "4": { + "then": "Enregistré comme patrimoine par une autre organisation" + } + }, + "question": "Cet arbre est-il inscrit au patrimoine ?" + }, + "tree-leaf_type": { + "mappings": { + "0": { + "then": "\"\"/ Feuillu" + }, + "1": { + "then": "\"\"/ Résineux" + }, + "2": { + "then": "\"\"/ Sans feuilles (Permanent)" + } + }, + "question": "Cet arbre est-il un feuillu ou un résineux ?" + }, + "tree_node-name": { + "mappings": { + "0": { + "then": "L'arbre n'a pas de nom." + } + }, + "question": "L'arbre a-t-il un nom ?", + "render": "Nom : {name}" + }, + "tree_node-ref:OnroerendErfgoed": { + "question": "Quel est son identifiant donné par Onroerend Erfgoed ?", + "render": "\"\"/ Identifiant Onroerend Erfgoed : {ref:OnroerendErfgoed}" + }, + "tree_node-wikidata": { + "question": "Quel est l'identifiant Wikidata de cet arbre ?", + "render": "\"\"/ Wikidata : {wikidata}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Arbre" + } + }, + "viewpoint": { + "description": "Un beau point de vue ou une belle vue. Idéal pour ajouter une image si aucune autre catégorie ne convient", + "name": "Point de vue", + "presets": { + "0": { + "title": "Point de vue" + } + }, + "tagRenderings": { + "viewpoint-description": { + "question": "Voulez-vous ajouter une description ?" + } + }, + "title": { + "render": "Point de vue" + } + } } \ No newline at end of file diff --git a/langs/layers/gl.json b/langs/layers/gl.json index 0dfb570cbd..8beb2543f4 100644 --- a/langs/layers/gl.json +++ b/langs/layers/gl.json @@ -1,403 +1,403 @@ { - "artwork": { - "presets": { - "0": { - "title": "Obra de arte" - } - }, - "title": { - "mappings": { - "0": { - "then": "Obra de arte {name}" - } - }, - "render": "Obra de arte" - } + "artwork": { + "presets": { + "0": { + "title": "Obra de arte" + } }, - "bike_cafe": { - "name": "Café de ciclistas", - "presets": { - "0": { - "title": "Café de ciclistas" - } - }, - "tagRenderings": { - "bike_cafe-bike-pump": { - "mappings": { - "0": { - "then": "Este café de ciclistas ofrece unha bomba de ar" - }, - "1": { - "then": "Este café de ciclistas non ofrece unha bomba de ar" - } - }, - "question": "Este café de ciclistas ofrece unha bomba de ar para que calquera persoa poida usala?" - }, - "bike_cafe-email": { - "question": "Cal é o enderezo de correo electrónico de {name}?" - }, - "bike_cafe-name": { - "question": "Cal é o nome deste café de ciclistas?", - "render": "Este café de ciclistas chámase {name}" - }, - "bike_cafe-phone": { - "question": "Cal é o número de teléfono de {name}?" - }, - "bike_cafe-repair-service": { - "mappings": { - "0": { - "then": "Este café de ciclistas arranxa bicicletas" - }, - "1": { - "then": "Este café de ciclistas non arranxa bicicletas" - } - }, - "question": "Este café de ciclistas arranxa bicicletas?" - }, - "bike_cafe-repair-tools": { - "mappings": { - "0": { - "then": "Hai ferramentas aquí para arranxar a túa propia bicicleta" - }, - "1": { - "then": "Non hai ferramentas aquí para arranxar a túa propia bicicleta" - } - }, - "question": "Hai ferramentas aquí para arranxar a túa propia bicicleta?" - }, - "bike_cafe-website": { - "question": "Cal é a páxina web de {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Café de ciclistas {name}" - } - }, - "render": "Café de ciclistas" - } - }, - "bike_parking": { - "name": "Aparcadoiro de bicicletas", - "presets": { - "0": { - "title": "Aparcadoiro de bicicletas" - } - }, - "tagRenderings": { - "Bicycle parking type": { - "mappings": { - "0": { - "then": "De roda (Stands) " - }, - "1": { - "then": "Aros " - }, - "2": { - "then": "Cadeado para guiador " - }, - "3": { - "then": "Cremalleira " - }, - "4": { - "then": "Dobre cremalleira " - }, - "5": { - "then": "Abeiro " - } - }, - "question": "Que tipo de aparcadoiro de bicicletas é?", - "render": "Este é un aparcadoiro de bicicletas do tipo: {bicycle_parking}" - }, - "Capacity": { - "question": "Cantas bicicletas caben neste aparcadoiro de bicicletas (incluídas as posíbeis bicicletas de carga)?", - "render": "Lugar para {capacity} bicicletas" - }, - "Cargo bike capacity?": { - "question": "Cantas bicicletas de carga caben neste aparcadoiro de bicicletas?", - "render": "Neste aparcadoiro caben {capacity:cargo_bike} bicicletas de carga" - }, - "Cargo bike spaces?": { - "mappings": { - "0": { - "then": "Este aparcadoiro ten espazo para bicicletas de carga." - }, - "1": { - "then": "Este aparcadoiro ten espazos designados (oficiais) para bicicletas de carga." - }, - "2": { - "then": "Non está permitido aparcar bicicletas de carga" - } - }, - "question": "Este aparcadoiro de bicicletas ten espazo para bicicletas de carga?" - }, - "Is covered?": { - "mappings": { - "0": { - "then": "Este aparcadoiro está cuberto (ten un teito)" - }, - "1": { - "then": "Este aparcadoiro non está cuberto" - } - }, - "question": "Este aparcadoiro está cuberto? Tamén escolle \"cuberto\" para aparcadoiros interiores." - } - }, - "title": { - "render": "Aparcadoiro de bicicletas" - } - }, - "bike_repair_station": { - "name": "Estación de bicicletas (arranxo, bomba de ar ou ambos)", - "presets": { - "0": { - "title": "Bomba de ar" - }, - "1": { - "title": "Estación de arranxo de bicicletas con bomba de ar" - }, - "2": { - "title": "Estación de arranxo de bicicletas sin bomba de ar" - } - }, - "tagRenderings": { - "Operational status": { - "mappings": { - "0": { - "then": "A bomba de ar está estragada" - }, - "1": { - "then": "A bomba de ar está operativa" - } - }, - "question": "Segue a funcionar a bomba de ar?" - }, - "bike_repair_station-available-services": { - "mappings": { - "0": { - "then": "Só hai unha bomba de ar presente" - }, - "1": { - "then": "Só hai ferramentas (desaparafusadores, alicates...) presentes" - }, - "2": { - "then": "Hai ferramentas e unha bomba de ar presentes" - } - }, - "question": "Que servizos están dispoñíbeis nesta estación de bicicletas?" - }, - "bike_repair_station-bike-chain-tool": { - "mappings": { - "0": { - "then": "Hai unha ferramenta para a cadea" - }, - "1": { - "then": "Non hai unha ferramenta para a cadea" - } - }, - "question": "Esta estación de arranxo de bicicletas ten unha ferramenta especial para arranxar a cadea da túa bicicleta?" - }, - "bike_repair_station-bike-stand": { - "mappings": { - "0": { - "then": "Hai un guindastre ou soporte" - }, - "1": { - "then": "Non hai un guindastre ou soporte" - } - }, - "question": "Esta estación de bicicletas ten un guindastre para pendurar a túa bicicleta ou un soporte para elevala?" - }, - "bike_repair_station-electrical_pump": { - "mappings": { - "0": { - "then": "Bomba de ar manual" - }, - "1": { - "then": "Bomba de ar eléctrica" - } - }, - "question": "Esta é unha bomba de ar eléctrica?" - }, - "bike_repair_station-manometer": { - "mappings": { - "0": { - "then": "Hai manómetro" - }, - "1": { - "then": "Non hai manómetro" - }, - "2": { - "then": "Hai manómetro pero está estragado" - } - }, - "question": "Ten a bomba de ar un indicador de presión ou un manómetro?" - }, - "bike_repair_station-valves": { - "mappings": { - "0": { - "then": "Sclaverand (tamén coñecido como Presta)" - }, - "1": { - "then": "Dunlop" - }, - "2": { - "then": "Schrader (para automóbiles)" - } - }, - "question": "Que válvulas son compatíbeis?", - "render": "Esta bomba de ar admite as seguintes válvulas: {valves}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Estación de arranxo de bicicletas" - }, - "1": { - "then": "Estación de arranxo de bicicletas" - }, - "2": { - "then": "Bomba de ar estragada" - }, - "3": { - "then": "Bomba de ar {name}" - }, - "4": { - "then": "Bomba de ar" - } - }, - "render": "Estación de bicicletas (arranxo e bomba de ar)" - } - }, - "bike_shop": { - "name": "Tenda/arranxo de bicicletas", - "presets": { - "0": { - "title": "Tenda/arranxo de bicicletas" - } - }, - "tagRenderings": { - "bike_repair_bike-pump-service": { - "mappings": { - "0": { - "then": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa" - }, - "1": { - "then": "Esta tenda non ofrece unha bomba de ar para uso de calquera persoa" - } - }, - "question": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa?" - }, - "bike_repair_rents-bikes": { - "mappings": { - "0": { - "then": "Esta tenda aluga bicicletas" - }, - "1": { - "then": "Esta tenda non aluga bicicletas" - } - }, - "question": "Esta tenda aluga bicicletas?" - }, - "bike_repair_repairs-bikes": { - "mappings": { - "0": { - "then": "Esta tenda arranxa bicicletas" - }, - "1": { - "then": "Esta tenda non arranxa bicicletas" - }, - "2": { - "then": "Esta tenda só arranxa bicicletas mercadas aquí" - }, - "3": { - "then": "Esta tenda só arranxa bicicletas dunha certa marca" - } - }, - "question": "Esta tenda arranxa bicicletas?" - }, - "bike_repair_second-hand-bikes": { - "mappings": { - "0": { - "then": "Esta tenda vende bicicletas de segunda man" - }, - "1": { - "then": "Esta tenda non vende bicicletas de segunda man" - }, - "2": { - "then": "Esta tenda só vende bicicletas de segunda man" - } - }, - "question": "Esta tenda vende bicicletas de segunda man?" - }, - "bike_repair_sells-bikes": { - "mappings": { - "0": { - "then": "Esta tenda vende bicicletas" - }, - "1": { - "then": "Esta tenda non vende bicicletas" - } - }, - "question": "Esta tenda vende bicicletas?" - }, - "bike_repair_tools-service": { - "mappings": { - "0": { - "then": "Hai ferramentas aquí para arranxar a túa propia bicicleta" - }, - "1": { - "then": "Non hai ferramentas aquí para arranxar a túa propia bicicleta" - } - }, - "question": "Hai ferramentas aquí para arranxar a túa propia bicicleta?" - }, - "bike_shop-email": { - "question": "Cal é o enderezo de correo electrónico de {name}?" - }, - "bike_shop-name": { - "question": "Cal é o nome desta tenda de bicicletas?", - "render": "Esta tenda de bicicletas chámase {name}" - }, - "bike_shop-phone": { - "question": "Cal é o número de teléfono de {name}?" - }, - "bike_shop-website": { - "question": "Cal é a páxina web de {name}?" - } - }, - "title": { - "mappings": { - "3": { - "then": "Arranxo de bicicletas {name}" - }, - "4": { - "then": "Tenda de bicicletas {name}" - }, - "5": { - "then": "Tenda/arranxo de bicicletas {name}" - } - }, - "render": "Tenda/arranxo de bicicletas" - } - }, - "drinking_water": { - "name": "Auga potábel", - "presets": { - "0": { - "title": "auga potábel" - } - }, - "title": { - "render": "Auga potábel" - } - }, - "ghost_bike": { - "name": "Bicicleta pantasma", - "title": { - "render": "Bicicleta pantasma" + "title": { + "mappings": { + "0": { + "then": "Obra de arte {name}" } + }, + "render": "Obra de arte" } + }, + "bike_cafe": { + "name": "Café de ciclistas", + "presets": { + "0": { + "title": "Café de ciclistas" + } + }, + "tagRenderings": { + "bike_cafe-bike-pump": { + "mappings": { + "0": { + "then": "Este café de ciclistas ofrece unha bomba de ar" + }, + "1": { + "then": "Este café de ciclistas non ofrece unha bomba de ar" + } + }, + "question": "Este café de ciclistas ofrece unha bomba de ar para que calquera persoa poida usala?" + }, + "bike_cafe-email": { + "question": "Cal é o enderezo de correo electrónico de {name}?" + }, + "bike_cafe-name": { + "question": "Cal é o nome deste café de ciclistas?", + "render": "Este café de ciclistas chámase {name}" + }, + "bike_cafe-phone": { + "question": "Cal é o número de teléfono de {name}?" + }, + "bike_cafe-repair-service": { + "mappings": { + "0": { + "then": "Este café de ciclistas arranxa bicicletas" + }, + "1": { + "then": "Este café de ciclistas non arranxa bicicletas" + } + }, + "question": "Este café de ciclistas arranxa bicicletas?" + }, + "bike_cafe-repair-tools": { + "mappings": { + "0": { + "then": "Hai ferramentas aquí para arranxar a túa propia bicicleta" + }, + "1": { + "then": "Non hai ferramentas aquí para arranxar a túa propia bicicleta" + } + }, + "question": "Hai ferramentas aquí para arranxar a túa propia bicicleta?" + }, + "bike_cafe-website": { + "question": "Cal é a páxina web de {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Café de ciclistas {name}" + } + }, + "render": "Café de ciclistas" + } + }, + "bike_parking": { + "name": "Aparcadoiro de bicicletas", + "presets": { + "0": { + "title": "Aparcadoiro de bicicletas" + } + }, + "tagRenderings": { + "Bicycle parking type": { + "mappings": { + "0": { + "then": "De roda (Stands) " + }, + "1": { + "then": "Aros " + }, + "2": { + "then": "Cadeado para guiador " + }, + "3": { + "then": "Cremalleira " + }, + "4": { + "then": "Dobre cremalleira " + }, + "5": { + "then": "Abeiro " + } + }, + "question": "Que tipo de aparcadoiro de bicicletas é?", + "render": "Este é un aparcadoiro de bicicletas do tipo: {bicycle_parking}" + }, + "Capacity": { + "question": "Cantas bicicletas caben neste aparcadoiro de bicicletas (incluídas as posíbeis bicicletas de carga)?", + "render": "Lugar para {capacity} bicicletas" + }, + "Cargo bike capacity?": { + "question": "Cantas bicicletas de carga caben neste aparcadoiro de bicicletas?", + "render": "Neste aparcadoiro caben {capacity:cargo_bike} bicicletas de carga" + }, + "Cargo bike spaces?": { + "mappings": { + "0": { + "then": "Este aparcadoiro ten espazo para bicicletas de carga." + }, + "1": { + "then": "Este aparcadoiro ten espazos designados (oficiais) para bicicletas de carga." + }, + "2": { + "then": "Non está permitido aparcar bicicletas de carga" + } + }, + "question": "Este aparcadoiro de bicicletas ten espazo para bicicletas de carga?" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "Este aparcadoiro está cuberto (ten un teito)" + }, + "1": { + "then": "Este aparcadoiro non está cuberto" + } + }, + "question": "Este aparcadoiro está cuberto? Tamén escolle \"cuberto\" para aparcadoiros interiores." + } + }, + "title": { + "render": "Aparcadoiro de bicicletas" + } + }, + "bike_repair_station": { + "name": "Estación de bicicletas (arranxo, bomba de ar ou ambos)", + "presets": { + "0": { + "title": "Bomba de ar" + }, + "1": { + "title": "Estación de arranxo de bicicletas con bomba de ar" + }, + "2": { + "title": "Estación de arranxo de bicicletas sin bomba de ar" + } + }, + "tagRenderings": { + "Operational status": { + "mappings": { + "0": { + "then": "A bomba de ar está estragada" + }, + "1": { + "then": "A bomba de ar está operativa" + } + }, + "question": "Segue a funcionar a bomba de ar?" + }, + "bike_repair_station-available-services": { + "mappings": { + "0": { + "then": "Só hai unha bomba de ar presente" + }, + "1": { + "then": "Só hai ferramentas (desaparafusadores, alicates...) presentes" + }, + "2": { + "then": "Hai ferramentas e unha bomba de ar presentes" + } + }, + "question": "Que servizos están dispoñíbeis nesta estación de bicicletas?" + }, + "bike_repair_station-bike-chain-tool": { + "mappings": { + "0": { + "then": "Hai unha ferramenta para a cadea" + }, + "1": { + "then": "Non hai unha ferramenta para a cadea" + } + }, + "question": "Esta estación de arranxo de bicicletas ten unha ferramenta especial para arranxar a cadea da túa bicicleta?" + }, + "bike_repair_station-bike-stand": { + "mappings": { + "0": { + "then": "Hai un guindastre ou soporte" + }, + "1": { + "then": "Non hai un guindastre ou soporte" + } + }, + "question": "Esta estación de bicicletas ten un guindastre para pendurar a túa bicicleta ou un soporte para elevala?" + }, + "bike_repair_station-electrical_pump": { + "mappings": { + "0": { + "then": "Bomba de ar manual" + }, + "1": { + "then": "Bomba de ar eléctrica" + } + }, + "question": "Esta é unha bomba de ar eléctrica?" + }, + "bike_repair_station-manometer": { + "mappings": { + "0": { + "then": "Hai manómetro" + }, + "1": { + "then": "Non hai manómetro" + }, + "2": { + "then": "Hai manómetro pero está estragado" + } + }, + "question": "Ten a bomba de ar un indicador de presión ou un manómetro?" + }, + "bike_repair_station-valves": { + "mappings": { + "0": { + "then": "Sclaverand (tamén coñecido como Presta)" + }, + "1": { + "then": "Dunlop" + }, + "2": { + "then": "Schrader (para automóbiles)" + } + }, + "question": "Que válvulas son compatíbeis?", + "render": "Esta bomba de ar admite as seguintes válvulas: {valves}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Estación de arranxo de bicicletas" + }, + "1": { + "then": "Estación de arranxo de bicicletas" + }, + "2": { + "then": "Bomba de ar estragada" + }, + "3": { + "then": "Bomba de ar {name}" + }, + "4": { + "then": "Bomba de ar" + } + }, + "render": "Estación de bicicletas (arranxo e bomba de ar)" + } + }, + "bike_shop": { + "name": "Tenda/arranxo de bicicletas", + "presets": { + "0": { + "title": "Tenda/arranxo de bicicletas" + } + }, + "tagRenderings": { + "bike_repair_bike-pump-service": { + "mappings": { + "0": { + "then": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa" + }, + "1": { + "then": "Esta tenda non ofrece unha bomba de ar para uso de calquera persoa" + } + }, + "question": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa?" + }, + "bike_repair_rents-bikes": { + "mappings": { + "0": { + "then": "Esta tenda aluga bicicletas" + }, + "1": { + "then": "Esta tenda non aluga bicicletas" + } + }, + "question": "Esta tenda aluga bicicletas?" + }, + "bike_repair_repairs-bikes": { + "mappings": { + "0": { + "then": "Esta tenda arranxa bicicletas" + }, + "1": { + "then": "Esta tenda non arranxa bicicletas" + }, + "2": { + "then": "Esta tenda só arranxa bicicletas mercadas aquí" + }, + "3": { + "then": "Esta tenda só arranxa bicicletas dunha certa marca" + } + }, + "question": "Esta tenda arranxa bicicletas?" + }, + "bike_repair_second-hand-bikes": { + "mappings": { + "0": { + "then": "Esta tenda vende bicicletas de segunda man" + }, + "1": { + "then": "Esta tenda non vende bicicletas de segunda man" + }, + "2": { + "then": "Esta tenda só vende bicicletas de segunda man" + } + }, + "question": "Esta tenda vende bicicletas de segunda man?" + }, + "bike_repair_sells-bikes": { + "mappings": { + "0": { + "then": "Esta tenda vende bicicletas" + }, + "1": { + "then": "Esta tenda non vende bicicletas" + } + }, + "question": "Esta tenda vende bicicletas?" + }, + "bike_repair_tools-service": { + "mappings": { + "0": { + "then": "Hai ferramentas aquí para arranxar a túa propia bicicleta" + }, + "1": { + "then": "Non hai ferramentas aquí para arranxar a túa propia bicicleta" + } + }, + "question": "Hai ferramentas aquí para arranxar a túa propia bicicleta?" + }, + "bike_shop-email": { + "question": "Cal é o enderezo de correo electrónico de {name}?" + }, + "bike_shop-name": { + "question": "Cal é o nome desta tenda de bicicletas?", + "render": "Esta tenda de bicicletas chámase {name}" + }, + "bike_shop-phone": { + "question": "Cal é o número de teléfono de {name}?" + }, + "bike_shop-website": { + "question": "Cal é a páxina web de {name}?" + } + }, + "title": { + "mappings": { + "3": { + "then": "Arranxo de bicicletas {name}" + }, + "4": { + "then": "Tenda de bicicletas {name}" + }, + "5": { + "then": "Tenda/arranxo de bicicletas {name}" + } + }, + "render": "Tenda/arranxo de bicicletas" + } + }, + "drinking_water": { + "name": "Auga potábel", + "presets": { + "0": { + "title": "auga potábel" + } + }, + "title": { + "render": "Auga potábel" + } + }, + "ghost_bike": { + "name": "Bicicleta pantasma", + "title": { + "render": "Bicicleta pantasma" + } + } } \ No newline at end of file diff --git a/langs/layers/hu.json b/langs/layers/hu.json index 1bddd2f357..3610384bae 100644 --- a/langs/layers/hu.json +++ b/langs/layers/hu.json @@ -1,229 +1,231 @@ { - "artwork": { - "presets": { - "0": { - "title": "Műalkotás" - } - }, - "title": { - "mappings": { - "0": { - "then": "Műalkotás {name}" - } - }, - "render": "Műalkotás" - } + "artwork": { + "presets": { + "0": { + "title": "Műalkotás" + } }, - "bench": { - "name": "Padok", - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Háttámla: Igen" - }, - "1": { - "then": "Háttámla: Nem" - } - }, - "question": "Van háttámlája ennek a padnak?", - "render": "Háttámla" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "Szín: barna" - }, - "1": { - "then": "Szín: zöld" - }, - "2": { - "then": "Szín: szürke" - }, - "3": { - "then": "Szín: fehér" - }, - "4": { - "then": "Szín: piros" - }, - "5": { - "then": "Szín: fekete" - }, - "6": { - "then": "Szín: kék" - }, - "7": { - "then": "Szín: sárga" - } - }, - "question": "Milyen színű a pad?", - "render": "Szín: {colour}" - }, - "bench-direction": { - "question": "Milyen irányba néz a pad?", - "render": "A pad {direction}° felé néz." - }, - "bench-material": { - "mappings": { - "0": { - "then": "Anyag: fa" - }, - "1": { - "then": "Anyag: fém" - }, - "2": { - "then": "Anyag: kő" - }, - "3": { - "then": "Anyag: beton" - }, - "4": { - "then": "Anyag: műanyag" - }, - "5": { - "then": "Anyag: acél" - } - }, - "question": "Miből van a pad (ülő része)?", - "render": "Anyag: {material}" - }, - "bench-seats": { - "question": "Hány ülőhely van ezen a padon?", - "render": "{seats} ülőhely" - } - }, - "title": { - "render": "Pad" - } - }, - "bench_at_pt": { - "name": "Padok megállókban", - "tagRenderings": { - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Pad megállóban" - }, - "1": { - "then": "Pad fedett helyen" - } - }, - "render": "Pad" - } - }, - "bicycle_library": { - "description": "Létesítmény, ahonnan kerékpár kölcsönözhető hosszabb időre", - "tagRenderings": { - "bicycle-library-target-group": { - "mappings": { - "0": { - "then": "" - } - }, - "question": "Ki kölcsönözhet itt kerékpárt?" - }, - "bicycle_library-charge": { - "mappings": { - "0": { - "then": "A kerékpárkölcsönzés ingyenes" - } - }, - "question": "Mennyibe kerül egy kerékpár kölcsönzése?", - "render": "Egy kerékpár kölcsönzése {charge}" - } - } - }, - "bicycle_tube_vending_machine": { - "tagRenderings": { - "Still in use?": { - "mappings": { - "0": { - "then": "Az automata működik" - }, - "1": { - "then": "Az automata elromlott" - }, - "2": { - "then": "Az automata zárva van" - } - } - } - } - }, - "bike_parking": { - "name": "Kerékpáros parkoló", - "presets": { - "0": { - "title": "Kerékpáros parkoló" - } - }, - "tagRenderings": { - "Bicycle parking type": { - "mappings": { - "0": { - "then": "\"U\" " - }, - "1": { - "then": "Kengyeles " - }, - "4": { - "then": "Kétszintű " - }, - "5": { - "then": "Fészer " - } - }, - "question": "Milyen típusú ez a kerékpáros parkoló?", - "render": "Ez egy {bicycle_parking} típusú kerékpáros parkoló" - }, - "Is covered?": { - "mappings": { - "0": { - "then": "A parkoló fedett" - }, - "1": { - "then": "A parkoló nem fedett" - } - }, - "question": "Fedett ez a parkoló? (Beltéri parkoló esetén is válaszd a \"fedett\" opciót.)" - }, - "Underground?": { - "mappings": { - "2": { - "then": "Felszíni parkoló" - }, - "3": { - "then": "Felszíni parkoló" - }, - "4": { - "then": "Tetőparkoló" - } - } - } - }, - "title": { - "render": "Kerékpáros parkoló" - } - }, - "ghost_bike": { - "name": "Emlékkerékpár", - "title": { - "render": "Emlékkerékpár" - } - }, - "shops": { - "tagRenderings": { - "shops-shop": { - "mappings": { - "5": { - "then": "Autószerelő" - } - } - } + "title": { + "mappings": { + "0": { + "then": "Műalkotás {name}" } + }, + "render": "Műalkotás" } + }, + "bench": { + "name": "Padok", + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Háttámla: Igen" + }, + "1": { + "then": "Háttámla: Nem" + } + }, + "question": "Van háttámlája ennek a padnak?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "Szín: barna" + }, + "1": { + "then": "Szín: zöld" + }, + "2": { + "then": "Szín: szürke" + }, + "3": { + "then": "Szín: fehér" + }, + "4": { + "then": "Szín: piros" + }, + "5": { + "then": "Szín: fekete" + }, + "6": { + "then": "Szín: kék" + }, + "7": { + "then": "Szín: sárga" + } + }, + "question": "Milyen színű a pad?", + "render": "Szín: {colour}" + }, + "bench-direction": { + "question": "Milyen irányba néz a pad?", + "render": "A pad {direction}° felé néz." + }, + "bench-material": { + "mappings": { + "0": { + "then": "Anyag: fa" + }, + "1": { + "then": "Anyag: fém" + }, + "2": { + "then": "Anyag: kő" + }, + "3": { + "then": "Anyag: beton" + }, + "4": { + "then": "Anyag: műanyag" + }, + "5": { + "then": "Anyag: acél" + } + }, + "question": "Miből van a pad (ülő része)?", + "render": "Anyag: {material}" + }, + "bench-seats": { + "question": "Hány ülőhely van ezen a padon?", + "render": "{seats} ülőhely" + } + }, + "title": { + "render": "Pad" + } + }, + "bench_at_pt": { + "name": "Padok megállókban", + "tagRenderings": { + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Pad megállóban" + }, + "1": { + "then": "Pad fedett helyen" + } + }, + "render": "Pad" + } + }, + "bicycle_library": { + "description": "Létesítmény, ahonnan kerékpár kölcsönözhető hosszabb időre", + "tagRenderings": { + "bicycle-library-target-group": { + "mappings": { + "0": { + "then": "" + } + }, + "question": "Ki kölcsönözhet itt kerékpárt?" + }, + "bicycle_library-charge": { + "mappings": { + "0": { + "then": "A kerékpárkölcsönzés ingyenes" + } + }, + "question": "Mennyibe kerül egy kerékpár kölcsönzése?", + "render": "Egy kerékpár kölcsönzése {charge}" + } + } + }, + "bicycle_tube_vending_machine": { + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "Az automata működik" + }, + "1": { + "then": "Az automata elromlott" + }, + "2": { + "then": "Az automata zárva van" + } + } + } + } + }, + "bike_parking": { + "name": "Kerékpáros parkoló", + "presets": { + "0": { + "title": "Kerékpáros parkoló" + } + }, + "tagRenderings": { + "Bicycle parking type": { + "mappings": { + "0": { + "then": "\"U\" " + }, + "1": { + "then": "Kengyeles " + }, + "4": { + "then": "Kétszintű " + }, + "5": { + "then": "Fészer " + } + }, + "question": "Milyen típusú ez a kerékpáros parkoló?", + "render": "Ez egy {bicycle_parking} típusú kerékpáros parkoló" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "A parkoló fedett" + }, + "1": { + "then": "A parkoló nem fedett" + } + }, + "question": "Fedett ez a parkoló? (Beltéri parkoló esetén is válaszd a \"fedett\" opciót.)" + }, + "Underground?": { + "mappings": { + "1": { + "then": "Felszíni parkoló" + }, + "2": { + "then": "Tetőparkoló" + }, + "3": { + "then": "Felszíni parkoló" + }, + "4": { + "then": "Tetőparkoló" + } + } + } + }, + "title": { + "render": "Kerékpáros parkoló" + } + }, + "ghost_bike": { + "name": "Emlékkerékpár", + "title": { + "render": "Emlékkerékpár" + } + }, + "shops": { + "tagRenderings": { + "shops-shop": { + "mappings": { + "5": { + "then": "Autószerelő" + } + } + } + } + } } \ No newline at end of file diff --git a/langs/layers/id.json b/langs/layers/id.json index 1d8623ce9f..3ac8616f94 100644 --- a/langs/layers/id.json +++ b/langs/layers/id.json @@ -1,181 +1,364 @@ { - "artwork": { - "name": "Karya seni", - "presets": { - "0": { - "title": "Karya Seni" - } + "artwork": { + "description": "Beragam karya seni", + "name": "Karya seni", + "presets": { + "0": { + "title": "Karya Seni" + } + }, + "tagRenderings": { + "artwork-artist_name": { + "question": "Seniman mana yang menciptakan ini?", + "render": "Dibuat oleh {artist_name}" + }, + "artwork-artwork_type": { + "mappings": { + "0": { + "then": "Arsitektur" + }, + "1": { + "then": "Mural" + }, + "2": { + "then": "Lukisan" + }, + "3": { + "then": "Patung" + }, + "6": { + "then": "Batu" + }, + "7": { + "then": "Instalasi" + }, + "8": { + "then": "Graffiti" + }, + "9": { + "then": "Relief" + }, + "10": { + "then": "Azulejo (ubin dekoratif Spanyol)" + } }, - "tagRenderings": { - "artwork-website": { - "render": "Info lanjut tersedia di laman web ini." - } - }, - "title": { - "mappings": { - "0": { - "then": "Karya Seni {name}" - } - }, - "render": "Karya Seni" - } + "question": "Apa jenis karya seni ini?", + "render": "Ini adalah {artwork_type}" + }, + "artwork-website": { + "question": "Adakah situs web mengenai informasi lebih lanjut tentang karya seni ini?", + "render": "Info lanjut tersedia di laman web ini" + }, + "artwork-wikidata": { + "question": "Entri Wikidata mana yang sesuai dengan karya seni ini?", + "render": "Sesuai dengan {wikidata}" + } }, - "bench": { - "name": "Bangku", - "presets": { - "0": { - "title": "bangku" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Sandaran: Ya" - }, - "1": { - "then": "Sandaran: Tidak" - } - }, - "question": "Apakah bangku ini memiliki sandaran?", - "render": "Sandaran" - }, - "bench-colour": { - "render": "Warna: {colour}" - }, - "bench-seats": { - "render": "{seats} kursi" - } - }, - "title": { - "render": "Bangku" - } - }, - "bench_at_pt": { - "tagRenderings": { - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "render": "Bangku" - } - }, - "bike_parking": { - "tagRenderings": { - "Access": { - "render": "{access}" - } - } - }, - "bike_shop": { - "tagRenderings": { - "bike_shop-website": { - "question": "URL {name} apa?" - } - } - }, - "defibrillator": { - "tagRenderings": { - "defibrillator-description": { - "render": "Informasi tambahan: {description}" - } - } - }, - "drinking_water": { - "name": "Air minum", - "presets": { - "0": { - "title": "air minum" - } - }, - "title": { - "render": "Air minum" - } - }, - "ghost_bike": { - "tagRenderings": { - "ghost_bike-inscription": { - "render": "{inscription}" - }, - "ghost_bike-source": { - "render": "Informasi lanjut tersedia" - } - } - }, - "nature_reserve": { - "tagRenderings": { - "Email": { - "render": "{email}" - }, - "phone": { - "render": "{phone}" - } - } - }, - "playground": { - "tagRenderings": { - "playground-email": { - "render": "{email}" - }, - "playground-phone": { - "render": "{phone}" - } - } - }, - "shops": { - "tagRenderings": { - "shops-email": { - "render": "{email}" - }, - "shops-phone": { - "render": "{phone}" - }, - "shops-shop": { - "mappings": { - "5": { - "then": "Bengkel Mobil" - } - } - }, - "shops-website": { - "render": "{website}" - } - } - }, - "tree_node": { - "presets": { - "2": { - "title": "Pohon" - } - }, - "tagRenderings": { - "tree_node-name": { - "render": "Nama: {name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - } - } - }, - "viewpoint": { - "name": "Sudut pandang", - "presets": { - "0": { - "title": "Sudut pandang" - } - }, - "tagRenderings": { - "viewpoint-description": { - "question": "Apakah Anda ingin menambahkan deskripsi?" - } - }, - "title": { - "render": "Sudut pandang" + "title": { + "mappings": { + "0": { + "then": "Karya Seni {name}" } + }, + "render": "Karya Seni" } + }, + "bench": { + "name": "Bangku", + "presets": { + "0": { + "title": "bangku" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Sandaran: Ya" + }, + "1": { + "then": "Sandaran: Tidak" + } + }, + "question": "Apakah bangku ini memiliki sandaran?" + }, + "bench-colour": { + "render": "Warna: {colour}" + }, + "bench-seats": { + "render": "{seats} kursi" + } + }, + "title": { + "render": "Bangku" + } + }, + "bench_at_pt": { + "tagRenderings": { + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "render": "Bangku" + } + }, + "bike_parking": { + "tagRenderings": { + "Access": { + "render": "{access}" + } + } + }, + "bike_shop": { + "tagRenderings": { + "bike_shop-website": { + "question": "URL {name} apa?" + } + } + }, + "cycleways_and_roads": { + "tagRenderings": { + "Maxspeed (for road)": { + "mappings": { + "3": { + "then": "Kecepatan maksimum 70 km/jam" + }, + "4": { + "then": "Kecepatan maksimum 90 km/jam" + } + }, + "question": "Berapa kecepatan maksimum di jalan ini?", + "render": "Kecepatan maksimum di jalan ini adalah {maxspeed} km/jam" + }, + "Surface of the road": { + "mappings": { + "1": { + "then": "Jalur sepeda ini diaspal" + }, + "2": { + "then": "Jalur sepeda ini terbuat dari aspal" + }, + "3": { + "then": "Jalur sepeda ini terbuat dari batu paving halus" + }, + "4": { + "then": "Jalur sepeda ini terbuat dari beton" + }, + "5": { + "then": "Jalur sepeda ini terbuat dari cobblestone (unhewn atau sett)" + }, + "6": { + "then": "Jalur sepeda ini terbuat dari batu bulat alami" + }, + "8": { + "then": "Jalur sepeda ini terbuat dari kayu" + }, + "9": { + "then": "Jalur sepeda ini terbuat dari kerikil" + }, + "10": { + "then": "Jalur sepeda ini terbuat dari kerikil halus" + }, + "11": { + "then": "Jalur sepeda ini terbuat dari batu kerikil" + }, + "12": { + "then": "Jalur sepeda ini terbuat dari tanah alami" + } + }, + "question": "Permukaan jalannya terbuat dari apa?", + "render": "Jalan ini terbuat dari {surface}" + }, + "Surface of the street": { + "mappings": { + "0": { + "then": "Dapat digunakan untuk roller tipis: rollerblade, skateboard" + }, + "1": { + "then": "Dapat digunakan untuk roda tipis: sepeda balap" + }, + "2": { + "then": "Dapat digunakan untuk roda normal: sepeda kota, kursi roda, skuter" + }, + "3": { + "then": "Dapat digunakan untuk roda yang kuat: sepeda trekking, mobil, becak" + }, + "5": { + "then": "Dapat digunakan untuk kendaraan off-road: kendaraan off-road berat" + }, + "6": { + "then": "Dapat digunakan untuk kendaraan off-road khusus: traktor, ATV" + } + } + }, + "cyclelan-segregation": { + "mappings": { + "0": { + "then": "Jalur sepeda ini dipisahkan oleh garis putus-putus" + }, + "1": { + "then": "Jalur sepeda ini dipisahkan oleh garis solid" + }, + "2": { + "then": "Jalur sepeda ini dipisahkan oleh jalur parkir" + }, + "3": { + "then": "Jalur sepeda ini dipisahkan oleh kerb" + } + }, + "question": "Bagaimana jalur sepeda ini terpisah dari jalan?" + }, + "cycleway-lane-track-traffic-signs": { + "mappings": { + "0": { + "then": "Jalur sepeda wajib " + }, + "1": { + "then": "Jalur sepeda wajib (dengan tanda tambahan)
    " + }, + "2": { + "then": "Jalur pejalan kaki/sepeda terpisah " + }, + "3": { + "then": "Jalur pejalan kaki/sepeda tidak terpisah " + }, + "4": { + "then": "Tidak ada rambu lalu lintas" + } + }, + "question": "Rambu lalu lintas apa yang dimiliki jalur sepeda ini?" + }, + "cycleway-segregation": { + "mappings": { + "0": { + "then": "Jalur sepeda ini dipisahkan oleh garis putus-putus" + }, + "1": { + "then": "Jalur sepeda ini dipisahkan oleh garis solid" + }, + "2": { + "then": "Jalur sepeda ini dipisahkan oleh jalur parkir" + }, + "3": { + "then": "Jalur sepeda ini dipisahkan oleh kerb" + } + }, + "question": "Bagaimana jalur sepeda ini dipisahkan dari jalan?" + }, + "cycleway-traffic-signs": { + "mappings": { + "0": { + "then": "Jalur sepeda wajib " + } + } + } + } + }, + "defibrillator": { + "tagRenderings": { + "defibrillator-description": { + "render": "Informasi tambahan: {description}" + } + } + }, + "drinking_water": { + "name": "Air minum", + "presets": { + "0": { + "title": "air minum" + } + }, + "title": { + "render": "Air minum" + } + }, + "ghost_bike": { + "tagRenderings": { + "ghost_bike-inscription": { + "render": "{inscription}" + }, + "ghost_bike-source": { + "render": "Informasi lanjut tersedia" + } + } + }, + "nature_reserve": { + "tagRenderings": { + "Email": { + "render": "{email}" + }, + "phone": { + "render": "{phone}" + } + } + }, + "playground": { + "tagRenderings": { + "playground-email": { + "render": "{email}" + }, + "playground-phone": { + "render": "{phone}" + } + } + }, + "shops": { + "tagRenderings": { + "shops-email": { + "render": "{email}" + }, + "shops-phone": { + "render": "{phone}" + }, + "shops-shop": { + "mappings": { + "5": { + "then": "Bengkel Mobil" + } + } + }, + "shops-website": { + "render": "{website}" + } + } + }, + "tree_node": { + "presets": { + "2": { + "title": "Pohon" + } + }, + "tagRenderings": { + "tree_node-name": { + "render": "Nama: {name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + } + } + }, + "viewpoint": { + "name": "Sudut pandang", + "presets": { + "0": { + "title": "Sudut pandang" + } + }, + "tagRenderings": { + "viewpoint-description": { + "question": "Apakah Anda ingin menambahkan deskripsi?" + } + }, + "title": { + "render": "Sudut pandang" + } + }, + "watermill": { + "name": "Kincir Air" + } } \ No newline at end of file diff --git a/langs/layers/it.json b/langs/layers/it.json index 71e4d058c5..2f034ce891 100644 --- a/langs/layers/it.json +++ b/langs/layers/it.json @@ -1,1818 +1,1823 @@ { - "artwork": { - "description": "Diverse opere d’arte", - "name": "Opere d’arte", - "presets": { - "0": { - "title": "Opera d’arte" - } - }, - "tagRenderings": { - "artwork-artist_name": { - "question": "Quale artista ha creato quest’opera?", - "render": "Creato da {artist_name}" - }, - "artwork-artwork_type": { - "mappings": { - "0": { - "then": "Architettura" - }, - "1": { - "then": "Murale" - }, - "2": { - "then": "Dipinto" - }, - "3": { - "then": "Scultura" - }, - "4": { - "then": "Statua" - }, - "5": { - "then": "Busto" - }, - "6": { - "then": "Masso" - }, - "7": { - "then": "Istallazione" - }, - "8": { - "then": "Graffiti" - }, - "9": { - "then": "Rilievo" - }, - "10": { - "then": "Azulejo (ornamento decorativo piastrellato spagnolo)" - }, - "11": { - "then": "Mosaico di piastrelle" - } - }, - "question": "Che tipo di opera d’arte è questo?", - "render": "Si tratta di un {artwork_type}" - }, - "artwork-website": { - "question": "Esiste un sito web con maggiori informazioni su quest’opera?", - "render": "Ulteriori informazioni su questo sito web" - }, - "artwork-wikidata": { - "question": "Quale elemento Wikidata corrisponde a quest’opera d’arte?", - "render": "Corrisponde a {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Opera {name}" - } - }, - "render": "Opera d’arte" - } + "artwork": { + "description": "Diverse opere d’arte", + "name": "Opere d’arte", + "presets": { + "0": { + "title": "Opera d’arte" + } }, - "bench": { - "name": "Panchine", - "presets": { - "0": { - "title": "panchina" - } + "tagRenderings": { + "artwork-artist_name": { + "question": "Quale artista ha creato quest’opera?", + "render": "Creato da {artist_name}" + }, + "artwork-artwork_type": { + "mappings": { + "0": { + "then": "Architettura" + }, + "1": { + "then": "Murale" + }, + "2": { + "then": "Dipinto" + }, + "3": { + "then": "Scultura" + }, + "4": { + "then": "Statua" + }, + "5": { + "then": "Busto" + }, + "6": { + "then": "Masso" + }, + "7": { + "then": "Istallazione" + }, + "8": { + "then": "Graffiti" + }, + "9": { + "then": "Rilievo" + }, + "10": { + "then": "Azulejo (ornamento decorativo piastrellato spagnolo)" + }, + "11": { + "then": "Mosaico di piastrelle" + } }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Schienale: Sì" - }, - "1": { - "then": "Schienale: No" - } - }, - "question": "Questa panchina ha lo schienale?", - "render": "Schienale" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "Colore: marrone" - }, - "1": { - "then": "Colore: verde" - }, - "2": { - "then": "Colore: grigio" - }, - "3": { - "then": "Colore: bianco" - }, - "4": { - "then": "Colore: rosso" - }, - "5": { - "then": "Colore: nero" - }, - "6": { - "then": "Colore: blu" - }, - "7": { - "then": "Colore: giallo" - } - }, - "question": "Di che colore è questa panchina?", - "render": "Colore: {colour}" - }, - "bench-direction": { - "question": "In che direzione si guarda quando si è seduti su questa panchina?", - "render": "Quando si è seduti su questa panchina, si guarda verso {direction}°." - }, - "bench-material": { - "mappings": { - "0": { - "then": "Materiale: legno" - }, - "1": { - "then": "Materiale: metallo" - }, - "2": { - "then": "Materiale: pietra" - }, - "3": { - "then": "Materiale: cemento" - }, - "4": { - "then": "Materiale: plastica" - }, - "5": { - "then": "Materiale: acciaio" - } - }, - "question": "Di che materiale è fatta questa panchina?", - "render": "Materiale: {material}" - }, - "bench-seats": { - "question": "Quanti posti ha questa panchina?", - "render": "{seats} posti" - }, - "bench-survey:date": { - "question": "Quando è stata verificata l’ultima volta questa panchina?", - "render": "Questa panchina è stata controllata l’ultima volta in data {survey:date}" - } - }, - "title": { - "render": "Panchina" - } + "question": "Che tipo di opera d’arte è questo?", + "render": "Si tratta di un {artwork_type}" + }, + "artwork-website": { + "question": "Esiste un sito web con maggiori informazioni su quest’opera?", + "render": "Ulteriori informazioni su questo sito web" + }, + "artwork-wikidata": { + "question": "Quale elemento Wikidata corrisponde a quest’opera d’arte?", + "render": "Corrisponde a {wikidata}" + } }, - "bench_at_pt": { - "name": "Panchine alle fermate del trasporto pubblico", - "tagRenderings": { - "bench_at_pt-bench": { - "render": "Panca in piedi" - }, - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Panchina alla fermata del trasporto pubblico" - }, - "1": { - "then": "Panchina in un riparo" - } - }, - "render": "Panchina" - } - }, - "bicycle_library": { - "description": "Una struttura dove le biciclette possono essere prestate per periodi di tempo più lunghi", - "name": "Bici in prestito", - "presets": { - "0": { - "description": "Una ciclo-teca o «bici in prestito» ha una collezione di bici che possno essere prestate", - "title": "Bici in prestito" - } - }, - "tagRenderings": { - "bicycle-library-target-group": { - "mappings": { - "0": { - "then": "Sono disponibili biciclette per bambini" - }, - "1": { - "then": "Sono disponibili biciclette per adulti" - }, - "2": { - "then": "Sono disponibili biciclette per disabili" - } - }, - "question": "Chi può prendere in prestito le biciclette qua?" - }, - "bicycle_library-charge": { - "mappings": { - "0": { - "then": "Il prestito di una bicicletta è gratuito" - }, - "1": { - "then": "Il prestito di una bicicletta costa 20 €/anno più 20 € di garanzia" - } - }, - "question": "Quanto costa il prestito di una bicicletta?", - "render": "Il prestito di una bicicletta costa {charge}" - }, - "bicycle_library-name": { - "question": "Qual è il nome di questo “bici in prestito”?", - "render": "Il “bici in prestito” è chiamato {name}" - } - }, - "title": { - "render": "Bici in prestito" - } - }, - "bicycle_tube_vending_machine": { - "name": "Distributore automatico di camere d’aria per bici", - "presets": { - "0": { - "title": "Distributore automatico di camere d’aria per bici" - } - }, - "tagRenderings": { - "Still in use?": { - "mappings": { - "0": { - "then": "Il distributore automatico funziona" - }, - "1": { - "then": "Il distributore automatico è guasto" - }, - "2": { - "then": "Il distributore automatico è spento" - } - }, - "question": "Questo distributore automatico funziona ancora?", - "render": "Lo stato operativo è {operational_status}" - } - }, - "title": { - "render": "Distributore automatico di camere d’aria per bici" - } - }, - "bike_cafe": { - "name": "Caffè in bici", - "presets": { - "0": { - "title": "Caffè in bici" - } - }, - "tagRenderings": { - "bike_cafe-bike-pump": { - "mappings": { - "0": { - "then": "Questo caffè in bici offre una pompa per bici liberamente utilizzabile" - }, - "1": { - "then": "Questo caffè in bici non offre una pompa per bici liberamente utilizzabile" - } - }, - "question": "Questo caffè in bici offre una pompa per bici che chiunque può utilizzare?" - }, - "bike_cafe-email": { - "question": "Qual è l’indirizzo email di {name}?" - }, - "bike_cafe-name": { - "question": "Qual è il nome di questo caffè in bici?", - "render": "Questo caffè in bici è chiamato {name}" - }, - "bike_cafe-opening_hours": { - "question": "Quando è aperto questo caffè in bici?" - }, - "bike_cafe-phone": { - "question": "Qual è il numero di telefono di {name}?" - }, - "bike_cafe-repair-service": { - "mappings": { - "0": { - "then": "Questo caffè in bici ripara le bici" - }, - "1": { - "then": "Questo caffè in bici non ripara le bici" - } - }, - "question": "Questo caffè in bici ripara le bici?" - }, - "bike_cafe-repair-tools": { - "mappings": { - "0": { - "then": "Questo caffè in bici fornisce degli attrezzi per la riparazione fai-da-te" - }, - "1": { - "then": "Questo caffè in bici non fornisce degli attrezzi per la riparazione fai-da-te" - } - }, - "question": "Ci sono degli strumenti per riparare la propria bicicletta?" - }, - "bike_cafe-website": { - "question": "Qual è il sito web di {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Caffè in bici {name}" - } - }, - "render": "Caffè in bici" - } - }, - "bike_cleaning": { - "name": "Servizio lavaggio bici", - "presets": { - "0": { - "title": "Servizio lavaggio bici" - } - }, - "title": { - "mappings": { - "0": { - "then": "Servizio lavaggio bici {name}" - } - }, - "render": "Servizio lavaggio bici" - } - }, - "bike_parking": { - "name": "Parcheggio bici", - "presets": { - "0": { - "title": "Parcheggio bici" - } - }, - "tagRenderings": { - "Access": { - "mappings": { - "0": { - "then": "Accessibile pubblicamente" - }, - "1": { - "then": "Accesso destinato principalmente ai visitatori di un’attività" - }, - "2": { - "then": "Accesso limitato ai membri di una scuola, una compagnia o un’organizzazione" - } - }, - "question": "Chi può usare questo parcheggio bici?", - "render": "{access}" - }, - "Bicycle parking type": { - "mappings": { - "0": { - "then": "Archetti " - }, - "1": { - "then": "Scolapiatti " - }, - "2": { - "then": "Blocca manubrio " - }, - "3": { - "then": "Rastrelliera " - }, - "4": { - "then": "A due piani " - }, - "5": { - "then": "Rimessa " - }, - "6": { - "then": "Colonnina " - }, - "7": { - "then": "Una zona del pavimento che è marcata per il parcheggio delle bici" - } - }, - "question": "Di che tipo di parcheggio bici si tratta?", - "render": "È un parcheggio bici del tipo: {bicycle_parking}" - }, - "Capacity": { - "question": "Quante biciclette entrano in questo parcheggio per bici (incluse le eventuali bici da trasporto)?", - "render": "Posti per {capacity} bici" - }, - "Cargo bike capacity?": { - "question": "Quante bici da trasporto entrano in questo parcheggio per bici?", - "render": "Questo parcheggio può contenere {capacity:cargo_bike} bici da trasporto" - }, - "Cargo bike spaces?": { - "mappings": { - "0": { - "then": "Questo parcheggio ha posto per bici da trasporto" - }, - "1": { - "then": "Questo parcheggio ha posti destinati (ufficialmente) alle bici da trasporto." - }, - "2": { - "then": "Il parcheggio delle bici da trasporto è proibito" - } - }, - "question": "Questo parcheggio dispone di posti specifici per le bici da trasporto?" - }, - "Is covered?": { - "mappings": { - "0": { - "then": "È un parcheggio coperto (ha un tetto)" - }, - "1": { - "then": "Non è un parcheggio coperto" - } - }, - "question": "È un parcheggio coperto? Indicare “coperto” per parcheggi all’interno." - }, - "Underground?": { - "mappings": { - "0": { - "then": "Parcheggio sotterraneo" - }, - "1": { - "then": "Parcheggio sotterraneo" - }, - "2": { - "then": "Parcheggio in superficie" - }, - "3": { - "then": "Parcheggio in superficie" - }, - "4": { - "then": "Parcheggio sul tetto" - } - }, - "question": "Qual è la posizione relativa di questo parcheggio bici?" - } - }, - "title": { - "render": "Parcheggio bici" - } - }, - "bike_repair_station": { - "name": "Stazioni bici (riparazione, gonfiaggio o entrambi)", - "presets": { - "0": { - "description": "Un dispositivo per gonfiare le proprie gomme in un luogo fisso pubblicamente accessibile.

    Esempi di pompe per biciclette

    ", - "title": "Pompa per bici" - }, - "1": { - "description": "Un dispositivo con attrezzi per riparare la tua bici e una pompa in un luogo fisso. Gli attrezzi sono spesso attaccati ad una catena per prevenire il furto.

    Esempio

    ", - "title": "Stazione di riparazione bici e pompa" - }, - "2": { - "title": "Stazione di riparazione bici senza pompa" - } - }, - "tagRenderings": { - "Operational status": { - "mappings": { - "0": { - "then": "La pompa per bici è guasta" - }, - "1": { - "then": "La pompa per bici funziona" - } - }, - "question": "La pompa per bici è sempre funzionante?" - }, - "bike_repair_station-available-services": { - "mappings": { - "0": { - "then": "C’è solamente una pompa presente" - }, - "1": { - "then": "Ci sono solo degli attrezzi (cacciaviti, pinze…) presenti" - }, - "2": { - "then": "Ci sono sia attrezzi che pompa presenti" - } - }, - "question": "Quali servizi sono disponibili in questa stazione per bici?" - }, - "bike_repair_station-bike-chain-tool": { - "mappings": { - "0": { - "then": "È presente un utensile per riparare la catena" - }, - "1": { - "then": "Non è presente un utensile per riparare la catena" - } - }, - "question": "Questa stazione di riparazione bici ha un attrezzo speciale per riparare la catena della bici?" - }, - "bike_repair_station-bike-stand": { - "mappings": { - "0": { - "then": "C’è un gancio o un supporto" - }, - "1": { - "then": "Non c’è né un gancio né un supporto" - } - }, - "question": "Questa stazione bici ha un gancio per tenere sospesa la bici o un supporto per alzarla?" - }, - "bike_repair_station-electrical_pump": { - "mappings": { - "0": { - "then": "Pompa manuale" - }, - "1": { - "then": "Pompa elettrica" - } - }, - "question": "Questa pompa per bici è elettrica?" - }, - "bike_repair_station-manometer": { - "mappings": { - "0": { - "then": "C’è un manometro" - }, - "1": { - "then": "Non c’è un manometro" - }, - "2": { - "then": "C’è un manometro ma è rotto" - } - }, - "question": "Questa pompa ha l’indicatore della pressione o il manometro?" - }, - "bike_repair_station-opening_hours": { - "mappings": { - "0": { - "then": "Sempre aperto" - }, - "1": { - "then": "Sempre aperto" - } - }, - "question": "Quando è aperto questo punto riparazione bici?" - }, - "bike_repair_station-operator": { - "question": "Chi gestisce questa pompa per bici?", - "render": "Manutenuta da {operator}" - }, - "bike_repair_station-valves": { - "mappings": { - "0": { - "then": "Sclaverand (detta anche Presta)" - }, - "1": { - "then": "Dunlop" - }, - "2": { - "then": "Schrader (valvola delle auto)" - } - }, - "question": "Quali valvole sono supportate?", - "render": "Questa pompa è compatibile con le seguenti valvole: {valves}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Stazione riparazione bici" - }, - "1": { - "then": "Stazione riparazione bici" - }, - "2": { - "then": "Pompa rotta" - }, - "3": { - "then": "Pompa per bici {name}" - }, - "4": { - "then": "Pompa per bici" - } - }, - "render": "Stazione bici (gonfiaggio & riparazione)" - } - }, - "bike_shop": { - "description": "Un negozio che vende specificatamente biciclette o articoli similari", - "name": "Venditore/riparatore bici", - "presets": { - "0": { - "title": "Negozio/riparatore di bici" - } - }, - "tagRenderings": { - "bike_repair_bike-pump-service": { - "mappings": { - "0": { - "then": "Questo negozio offre l’uso pubblico di una pompa per bici" - }, - "1": { - "then": "Questo negozio non offre l’uso pubblico di una pompa per bici" - }, - "2": { - "then": "C’è una pompa per bici, è mostrata come punto separato " - } - }, - "question": "Questo negozio offre l’uso a chiunque di una pompa per bici?" - }, - "bike_repair_bike-wash": { - "mappings": { - "0": { - "then": "Questo negozio lava le biciclette" - }, - "1": { - "then": "Questo negozio ha una struttura dove è possibile pulire la propria bici" - }, - "2": { - "then": "Questo negozio non offre la pulizia della bicicletta" - } - }, - "question": "Vengono lavate le bici qua?" - }, - "bike_repair_rents-bikes": { - "mappings": { - "0": { - "then": "Questo negozio noleggia le bici" - }, - "1": { - "then": "Questo negozio non noleggia le bici" - } - }, - "question": "Questo negozio noleggia le bici?" - }, - "bike_repair_repairs-bikes": { - "mappings": { - "0": { - "then": "Questo negozio ripara bici" - }, - "1": { - "then": "Questo negozio non ripara bici" - }, - "2": { - "then": "Questo negozio ripara solo le bici che sono state acquistate qua" - }, - "3": { - "then": "Questo negozio ripara solo le biciclette di una certa marca" - } - }, - "question": "Questo negozio ripara bici?" - }, - "bike_repair_second-hand-bikes": { - "mappings": { - "0": { - "then": "Questo negozio vende bici usate" - }, - "1": { - "then": "Questo negozio non vende bici usate" - }, - "2": { - "then": "Questo negozio vende solamente bici usate" - } - }, - "question": "Questo negozio vende bici usate?" - }, - "bike_repair_sells-bikes": { - "mappings": { - "0": { - "then": "Questo negozio vende bici" - }, - "1": { - "then": "Questo negozio non vende bici" - } - }, - "question": "Questo negozio vende bici?" - }, - "bike_repair_tools-service": { - "mappings": { - "0": { - "then": "Questo negozio offre degli attrezzi per la riparazione fai-da-te" - }, - "1": { - "then": "Questo negozio non offre degli attrezzi per la riparazione fai-da-te" - }, - "2": { - "then": "Gli attrezzi per la riparazione fai-da-te sono disponibili solamente se hai acquistato/noleggiato la bici nel negozio" - } - }, - "question": "Sono presenti degli attrezzi per riparare la propria bici?" - }, - "bike_shop-email": { - "question": "Qual è l’indirizzo email di {name}?" - }, - "bike_shop-is-bicycle_shop": { - "render": "Questo negozio è specializzato nella vendita di {shop} ed effettua attività relative alle biciclette" - }, - "bike_shop-name": { - "question": "Qual è il nome di questo negozio di biciclette?", - "render": "Questo negozio di biciclette è chiamato {name}" - }, - "bike_shop-phone": { - "question": "Qual è il numero di telefono di {name}?" - }, - "bike_shop-website": { - "question": "Qual è il sito web di {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Negozio di articoli sportivi {name}" - }, - "2": { - "then": "Noleggio di biciclette {name}" - }, - "3": { - "then": "Riparazione biciclette {name" - }, - "4": { - "then": "Negozio di biciclette {name}" - }, - "5": { - "then": "Venditore/riparatore bici {name}" - } - }, - "render": "Venditore/riparatore bici" - } - }, - "bike_themed_object": { - "name": "Oggetto relativo alle bici", - "title": { - "mappings": { - "1": { - "then": "Pista ciclabile" - } - }, - "render": "Oggetto relativo alle bici" - } - }, - "defibrillator": { - "name": "Defibrillatori", - "presets": { - "0": { - "title": "Defibrillatore" - } - }, - "tagRenderings": { - "defibrillator-access": { - "mappings": { - "0": { - "then": "Pubblicamente accessibile" - }, - "1": { - "then": "Pubblicamente accessibile" - }, - "2": { - "then": "Accessibile solo ai clienti" - }, - "3": { - "then": "Non accessibile al pubblico (ad esempio riservato al personale, ai proprietari, etc.)" - }, - "4": { - "then": "Non accessibile, potrebbe essere solo per uso professionale" - } - }, - "question": "Questo defibrillatore è liberamente accessibile?", - "render": "Accesso è {access}" - }, - "defibrillator-defibrillator": { - "mappings": { - "0": { - "then": "Questo è un defibrillatore manuale per professionisti" - }, - "1": { - "then": "È un normale defibrillatore automatico" - } - }, - "question": "Si tratta di un normale defibrillatore automatico o un defibrillatore manuale riservato ai professionisti?", - "render": "Non vi sono informazioni riguardanti il tipo di questo dispositivo" - }, - "defibrillator-defibrillator:location": { - "question": "Indica più precisamente dove si trova il defibrillatore (in lingua locale)", - "render": "Informazioni supplementari circa la posizione (in lingua locale):
    {defibrillator:location}" - }, - "defibrillator-defibrillator:location:en": { - "question": "Indica più precisamente dove si trova il defibrillatore (in inglese)", - "render": "Informazioni supplementari circa la posizione (in inglese):
    {defibrillator:location:en}" - }, - "defibrillator-defibrillator:location:fr": { - "question": "Indica più precisamente dove si trova il defibrillatore (in francese)", - "render": "Informazioni supplementari circa la posizione (in francese):
    {defibrillator:location:fr}" - }, - "defibrillator-description": { - "question": "Vi sono altre informazioni utili agli utenti che non è stato possibile aggiungere prima? (lasciare vuoto in caso negativo)", - "render": "Informazioni supplementari: {description}" - }, - "defibrillator-email": { - "question": "Qual è l’indirizzo email per le domande riguardanti questo defibrillatore?", - "render": "Indirizzo email per le domande su questo defibrillatore:{email}" - }, - "defibrillator-fixme": { - "question": "C’è qualcosa di sbagliato riguardante come è stato mappato, che non si è potuto correggere qua? (lascia una nota agli esperti di OpenStreetMap)", - "render": "Informazioni supplementari per gli esperti di OpenStreetMap: {fixme}" - }, - "defibrillator-indoors": { - "mappings": { - "0": { - "then": "Questo defibrillatore si trova all’interno" - }, - "1": { - "then": "Questo defibrillatore si trova all’esterno" - } - }, - "question": "Questo defibrillatore si trova all’interno?" - }, - "defibrillator-level": { - "mappings": { - "0": { - "then": "Questo defibrillatore è al pian terreno" - }, - "1": { - "then": "Questo defibrillatore è al primo piano" - } - }, - "question": "A che piano si trova questo defibrillatore?", - "render": "Questo defibrillatore è al piano {level}" - }, - "defibrillator-opening_hours": { - "mappings": { - "0": { - "then": "Aperto 24/7 (festivi inclusi)" - } - }, - "question": "In quali orari è disponibile questo defibrillatore?", - "render": "{opening_hours_table(opening_hours)}" - }, - "defibrillator-phone": { - "question": "Qual è il numero di telefono per le domande riguardanti questo defibrillatore?", - "render": "Numero di telefono per le domande su questo defibrillatore:{phone}" - }, - "defibrillator-ref": { - "question": "Qual è il numero identificativo ufficiale di questo dispositivo? (se visibile sul dispositivo)", - "render": "Numero identificativo ufficiale di questo dispositivo:{ref}" - }, - "defibrillator-survey:date": { - "mappings": { - "0": { - "then": "Verificato oggi!" - } - }, - "question": "Quando è stato verificato per l’ultima volta questo defibrillatore?", - "render": "Questo defibrillatore è stato verificato per l‘ultima volta in data {survey:date}" - } - }, - "title": { - "render": "Defibrillatore" - } - }, - "direction": { - "description": "Questo livello visualizza le direzioni", - "name": "Visualizzazione della direzione" - }, - "drinking_water": { - "name": "Acqua potabile", - "presets": { - "0": { - "title": "acqua potabile" - } - }, - "tagRenderings": { - "Bottle refill": { - "mappings": { - "0": { - "then": "È facile riempire d’acqua le bottiglie" - }, - "1": { - "then": "Le bottiglie d’acqua potrebbero non entrare" - } - }, - "question": "Quanto è facile riempire d’acqua le bottiglie?" - }, - "Still in use?": { - "mappings": { - "0": { - "then": "La fontanella funziona" - }, - "1": { - "then": "La fontanella è guasta" - }, - "2": { - "then": "La fontanella è chiusa" - } - }, - "question": "Questo punto di acqua potabile è sempre funzionante?", - "render": "Lo stato operativo è {operational_status}" - }, - "render-closest-drinking-water": { - "render": "C’è un’altra fontanella a {_closest_other_drinking_water_distance} metri" - } - }, - "title": { - "render": "Acqua potabile" - } - }, - "ghost_bike": { - "name": "Bici fantasma", - "presets": { - "0": { - "title": "Bici fantasma" - } - }, - "tagRenderings": { - "ghost-bike-explanation": { - "render": "Una bici fantasma è il memoriale di un ciclista che è morto in un incidente stradale e che ha la forma di una bicicletta bianca piazzata in maniera stabile vicino al luogo dell’incidente." - }, - "ghost_bike-inscription": { - "question": "Che cosa è scritto sulla bici fantasma?", - "render": "{inscription}" - }, - "ghost_bike-name": { - "mappings": { - "0": { - "then": "Nessun nome scritto sulla bici" - } - }, - "question": "A chi è dedicata questa bici fantasma?
    Rispetta la privacy (compila solo il nome se questo è stato ampiamente pubblicato o se è scritto sulla bici). Decidi se è il caso di non inserire il cognome.
    ", - "render": "In ricordo di {name}" - }, - "ghost_bike-source": { - "question": "In quale pagina web si possono trovare informazioni sulla bici fantasma o l’incidente?", - "render": "Sono disponibili ulteriori informazioni" - }, - "ghost_bike-start_date": { - "question": "Quando è stata installata questa bici fantasma?", - "render": "Piazzata in data {start_date}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Bici fantasma in ricordo di {name}" - } - }, - "render": "Bici fantasma" - } - }, - "information_board": { - "name": "Pannelli informativi", - "presets": { - "0": { - "title": "pannello informativo" - } - }, - "title": { - "render": "Pannello informativo" - } - }, - "map": { - "description": "Una mappa, destinata ai turisti e che è sistemata in maniera permanente in uno spazio pubblico", - "name": "Mappe", - "presets": { - "0": { - "description": "Aggiungi una mappa mancante", - "title": "Mappa" - } - }, - "tagRenderings": { - "map-attribution": { - "mappings": { - "0": { - "then": "L’attribuzione a OpenStreetMap è chiaramente specificata, inclusa la licenza ODBL" - }, - "1": { - "then": "L’attribuzione a OpenStreetMap è chiaramente specificata ma la licenza non compare" - }, - "2": { - "then": "Non era presente alcun cenno a OpenStreetMap ma qualcuno vi ha attaccato un adesivo di OpenStreetMap" - }, - "3": { - "then": "Non c’è alcuna attribuzione" - }, - "4": { - "then": "Non c’è alcuna attribuzione" - } - }, - "question": "L’attribuzione a OpenStreetMap è presente?" - }, - "map-map_source": { - "mappings": { - "0": { - "then": "Questa mappa si basa su OpenStreetMap" - } - }, - "question": "Su quali dati si basa questa mappa?", - "render": "Questa mappa si basa su {map_source}" - } - }, - "title": { - "render": "Mappa" - } - }, - "nature_reserve": { - "tagRenderings": { - "Curator": { - "question": "Chi è il curatore di questa riserva naturale?
    Rispetta la privacy (scrivi il nome solo se questo è noto pubblicamente)", - "render": "{curator} è il curatore di questa riserva naturale" - }, - "Dogs?": { - "mappings": { - "0": { - "then": "I cani devono essere tenuti al guinzaglio" - }, - "1": { - "then": "I cani non sono ammessi" - }, - "2": { - "then": "I cani sono liberi di girare liberi" - } - }, - "question": "I cani sono ammessi in questa riserva naturale?" - }, - "Email": { - "question": "Qual è l’indirizzo email a cui scrivere per fare domande o segnalare problemi su questa riserva naturale?
    Rispetta la privacy (compila l’indirizzo email personale solo se è stato reso pubblico)", - "render": "{email}" - }, - "Surface area": { - "render": "Area: {_surface:ha} ha" - }, - "Website": { - "question": "In quale pagina web si possono trovare altre informazioni riguardanti questa riserva naturale?" - }, - "phone": { - "question": "Quale numero di telefono comporre per fare domande o segnalare problemi riguardanti questa riserva naturale?br/>Rispetta la privacy (inserisci il numero di telefono privato solo se questo è noto pubblicamente)", - "render": "{phone}" - } - } - }, - "picnic_table": { - "description": "Il livello che mostra i tavoli da picnic", - "name": "Tavoli da picnic", - "presets": { - "0": { - "title": "tavolo da picnic" - } - }, - "tagRenderings": { - "picnic_table-material": { - "mappings": { - "0": { - "then": "È un tavolo da picnic in legno" - }, - "1": { - "then": "È un tavolo da picnic in cemento" - } - }, - "question": "Di che materiale è fatto questo tavolo da picnic?", - "render": "Questo tavolo da picnic è fatto di {material}" - } - }, - "title": { - "render": "Tavolo da picnic" - } - }, - "playground": { - "description": "Parchi giochi", - "name": "Campi da gioco", - "presets": { - "0": { - "title": "Campetto" - } - }, - "tagRenderings": { - "Playground-wheelchair": { - "mappings": { - "0": { - "then": "Completamente accessibile in sedia a rotelle" - }, - "1": { - "then": "Accesso limitato in sedia a rotelle" - }, - "2": { - "then": "Non accessibile in sedia a rotelle" - } - }, - "question": "Il campetto è accessibile a persone in sedia a rotelle?" - }, - "playground-access": { - "mappings": { - "0": { - "then": "Accessibile pubblicamente" - }, - "1": { - "then": "Accessibile pubblicamente" - }, - "2": { - "then": "Accessibile solamente ai clienti dell’attività che lo gestisce" - }, - "3": { - "then": "Accessibile solamente agli studenti della scuola" - }, - "4": { - "then": "Non accessibile" - } - }, - "question": "Questo parco giochi è pubblicamente accessibile?" - }, - "playground-email": { - "question": "Qual è l’indirizzo email del gestore di questo parco giochi?", - "render": "{email}" - }, - "playground-lit": { - "mappings": { - "0": { - "then": "Questo parco giochi è illuminato di notte" - }, - "1": { - "then": "Questo parco giochi non è illuminato di notte" - } - }, - "question": "È illuminato di notte questo parco giochi?" - }, - "playground-max_age": { - "question": "Qual è l’età massima per accedere a questo parco giochi?", - "render": "Accessibile ai bambini di età inferiore a {max_age}" - }, - "playground-min_age": { - "question": "Qual è l’età minima per accedere a questo parco giochi?", - "render": "Accessibile ai bambini di almeno {min_age} anni" - }, - "playground-opening_hours": { - "mappings": { - "0": { - "then": "Si può accedere dall'alba al tramonto" - }, - "1": { - "then": "Si può sempre accedere" - }, - "2": { - "then": "Si può sempre accedere" - } - }, - "question": "Quando si può accedere a questo campetto?" - }, - "playground-operator": { - "question": "Chi è il responsabile di questo parco giochi?", - "render": "Gestito da {operator}" - }, - "playground-phone": { - "question": "Qual è il numero di telefono del gestore del campetto?", - "render": "{phone}" - }, - "playground-surface": { - "mappings": { - "0": { - "then": "La superficie è prato" - }, - "1": { - "then": "La superficie è sabbia" - }, - "2": { - "then": "La superficie consiste di trucioli di legno" - }, - "3": { - "then": "La superficie è mattonelle regolari" - }, - "4": { - "then": "La superficie è asfalto" - }, - "5": { - "then": "La superficie è cemento" - }, - "6": { - "then": "La superficie è non pavimentato" - }, - "7": { - "then": "La superficie è pavimentato" - } - }, - "question": "Qual è la superficie di questo parco giochi?
    Se ve ne è più di una, seleziona quella predominante", - "render": "La superficie è {surface}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Parco giochi {name}" - } - }, - "render": "Parco giochi" - } - }, - "public_bookcase": { - "description": "Una vetrinetta ai bordi della strada contenente libri, aperta al pubblico", - "name": "Microbiblioteche", - "presets": { - "0": { - "title": "Microbiblioteca" - } - }, - "tagRenderings": { - "bookcase-booktypes": { - "mappings": { - "0": { - "then": "Principalmente libri per l'infanzia" - }, - "1": { - "then": "Principalmente libri per persone in età adulta" - }, - "2": { - "then": "Sia libri per l'infanzia, sia per l'età adulta" - } - }, - "question": "Che tipo di libri si possono trovare in questa microbiblioteca?" - }, - "bookcase-is-accessible": { - "mappings": { - "0": { - "then": "È ad accesso libero" - }, - "1": { - "then": "L'accesso è riservato ai clienti" - } - }, - "question": "Questa microbiblioteca è ad accesso libero?" - }, - "bookcase-is-indoors": { - "mappings": { - "0": { - "then": "Questa microbiblioteca si trova al chiuso" - }, - "1": { - "then": "Questa microbiblioteca si trova all'aperto" - }, - "2": { - "then": "Questa microbiblioteca si trova all'aperto" - } - }, - "question": "Questa microbiblioteca si trova all'aperto?" - }, - "public_bookcase-brand": { - "mappings": { - "0": { - "then": "Fa parte della rete 'Little Free Library'" - }, - "1": { - "then": "Questa microbiblioteca non fa parte di una rete" - } - }, - "question": "Questa microbiblioteca fa parte di una rete?", - "render": "Questa microbiblioteca fa parte di {brand}" - }, - "public_bookcase-capacity": { - "question": "Quanti libri può contenere questa microbiblioteca?", - "render": "Questa microbiblioteca può contenere fino a {capacity} libri" - }, - "public_bookcase-name": { - "mappings": { - "0": { - "then": "Questa microbiblioteca non ha un nome proprio" - } - }, - "question": "Come si chiama questa microbiblioteca pubblica?", - "render": "Questa microbiblioteca si chiama {name}" - }, - "public_bookcase-operator": { - "question": "Chi mantiene questa microbiblioteca?", - "render": "È gestita da {operator}" - }, - "public_bookcase-ref": { - "mappings": { - "0": { - "then": "Questa microbiblioteca non fa parte di una rete" - } - }, - "question": "Qual è il numero identificativo di questa microbiblioteca?", - "render": "Il numero identificativo di questa microbiblioteca nella rete {brand} è {ref}" - }, - "public_bookcase-start_date": { - "question": "Quando è stata inaugurata questa microbiblioteca?", - "render": "È stata inaugurata il {start_date}" - }, - "public_bookcase-website": { - "question": "C'è un sito web con maggiori informazioni su questa microbiblioteca?", - "render": "Maggiori informazioni sul sito web" - } - }, - "title": { - "mappings": { - "0": { - "then": "Microbiblioteca pubblica {name}" - } - }, - "render": "Microbiblioteca" - } - }, - "shops": { - "tagRenderings": { - "shops-shop": { - "mappings": { - "5": { - "then": "Autofficina" - } - } - } - } - }, - "slow_roads": { - "tagRenderings": { - "slow_roads-surface": { - "mappings": { - "0": { - "then": "La superficie è erba" - }, - "1": { - "then": "La superficie è terreno" - }, - "2": { - "then": "La superficie è non pavimentata" - }, - "3": { - "then": "La superficie è sabbia" - }, - "4": { - "then": "La superficie è pietre irregolari" - }, - "5": { - "then": "La superficie è asfalto" - }, - "6": { - "then": "La superficie è calcestruzzo" - }, - "7": { - "then": "La superficie è pavimentata" - } - }, - "render": "La superficie è {surface}" - } - } - }, - "sport_pitch": { - "description": "Un campo sportivo", - "name": "Campi sportivi", - "presets": { - "0": { - "title": "Tavolo da tennistavolo" - }, - "1": { - "title": "Campo sportivo" - } - }, - "tagRenderings": { - "sport-pitch-access": { - "mappings": { - "0": { - "then": "Aperto al pubblico" - }, - "1": { - "then": "Accesso limitato (p.es. solo con prenotazione, in certi orari, ...)" - }, - "2": { - "then": "Accesso limitato ai membri dell'associazione" - }, - "3": { - "then": "Privato - non aperto al pubblico" - } - }, - "question": "Questo campo sportivo è aperto al pubblico?" - }, - "sport-pitch-reservation": { - "mappings": { - "0": { - "then": "La prenotazione è obbligatoria per usare questo campo sportivo" - }, - "1": { - "then": "La prenotazione è consigliata per usare questo campo sportivo" - }, - "2": { - "then": "La prenotazione è consentita, ma non è obbligatoria per usare questo campo sportivo" - }, - "3": { - "then": "Non è possibile prenotare" - } - }, - "question": "È necessario prenotarsi per usare questo campo sportivo?" - }, - "sport_pitch-email": { - "question": "Qual è l'indirizzo email del gestore?" - }, - "sport_pitch-opening_hours": { - "mappings": { - "1": { - "then": "Sempre aperto" - } - }, - "question": "Quando è aperto questo campo sportivo?" - }, - "sport_pitch-phone": { - "question": "Qual è il numero di telefono del gestore?" - }, - "sport_pitch-sport": { - "mappings": { - "0": { - "then": "Qui si gioca a basket" - }, - "1": { - "then": "Qui si gioca a calcio" - }, - "2": { - "then": "Questo è un tavolo da ping pong" - }, - "3": { - "then": "Qui si gioca a tennis" - }, - "4": { - "then": "Qui si gioca a korfball" - }, - "5": { - "then": "Qui si gioca a basket" - } - }, - "question": "Quale sport si gioca qui?", - "render": "Qui si gioca a {sport}" - }, - "sport_pitch-surface": { - "mappings": { - "0": { - "then": "La superficie è erba" - }, - "1": { - "then": "La superficie è sabbia" - }, - "2": { - "then": "La superficie è pietre irregolari" - }, - "3": { - "then": "La superficie è asfalto" - }, - "4": { - "then": "La superficie è calcestruzzo" - } - }, - "question": "Qual è la superficie di questo campo sportivo?", - "render": "La superficie è {surface}" - } - }, - "title": { - "render": "Campo sportivo" - } - }, - "surveillance_camera": { - "name": "Videocamere di sorveglianza", - "tagRenderings": { - "Camera type: fixed; panning; dome": { - "mappings": { - "0": { - "then": "Una videocamera fissa (non semovente)" - }, - "1": { - "then": "Una videocamera a cupola (che può ruotare)" - }, - "2": { - "then": "Una videocamera panoramica" - } - }, - "question": "Di che tipo di videocamera si tratta?" - }, - "Indoor camera? This isn't clear for 'public'-cameras": { - "mappings": { - "0": { - "then": "Questa videocamera si trova al chiuso" - }, - "1": { - "then": "Questa videocamera si trova all'aperto" - }, - "2": { - "then": "Questa videocamera si trova probabilmente all'esterno" - } - }, - "question": "Lo spazio pubblico sorvegliato da questa videocamera è all'aperto o al chiuso?" - }, - "Level": { - "question": "A che piano si trova questa videocamera?", - "render": "Si trova al piano {level}" - }, - "Operator": { - "question": "Chi gestisce questa videocamera a circuito chiuso?", - "render": "È gestita da {operator}" - }, - "Surveillance type: public, outdoor, indoor": { - "mappings": { - "0": { - "then": "Sorveglia un'area pubblica, come una strada, un ponte, una piazza, un parco, una stazione, un passaggio o un sottopasso pubblico, ..." - }, - "1": { - "then": "Sorveglia un'area esterna di proprietà privata (un parcheggio, una stazione di servizio, un cortile, un ingresso, un vialetto privato, ...)" - }, - "2": { - "then": "Sorveglia un ambiente interno di proprietà privata, per esempio un negozio, un parcheggio sotterraneo privato, ..." - } - }, - "question": "Che cosa sorveglia questa videocamera" - }, - "Surveillance:zone": { - "mappings": { - "0": { - "then": "Sorveglia un parcheggio" - }, - "1": { - "then": "Sorveglia il traffico" - }, - "2": { - "then": "Sorveglia un ingresso" - }, - "3": { - "then": "Sorveglia un corridoio" - }, - "4": { - "then": "Sorveglia una pensilina del trasporto pubblico" - }, - "5": { - "then": "Sorveglia un negozio" - } - }, - "question": "Che cosa è sorvegliato qui?", - "render": " Sorveglia una {surveillance:zone}" - }, - "camera:mount": { - "mappings": { - "0": { - "then": "Questa telecamera è posizionata contro un muro" - }, - "1": { - "then": "Questa telecamera è posizionata su un palo" - }, - "2": { - "then": "Questa telecamera è posizionata sul soffitto" - } - }, - "question": "Com'è posizionata questa telecamera?", - "render": "Metodo di montaggio: {mount}" - }, - "direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view": { - "mappings": { - "0": { - "then": "Punta in direzione {direction}" - } - }, - "question": "In quale direzione geografica punta questa videocamera?", - "render": "Punta in direzione {camera:direction}" - } - }, - "title": { - "render": "Videocamera di sorveglianza" - } - }, - "toilet": { - "name": "Servizi igienici", - "presets": { - "0": { - "description": "Servizi igienici aperti al pubblico", - "title": "servizi igienici" - }, - "1": { - "description": "Servizi igienici che hanno almeno una toilette accessibile a persone in sedia a rotelle", - "title": "servizi igienici accessibili per persone in sedia a rotelle" - } - }, - "tagRenderings": { - "toilet-access": { - "mappings": { - "0": { - "then": "Accesso pubblico" - }, - "1": { - "then": "Accesso riservato ai clienti e alle clienti" - }, - "2": { - "then": "Non accessibile" - }, - "3": { - "then": "Accessibile, ma occorre chiedere una chiave per accedere" - }, - "4": { - "then": "Accesso pubblico" - } - }, - "question": "Questi servizi igienici sono aperti al pubblico?", - "render": "L'accesso è {access}" - }, - "toilet-changing_table:location": { - "mappings": { - "0": { - "then": "Il fasciatoio è nei servizi igienici femminili. " - }, - "1": { - "then": "Il fasciatoio è nei servizi igienici maschili. " - }, - "2": { - "then": "Il fasciatoio è nei servizi igienici per persone in sedia a rotelle. " - }, - "3": { - "then": "Il fasciatoio è in una stanza dedicata. " - } - }, - "question": "Dove si trova il fasciatoio?", - "render": "Il fasciatoio si trova presso {changing_table:location}" - }, - "toilet-charge": { - "question": "Quanto costa l'accesso a questi servizi igienici?", - "render": "La tariffa è {charge}" - }, - "toilets-changing-table": { - "mappings": { - "0": { - "then": "È disponibile un fasciatoio" - }, - "1": { - "then": "Non è disponibile un fasciatoio" - } - }, - "question": "È disponibile un fasciatoio (per cambiare i pannolini)?" - }, - "toilets-fee": { - "mappings": { - "0": { - "then": "Questi servizi igienici sono a pagamento" - }, - "1": { - "then": "Gratis" - } - }, - "question": "Questi servizi igienici sono gratuiti?" - }, - "toilets-type": { - "mappings": { - "0": { - "then": "Ci sono solo WC con sedile" - }, - "1": { - "then": "Ci sono solo urinali" - }, - "2": { - "then": "Ci sono solo turche" - }, - "3": { - "then": "Ci sono sia sedili, sia urinali" - } - }, - "question": "Di che tipo di servizi igienici si tratta?" - }, - "toilets-wheelchair": { - "mappings": { - "0": { - "then": "C'è un WC riservato alle persone in sedia a rotelle" - }, - "1": { - "then": "Non accessibile in sedia a rotelle" - } - }, - "question": "C'è un WC riservato alle persone in sedia a rotelle" - } - }, - "title": { - "render": "Servizi igienici" - } - }, - "tree_node": { - "name": "Albero", - "presets": { - "0": { - "description": "Un albero di una specie con foglie larghe come la quercia o il pioppo.", - "title": "Albero latifoglia" - }, - "1": { - "description": "Un albero di una specie con aghi come il pino o l’abete.", - "title": "Albero aghifoglia" - }, - "2": { - "description": "Qualora non si sia sicuri se si tratta di un albero latifoglia o aghifoglia.", - "title": "Albero" - } - }, - "tagRenderings": { - "tree-decidouous": { - "mappings": { - "0": { - "then": "Caduco: l’albero perde le sue foglie per un periodo dell’anno." - }, - "1": { - "then": "Sempreverde." - } - }, - "question": "È un sempreverde o caduco?" - }, - "tree-denotation": { - "mappings": { - "0": { - "then": "È un albero notevole per le sue dimensioni o per la posizione prominente. È utile alla navigazione." - }, - "1": { - "then": "L’albero è un monumento naturale, ad esempio perché specialmente antico o appartenente a specie importanti." - }, - "2": { - "then": "L’albero è usato per scopi agricoli, ad esempio in un frutteto." - }, - "3": { - "then": "L’albero è in un parco o qualcosa di simile (cimitero, aree didattiche, etc.)." - }, - "4": { - "then": "L’albero è un giardino residenziale." - }, - "5": { - "then": "Fa parte di un viale alberato." - }, - "6": { - "then": "L’albero si trova in un’area urbana." - }, - "7": { - "then": "L’albero si trova fuori dall’area urbana." - } - }, - "question": "Quanto significativo è questo albero? Scegli la prima risposta che corrisponde." - }, - "tree-height": { - "mappings": { - "0": { - "then": "Altezza: {height} m" - } - }, - "render": "Altezza: {height}" - }, - "tree-heritage": { - "mappings": { - "0": { - "then": "\"\"/Registrato come patrimonio da Onroerend Erfgoed Flanders" - }, - "1": { - "then": "Registrato come patrimonio da Direction du Patrimoine culturel di Bruxelles" - }, - "2": { - "then": "Registrato come patrimonio da un’organizzazione differente" - }, - "3": { - "then": "Non è registrato come patrimonio" - }, - "4": { - "then": "Registrato come patrimonio da un’organizzazione differente" - } - }, - "question": "Quest’albero è registrato come patrimonio?" - }, - "tree-leaf_type": { - "mappings": { - "0": { - "then": "\"\"/ Latifoglia" - }, - "1": { - "then": "\"\"/ Aghifoglia" - }, - "2": { - "then": "\"\"/ Privo di foglie (permanente)" - } - }, - "question": "Si tratta di un albero latifoglia o aghifoglia?" - }, - "tree_node-name": { - "mappings": { - "0": { - "then": "L’albero non ha un nome." - } - }, - "question": "L’albero ha un nome?", - "render": "Nome: {name}" - }, - "tree_node-ref:OnroerendErfgoed": { - "question": "Qual è l’ID rilasciato da Onroerend Erfgoed Flanders?", - "render": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}" - }, - "tree_node-wikidata": { - "question": "Qual è l’ID Wikidata per questo albero?", - "render": "\"\"/ Wikidata: {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Albero" - } - }, - "viewpoint": { - "description": "Un punto panoramico che offre una bella vista. L'ideale è aggiungere un'immagine, se nessun'altra categoria è appropriata", - "name": "Punto panoramico", - "presets": { - "0": { - "title": "Punto panoramico" - } - }, - "tagRenderings": { - "viewpoint-description": { - "question": "Vuoi aggiungere una descrizione?" - } - }, - "title": { - "render": "Punto panoramico" + "title": { + "mappings": { + "0": { + "then": "Opera {name}" } + }, + "render": "Opera d’arte" } + }, + "bench": { + "name": "Panchine", + "presets": { + "0": { + "title": "panchina" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Schienale: Sì" + }, + "1": { + "then": "Schienale: No" + } + }, + "question": "Questa panchina ha lo schienale?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "Colore: marrone" + }, + "1": { + "then": "Colore: verde" + }, + "2": { + "then": "Colore: grigio" + }, + "3": { + "then": "Colore: bianco" + }, + "4": { + "then": "Colore: rosso" + }, + "5": { + "then": "Colore: nero" + }, + "6": { + "then": "Colore: blu" + }, + "7": { + "then": "Colore: giallo" + } + }, + "question": "Di che colore è questa panchina?", + "render": "Colore: {colour}" + }, + "bench-direction": { + "question": "In che direzione si guarda quando si è seduti su questa panchina?", + "render": "Quando si è seduti su questa panchina, si guarda verso {direction}°." + }, + "bench-material": { + "mappings": { + "0": { + "then": "Materiale: legno" + }, + "1": { + "then": "Materiale: metallo" + }, + "2": { + "then": "Materiale: pietra" + }, + "3": { + "then": "Materiale: cemento" + }, + "4": { + "then": "Materiale: plastica" + }, + "5": { + "then": "Materiale: acciaio" + } + }, + "question": "Di che materiale è fatta questa panchina?", + "render": "Materiale: {material}" + }, + "bench-seats": { + "question": "Quanti posti ha questa panchina?", + "render": "{seats} posti" + }, + "bench-survey:date": { + "question": "Quando è stata verificata l’ultima volta questa panchina?", + "render": "Questa panchina è stata controllata l’ultima volta in data {survey:date}" + } + }, + "title": { + "render": "Panchina" + } + }, + "bench_at_pt": { + "name": "Panchine alle fermate del trasporto pubblico", + "tagRenderings": { + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "Panca in piedi" + } + } + }, + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Panchina alla fermata del trasporto pubblico" + }, + "1": { + "then": "Panchina in un riparo" + } + }, + "render": "Panchina" + } + }, + "bicycle_library": { + "description": "Una struttura dove le biciclette possono essere prestate per periodi di tempo più lunghi", + "name": "Bici in prestito", + "presets": { + "0": { + "description": "Una ciclo-teca o «bici in prestito» ha una collezione di bici che possno essere prestate", + "title": "Bici in prestito" + } + }, + "tagRenderings": { + "bicycle-library-target-group": { + "mappings": { + "0": { + "then": "Sono disponibili biciclette per bambini" + }, + "1": { + "then": "Sono disponibili biciclette per adulti" + }, + "2": { + "then": "Sono disponibili biciclette per disabili" + } + }, + "question": "Chi può prendere in prestito le biciclette qua?" + }, + "bicycle_library-charge": { + "mappings": { + "0": { + "then": "Il prestito di una bicicletta è gratuito" + }, + "1": { + "then": "Il prestito di una bicicletta costa 20 €/anno più 20 € di garanzia" + } + }, + "question": "Quanto costa il prestito di una bicicletta?", + "render": "Il prestito di una bicicletta costa {charge}" + }, + "bicycle_library-name": { + "question": "Qual è il nome di questo “bici in prestito”?", + "render": "Il “bici in prestito” è chiamato {name}" + } + }, + "title": { + "render": "Bici in prestito" + } + }, + "bicycle_tube_vending_machine": { + "name": "Distributore automatico di camere d’aria per bici", + "presets": { + "0": { + "title": "Distributore automatico di camere d’aria per bici" + } + }, + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "Il distributore automatico funziona" + }, + "1": { + "then": "Il distributore automatico è guasto" + }, + "2": { + "then": "Il distributore automatico è spento" + } + }, + "question": "Questo distributore automatico funziona ancora?", + "render": "Lo stato operativo è {operational_status}" + } + }, + "title": { + "render": "Distributore automatico di camere d’aria per bici" + } + }, + "bike_cafe": { + "name": "Caffè in bici", + "presets": { + "0": { + "title": "Caffè in bici" + } + }, + "tagRenderings": { + "bike_cafe-bike-pump": { + "mappings": { + "0": { + "then": "Questo caffè in bici offre una pompa per bici liberamente utilizzabile" + }, + "1": { + "then": "Questo caffè in bici non offre una pompa per bici liberamente utilizzabile" + } + }, + "question": "Questo caffè in bici offre una pompa per bici che chiunque può utilizzare?" + }, + "bike_cafe-email": { + "question": "Qual è l’indirizzo email di {name}?" + }, + "bike_cafe-name": { + "question": "Qual è il nome di questo caffè in bici?", + "render": "Questo caffè in bici è chiamato {name}" + }, + "bike_cafe-opening_hours": { + "question": "Quando è aperto questo caffè in bici?" + }, + "bike_cafe-phone": { + "question": "Qual è il numero di telefono di {name}?" + }, + "bike_cafe-repair-service": { + "mappings": { + "0": { + "then": "Questo caffè in bici ripara le bici" + }, + "1": { + "then": "Questo caffè in bici non ripara le bici" + } + }, + "question": "Questo caffè in bici ripara le bici?" + }, + "bike_cafe-repair-tools": { + "mappings": { + "0": { + "then": "Questo caffè in bici fornisce degli attrezzi per la riparazione fai-da-te" + }, + "1": { + "then": "Questo caffè in bici non fornisce degli attrezzi per la riparazione fai-da-te" + } + }, + "question": "Ci sono degli strumenti per riparare la propria bicicletta?" + }, + "bike_cafe-website": { + "question": "Qual è il sito web di {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Caffè in bici {name}" + } + }, + "render": "Caffè in bici" + } + }, + "bike_cleaning": { + "name": "Servizio lavaggio bici", + "presets": { + "0": { + "title": "Servizio lavaggio bici" + } + }, + "title": { + "mappings": { + "0": { + "then": "Servizio lavaggio bici {name}" + } + }, + "render": "Servizio lavaggio bici" + } + }, + "bike_parking": { + "name": "Parcheggio bici", + "presets": { + "0": { + "title": "Parcheggio bici" + } + }, + "tagRenderings": { + "Access": { + "mappings": { + "0": { + "then": "Accessibile pubblicamente" + }, + "1": { + "then": "Accesso destinato principalmente ai visitatori di un’attività" + }, + "2": { + "then": "Accesso limitato ai membri di una scuola, una compagnia o un’organizzazione" + } + }, + "question": "Chi può usare questo parcheggio bici?", + "render": "{access}" + }, + "Bicycle parking type": { + "mappings": { + "0": { + "then": "Archetti " + }, + "1": { + "then": "Scolapiatti " + }, + "2": { + "then": "Blocca manubrio " + }, + "3": { + "then": "Rastrelliera " + }, + "4": { + "then": "A due piani " + }, + "5": { + "then": "Rimessa " + }, + "6": { + "then": "Colonnina " + }, + "7": { + "then": "Una zona del pavimento che è marcata per il parcheggio delle bici" + } + }, + "question": "Di che tipo di parcheggio bici si tratta?", + "render": "È un parcheggio bici del tipo: {bicycle_parking}" + }, + "Capacity": { + "question": "Quante biciclette entrano in questo parcheggio per bici (incluse le eventuali bici da trasporto)?", + "render": "Posti per {capacity} bici" + }, + "Cargo bike capacity?": { + "question": "Quante bici da trasporto entrano in questo parcheggio per bici?", + "render": "Questo parcheggio può contenere {capacity:cargo_bike} bici da trasporto" + }, + "Cargo bike spaces?": { + "mappings": { + "0": { + "then": "Questo parcheggio ha posto per bici da trasporto" + }, + "1": { + "then": "Questo parcheggio ha posti destinati (ufficialmente) alle bici da trasporto." + }, + "2": { + "then": "Il parcheggio delle bici da trasporto è proibito" + } + }, + "question": "Questo parcheggio dispone di posti specifici per le bici da trasporto?" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "È un parcheggio coperto (ha un tetto)" + }, + "1": { + "then": "Non è un parcheggio coperto" + } + }, + "question": "È un parcheggio coperto? Indicare “coperto” per parcheggi all’interno." + }, + "Underground?": { + "mappings": { + "0": { + "then": "Parcheggio sotterraneo" + }, + "1": { + "then": "Parcheggio in superficie" + }, + "2": { + "then": "Parcheggio sul tetto" + }, + "3": { + "then": "Parcheggio in superficie" + }, + "4": { + "then": "Parcheggio sul tetto" + } + }, + "question": "Qual è la posizione relativa di questo parcheggio bici?" + } + }, + "title": { + "render": "Parcheggio bici" + } + }, + "bike_repair_station": { + "name": "Stazioni bici (riparazione, gonfiaggio o entrambi)", + "presets": { + "0": { + "description": "Un dispositivo per gonfiare le proprie gomme in un luogo fisso pubblicamente accessibile.

    Esempi di pompe per biciclette

    ", + "title": "Pompa per bici" + }, + "1": { + "description": "Un dispositivo con attrezzi per riparare la tua bici e una pompa in un luogo fisso. Gli attrezzi sono spesso attaccati ad una catena per prevenire il furto.

    Esempio

    ", + "title": "Stazione di riparazione bici e pompa" + }, + "2": { + "title": "Stazione di riparazione bici senza pompa" + } + }, + "tagRenderings": { + "Operational status": { + "mappings": { + "0": { + "then": "La pompa per bici è guasta" + }, + "1": { + "then": "La pompa per bici funziona" + } + }, + "question": "La pompa per bici è sempre funzionante?" + }, + "bike_repair_station-available-services": { + "mappings": { + "0": { + "then": "C’è solamente una pompa presente" + }, + "1": { + "then": "Ci sono solo degli attrezzi (cacciaviti, pinze…) presenti" + }, + "2": { + "then": "Ci sono sia attrezzi che pompa presenti" + } + }, + "question": "Quali servizi sono disponibili in questa stazione per bici?" + }, + "bike_repair_station-bike-chain-tool": { + "mappings": { + "0": { + "then": "È presente un utensile per riparare la catena" + }, + "1": { + "then": "Non è presente un utensile per riparare la catena" + } + }, + "question": "Questa stazione di riparazione bici ha un attrezzo speciale per riparare la catena della bici?" + }, + "bike_repair_station-bike-stand": { + "mappings": { + "0": { + "then": "C’è un gancio o un supporto" + }, + "1": { + "then": "Non c’è né un gancio né un supporto" + } + }, + "question": "Questa stazione bici ha un gancio per tenere sospesa la bici o un supporto per alzarla?" + }, + "bike_repair_station-electrical_pump": { + "mappings": { + "0": { + "then": "Pompa manuale" + }, + "1": { + "then": "Pompa elettrica" + } + }, + "question": "Questa pompa per bici è elettrica?" + }, + "bike_repair_station-manometer": { + "mappings": { + "0": { + "then": "C’è un manometro" + }, + "1": { + "then": "Non c’è un manometro" + }, + "2": { + "then": "C’è un manometro ma è rotto" + } + }, + "question": "Questa pompa ha l’indicatore della pressione o il manometro?" + }, + "bike_repair_station-opening_hours": { + "mappings": { + "0": { + "then": "Sempre aperto" + }, + "1": { + "then": "Sempre aperto" + } + }, + "question": "Quando è aperto questo punto riparazione bici?" + }, + "bike_repair_station-operator": { + "question": "Chi gestisce questa pompa per bici?", + "render": "Manutenuta da {operator}" + }, + "bike_repair_station-valves": { + "mappings": { + "0": { + "then": "Sclaverand (detta anche Presta)" + }, + "1": { + "then": "Dunlop" + }, + "2": { + "then": "Schrader (valvola delle auto)" + } + }, + "question": "Quali valvole sono supportate?", + "render": "Questa pompa è compatibile con le seguenti valvole: {valves}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Stazione riparazione bici" + }, + "1": { + "then": "Stazione riparazione bici" + }, + "2": { + "then": "Pompa rotta" + }, + "3": { + "then": "Pompa per bici {name}" + }, + "4": { + "then": "Pompa per bici" + } + }, + "render": "Stazione bici (gonfiaggio & riparazione)" + } + }, + "bike_shop": { + "description": "Un negozio che vende specificatamente biciclette o articoli similari", + "name": "Venditore/riparatore bici", + "presets": { + "0": { + "title": "Negozio/riparatore di bici" + } + }, + "tagRenderings": { + "bike_repair_bike-pump-service": { + "mappings": { + "0": { + "then": "Questo negozio offre l’uso pubblico di una pompa per bici" + }, + "1": { + "then": "Questo negozio non offre l’uso pubblico di una pompa per bici" + }, + "2": { + "then": "C’è una pompa per bici, è mostrata come punto separato " + } + }, + "question": "Questo negozio offre l’uso a chiunque di una pompa per bici?" + }, + "bike_repair_bike-wash": { + "mappings": { + "0": { + "then": "Questo negozio lava le biciclette" + }, + "1": { + "then": "Questo negozio ha una struttura dove è possibile pulire la propria bici" + }, + "2": { + "then": "Questo negozio non offre la pulizia della bicicletta" + } + }, + "question": "Vengono lavate le bici qua?" + }, + "bike_repair_rents-bikes": { + "mappings": { + "0": { + "then": "Questo negozio noleggia le bici" + }, + "1": { + "then": "Questo negozio non noleggia le bici" + } + }, + "question": "Questo negozio noleggia le bici?" + }, + "bike_repair_repairs-bikes": { + "mappings": { + "0": { + "then": "Questo negozio ripara bici" + }, + "1": { + "then": "Questo negozio non ripara bici" + }, + "2": { + "then": "Questo negozio ripara solo le bici che sono state acquistate qua" + }, + "3": { + "then": "Questo negozio ripara solo le biciclette di una certa marca" + } + }, + "question": "Questo negozio ripara bici?" + }, + "bike_repair_second-hand-bikes": { + "mappings": { + "0": { + "then": "Questo negozio vende bici usate" + }, + "1": { + "then": "Questo negozio non vende bici usate" + }, + "2": { + "then": "Questo negozio vende solamente bici usate" + } + }, + "question": "Questo negozio vende bici usate?" + }, + "bike_repair_sells-bikes": { + "mappings": { + "0": { + "then": "Questo negozio vende bici" + }, + "1": { + "then": "Questo negozio non vende bici" + } + }, + "question": "Questo negozio vende bici?" + }, + "bike_repair_tools-service": { + "mappings": { + "0": { + "then": "Questo negozio offre degli attrezzi per la riparazione fai-da-te" + }, + "1": { + "then": "Questo negozio non offre degli attrezzi per la riparazione fai-da-te" + }, + "2": { + "then": "Gli attrezzi per la riparazione fai-da-te sono disponibili solamente se hai acquistato/noleggiato la bici nel negozio" + } + }, + "question": "Sono presenti degli attrezzi per riparare la propria bici?" + }, + "bike_shop-email": { + "question": "Qual è l’indirizzo email di {name}?" + }, + "bike_shop-is-bicycle_shop": { + "render": "Questo negozio è specializzato nella vendita di {shop} ed effettua attività relative alle biciclette" + }, + "bike_shop-name": { + "question": "Qual è il nome di questo negozio di biciclette?", + "render": "Questo negozio di biciclette è chiamato {name}" + }, + "bike_shop-phone": { + "question": "Qual è il numero di telefono di {name}?" + }, + "bike_shop-website": { + "question": "Qual è il sito web di {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Negozio di articoli sportivi {name}" + }, + "2": { + "then": "Noleggio di biciclette {name}" + }, + "3": { + "then": "Riparazione biciclette {name" + }, + "4": { + "then": "Negozio di biciclette {name}" + }, + "5": { + "then": "Venditore/riparatore bici {name}" + } + }, + "render": "Venditore/riparatore bici" + } + }, + "bike_themed_object": { + "name": "Oggetto relativo alle bici", + "title": { + "mappings": { + "1": { + "then": "Pista ciclabile" + } + }, + "render": "Oggetto relativo alle bici" + } + }, + "defibrillator": { + "name": "Defibrillatori", + "presets": { + "0": { + "title": "Defibrillatore" + } + }, + "tagRenderings": { + "defibrillator-access": { + "mappings": { + "0": { + "then": "Pubblicamente accessibile" + }, + "1": { + "then": "Pubblicamente accessibile" + }, + "2": { + "then": "Accessibile solo ai clienti" + }, + "3": { + "then": "Non accessibile al pubblico (ad esempio riservato al personale, ai proprietari, etc.)" + }, + "4": { + "then": "Non accessibile, potrebbe essere solo per uso professionale" + } + }, + "question": "Questo defibrillatore è liberamente accessibile?", + "render": "Accesso è {access}" + }, + "defibrillator-defibrillator": { + "mappings": { + "0": { + "then": "Non vi sono informazioni riguardanti il tipo di questo dispositivo" + }, + "1": { + "then": "Questo è un defibrillatore manuale per professionisti" + }, + "2": { + "then": "È un normale defibrillatore automatico" + } + }, + "question": "Si tratta di un normale defibrillatore automatico o un defibrillatore manuale riservato ai professionisti?" + }, + "defibrillator-defibrillator:location": { + "question": "Indica più precisamente dove si trova il defibrillatore (in lingua locale)", + "render": "Informazioni supplementari circa la posizione (in lingua locale):
    {defibrillator:location}" + }, + "defibrillator-defibrillator:location:en": { + "question": "Indica più precisamente dove si trova il defibrillatore (in inglese)", + "render": "Informazioni supplementari circa la posizione (in inglese):
    {defibrillator:location:en}" + }, + "defibrillator-defibrillator:location:fr": { + "question": "Indica più precisamente dove si trova il defibrillatore (in francese)", + "render": "Informazioni supplementari circa la posizione (in francese):
    {defibrillator:location:fr}" + }, + "defibrillator-description": { + "question": "Vi sono altre informazioni utili agli utenti che non è stato possibile aggiungere prima? (lasciare vuoto in caso negativo)", + "render": "Informazioni supplementari: {description}" + }, + "defibrillator-email": { + "question": "Qual è l’indirizzo email per le domande riguardanti questo defibrillatore?", + "render": "Indirizzo email per le domande su questo defibrillatore:{email}" + }, + "defibrillator-fixme": { + "question": "C’è qualcosa di sbagliato riguardante come è stato mappato, che non si è potuto correggere qua? (lascia una nota agli esperti di OpenStreetMap)", + "render": "Informazioni supplementari per gli esperti di OpenStreetMap: {fixme}" + }, + "defibrillator-indoors": { + "mappings": { + "0": { + "then": "Questo defibrillatore si trova all’interno" + }, + "1": { + "then": "Questo defibrillatore si trova all’esterno" + } + }, + "question": "Questo defibrillatore si trova all’interno?" + }, + "defibrillator-level": { + "mappings": { + "0": { + "then": "Questo defibrillatore è al pian terreno" + }, + "1": { + "then": "Questo defibrillatore è al primo piano" + } + }, + "question": "A che piano si trova questo defibrillatore?", + "render": "Questo defibrillatore è al piano {level}" + }, + "defibrillator-opening_hours": { + "mappings": { + "0": { + "then": "Aperto 24/7 (festivi inclusi)" + } + }, + "question": "In quali orari è disponibile questo defibrillatore?", + "render": "{opening_hours_table(opening_hours)}" + }, + "defibrillator-phone": { + "question": "Qual è il numero di telefono per le domande riguardanti questo defibrillatore?", + "render": "Numero di telefono per le domande su questo defibrillatore:{phone}" + }, + "defibrillator-ref": { + "question": "Qual è il numero identificativo ufficiale di questo dispositivo? (se visibile sul dispositivo)", + "render": "Numero identificativo ufficiale di questo dispositivo:{ref}" + }, + "defibrillator-survey:date": { + "mappings": { + "0": { + "then": "Verificato oggi!" + } + }, + "question": "Quando è stato verificato per l’ultima volta questo defibrillatore?", + "render": "Questo defibrillatore è stato verificato per l‘ultima volta in data {survey:date}" + } + }, + "title": { + "render": "Defibrillatore" + } + }, + "direction": { + "description": "Questo livello visualizza le direzioni", + "name": "Visualizzazione della direzione" + }, + "drinking_water": { + "name": "Acqua potabile", + "presets": { + "0": { + "title": "acqua potabile" + } + }, + "tagRenderings": { + "Bottle refill": { + "mappings": { + "0": { + "then": "È facile riempire d’acqua le bottiglie" + }, + "1": { + "then": "Le bottiglie d’acqua potrebbero non entrare" + } + }, + "question": "Quanto è facile riempire d’acqua le bottiglie?" + }, + "Still in use?": { + "mappings": { + "0": { + "then": "La fontanella funziona" + }, + "1": { + "then": "La fontanella è guasta" + }, + "2": { + "then": "La fontanella è chiusa" + } + }, + "question": "Questo punto di acqua potabile è sempre funzionante?", + "render": "Lo stato operativo è {operational_status}" + }, + "render-closest-drinking-water": { + "render": "C’è un’altra fontanella a {_closest_other_drinking_water_distance} metri" + } + }, + "title": { + "render": "Acqua potabile" + } + }, + "ghost_bike": { + "name": "Bici fantasma", + "presets": { + "0": { + "title": "Bici fantasma" + } + }, + "tagRenderings": { + "ghost-bike-explanation": { + "render": "Una bici fantasma è il memoriale di un ciclista che è morto in un incidente stradale e che ha la forma di una bicicletta bianca piazzata in maniera stabile vicino al luogo dell’incidente." + }, + "ghost_bike-inscription": { + "question": "Che cosa è scritto sulla bici fantasma?", + "render": "{inscription}" + }, + "ghost_bike-name": { + "mappings": { + "0": { + "then": "Nessun nome scritto sulla bici" + } + }, + "question": "A chi è dedicata questa bici fantasma?
    Rispetta la privacy (compila solo il nome se questo è stato ampiamente pubblicato o se è scritto sulla bici). Decidi se è il caso di non inserire il cognome.
    ", + "render": "In ricordo di {name}" + }, + "ghost_bike-source": { + "question": "In quale pagina web si possono trovare informazioni sulla bici fantasma o l’incidente?", + "render": "Sono disponibili ulteriori informazioni" + }, + "ghost_bike-start_date": { + "question": "Quando è stata installata questa bici fantasma?", + "render": "Piazzata in data {start_date}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Bici fantasma in ricordo di {name}" + } + }, + "render": "Bici fantasma" + } + }, + "information_board": { + "name": "Pannelli informativi", + "presets": { + "0": { + "title": "pannello informativo" + } + }, + "title": { + "render": "Pannello informativo" + } + }, + "map": { + "description": "Una mappa, destinata ai turisti e che è sistemata in maniera permanente in uno spazio pubblico", + "name": "Mappe", + "presets": { + "0": { + "description": "Aggiungi una mappa mancante", + "title": "Mappa" + } + }, + "tagRenderings": { + "map-attribution": { + "mappings": { + "0": { + "then": "L’attribuzione a OpenStreetMap è chiaramente specificata, inclusa la licenza ODBL" + }, + "1": { + "then": "L’attribuzione a OpenStreetMap è chiaramente specificata ma la licenza non compare" + }, + "2": { + "then": "Non era presente alcun cenno a OpenStreetMap ma qualcuno vi ha attaccato un adesivo di OpenStreetMap" + }, + "3": { + "then": "Non c’è alcuna attribuzione" + }, + "4": { + "then": "Non c’è alcuna attribuzione" + } + }, + "question": "L’attribuzione a OpenStreetMap è presente?" + }, + "map-map_source": { + "mappings": { + "0": { + "then": "Questa mappa si basa su OpenStreetMap" + } + }, + "question": "Su quali dati si basa questa mappa?", + "render": "Questa mappa si basa su {map_source}" + } + }, + "title": { + "render": "Mappa" + } + }, + "nature_reserve": { + "tagRenderings": { + "Curator": { + "question": "Chi è il curatore di questa riserva naturale?
    Rispetta la privacy (scrivi il nome solo se questo è noto pubblicamente)", + "render": "{curator} è il curatore di questa riserva naturale" + }, + "Dogs?": { + "mappings": { + "0": { + "then": "I cani devono essere tenuti al guinzaglio" + }, + "1": { + "then": "I cani non sono ammessi" + }, + "2": { + "then": "I cani sono liberi di girare liberi" + } + }, + "question": "I cani sono ammessi in questa riserva naturale?" + }, + "Email": { + "question": "Qual è l’indirizzo email a cui scrivere per fare domande o segnalare problemi su questa riserva naturale?
    Rispetta la privacy (compila l’indirizzo email personale solo se è stato reso pubblico)", + "render": "{email}" + }, + "Surface area": { + "render": "Area: {_surface:ha} ha" + }, + "Website": { + "question": "In quale pagina web si possono trovare altre informazioni riguardanti questa riserva naturale?" + }, + "phone": { + "question": "Quale numero di telefono comporre per fare domande o segnalare problemi riguardanti questa riserva naturale?br/>Rispetta la privacy (inserisci il numero di telefono privato solo se questo è noto pubblicamente)", + "render": "{phone}" + } + } + }, + "picnic_table": { + "description": "Il livello che mostra i tavoli da picnic", + "name": "Tavoli da picnic", + "presets": { + "0": { + "title": "tavolo da picnic" + } + }, + "tagRenderings": { + "picnic_table-material": { + "mappings": { + "0": { + "then": "È un tavolo da picnic in legno" + }, + "1": { + "then": "È un tavolo da picnic in cemento" + } + }, + "question": "Di che materiale è fatto questo tavolo da picnic?", + "render": "Questo tavolo da picnic è fatto di {material}" + } + }, + "title": { + "render": "Tavolo da picnic" + } + }, + "playground": { + "description": "Parchi giochi", + "name": "Campi da gioco", + "presets": { + "0": { + "title": "Campetto" + } + }, + "tagRenderings": { + "Playground-wheelchair": { + "mappings": { + "0": { + "then": "Completamente accessibile in sedia a rotelle" + }, + "1": { + "then": "Accesso limitato in sedia a rotelle" + }, + "2": { + "then": "Non accessibile in sedia a rotelle" + } + }, + "question": "Il campetto è accessibile a persone in sedia a rotelle?" + }, + "playground-access": { + "mappings": { + "0": { + "then": "Accessibile pubblicamente" + }, + "1": { + "then": "Accessibile pubblicamente" + }, + "2": { + "then": "Accessibile solamente ai clienti dell’attività che lo gestisce" + }, + "3": { + "then": "Accessibile solamente agli studenti della scuola" + }, + "4": { + "then": "Non accessibile" + } + }, + "question": "Questo parco giochi è pubblicamente accessibile?" + }, + "playground-email": { + "question": "Qual è l’indirizzo email del gestore di questo parco giochi?", + "render": "{email}" + }, + "playground-lit": { + "mappings": { + "0": { + "then": "Questo parco giochi è illuminato di notte" + }, + "1": { + "then": "Questo parco giochi non è illuminato di notte" + } + }, + "question": "È illuminato di notte questo parco giochi?" + }, + "playground-max_age": { + "question": "Qual è l’età massima per accedere a questo parco giochi?", + "render": "Accessibile ai bambini di età inferiore a {max_age}" + }, + "playground-min_age": { + "question": "Qual è l’età minima per accedere a questo parco giochi?", + "render": "Accessibile ai bambini di almeno {min_age} anni" + }, + "playground-opening_hours": { + "mappings": { + "0": { + "then": "Si può accedere dall'alba al tramonto" + }, + "1": { + "then": "Si può sempre accedere" + }, + "2": { + "then": "Si può sempre accedere" + } + }, + "question": "Quando si può accedere a questo campetto?" + }, + "playground-operator": { + "question": "Chi è il responsabile di questo parco giochi?", + "render": "Gestito da {operator}" + }, + "playground-phone": { + "question": "Qual è il numero di telefono del gestore del campetto?", + "render": "{phone}" + }, + "playground-surface": { + "mappings": { + "0": { + "then": "La superficie è prato" + }, + "1": { + "then": "La superficie è sabbia" + }, + "2": { + "then": "La superficie consiste di trucioli di legno" + }, + "3": { + "then": "La superficie è mattonelle regolari" + }, + "4": { + "then": "La superficie è asfalto" + }, + "5": { + "then": "La superficie è cemento" + }, + "6": { + "then": "La superficie è non pavimentato" + }, + "7": { + "then": "La superficie è pavimentato" + } + }, + "question": "Qual è la superficie di questo parco giochi?
    Se ve ne è più di una, seleziona quella predominante", + "render": "La superficie è {surface}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Parco giochi {name}" + } + }, + "render": "Parco giochi" + } + }, + "public_bookcase": { + "description": "Una vetrinetta ai bordi della strada contenente libri, aperta al pubblico", + "name": "Microbiblioteche", + "presets": { + "0": { + "title": "Microbiblioteca" + } + }, + "tagRenderings": { + "bookcase-booktypes": { + "mappings": { + "0": { + "then": "Principalmente libri per l'infanzia" + }, + "1": { + "then": "Principalmente libri per persone in età adulta" + }, + "2": { + "then": "Sia libri per l'infanzia, sia per l'età adulta" + } + }, + "question": "Che tipo di libri si possono trovare in questa microbiblioteca?" + }, + "bookcase-is-accessible": { + "mappings": { + "0": { + "then": "È ad accesso libero" + }, + "1": { + "then": "L'accesso è riservato ai clienti" + } + }, + "question": "Questa microbiblioteca è ad accesso libero?" + }, + "bookcase-is-indoors": { + "mappings": { + "0": { + "then": "Questa microbiblioteca si trova al chiuso" + }, + "1": { + "then": "Questa microbiblioteca si trova all'aperto" + }, + "2": { + "then": "Questa microbiblioteca si trova all'aperto" + } + }, + "question": "Questa microbiblioteca si trova all'aperto?" + }, + "public_bookcase-brand": { + "mappings": { + "0": { + "then": "Fa parte della rete 'Little Free Library'" + }, + "1": { + "then": "Questa microbiblioteca non fa parte di una rete" + } + }, + "question": "Questa microbiblioteca fa parte di una rete?", + "render": "Questa microbiblioteca fa parte di {brand}" + }, + "public_bookcase-capacity": { + "question": "Quanti libri può contenere questa microbiblioteca?", + "render": "Questa microbiblioteca può contenere fino a {capacity} libri" + }, + "public_bookcase-name": { + "mappings": { + "0": { + "then": "Questa microbiblioteca non ha un nome proprio" + } + }, + "question": "Come si chiama questa microbiblioteca pubblica?", + "render": "Questa microbiblioteca si chiama {name}" + }, + "public_bookcase-operator": { + "question": "Chi mantiene questa microbiblioteca?", + "render": "È gestita da {operator}" + }, + "public_bookcase-ref": { + "mappings": { + "0": { + "then": "Questa microbiblioteca non fa parte di una rete" + } + }, + "question": "Qual è il numero identificativo di questa microbiblioteca?", + "render": "Il numero identificativo di questa microbiblioteca nella rete {brand} è {ref}" + }, + "public_bookcase-start_date": { + "question": "Quando è stata inaugurata questa microbiblioteca?", + "render": "È stata inaugurata il {start_date}" + }, + "public_bookcase-website": { + "question": "C'è un sito web con maggiori informazioni su questa microbiblioteca?", + "render": "Maggiori informazioni sul sito web" + } + }, + "title": { + "mappings": { + "0": { + "then": "Microbiblioteca pubblica {name}" + } + }, + "render": "Microbiblioteca" + } + }, + "shops": { + "tagRenderings": { + "shops-shop": { + "mappings": { + "5": { + "then": "Autofficina" + } + } + } + } + }, + "slow_roads": { + "tagRenderings": { + "slow_roads-surface": { + "mappings": { + "0": { + "then": "La superficie è erba" + }, + "1": { + "then": "La superficie è terreno" + }, + "2": { + "then": "La superficie è non pavimentata" + }, + "3": { + "then": "La superficie è sabbia" + }, + "4": { + "then": "La superficie è pietre irregolari" + }, + "5": { + "then": "La superficie è asfalto" + }, + "6": { + "then": "La superficie è calcestruzzo" + }, + "7": { + "then": "La superficie è pavimentata" + } + }, + "render": "La superficie è {surface}" + } + } + }, + "sport_pitch": { + "description": "Un campo sportivo", + "name": "Campi sportivi", + "presets": { + "0": { + "title": "Tavolo da tennistavolo" + }, + "1": { + "title": "Campo sportivo" + } + }, + "tagRenderings": { + "sport-pitch-access": { + "mappings": { + "0": { + "then": "Aperto al pubblico" + }, + "1": { + "then": "Accesso limitato (p.es. solo con prenotazione, in certi orari, ...)" + }, + "2": { + "then": "Accesso limitato ai membri dell'associazione" + }, + "3": { + "then": "Privato - non aperto al pubblico" + } + }, + "question": "Questo campo sportivo è aperto al pubblico?" + }, + "sport-pitch-reservation": { + "mappings": { + "0": { + "then": "La prenotazione è obbligatoria per usare questo campo sportivo" + }, + "1": { + "then": "La prenotazione è consigliata per usare questo campo sportivo" + }, + "2": { + "then": "La prenotazione è consentita, ma non è obbligatoria per usare questo campo sportivo" + }, + "3": { + "then": "Non è possibile prenotare" + } + }, + "question": "È necessario prenotarsi per usare questo campo sportivo?" + }, + "sport_pitch-email": { + "question": "Qual è l'indirizzo email del gestore?" + }, + "sport_pitch-opening_hours": { + "mappings": { + "1": { + "then": "Sempre aperto" + } + }, + "question": "Quando è aperto questo campo sportivo?" + }, + "sport_pitch-phone": { + "question": "Qual è il numero di telefono del gestore?" + }, + "sport_pitch-sport": { + "mappings": { + "0": { + "then": "Qui si gioca a basket" + }, + "1": { + "then": "Qui si gioca a calcio" + }, + "2": { + "then": "Questo è un tavolo da ping pong" + }, + "3": { + "then": "Qui si gioca a tennis" + }, + "4": { + "then": "Qui si gioca a korfball" + }, + "5": { + "then": "Qui si gioca a basket" + } + }, + "question": "Quale sport si gioca qui?", + "render": "Qui si gioca a {sport}" + }, + "sport_pitch-surface": { + "mappings": { + "0": { + "then": "La superficie è erba" + }, + "1": { + "then": "La superficie è sabbia" + }, + "2": { + "then": "La superficie è pietre irregolari" + }, + "3": { + "then": "La superficie è asfalto" + }, + "4": { + "then": "La superficie è calcestruzzo" + } + }, + "question": "Qual è la superficie di questo campo sportivo?", + "render": "La superficie è {surface}" + } + }, + "title": { + "render": "Campo sportivo" + } + }, + "surveillance_camera": { + "name": "Videocamere di sorveglianza", + "tagRenderings": { + "Camera type: fixed; panning; dome": { + "mappings": { + "0": { + "then": "Una videocamera fissa (non semovente)" + }, + "1": { + "then": "Una videocamera a cupola (che può ruotare)" + }, + "2": { + "then": "Una videocamera panoramica" + } + }, + "question": "Di che tipo di videocamera si tratta?" + }, + "Level": { + "question": "A che piano si trova questa videocamera?", + "render": "Si trova al piano {level}" + }, + "Operator": { + "question": "Chi gestisce questa videocamera a circuito chiuso?", + "render": "È gestita da {operator}" + }, + "Surveillance type: public, outdoor, indoor": { + "mappings": { + "0": { + "then": "Sorveglia un'area pubblica, come una strada, un ponte, una piazza, un parco, una stazione, un passaggio o un sottopasso pubblico, ..." + }, + "1": { + "then": "Sorveglia un'area esterna di proprietà privata (un parcheggio, una stazione di servizio, un cortile, un ingresso, un vialetto privato, ...)" + }, + "2": { + "then": "Sorveglia un ambiente interno di proprietà privata, per esempio un negozio, un parcheggio sotterraneo privato, ..." + } + }, + "question": "Che cosa sorveglia questa videocamera" + }, + "Surveillance:zone": { + "mappings": { + "0": { + "then": "Sorveglia un parcheggio" + }, + "1": { + "then": "Sorveglia il traffico" + }, + "2": { + "then": "Sorveglia un ingresso" + }, + "3": { + "then": "Sorveglia un corridoio" + }, + "4": { + "then": "Sorveglia una pensilina del trasporto pubblico" + }, + "5": { + "then": "Sorveglia un negozio" + } + }, + "question": "Che cosa è sorvegliato qui?", + "render": " Sorveglia una {surveillance:zone}" + }, + "camera:mount": { + "mappings": { + "0": { + "then": "Questa telecamera è posizionata contro un muro" + }, + "1": { + "then": "Questa telecamera è posizionata su un palo" + }, + "2": { + "then": "Questa telecamera è posizionata sul soffitto" + } + }, + "question": "Com'è posizionata questa telecamera?", + "render": "Metodo di montaggio: {camera:mount}" + }, + "camera_direction": { + "mappings": { + "0": { + "then": "Punta in direzione {direction}" + } + }, + "question": "In quale direzione geografica punta questa videocamera?", + "render": "Punta in direzione {camera:direction}" + }, + "is_indoor": { + "mappings": { + "0": { + "then": "Questa videocamera si trova al chiuso" + }, + "1": { + "then": "Questa videocamera si trova all'aperto" + }, + "2": { + "then": "Questa videocamera si trova probabilmente all'esterno" + } + }, + "question": "Lo spazio pubblico sorvegliato da questa videocamera è all'aperto o al chiuso?" + } + }, + "title": { + "render": "Videocamera di sorveglianza" + } + }, + "toilet": { + "name": "Servizi igienici", + "presets": { + "0": { + "description": "Servizi igienici aperti al pubblico", + "title": "servizi igienici" + }, + "1": { + "description": "Servizi igienici che hanno almeno una toilette accessibile a persone in sedia a rotelle", + "title": "servizi igienici accessibili per persone in sedia a rotelle" + } + }, + "tagRenderings": { + "toilet-access": { + "mappings": { + "0": { + "then": "Accesso pubblico" + }, + "1": { + "then": "Accesso riservato ai clienti e alle clienti" + }, + "2": { + "then": "Non accessibile" + }, + "3": { + "then": "Accessibile, ma occorre chiedere una chiave per accedere" + }, + "4": { + "then": "Accesso pubblico" + } + }, + "question": "Questi servizi igienici sono aperti al pubblico?", + "render": "L'accesso è {access}" + }, + "toilet-changing_table:location": { + "mappings": { + "0": { + "then": "Il fasciatoio è nei servizi igienici femminili. " + }, + "1": { + "then": "Il fasciatoio è nei servizi igienici maschili. " + }, + "2": { + "then": "Il fasciatoio è nei servizi igienici per persone in sedia a rotelle. " + }, + "3": { + "then": "Il fasciatoio è in una stanza dedicata. " + } + }, + "question": "Dove si trova il fasciatoio?", + "render": "Il fasciatoio si trova presso {changing_table:location}" + }, + "toilet-charge": { + "question": "Quanto costa l'accesso a questi servizi igienici?", + "render": "La tariffa è {charge}" + }, + "toilets-changing-table": { + "mappings": { + "0": { + "then": "È disponibile un fasciatoio" + }, + "1": { + "then": "Non è disponibile un fasciatoio" + } + }, + "question": "È disponibile un fasciatoio (per cambiare i pannolini)?" + }, + "toilets-fee": { + "mappings": { + "0": { + "then": "Questi servizi igienici sono a pagamento" + }, + "1": { + "then": "Gratis" + } + }, + "question": "Questi servizi igienici sono gratuiti?" + }, + "toilets-type": { + "mappings": { + "0": { + "then": "Ci sono solo WC con sedile" + }, + "1": { + "then": "Ci sono solo urinali" + }, + "2": { + "then": "Ci sono solo turche" + }, + "3": { + "then": "Ci sono sia sedili, sia urinali" + } + }, + "question": "Di che tipo di servizi igienici si tratta?" + }, + "toilets-wheelchair": { + "mappings": { + "0": { + "then": "C'è un WC riservato alle persone in sedia a rotelle" + }, + "1": { + "then": "Non accessibile in sedia a rotelle" + } + }, + "question": "C'è un WC riservato alle persone in sedia a rotelle" + } + }, + "title": { + "render": "Servizi igienici" + } + }, + "tree_node": { + "name": "Albero", + "presets": { + "0": { + "description": "Un albero di una specie con foglie larghe come la quercia o il pioppo.", + "title": "Albero latifoglia" + }, + "1": { + "description": "Un albero di una specie con aghi come il pino o l’abete.", + "title": "Albero aghifoglia" + }, + "2": { + "description": "Qualora non si sia sicuri se si tratta di un albero latifoglia o aghifoglia.", + "title": "Albero" + } + }, + "tagRenderings": { + "tree-decidouous": { + "mappings": { + "0": { + "then": "Caduco: l’albero perde le sue foglie per un periodo dell’anno." + }, + "1": { + "then": "Sempreverde." + } + }, + "question": "È un sempreverde o caduco?" + }, + "tree-denotation": { + "mappings": { + "0": { + "then": "È un albero notevole per le sue dimensioni o per la posizione prominente. È utile alla navigazione." + }, + "1": { + "then": "L’albero è un monumento naturale, ad esempio perché specialmente antico o appartenente a specie importanti." + }, + "2": { + "then": "L’albero è usato per scopi agricoli, ad esempio in un frutteto." + }, + "3": { + "then": "L’albero è in un parco o qualcosa di simile (cimitero, aree didattiche, etc.)." + }, + "4": { + "then": "L’albero è un giardino residenziale." + }, + "5": { + "then": "Fa parte di un viale alberato." + }, + "6": { + "then": "L’albero si trova in un’area urbana." + }, + "7": { + "then": "L’albero si trova fuori dall’area urbana." + } + }, + "question": "Quanto significativo è questo albero? Scegli la prima risposta che corrisponde." + }, + "tree-height": { + "mappings": { + "0": { + "then": "Altezza: {height} m" + } + }, + "render": "Altezza: {height}" + }, + "tree-heritage": { + "mappings": { + "0": { + "then": "\"\"/Registrato come patrimonio da Onroerend Erfgoed Flanders" + }, + "1": { + "then": "Registrato come patrimonio da Direction du Patrimoine culturel di Bruxelles" + }, + "2": { + "then": "Registrato come patrimonio da un’organizzazione differente" + }, + "3": { + "then": "Non è registrato come patrimonio" + }, + "4": { + "then": "Registrato come patrimonio da un’organizzazione differente" + } + }, + "question": "Quest’albero è registrato come patrimonio?" + }, + "tree-leaf_type": { + "mappings": { + "0": { + "then": "\"\"/ Latifoglia" + }, + "1": { + "then": "\"\"/ Aghifoglia" + }, + "2": { + "then": "\"\"/ Privo di foglie (permanente)" + } + }, + "question": "Si tratta di un albero latifoglia o aghifoglia?" + }, + "tree_node-name": { + "mappings": { + "0": { + "then": "L’albero non ha un nome." + } + }, + "question": "L’albero ha un nome?", + "render": "Nome: {name}" + }, + "tree_node-ref:OnroerendErfgoed": { + "question": "Qual è l’ID rilasciato da Onroerend Erfgoed Flanders?", + "render": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}" + }, + "tree_node-wikidata": { + "question": "Qual è l’ID Wikidata per questo albero?", + "render": "\"\"/ Wikidata: {wikidata}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Albero" + } + }, + "viewpoint": { + "description": "Un punto panoramico che offre una bella vista. L'ideale è aggiungere un'immagine, se nessun'altra categoria è appropriata", + "name": "Punto panoramico", + "presets": { + "0": { + "title": "Punto panoramico" + } + }, + "tagRenderings": { + "viewpoint-description": { + "question": "Vuoi aggiungere una descrizione?" + } + }, + "title": { + "render": "Punto panoramico" + } + } } \ No newline at end of file diff --git a/langs/layers/ja.json b/langs/layers/ja.json index 7a35bef11b..5e70da46e0 100644 --- a/langs/layers/ja.json +++ b/langs/layers/ja.json @@ -1,168 +1,168 @@ { - "artwork": { - "description": "多様な作品", - "name": "美術品", - "presets": { - "0": { - "title": "アートワーク" - } - }, - "tagRenderings": { - "artwork-artist_name": { - "question": "どのアーティストが作ったんですか?", - "render": "作成者:{artist_name}" - }, - "artwork-artwork_type": { - "mappings": { - "0": { - "then": "建物" - }, - "1": { - "then": "壁画" - }, - "2": { - "then": "絵画" - }, - "3": { - "then": "彫刻" - }, - "4": { - "then": "彫像" - }, - "5": { - "then": "胸像" - }, - "6": { - "then": "石" - }, - "7": { - "then": "インスタレーション" - }, - "8": { - "then": "落書き" - }, - "9": { - "then": "レリーフ" - }, - "10": { - "then": "Azulejo (スペインの装飾タイル)" - }, - "11": { - "then": "タイルワーク" - } - }, - "question": "この作品の種類は何ですか?", - "render": "これは{artwork_type}です" - }, - "artwork-website": { - "question": "この作品についての詳しい情報はどのウェブサイトにありますか?", - "render": "Webサイトに詳細情報がある" - }, - "artwork-wikidata": { - "question": "このアートワークに関するWikidataのエントリーはどれですか?", - "render": "{wikidata}に関連する" - } - }, - "title": { - "mappings": { - "0": { - "then": "アートワーク {name}" - } - }, - "render": "アートワーク" - } + "artwork": { + "description": "多様な作品", + "name": "美術品", + "presets": { + "0": { + "title": "アートワーク" + } }, - "food": { - "tagRenderings": { - "friture-take-your-container": { - "mappings": { - "0": { - "then": "自分の容器を持ってきて、注文を受け取ることができ、使い捨ての梱包材を節約して、無駄を省くことができます" - }, - "1": { - "then": "独自の容器を持参することはできません" - }, - "2": { - "then": "自身の容器が注文に必要。" - } - }, - "question": "お客様が持参容器(調理用の鍋や小さな鍋など)をもってきた場合は、注文の梱包に使用されますか?
    " - } - } - }, - "ghost_bike": { - "name": "ゴーストバイク", - "title": { - "render": "ゴーストバイク" - } - }, - "shops": { - "description": "ショップ", - "name": "店", - "presets": { - "0": { - "description": "新しい店を追加する", - "title": "店" - } + "tagRenderings": { + "artwork-artist_name": { + "question": "どのアーティストが作ったんですか?", + "render": "作成者:{artist_name}" + }, + "artwork-artwork_type": { + "mappings": { + "0": { + "then": "建物" + }, + "1": { + "then": "壁画" + }, + "2": { + "then": "絵画" + }, + "3": { + "then": "彫刻" + }, + "4": { + "then": "彫像" + }, + "5": { + "then": "胸像" + }, + "6": { + "then": "石" + }, + "7": { + "then": "インスタレーション" + }, + "8": { + "then": "落書き" + }, + "9": { + "then": "レリーフ" + }, + "10": { + "then": "Azulejo (スペインの装飾タイル)" + }, + "11": { + "then": "タイルワーク" + } }, - "tagRenderings": { - "shops-email": { - "question": "このお店のメールアドレスは何ですか?", - "render": "{email}" - }, - "shops-name": { - "question": "このお店の名前は何ですか?" - }, - "shops-opening_hours": { - "question": "この店の営業時間は何時から何時までですか?", - "render": "{opening_hours_table(opening_hours)}" - }, - "shops-phone": { - "question": "電話番号は何番ですか?", - "render": "{phone}" - }, - "shops-shop": { - "mappings": { - "0": { - "then": "コンビニエンスストア" - }, - "1": { - "then": "スーパーマーケット" - }, - "2": { - "then": "衣料品店" - }, - "3": { - "then": "理容師" - }, - "4": { - "then": "ベーカリー" - }, - "5": { - "then": "自動車修理(ガレージ)" - }, - "6": { - "then": "自動車ディーラー" - } - }, - "question": "このお店では何を売っていますか?", - "render": "こちらのお店では{shop}を販売しております" - }, - "shops-website": { - "question": "このお店のホームページは何ですか?", - "render": "{website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - }, - "1": { - "then": "{shop}" - } - }, - "render": "店" + "question": "この作品の種類は何ですか?", + "render": "これは{artwork_type}です" + }, + "artwork-website": { + "question": "この作品についての詳しい情報はどのウェブサイトにありますか?", + "render": "Webサイトに詳細情報がある" + }, + "artwork-wikidata": { + "question": "このアートワークに関するWikidataのエントリーはどれですか?", + "render": "{wikidata}に関連する" + } + }, + "title": { + "mappings": { + "0": { + "then": "アートワーク {name}" } + }, + "render": "アートワーク" } + }, + "food": { + "tagRenderings": { + "friture-take-your-container": { + "mappings": { + "0": { + "then": "自分の容器を持ってきて、注文を受け取ることができ、使い捨ての梱包材を節約して、無駄を省くことができます" + }, + "1": { + "then": "独自の容器を持参することはできません" + }, + "2": { + "then": "自身の容器が注文に必要。" + } + }, + "question": "お客様が持参容器(調理用の鍋や小さな鍋など)をもってきた場合は、注文の梱包に使用されますか?
    " + } + } + }, + "ghost_bike": { + "name": "ゴーストバイク", + "title": { + "render": "ゴーストバイク" + } + }, + "shops": { + "description": "ショップ", + "name": "店", + "presets": { + "0": { + "description": "新しい店を追加する", + "title": "店" + } + }, + "tagRenderings": { + "shops-email": { + "question": "このお店のメールアドレスは何ですか?", + "render": "{email}" + }, + "shops-name": { + "question": "このお店の名前は何ですか?" + }, + "shops-opening_hours": { + "question": "この店の営業時間は何時から何時までですか?", + "render": "{opening_hours_table(opening_hours)}" + }, + "shops-phone": { + "question": "電話番号は何番ですか?", + "render": "{phone}" + }, + "shops-shop": { + "mappings": { + "0": { + "then": "コンビニエンスストア" + }, + "1": { + "then": "スーパーマーケット" + }, + "2": { + "then": "衣料品店" + }, + "3": { + "then": "理容師" + }, + "4": { + "then": "ベーカリー" + }, + "5": { + "then": "自動車修理(ガレージ)" + }, + "6": { + "then": "自動車ディーラー" + } + }, + "question": "このお店では何を売っていますか?", + "render": "こちらのお店では{shop}を販売しております" + }, + "shops-website": { + "question": "このお店のホームページは何ですか?", + "render": "{website}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "{shop}" + } + }, + "render": "店" + } + } } \ No newline at end of file diff --git a/langs/layers/nb_NO.json b/langs/layers/nb_NO.json index b2cfbfb420..d9d7e41239 100644 --- a/langs/layers/nb_NO.json +++ b/langs/layers/nb_NO.json @@ -1,195 +1,194 @@ { - "artwork": { - "name": "Kunstverk", - "presets": { - "0": { - "title": "Kunstverk" - } + "artwork": { + "name": "Kunstverk", + "presets": { + "0": { + "title": "Kunstverk" + } + }, + "tagRenderings": { + "artwork-artist_name": { + "question": "Hvilken artist lagde dette?", + "render": "Laget av {artist_name}" + }, + "artwork-artwork_type": { + "mappings": { + "0": { + "then": "Arkitektur" + }, + "1": { + "then": "Veggmaleri" + }, + "2": { + "then": "Maleri" + }, + "3": { + "then": "Skulptur" + }, + "4": { + "then": "Statue" + }, + "5": { + "then": "Byste" + }, + "6": { + "then": "Stein" + }, + "7": { + "then": "Installasjon" + }, + "8": { + "then": "Graffiti" + }, + "9": { + "then": "Relieff" + }, + "10": { + "then": "Azulejo (Spansk dekorativt flisverk)" + }, + "11": { + "then": "Flisarbeid" + } }, - "tagRenderings": { - "artwork-artist_name": { - "question": "Hvilken artist lagde dette?", - "render": "Laget av {artist_name}" - }, - "artwork-artwork_type": { - "mappings": { - "0": { - "then": "Arkitektur" - }, - "1": { - "then": "Veggmaleri" - }, - "2": { - "then": "Maleri" - }, - "3": { - "then": "Skulptur" - }, - "4": { - "then": "Statue" - }, - "5": { - "then": "Byste" - }, - "6": { - "then": "Stein" - }, - "7": { - "then": "Installasjon" - }, - "8": { - "then": "Graffiti" - }, - "9": { - "then": "Relieff" - }, - "10": { - "then": "Azulejo (Spansk dekorativt flisverk)" - }, - "11": { - "then": "Flisarbeid" - } - }, - "question": "Hvilken type kunstverk er dette?", - "render": "Dette er et kunstverk av typen {artwork_type}" - }, - "artwork-website": { - "question": "Finnes det en nettside med mer info om dette kunstverket?", - "render": "Mer info er å finne på denne nettsiden" - }, - "artwork-wikidata": { - "question": "Hvilken Wikipedia-oppføring samsvarer med dette kunstverket?", - "render": "Samsvarer med {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Kunstverk {name}" - } - }, - "render": "Kunstverk" - } + "question": "Hvilken type kunstverk er dette?", + "render": "Dette er et kunstverk av typen {artwork_type}" + }, + "artwork-website": { + "question": "Finnes det en nettside med mer info om dette kunstverket?", + "render": "Mer info er å finne på denne nettsiden" + }, + "artwork-wikidata": { + "question": "Hvilken Wikipedia-oppføring samsvarer med dette kunstverket?", + "render": "Samsvarer med {wikidata}" + } }, - "bench": { - "name": "Benker", - "presets": { - "0": { - "title": "benk" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Rygglene: Ja" - }, - "1": { - "then": "Rygglene: Nei" - } - }, - "question": "Har denne beken et rygglene?", - "render": "Rygglene" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "Farge: brun" - }, - "1": { - "then": "Farge: grønn" - }, - "2": { - "then": "Farge: grå" - }, - "3": { - "then": "Farge: hvit" - }, - "4": { - "then": "Farge: rød" - }, - "5": { - "then": "Farge: svart" - }, - "6": { - "then": "Farge: blå" - }, - "7": { - "then": "Farge: gul" - } - }, - "render": "Farge: {colour}" - }, - "bench-material": { - "mappings": { - "0": { - "then": "Materiale: tre" - }, - "1": { - "then": "Materiale: metall" - }, - "2": { - "then": "Materiale: stein" - }, - "3": { - "then": "Materiale: betong" - }, - "4": { - "then": "Materiale: plastikk" - }, - "5": { - "then": "Materiale: stål" - } - }, - "render": "Materiale: {material}" - }, - "bench-seats": { - "question": "Hvor mange sitteplasser har denne benken?", - "render": "{seats} seter" - } - }, - "title": { - "render": "Benk" - } - }, - "bench_at_pt": { - "name": "Benker", - "title": { - "render": "Benk" - } - }, - "bicycle_library": { - "tagRenderings": { - "bicycle_library-charge": { - "mappings": { - "0": { - "then": "Det er gratis å leie en sykkel" - } - }, - "question": "Hvor mye koster det å leie en sykkel?", - "render": "Sykkelleie koster {charge}" - }, - "bicycle_library-name": { - "question": "Hva heter dette sykkelbiblioteket?", - "render": "Dette sykkelbiblioteket heter {name}" - } - } - }, - "ghost_bike": { - "name": "Spøkelsessykler", - "title": { - "render": "Spøkelsessykler" - } - }, - "shops": { - "tagRenderings": { - "shops-shop": { - "mappings": { - "5": { - "then": "Bilverksted" - } - } - } + "title": { + "mappings": { + "0": { + "then": "Kunstverk {name}" } + }, + "render": "Kunstverk" } + }, + "bench": { + "name": "Benker", + "presets": { + "0": { + "title": "benk" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Rygglene: Ja" + }, + "1": { + "then": "Rygglene: Nei" + } + }, + "question": "Har denne beken et rygglene?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "Farge: brun" + }, + "1": { + "then": "Farge: grønn" + }, + "2": { + "then": "Farge: grå" + }, + "3": { + "then": "Farge: hvit" + }, + "4": { + "then": "Farge: rød" + }, + "5": { + "then": "Farge: svart" + }, + "6": { + "then": "Farge: blå" + }, + "7": { + "then": "Farge: gul" + } + }, + "render": "Farge: {colour}" + }, + "bench-material": { + "mappings": { + "0": { + "then": "Materiale: tre" + }, + "1": { + "then": "Materiale: metall" + }, + "2": { + "then": "Materiale: stein" + }, + "3": { + "then": "Materiale: betong" + }, + "4": { + "then": "Materiale: plastikk" + }, + "5": { + "then": "Materiale: stål" + } + }, + "render": "Materiale: {material}" + }, + "bench-seats": { + "question": "Hvor mange sitteplasser har denne benken?", + "render": "{seats} seter" + } + }, + "title": { + "render": "Benk" + } + }, + "bench_at_pt": { + "name": "Benker", + "title": { + "render": "Benk" + } + }, + "bicycle_library": { + "tagRenderings": { + "bicycle_library-charge": { + "mappings": { + "0": { + "then": "Det er gratis å leie en sykkel" + } + }, + "question": "Hvor mye koster det å leie en sykkel?", + "render": "Sykkelleie koster {charge}" + }, + "bicycle_library-name": { + "question": "Hva heter dette sykkelbiblioteket?", + "render": "Dette sykkelbiblioteket heter {name}" + } + } + }, + "ghost_bike": { + "name": "Spøkelsessykler", + "title": { + "render": "Spøkelsessykler" + } + }, + "shops": { + "tagRenderings": { + "shops-shop": { + "mappings": { + "5": { + "then": "Bilverksted" + } + } + } + } + } } \ No newline at end of file diff --git a/langs/layers/nl.json b/langs/layers/nl.json index fe237824a8..14f425ddf4 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -1,3919 +1,4581 @@ { - "artwork": { - "description": "Verschillende soorten kunstwerken", - "name": "Kunstwerken", - "presets": { - "0": { - "title": "Kunstwerk" - } - }, - "tagRenderings": { - "artwork-artist_name": { - "question": "Welke kunstenaar creëerde dit kunstwerk?", - "render": "Gecreëerd door {artist_name}" - }, - "artwork-artwork_type": { - "mappings": { - "0": { - "then": "Architectuur" - }, - "1": { - "then": "Muurschildering" - }, - "2": { - "then": "Schilderij" - }, - "3": { - "then": "Beeldhouwwerk" - }, - "4": { - "then": "Standbeeld" - }, - "5": { - "then": "Buste" - }, - "6": { - "then": "Steen" - }, - "7": { - "then": "Installatie" - }, - "8": { - "then": "Graffiti" - }, - "9": { - "then": "Reliëf" - }, - "10": { - "then": "Azulejo (Spaanse siertegels)" - }, - "11": { - "then": "Tegelwerk" - } - }, - "question": "Wat voor soort kunstwerk is dit?", - "render": "Dit is een {artwork_type}" - }, - "artwork-website": { - "question": "Is er een website met meer informatie over dit kunstwerk?", - "render": "Meer informatie op deze website" - }, - "artwork-wikidata": { - "question": "Welk Wikidata-item beschrijft dit kunstwerk?", - "render": "Komt overeen met {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Kunstwerk {name}" - } - }, - "render": "Kunstwerk" - } + "artwork": { + "description": "Verschillende soorten kunstwerken", + "name": "Kunstwerken", + "presets": { + "0": { + "title": "Kunstwerk" + } }, - "barrier": { - "description": "Hindernissen tijdens het fietsen, zoals paaltjes en fietshekjes", - "name": "Barrières", - "presets": { - "0": { - "description": "Een paaltje in de weg", - "title": "Paaltje" - }, - "1": { - "description": "Fietshekjes, voor het afremmen van fietsers", - "title": "Fietshekjes" - } + "tagRenderings": { + "artwork-artist_name": { + "question": "Welke kunstenaar creëerde dit kunstwerk?", + "render": "Gecreëerd door {artist_name}" + }, + "artwork-artwork_type": { + "mappings": { + "0": { + "then": "Architectuur" + }, + "1": { + "then": "Muurschildering" + }, + "2": { + "then": "Schilderij" + }, + "3": { + "then": "Beeldhouwwerk" + }, + "4": { + "then": "Standbeeld" + }, + "5": { + "then": "Buste" + }, + "6": { + "then": "Steen" + }, + "7": { + "then": "Installatie" + }, + "8": { + "then": "Graffiti" + }, + "9": { + "then": "Reliëf" + }, + "10": { + "then": "Azulejo (Spaanse siertegels)" + }, + "11": { + "then": "Tegelwerk" + } }, - "tagRenderings": { - "Bollard type": { - "mappings": { - "0": { - "then": "Verwijderbare paal" - }, - "1": { - "then": "Vaste paal" - }, - "2": { - "then": "Paal die platgevouwen kan worden" - }, - "3": { - "then": "Flexibele paal, meestal plastic" - }, - "4": { - "then": "Verzonken poller" - } - }, - "question": "Wat voor soort paal is dit?" - }, - "Cycle barrier type": { - "mappings": { - "0": { - "then": "Enkelvoudig, slechts twee hekjes met ruimte ertussen " - }, - "1": { - "then": "Dubbel, twee hekjes achter elkaar " - }, - "2": { - "then": "Drievoudig, drie hekjes achter elkaar " - }, - "3": { - "then": "Knijppoort, ruimte is smaller aan de top, dan aan de bodem " - } - }, - "question": "Wat voor fietshekjes zijn dit?" - }, - "MaxWidth": { - "question": "Hoe breed is de ruimte naast de barrière?", - "render": "Maximumbreedte: {maxwidth:physical} m" - }, - "Overlap (cyclebarrier)": { - "question": "Hoeveel overlappen de barrières?" - }, - "Space between barrier (cyclebarrier)": { - "question": "Hoeveel ruimte is er tussen de barrières (langs de lengte van de weg)?", - "render": "Ruimte tussen barrières (langs de lengte van de weg): {width:separation} m" - }, - "Width of opening (cyclebarrier)": { - "question": "Hoe breed is de smalste opening naast de barrières?", - "render": "Breedte van de opening: {width:opening} m" - }, - "bicycle=yes/no": { - "mappings": { - "0": { - "then": "Een fietser kan hier langs." - }, - "1": { - "then": "Een fietser kan hier niet langs." - } - }, - "question": "Kan een fietser langs deze barrière?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Paaltje" - }, - "1": { - "then": "Fietshekjes" - } - }, - "render": "Barrière" - } + "question": "Wat voor soort kunstwerk is dit?", + "render": "Dit is een {artwork_type}" + }, + "artwork-website": { + "question": "Is er een website met meer informatie over dit kunstwerk?", + "render": "Meer informatie op deze website" + }, + "artwork-wikidata": { + "question": "Welk Wikidata-item beschrijft dit kunstwerk?", + "render": "Komt overeen met {wikidata}" + } }, - "bench": { - "name": "Zitbanken", - "presets": { - "0": { - "title": "zitbank" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Heeft een rugleuning" - }, - "1": { - "then": "Rugleuning ontbreekt" - } - }, - "question": "Heeft deze zitbank een rugleuning?", - "render": "Rugleuning" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "De kleur is bruin" - }, - "1": { - "then": "De kleur is groen" - }, - "2": { - "then": "De kleur is grijs" - }, - "3": { - "then": "De kleur is wit" - }, - "4": { - "then": "De kleur is rood" - }, - "5": { - "then": "De kleur is zwart" - }, - "6": { - "then": "De kleur is blauw" - }, - "7": { - "then": "De kleur is geel" - } - }, - "question": "Welke kleur heeft deze zitbank?", - "render": "Kleur: {colour}" - }, - "bench-direction": { - "question": "In welke richting kijk je wanneer je op deze zitbank zit?", - "render": "Wanneer je op deze bank zit, dan kijk je in {direction}°." - }, - "bench-material": { - "mappings": { - "0": { - "then": "Gemaakt uit hout" - }, - "1": { - "then": "Gemaakt uit metaal" - }, - "2": { - "then": "Gemaakt uit steen" - }, - "3": { - "then": "Gemaakt uit beton" - }, - "4": { - "then": "Gemaakt uit plastiek" - }, - "5": { - "then": "Gemaakt uit staal" - } - }, - "question": "Uit welk materiaal is het zitgedeelte van deze zitbank gemaakt?", - "render": "Gemaakt van {material}" - }, - "bench-seats": { - "question": "Hoeveel zitplaatsen heeft deze bank?", - "render": "{seats} zitplaatsen" - }, - "bench-survey:date": { - "question": "Wanneer is deze laatste bank laatst gesurveyed?", - "render": "Deze bank is laatst gesurveyd op {survey:date}" - } - }, - "title": { - "render": "Zitbank" - } - }, - "bench_at_pt": { - "name": "Zitbanken aan bushaltes", - "tagRenderings": { - "bench_at_pt-bench": { - "render": "Leunbank" - }, - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Zitbank aan een bushalte" - }, - "1": { - "then": "Zitbank in een schuilhokje" - } - }, - "render": "Zitbank" - } - }, - "bicycle_library": { - "description": "Een plaats waar men voor langere tijd een fiets kan lenen", - "name": "Fietsbibliotheek", - "presets": { - "0": { - "description": "Een fietsbieb heeft een collectie fietsen die leden mogen lenen", - "title": "Bicycle library" - } - }, - "tagRenderings": { - "bicycle-library-target-group": { - "mappings": { - "0": { - "then": "Aanbod voor kinderen" - }, - "1": { - "then": "Aanbod voor volwassenen" - }, - "2": { - "then": "Aanbod voor personen met een handicap" - } - }, - "question": "Voor wie worden hier fietsen aangeboden?" - }, - "bicycle_library-charge": { - "mappings": { - "0": { - "then": "Een fiets huren is gratis" - }, - "1": { - "then": "Een fiets huren kost €20/jaar en €20 waarborg" - } - }, - "question": "Hoeveel kost het huren van een fiets?", - "render": "Een fiets huren kost {charge}" - }, - "bicycle_library-name": { - "question": "Wat is de naam van deze fietsbieb?", - "render": "Deze fietsbieb heet {name}" - } - }, - "title": { - "render": "Fietsbibliotheek" - } - }, - "bicycle_tube_vending_machine": { - "name": "Fietsbanden-verkoopsautomaat", - "presets": { - "0": { - "title": "Fietsbanden-verkoopsautomaat" - } - }, - "tagRenderings": { - "Still in use?": { - "mappings": { - "0": { - "then": "Deze verkoopsautomaat werkt" - }, - "1": { - "then": "Deze verkoopsautomaat is kapot" - }, - "2": { - "then": "Deze verkoopsautomaat is uitgeschakeld" - } - }, - "question": "Is deze verkoopsautomaat nog steeds werkende?", - "render": "Deze verkoopsautomaat is {operational_status}" - } - }, - "title": { - "render": "Fietsbanden-verkoopsautomaat" - } - }, - "bike_cafe": { - "name": "Fietscafé", - "presets": { - "0": { - "title": "Fietscafé" - } - }, - "tagRenderings": { - "bike_cafe-bike-pump": { - "mappings": { - "0": { - "then": "Dit fietscafé biedt een fietspomp aan voor eender wie" - }, - "1": { - "then": "Dit fietscafé biedt geen fietspomp aan voor iedereen" - } - }, - "question": "Biedt dit fietscafé een fietspomp aan voor iedereen?" - }, - "bike_cafe-email": { - "question": "Wat is het email-adres van {name}?" - }, - "bike_cafe-name": { - "question": "Wat is de naam van dit fietscafé?", - "render": "Dit fietscafé heet {name}" - }, - "bike_cafe-opening_hours": { - "question": "Wanneer is dit fietscafé geopend?" - }, - "bike_cafe-phone": { - "question": "Wat is het telefoonnummer van {name}?" - }, - "bike_cafe-repair-service": { - "mappings": { - "0": { - "then": "Dit fietscafé herstelt fietsen" - }, - "1": { - "then": "Dit fietscafé herstelt geen fietsen" - } - }, - "question": "Herstelt dit fietscafé fietsen?" - }, - "bike_cafe-repair-tools": { - "mappings": { - "0": { - "then": "Dit fietscafé biedt gereedschap aan om je fiets zelf te herstellen" - }, - "1": { - "then": "Dit fietscafé biedt geen gereedschap aan om je fiets zelf te herstellen" - } - }, - "question": "Biedt dit fietscafé gereedschap aan om je fiets zelf te herstellen?" - }, - "bike_cafe-website": { - "question": "Wat is de website van {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Fietscafé {name}" - } - }, - "render": "Fietscafé" - } - }, - "bike_cleaning": { - "name": "Fietsschoonmaakpunt", - "presets": { - "0": { - "title": "Fietsschoonmaakpunt" - } - }, - "title": { - "mappings": { - "0": { - "then": "Fietsschoonmaakpunt {name}" - } - }, - "render": "Fietsschoonmaakpunt" - } - }, - "bike_parking": { - "name": "Fietsparking", - "presets": { - "0": { - "title": "Fietsparking" - } - }, - "tagRenderings": { - "Access": { - "mappings": { - "0": { - "then": "Publiek toegankelijke fietsenstalling" - }, - "1": { - "then": "Klanten van de zaak of winkel" - }, - "2": { - "then": "Private fietsenstalling van een school, een bedrijf, ..." - } - }, - "question": "Wie mag er deze fietsenstalling gebruiken?", - "render": "{access}" - }, - "Bicycle parking type": { - "mappings": { - "0": { - "then": "Nietjes " - }, - "1": { - "then": "Wielrek/lussen " - }, - "2": { - "then": "Stuurhouder " - }, - "3": { - "then": "Rek " - }, - "4": { - "then": "Dubbel (twee verdiepingen) " - }, - "5": { - "then": "Schuur " - }, - "6": { - "then": "Paal met ring " - }, - "7": { - "then": "Een oppervlakte die gemarkeerd is om fietsen te parkeren" - } - }, - "question": "Van welk type is deze fietsparking?", - "render": "Dit is een fietsparking van het type: {bicycle_parking}" - }, - "Capacity": { - "question": "Hoeveel fietsen kunnen in deze fietsparking (inclusief potentiëel bakfietsen)?", - "render": "Plaats voor {capacity} fietsen" - }, - "Cargo bike capacity?": { - "question": "Voor hoeveel bakfietsen heeft deze fietsparking plaats?", - "render": "Deze parking heeft plaats voor {capacity:cargo_bike} fietsen" - }, - "Cargo bike spaces?": { - "mappings": { - "0": { - "then": "Deze parking heeft plaats voor bakfietsen" - }, - "1": { - "then": "Er zijn speciale plaatsen voorzien voor bakfietsen" - }, - "2": { - "then": "Je mag hier geen bakfietsen parkeren" - } - }, - "question": "Heeft deze fietsparking plaats voor bakfietsen?" - }, - "Is covered?": { - "mappings": { - "0": { - "then": "Deze parking is overdekt (er is een afdak)" - }, - "1": { - "then": "Deze parking is niet overdekt" - } - }, - "question": "Is deze parking overdekt? Selecteer ook \"overdekt\" voor fietsparkings binnen een gebouw." - }, - "Underground?": { - "mappings": { - "0": { - "then": "Ondergrondse parking" - }, - "1": { - "then": "Ondergrondse parking" - }, - "2": { - "then": "Parking op de begane grond" - }, - "3": { - "then": "Parking op de begane grond" - }, - "4": { - "then": "Dakparking" - } - }, - "question": "Wat is de relatieve locatie van deze parking??" - } - }, - "title": { - "render": "Fietsparking" - } - }, - "bike_repair_station": { - "name": "Fietspunten (herstel, pomp of allebei)", - "presets": { - "0": { - "description": "Een apparaat waar je je fietsbanden kan oppompen, beschikbaar in de publieke ruimte. De fietspomp in je kelder telt dus niet.

    Voorbeelden

    Examples of bicycle pumps

    ", - "title": "Fietspomp" - }, - "1": { - "description": "Een apparaat met zowel gereedschap om je fiets te herstellen, met een pomp. Deze zijn op een vastgemaakt op een plaats in de publieke ruimte, bv. aan een paal.

    Voorbeeld

    ", - "title": "Herstelpunt en pomp" - }, - "2": { - "title": "Herstelpunt zonder pomp" - } - }, - "tagRenderings": { - "Email maintainer": { - "render": "Rapporteer deze fietspomp als kapot" - }, - "Operational status": { - "mappings": { - "0": { - "then": "De fietspomp is kapot" - }, - "1": { - "then": "De fietspomp werkt nog" - } - }, - "question": "Werkt de fietspomp nog?" - }, - "bike_repair_station-available-services": { - "mappings": { - "0": { - "then": "Er is enkel een pomp aanwezig" - }, - "1": { - "then": "Er is enkel gereedschap aanwezig (schroevendraaier, tang...)" - }, - "2": { - "then": "Er is zowel een pomp als gereedschap aanwezig" - } - }, - "question": "Welke functies biedt dit fietspunt?" - }, - "bike_repair_station-bike-chain-tool": { - "mappings": { - "0": { - "then": "Er is een reparatieset voor je ketting" - }, - "1": { - "then": "Er is geen reparatieset voor je ketting" - } - }, - "question": "Heeft dit herstelpunt een speciale reparatieset voor je ketting?" - }, - "bike_repair_station-bike-stand": { - "mappings": { - "0": { - "then": "Er is een haak of standaard" - }, - "1": { - "then": "Er is geen haak of standaard" - } - }, - "question": "Heeft dit herstelpunt een haak of standaard om je fiets op te hangen/zetten?" - }, - "bike_repair_station-electrical_pump": { - "mappings": { - "0": { - "then": "Manuele pomp" - }, - "1": { - "then": "Electrische pomp" - } - }, - "question": "Is dit een electrische fietspomp?" - }, - "bike_repair_station-email": { - "question": "Wat is het email-adres van de beheerder?" - }, - "bike_repair_station-manometer": { - "mappings": { - "0": { - "then": "Er is een luchtdrukmeter" - }, - "1": { - "then": "Er is geen luchtdrukmeter" - }, - "2": { - "then": "Er is een luchtdrukmeter maar die is momenteel defect" - } - }, - "question": "Heeft deze pomp een luchtdrukmeter?" - }, - "bike_repair_station-opening_hours": { - "mappings": { - "0": { - "then": "Dag en nacht open" - }, - "1": { - "then": "Dag en nacht open" - } - }, - "question": "Wanneer is dit fietsherstelpunt open?" - }, - "bike_repair_station-operator": { - "question": "Wie beheert deze fietspomp?", - "render": "Beheer door {operator}" - }, - "bike_repair_station-phone": { - "question": "Wat is het telefoonnummer van de beheerder?" - }, - "bike_repair_station-valves": { - "mappings": { - "0": { - "then": "Sclaverand (ook gekend als Presta)" - }, - "1": { - "then": "Dunlop" - }, - "2": { - "then": "Schrader (auto's)" - } - }, - "question": "Welke ventielen werken er met de pomp?", - "render": "Deze pomp werkt met de volgende ventielen: {valves}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Herstelpunt" - }, - "1": { - "then": "Herstelpunt" - }, - "2": { - "then": "Kapotte fietspomp" - }, - "3": { - "then": "Fietspomp {name}" - }, - "4": { - "then": "Fietspomp" - } - }, - "render": "Herstelpunt met pomp" - } - }, - "bike_shop": { - "description": "Een winkel die hoofdzakelijk fietsen en fietstoebehoren verkoopt", - "name": "Fietszaak", - "presets": { - "0": { - "title": "Fietszaak" - } - }, - "tagRenderings": { - "bike_repair_bike-pump-service": { - "mappings": { - "0": { - "then": "Deze winkel biedt een fietspomp aan voor iedereen" - }, - "1": { - "then": "Deze winkel biedt geen fietspomp aan voor eender wie" - }, - "2": { - "then": "Er is een fietspomp, deze is apart aangeduid" - } - }, - "question": "Biedt deze winkel een fietspomp aan voor iedereen?" - }, - "bike_repair_bike-wash": { - "mappings": { - "0": { - "then": "Deze winkel biedt fietsschoonmaak aan" - }, - "1": { - "then": "Deze winkel biedt een installatie aan om zelf je fiets schoon te maken" - }, - "2": { - "then": "Deze winkel biedt geen fietsschoonmaak aan" - } - }, - "question": "Biedt deze winkel een fietsschoonmaak aan?" - }, - "bike_repair_rents-bikes": { - "mappings": { - "0": { - "then": "Deze winkel verhuurt fietsen" - }, - "1": { - "then": "Deze winkel verhuurt geen fietsen" - } - }, - "question": "Verhuurt deze winkel fietsen?" - }, - "bike_repair_repairs-bikes": { - "mappings": { - "0": { - "then": "Deze winkel herstelt fietsen" - }, - "1": { - "then": "Deze winkel herstelt geen fietsen" - }, - "2": { - "then": "Deze winkel herstelt enkel fietsen die hier werden gekocht" - }, - "3": { - "then": "Deze winkel herstelt enkel fietsen van een bepaald merk" - } - }, - "question": "Herstelt deze winkel fietsen?" - }, - "bike_repair_second-hand-bikes": { - "mappings": { - "0": { - "then": "Deze winkel verkoopt tweedehands fietsen" - }, - "1": { - "then": "Deze winkel verkoopt geen tweedehands fietsen" - }, - "2": { - "then": "Deze winkel verkoopt enkel tweedehands fietsen" - } - }, - "question": "Verkoopt deze winkel tweedehands fietsen?" - }, - "bike_repair_sells-bikes": { - "mappings": { - "0": { - "then": "Deze winkel verkoopt fietsen" - }, - "1": { - "then": "Deze winkel verkoopt geen fietsen" - } - }, - "question": "Verkoopt deze fietszaak fietsen?" - }, - "bike_repair_tools-service": { - "mappings": { - "0": { - "then": "Deze winkel biedt gereedschap aan om je fiets zelf te herstellen" - }, - "1": { - "then": "Deze winkel biedt geen gereedschap aan om je fiets zelf te herstellen" - }, - "2": { - "then": "Het gereedschap aan om je fiets zelf te herstellen is enkel voor als je de fiets er kocht of huurt" - } - }, - "question": "Biedt deze winkel gereedschap aan om je fiets zelf te herstellen?" - }, - "bike_shop-email": { - "question": "Wat is het email-adres van {name}?" - }, - "bike_shop-is-bicycle_shop": { - "render": "Deze winkel verkoopt {shop} en heeft fiets-gerelateerde activiteiten." - }, - "bike_shop-name": { - "question": "Wat is de naam van deze fietszaak?", - "render": "Deze fietszaak heet {name}" - }, - "bike_shop-phone": { - "question": "Wat is het telefoonnummer van {name}?" - }, - "bike_shop-website": { - "question": "Wat is de website van {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Sportwinkel {name}" - }, - "2": { - "then": "Fietsverhuur {name}" - }, - "3": { - "then": "Fietsenmaker {name}" - }, - "4": { - "then": "Fietswinkel {name}" - }, - "5": { - "then": "Fietszaak {name}" - } - }, - "render": "Fietszaak" - } - }, - "bike_themed_object": { - "name": "Fietsgerelateerd object", - "title": { - "mappings": { - "1": { - "then": "Wielerpiste" - } - }, - "render": "Fietsgerelateerd object" - } - }, - "binocular": { - "description": "Verrekijkers", - "name": "Verrekijkers", - "presets": { - "0": { - "description": "Een telescoop of verrekijker die op een vaste plaats gemonteerd staat waar iedereen door mag kijken. ", - "title": "verrekijker" - } - }, - "tagRenderings": { - "binocular-charge": { - "mappings": { - "0": { - "then": "Gratis te gebruiken" - } - }, - "question": "Hoeveel moet men betalen om deze verrekijker te gebruiken?", - "render": "Deze verrekijker gebruiken kost {charge}" - }, - "binocular-direction": { - "question": "Welke richting kijkt men uit als men door deze verrekijker kijkt?", - "render": "Kijkt richting {direction}°" - } - }, - "title": { - "render": "Verrekijker" - } - }, - "birdhide": { - "color": { - "render": "#94bb28" - }, - "description": "Een vogelkijkhut", - "filter": { - "0": { - "options": { - "0": { - "question": "Rolstoeltoegankelijk" - } - } - }, - "1": { - "options": { - "0": { - "question": "Enkel overdekte kijkhutten" - } - } - } - }, - "icon": { - "render": "./assets/layers/birdhide/birdhide.svg" - }, - "name": "Vogelkijkhutten", - "presets": { - "0": { - "description": "Een overdekte hut waarbinnen er warm en droog naar vogels gekeken kan worden", - "title": "vogelkijkhut" - }, - "1": { - "description": "Een vogelkijkwand waarachter men kan staan om vogels te kijken", - "title": "vogelkijkwand" - } - }, - "size": { - "render": "40,40,center" - }, - "stroke": { - "render": "3" - }, - "tagRenderings": { - "bird-hide-shelter-or-wall": { - "mappings": { - "0": { - "then": "Vogelkijkwand" - }, - "1": { - "then": "Vogelkijkhut" - }, - "2": { - "then": "Vogelkijktoren" - }, - "3": { - "then": "Vogelkijkhut" - } - }, - "question": "Is dit een kijkwand of kijkhut?" - }, - "bird-hide-wheelchair": { - "mappings": { - "0": { - "then": "Er zijn speciale voorzieningen voor rolstoelen" - }, - "1": { - "then": "Een rolstoel raakt er vlot" - }, - "2": { - "then": "Je kan er raken met een rolstoel, maar het is niet makkelijk" - }, - "3": { - "then": "Niet rolstoeltoegankelijk" - } - }, - "question": "Is deze vogelkijkplaats rolstoeltoegankelijk?" - }, - "birdhide-operator": { - "mappings": { - "0": { - "then": "Beheer door Natuurpunt" - }, - "1": { - "then": "Beheer door het Agentschap Natuur en Bos " - } - }, - "question": "Wie beheert deze vogelkijkplaats?", - "render": "Beheer door {operator}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - }, - "1": { - "then": "Vogelkijkhut {name}" - }, - "2": { - "then": "Vogelkijkwand {name}" - } - }, - "render": "Vogelkijkplaats" - } - }, - "cafe_pub": { - "filter": { - "0": { - "options": { - "0": { - "question": "Nu geopened" - } - } - } - }, - "name": "Cafés", - "presets": { - "0": { - "description": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk ", - "title": "bruin cafe of kroeg" - }, - "1": { - "description": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek", - "title": "bar" - }, - "2": { - "description": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen.", - "title": "cafe" - } - }, - "tagRenderings": { - "Classification": { - "mappings": { - "0": { - "then": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk " - }, - "1": { - "then": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek" - }, - "2": { - "then": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen." - }, - "3": { - "then": "Dit is een restaurant waar men een maaltijd geserveerd krijgt" - }, - "4": { - "then": "Een open ruimte waar bier geserveerd wordt. Typisch in Duitsland" - } - }, - "question": "Welk soort café is dit?" - }, - "Name": { - "question": "Wat is de naam van dit café?", - "render": "De naam van dit café is {name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Café" - } - }, - "charging_station": { - "description": "Oplaadpunten", - "filter": { - "0": { - "options": { - "0": { - "question": "Alle voertuigen" - }, - "1": { - "question": "Oplaadpunten voor fietsen" - }, - "2": { - "question": "Oplaadpunten voor auto's" - } - } - }, - "1": { - "options": { - "0": { - "question": "Enkel werkende oplaadpunten" - } - } - }, - "2": { - "options": { - "0": { - "question": "Alle types" - }, - "1": { - "question": "Heeft een
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    " - }, - "2": { - "question": "Heeft een
    Europese stekker met aardingspin (CEE7/4 type E)
    " - }, - "3": { - "question": "Heeft een
    Chademo
    " - }, - "4": { - "question": "Heeft een
    Type 1 met kabel (J1772)
    " - }, - "5": { - "question": "Heeft een
    Type 1 zonder kabel (J1772)
    " - }, - "6": { - "question": "Heeft een
    Type 1 CCS (ook gekend als Type 1 Combo)
    " - }, - "7": { - "question": "Heeft een
    Tesla Supercharger
    " - }, - "8": { - "question": "Heeft een
    Type 2 (mennekes)
    " - }, - "9": { - "question": "Heeft een
    Type 2 CCS (mennekes)
    " - }, - "10": { - "question": "Heeft een
    Type 2 met kabel (J1772)
    " - }, - "11": { - "question": "Heeft een
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    " - }, - "12": { - "question": "Heeft een
    Tesla Supercharger (destination)
    " - }, - "13": { - "question": "Heeft een
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    " - }, - "14": { - "question": "Heeft een
    USB om GSMs en kleine electronica op te laden
    " - }, - "15": { - "question": "Heeft een
    Bosch Active Connect met 3 pinnen aan een kabel
    " - }, - "16": { - "question": "Heeft een
    Bosch Active Connect met 5 pinnen aan een kabel
    " - } - } - } - }, - "name": "Oplaadpunten", - "presets": { - "0": { - "title": "laadpunt met gewone stekker(s) (bedoeld om electrische fietsen op te laden)" - }, - "1": { - "title": "oplaadpunt voor elektrische fietsen" - }, - "2": { - "title": "oplaadstation voor elektrische auto's" - }, - "3": { - "title": "oplaadstation" - } - }, - "tagRenderings": { - "Auth phone": { - "question": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?", - "render": "Aanmelden door te bellen of te SMS'en naar {authentication:phone_call:number}" - }, - "Authentication": { - "mappings": { - "0": { - "then": "Aanmelden met een lidkaart is mogelijk" - }, - "1": { - "then": "Aanmelden via een applicatie is mogelijk" - }, - "2": { - "then": "Aanmelden door te bellen naar een telefoonnummer is mogelijk" - }, - "3": { - "then": "Aanmelden via SMS is mogelijk" - }, - "4": { - "then": "Aanmelden via NFC is mogelijk" - }, - "5": { - "then": "Aanmelden met Money Card is mogelijk" - }, - "6": { - "then": "Aanmelden met een betaalkaart is mogelijk" - }, - "7": { - "then": "Hier opladen is (ook) mogelijk zonder aan te melden" - } - }, - "question": "Hoe kan men zich aanmelden aan dit oplaadstation?" - }, - "Available_charging_stations (generated)": { - "mappings": { - "0": { - "then": "
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    " - }, - "1": { - "then": "
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    " - }, - "2": { - "then": "
    Europese stekker met aardingspin (CEE7/4 type E)
    " - }, - "3": { - "then": "
    Europese stekker met aardingspin (CEE7/4 type E)
    " - }, - "4": { - "then": "
    Chademo
    " - }, - "5": { - "then": "
    Chademo
    " - }, - "6": { - "then": "
    Type 1 met kabel (J1772)
    " - }, - "7": { - "then": "
    Type 1 met kabel (J1772)
    " - }, - "8": { - "then": "
    Type 1 zonder kabel (J1772)
    " - }, - "9": { - "then": "
    Type 1 zonder kabel (J1772)
    " - }, - "10": { - "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    " - }, - "11": { - "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    " - }, - "12": { - "then": "
    Tesla Supercharger
    " - }, - "13": { - "then": "
    Tesla Supercharger
    " - }, - "14": { - "then": "
    Type 2 (mennekes)
    " - }, - "15": { - "then": "
    Type 2 (mennekes)
    " - }, - "16": { - "then": "
    Type 2 CCS (mennekes)
    " - }, - "17": { - "then": "
    Type 2 CCS (mennekes)
    " - }, - "18": { - "then": "
    Type 2 met kabel (J1772)
    " - }, - "19": { - "then": "
    Type 2 met kabel (J1772)
    " - }, - "20": { - "then": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    " - }, - "21": { - "then": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    " - }, - "22": { - "then": "
    Tesla Supercharger (destination)
    " - }, - "23": { - "then": "
    Tesla Supercharger (destination)
    " - }, - "24": { - "then": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    " - }, - "25": { - "then": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    " - }, - "26": { - "then": "
    USB om GSMs en kleine electronica op te laden
    " - }, - "27": { - "then": "
    USB om GSMs en kleine electronica op te laden
    " - }, - "28": { - "then": "
    Bosch Active Connect met 3 pinnen aan een kabel
    " - }, - "29": { - "then": "
    Bosch Active Connect met 3 pinnen aan een kabel
    " - }, - "30": { - "then": "
    Bosch Active Connect met 5 pinnen aan een kabel
    " - }, - "31": { - "then": "
    Bosch Active Connect met 5 pinnen aan een kabel
    " - } - }, - "question": "Welke aansluitingen zijn hier beschikbaar?" - }, - "Network": { - "mappings": { - "0": { - "then": "Maakt geen deel uit van een groter netwerk" - }, - "1": { - "then": "Maakt geen deel uit van een groter netwerk" - } - }, - "question": "Is dit oplaadpunt deel van een groter netwerk?", - "render": "Maakt deel uit van het {network}-netwerk" - }, - "OH": { - "mappings": { - "0": { - "then": "24/7 open - ook tijdens vakanties" - } - }, - "question": "Wanneer is dit oplaadpunt beschikbaar??" - }, - "Operational status": { - "mappings": { - "0": { - "then": "Dit oplaadpunt werkt" - }, - "1": { - "then": "Dit oplaadpunt is kapot" - }, - "2": { - "then": "Hier zal binnenkort een oplaadpunt gebouwd worden" - }, - "3": { - "then": "Hier wordt op dit moment een oplaadpunt gebouwd" - }, - "4": { - "then": "Dit oplaadpunt is niet meer in gebruik maar is wel nog aanwezig" - } - }, - "question": "Is dit oplaadpunt operationeel?" - }, - "Operator": { - "mappings": { - "0": { - "then": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt" - } - }, - "question": "Wie beheert dit oplaadpunt?", - "render": "Wordt beheerd door {operator}" - }, - "Parking:fee": { - "mappings": { - "0": { - "then": "Geen extra parkeerkost tijdens het opladen" - }, - "1": { - "then": "Tijdens het opladen moet er parkeergeld betaald worden" - } - }, - "question": "Moet men parkeergeld betalen tijdens het opladen?" - }, - "Type": { - "mappings": { - "0": { - "then": "Fietsen kunnen hier opgeladen worden" - }, - "1": { - "then": "Elektrische auto's kunnen hier opgeladen worden" - }, - "2": { - "then": "Electrische scooters (snorfiets of bromfiets) kunnen hier opgeladen worden" - }, - "3": { - "then": "Vrachtwagens kunnen hier opgeladen worden" - }, - "4": { - "then": "Bussen kunnen hier opgeladen worden" - } - }, - "question": "Welke voertuigen kunnen hier opgeladen worden?" - }, - "access": { - "mappings": { - "0": { - "then": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)" - }, - "1": { - "then": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)" - }, - "2": { - "then": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken
    Bv. op de parking van een hotel en enkel toegankelijk voor klanten van dit hotel" - }, - "3": { - "then": "Niet toegankelijk voor het publiek
    Bv. enkel toegankelijk voor de eigenaar, medewerkers ,... " - } - }, - "question": "Wie mag er dit oplaadpunt gebruiken?", - "render": "Toegang voor {access}" - }, - "capacity": { - "question": "Hoeveel voertuigen kunnen hier opgeladen worden?", - "render": "{capacity} voertuigen kunnen hier op hetzelfde moment opgeladen worden" - }, - "charge": { - "question": "Hoeveel moet men betalen om dit oplaadpunt te gebruiken?", - "render": "Dit oplaadpunt gebruiken kost {charge}" - }, - "email": { - "question": "Wat is het email-adres van de operator?", - "render": "Bij problemen, email naar {email}" - }, - "fee": { - "mappings": { - "0": { - "then": "Gratis te gebruiken" - }, - "1": { - "then": "Gratis te gebruiken (zonder aan te melden)" - }, - "2": { - "then": "Gratis te gebruiken, maar aanmelden met een applicatie is verplicht" - }, - "3": { - "then": "Betalend te gebruiken, maar gratis voor klanten van het bijhorende hotel/café/ziekenhuis/..." - }, - "4": { - "then": "Betalend" - } - }, - "question": "Moet men betalen om dit oplaadpunt te gebruiken?" - }, - "maxstay": { - "mappings": { - "0": { - "then": "Geen maximum parkeertijd" - } - }, - "question": "Hoelang mag een voertuig hier blijven staan?", - "render": "De maximale parkeertijd hier is {canonical(maxstay)}" - }, - "payment-options": { - "override": { - "mappings+": { - "0": { - "then": "Betalen via een app van het netwerk" - }, - "1": { - "then": "Betalen via een lidkaart van het netwerk" - } - } - } - }, - "phone": { - "question": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?", - "render": "Bij problemen, bel naar {phone}" - }, - "plugs-0": { - "question": "Hoeveel stekkers van type
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:schuko} stekkers van het type
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    " - }, - "plugs-1": { - "question": "Hoeveel stekkers van type
    Europese stekker met aardingspin (CEE7/4 type E)
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:typee} stekkers van het type
    Europese stekker met aardingspin (CEE7/4 type E)
    " - }, - "plugs-10": { - "question": "Hoeveel stekkers van type
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:tesla_supercharger_ccs} stekkers van het type
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    " - }, - "plugs-11": { - "question": "Hoeveel stekkers van type
    Tesla Supercharger (destination)
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:tesla_destination} stekkers van het type
    Tesla Supercharger (destination)
    " - }, - "plugs-12": { - "question": "Hoeveel stekkers van type
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:tesla_destination} stekkers van het type
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    " - }, - "plugs-13": { - "question": "Hoeveel stekkers van type
    USB om GSMs en kleine electronica op te laden
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:USB-A} stekkers van het type
    USB om GSMs en kleine electronica op te laden
    " - }, - "plugs-14": { - "question": "Hoeveel stekkers van type
    Bosch Active Connect met 3 pinnen aan een kabel
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:bosch_3pin} stekkers van het type
    Bosch Active Connect met 3 pinnen aan een kabel
    " - }, - "plugs-15": { - "question": "Hoeveel stekkers van type
    Bosch Active Connect met 5 pinnen aan een kabel
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:bosch_5pin} stekkers van het type
    Bosch Active Connect met 5 pinnen aan een kabel
    " - }, - "plugs-2": { - "question": "Hoeveel stekkers van type
    Chademo
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:chademo} stekkers van het type
    Chademo
    " - }, - "plugs-3": { - "question": "Hoeveel stekkers van type
    Type 1 met kabel (J1772)
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:type1_cable} stekkers van het type
    Type 1 met kabel (J1772)
    " - }, - "plugs-4": { - "question": "Hoeveel stekkers van type
    Type 1 zonder kabel (J1772)
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:type1} stekkers van het type
    Type 1 zonder kabel (J1772)
    " - }, - "plugs-5": { - "question": "Hoeveel stekkers van type
    Type 1 CCS (ook gekend als Type 1 Combo)
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:type1_combo} stekkers van het type
    Type 1 CCS (ook gekend als Type 1 Combo)
    " - }, - "plugs-6": { - "question": "Hoeveel stekkers van type
    Tesla Supercharger
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:tesla_supercharger} stekkers van het type
    Tesla Supercharger
    " - }, - "plugs-7": { - "question": "Hoeveel stekkers van type
    Type 2 (mennekes)
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:type2} stekkers van het type
    Type 2 (mennekes)
    " - }, - "plugs-8": { - "question": "Hoeveel stekkers van type
    Type 2 CCS (mennekes)
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:type2_combo} stekkers van het type
    Type 2 CCS (mennekes)
    " - }, - "plugs-9": { - "question": "Hoeveel stekkers van type
    Type 2 met kabel (J1772)
    heeft dit oplaadpunt?", - "render": "Hier zijn {socket:type2_cable} stekkers van het type
    Type 2 met kabel (J1772)
    " - }, - "ref": { - "question": "Wat is het referentienummer van dit oplaadstation?", - "render": "Het referentienummer van dit oplaadpunt is {ref}" - }, - "website": { - "question": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?", - "render": "Meer informatie op {website}" - } - }, - "title": { - "render": "Oplaadpunten" - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " minuten", - "humanSingular": " minuut" - }, - "1": { - "human": " uren", - "humanSingular": " uur" - }, - "2": { - "human": " day", - "humanSingular": " dag" - } - } - }, - "1": { - "applicableUnits": { - "0": { - "human": "volt" - } - } - }, - "2": { - "applicableUnits": { - "0": { - "human": "A" - } - } - }, - "3": { - "applicableUnits": { - "0": { - "human": "kilowatt" - }, - "1": { - "human": "megawatt" - } - } - } - } - }, - "crossings": { - "description": "Oversteekplaatsen voor voetgangers en fietsers", - "name": "Oversteekplaatsen", - "presets": { - "0": { - "description": "Oversteekplaats voor voetgangers en/of fietsers", - "title": "Oversteekplaats" - }, - "1": { - "description": "Verkeerslicht op een weg", - "title": "Verkeerslicht" - } - }, - "tagRenderings": { - "crossing-bicycle-allowed": { - "mappings": { - "0": { - "then": "Een fietser kan deze oversteekplaats gebruiken" - }, - "1": { - "then": "Een fietser kan deze oversteekplaats niet gebruiken" - } - }, - "question": "Is deze oversteekplaats ook voor fietsers" - }, - "crossing-button": { - "mappings": { - "0": { - "then": "Dit verkeerslicht heeft een knop voor groen licht" - }, - "1": { - "then": "Dit verkeerlicht heeft geen knop voor groen licht" - } - }, - "question": "Heeft dit verkeerslicht een knop voor groen licht?" - }, - "crossing-continue-through-red": { - "mappings": { - "0": { - "then": "Een fietser mag wel rechtdoor gaan als het licht rood is " - }, - "1": { - "then": "Een fietser mag wel rechtdoor gaan als het licht rood is" - }, - "2": { - "then": "Een fietser mag niet rechtdoor gaan als het licht rood is" - } - }, - "question": "Mag een fietser rechtdoor gaan als het licht rood is?" - }, - "crossing-has-island": { - "mappings": { - "0": { - "then": "Deze oversteekplaats heeft een verkeerseiland in het midden" - }, - "1": { - "then": "Deze oversteekplaats heeft geen verkeerseiland in het midden" - } - }, - "question": "Heeft deze oversteekplaats een verkeerseiland in het midden?" - }, - "crossing-is-zebra": { - "mappings": { - "0": { - "then": "Dit is een zebrapad" - }, - "1": { - "then": "Dit is geen zebrapad" - } - }, - "question": "Is dit een zebrapad?" - }, - "crossing-right-turn-through-red": { - "mappings": { - "0": { - "then": "Een fietser mag wel rechtsaf slaan als het licht rood is " - }, - "1": { - "then": "Een fietser mag wel rechtsaf slaan als het licht rood is" - }, - "2": { - "then": "Een fietser mag niet rechtsaf slaan als het licht rood is" - } - }, - "question": "Mag een fietser rechtsaf slaan als het licht rood is?" - }, - "crossing-tactile": { - "mappings": { - "0": { - "then": "Deze oversteekplaats heeft een geleidelijn" - }, - "1": { - "then": "Deze oversteekplaats heeft geen geleidelijn" - }, - "2": { - "then": "Deze oversteekplaats heeft een geleidelijn, die incorrect is." - } - }, - "question": "Heeft deze oversteekplaats een geleidelijn?" - }, - "crossing-type": { - "mappings": { - "0": { - "then": "Oversteekplaats, zonder verkeerslichten" - }, - "1": { - "then": "Oversteekplaats met verkeerslichten" - }, - "2": { - "then": "Zebrapad" - } - }, - "question": "Wat voor oversteekplaats is dit?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Verkeerslicht" - }, - "1": { - "then": "Oversteektplaats met verkeerslichten" - } - }, - "render": "Oversteekplaats" - } - }, - "cycleways_and_roads": { - "name": "Fietspaden, straten en wegen", - "tagRenderings": { - "Cycleway type for a road": { - "mappings": { - "0": { - "then": "Er is een fietssuggestiestrook" - }, - "1": { - "then": "Er is een fietspad aangrenzend aan de weg (gescheiden met verf)" - }, - "2": { - "then": "Er is een fietspad (los van de weg), maar geen fietspad afzonderlijk getekend naast deze weg." - }, - "3": { - "then": "Er is een apart getekend fietspad." - }, - "4": { - "then": "Er is geen fietspad aanwezig" - }, - "5": { - "then": "Er is geen fietspad aanwezig" - } - }, - "question": "Wat voor fietspad is hier?" - }, - "Cycleway:smoothness": { - "mappings": { - "0": { - "then": "Geschikt voor fijne rollers: rollerblade, skateboard" - }, - "1": { - "then": "Geschikt voor fijne wielen: racefiets" - }, - "2": { - "then": "Geschikt voor normale wielen: stadsfiets, rolstoel, scooter" - }, - "3": { - "then": "Geschikt voor brede wielen: trekfiets, auto, rickshaw" - }, - "4": { - "then": "Geschikt voor voertuigen met hoge banden: lichte terreinwagen" - }, - "5": { - "then": "Geschikt voor terreinwagens: zware terreinwagen" - }, - "6": { - "then": "Geschikt voor gespecialiseerde terreinwagens: tractor, alleterreinwagen" - }, - "7": { - "then": "Niet geschikt voor voertuigen met wielen" - } - }, - "question": "Wat is de kwaliteit van dit fietspad?" - }, - "Cycleway:surface": { - "mappings": { - "0": { - "then": "Dit fietspad is onverhard" - }, - "1": { - "then": "Dit fietspad is geplaveid" - }, - "2": { - "then": "Dit fietspad is gemaakt van asfalt" - }, - "3": { - "then": "Dit fietspad is gemaakt van straatstenen" - }, - "4": { - "then": "Dit fietspad is gemaakt van beton" - }, - "5": { - "then": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)" - }, - "6": { - "then": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien" - }, - "7": { - "then": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien" - }, - "8": { - "then": "Dit fietspad is gemaakt van hout" - }, - "9": { - "then": "Dit fietspad is gemaakt van grind" - }, - "10": { - "then": "Dit fietspad is gemaakt van fijn grind" - }, - "11": { - "then": "Dit fietspad is gemaakt van kiezelsteentjes" - }, - "12": { - "then": "Dit fietspad is gemaakt van aarde" - } - }, - "question": "Waaruit is het oppervlak van het fietspad van gemaakt?", - "render": "Dit fietspad is gemaakt van {cycleway:surface}" - }, - "Is this a cyclestreet? (For a road)": { - "mappings": { - "0": { - "then": "Dit is een fietsstraat, en dus een 30km/h zone" - }, - "1": { - "then": "Dit is een fietsstraat" - }, - "2": { - "then": "Dit is geen fietsstraat" - } - }, - "question": "Is dit een fietsstraat?" - }, - "Maxspeed (for road)": { - "mappings": { - "0": { - "then": "De maximumsnelheid is 20 km/u" - }, - "1": { - "then": "De maximumsnelheid is 30 km/u" - }, - "2": { - "then": "De maximumsnelheid is 50 km/u" - }, - "3": { - "then": "De maximumsnelheid is 70 km/u" - }, - "4": { - "then": "De maximumsnelheid is 90 km/u" - } - }, - "question": "Wat is de maximumsnelheid in deze straat?", - "render": "De maximumsnelheid op deze weg is {maxspeed} km/u" - }, - "Surface of the road": { - "mappings": { - "0": { - "then": "Dit fietspad is onverhard" - }, - "1": { - "then": "Dit fietspad is geplaveid" - }, - "2": { - "then": "Dit fietspad is gemaakt van asfalt" - }, - "3": { - "then": "Dit fietspad is gemaakt van straatstenen" - }, - "4": { - "then": "Dit fietspad is gemaakt van beton" - }, - "5": { - "then": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)" - }, - "6": { - "then": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien" - }, - "7": { - "then": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien" - }, - "8": { - "then": "Dit fietspad is gemaakt van hout" - }, - "9": { - "then": "Dit fietspad is gemaakt van grind" - }, - "10": { - "then": "Dit fietspad is gemaakt van fijn grind" - }, - "11": { - "then": "Dit fietspad is gemaakt van kiezelsteentjes" - }, - "12": { - "then": "Dit fietspad is gemaakt van aarde" - } - }, - "question": "Waaruit is het oppervlak van de straat gemaakt?", - "render": "Deze weg is gemaakt van {surface}" - }, - "Surface of the street": { - "question": "Wat is de kwaliteit van deze straat?" - }, - "cyclelan-segregation": { - "mappings": { - "0": { - "then": "Dit fietspad is gescheiden van de weg met een onderbroken streep" - }, - "1": { - "then": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep" - }, - "2": { - "then": "Dit fietspad is gescheiden van de weg met parkeervakken" - }, - "3": { - "then": "Dit fietspad is gescheiden van de weg met een stoeprand" - } - }, - "question": "Hoe is dit fietspad gescheiden van de weg?" - }, - "cycleway-lane-track-traffic-signs": { - "mappings": { - "0": { - "then": "Verplicht fietspad " - }, - "1": { - "then": "Verplicht fietspad (met onderbord)
    " - }, - "2": { - "then": "Afgescheiden voet-/fietspad " - }, - "3": { - "then": "Gedeeld voet-/fietspad " - }, - "4": { - "then": "Geen verkeersbord aanwezig" - } - }, - "question": "Welk verkeersbord heeft dit fietspad?" - }, - "cycleway-segregation": { - "mappings": { - "0": { - "then": "Dit fietspad is gescheiden van de weg met een onderbroken streep" - }, - "1": { - "then": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep" - }, - "2": { - "then": "Dit fietspad is gescheiden van de weg met parkeervakken" - }, - "3": { - "then": "Dit fietspad is gescheiden van de weg met een stoeprand" - } - }, - "question": "Hoe is dit fietspad gescheiden van de weg?" - }, - "cycleway-traffic-signs": { - "mappings": { - "0": { - "then": "Verplicht fietspad " - }, - "1": { - "then": "Verplicht fietspad (met onderbord)
    " - }, - "2": { - "then": "Afgescheiden voet-/fietspad " - }, - "3": { - "then": "Gedeeld voet-/fietspad " - }, - "4": { - "then": "Geen verkeersbord aanwezig" - } - }, - "question": "Welk verkeersbord heeft dit fietspad?" - }, - "cycleway-traffic-signs-D7-supplementary": { - "mappings": { - "0": { - "then": "" - }, - "1": { - "then": "" - }, - "2": { - "then": "" - }, - "3": { - "then": "" - }, - "4": { - "then": "" - }, - "5": { - "then": "" - }, - "6": { - "then": "Geen onderbord aanwezig" - } - }, - "question": "Heeft het verkeersbord D7 () een onderbord?" - }, - "cycleway-traffic-signs-supplementary": { - "mappings": { - "0": { - "then": "" - }, - "1": { - "then": "" - }, - "2": { - "then": "" - }, - "3": { - "then": "" - }, - "4": { - "then": "" - }, - "5": { - "then": "" - }, - "6": { - "then": "Geen onderbord aanwezig" - } - }, - "question": "Heeft het verkeersbord D7 () een onderbord?" - }, - "cycleways_and_roads-cycleway:buffer": { - "question": "Hoe breed is de ruimte tussen het fietspad en de weg?", - "render": "De schrikafstand van dit fietspad is {cycleway:buffer} m" - }, - "is lit?": { - "mappings": { - "0": { - "then": "Deze weg is verlicht" - }, - "1": { - "then": "Deze weg is niet verlicht" - }, - "2": { - "then": "Deze weg is 's nachts verlicht" - }, - "3": { - "then": "Deze weg is 24/7 verlicht" - } - }, - "question": "Is deze weg verlicht?" - }, - "width:carriageway": { - "question": "Hoe breed is de rijbaan in deze straat (in meters)?
    Dit is
    Meet dit van stoepsteen tot stoepsteen, dus inclusief een parallelle parkeerstrook", - "render": "De breedte van deze rijbaan in deze straat is {width:carriageway}m" - } - }, - "title": { - "mappings": { - "0": { - "then": "Fietsweg" - }, - "1": { - "then": "Fietssuggestiestrook" - }, - "2": { - "then": "Fietsstrook" - }, - "3": { - "then": "Fietsweg naast de weg" - }, - "4": { - "then": "Fietsstraat" - } - }, - "render": "Fietspaden" - } - }, - "defibrillator": { - "name": "Defibrillatoren", - "presets": { - "0": { - "title": "Defibrillator" - } - }, - "tagRenderings": { - "defibrillator-access": { - "mappings": { - "0": { - "then": "Publiek toegankelijk" - }, - "1": { - "then": "Publiek toegankelijk" - }, - "2": { - "then": "Enkel toegankelijk voor klanten" - }, - "3": { - "then": "Niet toegankelijk voor het publiek (bv. enkel voor personeel, de eigenaar, ...)" - }, - "4": { - "then": "Niet toegankelijk, mogelijk enkel voor professionals" - } - }, - "question": "Is deze defibrillator vrij toegankelijk?", - "render": "Toegankelijkheid is {access}" - }, - "defibrillator-defibrillator": { - "mappings": { - "0": { - "then": "Dit is een manueel toestel enkel voor professionals" - }, - "1": { - "then": "Dit is een gewone automatische defibrillator" - } - }, - "question": "Is dit een gewone automatische defibrillator of een manueel toestel enkel voor professionals?", - "render": "Er is geen info over het soort toestel" - }, - "defibrillator-defibrillator:location": { - "question": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in de plaatselijke taal)", - "render": "Meer informatie over de locatie (lokale taal):
    {defibrillator:location}" - }, - "defibrillator-defibrillator:location:en": { - "question": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in het Engels)", - "render": "Meer informatie over de locatie (in het Engels):
    {defibrillator:location:en}" - }, - "defibrillator-defibrillator:location:fr": { - "question": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in het Frans)", - "render": "Meer informatie over de locatie (in het Frans):
    {defibrillator:location:fr}" - }, - "defibrillator-description": { - "question": "Is er nog iets bijzonder aan deze defibrillator dat je nog niet hebt kunnen meegeven? (laat leeg indien niet)", - "render": "Aanvullende info: {description}" - }, - "defibrillator-email": { - "question": "Wat is het email-adres voor vragen over deze defibrillator", - "render": "Email voor vragen over deze defibrillator: {email}" - }, - "defibrillator-fixme": { - "question": "Is er iets mis met de informatie over deze defibrillator dat je hier niet opgelost kreeg? (laat hier een berichtje achter voor OpenStreetMap experts)", - "render": "Extra informatie voor OpenStreetMap experts: {fixme}" - }, - "defibrillator-indoors": { - "mappings": { - "0": { - "then": "Deze defibrillator bevindt zich in een gebouw" - }, - "1": { - "then": "Deze defibrillator hangt buiten" - } - }, - "question": "Hangt deze defibrillator binnen of buiten?" - }, - "defibrillator-level": { - "mappings": { - "0": { - "then": "Deze defibrillator bevindt zich gelijkvloers" - }, - "1": { - "then": "Deze defibrillator is op de eerste verdieping" - } - }, - "question": "Op welke verdieping bevindt deze defibrillator zich?", - "render": "De defibrillator bevindt zicht op verdieping {level}" - }, - "defibrillator-opening_hours": { - "mappings": { - "0": { - "then": "24/7 open (inclusief feestdagen)" - } - }, - "question": "Wanneer is deze defibrillator beschikbaar?", - "render": "{opening_hours_table(opening_hours)}" - }, - "defibrillator-phone": { - "question": "Wat is het telefoonnummer voor vragen over deze defibrillator", - "render": "Telefoonnummer voor vragen over deze defibrillator: {phone}" - }, - "defibrillator-ref": { - "question": "Wat is het officieel identificatienummer van het toestel? (indien zichtbaar op toestel)", - "render": "Officieel identificatienummer van het toestel: {ref}" - }, - "defibrillator-survey:date": { - "mappings": { - "0": { - "then": "Vandaag nagekeken!" - } - }, - "question": "Wanneer is deze defibrillator het laatst gecontroleerd in OpenStreetMap?", - "render": "Deze defibrillator is nagekeken in OSM op {survey:date}" - } - }, - "title": { - "render": "Defibrillator" - } - }, - "direction": { - "description": "Deze laag toont de oriëntatie van een object", - "name": "Richtingsvisualisatie" - }, - "drinking_water": { - "name": "Drinkbaar water", - "presets": { - "0": { - "title": "drinkbaar water" - } - }, - "tagRenderings": { - "Bottle refill": { - "mappings": { - "0": { - "then": "Een drinkbus bijvullen gaat makkelijk" - }, - "1": { - "then": "Een drinkbus past moeilijk" - } - }, - "question": "Hoe gemakkelijk is het om drinkbussen bij te vullen?" - }, - "Still in use?": { - "mappings": { - "0": { - "then": "Deze drinkwaterfontein werkt" - }, - "1": { - "then": "Deze drinkwaterfontein is kapot" - }, - "2": { - "then": "Deze drinkwaterfontein is afgesloten" - } - }, - "question": "Is deze drinkwaterkraan nog steeds werkende?", - "render": "Deze waterkraan-status is {operational_status}" - }, - "render-closest-drinking-water": { - "render": "Er bevindt zich een ander drinkwaterpunt op {_closest_other_drinking_water_distance} meter" - } - }, - "title": { - "render": "Drinkbaar water" - } - }, - "etymology": { - "description": "Alle lagen met een gelinkt etymology", - "name": "Heeft etymology info", - "tagRenderings": { - "simple etymology": { - "mappings": { - "0": { - "then": "De oorsprong van deze naam is onbekend in de literatuur" - } - }, - "question": "Naar wat is dit object vernoemd?
    Dit staat mogelijks vermeld op het straatnaambordje", - "render": "Vernoemd naar {name:etymology}" - }, - "street-name-sign-image": { - "render": "{image_carousel(image:streetsign)}
    {image_upload(image:streetsign, Voeg afbeelding van straatnaambordje toe)}" - }, - "wikipedia-etymology": { - "question": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?", - "render": "

    Wikipedia artikel van de naamgever

    {wikipedia(name:etymology:wikidata):max-height:20rem}" - }, - "zoeken op inventaris onroerend erfgoed": { - "render": "Zoeken op inventaris onroerend erfgoed" - } - } - }, - "food": { - "filter": { - "0": { - "options": { - "0": { - "question": "Nu geopened" - } - } - }, - "1": { - "options": { - "0": { - "question": "Heeft een vegetarisch menu" - } - } - }, - "2": { - "options": { - "0": { - "question": "Heeft een veganistisch menu" - } - } - }, - "3": { - "options": { - "0": { - "question": "Heeft een halal menu" - } - } - } - }, - "name": "Eetgelegenheden", - "presets": { - "0": { - "description": "Een eetgegelegenheid waar je aan tafel wordt bediend", - "title": "restaurant" - }, - "1": { - "description": "Een zaak waar je snel bediend wordt, vaak met de focus op afhalen. Zitgelegenheid is eerder beperkt (of zelfs afwezig)", - "title": "fastfood-zaak" - }, - "2": { - "description": "Een fastfood-zaak waar je frieten koopt", - "title": "frituur" - } - }, - "tagRenderings": { - "Cuisine": { - "mappings": { - "0": { - "then": "Dit is een pizzeria" - }, - "1": { - "then": "Dit is een frituur" - }, - "2": { - "then": "Dit is een pastazaak" - }, - "3": { - "then": "Dit is een kebabzaak" - }, - "4": { - "then": "Dit is een broodjeszaak" - }, - "5": { - "then": "Dit is een hamburgerrestaurant" - }, - "6": { - "then": "Dit is een sushirestaurant" - }, - "7": { - "then": "Dit is een koffiezaak" - }, - "8": { - "then": "Dit is een Italiaans restaurant (dat meer dan enkel pasta of pizza verkoopt)" - }, - "9": { - "then": "Dit is een Frans restaurant" - }, - "10": { - "then": "Dit is een Chinees restaurant" - }, - "11": { - "then": "Dit is een Grieks restaurant" - }, - "12": { - "then": "Dit is een Indisch restaurant" - }, - "13": { - "then": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)" - }, - "14": { - "then": "Dit is een Thaïs restaurant" - } - }, - "question": "Welk soort gerechten worden hier geserveerd?", - "render": "Deze plaats serveert vooral {cuisine}" - }, - "Fastfood vs restaurant": { - "mappings": { - "0": { - "then": "Dit is een fastfood-zaak. De focus ligt op snelle bediening, zitplaatsen zijn vaak beperkt en functioneel" - }, - "1": { - "then": "Dit is een restaurant. De focus ligt op een aangename ervaring waar je aan tafel wordt bediend" - } - }, - "question": "Wat voor soort zaak is dit?" - }, - "Name": { - "question": "Wat is de naam van deze eetgelegenheid?", - "render": "De naam van deze eetgelegeheid is {name}" - }, - "Takeaway": { - "mappings": { - "0": { - "then": "Hier is enkel afhaal mogelijk" - }, - "1": { - "then": "Eten kan hier afgehaald worden" - }, - "2": { - "then": "Hier is geen afhaalmogelijkheid" - } - }, - "question": "Biedt deze zaak een afhaalmogelijkheid aan?" - }, - "Vegan (no friture)": { - "mappings": { - "0": { - "then": "Geen veganistische opties beschikbaar" - }, - "1": { - "then": "Beperkte veganistische opties zijn beschikbaar" - }, - "2": { - "then": "Veganistische opties zijn beschikbaar" - }, - "3": { - "then": "Enkel veganistische opties zijn beschikbaar" - } - }, - "question": "Heeft deze eetgelegenheid een veganistische optie?" - }, - "Vegetarian (no friture)": { - "mappings": { - "0": { - "then": "Geen vegetarische opties beschikbaar" - }, - "1": { - "then": "Beperkte vegetarische opties zijn beschikbaar" - }, - "2": { - "then": "Vegetarische opties zijn beschikbaar" - }, - "3": { - "then": "Enkel vegetarische opties zijn beschikbaar" - } - }, - "question": "Heeft deze eetgelegenheid een vegetarische optie?" - }, - "friture-oil": { - "mappings": { - "0": { - "then": "Plantaardige olie" - }, - "1": { - "then": "Dierlijk vet" - } - }, - "question": "Bakt deze frituur met dierlijk vet of met plantaardige olie?" - }, - "friture-take-your-container": { - "mappings": { - "0": { - "then": "Je mag je eigen containers meenemen om je bestelling in mee te nemen en zo minder afval te maken" - }, - "1": { - "then": "Je mag geen eigen containers meenemen om je bestelling in mee te nemen" - }, - "2": { - "then": "Je moet je eigen containers meenemen om je bestelling in mee te nemen." - } - }, - "question": "Als je je eigen container (bv. kookpot of kleine potjes voor saus) meeneemt, gebruikt de frituur deze dan om je bestelling in te doen?" - }, - "friture-vegan": { - "mappings": { - "0": { - "then": "Er zijn veganistische snacks aanwezig" - }, - "1": { - "then": "Slechts enkele veganistische snacks" - }, - "2": { - "then": "Geen veganistische snacks beschikbaar" - } - }, - "question": "Heeft deze frituur veganistische snacks?" - }, - "friture-vegetarian": { - "mappings": { - "0": { - "then": "Er zijn vegetarische snacks aanwezig" - }, - "1": { - "then": "Slechts enkele vegetarische snacks" - }, - "2": { - "then": "Geen vegetarische snacks beschikbaar" - } - }, - "question": "Heeft deze frituur vegetarische snacks?" - }, - "halal (no friture)": { - "mappings": { - "0": { - "then": "Er zijn geen halal opties aanwezig" - }, - "1": { - "then": "Er zijn een beperkt aantal halal opties" - }, - "2": { - "then": "Halal menu verkrijgbaar" - }, - "3": { - "then": "Enkel halal opties zijn beschikbaar" - } - }, - "question": "Heeft dit restaurant halal opties?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Restaurant {name}" - }, - "1": { - "then": "Fastfood-zaak {name}" - } - }, - "render": "Eetgelegenheid" - } - }, - "ghost_bike": { - "name": "Witte Fietsen", - "presets": { - "0": { - "title": "Witte fiets" - } - }, - "tagRenderings": { - "ghost-bike-explanation": { - "render": "Een Witte Fiets (of Spookfiets) is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat over een witgeschilderde fiets die geplaatst werd in de buurt van het ongeval." - }, - "ghost_bike-inscription": { - "question": "Wat is het opschrift op deze witte fiets?", - "render": "{inscription}" - }, - "ghost_bike-name": { - "mappings": { - "0": { - "then": "De naam is niet aangeduid op de fiets" - } - }, - "question": "Aan wie is deze witte fiets een eerbetoon?
    Respecteer privacy - voeg enkel een naam toe indien die op de fiets staat of gepubliceerd is. Eventueel voeg je enkel de voornaam toe.
    ", - "render": "Ter nagedachtenis van {name}" - }, - "ghost_bike-source": { - "question": "Op welke website kan men meer informatie vinden over de Witte fiets of over het ongeval?", - "render": "Meer informatie" - }, - "ghost_bike-start_date": { - "question": "Wanneer werd deze witte fiets geplaatst?", - "render": "Geplaatst op {start_date}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Witte fiets ter nagedachtenis van {name}" - } - }, - "render": "Witte Fiets" - } - }, - "grass_in_parks": { - "name": "Toegankelijke grasvelden in parken", - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Speelweide in een park" - } - }, - "information_board": { - "name": "Informatieborden", - "presets": { - "0": { - "title": "informatiebord" - } - }, - "title": { - "render": "Informatiebord" - } - }, - "map": { - "description": "Een permantent geinstalleerde kaart", - "name": "Kaarten", - "presets": { - "0": { - "description": "Voeg een ontbrekende kaart toe", - "title": "Kaart" - } - }, - "tagRenderings": { - "map-attribution": { - "mappings": { - "0": { - "then": "De OpenStreetMap-attributie is duidelijk aangegeven, zelf met vermelding van \"ODBL\" " - }, - "1": { - "then": "OpenStreetMap is duidelijk aangegeven, maar de licentievermelding ontbreekt" - }, - "2": { - "then": "OpenStreetMap was oorspronkelijk niet aangeduid, maar iemand plaatste er een sticker" - }, - "3": { - "then": "Er is geen attributie" - }, - "4": { - "then": "Er is geen attributie" - } - }, - "question": "Is de attributie voor OpenStreetMap aanwezig?" - }, - "map-map_source": { - "mappings": { - "0": { - "then": "Deze kaart is gebaseerd op OpenStreetMap" - } - }, - "question": "Op welke data is deze kaart gebaseerd?", - "render": "Deze kaart is gebaseerd op {map_source}" - } - }, - "title": { - "render": "Kaart" - } - }, - "nature_reserve": { - "description": "Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid.", - "filter": { - "0": { - "options": { - "0": { - "question": "Vrij te bezoeken" - } - } - }, - "1": { - "options": { - "0": { - "question": "Alle natuurgebieden" - }, - "1": { - "question": "Honden mogen vrij rondlopen" - }, - "2": { - "question": "Honden welkom aan de leiband" - } - } - } - }, - "name": "Natuurgebied", - "presets": { - "0": { - "description": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt", - "title": "natuurreservaat" - } - }, - "tagRenderings": { - "Access tag": { - "mappings": { - "0": { - "then": "Vrij toegankelijk" - }, - "1": { - "then": "Niet toegankelijk" - }, - "2": { - "then": "Niet toegankelijk, want privégebied" - }, - "3": { - "then": "Toegankelijk, ondanks dat het privegebied is" - }, - "4": { - "then": "Enkel toegankelijk met een gids of tijdens een activiteit" - }, - "5": { - "then": "Toegankelijk mits betaling" - } - }, - "question": "Is dit gebied toegankelijk?", - "render": "De toegankelijkheid van dit gebied is: {access:description}" - }, - "Curator": { - "question": "Wie is de conservator van dit gebied?
    Respecteer privacy - geef deze naam enkel als die duidelijk is gepubliceerd", - "render": "{curator} is de beheerder van dit gebied" - }, - "Dogs?": { - "mappings": { - "0": { - "then": "Honden moeten aan de leiband" - }, - "1": { - "then": "Honden zijn niet toegestaan" - }, - "2": { - "then": "Honden zijn welkom en mogen vrij rondlopen" - } - }, - "question": "Zijn honden toegelaten in dit gebied?" - }, - "Editable description {description:0}": { - "render": "Extra info: {description:0}" - }, - "Email": { - "question": "Waar kan men naartoe emailen voor vragen en meldingen van dit natuurgebied?
    Respecteer privacy - geef enkel persoonlijke emailadressen als deze elders zijn gepubliceerd", - "render": "{email}" - }, - "Name tag": { - "mappings": { - "0": { - "then": "Dit gebied heeft geen naam" - } - }, - "question": "Wat is de naam van dit gebied?", - "render": "Dit gebied heet {name}" - }, - "Name:nl-tag": { - "question": "Wat is de Nederlandstalige naam van dit gebied?", - "render": "Dit gebied heet {name:nl}" - }, - "Non-editable description {description}": { - "render": "Extra info: {description}" - }, - "Operator tag": { - "mappings": { - "0": { - "then": "Dit gebied wordt beheerd door Natuurpunt" - }, - "1": { - "then": "Dit gebied wordt beheerd door {operator}" - }, - "2": { - "then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos" - } - }, - "question": "Wie beheert dit gebied?", - "render": "Beheer door {operator}" - }, - "Surface area": { - "render": "Totale oppervlakte: {_surface:ha}Ha" - }, - "Website": { - "question": "Op welke webpagina kan men meer informatie vinden over dit natuurgebied?" - }, - "phone": { - "question": "Waar kan men naartoe bellen voor vragen en meldingen van dit natuurgebied?
    Respecteer privacy - geef enkel persoonlijke telefoonnummers als deze elders zijn gepubliceerd", - "render": "{phone}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name:nl}" - }, - "1": { - "then": "{name}" - } - }, - "render": "Natuurgebied" - } - }, - "observation_tower": { - "description": "Torens om van het uitzicht te genieten", - "name": "Uitkijktorens", - "presets": { - "0": { - "description": "Een publiek toegankelijke uitkijktoren", - "title": "Uitkijktoren" - } - }, - "tagRenderings": { - "Fee": { - "mappings": { - "0": { - "then": "Gratis te bezoeken" - } - }, - "question": "Hoeveel moet men betalen om deze toren te bezoeken?", - "render": "Deze toren bezoeken kost {charge}" - }, - "Height": { - "question": "Hoe hoog is deze toren?", - "render": "Deze toren is {height} hoog" - }, - "Operator": { - "question": "Wie onderhoudt deze toren?", - "render": "Wordt onderhouden door {operator}" - }, - "name": { - "mappings": { - "0": { - "then": "Deze toren heeft geen specifieke naam" - } - }, - "question": "Heeft deze toren een naam?", - "render": "Deze toren heet {name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Uitkijktoren" - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " meter" - } - } - } - } - }, - "parking": { - "description": "Parking", - "name": "Parking", - "presets": { - "0": { - "description": "Voeg hier een fietsenstalling toe", - "title": "fietsparking" - }, - "1": { - "description": "Voeg hier een parking voor auto's toe", - "title": "parking" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name:nl}" - }, - "1": { - "then": "{name}" - }, - "2": { - "then": "Fietsenstalling" - } - }, - "render": "Parking" - } - }, - "picnic_table": { - "description": "Deze laag toont picnictafels", - "name": "Picnictafels", - "presets": { - "0": { - "title": "picnic-tafel" - } - }, - "tagRenderings": { - "picnic_table-material": { - "mappings": { - "0": { - "then": "Deze picnictafel is gemaakt uit hout" - }, - "1": { - "then": "Deze picnictafel is gemaakt uit beton" - } - }, - "question": "Van welk materiaal is deze picnictafel gemaakt?", - "render": "Deze picnictafel is gemaakt van {material}" - } - }, - "title": { - "render": "Picnictafel" - } - }, - "play_forest": { - "description": "Een speelbos is een vrij toegankelijke zone in een bos", - "name": "Speelbossen", - "title": { - "mappings": { - "0": { - "then": "{name}" - }, - "1": { - "then": "Speelbos {name}" - } - }, - "render": "Speelbos" - } - }, - "playground": { - "description": "Speeltuinen", - "name": "Speeltuinen", - "presets": { - "0": { - "title": "Speeltuin" - } - }, - "tagRenderings": { - "Playground-wheelchair": { - "mappings": { - "0": { - "then": "Geheel toegankelijk voor rolstoelgebruikers" - }, - "1": { - "then": "Beperkt toegankelijk voor rolstoelgebruikers" - }, - "2": { - "then": "Niet toegankelijk voor rolstoelgebruikers" - } - }, - "question": "Is deze speeltuin toegankelijk voor rolstoelgebruikers?" - }, - "playground-access": { - "mappings": { - "0": { - "then": "Vrij toegankelijk voor het publiek" - }, - "1": { - "then": "Vrij toegankelijk voor het publiek" - }, - "2": { - "then": "Enkel toegankelijk voor klanten van de bijhorende zaak" - }, - "3": { - "then": "Vrij toegankelijk voor scholieren van de school" - }, - "4": { - "then": "Niet vrij toegankelijk" - } - }, - "question": "Is deze speeltuin vrij toegankelijk voor het publiek?" - }, - "playground-email": { - "question": "Wie kan men emailen indien er problemen zijn met de speeltuin?", - "render": "De bevoegde dienst kan bereikt worden via {email}" - }, - "playground-lit": { - "mappings": { - "0": { - "then": "Deze speeltuin is 's nachts verlicht" - }, - "1": { - "then": "Deze speeltuin is 's nachts niet verlicht" - } - }, - "question": "Is deze speeltuin 's nachts verlicht?" - }, - "playground-max_age": { - "question": "Wat is de maximaal toegestane leeftijd voor deze speeltuin?", - "render": "Toegankelijk tot {max_age}" - }, - "playground-min_age": { - "question": "Wat is de minimale leeftijd om op deze speeltuin te mogen?", - "render": "Toegankelijk vanaf {min_age} jaar oud" - }, - "playground-opening_hours": { - "mappings": { - "0": { - "then": "Van zonsopgang tot zonsondergang" - }, - "1": { - "then": "Dag en nacht toegankelijk" - }, - "2": { - "then": "Dag en nacht toegankelijk" - } - }, - "question": "Op welke uren is deze speeltuin toegankelijk?" - }, - "playground-operator": { - "question": "Wie beheert deze speeltuin?", - "render": "Beheer door {operator}" - }, - "playground-phone": { - "question": "Wie kan men bellen indien er problemen zijn met de speeltuin?", - "render": "De bevoegde dienst kan getelefoneerd worden via {phone}" - }, - "playground-surface": { - "mappings": { - "0": { - "then": "De ondergrond is gras" - }, - "1": { - "then": "De ondergrond is zand" - }, - "2": { - "then": "De ondergrond bestaat uit houtsnippers" - }, - "3": { - "then": "De ondergrond bestaat uit stoeptegels" - }, - "4": { - "then": "De ondergrond is asfalt" - }, - "5": { - "then": "De ondergrond is beton" - }, - "6": { - "then": "De ondergrond is onverhard" - }, - "7": { - "then": "De ondergrond is verhard" - } - }, - "question": "Wat is de ondergrond van deze speeltuin?
    Indien er verschillende ondergronden zijn, neem de meest voorkomende", - "render": "De ondergrond is {surface}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Speeltuin {name}" - } - }, - "render": "Speeltuin" - } - }, - "public_bookcase": { - "description": "Een straatkastje met boeken voor iedereen", - "filter": { - "2": { - "options": { - "0": { - "question": "Binnen of buiten" - } - } - } - }, - "name": "Boekenruilkastjes", - "presets": { - "0": { - "title": "Boekenruilkast" - } - }, - "tagRenderings": { - "bookcase-booktypes": { - "mappings": { - "0": { - "then": "Voornamelijk kinderboeken" - }, - "1": { - "then": "Voornamelijk boeken voor volwassenen" - }, - "2": { - "then": "Boeken voor zowel kinderen als volwassenen" - } - }, - "question": "Voor welke doelgroep zijn de meeste boeken in dit boekenruilkastje?" - }, - "bookcase-is-accessible": { - "mappings": { - "0": { - "then": "Publiek toegankelijk" - }, - "1": { - "then": "Enkel toegankelijk voor klanten" - } - }, - "question": "Is dit boekenruilkastje publiek toegankelijk?" - }, - "bookcase-is-indoors": { - "mappings": { - "0": { - "then": "Dit boekenruilkastje staat binnen" - }, - "1": { - "then": "Dit boekenruilkastje staat buiten" - }, - "2": { - "then": "Dit boekenruilkastje staat buiten" - } - }, - "question": "Staat dit boekenruilkastje binnen of buiten?" - }, - "public_bookcase-brand": { - "mappings": { - "0": { - "then": "Deel van het netwerk 'Little Free Library'" - }, - "1": { - "then": "Dit boekenruilkastje maakt geen deel uit van een netwerk" - } - }, - "question": "Is dit boekenruilkastje deel van een netwerk?", - "render": "Dit boekenruilkastje is deel van het netwerk {brand}" - }, - "public_bookcase-capacity": { - "question": "Hoeveel boeken passen er in dit boekenruilkastje?", - "render": "Er passen {capacity} boeken" - }, - "public_bookcase-name": { - "mappings": { - "0": { - "then": "Dit boekenruilkastje heeft geen naam" - } - }, - "question": "Wat is de naam van dit boekenuilkastje?", - "render": "De naam van dit boekenruilkastje is {name}" - }, - "public_bookcase-operator": { - "question": "Wie is verantwoordelijk voor dit boekenruilkastje?", - "render": "Onderhouden door {operator}" - }, - "public_bookcase-ref": { - "mappings": { - "0": { - "then": "Dit boekenruilkastje maakt geen deel uit van een netwerk" - } - }, - "question": "Wat is het referentienummer van dit boekenruilkastje?", - "render": "Het referentienummer binnen {brand} is {ref}" - }, - "public_bookcase-start_date": { - "question": "Op welke dag werd dit boekenruilkastje geinstalleerd?", - "render": "Geplaatst op {start_date}" - }, - "public_bookcase-website": { - "question": "Is er een website over dit boekenruilkastje?", - "render": "Meer info op de website" - } - }, - "title": { - "mappings": { - "0": { - "then": "Boekenruilkast {name}" - } - }, - "render": "Boekenruilkast" - } - }, - "shops": { - "description": "Een winkel", - "name": "Winkel", - "presets": { - "0": { - "description": "Voeg een nieuwe winkel toe", - "title": "Winkel" - } - }, - "tagRenderings": { - "shops-email": { - "question": "Wat is het e-mailadres van deze winkel?", - "render": "{email}" - }, - "shops-name": { - "question": "Wat is de naam van deze winkel?" - }, - "shops-opening_hours": { - "question": "Wat zijn de openingsuren van deze winkel?", - "render": "{opening_hours_table(opening_hours)}" - }, - "shops-phone": { - "question": "Wat is het telefoonnummer?", - "render": "{phone}" - }, - "shops-shop": { - "mappings": { - "0": { - "then": "Gemakswinkel" - }, - "1": { - "then": "Supermarkt" - }, - "2": { - "then": "Kledingwinkel" - }, - "3": { - "then": "Kapper" - }, - "4": { - "then": "Bakkerij" - }, - "5": { - "then": "Autogarage" - }, - "6": { - "then": "Autodealer" - } - } - }, - "shops-website": { - "question": "Wat is de website van deze winkel?" - } - }, - "title": { - "render": "Winkel" - } - }, - "slow_roads": { - "name": "Paadjes, trage wegen en autoluwe straten", - "tagRenderings": { - "explanation": { - "mappings": { - "1": { - "then": "Dit is een brede, autovrije straat" - }, - "2": { - "then": "Dit is een voetpaadje" - }, - "3": { - "then": "Dit is een wegeltje of bospad" - }, - "4": { - "then": "Dit is een ruiterswegel" - }, - "5": { - "then": "Dit is een tractorspoor of weg om landbouwgrond te bereikken" - } - } - }, - "slow_roads-surface": { - "mappings": { - "0": { - "then": "De ondergrond is gras" - }, - "1": { - "then": "De ondergrond is aarde" - }, - "2": { - "then": "De ondergrond is onverhard" - }, - "3": { - "then": "De ondergrond is zand" - }, - "4": { - "then": "De ondergrond bestaat uit stoeptegels" - }, - "5": { - "then": "De ondergrond is asfalt" - }, - "6": { - "then": "De ondergrond is beton" - }, - "7": { - "then": "De ondergrond is verhard" - } - }, - "question": "Wat is de wegverharding van dit pad?", - "render": "De ondergrond is {surface}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - }, - "1": { - "then": "Voetpad" - }, - "2": { - "then": "Fietspad" - }, - "3": { - "then": "Voetgangersstraat" - }, - "4": { - "then": "Woonerf" - } - }, - "render": "Trage weg" - } - }, - "sport_pitch": { - "description": "Een sportterrein", - "name": "Sportterrein", - "presets": { - "0": { - "title": "Ping-pong tafel" - }, - "1": { - "title": "Sportterrein" - } - }, - "tagRenderings": { - "sport-pitch-access": { - "mappings": { - "0": { - "then": "Publiek toegankelijk" - }, - "1": { - "then": "Beperkt toegankelijk (enkel na reservatie, tijdens bepaalde uren, ...)" - }, - "2": { - "then": "Enkel toegankelijk voor leden van de bijhorende sportclub" - }, - "3": { - "then": "Privaat en niet toegankelijk" - } - }, - "question": "Is dit sportterrein publiek toegankelijk?" - }, - "sport-pitch-reservation": { - "mappings": { - "0": { - "then": "Reserveren is verplicht om gebruik te maken van dit sportterrein" - }, - "1": { - "then": "Reserveren is sterk aangeraden om gebruik te maken van dit sportterrein" - }, - "2": { - "then": "Reserveren is mogelijk, maar geen voorwaarde" - }, - "3": { - "then": "Reserveren is niet mogelijk" - } - }, - "question": "Moet men reserveren om gebruik te maken van dit sportveld?" - }, - "sport_pitch-email": { - "question": "Wat is het email-adres van de bevoegde dienst of uitbater?" - }, - "sport_pitch-opening_hours": { - "mappings": { - "1": { - "then": "24/7 toegankelijk" - } - }, - "question": "Wanneer is dit sportveld toegankelijk?" - }, - "sport_pitch-phone": { - "question": "Wat is het telefoonnummer van de bevoegde dienst of uitbater?" - }, - "sport_pitch-sport": { - "mappings": { - "0": { - "then": "Hier kan men basketbal spelen" - }, - "1": { - "then": "Hier kan men voetbal spelen" - }, - "2": { - "then": "Dit is een pingpongtafel" - }, - "3": { - "then": "Hier kan men tennis spelen" - }, - "4": { - "then": "Hier kan men korfbal spelen" - }, - "5": { - "then": "Hier kan men basketbal beoefenen" - } - }, - "question": "Welke sporten kan men hier beoefenen?", - "render": "Hier kan men {sport} beoefenen" - }, - "sport_pitch-surface": { - "mappings": { - "0": { - "then": "De ondergrond is gras" - }, - "1": { - "then": "De ondergrond is zand" - }, - "2": { - "then": "De ondergrond bestaat uit stoeptegels" - }, - "3": { - "then": "De ondergrond is asfalt" - }, - "4": { - "then": "De ondergrond is beton" - } - }, - "question": "Wat is de ondergrond van dit sportveld?", - "render": "De ondergrond is {surface}" - } - }, - "title": { - "render": "Sportterrein" - } - }, - "surveillance_camera": { - "name": "Bewakingscamera's", - "tagRenderings": { - "Camera type: fixed; panning; dome": { - "mappings": { - "0": { - "then": "Een vaste camera" - }, - "1": { - "then": "Een dome (bolvormige camera die kan draaien)" - }, - "2": { - "then": "Een camera die (met een motor) van links naar rechts kan draaien" - } - }, - "question": "Wat voor soort camera is dit?" - }, - "Indoor camera? This isn't clear for 'public'-cameras": { - "mappings": { - "0": { - "then": "Deze camera bevindt zich binnen" - }, - "1": { - "then": "Deze camera bevindt zich buiten" - }, - "2": { - "then": "Deze camera bevindt zich waarschijnlijk buiten" - } - }, - "question": "Bevindt de bewaakte publieke ruimte camera zich binnen of buiten?" - }, - "Level": { - "question": "Op welke verdieping bevindt deze camera zich?", - "render": "Bevindt zich op verdieping {level}" - }, - "Operator": { - "question": "Wie beheert deze bewakingscamera?", - "render": "Beheer door {operator}" - }, - "Surveillance type: public, outdoor, indoor": { - "mappings": { - "0": { - "then": "Bewaking van de publieke ruilmte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel..." - }, - "1": { - "then": "Een buitenruimte met privaat karakter (zoals een privé-oprit, een parking, tankstation, ...)" - }, - "2": { - "then": "Een private binnenruimte wordt bewaakt, bv. een winkel, een parkeergarage, ..." - } - }, - "question": "Wat soort bewaking wordt hier uitgevoerd?" - }, - "Surveillance:zone": { - "mappings": { - "0": { - "then": "Bewaakt een parking" - }, - "1": { - "then": "Bewaakt het verkeer" - }, - "2": { - "then": "Bewaakt een ingang" - }, - "3": { - "then": "Bewaakt een gang" - }, - "4": { - "then": "Bewaakt een perron of bushalte" - }, - "5": { - "then": "Bewaakt een winkel" - } - }, - "question": "Wat wordt hier precies bewaakt?", - "render": "Bewaakt een {surveillance:zone}" - }, - "camera:mount": { - "mappings": { - "0": { - "then": "Deze camera hangt aan een muur" - }, - "1": { - "then": "Deze camera staat op een paal" - }, - "2": { - "then": "Deze camera hangt aan het plafond" - } - }, - "question": "Hoe is deze camera geplaatst?", - "render": "Montage: {camera:mount}" - }, - "direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view": { - "mappings": { - "0": { - "then": "Filmt in kompasrichting {direction}" - } - }, - "question": "In welke geografische richting filmt deze camera?", - "render": "Filmt in kompasrichting {camera:direction}" - } - }, - "title": { - "render": "Bewakingscamera" - } - }, - "toilet": { - "filter": { - "0": { - "options": { - "0": { - "question": "Rolstoel toegankelijk" - } - } - }, - "1": { - "options": { - "0": { - "question": "Heeft een luiertafel" - } - } - }, - "2": { - "options": { - "0": { - "question": "Gratis toegankelijk" - } - } - } - }, - "name": "Toiletten", - "presets": { - "0": { - "description": "Een publieke toilet", - "title": "toilet" - }, - "1": { - "description": "Deze toiletten hebben op zijn minst één rolstoeltoegankelijke WC", - "title": "een rolstoeltoegankelijke toilet" - } - }, - "tagRenderings": { - "toilet-access": { - "mappings": { - "0": { - "then": "Publiek toegankelijk" - }, - "1": { - "then": "Enkel toegang voor klanten" - }, - "2": { - "then": "Niet toegankelijk" - }, - "3": { - "then": "Toegankelijk na het vragen van de sleutel" - }, - "4": { - "then": "Publiek toegankelijk" - } - }, - "question": "Zijn deze toiletten publiek toegankelijk?", - "render": "Toegankelijkheid is {access}" - }, - "toilet-changing_table:location": { - "mappings": { - "0": { - "then": "De luiertafel bevindt zich in de vrouwentoiletten " - }, - "1": { - "then": "De luiertafel bevindt zich in de herentoiletten " - }, - "2": { - "then": "De luiertafel bevindt zich in de rolstoeltoegankelijke toilet " - }, - "3": { - "then": "De luiertafel bevindt zich in een daartoe voorziene kamer " - } - }, - "question": "Waar bevindt de luiertafel zich?", - "render": "De luiertafel bevindt zich in {changing_table:location}" - }, - "toilet-charge": { - "question": "Hoeveel moet men betalen om deze toiletten te gebruiken?", - "render": "De toiletten gebruiken kost {charge}" - }, - "toilet-handwashing": { - "mappings": { - "0": { - "then": "Deze toiletten hebben een lavabo waar men de handen kan wassen" - }, - "1": { - "then": "Deze toiletten hebben geen lavabo waar men de handen kan wassen" - } - }, - "question": "Hebben deze toiletten een lavabo om de handen te wassen?" - }, - "toilet-has-paper": { - "mappings": { - "0": { - "then": "Deze toilet is voorzien van toiletpapier" - }, - "1": { - "then": "Je moet je eigen toiletpapier meebrengen naar deze toilet" - } - }, - "question": "Moet je je eigen toiletpappier meenemen naar deze toilet?" - }, - "toilets-changing-table": { - "mappings": { - "0": { - "then": "Er is een luiertafel" - }, - "1": { - "then": "Geen luiertafel" - } - }, - "question": "Is er een luiertafel beschikbaar?" - }, - "toilets-fee": { - "mappings": { - "0": { - "then": "Men moet betalen om deze toiletten te gebruiken" - }, - "1": { - "then": "Gratis te gebruiken" - } - }, - "question": "Zijn deze toiletten gratis te gebruiken?" - }, - "toilets-type": { - "mappings": { - "0": { - "then": "Er zijn enkel WC's om op te zitten" - }, - "1": { - "then": "Er zijn enkel urinoirs" - }, - "2": { - "then": "Er zijn enkel hurktoiletten" - }, - "3": { - "then": "Er zijn zowel urinoirs als zittoiletten" - } - }, - "question": "Welke toiletten zijn dit?" - }, - "toilets-wheelchair": { - "mappings": { - "0": { - "then": "Er is een toilet voor rolstoelgebruikers" - }, - "1": { - "then": "Niet toegankelijk voor rolstoelgebruikers" - } - }, - "question": "Is er een rolstoeltoegankelijke toilet voorzien?" - } - }, - "title": { - "render": "Toilet" - } - }, - "trail": { - "description": "Aangeduide wandeltochten", - "name": "Wandeltochten", - "tagRenderings": { - "Color": { - "mappings": { - "0": { - "then": "Blauwe wandeling" - }, - "1": { - "then": "Rode wandeling" - }, - "2": { - "then": "Groene wandeling" - }, - "3": { - "then": "Gele wandeling" - } - }, - "question": "Welke kleur heeft deze wandeling?", - "render": "Deze wandeling heeft kleur {colour}" - }, - "Name": { - "question": "Wat is de naam van deze wandeling?", - "render": "Deze wandeling heet {name}" - }, - "Operator tag": { - "mappings": { - "0": { - "then": "Dit gebied wordt beheerd door Natuurpunt" - }, - "1": { - "then": "Dit gebied wordt beheerd door {operator}" - } - }, - "question": "Wie beheert deze wandeltocht?", - "render": "Beheer door {operator}" - }, - "Wheelchair access": { - "mappings": { - "0": { - "then": "deze wandeltocht is toegankelijk met de rolstoel" - }, - "1": { - "then": "deze wandeltocht is niet toegankelijk met de rolstoel" - } - }, - "question": "Is deze wandeling toegankelijk met de rolstoel?" - }, - "pushchair access": { - "mappings": { - "0": { - "then": "deze wandeltocht is toegankelijk met de buggy" - }, - "1": { - "then": "deze wandeltocht is niet toegankelijk met de buggy" - } - }, - "question": "Is deze wandeltocht toegankelijk met de buggy?" - }, - "trail-length": { - "render": "Deze wandeling is {_length:km} kilometer lang" - } - }, - "title": { - "render": "Wandeltocht" - } - }, - "tree_node": { - "name": "Boom", - "presets": { - "0": { - "description": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.", - "title": "Loofboom" - }, - "1": { - "description": "Een boom van een soort met naalden, bijvoorbeeld den of spar.", - "title": "Naaldboom" - }, - "2": { - "description": "Wanneer je niet zeker bent of het nu een loof- of naaldboom is.", - "title": "Boom" - } - }, - "tagRenderings": { - "tree-decidouous": { - "mappings": { - "0": { - "then": "Bladverliezend: de boom is een periode van het jaar kaal." - }, - "1": { - "then": "Groenblijvend." - } - }, - "question": "Is deze boom groenblijvend of bladverliezend?" - }, - "tree-denotation": { - "mappings": { - "0": { - "then": "De boom valt op door zijn grootte of prominente locatie. Hij is nuttig voor navigatie." - }, - "1": { - "then": "De boom is een natuurlijk monument, bijvoorbeeld doordat hij bijzonder oud of van een waardevolle soort is." - }, - "2": { - "then": "De boom wordt voor landbouwdoeleinden gebruikt, bijvoorbeeld in een boomgaard." - }, - "3": { - "then": "De boom staat in een park of dergelijke (begraafplaats, schoolterrein, …)." - }, - "4": { - "then": "De boom staat in de tuin bij een woning/flatgebouw." - }, - "5": { - "then": "Dit is een laanboom." - }, - "6": { - "then": "De boom staat in een woonkern." - }, - "7": { - "then": "De boom staat buiten een woonkern." - } - }, - "question": "Hoe significant is deze boom? Kies het eerste antwoord dat van toepassing is." - }, - "tree-height": { - "mappings": { - "0": { - "then": "Hoogte: {height} m" - } - }, - "render": "Hoogte: {height}" - }, - "tree-heritage": { - "mappings": { - "0": { - "then": "\"\"/ Erkend als houtig erfgoed door Onroerend Erfgoed Vlaanderen" - }, - "1": { - "then": "Erkend als natuurlijk erfgoed door Directie Cultureel Erfgoed Brussel" - }, - "2": { - "then": "Erkend als erfgoed door een andere organisatie" - }, - "3": { - "then": "Niet erkend als erfgoed" - }, - "4": { - "then": "Erkend als erfgoed door een andere organisatie" - } - }, - "question": "Is deze boom erkend als erfgoed?" - }, - "tree-leaf_type": { - "mappings": { - "0": { - "then": "\"\"/ Loofboom" - }, - "1": { - "then": "\"\"/ Naaldboom" - }, - "2": { - "then": "\"\"/ Permanent bladloos" - } - }, - "question": "Is dit een naald- of loofboom?" - }, - "tree_node-name": { - "mappings": { - "0": { - "then": "De boom heeft geen naam." - } - }, - "question": "Heeft de boom een naam?", - "render": "Naam: {name}" - }, - "tree_node-ref:OnroerendErfgoed": { - "question": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?", - "render": "\"\"/ Onroerend Erfgoed-ID: {ref:OnroerendErfgoed}" - }, - "tree_node-wikidata": { - "question": "Wat is het Wikidata-ID van deze boom?", - "render": "\"\"/ Wikidata: {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Boom" - } - }, - "viewpoint": { - "description": "Een mooi uitzicht - ideaal om een foto toe te voegen wanneer iets niet in een andere categorie past", - "name": "Uitzicht", - "presets": { - "0": { - "title": "Uitzicht" - } - }, - "tagRenderings": { - "viewpoint-description": { - "question": "Zijn er bijzonderheden die je wilt toevoegen?" - } - }, - "title": { - "render": "Uitzicht" - } - }, - "village_green": { - "name": "Speelweide", - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Speelweide" - } - }, - "visitor_information_centre": { - "description": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd.", - "name": "Bezoekerscentrum", - "title": { - "mappings": { - "0": { - "then": "{name:nl}" - }, - "1": { - "then": "{name}" - } - }, - "render": "{name}" - } - }, - "waste_basket": { - "description": "Dit is een publieke vuilnisbak waar je je afval kan weggooien.", - "iconSize": { - "mappings": { - "0": { - "then": "Vuilnisbak" - } - } - }, - "name": "Vuilnisbak", - "presets": { - "0": { - "title": "Vuilnisbak" - } - }, - "tagRenderings": { - "dispensing_dog_bags": { - "mappings": { - "0": { - "then": "Deze vuilnisbak heeft een verdeler voor hondenpoepzakjes" - }, - "1": { - "then": "Deze vuilbak heeft geen verdeler voor hondenpoepzakjes" - }, - "2": { - "then": "Deze vuilnisbak heeft geen verdeler voor hondenpoepzakjes" - } - }, - "question": "Heeft deze vuilnisbak een verdeler voor hondenpoepzakjes?" - }, - "waste-basket-waste-types": { - "mappings": { - "0": { - "then": "Een vuilnisbak voor zwerfvuil" - }, - "1": { - "then": "Een vuilnisbak voor zwerfvuil" - }, - "2": { - "then": "Een vuilnisbak specifiek voor hondenuitwerpselen" - }, - "3": { - "then": "Een vuilnisbak voor sigarettenpeuken" - }, - "4": { - "then": "Een vuilnisbak voor (vervallen) medicatie en drugs" - }, - "5": { - "then": "Een vuilnisbak voor injectienaalden en andere scherpe voorwerpen" - } - }, - "question": "Wat voor soort vuilnisbak is dit?" - } - }, - "title": { - "render": "Vuilnisbak" - } - }, - "watermill": { - "description": "Watermolens", - "name": "Watermolens", - "tagRenderings": { - "Access tag": { - "mappings": { - "0": { - "then": "Vrij toegankelijk" - }, - "1": { - "then": "Niet toegankelijk" - }, - "2": { - "then": "Niet toegankelijk, want privégebied" - }, - "3": { - "then": "Toegankelijk, ondanks dat het privegebied is" - }, - "4": { - "then": "Enkel toegankelijk met een gids of tijdens een activiteit" - }, - "5": { - "then": "Toegankelijk mits betaling" - } - }, - "question": "Is dit gebied toegankelijk?", - "render": "De toegankelijkheid van dit gebied is: {access:description}" - }, - "Operator tag": { - "mappings": { - "0": { - "then": "Dit gebied wordt beheerd door Natuurpunt" - }, - "1": { - "then": "Dit gebied wordt beheerd door {operator}" - } - }, - "question": "Wie beheert dit pad?", - "render": "Beheer door {operator}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name:nl}" - }, - "1": { - "then": "{name}" - } - }, - "render": "Watermolens" + "title": { + "mappings": { + "0": { + "then": "Kunstwerk {name}" } + }, + "render": "Kunstwerk" } + }, + "barrier": { + "description": "Hindernissen tijdens het fietsen, zoals paaltjes en fietshekjes", + "name": "Barrières", + "presets": { + "0": { + "description": "Een paaltje in de weg", + "title": "Paaltje" + }, + "1": { + "description": "Fietshekjes, voor het afremmen van fietsers", + "title": "Fietshekjes" + } + }, + "tagRenderings": { + "Bollard type": { + "mappings": { + "0": { + "then": "Verwijderbare paal" + }, + "1": { + "then": "Vaste paal" + }, + "2": { + "then": "Paal die platgevouwen kan worden" + }, + "3": { + "then": "Flexibele paal, meestal plastic" + }, + "4": { + "then": "Verzonken poller" + } + }, + "question": "Wat voor soort paal is dit?" + }, + "Cycle barrier type": { + "mappings": { + "0": { + "then": "Enkelvoudig, slechts twee hekjes met ruimte ertussen " + }, + "1": { + "then": "Dubbel, twee hekjes achter elkaar " + }, + "2": { + "then": "Drievoudig, drie hekjes achter elkaar " + }, + "3": { + "then": "Knijppoort, ruimte is smaller aan de top, dan aan de bodem " + } + }, + "question": "Wat voor fietshekjes zijn dit?" + }, + "MaxWidth": { + "question": "Hoe breed is de ruimte naast de barrière?", + "render": "Maximumbreedte: {maxwidth:physical} m" + }, + "Overlap (cyclebarrier)": { + "question": "Hoeveel overlappen de barrières?" + }, + "Space between barrier (cyclebarrier)": { + "question": "Hoeveel ruimte is er tussen de barrières (langs de lengte van de weg)?", + "render": "Ruimte tussen barrières (langs de lengte van de weg): {width:separation} m" + }, + "Width of opening (cyclebarrier)": { + "question": "Hoe breed is de smalste opening naast de barrières?", + "render": "Breedte van de opening: {width:opening} m" + }, + "bicycle=yes/no": { + "mappings": { + "0": { + "then": "Een fietser kan hier langs." + }, + "1": { + "then": "Een fietser kan hier niet langs." + } + }, + "question": "Kan een fietser langs deze barrière?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Paaltje" + }, + "1": { + "then": "Fietshekjes" + } + }, + "render": "Barrière" + } + }, + "bench": { + "name": "Zitbanken", + "presets": { + "0": { + "title": "zitbank" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Heeft een rugleuning" + }, + "1": { + "then": "Rugleuning ontbreekt" + } + }, + "question": "Heeft deze zitbank een rugleuning?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "De kleur is bruin" + }, + "1": { + "then": "De kleur is groen" + }, + "2": { + "then": "De kleur is grijs" + }, + "3": { + "then": "De kleur is wit" + }, + "4": { + "then": "De kleur is rood" + }, + "5": { + "then": "De kleur is zwart" + }, + "6": { + "then": "De kleur is blauw" + }, + "7": { + "then": "De kleur is geel" + } + }, + "question": "Welke kleur heeft deze zitbank?", + "render": "Kleur: {colour}" + }, + "bench-direction": { + "question": "In welke richting kijk je wanneer je op deze zitbank zit?", + "render": "Wanneer je op deze bank zit, dan kijk je in {direction}°." + }, + "bench-material": { + "mappings": { + "0": { + "then": "Gemaakt uit hout" + }, + "1": { + "then": "Gemaakt uit metaal" + }, + "2": { + "then": "Gemaakt uit steen" + }, + "3": { + "then": "Gemaakt uit beton" + }, + "4": { + "then": "Gemaakt uit plastiek" + }, + "5": { + "then": "Gemaakt uit staal" + } + }, + "question": "Uit welk materiaal is het zitgedeelte van deze zitbank gemaakt?", + "render": "Gemaakt van {material}" + }, + "bench-seats": { + "question": "Hoeveel zitplaatsen heeft deze bank?", + "render": "{seats} zitplaatsen" + }, + "bench-survey:date": { + "question": "Wanneer is deze laatste bank laatst gesurveyed?", + "render": "Deze bank is laatst gesurveyd op {survey:date}" + } + }, + "title": { + "render": "Zitbank" + } + }, + "bench_at_pt": { + "name": "Zitbanken aan bushaltes", + "tagRenderings": { + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "Leunbank" + } + }, + "question": "Wat voor soort bank is dit?" + }, + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Zitbank aan een bushalte" + }, + "1": { + "then": "Zitbank in een schuilhokje" + } + }, + "render": "Zitbank" + } + }, + "bicycle_library": { + "description": "Een plaats waar men voor langere tijd een fiets kan lenen", + "name": "Fietsbibliotheek", + "presets": { + "0": { + "description": "Een fietsbieb heeft een collectie fietsen die leden mogen lenen", + "title": "Bicycle library" + } + }, + "tagRenderings": { + "bicycle-library-target-group": { + "mappings": { + "0": { + "then": "Aanbod voor kinderen" + }, + "1": { + "then": "Aanbod voor volwassenen" + }, + "2": { + "then": "Aanbod voor personen met een handicap" + } + }, + "question": "Voor wie worden hier fietsen aangeboden?" + }, + "bicycle_library-charge": { + "mappings": { + "0": { + "then": "Een fiets huren is gratis" + }, + "1": { + "then": "Een fiets huren kost €20/jaar en €20 waarborg" + } + }, + "question": "Hoeveel kost het huren van een fiets?", + "render": "Een fiets huren kost {charge}" + }, + "bicycle_library-name": { + "question": "Wat is de naam van deze fietsbieb?", + "render": "Deze fietsbieb heet {name}" + } + }, + "title": { + "render": "Fietsbibliotheek" + } + }, + "bicycle_tube_vending_machine": { + "name": "Fietsbanden-verkoopsautomaat", + "presets": { + "0": { + "title": "Fietsbanden-verkoopsautomaat" + } + }, + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "Deze verkoopsautomaat werkt" + }, + "1": { + "then": "Deze verkoopsautomaat is kapot" + }, + "2": { + "then": "Deze verkoopsautomaat is uitgeschakeld" + } + }, + "question": "Is deze verkoopsautomaat nog steeds werkende?", + "render": "Deze verkoopsautomaat is {operational_status}" + } + }, + "title": { + "render": "Fietsbanden-verkoopsautomaat" + } + }, + "bike_cafe": { + "name": "Fietscafé", + "presets": { + "0": { + "title": "Fietscafé" + } + }, + "tagRenderings": { + "bike_cafe-bike-pump": { + "mappings": { + "0": { + "then": "Dit fietscafé biedt een fietspomp aan voor eender wie" + }, + "1": { + "then": "Dit fietscafé biedt geen fietspomp aan voor iedereen" + } + }, + "question": "Biedt dit fietscafé een fietspomp aan voor iedereen?" + }, + "bike_cafe-email": { + "question": "Wat is het email-adres van {name}?" + }, + "bike_cafe-name": { + "question": "Wat is de naam van dit fietscafé?", + "render": "Dit fietscafé heet {name}" + }, + "bike_cafe-opening_hours": { + "question": "Wanneer is dit fietscafé geopend?" + }, + "bike_cafe-phone": { + "question": "Wat is het telefoonnummer van {name}?" + }, + "bike_cafe-repair-service": { + "mappings": { + "0": { + "then": "Dit fietscafé herstelt fietsen" + }, + "1": { + "then": "Dit fietscafé herstelt geen fietsen" + } + }, + "question": "Herstelt dit fietscafé fietsen?" + }, + "bike_cafe-repair-tools": { + "mappings": { + "0": { + "then": "Dit fietscafé biedt gereedschap aan om je fiets zelf te herstellen" + }, + "1": { + "then": "Dit fietscafé biedt geen gereedschap aan om je fiets zelf te herstellen" + } + }, + "question": "Biedt dit fietscafé gereedschap aan om je fiets zelf te herstellen?" + }, + "bike_cafe-website": { + "question": "Wat is de website van {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Fietscafé {name}" + } + }, + "render": "Fietscafé" + } + }, + "bike_cleaning": { + "name": "Fietsschoonmaakpunt", + "presets": { + "0": { + "title": "Fietsschoonmaakpunt" + } + }, + "title": { + "mappings": { + "0": { + "then": "Fietsschoonmaakpunt {name}" + } + }, + "render": "Fietsschoonmaakpunt" + } + }, + "bike_parking": { + "name": "Fietsparking", + "presets": { + "0": { + "title": "Fietsparking" + } + }, + "tagRenderings": { + "Access": { + "mappings": { + "0": { + "then": "Publiek toegankelijke fietsenstalling" + }, + "1": { + "then": "Klanten van de zaak of winkel" + }, + "2": { + "then": "Private fietsenstalling van een school, een bedrijf, ..." + } + }, + "question": "Wie mag er deze fietsenstalling gebruiken?", + "render": "{access}" + }, + "Bicycle parking type": { + "mappings": { + "0": { + "then": "Nietjes " + }, + "1": { + "then": "Wielrek/lussen " + }, + "2": { + "then": "Stuurhouder " + }, + "3": { + "then": "Rek " + }, + "4": { + "then": "Dubbel (twee verdiepingen) " + }, + "5": { + "then": "Schuur " + }, + "6": { + "then": "Paal met ring " + }, + "7": { + "then": "Een oppervlakte die gemarkeerd is om fietsen te parkeren" + } + }, + "question": "Van welk type is deze fietsparking?", + "render": "Dit is een fietsparking van het type: {bicycle_parking}" + }, + "Capacity": { + "question": "Hoeveel fietsen kunnen in deze fietsparking (inclusief potentiëel bakfietsen)?", + "render": "Plaats voor {capacity} fietsen" + }, + "Cargo bike capacity?": { + "question": "Voor hoeveel bakfietsen heeft deze fietsparking plaats?", + "render": "Deze parking heeft plaats voor {capacity:cargo_bike} fietsen" + }, + "Cargo bike spaces?": { + "mappings": { + "0": { + "then": "Deze parking heeft plaats voor bakfietsen" + }, + "1": { + "then": "Er zijn speciale plaatsen voorzien voor bakfietsen" + }, + "2": { + "then": "Je mag hier geen bakfietsen parkeren" + } + }, + "question": "Heeft deze fietsparking plaats voor bakfietsen?" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "Deze parking is overdekt (er is een afdak)" + }, + "1": { + "then": "Deze parking is niet overdekt" + } + }, + "question": "Is deze parking overdekt? Selecteer ook \"overdekt\" voor fietsparkings binnen een gebouw." + }, + "Underground?": { + "mappings": { + "0": { + "then": "Ondergrondse parking" + }, + "1": { + "then": "Parking op de begane grond" + }, + "2": { + "then": "Dakparking" + }, + "3": { + "then": "Parking op de begane grond" + }, + "4": { + "then": "Dakparking" + } + }, + "question": "Wat is de relatieve locatie van deze parking??" + } + }, + "title": { + "render": "Fietsparking" + } + }, + "bike_repair_station": { + "name": "Fietspunten (herstel, pomp of allebei)", + "presets": { + "0": { + "description": "Een apparaat waar je je fietsbanden kan oppompen, beschikbaar in de publieke ruimte. De fietspomp in je kelder telt dus niet.

    Voorbeelden

    Examples of bicycle pumps

    ", + "title": "Fietspomp" + }, + "1": { + "description": "Een apparaat met zowel gereedschap om je fiets te herstellen, met een pomp. Deze zijn op een vastgemaakt op een plaats in de publieke ruimte, bv. aan een paal.

    Voorbeeld

    ", + "title": "Herstelpunt en pomp" + }, + "2": { + "title": "Herstelpunt zonder pomp" + } + }, + "tagRenderings": { + "Email maintainer": { + "render": "Rapporteer deze fietspomp als kapot" + }, + "Operational status": { + "mappings": { + "0": { + "then": "De fietspomp is kapot" + }, + "1": { + "then": "De fietspomp werkt nog" + } + }, + "question": "Werkt de fietspomp nog?" + }, + "bike_repair_station-available-services": { + "mappings": { + "0": { + "then": "Er is enkel een pomp aanwezig" + }, + "1": { + "then": "Er is enkel gereedschap aanwezig (schroevendraaier, tang...)" + }, + "2": { + "then": "Er is zowel een pomp als gereedschap aanwezig" + } + }, + "question": "Welke functies biedt dit fietspunt?" + }, + "bike_repair_station-bike-chain-tool": { + "mappings": { + "0": { + "then": "Er is een reparatieset voor je ketting" + }, + "1": { + "then": "Er is geen reparatieset voor je ketting" + } + }, + "question": "Heeft dit herstelpunt een speciale reparatieset voor je ketting?" + }, + "bike_repair_station-bike-stand": { + "mappings": { + "0": { + "then": "Er is een haak of standaard" + }, + "1": { + "then": "Er is geen haak of standaard" + } + }, + "question": "Heeft dit herstelpunt een haak of standaard om je fiets op te hangen/zetten?" + }, + "bike_repair_station-electrical_pump": { + "mappings": { + "0": { + "then": "Manuele pomp" + }, + "1": { + "then": "Electrische pomp" + } + }, + "question": "Is dit een electrische fietspomp?" + }, + "bike_repair_station-email": { + "question": "Wat is het email-adres van de beheerder?" + }, + "bike_repair_station-manometer": { + "mappings": { + "0": { + "then": "Er is een luchtdrukmeter" + }, + "1": { + "then": "Er is geen luchtdrukmeter" + }, + "2": { + "then": "Er is een luchtdrukmeter maar die is momenteel defect" + } + }, + "question": "Heeft deze pomp een luchtdrukmeter?" + }, + "bike_repair_station-opening_hours": { + "mappings": { + "0": { + "then": "Dag en nacht open" + }, + "1": { + "then": "Dag en nacht open" + } + }, + "question": "Wanneer is dit fietsherstelpunt open?" + }, + "bike_repair_station-operator": { + "question": "Wie beheert deze fietspomp?", + "render": "Beheer door {operator}" + }, + "bike_repair_station-phone": { + "question": "Wat is het telefoonnummer van de beheerder?" + }, + "bike_repair_station-valves": { + "mappings": { + "0": { + "then": "Sclaverand (ook gekend als Presta)" + }, + "1": { + "then": "Dunlop" + }, + "2": { + "then": "Schrader (auto's)" + } + }, + "question": "Welke ventielen werken er met de pomp?", + "render": "Deze pomp werkt met de volgende ventielen: {valves}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Herstelpunt" + }, + "1": { + "then": "Herstelpunt" + }, + "2": { + "then": "Kapotte fietspomp" + }, + "3": { + "then": "Fietspomp {name}" + }, + "4": { + "then": "Fietspomp" + } + }, + "render": "Herstelpunt met pomp" + } + }, + "bike_shop": { + "description": "Een winkel die hoofdzakelijk fietsen en fietstoebehoren verkoopt", + "name": "Fietszaak", + "presets": { + "0": { + "title": "Fietszaak" + } + }, + "tagRenderings": { + "bike_repair_bike-pump-service": { + "mappings": { + "0": { + "then": "Deze winkel biedt een fietspomp aan voor iedereen" + }, + "1": { + "then": "Deze winkel biedt geen fietspomp aan voor eender wie" + }, + "2": { + "then": "Er is een fietspomp, deze is apart aangeduid" + } + }, + "question": "Biedt deze winkel een fietspomp aan voor iedereen?" + }, + "bike_repair_bike-wash": { + "mappings": { + "0": { + "then": "Deze winkel biedt fietsschoonmaak aan" + }, + "1": { + "then": "Deze winkel biedt een installatie aan om zelf je fiets schoon te maken" + }, + "2": { + "then": "Deze winkel biedt geen fietsschoonmaak aan" + } + }, + "question": "Biedt deze winkel een fietsschoonmaak aan?" + }, + "bike_repair_rents-bikes": { + "mappings": { + "0": { + "then": "Deze winkel verhuurt fietsen" + }, + "1": { + "then": "Deze winkel verhuurt geen fietsen" + } + }, + "question": "Verhuurt deze winkel fietsen?" + }, + "bike_repair_repairs-bikes": { + "mappings": { + "0": { + "then": "Deze winkel herstelt fietsen" + }, + "1": { + "then": "Deze winkel herstelt geen fietsen" + }, + "2": { + "then": "Deze winkel herstelt enkel fietsen die hier werden gekocht" + }, + "3": { + "then": "Deze winkel herstelt enkel fietsen van een bepaald merk" + } + }, + "question": "Herstelt deze winkel fietsen?" + }, + "bike_repair_second-hand-bikes": { + "mappings": { + "0": { + "then": "Deze winkel verkoopt tweedehands fietsen" + }, + "1": { + "then": "Deze winkel verkoopt geen tweedehands fietsen" + }, + "2": { + "then": "Deze winkel verkoopt enkel tweedehands fietsen" + } + }, + "question": "Verkoopt deze winkel tweedehands fietsen?" + }, + "bike_repair_sells-bikes": { + "mappings": { + "0": { + "then": "Deze winkel verkoopt fietsen" + }, + "1": { + "then": "Deze winkel verkoopt geen fietsen" + } + }, + "question": "Verkoopt deze fietszaak fietsen?" + }, + "bike_repair_tools-service": { + "mappings": { + "0": { + "then": "Deze winkel biedt gereedschap aan om je fiets zelf te herstellen" + }, + "1": { + "then": "Deze winkel biedt geen gereedschap aan om je fiets zelf te herstellen" + }, + "2": { + "then": "Het gereedschap aan om je fiets zelf te herstellen is enkel voor als je de fiets er kocht of huurt" + } + }, + "question": "Biedt deze winkel gereedschap aan om je fiets zelf te herstellen?" + }, + "bike_shop-email": { + "question": "Wat is het email-adres van {name}?" + }, + "bike_shop-is-bicycle_shop": { + "render": "Deze winkel verkoopt {shop} en heeft fiets-gerelateerde activiteiten." + }, + "bike_shop-name": { + "question": "Wat is de naam van deze fietszaak?", + "render": "Deze fietszaak heet {name}" + }, + "bike_shop-phone": { + "question": "Wat is het telefoonnummer van {name}?" + }, + "bike_shop-website": { + "question": "Wat is de website van {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Sportwinkel {name}" + }, + "2": { + "then": "Fietsverhuur {name}" + }, + "3": { + "then": "Fietsenmaker {name}" + }, + "4": { + "then": "Fietswinkel {name}" + }, + "5": { + "then": "Fietszaak {name}" + } + }, + "render": "Fietszaak" + } + }, + "bike_themed_object": { + "name": "Fietsgerelateerd object", + "title": { + "mappings": { + "1": { + "then": "Wielerpiste" + } + }, + "render": "Fietsgerelateerd object" + } + }, + "binocular": { + "description": "Verrekijkers", + "name": "Verrekijkers", + "presets": { + "0": { + "description": "Een telescoop of verrekijker die op een vaste plaats gemonteerd staat waar iedereen door mag kijken. ", + "title": "verrekijker" + } + }, + "tagRenderings": { + "binocular-charge": { + "mappings": { + "0": { + "then": "Gratis te gebruiken" + } + }, + "question": "Hoeveel moet men betalen om deze verrekijker te gebruiken?", + "render": "Deze verrekijker gebruiken kost {charge}" + }, + "binocular-direction": { + "question": "Welke richting kijkt men uit als men door deze verrekijker kijkt?", + "render": "Kijkt richting {direction}°" + } + }, + "title": { + "render": "Verrekijker" + } + }, + "birdhide": { + "description": "Een vogelkijkhut", + "filter": { + "0": { + "options": { + "0": { + "question": "Rolstoeltoegankelijk" + } + } + }, + "1": { + "options": { + "0": { + "question": "Enkel overdekte kijkhutten" + } + } + } + }, + "mapRendering": { + "0": { + "icon": { + "render": "./assets/layers/birdhide/birdhide.svg" + } + } + }, + "name": "Vogelkijkhutten", + "presets": { + "0": { + "description": "Een overdekte hut waarbinnen er warm en droog naar vogels gekeken kan worden", + "title": "vogelkijkhut" + }, + "1": { + "description": "Een vogelkijkwand waarachter men kan staan om vogels te kijken", + "title": "vogelkijkwand" + } + }, + "size": { + "render": "40,40,center" + }, + "stroke": { + "render": "3" + }, + "tagRenderings": { + "bird-hide-shelter-or-wall": { + "mappings": { + "0": { + "then": "Vogelkijkwand" + }, + "1": { + "then": "Vogelkijkhut" + }, + "2": { + "then": "Vogelkijktoren" + }, + "3": { + "then": "Vogelkijkhut" + } + }, + "question": "Is dit een kijkwand of kijkhut?" + }, + "bird-hide-wheelchair": { + "mappings": { + "0": { + "then": "Er zijn speciale voorzieningen voor rolstoelen" + }, + "1": { + "then": "Een rolstoel raakt er vlot" + }, + "2": { + "then": "Je kan er raken met een rolstoel, maar het is niet makkelijk" + }, + "3": { + "then": "Niet rolstoeltoegankelijk" + } + }, + "question": "Is deze vogelkijkplaats rolstoeltoegankelijk?" + }, + "birdhide-operator": { + "mappings": { + "0": { + "then": "Beheer door Natuurpunt" + }, + "1": { + "then": "Beheer door het Agentschap Natuur en Bos " + } + }, + "question": "Wie beheert deze vogelkijkplaats?", + "render": "Beheer door {operator}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "Vogelkijkhut {name}" + }, + "2": { + "then": "Vogelkijkwand {name}" + } + }, + "render": "Vogelkijkplaats" + } + }, + "cafe_pub": { + "filter": { + "0": { + "options": { + "0": { + "question": "Nu geopened" + } + } + } + }, + "name": "Cafés", + "presets": { + "0": { + "description": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk ", + "title": "bruin cafe of kroeg" + }, + "1": { + "description": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek", + "title": "bar" + }, + "2": { + "description": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen.", + "title": "cafe" + } + }, + "tagRenderings": { + "Classification": { + "mappings": { + "0": { + "then": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk " + }, + "1": { + "then": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek" + }, + "2": { + "then": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen." + }, + "3": { + "then": "Dit is een restaurant waar men een maaltijd geserveerd krijgt" + }, + "4": { + "then": "Een open ruimte waar bier geserveerd wordt. Typisch in Duitsland" + } + }, + "question": "Welk soort café is dit?" + }, + "Name": { + "question": "Wat is de naam van dit café?", + "render": "De naam van dit café is {name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Café" + } + }, + "charging_station": { + "description": "Oplaadpunten", + "filter": { + "0": { + "options": { + "0": { + "question": "Alle voertuigen" + }, + "1": { + "question": "Oplaadpunten voor fietsen" + }, + "2": { + "question": "Oplaadpunten voor auto's" + } + } + }, + "1": { + "options": { + "0": { + "question": "Enkel werkende oplaadpunten" + } + } + }, + "2": { + "options": { + "0": { + "question": "Alle types" + }, + "1": { + "question": "Heeft een
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    " + }, + "2": { + "question": "Heeft een
    Europese stekker met aardingspin (CEE7/4 type E)
    " + }, + "3": { + "question": "Heeft een
    Chademo
    " + }, + "4": { + "question": "Heeft een
    Type 1 met kabel (J1772)
    " + }, + "5": { + "question": "Heeft een
    Type 1 zonder kabel (J1772)
    " + }, + "6": { + "question": "Heeft een
    Type 1 CCS (ook gekend als Type 1 Combo)
    " + }, + "7": { + "question": "Heeft een
    Tesla Supercharger
    " + }, + "8": { + "question": "Heeft een
    Type 2 (mennekes)
    " + }, + "9": { + "question": "Heeft een
    Type 2 CCS (mennekes)
    " + }, + "10": { + "question": "Heeft een
    Type 2 met kabel (J1772)
    " + }, + "11": { + "question": "Heeft een
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    " + }, + "12": { + "question": "Heeft een
    Tesla Supercharger (destination)
    " + }, + "13": { + "question": "Heeft een
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    " + }, + "14": { + "question": "Heeft een
    USB om GSMs en kleine electronica op te laden
    " + }, + "15": { + "question": "Heeft een
    Bosch Active Connect met 3 pinnen aan een kabel
    " + }, + "16": { + "question": "Heeft een
    Bosch Active Connect met 5 pinnen aan een kabel
    " + } + } + } + }, + "name": "Oplaadpunten", + "presets": { + "0": { + "title": "laadpunt met gewone stekker(s) (bedoeld om electrische fietsen op te laden)" + }, + "1": { + "title": "oplaadpunt voor elektrische fietsen" + }, + "2": { + "title": "oplaadstation voor elektrische auto's" + }, + "3": { + "title": "oplaadstation" + } + }, + "tagRenderings": { + "Auth phone": { + "question": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?", + "render": "Aanmelden door te bellen of te SMS'en naar {authentication:phone_call:number}" + }, + "Authentication": { + "mappings": { + "0": { + "then": "Aanmelden met een lidkaart is mogelijk" + }, + "1": { + "then": "Aanmelden via een applicatie is mogelijk" + }, + "2": { + "then": "Aanmelden door te bellen naar een telefoonnummer is mogelijk" + }, + "3": { + "then": "Aanmelden via SMS is mogelijk" + }, + "4": { + "then": "Aanmelden via NFC is mogelijk" + }, + "5": { + "then": "Aanmelden met Money Card is mogelijk" + }, + "6": { + "then": "Aanmelden met een betaalkaart is mogelijk" + }, + "7": { + "then": "Hier opladen is (ook) mogelijk zonder aan te melden" + } + }, + "question": "Hoe kan men zich aanmelden aan dit oplaadstation?" + }, + "Available_charging_stations (generated)": { + "mappings": { + "0": { + "then": "
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    " + }, + "1": { + "then": "
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    " + }, + "2": { + "then": "
    Europese stekker met aardingspin (CEE7/4 type E)
    " + }, + "3": { + "then": "
    Europese stekker met aardingspin (CEE7/4 type E)
    " + }, + "4": { + "then": "
    Chademo
    " + }, + "5": { + "then": "
    Chademo
    " + }, + "6": { + "then": "
    Type 1 met kabel (J1772)
    " + }, + "7": { + "then": "
    Type 1 met kabel (J1772)
    " + }, + "8": { + "then": "
    Type 1 zonder kabel (J1772)
    " + }, + "9": { + "then": "
    Type 1 zonder kabel (J1772)
    " + }, + "10": { + "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    " + }, + "11": { + "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    " + }, + "12": { + "then": "
    Tesla Supercharger
    " + }, + "13": { + "then": "
    Tesla Supercharger
    " + }, + "14": { + "then": "
    Type 2 (mennekes)
    " + }, + "15": { + "then": "
    Type 2 (mennekes)
    " + }, + "16": { + "then": "
    Type 2 CCS (mennekes)
    " + }, + "17": { + "then": "
    Type 2 CCS (mennekes)
    " + }, + "18": { + "then": "
    Type 2 met kabel (J1772)
    " + }, + "19": { + "then": "
    Type 2 met kabel (J1772)
    " + }, + "20": { + "then": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    " + }, + "21": { + "then": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    " + }, + "22": { + "then": "
    Tesla Supercharger (destination)
    " + }, + "23": { + "then": "
    Tesla Supercharger (destination)
    " + }, + "24": { + "then": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    " + }, + "25": { + "then": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    " + }, + "26": { + "then": "
    USB om GSMs en kleine electronica op te laden
    " + }, + "27": { + "then": "
    USB om GSMs en kleine electronica op te laden
    " + }, + "28": { + "then": "
    Bosch Active Connect met 3 pinnen aan een kabel
    " + }, + "29": { + "then": "
    Bosch Active Connect met 3 pinnen aan een kabel
    " + }, + "30": { + "then": "
    Bosch Active Connect met 5 pinnen aan een kabel
    " + }, + "31": { + "then": "
    Bosch Active Connect met 5 pinnen aan een kabel
    " + } + }, + "question": "Welke aansluitingen zijn hier beschikbaar?" + }, + "Network": { + "mappings": { + "0": { + "then": "Maakt geen deel uit van een groter netwerk" + }, + "1": { + "then": "Maakt geen deel uit van een groter netwerk" + } + }, + "question": "Is dit oplaadpunt deel van een groter netwerk?", + "render": "Maakt deel uit van het {network}-netwerk" + }, + "OH": { + "mappings": { + "0": { + "then": "24/7 open - ook tijdens vakanties" + } + }, + "question": "Wanneer is dit oplaadpunt beschikbaar??" + }, + "Operational status": { + "mappings": { + "0": { + "then": "Dit oplaadpunt werkt" + }, + "1": { + "then": "Dit oplaadpunt is kapot" + }, + "2": { + "then": "Hier zal binnenkort een oplaadpunt gebouwd worden" + }, + "3": { + "then": "Hier wordt op dit moment een oplaadpunt gebouwd" + }, + "4": { + "then": "Dit oplaadpunt is niet meer in gebruik maar is wel nog aanwezig" + } + }, + "question": "Is dit oplaadpunt operationeel?" + }, + "Operator": { + "mappings": { + "0": { + "then": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt" + } + }, + "question": "Wie beheert dit oplaadpunt?", + "render": "Wordt beheerd door {operator}" + }, + "Parking:fee": { + "mappings": { + "0": { + "then": "Geen extra parkeerkost tijdens het opladen" + }, + "1": { + "then": "Tijdens het opladen moet er parkeergeld betaald worden" + } + }, + "question": "Moet men parkeergeld betalen tijdens het opladen?" + }, + "Type": { + "mappings": { + "0": { + "then": "Fietsen kunnen hier opgeladen worden" + }, + "1": { + "then": "Elektrische auto's kunnen hier opgeladen worden" + }, + "2": { + "then": "Electrische scooters (snorfiets of bromfiets) kunnen hier opgeladen worden" + }, + "3": { + "then": "Vrachtwagens kunnen hier opgeladen worden" + }, + "4": { + "then": "Bussen kunnen hier opgeladen worden" + } + }, + "question": "Welke voertuigen kunnen hier opgeladen worden?" + }, + "access": { + "mappings": { + "0": { + "then": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)" + }, + "1": { + "then": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)" + }, + "2": { + "then": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken
    Bv. op de parking van een hotel en enkel toegankelijk voor klanten van dit hotel" + }, + "3": { + "then": "Niet toegankelijk voor het publiek
    Bv. enkel toegankelijk voor de eigenaar, medewerkers ,... " + } + }, + "question": "Wie mag er dit oplaadpunt gebruiken?", + "render": "Toegang voor {access}" + }, + "capacity": { + "question": "Hoeveel voertuigen kunnen hier opgeladen worden?", + "render": "{capacity} voertuigen kunnen hier op hetzelfde moment opgeladen worden" + }, + "charge": { + "question": "Hoeveel moet men betalen om dit oplaadpunt te gebruiken?", + "render": "Dit oplaadpunt gebruiken kost {charge}" + }, + "current-0": { + "mappings": { + "0": { + "then": "
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    levert een stroom van maximaal 16 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    ?", + "render": "
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    levert een stroom van maximaal {socket:schuko:current}A" + }, + "current-1": { + "mappings": { + "0": { + "then": "
    Europese stekker met aardingspin (CEE7/4 type E)
    levert een stroom van maximaal 16 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Europese stekker met aardingspin (CEE7/4 type E)
    ?", + "render": "
    Europese stekker met aardingspin (CEE7/4 type E)
    levert een stroom van maximaal {socket:typee:current}A" + }, + "current-10": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    levert een stroom van maximaal 125 A" + }, + "1": { + "then": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    levert een stroom van maximaal 350 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    ?", + "render": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    levert een stroom van maximaal {socket:tesla_supercharger_ccs:current}A" + }, + "current-11": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger (destination)
    levert een stroom van maximaal 125 A" + }, + "1": { + "then": "
    Tesla Supercharger (destination)
    levert een stroom van maximaal 350 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Tesla Supercharger (destination)
    ?", + "render": "
    Tesla Supercharger (destination)
    levert een stroom van maximaal {socket:tesla_destination:current}A" + }, + "current-12": { + "mappings": { + "0": { + "then": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    levert een stroom van maximaal 16 A" + }, + "1": { + "then": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    levert een stroom van maximaal 32 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    ?", + "render": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    levert een stroom van maximaal {socket:tesla_destination:current}A" + }, + "current-13": { + "mappings": { + "0": { + "then": "
    USB om GSMs en kleine electronica op te laden
    levert een stroom van maximaal 1 A" + }, + "1": { + "then": "
    USB om GSMs en kleine electronica op te laden
    levert een stroom van maximaal 2 A" + } + }, + "question": "Welke stroom levert de stekker van type
    USB om GSMs en kleine electronica op te laden
    ?", + "render": "
    USB om GSMs en kleine electronica op te laden
    levert een stroom van maximaal {socket:USB-A:current}A" + }, + "current-14": { + "question": "Welke stroom levert de stekker van type
    Bosch Active Connect met 3 pinnen aan een kabel
    ?", + "render": "
    Bosch Active Connect met 3 pinnen aan een kabel
    levert een stroom van maximaal {socket:bosch_3pin:current}A" + }, + "current-15": { + "question": "Welke stroom levert de stekker van type
    Bosch Active Connect met 5 pinnen aan een kabel
    ?", + "render": "
    Bosch Active Connect met 5 pinnen aan een kabel
    levert een stroom van maximaal {socket:bosch_5pin:current}A" + }, + "current-2": { + "mappings": { + "0": { + "then": "
    Chademo
    levert een stroom van maximaal 120 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Chademo
    ?", + "render": "
    Chademo
    levert een stroom van maximaal {socket:chademo:current}A" + }, + "current-3": { + "mappings": { + "0": { + "then": "
    Type 1 met kabel (J1772)
    levert een stroom van maximaal 32 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Type 1 met kabel (J1772)
    ?", + "render": "
    Type 1 met kabel (J1772)
    levert een stroom van maximaal {socket:type1_cable:current}A" + }, + "current-4": { + "mappings": { + "0": { + "then": "
    Type 1 zonder kabel (J1772)
    levert een stroom van maximaal 32 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Type 1 zonder kabel (J1772)
    ?", + "render": "
    Type 1 zonder kabel (J1772)
    levert een stroom van maximaal {socket:type1:current}A" + }, + "current-5": { + "mappings": { + "0": { + "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    levert een stroom van maximaal 50 A" + }, + "1": { + "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    levert een stroom van maximaal 125 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Type 1 CCS (ook gekend als Type 1 Combo)
    ?", + "render": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    levert een stroom van maximaal {socket:type1_combo:current}A" + }, + "current-6": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger
    levert een stroom van maximaal 125 A" + }, + "1": { + "then": "
    Tesla Supercharger
    levert een stroom van maximaal 350 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Tesla Supercharger
    ?", + "render": "
    Tesla Supercharger
    levert een stroom van maximaal {socket:tesla_supercharger:current}A" + }, + "current-7": { + "mappings": { + "0": { + "then": "
    Type 2 (mennekes)
    levert een stroom van maximaal 16 A" + }, + "1": { + "then": "
    Type 2 (mennekes)
    levert een stroom van maximaal 32 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Type 2 (mennekes)
    ?", + "render": "
    Type 2 (mennekes)
    levert een stroom van maximaal {socket:type2:current}A" + }, + "current-8": { + "mappings": { + "0": { + "then": "
    Type 2 CCS (mennekes)
    levert een stroom van maximaal 125 A" + }, + "1": { + "then": "
    Type 2 CCS (mennekes)
    levert een stroom van maximaal 350 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Type 2 CCS (mennekes)
    ?", + "render": "
    Type 2 CCS (mennekes)
    levert een stroom van maximaal {socket:type2_combo:current}A" + }, + "current-9": { + "mappings": { + "0": { + "then": "
    Type 2 met kabel (J1772)
    levert een stroom van maximaal 16 A" + }, + "1": { + "then": "
    Type 2 met kabel (J1772)
    levert een stroom van maximaal 32 A" + } + }, + "question": "Welke stroom levert de stekker van type
    Type 2 met kabel (J1772)
    ?", + "render": "
    Type 2 met kabel (J1772)
    levert een stroom van maximaal {socket:type2_cable:current}A" + }, + "email": { + "question": "Wat is het email-adres van de operator?", + "render": "Bij problemen, email naar {email}" + }, + "fee": { + "mappings": { + "0": { + "then": "Gratis te gebruiken" + }, + "1": { + "then": "Gratis te gebruiken (zonder aan te melden)" + }, + "2": { + "then": "Gratis te gebruiken, maar aanmelden met een applicatie is verplicht" + }, + "3": { + "then": "Betalend te gebruiken, maar gratis voor klanten van het bijhorende hotel/café/ziekenhuis/..." + }, + "4": { + "then": "Betalend" + } + }, + "question": "Moet men betalen om dit oplaadpunt te gebruiken?" + }, + "maxstay": { + "mappings": { + "0": { + "then": "Geen maximum parkeertijd" + } + }, + "question": "Hoelang mag een voertuig hier blijven staan?", + "render": "De maximale parkeertijd hier is {canonical(maxstay)}" + }, + "payment-options": { + "override": { + "mappings+": { + "0": { + "then": "Betalen via een app van het netwerk" + }, + "1": { + "then": "Betalen via een lidkaart van het netwerk" + } + } + } + }, + "phone": { + "question": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?", + "render": "Bij problemen, bel naar {phone}" + }, + "plugs-0": { + "question": "Hoeveel stekkers van type
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:schuko} stekkers van het type
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    " + }, + "plugs-1": { + "question": "Hoeveel stekkers van type
    Europese stekker met aardingspin (CEE7/4 type E)
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:typee} stekkers van het type
    Europese stekker met aardingspin (CEE7/4 type E)
    " + }, + "plugs-10": { + "question": "Hoeveel stekkers van type
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:tesla_supercharger_ccs} stekkers van het type
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    " + }, + "plugs-11": { + "question": "Hoeveel stekkers van type
    Tesla Supercharger (destination)
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:tesla_destination} stekkers van het type
    Tesla Supercharger (destination)
    " + }, + "plugs-12": { + "question": "Hoeveel stekkers van type
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:tesla_destination} stekkers van het type
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    " + }, + "plugs-13": { + "question": "Hoeveel stekkers van type
    USB om GSMs en kleine electronica op te laden
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:USB-A} stekkers van het type
    USB om GSMs en kleine electronica op te laden
    " + }, + "plugs-14": { + "question": "Hoeveel stekkers van type
    Bosch Active Connect met 3 pinnen aan een kabel
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:bosch_3pin} stekkers van het type
    Bosch Active Connect met 3 pinnen aan een kabel
    " + }, + "plugs-15": { + "question": "Hoeveel stekkers van type
    Bosch Active Connect met 5 pinnen aan een kabel
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:bosch_5pin} stekkers van het type
    Bosch Active Connect met 5 pinnen aan een kabel
    " + }, + "plugs-2": { + "question": "Hoeveel stekkers van type
    Chademo
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:chademo} stekkers van het type
    Chademo
    " + }, + "plugs-3": { + "question": "Hoeveel stekkers van type
    Type 1 met kabel (J1772)
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:type1_cable} stekkers van het type
    Type 1 met kabel (J1772)
    " + }, + "plugs-4": { + "question": "Hoeveel stekkers van type
    Type 1 zonder kabel (J1772)
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:type1} stekkers van het type
    Type 1 zonder kabel (J1772)
    " + }, + "plugs-5": { + "question": "Hoeveel stekkers van type
    Type 1 CCS (ook gekend als Type 1 Combo)
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:type1_combo} stekkers van het type
    Type 1 CCS (ook gekend als Type 1 Combo)
    " + }, + "plugs-6": { + "question": "Hoeveel stekkers van type
    Tesla Supercharger
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:tesla_supercharger} stekkers van het type
    Tesla Supercharger
    " + }, + "plugs-7": { + "question": "Hoeveel stekkers van type
    Type 2 (mennekes)
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:type2} stekkers van het type
    Type 2 (mennekes)
    " + }, + "plugs-8": { + "question": "Hoeveel stekkers van type
    Type 2 CCS (mennekes)
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:type2_combo} stekkers van het type
    Type 2 CCS (mennekes)
    " + }, + "plugs-9": { + "question": "Hoeveel stekkers van type
    Type 2 met kabel (J1772)
    heeft dit oplaadpunt?", + "render": "Hier zijn {socket:type2_cable} stekkers van het type
    Type 2 met kabel (J1772)
    " + }, + "power-output-0": { + "mappings": { + "0": { + "then": "
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    levert een vermogen van maximaal 3.6 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    ?", + "render": "
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    levert een vermogen van maximaal {socket:schuko:output}" + }, + "power-output-1": { + "mappings": { + "0": { + "then": "
    Europese stekker met aardingspin (CEE7/4 type E)
    levert een vermogen van maximaal 3 kw" + }, + "1": { + "then": "
    Europese stekker met aardingspin (CEE7/4 type E)
    levert een vermogen van maximaal 22 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Europese stekker met aardingspin (CEE7/4 type E)
    ?", + "render": "
    Europese stekker met aardingspin (CEE7/4 type E)
    levert een vermogen van maximaal {socket:typee:output}" + }, + "power-output-10": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    levert een vermogen van maximaal 50 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    ?", + "render": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    levert een vermogen van maximaal {socket:tesla_supercharger_ccs:output}" + }, + "power-output-11": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger (destination)
    levert een vermogen van maximaal 120 kw" + }, + "1": { + "then": "
    Tesla Supercharger (destination)
    levert een vermogen van maximaal 150 kw" + }, + "2": { + "then": "
    Tesla Supercharger (destination)
    levert een vermogen van maximaal 250 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Tesla Supercharger (destination)
    ?", + "render": "
    Tesla Supercharger (destination)
    levert een vermogen van maximaal {socket:tesla_destination:output}" + }, + "power-output-12": { + "mappings": { + "0": { + "then": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    levert een vermogen van maximaal 11 kw" + }, + "1": { + "then": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    levert een vermogen van maximaal 22 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    ?", + "render": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    levert een vermogen van maximaal {socket:tesla_destination:output}" + }, + "power-output-13": { + "mappings": { + "0": { + "then": "
    USB om GSMs en kleine electronica op te laden
    levert een vermogen van maximaal 5w" + }, + "1": { + "then": "
    USB om GSMs en kleine electronica op te laden
    levert een vermogen van maximaal 10w" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    USB om GSMs en kleine electronica op te laden
    ?", + "render": "
    USB om GSMs en kleine electronica op te laden
    levert een vermogen van maximaal {socket:USB-A:output}" + }, + "power-output-14": { + "question": "Welk vermogen levert een enkele stekker van type
    Bosch Active Connect met 3 pinnen aan een kabel
    ?", + "render": "
    Bosch Active Connect met 3 pinnen aan een kabel
    levert een vermogen van maximaal {socket:bosch_3pin:output}" + }, + "power-output-15": { + "question": "Welk vermogen levert een enkele stekker van type
    Bosch Active Connect met 5 pinnen aan een kabel
    ?", + "render": "
    Bosch Active Connect met 5 pinnen aan een kabel
    levert een vermogen van maximaal {socket:bosch_5pin:output}" + }, + "power-output-2": { + "mappings": { + "0": { + "then": "
    Chademo
    levert een vermogen van maximaal 50 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Chademo
    ?", + "render": "
    Chademo
    levert een vermogen van maximaal {socket:chademo:output}" + }, + "power-output-3": { + "mappings": { + "0": { + "then": "
    Type 1 met kabel (J1772)
    levert een vermogen van maximaal 3.7 kw" + }, + "1": { + "then": "
    Type 1 met kabel (J1772)
    levert een vermogen van maximaal 7 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Type 1 met kabel (J1772)
    ?", + "render": "
    Type 1 met kabel (J1772)
    levert een vermogen van maximaal {socket:type1_cable:output}" + }, + "power-output-4": { + "mappings": { + "0": { + "then": "
    Type 1 zonder kabel (J1772)
    levert een vermogen van maximaal 3.7 kw" + }, + "1": { + "then": "
    Type 1 zonder kabel (J1772)
    levert een vermogen van maximaal 6.6 kw" + }, + "2": { + "then": "
    Type 1 zonder kabel (J1772)
    levert een vermogen van maximaal 7 kw" + }, + "3": { + "then": "
    Type 1 zonder kabel (J1772)
    levert een vermogen van maximaal 7.2 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Type 1 zonder kabel (J1772)
    ?", + "render": "
    Type 1 zonder kabel (J1772)
    levert een vermogen van maximaal {socket:type1:output}" + }, + "power-output-5": { + "mappings": { + "0": { + "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    levert een vermogen van maximaal 50 kw" + }, + "1": { + "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    levert een vermogen van maximaal 62.5 kw" + }, + "2": { + "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    levert een vermogen van maximaal 150 kw" + }, + "3": { + "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    levert een vermogen van maximaal 350 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Type 1 CCS (ook gekend als Type 1 Combo)
    ?", + "render": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    levert een vermogen van maximaal {socket:type1_combo:output}" + }, + "power-output-6": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger
    levert een vermogen van maximaal 120 kw" + }, + "1": { + "then": "
    Tesla Supercharger
    levert een vermogen van maximaal 150 kw" + }, + "2": { + "then": "
    Tesla Supercharger
    levert een vermogen van maximaal 250 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Tesla Supercharger
    ?", + "render": "
    Tesla Supercharger
    levert een vermogen van maximaal {socket:tesla_supercharger:output}" + }, + "power-output-7": { + "mappings": { + "0": { + "then": "
    Type 2 (mennekes)
    levert een vermogen van maximaal 11 kw" + }, + "1": { + "then": "
    Type 2 (mennekes)
    levert een vermogen van maximaal 22 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Type 2 (mennekes)
    ?", + "render": "
    Type 2 (mennekes)
    levert een vermogen van maximaal {socket:type2:output}" + }, + "power-output-8": { + "mappings": { + "0": { + "then": "
    Type 2 CCS (mennekes)
    levert een vermogen van maximaal 50 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Type 2 CCS (mennekes)
    ?", + "render": "
    Type 2 CCS (mennekes)
    levert een vermogen van maximaal {socket:type2_combo:output}" + }, + "power-output-9": { + "mappings": { + "0": { + "then": "
    Type 2 met kabel (J1772)
    levert een vermogen van maximaal 11 kw" + }, + "1": { + "then": "
    Type 2 met kabel (J1772)
    levert een vermogen van maximaal 22 kw" + } + }, + "question": "Welk vermogen levert een enkele stekker van type
    Type 2 met kabel (J1772)
    ?", + "render": "
    Type 2 met kabel (J1772)
    levert een vermogen van maximaal {socket:type2_cable:output}" + }, + "questions": { + "render": "

    Technische vragen

    De vragen hieronder zijn erg technisch - sla deze over indien je hier geen tijd voor hebt
    {questions}" + }, + "ref": { + "question": "Wat is het referentienummer van dit oplaadstation?", + "render": "Het referentienummer van dit oplaadpunt is {ref}" + }, + "voltage-0": { + "mappings": { + "0": { + "then": "
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    heeft een spanning van 230 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    ", + "render": "
    Schuko stekker zonder aardingspin (CEE7/4 type F)
    heeft een spanning van {socket:schuko:voltage} volt" + }, + "voltage-1": { + "mappings": { + "0": { + "then": "
    Europese stekker met aardingspin (CEE7/4 type E)
    heeft een spanning van 230 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Europese stekker met aardingspin (CEE7/4 type E)
    ", + "render": "
    Europese stekker met aardingspin (CEE7/4 type E)
    heeft een spanning van {socket:typee:voltage} volt" + }, + "voltage-10": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    heeft een spanning van 500 volt" + }, + "1": { + "then": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    heeft een spanning van 920 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    ", + "render": "
    Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
    heeft een spanning van {socket:tesla_supercharger_ccs:voltage} volt" + }, + "voltage-11": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger (destination)
    heeft een spanning van 480 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Tesla Supercharger (destination)
    ", + "render": "
    Tesla Supercharger (destination)
    heeft een spanning van {socket:tesla_destination:voltage} volt" + }, + "voltage-12": { + "mappings": { + "0": { + "then": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    heeft een spanning van 230 volt" + }, + "1": { + "then": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    heeft een spanning van 400 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    ", + "render": "
    Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
    heeft een spanning van {socket:tesla_destination:voltage} volt" + }, + "voltage-13": { + "mappings": { + "0": { + "then": "
    USB om GSMs en kleine electronica op te laden
    heeft een spanning van 5 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    USB om GSMs en kleine electronica op te laden
    ", + "render": "
    USB om GSMs en kleine electronica op te laden
    heeft een spanning van {socket:USB-A:voltage} volt" + }, + "voltage-14": { + "question": "Welke spanning levert de stekker van type
    Bosch Active Connect met 3 pinnen aan een kabel
    ", + "render": "
    Bosch Active Connect met 3 pinnen aan een kabel
    heeft een spanning van {socket:bosch_3pin:voltage} volt" + }, + "voltage-15": { + "question": "Welke spanning levert de stekker van type
    Bosch Active Connect met 5 pinnen aan een kabel
    ", + "render": "
    Bosch Active Connect met 5 pinnen aan een kabel
    heeft een spanning van {socket:bosch_5pin:voltage} volt" + }, + "voltage-2": { + "mappings": { + "0": { + "then": "
    Chademo
    heeft een spanning van 500 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Chademo
    ", + "render": "
    Chademo
    heeft een spanning van {socket:chademo:voltage} volt" + }, + "voltage-3": { + "mappings": { + "0": { + "then": "
    Type 1 met kabel (J1772)
    heeft een spanning van 200 volt" + }, + "1": { + "then": "
    Type 1 met kabel (J1772)
    heeft een spanning van 240 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Type 1 met kabel (J1772)
    ", + "render": "
    Type 1 met kabel (J1772)
    heeft een spanning van {socket:type1_cable:voltage} volt" + }, + "voltage-4": { + "mappings": { + "0": { + "then": "
    Type 1 zonder kabel (J1772)
    heeft een spanning van 200 volt" + }, + "1": { + "then": "
    Type 1 zonder kabel (J1772)
    heeft een spanning van 240 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Type 1 zonder kabel (J1772)
    ", + "render": "
    Type 1 zonder kabel (J1772)
    heeft een spanning van {socket:type1:voltage} volt" + }, + "voltage-5": { + "mappings": { + "0": { + "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    heeft een spanning van 400 volt" + }, + "1": { + "then": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    heeft een spanning van 1000 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Type 1 CCS (ook gekend als Type 1 Combo)
    ", + "render": "
    Type 1 CCS (ook gekend als Type 1 Combo)
    heeft een spanning van {socket:type1_combo:voltage} volt" + }, + "voltage-6": { + "mappings": { + "0": { + "then": "
    Tesla Supercharger
    heeft een spanning van 480 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Tesla Supercharger
    ", + "render": "
    Tesla Supercharger
    heeft een spanning van {socket:tesla_supercharger:voltage} volt" + }, + "voltage-7": { + "mappings": { + "0": { + "then": "
    Type 2 (mennekes)
    heeft een spanning van 230 volt" + }, + "1": { + "then": "
    Type 2 (mennekes)
    heeft een spanning van 400 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Type 2 (mennekes)
    ", + "render": "
    Type 2 (mennekes)
    heeft een spanning van {socket:type2:voltage} volt" + }, + "voltage-8": { + "mappings": { + "0": { + "then": "
    Type 2 CCS (mennekes)
    heeft een spanning van 500 volt" + }, + "1": { + "then": "
    Type 2 CCS (mennekes)
    heeft een spanning van 920 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Type 2 CCS (mennekes)
    ", + "render": "
    Type 2 CCS (mennekes)
    heeft een spanning van {socket:type2_combo:voltage} volt" + }, + "voltage-9": { + "mappings": { + "0": { + "then": "
    Type 2 met kabel (J1772)
    heeft een spanning van 230 volt" + }, + "1": { + "then": "
    Type 2 met kabel (J1772)
    heeft een spanning van 400 volt" + } + }, + "question": "Welke spanning levert de stekker van type
    Type 2 met kabel (J1772)
    ", + "render": "
    Type 2 met kabel (J1772)
    heeft een spanning van {socket:type2_cable:voltage} volt" + }, + "website": { + "question": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?", + "render": "Meer informatie op {website}" + } + }, + "title": { + "render": "Oplaadpunten" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " minuten", + "humanSingular": " minuut" + }, + "1": { + "human": " uren", + "humanSingular": " uur" + }, + "2": { + "human": " day", + "humanSingular": " dag" + } + } + }, + "1": { + "applicableUnits": { + "0": { + "human": "volt" + } + } + }, + "2": { + "applicableUnits": { + "0": { + "human": "A" + } + } + }, + "3": { + "applicableUnits": { + "0": { + "human": "kilowatt" + }, + "1": { + "human": "megawatt" + } + } + } + } + }, + "crossings": { + "description": "Oversteekplaatsen voor voetgangers en fietsers", + "name": "Oversteekplaatsen", + "presets": { + "0": { + "description": "Oversteekplaats voor voetgangers en/of fietsers", + "title": "Oversteekplaats" + }, + "1": { + "description": "Verkeerslicht op een weg", + "title": "Verkeerslicht" + } + }, + "tagRenderings": { + "crossing-bicycle-allowed": { + "mappings": { + "0": { + "then": "Een fietser kan deze oversteekplaats gebruiken" + }, + "1": { + "then": "Een fietser kan deze oversteekplaats niet gebruiken" + } + }, + "question": "Is deze oversteekplaats ook voor fietsers" + }, + "crossing-button": { + "mappings": { + "0": { + "then": "Dit verkeerslicht heeft een knop voor groen licht" + }, + "1": { + "then": "Dit verkeerlicht heeft geen knop voor groen licht" + } + }, + "question": "Heeft dit verkeerslicht een knop voor groen licht?" + }, + "crossing-continue-through-red": { + "mappings": { + "0": { + "then": "Een fietser mag wel rechtdoor gaan als het licht rood is " + }, + "1": { + "then": "Een fietser mag wel rechtdoor gaan als het licht rood is" + }, + "2": { + "then": "Een fietser mag niet rechtdoor gaan als het licht rood is" + } + }, + "question": "Mag een fietser rechtdoor gaan als het licht rood is?" + }, + "crossing-has-island": { + "mappings": { + "0": { + "then": "Deze oversteekplaats heeft een verkeerseiland in het midden" + }, + "1": { + "then": "Deze oversteekplaats heeft geen verkeerseiland in het midden" + } + }, + "question": "Heeft deze oversteekplaats een verkeerseiland in het midden?" + }, + "crossing-is-zebra": { + "mappings": { + "0": { + "then": "Dit is een zebrapad" + }, + "1": { + "then": "Dit is geen zebrapad" + } + }, + "question": "Is dit een zebrapad?" + }, + "crossing-right-turn-through-red": { + "mappings": { + "0": { + "then": "Een fietser mag wel rechtsaf slaan als het licht rood is " + }, + "1": { + "then": "Een fietser mag wel rechtsaf slaan als het licht rood is" + }, + "2": { + "then": "Een fietser mag niet rechtsaf slaan als het licht rood is" + } + }, + "question": "Mag een fietser rechtsaf slaan als het licht rood is?" + }, + "crossing-tactile": { + "mappings": { + "0": { + "then": "Deze oversteekplaats heeft een geleidelijn" + }, + "1": { + "then": "Deze oversteekplaats heeft geen geleidelijn" + }, + "2": { + "then": "Deze oversteekplaats heeft een geleidelijn, die incorrect is." + } + }, + "question": "Heeft deze oversteekplaats een geleidelijn?" + }, + "crossing-type": { + "mappings": { + "0": { + "then": "Oversteekplaats, zonder verkeerslichten" + }, + "1": { + "then": "Oversteekplaats met verkeerslichten" + }, + "2": { + "then": "Zebrapad" + } + }, + "question": "Wat voor oversteekplaats is dit?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Verkeerslicht" + }, + "1": { + "then": "Oversteektplaats met verkeerslichten" + } + }, + "render": "Oversteekplaats" + } + }, + "cycleways_and_roads": { + "name": "Fietspaden, straten en wegen", + "tagRenderings": { + "Cycleway type for a road": { + "mappings": { + "0": { + "then": "Er is een fietssuggestiestrook" + }, + "1": { + "then": "Er is een fietspad aangrenzend aan de weg (gescheiden met verf)" + }, + "2": { + "then": "Er is een fietspad (los van de weg), maar geen fietspad afzonderlijk getekend naast deze weg." + }, + "3": { + "then": "Er is een apart getekend fietspad." + }, + "4": { + "then": "Er is geen fietspad aanwezig" + }, + "5": { + "then": "Er is geen fietspad aanwezig" + } + }, + "question": "Wat voor fietspad is hier?" + }, + "Cycleway:smoothness": { + "mappings": { + "0": { + "then": "Geschikt voor fijne rollers: rollerblade, skateboard" + }, + "1": { + "then": "Geschikt voor fijne wielen: racefiets" + }, + "2": { + "then": "Geschikt voor normale wielen: stadsfiets, rolstoel, scooter" + }, + "3": { + "then": "Geschikt voor brede wielen: trekfiets, auto, rickshaw" + }, + "4": { + "then": "Geschikt voor voertuigen met hoge banden: lichte terreinwagen" + }, + "5": { + "then": "Geschikt voor terreinwagens: zware terreinwagen" + }, + "6": { + "then": "Geschikt voor gespecialiseerde terreinwagens: tractor, alleterreinwagen" + }, + "7": { + "then": "Niet geschikt voor voertuigen met wielen" + } + }, + "question": "Wat is de kwaliteit van dit fietspad?" + }, + "Cycleway:surface": { + "mappings": { + "0": { + "then": "Dit fietspad is onverhard" + }, + "1": { + "then": "Dit fietspad is geplaveid" + }, + "2": { + "then": "Dit fietspad is gemaakt van asfalt" + }, + "3": { + "then": "Dit fietspad is gemaakt van straatstenen" + }, + "4": { + "then": "Dit fietspad is gemaakt van beton" + }, + "5": { + "then": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)" + }, + "6": { + "then": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien" + }, + "7": { + "then": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien" + }, + "8": { + "then": "Dit fietspad is gemaakt van hout" + }, + "9": { + "then": "Dit fietspad is gemaakt van grind" + }, + "10": { + "then": "Dit fietspad is gemaakt van fijn grind" + }, + "11": { + "then": "Dit fietspad is gemaakt van kiezelsteentjes" + }, + "12": { + "then": "Dit fietspad is gemaakt van aarde" + } + }, + "question": "Waaruit is het oppervlak van het fietspad van gemaakt?", + "render": "Dit fietspad is gemaakt van {cycleway:surface}" + }, + "Is this a cyclestreet? (For a road)": { + "mappings": { + "0": { + "then": "Dit is een fietsstraat, en dus een 30km/h zone" + }, + "1": { + "then": "Dit is een fietsstraat" + }, + "2": { + "then": "Dit is geen fietsstraat" + } + }, + "question": "Is dit een fietsstraat?" + }, + "Maxspeed (for road)": { + "mappings": { + "0": { + "then": "De maximumsnelheid is 20 km/u" + }, + "1": { + "then": "De maximumsnelheid is 30 km/u" + }, + "2": { + "then": "De maximumsnelheid is 50 km/u" + }, + "3": { + "then": "De maximumsnelheid is 70 km/u" + }, + "4": { + "then": "De maximumsnelheid is 90 km/u" + } + }, + "question": "Wat is de maximumsnelheid in deze straat?", + "render": "De maximumsnelheid op deze weg is {maxspeed} km/u" + }, + "Surface of the road": { + "mappings": { + "0": { + "then": "Dit fietspad is onverhard" + }, + "1": { + "then": "Dit fietspad is geplaveid" + }, + "2": { + "then": "Dit fietspad is gemaakt van asfalt" + }, + "3": { + "then": "Dit fietspad is gemaakt van straatstenen" + }, + "4": { + "then": "Dit fietspad is gemaakt van beton" + }, + "5": { + "then": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)" + }, + "6": { + "then": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien" + }, + "7": { + "then": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien" + }, + "8": { + "then": "Dit fietspad is gemaakt van hout" + }, + "9": { + "then": "Dit fietspad is gemaakt van grind" + }, + "10": { + "then": "Dit fietspad is gemaakt van fijn grind" + }, + "11": { + "then": "Dit fietspad is gemaakt van kiezelsteentjes" + }, + "12": { + "then": "Dit fietspad is gemaakt van aarde" + } + }, + "question": "Waaruit is het oppervlak van de straat gemaakt?", + "render": "Deze weg is gemaakt van {surface}" + }, + "Surface of the street": { + "question": "Wat is de kwaliteit van deze straat?" + }, + "cyclelan-segregation": { + "mappings": { + "0": { + "then": "Dit fietspad is gescheiden van de weg met een onderbroken streep" + }, + "1": { + "then": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep" + }, + "2": { + "then": "Dit fietspad is gescheiden van de weg met parkeervakken" + }, + "3": { + "then": "Dit fietspad is gescheiden van de weg met een stoeprand" + } + }, + "question": "Hoe is dit fietspad gescheiden van de weg?" + }, + "cycleway-lane-track-traffic-signs": { + "mappings": { + "0": { + "then": "Verplicht fietspad " + }, + "1": { + "then": "Verplicht fietspad (met onderbord)
    " + }, + "2": { + "then": "Afgescheiden voet-/fietspad " + }, + "3": { + "then": "Gedeeld voet-/fietspad " + }, + "4": { + "then": "Geen verkeersbord aanwezig" + } + }, + "question": "Welk verkeersbord heeft dit fietspad?" + }, + "cycleway-segregation": { + "mappings": { + "0": { + "then": "Dit fietspad is gescheiden van de weg met een onderbroken streep" + }, + "1": { + "then": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep" + }, + "2": { + "then": "Dit fietspad is gescheiden van de weg met parkeervakken" + }, + "3": { + "then": "Dit fietspad is gescheiden van de weg met een stoeprand" + } + }, + "question": "Hoe is dit fietspad gescheiden van de weg?" + }, + "cycleway-traffic-signs": { + "mappings": { + "0": { + "then": "Verplicht fietspad " + }, + "1": { + "then": "Verplicht fietspad (met onderbord)
    " + }, + "2": { + "then": "Afgescheiden voet-/fietspad " + }, + "3": { + "then": "Gedeeld voet-/fietspad " + }, + "4": { + "then": "Geen verkeersbord aanwezig" + } + }, + "question": "Welk verkeersbord heeft dit fietspad?" + }, + "cycleway-traffic-signs-D7-supplementary": { + "mappings": { + "0": { + "then": "" + }, + "1": { + "then": "" + }, + "2": { + "then": "" + }, + "3": { + "then": "" + }, + "4": { + "then": "" + }, + "5": { + "then": "" + }, + "6": { + "then": "Geen onderbord aanwezig" + } + }, + "question": "Heeft het verkeersbord D7 () een onderbord?" + }, + "cycleway-traffic-signs-supplementary": { + "mappings": { + "0": { + "then": "" + }, + "1": { + "then": "" + }, + "2": { + "then": "" + }, + "3": { + "then": "" + }, + "4": { + "then": "" + }, + "5": { + "then": "" + }, + "6": { + "then": "Geen onderbord aanwezig" + } + }, + "question": "Heeft het verkeersbord D7 () een onderbord?" + }, + "cycleways_and_roads-cycleway:buffer": { + "question": "Hoe breed is de ruimte tussen het fietspad en de weg?", + "render": "De schrikafstand van dit fietspad is {cycleway:buffer} m" + }, + "is lit?": { + "mappings": { + "0": { + "then": "Deze weg is verlicht" + }, + "1": { + "then": "Deze weg is niet verlicht" + }, + "2": { + "then": "Deze weg is 's nachts verlicht" + }, + "3": { + "then": "Deze weg is 24/7 verlicht" + } + }, + "question": "Is deze weg verlicht?" + }, + "width:carriageway": { + "question": "Hoe breed is de rijbaan in deze straat (in meters)?
    Dit is
    Meet dit van stoepsteen tot stoepsteen, dus inclusief een parallelle parkeerstrook", + "render": "De breedte van deze rijbaan in deze straat is {width:carriageway}m" + } + }, + "title": { + "mappings": { + "0": { + "then": "Fietsweg" + }, + "1": { + "then": "Fietssuggestiestrook" + }, + "2": { + "then": "Fietsstrook" + }, + "3": { + "then": "Fietsweg naast de weg" + }, + "4": { + "then": "Fietsstraat" + } + }, + "render": "Fietspaden" + } + }, + "defibrillator": { + "name": "Defibrillatoren", + "presets": { + "0": { + "title": "Defibrillator" + } + }, + "tagRenderings": { + "defibrillator-access": { + "mappings": { + "0": { + "then": "Publiek toegankelijk" + }, + "1": { + "then": "Publiek toegankelijk" + }, + "2": { + "then": "Enkel toegankelijk voor klanten" + }, + "3": { + "then": "Niet toegankelijk voor het publiek (bv. enkel voor personeel, de eigenaar, ...)" + }, + "4": { + "then": "Niet toegankelijk, mogelijk enkel voor professionals" + } + }, + "question": "Is deze defibrillator vrij toegankelijk?", + "render": "Toegankelijkheid is {access}" + }, + "defibrillator-defibrillator": { + "mappings": { + "0": { + "then": "Er is geen info over het soort toestel" + }, + "1": { + "then": "Dit is een manueel toestel enkel voor professionals" + }, + "2": { + "then": "Dit is een gewone automatische defibrillator" + } + }, + "question": "Is dit een gewone automatische defibrillator of een manueel toestel enkel voor professionals?" + }, + "defibrillator-defibrillator:location": { + "question": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in de plaatselijke taal)", + "render": "Meer informatie over de locatie (lokale taal):
    {defibrillator:location}" + }, + "defibrillator-defibrillator:location:en": { + "question": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in het Engels)", + "render": "Meer informatie over de locatie (in het Engels):
    {defibrillator:location:en}" + }, + "defibrillator-defibrillator:location:fr": { + "question": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in het Frans)", + "render": "Meer informatie over de locatie (in het Frans):
    {defibrillator:location:fr}" + }, + "defibrillator-description": { + "question": "Is er nog iets bijzonder aan deze defibrillator dat je nog niet hebt kunnen meegeven? (laat leeg indien niet)", + "render": "Aanvullende info: {description}" + }, + "defibrillator-email": { + "question": "Wat is het email-adres voor vragen over deze defibrillator", + "render": "Email voor vragen over deze defibrillator: {email}" + }, + "defibrillator-fixme": { + "question": "Is er iets mis met de informatie over deze defibrillator dat je hier niet opgelost kreeg? (laat hier een berichtje achter voor OpenStreetMap experts)", + "render": "Extra informatie voor OpenStreetMap experts: {fixme}" + }, + "defibrillator-indoors": { + "mappings": { + "0": { + "then": "Deze defibrillator bevindt zich in een gebouw" + }, + "1": { + "then": "Deze defibrillator hangt buiten" + } + }, + "question": "Hangt deze defibrillator binnen of buiten?" + }, + "defibrillator-level": { + "mappings": { + "0": { + "then": "Deze defibrillator bevindt zich gelijkvloers" + }, + "1": { + "then": "Deze defibrillator is op de eerste verdieping" + } + }, + "question": "Op welke verdieping bevindt deze defibrillator zich?", + "render": "De defibrillator bevindt zicht op verdieping {level}" + }, + "defibrillator-opening_hours": { + "mappings": { + "0": { + "then": "24/7 open (inclusief feestdagen)" + } + }, + "question": "Wanneer is deze defibrillator beschikbaar?", + "render": "{opening_hours_table(opening_hours)}" + }, + "defibrillator-phone": { + "question": "Wat is het telefoonnummer voor vragen over deze defibrillator", + "render": "Telefoonnummer voor vragen over deze defibrillator: {phone}" + }, + "defibrillator-ref": { + "question": "Wat is het officieel identificatienummer van het toestel? (indien zichtbaar op toestel)", + "render": "Officieel identificatienummer van het toestel: {ref}" + }, + "defibrillator-survey:date": { + "mappings": { + "0": { + "then": "Vandaag nagekeken!" + } + }, + "question": "Wanneer is deze defibrillator het laatst gecontroleerd in OpenStreetMap?", + "render": "Deze defibrillator is nagekeken in OSM op {survey:date}" + } + }, + "title": { + "render": "Defibrillator" + } + }, + "direction": { + "description": "Deze laag toont de oriëntatie van een object", + "name": "Richtingsvisualisatie" + }, + "drinking_water": { + "name": "Drinkbaar water", + "presets": { + "0": { + "title": "drinkbaar water" + } + }, + "tagRenderings": { + "Bottle refill": { + "mappings": { + "0": { + "then": "Een drinkbus bijvullen gaat makkelijk" + }, + "1": { + "then": "Een drinkbus past moeilijk" + } + }, + "question": "Hoe gemakkelijk is het om drinkbussen bij te vullen?" + }, + "Still in use?": { + "mappings": { + "0": { + "then": "Deze drinkwaterfontein werkt" + }, + "1": { + "then": "Deze drinkwaterfontein is kapot" + }, + "2": { + "then": "Deze drinkwaterfontein is afgesloten" + } + }, + "question": "Is deze drinkwaterkraan nog steeds werkende?", + "render": "Deze waterkraan-status is {operational_status}" + }, + "render-closest-drinking-water": { + "render": "Er bevindt zich een ander drinkwaterpunt op {_closest_other_drinking_water_distance} meter" + } + }, + "title": { + "render": "Drinkbaar water" + } + }, + "etymology": { + "description": "Alle lagen met een gelinkt etymology", + "name": "Heeft etymology info", + "tagRenderings": { + "simple etymology": { + "mappings": { + "0": { + "then": "De oorsprong van deze naam is onbekend in de literatuur" + } + }, + "question": "Naar wat is dit object vernoemd?
    Dit staat mogelijks vermeld op het straatnaambordje", + "render": "Vernoemd naar {name:etymology}" + }, + "street-name-sign-image": { + "render": "{image_carousel(image:streetsign)}
    {image_upload(image:streetsign, Voeg afbeelding van straatnaambordje toe)}" + }, + "wikipedia-etymology": { + "question": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?", + "render": "

    Wikipedia artikel van de naamgever

    {wikipedia(name:etymology:wikidata):max-height:20rem}" + }, + "zoeken op inventaris onroerend erfgoed": { + "render": "Zoeken op inventaris onroerend erfgoed" + } + } + }, + "food": { + "filter": { + "0": { + "options": { + "0": { + "question": "Nu geopened" + } + } + }, + "1": { + "options": { + "0": { + "question": "Heeft een vegetarisch menu" + } + } + }, + "2": { + "options": { + "0": { + "question": "Heeft een veganistisch menu" + } + } + }, + "3": { + "options": { + "0": { + "question": "Heeft een halal menu" + } + } + } + }, + "name": "Eetgelegenheden", + "presets": { + "0": { + "description": "Een eetgegelegenheid waar je aan tafel wordt bediend", + "title": "restaurant" + }, + "1": { + "description": "Een zaak waar je snel bediend wordt, vaak met de focus op afhalen. Zitgelegenheid is eerder beperkt (of zelfs afwezig)", + "title": "fastfood-zaak" + }, + "2": { + "description": "Een fastfood-zaak waar je frieten koopt", + "title": "frituur" + } + }, + "tagRenderings": { + "Cuisine": { + "mappings": { + "0": { + "then": "Dit is een pizzeria" + }, + "1": { + "then": "Dit is een frituur" + }, + "2": { + "then": "Dit is een pastazaak" + }, + "3": { + "then": "Dit is een kebabzaak" + }, + "4": { + "then": "Dit is een broodjeszaak" + }, + "5": { + "then": "Dit is een hamburgerrestaurant" + }, + "6": { + "then": "Dit is een sushirestaurant" + }, + "7": { + "then": "Dit is een koffiezaak" + }, + "8": { + "then": "Dit is een Italiaans restaurant (dat meer dan enkel pasta of pizza verkoopt)" + }, + "9": { + "then": "Dit is een Frans restaurant" + }, + "10": { + "then": "Dit is een Chinees restaurant" + }, + "11": { + "then": "Dit is een Grieks restaurant" + }, + "12": { + "then": "Dit is een Indisch restaurant" + }, + "13": { + "then": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)" + }, + "14": { + "then": "Dit is een Thaïs restaurant" + } + }, + "question": "Welk soort gerechten worden hier geserveerd?", + "render": "Deze plaats serveert vooral {cuisine}" + }, + "Fastfood vs restaurant": { + "mappings": { + "0": { + "then": "Dit is een fastfood-zaak. De focus ligt op snelle bediening, zitplaatsen zijn vaak beperkt en functioneel" + }, + "1": { + "then": "Dit is een restaurant. De focus ligt op een aangename ervaring waar je aan tafel wordt bediend" + } + }, + "question": "Wat voor soort zaak is dit?" + }, + "Name": { + "question": "Wat is de naam van deze eetgelegenheid?", + "render": "De naam van deze eetgelegeheid is {name}" + }, + "Takeaway": { + "mappings": { + "0": { + "then": "Hier is enkel afhaal mogelijk" + }, + "1": { + "then": "Eten kan hier afgehaald worden" + }, + "2": { + "then": "Hier is geen afhaalmogelijkheid" + } + }, + "question": "Biedt deze zaak een afhaalmogelijkheid aan?" + }, + "Vegan (no friture)": { + "mappings": { + "0": { + "then": "Geen veganistische opties beschikbaar" + }, + "1": { + "then": "Beperkte veganistische opties zijn beschikbaar" + }, + "2": { + "then": "Veganistische opties zijn beschikbaar" + }, + "3": { + "then": "Enkel veganistische opties zijn beschikbaar" + } + }, + "question": "Heeft deze eetgelegenheid een veganistische optie?" + }, + "Vegetarian (no friture)": { + "mappings": { + "0": { + "then": "Geen vegetarische opties beschikbaar" + }, + "1": { + "then": "Beperkte vegetarische opties zijn beschikbaar" + }, + "2": { + "then": "Vegetarische opties zijn beschikbaar" + }, + "3": { + "then": "Enkel vegetarische opties zijn beschikbaar" + } + }, + "question": "Heeft deze eetgelegenheid een vegetarische optie?" + }, + "friture-oil": { + "mappings": { + "0": { + "then": "Plantaardige olie" + }, + "1": { + "then": "Dierlijk vet" + } + }, + "question": "Bakt deze frituur met dierlijk vet of met plantaardige olie?" + }, + "friture-take-your-container": { + "mappings": { + "0": { + "then": "Je mag je eigen containers meenemen om je bestelling in mee te nemen en zo minder afval te maken" + }, + "1": { + "then": "Je mag geen eigen containers meenemen om je bestelling in mee te nemen" + }, + "2": { + "then": "Je moet je eigen containers meenemen om je bestelling in mee te nemen." + } + }, + "question": "Als je je eigen container (bv. kookpot of kleine potjes voor saus) meeneemt, gebruikt de frituur deze dan om je bestelling in te doen?" + }, + "friture-vegan": { + "mappings": { + "0": { + "then": "Er zijn veganistische snacks aanwezig" + }, + "1": { + "then": "Slechts enkele veganistische snacks" + }, + "2": { + "then": "Geen veganistische snacks beschikbaar" + } + }, + "question": "Heeft deze frituur veganistische snacks?" + }, + "friture-vegetarian": { + "mappings": { + "0": { + "then": "Er zijn vegetarische snacks aanwezig" + }, + "1": { + "then": "Slechts enkele vegetarische snacks" + }, + "2": { + "then": "Geen vegetarische snacks beschikbaar" + } + }, + "question": "Heeft deze frituur vegetarische snacks?" + }, + "halal (no friture)": { + "mappings": { + "0": { + "then": "Er zijn geen halal opties aanwezig" + }, + "1": { + "then": "Er zijn een beperkt aantal halal opties" + }, + "2": { + "then": "Halal menu verkrijgbaar" + }, + "3": { + "then": "Enkel halal opties zijn beschikbaar" + } + }, + "question": "Heeft dit restaurant halal opties?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Restaurant {name}" + }, + "1": { + "then": "Fastfood-zaak {name}" + } + }, + "render": "Eetgelegenheid" + } + }, + "ghost_bike": { + "name": "Witte Fietsen", + "presets": { + "0": { + "title": "Witte fiets" + } + }, + "tagRenderings": { + "ghost-bike-explanation": { + "render": "Een Witte Fiets (of Spookfiets) is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat over een witgeschilderde fiets die geplaatst werd in de buurt van het ongeval." + }, + "ghost_bike-inscription": { + "question": "Wat is het opschrift op deze witte fiets?", + "render": "{inscription}" + }, + "ghost_bike-name": { + "mappings": { + "0": { + "then": "De naam is niet aangeduid op de fiets" + } + }, + "question": "Aan wie is deze witte fiets een eerbetoon?
    Respecteer privacy - voeg enkel een naam toe indien die op de fiets staat of gepubliceerd is. Eventueel voeg je enkel de voornaam toe.
    ", + "render": "Ter nagedachtenis van {name}" + }, + "ghost_bike-source": { + "question": "Op welke website kan men meer informatie vinden over de Witte fiets of over het ongeval?", + "render": "Meer informatie" + }, + "ghost_bike-start_date": { + "question": "Wanneer werd deze witte fiets geplaatst?", + "render": "Geplaatst op {start_date}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Witte fiets ter nagedachtenis van {name}" + } + }, + "render": "Witte Fiets" + } + }, + "grass_in_parks": { + "name": "Toegankelijke grasvelden in parken", + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Speelweide in een park" + } + }, + "information_board": { + "name": "Informatieborden", + "presets": { + "0": { + "title": "informatiebord" + } + }, + "title": { + "render": "Informatiebord" + } + }, + "map": { + "description": "Een permantent geinstalleerde kaart", + "name": "Kaarten", + "presets": { + "0": { + "description": "Voeg een ontbrekende kaart toe", + "title": "Kaart" + } + }, + "tagRenderings": { + "map-attribution": { + "mappings": { + "0": { + "then": "De OpenStreetMap-attributie is duidelijk aangegeven, zelf met vermelding van \"ODBL\" " + }, + "1": { + "then": "OpenStreetMap is duidelijk aangegeven, maar de licentievermelding ontbreekt" + }, + "2": { + "then": "OpenStreetMap was oorspronkelijk niet aangeduid, maar iemand plaatste er een sticker" + }, + "3": { + "then": "Er is geen attributie" + }, + "4": { + "then": "Er is geen attributie" + } + }, + "question": "Is de attributie voor OpenStreetMap aanwezig?" + }, + "map-map_source": { + "mappings": { + "0": { + "then": "Deze kaart is gebaseerd op OpenStreetMap" + } + }, + "question": "Op welke data is deze kaart gebaseerd?", + "render": "Deze kaart is gebaseerd op {map_source}" + } + }, + "title": { + "render": "Kaart" + } + }, + "nature_reserve": { + "description": "Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid.", + "filter": { + "0": { + "options": { + "0": { + "question": "Vrij te bezoeken" + } + } + }, + "1": { + "options": { + "0": { + "question": "Alle natuurgebieden" + }, + "1": { + "question": "Honden mogen vrij rondlopen" + }, + "2": { + "question": "Honden welkom aan de leiband" + } + } + } + }, + "name": "Natuurgebied", + "presets": { + "0": { + "description": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt", + "title": "natuurreservaat" + } + }, + "tagRenderings": { + "Access tag": { + "mappings": { + "0": { + "then": "Vrij toegankelijk" + }, + "1": { + "then": "Niet toegankelijk" + }, + "2": { + "then": "Niet toegankelijk, want privégebied" + }, + "3": { + "then": "Toegankelijk, ondanks dat het privegebied is" + }, + "4": { + "then": "Enkel toegankelijk met een gids of tijdens een activiteit" + }, + "5": { + "then": "Toegankelijk mits betaling" + } + }, + "question": "Is dit gebied toegankelijk?", + "render": "De toegankelijkheid van dit gebied is: {access:description}" + }, + "Curator": { + "question": "Wie is de conservator van dit gebied?
    Respecteer privacy - geef deze naam enkel als die duidelijk is gepubliceerd", + "render": "{curator} is de beheerder van dit gebied" + }, + "Dogs?": { + "mappings": { + "0": { + "then": "Honden moeten aan de leiband" + }, + "1": { + "then": "Honden zijn niet toegestaan" + }, + "2": { + "then": "Honden zijn welkom en mogen vrij rondlopen" + } + }, + "question": "Zijn honden toegelaten in dit gebied?" + }, + "Editable description": { + "render": "Extra info: {description:0}" + }, + "Email": { + "question": "Waar kan men naartoe emailen voor vragen en meldingen van dit natuurgebied?
    Respecteer privacy - geef enkel persoonlijke emailadressen als deze elders zijn gepubliceerd", + "render": "{email}" + }, + "Name tag": { + "mappings": { + "0": { + "then": "Dit gebied heeft geen naam" + } + }, + "question": "Wat is de naam van dit gebied?", + "render": "Dit gebied heet {name}" + }, + "Name:nl-tag": { + "question": "Wat is de Nederlandstalige naam van dit gebied?", + "render": "Dit gebied heet {name:nl}" + }, + "Non-editable description": { + "render": "Extra info: {description}" + }, + "Operator tag": { + "mappings": { + "0": { + "then": "Dit gebied wordt beheerd door Natuurpunt" + }, + "1": { + "then": "Dit gebied wordt beheerd door {operator}" + }, + "2": { + "then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos" + } + }, + "question": "Wie beheert dit gebied?", + "render": "Beheer door {operator}" + }, + "Surface area": { + "render": "Totale oppervlakte: {_surface:ha}Ha" + }, + "Website": { + "question": "Op welke webpagina kan men meer informatie vinden over dit natuurgebied?" + }, + "phone": { + "question": "Waar kan men naartoe bellen voor vragen en meldingen van dit natuurgebied?
    Respecteer privacy - geef enkel persoonlijke telefoonnummers als deze elders zijn gepubliceerd", + "render": "{phone}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name:nl}" + }, + "1": { + "then": "{name}" + } + }, + "render": "Natuurgebied" + } + }, + "observation_tower": { + "description": "Torens om van het uitzicht te genieten", + "name": "Uitkijktorens", + "presets": { + "0": { + "description": "Een publiek toegankelijke uitkijktoren", + "title": "Uitkijktoren" + } + }, + "tagRenderings": { + "Fee": { + "mappings": { + "0": { + "then": "Gratis te bezoeken" + } + }, + "question": "Hoeveel moet men betalen om deze toren te bezoeken?", + "render": "Deze toren bezoeken kost {charge}" + }, + "Height": { + "question": "Hoe hoog is deze toren?", + "render": "Deze toren is {height} hoog" + }, + "Operator": { + "question": "Wie onderhoudt deze toren?", + "render": "Wordt onderhouden door {operator}" + }, + "name": { + "mappings": { + "0": { + "then": "Deze toren heeft geen specifieke naam" + } + }, + "question": "Heeft deze toren een naam?", + "render": "Deze toren heet {name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Uitkijktoren" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " meter" + } + } + } + } + }, + "parking": { + "description": "Deze laag toont autoparkings", + "name": "Parking", + "presets": { + "0": { + "title": "parking voor auto's" + } + }, + "title": { + "render": "Parking voor auto's" + } + }, + "picnic_table": { + "description": "Deze laag toont picnictafels", + "name": "Picnictafels", + "presets": { + "0": { + "title": "picnic-tafel" + } + }, + "tagRenderings": { + "picnic_table-material": { + "mappings": { + "0": { + "then": "Deze picnictafel is gemaakt uit hout" + }, + "1": { + "then": "Deze picnictafel is gemaakt uit beton" + } + }, + "question": "Van welk materiaal is deze picnictafel gemaakt?", + "render": "Deze picnictafel is gemaakt van {material}" + } + }, + "title": { + "render": "Picnictafel" + } + }, + "play_forest": { + "description": "Een speelbos is een vrij toegankelijke zone in een bos", + "name": "Speelbossen", + "title": { + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "Speelbos {name}" + } + }, + "render": "Speelbos" + } + }, + "playground": { + "description": "Speeltuinen", + "name": "Speeltuinen", + "presets": { + "0": { + "title": "Speeltuin" + } + }, + "tagRenderings": { + "Playground-wheelchair": { + "mappings": { + "0": { + "then": "Geheel toegankelijk voor rolstoelgebruikers" + }, + "1": { + "then": "Beperkt toegankelijk voor rolstoelgebruikers" + }, + "2": { + "then": "Niet toegankelijk voor rolstoelgebruikers" + } + }, + "question": "Is deze speeltuin toegankelijk voor rolstoelgebruikers?" + }, + "playground-access": { + "mappings": { + "0": { + "then": "Vrij toegankelijk voor het publiek" + }, + "1": { + "then": "Vrij toegankelijk voor het publiek" + }, + "2": { + "then": "Enkel toegankelijk voor klanten van de bijhorende zaak" + }, + "3": { + "then": "Vrij toegankelijk voor scholieren van de school" + }, + "4": { + "then": "Niet vrij toegankelijk" + } + }, + "question": "Is deze speeltuin vrij toegankelijk voor het publiek?" + }, + "playground-email": { + "question": "Wie kan men emailen indien er problemen zijn met de speeltuin?", + "render": "De bevoegde dienst kan bereikt worden via {email}" + }, + "playground-lit": { + "mappings": { + "0": { + "then": "Deze speeltuin is 's nachts verlicht" + }, + "1": { + "then": "Deze speeltuin is 's nachts niet verlicht" + } + }, + "question": "Is deze speeltuin 's nachts verlicht?" + }, + "playground-max_age": { + "question": "Wat is de maximaal toegestane leeftijd voor deze speeltuin?", + "render": "Toegankelijk tot {max_age}" + }, + "playground-min_age": { + "question": "Wat is de minimale leeftijd om op deze speeltuin te mogen?", + "render": "Toegankelijk vanaf {min_age} jaar oud" + }, + "playground-opening_hours": { + "mappings": { + "0": { + "then": "Van zonsopgang tot zonsondergang" + }, + "1": { + "then": "Dag en nacht toegankelijk" + }, + "2": { + "then": "Dag en nacht toegankelijk" + } + }, + "question": "Op welke uren is deze speeltuin toegankelijk?" + }, + "playground-operator": { + "question": "Wie beheert deze speeltuin?", + "render": "Beheer door {operator}" + }, + "playground-phone": { + "question": "Wie kan men bellen indien er problemen zijn met de speeltuin?", + "render": "De bevoegde dienst kan getelefoneerd worden via {phone}" + }, + "playground-surface": { + "mappings": { + "0": { + "then": "De ondergrond is gras" + }, + "1": { + "then": "De ondergrond is zand" + }, + "2": { + "then": "De ondergrond bestaat uit houtsnippers" + }, + "3": { + "then": "De ondergrond bestaat uit stoeptegels" + }, + "4": { + "then": "De ondergrond is asfalt" + }, + "5": { + "then": "De ondergrond is beton" + }, + "6": { + "then": "De ondergrond is onverhard" + }, + "7": { + "then": "De ondergrond is verhard" + } + }, + "question": "Wat is de ondergrond van deze speeltuin?
    Indien er verschillende ondergronden zijn, neem de meest voorkomende", + "render": "De ondergrond is {surface}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Speeltuin {name}" + } + }, + "render": "Speeltuin" + } + }, + "public_bookcase": { + "description": "Een straatkastje met boeken voor iedereen", + "filter": { + "2": { + "options": { + "0": { + "question": "Binnen of buiten" + } + } + } + }, + "name": "Boekenruilkastjes", + "presets": { + "0": { + "title": "Boekenruilkast" + } + }, + "tagRenderings": { + "bookcase-booktypes": { + "mappings": { + "0": { + "then": "Voornamelijk kinderboeken" + }, + "1": { + "then": "Voornamelijk boeken voor volwassenen" + }, + "2": { + "then": "Boeken voor zowel kinderen als volwassenen" + } + }, + "question": "Voor welke doelgroep zijn de meeste boeken in dit boekenruilkastje?" + }, + "bookcase-is-accessible": { + "mappings": { + "0": { + "then": "Publiek toegankelijk" + }, + "1": { + "then": "Enkel toegankelijk voor klanten" + } + }, + "question": "Is dit boekenruilkastje publiek toegankelijk?" + }, + "bookcase-is-indoors": { + "mappings": { + "0": { + "then": "Dit boekenruilkastje staat binnen" + }, + "1": { + "then": "Dit boekenruilkastje staat buiten" + }, + "2": { + "then": "Dit boekenruilkastje staat buiten" + } + }, + "question": "Staat dit boekenruilkastje binnen of buiten?" + }, + "public_bookcase-brand": { + "mappings": { + "0": { + "then": "Deel van het netwerk 'Little Free Library'" + }, + "1": { + "then": "Dit boekenruilkastje maakt geen deel uit van een netwerk" + } + }, + "question": "Is dit boekenruilkastje deel van een netwerk?", + "render": "Dit boekenruilkastje is deel van het netwerk {brand}" + }, + "public_bookcase-capacity": { + "question": "Hoeveel boeken passen er in dit boekenruilkastje?", + "render": "Er passen {capacity} boeken" + }, + "public_bookcase-name": { + "mappings": { + "0": { + "then": "Dit boekenruilkastje heeft geen naam" + } + }, + "question": "Wat is de naam van dit boekenuilkastje?", + "render": "De naam van dit boekenruilkastje is {name}" + }, + "public_bookcase-operator": { + "question": "Wie is verantwoordelijk voor dit boekenruilkastje?", + "render": "Onderhouden door {operator}" + }, + "public_bookcase-ref": { + "mappings": { + "0": { + "then": "Dit boekenruilkastje maakt geen deel uit van een netwerk" + } + }, + "question": "Wat is het referentienummer van dit boekenruilkastje?", + "render": "Het referentienummer binnen {brand} is {ref}" + }, + "public_bookcase-start_date": { + "question": "Op welke dag werd dit boekenruilkastje geinstalleerd?", + "render": "Geplaatst op {start_date}" + }, + "public_bookcase-website": { + "question": "Is er een website over dit boekenruilkastje?", + "render": "Meer info op de website" + } + }, + "title": { + "mappings": { + "0": { + "then": "Boekenruilkast {name}" + } + }, + "render": "Boekenruilkast" + } + }, + "shops": { + "description": "Een winkel", + "name": "Winkel", + "presets": { + "0": { + "description": "Voeg een nieuwe winkel toe", + "title": "Winkel" + } + }, + "tagRenderings": { + "shops-email": { + "question": "Wat is het e-mailadres van deze winkel?", + "render": "{email}" + }, + "shops-name": { + "question": "Wat is de naam van deze winkel?" + }, + "shops-opening_hours": { + "question": "Wat zijn de openingsuren van deze winkel?", + "render": "{opening_hours_table(opening_hours)}" + }, + "shops-phone": { + "question": "Wat is het telefoonnummer?", + "render": "{phone}" + }, + "shops-shop": { + "mappings": { + "0": { + "then": "Gemakswinkel" + }, + "1": { + "then": "Supermarkt" + }, + "2": { + "then": "Kledingwinkel" + }, + "3": { + "then": "Kapper" + }, + "4": { + "then": "Bakkerij" + }, + "5": { + "then": "Autogarage" + }, + "6": { + "then": "Autodealer" + } + } + }, + "shops-website": { + "question": "Wat is de website van deze winkel?" + } + }, + "title": { + "render": "Winkel" + } + }, + "slow_roads": { + "name": "Paadjes, trage wegen en autoluwe straten", + "tagRenderings": { + "explanation": { + "mappings": { + "1": { + "then": "Dit is een brede, autovrije straat" + }, + "2": { + "then": "Dit is een voetpaadje" + }, + "3": { + "then": "Dit is een wegeltje of bospad" + }, + "4": { + "then": "Dit is een ruiterswegel" + }, + "5": { + "then": "Dit is een tractorspoor of weg om landbouwgrond te bereikken" + } + } + }, + "slow_roads-surface": { + "mappings": { + "0": { + "then": "De ondergrond is gras" + }, + "1": { + "then": "De ondergrond is aarde" + }, + "2": { + "then": "De ondergrond is onverhard" + }, + "3": { + "then": "De ondergrond is zand" + }, + "4": { + "then": "De ondergrond bestaat uit stoeptegels" + }, + "5": { + "then": "De ondergrond is asfalt" + }, + "6": { + "then": "De ondergrond is beton" + }, + "7": { + "then": "De ondergrond is verhard" + } + }, + "question": "Wat is de wegverharding van dit pad?", + "render": "De ondergrond is {surface}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "Voetpad" + }, + "2": { + "then": "Fietspad" + }, + "3": { + "then": "Voetgangersstraat" + }, + "4": { + "then": "Woonerf" + } + }, + "render": "Trage weg" + } + }, + "sport_pitch": { + "description": "Een sportterrein", + "name": "Sportterrein", + "presets": { + "0": { + "title": "Ping-pong tafel" + }, + "1": { + "title": "Sportterrein" + } + }, + "tagRenderings": { + "sport-pitch-access": { + "mappings": { + "0": { + "then": "Publiek toegankelijk" + }, + "1": { + "then": "Beperkt toegankelijk (enkel na reservatie, tijdens bepaalde uren, ...)" + }, + "2": { + "then": "Enkel toegankelijk voor leden van de bijhorende sportclub" + }, + "3": { + "then": "Privaat en niet toegankelijk" + } + }, + "question": "Is dit sportterrein publiek toegankelijk?" + }, + "sport-pitch-reservation": { + "mappings": { + "0": { + "then": "Reserveren is verplicht om gebruik te maken van dit sportterrein" + }, + "1": { + "then": "Reserveren is sterk aangeraden om gebruik te maken van dit sportterrein" + }, + "2": { + "then": "Reserveren is mogelijk, maar geen voorwaarde" + }, + "3": { + "then": "Reserveren is niet mogelijk" + } + }, + "question": "Moet men reserveren om gebruik te maken van dit sportveld?" + }, + "sport_pitch-email": { + "question": "Wat is het email-adres van de bevoegde dienst of uitbater?" + }, + "sport_pitch-opening_hours": { + "mappings": { + "1": { + "then": "24/7 toegankelijk" + } + }, + "question": "Wanneer is dit sportveld toegankelijk?" + }, + "sport_pitch-phone": { + "question": "Wat is het telefoonnummer van de bevoegde dienst of uitbater?" + }, + "sport_pitch-sport": { + "mappings": { + "0": { + "then": "Hier kan men basketbal spelen" + }, + "1": { + "then": "Hier kan men voetbal spelen" + }, + "2": { + "then": "Dit is een pingpongtafel" + }, + "3": { + "then": "Hier kan men tennis spelen" + }, + "4": { + "then": "Hier kan men korfbal spelen" + }, + "5": { + "then": "Hier kan men basketbal beoefenen" + } + }, + "question": "Welke sporten kan men hier beoefenen?", + "render": "Hier kan men {sport} beoefenen" + }, + "sport_pitch-surface": { + "mappings": { + "0": { + "then": "De ondergrond is gras" + }, + "1": { + "then": "De ondergrond is zand" + }, + "2": { + "then": "De ondergrond bestaat uit stoeptegels" + }, + "3": { + "then": "De ondergrond is asfalt" + }, + "4": { + "then": "De ondergrond is beton" + } + }, + "question": "Wat is de ondergrond van dit sportveld?", + "render": "De ondergrond is {surface}" + } + }, + "title": { + "render": "Sportterrein" + } + }, + "street_lamps": { + "name": "Straatlantaarns", + "presets": { + "0": { + "title": "straatlantaarn" + } + }, + "tagRenderings": { + "colour": { + "mappings": { + "0": { + "then": "Deze lantaarn geeft wit licht" + }, + "1": { + "then": "Deze lantaarn geeft groen licht" + }, + "2": { + "then": "Deze lantaarn geeft oranje licht" + } + }, + "question": "Wat voor kleur licht geeft deze lantaarn?", + "render": "Deze lantaarn geeft {light:colour} licht" + }, + "count": { + "mappings": { + "0": { + "then": "Deze lantaarn heeft 1 lamp" + }, + "1": { + "then": "Deze lantaarn heeft 2 lampen" + } + }, + "question": "Hoeveel lampen heeft deze lantaarn?", + "render": "Deze lantaarn heeft {light:count} lampen" + }, + "direction": { + "question": "Waar is deze lamp heengericht?", + "render": "Deze lantaarn is gericht naar {light:direction}" + }, + "lamp_mount": { + "mappings": { + "0": { + "then": "Deze lantaarn zit boven op een rechte paal" + }, + "1": { + "then": "Deze lantaarn zit aan het eind van een gebogen paal" + } + }, + "question": "Hoe zit deze lantaarn aan de paal?" + }, + "lit": { + "mappings": { + "0": { + "then": "Deze lantaarn is 's nachts verlicht" + }, + "1": { + "then": "Deze lantaarn is 24/7 verlicht" + }, + "2": { + "then": "Deze lantaarn is verlicht op basis van beweging" + }, + "3": { + "then": "Deze lantaarn is verlicht op verzoek (bijv. met een drukknop)" + } + }, + "question": "Wanneer is deze lantaarn verlicht?" + }, + "method": { + "mappings": { + "0": { + "then": "Deze lantaarn is elektrisch verlicht" + }, + "1": { + "then": "Deze lantaarn gebruikt LEDs" + }, + "2": { + "then": "Deze lantaarn gebruikt gloeilampen" + }, + "3": { + "then": "Deze lantaarn gebruikt halogeen verlichting" + }, + "4": { + "then": "Deze lantaarn gebruikt gasontladingslampen (onbekend type)" + }, + "5": { + "then": "Deze lantaarn gebruikt een kwiklamp (enigszins blauwachtig)" + }, + "6": { + "then": "Deze lantaarn gebruikt metaalhalidelampen" + }, + "7": { + "then": "Deze lantaarn gebruikt fluorescentieverlichting (TL en spaarlamp)" + }, + "8": { + "then": "Deze lantaarn gebruikt natriumlampen (onbekend type)" + }, + "9": { + "then": "Deze lantaarn gebruikt lagedruknatriumlampen (monochroom oranje)" + }, + "10": { + "then": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)" + }, + "11": { + "then": "Deze lantaarn wordt verlicht met gas" + } + }, + "question": "Wat voor verlichting gebruikt deze lantaarn?" + }, + "ref": { + "question": "Wat is het nummer van deze straatlantaarn?", + "render": "Deze straatlantaarn heeft het nummer {ref}" + }, + "support": { + "mappings": { + "0": { + "then": "Deze lantaarn hangt aan kabels" + }, + "1": { + "then": "Deze lantaarn hangt aan een plafond" + }, + "2": { + "then": "Deze lantaarn zit in de grond" + }, + "3": { + "then": "Deze lantaarn zit op een korte paal (meestal < 1.5m)" + }, + "4": { + "then": "Deze lantaarn zit op een paal" + }, + "5": { + "then": "Deze lantaarn hangt direct aan de muur" + }, + "6": { + "then": "Deze lantaarn hangt aan de muur met een metalen balk" + } + }, + "question": "Hoe is deze straatlantaarn gemonteerd?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Straatlantaarn {ref}" + } + }, + "render": "Straatlantaarn" + } + }, + "surveillance_camera": { + "name": "Bewakingscamera's", + "tagRenderings": { + "Camera type: fixed; panning; dome": { + "mappings": { + "0": { + "then": "Een vaste camera" + }, + "1": { + "then": "Een dome (bolvormige camera die kan draaien)" + }, + "2": { + "then": "Een camera die (met een motor) van links naar rechts kan draaien" + } + }, + "question": "Wat voor soort camera is dit?" + }, + "Level": { + "question": "Op welke verdieping bevindt deze camera zich?", + "render": "Bevindt zich op verdieping {level}" + }, + "Operator": { + "question": "Wie beheert deze bewakingscamera?", + "render": "Beheer door {operator}" + }, + "Surveillance type: public, outdoor, indoor": { + "mappings": { + "0": { + "then": "Bewaking van de publieke ruilmte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel..." + }, + "1": { + "then": "Een buitenruimte met privaat karakter (zoals een privé-oprit, een parking, tankstation, ...)" + }, + "2": { + "then": "Een private binnenruimte wordt bewaakt, bv. een winkel, een parkeergarage, ..." + } + }, + "question": "Wat soort bewaking wordt hier uitgevoerd?" + }, + "Surveillance:zone": { + "mappings": { + "0": { + "then": "Bewaakt een parking" + }, + "1": { + "then": "Bewaakt het verkeer" + }, + "2": { + "then": "Bewaakt een ingang" + }, + "3": { + "then": "Bewaakt een gang" + }, + "4": { + "then": "Bewaakt een perron of bushalte" + }, + "5": { + "then": "Bewaakt een winkel" + } + }, + "question": "Wat wordt hier precies bewaakt?", + "render": "Bewaakt een {surveillance:zone}" + }, + "camera:mount": { + "mappings": { + "0": { + "then": "Deze camera hangt aan een muur" + }, + "1": { + "then": "Deze camera staat op een paal" + }, + "2": { + "then": "Deze camera hangt aan het plafond" + } + }, + "question": "Hoe is deze camera geplaatst?", + "render": "Montage: {camera:mount}" + }, + "camera_direction": { + "mappings": { + "0": { + "then": "Filmt in kompasrichting {direction}" + } + }, + "question": "In welke geografische richting filmt deze camera?", + "render": "Filmt in kompasrichting {camera:direction}" + }, + "is_indoor": { + "mappings": { + "0": { + "then": "Deze camera bevindt zich binnen" + }, + "1": { + "then": "Deze camera bevindt zich buiten" + }, + "2": { + "then": "Deze camera bevindt zich waarschijnlijk buiten" + } + }, + "question": "Bevindt de bewaakte publieke ruimte camera zich binnen of buiten?" + } + }, + "title": { + "render": "Bewakingscamera" + } + }, + "toilet": { + "filter": { + "0": { + "options": { + "0": { + "question": "Rolstoel toegankelijk" + } + } + }, + "1": { + "options": { + "0": { + "question": "Heeft een luiertafel" + } + } + }, + "2": { + "options": { + "0": { + "question": "Gratis toegankelijk" + } + } + }, + "3": { + "options": { + "0": { + "question": "Nu geopened" + } + } + } + }, + "name": "Toiletten", + "presets": { + "0": { + "description": "Een publieke toilet", + "title": "toilet" + }, + "1": { + "description": "Deze toiletten hebben op zijn minst één rolstoeltoegankelijke WC", + "title": "een rolstoeltoegankelijke toilet" + } + }, + "tagRenderings": { + "Opening-hours": { + "mappings": { + "0": { + "then": "Altijd open" + } + }, + "question": "Wanneer zijn deze toiletten open?" + }, + "toilet-access": { + "mappings": { + "0": { + "then": "Publiek toegankelijk" + }, + "1": { + "then": "Enkel toegang voor klanten" + }, + "2": { + "then": "Niet toegankelijk" + }, + "3": { + "then": "Toegankelijk na het vragen van de sleutel" + }, + "4": { + "then": "Publiek toegankelijk" + } + }, + "question": "Zijn deze toiletten publiek toegankelijk?", + "render": "Toegankelijkheid is {access}" + }, + "toilet-changing_table:location": { + "mappings": { + "0": { + "then": "De luiertafel bevindt zich in de vrouwentoiletten " + }, + "1": { + "then": "De luiertafel bevindt zich in de herentoiletten " + }, + "2": { + "then": "De luiertafel bevindt zich in de rolstoeltoegankelijke toilet " + }, + "3": { + "then": "De luiertafel bevindt zich in een daartoe voorziene kamer " + } + }, + "question": "Waar bevindt de luiertafel zich?", + "render": "De luiertafel bevindt zich in {changing_table:location}" + }, + "toilet-charge": { + "question": "Hoeveel moet men betalen om deze toiletten te gebruiken?", + "render": "De toiletten gebruiken kost {charge}" + }, + "toilet-handwashing": { + "mappings": { + "0": { + "then": "Deze toiletten hebben een lavabo waar men de handen kan wassen" + }, + "1": { + "then": "Deze toiletten hebben geen lavabo waar men de handen kan wassen" + } + }, + "question": "Hebben deze toiletten een lavabo om de handen te wassen?" + }, + "toilet-has-paper": { + "mappings": { + "0": { + "then": "Deze toilet is voorzien van toiletpapier" + }, + "1": { + "then": "Je moet je eigen toiletpapier meebrengen naar deze toilet" + } + }, + "question": "Moet je je eigen toiletpapier meenemen naar deze toilet?" + }, + "toilets-changing-table": { + "mappings": { + "0": { + "then": "Er is een luiertafel" + }, + "1": { + "then": "Geen luiertafel" + } + }, + "question": "Is er een luiertafel beschikbaar?" + }, + "toilets-fee": { + "mappings": { + "0": { + "then": "Men moet betalen om deze toiletten te gebruiken" + }, + "1": { + "then": "Gratis te gebruiken" + } + }, + "question": "Zijn deze toiletten gratis te gebruiken?" + }, + "toilets-type": { + "mappings": { + "0": { + "then": "Er zijn enkel WC's om op te zitten" + }, + "1": { + "then": "Er zijn enkel urinoirs" + }, + "2": { + "then": "Er zijn enkel hurktoiletten" + }, + "3": { + "then": "Er zijn zowel urinoirs als zittoiletten" + } + }, + "question": "Welke toiletten zijn dit?" + }, + "toilets-wheelchair": { + "mappings": { + "0": { + "then": "Er is een toilet voor rolstoelgebruikers" + }, + "1": { + "then": "Niet toegankelijk voor rolstoelgebruikers" + } + }, + "question": "Is er een rolstoeltoegankelijke toilet voorzien?" + } + }, + "title": { + "render": "Toilet" + } + }, + "trail": { + "description": "Aangeduide wandeltochten", + "name": "Wandeltochten", + "tagRenderings": { + "Color": { + "mappings": { + "0": { + "then": "Blauwe wandeling" + }, + "1": { + "then": "Rode wandeling" + }, + "2": { + "then": "Groene wandeling" + }, + "3": { + "then": "Gele wandeling" + } + }, + "question": "Welke kleur heeft deze wandeling?", + "render": "Deze wandeling heeft kleur {colour}" + }, + "Name": { + "question": "Wat is de naam van deze wandeling?", + "render": "Deze wandeling heet {name}" + }, + "Operator tag": { + "mappings": { + "0": { + "then": "Dit gebied wordt beheerd door Natuurpunt" + }, + "1": { + "then": "Dit gebied wordt beheerd door {operator}" + } + }, + "question": "Wie beheert deze wandeltocht?", + "render": "Beheer door {operator}" + }, + "Wheelchair access": { + "mappings": { + "0": { + "then": "deze wandeltocht is toegankelijk met de rolstoel" + }, + "1": { + "then": "deze wandeltocht is niet toegankelijk met de rolstoel" + } + }, + "question": "Is deze wandeling toegankelijk met de rolstoel?" + }, + "pushchair access": { + "mappings": { + "0": { + "then": "deze wandeltocht is toegankelijk met de buggy" + }, + "1": { + "then": "deze wandeltocht is niet toegankelijk met de buggy" + } + }, + "question": "Is deze wandeltocht toegankelijk met de buggy?" + }, + "trail-length": { + "render": "Deze wandeling is {_length:km} kilometer lang" + } + }, + "title": { + "render": "Wandeltocht" + } + }, + "tree_node": { + "name": "Boom", + "presets": { + "0": { + "description": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.", + "title": "Loofboom" + }, + "1": { + "description": "Een boom van een soort met naalden, bijvoorbeeld den of spar.", + "title": "Naaldboom" + }, + "2": { + "description": "Wanneer je niet zeker bent of het nu een loof- of naaldboom is.", + "title": "Boom" + } + }, + "tagRenderings": { + "tree-decidouous": { + "mappings": { + "0": { + "then": "Bladverliezend: de boom is een periode van het jaar kaal." + }, + "1": { + "then": "Groenblijvend." + } + }, + "question": "Is deze boom groenblijvend of bladverliezend?" + }, + "tree-denotation": { + "mappings": { + "0": { + "then": "De boom valt op door zijn grootte of prominente locatie. Hij is nuttig voor navigatie." + }, + "1": { + "then": "De boom is een natuurlijk monument, bijvoorbeeld doordat hij bijzonder oud of van een waardevolle soort is." + }, + "2": { + "then": "De boom wordt voor landbouwdoeleinden gebruikt, bijvoorbeeld in een boomgaard." + }, + "3": { + "then": "De boom staat in een park of dergelijke (begraafplaats, schoolterrein, …)." + }, + "4": { + "then": "De boom staat in de tuin bij een woning/flatgebouw." + }, + "5": { + "then": "Dit is een laanboom." + }, + "6": { + "then": "De boom staat in een woonkern." + }, + "7": { + "then": "De boom staat buiten een woonkern." + } + }, + "question": "Hoe significant is deze boom? Kies het eerste antwoord dat van toepassing is." + }, + "tree-height": { + "mappings": { + "0": { + "then": "Hoogte: {height} m" + } + }, + "render": "Hoogte: {height}" + }, + "tree-heritage": { + "mappings": { + "0": { + "then": "\"\"/ Erkend als houtig erfgoed door Onroerend Erfgoed Vlaanderen" + }, + "1": { + "then": "Erkend als natuurlijk erfgoed door Directie Cultureel Erfgoed Brussel" + }, + "2": { + "then": "Erkend als erfgoed door een andere organisatie" + }, + "3": { + "then": "Niet erkend als erfgoed" + }, + "4": { + "then": "Erkend als erfgoed door een andere organisatie" + } + }, + "question": "Is deze boom erkend als erfgoed?" + }, + "tree-leaf_type": { + "mappings": { + "0": { + "then": "\"\"/ Loofboom" + }, + "1": { + "then": "\"\"/ Naaldboom" + }, + "2": { + "then": "\"\"/ Permanent bladloos" + } + }, + "question": "Is dit een naald- of loofboom?" + }, + "tree_node-name": { + "mappings": { + "0": { + "then": "De boom heeft geen naam." + } + }, + "question": "Heeft de boom een naam?", + "render": "Naam: {name}" + }, + "tree_node-ref:OnroerendErfgoed": { + "question": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?", + "render": "\"\"/ Onroerend Erfgoed-ID: {ref:OnroerendErfgoed}" + }, + "tree_node-wikidata": { + "question": "Wat is het Wikidata-ID van deze boom?", + "render": "\"\"/ Wikidata: {wikidata}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Boom" + } + }, + "viewpoint": { + "description": "Een mooi uitzicht - ideaal om een foto toe te voegen wanneer iets niet in een andere categorie past", + "name": "Uitzicht", + "presets": { + "0": { + "title": "Uitzicht" + } + }, + "tagRenderings": { + "viewpoint-description": { + "question": "Zijn er bijzonderheden die je wilt toevoegen?" + } + }, + "title": { + "render": "Uitzicht" + } + }, + "village_green": { + "name": "Speelweide", + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Speelweide" + } + }, + "visitor_information_centre": { + "description": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd.", + "name": "Bezoekerscentrum", + "title": { + "mappings": { + "0": { + "then": "{name:nl}" + }, + "1": { + "then": "{name}" + } + }, + "render": "{name}" + } + }, + "waste_basket": { + "description": "Dit is een publieke vuilnisbak waar je je afval kan weggooien.", + "mapRendering": { + "0": { + "iconSize": { + "mappings": { + "0": { + "then": "Vuilnisbak" + } + } + } + } + }, + "name": "Vuilnisbak", + "presets": { + "0": { + "title": "Vuilnisbak" + } + }, + "tagRenderings": { + "dispensing_dog_bags": { + "mappings": { + "0": { + "then": "Deze vuilnisbak heeft een verdeler voor hondenpoepzakjes" + }, + "1": { + "then": "Deze vuilnisbak heeft geenverdeler voor hondenpoepzakjes" + }, + "2": { + "then": "Deze vuilnisbaak heeft waarschijnlijk geen verdeler voor hondenpoepzakjes" + } + }, + "question": "Heeft deze vuilnisbak een verdeler voor hondenpoepzakjes?" + }, + "waste-basket-waste-types": { + "mappings": { + "0": { + "then": "Een vuilnisbak voor zwerfvuil" + }, + "1": { + "then": "Een vuilnisbak voor zwerfvuil" + }, + "2": { + "then": "Een vuilnisbak specifiek voor hondenuitwerpselen" + }, + "3": { + "then": "Een vuilnisbak voor sigarettenpeuken" + }, + "4": { + "then": "Een vuilnisbak voor (vervallen) medicatie en drugs" + }, + "5": { + "then": "Een vuilnisbak voor injectienaalden en andere scherpe voorwerpen" + } + }, + "question": "Wat voor soort vuilnisbak is dit?" + } + }, + "title": { + "render": "Vuilnisbak" + } + }, + "watermill": { + "description": "Watermolens", + "name": "Watermolens", + "tagRenderings": { + "Access tag": { + "mappings": { + "0": { + "then": "Vrij toegankelijk" + }, + "1": { + "then": "Niet toegankelijk" + }, + "2": { + "then": "Niet toegankelijk, want privégebied" + }, + "3": { + "then": "Toegankelijk, ondanks dat het privegebied is" + }, + "4": { + "then": "Enkel toegankelijk met een gids of tijdens een activiteit" + }, + "5": { + "then": "Toegankelijk mits betaling" + } + }, + "question": "Is dit gebied toegankelijk?", + "render": "De toegankelijkheid van dit gebied is: {access:description}" + }, + "Operator tag": { + "mappings": { + "0": { + "then": "Dit gebied wordt beheerd door Natuurpunt" + }, + "1": { + "then": "Dit gebied wordt beheerd door {operator}" + } + }, + "question": "Wie beheert dit pad?", + "render": "Beheer door {operator}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name:nl}" + }, + "1": { + "then": "{name}" + } + }, + "render": "Watermolens" + } + } } \ No newline at end of file diff --git a/langs/layers/pl.json b/langs/layers/pl.json index f1a6ac7fc6..9674e16c39 100644 --- a/langs/layers/pl.json +++ b/langs/layers/pl.json @@ -1,217 +1,216 @@ { - "artwork": { - "presets": { - "0": { - "title": "Dzieło sztuki" - } - }, - "title": { - "mappings": { - "0": { - "then": "Dzieło sztuki {name}" - } - }, - "render": "Dzieło sztuki" - } + "artwork": { + "presets": { + "0": { + "title": "Dzieło sztuki" + } }, - "bench": { - "name": "Ławki", - "presets": { - "0": { - "title": "Ławka" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Oparcie: Tak" - }, - "1": { - "then": "Oparcie: Nie" - } - }, - "question": "Czy ta ławka ma oparcie?", - "render": "Oparcie" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "Kolor: brązowy" - }, - "1": { - "then": "Kolor: zielony" - }, - "2": { - "then": "Kolor: szary" - }, - "3": { - "then": "Kolor: biały" - }, - "4": { - "then": "Kolor: czerwony" - }, - "5": { - "then": "Kolor: czarny" - }, - "6": { - "then": "Kolor: niebieski" - }, - "7": { - "then": "Kolor: żółty" - } - }, - "question": "Jaki kolor ma ta ławka?", - "render": "Kolor: {colour}" - }, - "bench-direction": { - "question": "W jakim kierunku patrzysz siedząc na ławce?", - "render": "Siedząc na ławce, patrzy się w kierunku {direction}°." - }, - "bench-material": { - "mappings": { - "0": { - "then": "Materiał: drewno" - }, - "1": { - "then": "Materiał: metal" - }, - "2": { - "then": "Materiał: kamień" - }, - "3": { - "then": "Materiał: beton" - }, - "4": { - "then": "Materiał: plastik" - }, - "5": { - "then": "Materiał: stal" - } - }, - "question": "Z czego wykonana jest ławka (siedzisko)?", - "render": "Materiał: {material}" - }, - "bench-seats": { - "question": "Ile siedzeń ma ta ławka?", - "render": "{seats} siedzeń" - }, - "bench-survey:date": { - "question": "Kiedy ostatnio badano tę ławkę?", - "render": "Ławka ta była ostatnio badana w dniu {survey:date}" - } - }, - "title": { - "render": "Ławka" - } - }, - "bench_at_pt": { - "name": "Ławki na przystankach komunikacji miejskiej", - "tagRenderings": { - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Ławka na przystanku komunikacji miejskiej" - } - }, - "render": "Ławka" - } - }, - "bicycle_library": { - "description": "Obiekt, w którym rowery można wypożyczyć na dłuższy okres" - }, - "bike_parking": { - "name": "Parking dla rowerów", - "presets": { - "0": { - "title": "Parking dla rowerów" - } - }, - "tagRenderings": { - "Bicycle parking type": { - "question": "Jaki jest typ tego parkingu dla rowerów?", - "render": "Jest to parking rowerowy typu: {bicycle_parking}" - }, - "Underground?": { - "question": "Jaka jest względna lokalizacja tego parkingu rowerowego?" - } - }, - "title": { - "render": "Parking dla rowerów" - } - }, - "bike_repair_station": { - "presets": { - "0": { - "description": "Urządzenie do pompowania opon w stałym miejscu w przestrzeni publicznej.

    Przykłady pompek rowerowych

    ", - "title": "Pompka do roweru" - }, - "1": { - "title": "Stacja naprawy rowerów i pompka" - } - }, - "tagRenderings": { - "Operational status": { - "mappings": { - "0": { - "then": "Pompka rowerowa jest zepsuta" - }, - "1": { - "then": "Pompka rowerowa jest sprawna" - } - }, - "question": "Czy pompka rowerowa jest nadal sprawna?" - }, - "bike_repair_station-electrical_pump": { - "mappings": { - "0": { - "then": "Pompa ręczna" - }, - "1": { - "then": "Pompka elektryczna" - } - }, - "question": "Czy jest to elektryczna pompka do roweru?" - }, - "bike_repair_station-manometer": { - "mappings": { - "0": { - "then": "Jest manometr" - }, - "1": { - "then": "Nie ma manometru" - }, - "2": { - "then": "Jest manometr, ale jest uszkodzony" - } - }, - "question": "Czy pompka posiada wskaźnik ciśnienia lub manometr?" - }, - "bike_repair_station-valves": { - "question": "Jakie zawory są obsługiwane?", - "render": "Ta pompka obsługuje następujące zawory: {valves}" - } - } - }, - "ghost_bike": { - "name": "Duch roweru", - "title": { - "render": "Duch roweru" - } - }, - "shops": { - "tagRenderings": { - "shops-shop": { - "mappings": { - "5": { - "then": "Warsztat samochodowy" - } - } - } + "title": { + "mappings": { + "0": { + "then": "Dzieło sztuki {name}" } + }, + "render": "Dzieło sztuki" } + }, + "bench": { + "name": "Ławki", + "presets": { + "0": { + "title": "Ławka" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Oparcie: Tak" + }, + "1": { + "then": "Oparcie: Nie" + } + }, + "question": "Czy ta ławka ma oparcie?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "Kolor: brązowy" + }, + "1": { + "then": "Kolor: zielony" + }, + "2": { + "then": "Kolor: szary" + }, + "3": { + "then": "Kolor: biały" + }, + "4": { + "then": "Kolor: czerwony" + }, + "5": { + "then": "Kolor: czarny" + }, + "6": { + "then": "Kolor: niebieski" + }, + "7": { + "then": "Kolor: żółty" + } + }, + "question": "Jaki kolor ma ta ławka?", + "render": "Kolor: {colour}" + }, + "bench-direction": { + "question": "W jakim kierunku patrzysz siedząc na ławce?", + "render": "Siedząc na ławce, patrzy się w kierunku {direction}°." + }, + "bench-material": { + "mappings": { + "0": { + "then": "Materiał: drewno" + }, + "1": { + "then": "Materiał: metal" + }, + "2": { + "then": "Materiał: kamień" + }, + "3": { + "then": "Materiał: beton" + }, + "4": { + "then": "Materiał: plastik" + }, + "5": { + "then": "Materiał: stal" + } + }, + "question": "Z czego wykonana jest ławka (siedzisko)?", + "render": "Materiał: {material}" + }, + "bench-seats": { + "question": "Ile siedzeń ma ta ławka?", + "render": "{seats} siedzeń" + }, + "bench-survey:date": { + "question": "Kiedy ostatnio badano tę ławkę?", + "render": "Ławka ta była ostatnio badana w dniu {survey:date}" + } + }, + "title": { + "render": "Ławka" + } + }, + "bench_at_pt": { + "name": "Ławki na przystankach komunikacji miejskiej", + "tagRenderings": { + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Ławka na przystanku komunikacji miejskiej" + } + }, + "render": "Ławka" + } + }, + "bicycle_library": { + "description": "Obiekt, w którym rowery można wypożyczyć na dłuższy okres" + }, + "bike_parking": { + "name": "Parking dla rowerów", + "presets": { + "0": { + "title": "Parking dla rowerów" + } + }, + "tagRenderings": { + "Bicycle parking type": { + "question": "Jaki jest typ tego parkingu dla rowerów?", + "render": "Jest to parking rowerowy typu: {bicycle_parking}" + }, + "Underground?": { + "question": "Jaka jest względna lokalizacja tego parkingu rowerowego?" + } + }, + "title": { + "render": "Parking dla rowerów" + } + }, + "bike_repair_station": { + "presets": { + "0": { + "description": "Urządzenie do pompowania opon w stałym miejscu w przestrzeni publicznej.

    Przykłady pompek rowerowych

    ", + "title": "Pompka do roweru" + }, + "1": { + "title": "Stacja naprawy rowerów i pompka" + } + }, + "tagRenderings": { + "Operational status": { + "mappings": { + "0": { + "then": "Pompka rowerowa jest zepsuta" + }, + "1": { + "then": "Pompka rowerowa jest sprawna" + } + }, + "question": "Czy pompka rowerowa jest nadal sprawna?" + }, + "bike_repair_station-electrical_pump": { + "mappings": { + "0": { + "then": "Pompa ręczna" + }, + "1": { + "then": "Pompka elektryczna" + } + }, + "question": "Czy jest to elektryczna pompka do roweru?" + }, + "bike_repair_station-manometer": { + "mappings": { + "0": { + "then": "Jest manometr" + }, + "1": { + "then": "Nie ma manometru" + }, + "2": { + "then": "Jest manometr, ale jest uszkodzony" + } + }, + "question": "Czy pompka posiada wskaźnik ciśnienia lub manometr?" + }, + "bike_repair_station-valves": { + "question": "Jakie zawory są obsługiwane?", + "render": "Ta pompka obsługuje następujące zawory: {valves}" + } + } + }, + "ghost_bike": { + "name": "Duch roweru", + "title": { + "render": "Duch roweru" + } + }, + "shops": { + "tagRenderings": { + "shops-shop": { + "mappings": { + "5": { + "then": "Warsztat samochodowy" + } + } + } + } + } } \ No newline at end of file diff --git a/langs/layers/pt.json b/langs/layers/pt.json index fba18aeb38..be98e00146 100644 --- a/langs/layers/pt.json +++ b/langs/layers/pt.json @@ -1,543 +1,542 @@ { - "artwork": { - "presets": { - "0": { - "title": "Obra de arte" - } - }, - "title": { - "mappings": { - "0": { - "then": "Obra de arte {name}" - } - }, - "render": "Obra de arte" - } + "artwork": { + "presets": { + "0": { + "title": "Obra de arte" + } }, - "bench": { - "name": "Bancos", - "presets": { - "0": { - "title": "banco" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Encosto: Sim" - }, - "1": { - "then": "Encosto: Não" - } - }, - "question": "Este assento tem um escosto?", - "render": "Encosto" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "Cor: castanho" - }, - "1": { - "then": "Cor: verde" - }, - "2": { - "then": "Cor: cinzento" - }, - "3": { - "then": "Cor: branco" - }, - "4": { - "then": "Cor: vermelho" - }, - "5": { - "then": "Cor: preto" - }, - "6": { - "then": "Cor: azul" - }, - "7": { - "then": "Cor: amarelo" - } - }, - "question": "Qual a cor dessa bancada?", - "render": "Cor: {colour}" - }, - "bench-direction": { - "question": "Em que direção olha quando está sentado no banco?", - "render": "Ao sentar-se no banco, olha-se para {direction} °." - }, - "bench-material": { - "mappings": { - "0": { - "then": "Material: madeira" - }, - "1": { - "then": "Material: metal" - }, - "2": { - "then": "Material: pedra" - }, - "3": { - "then": "Material: concreto" - }, - "4": { - "then": "Material: plástico" - }, - "5": { - "then": "Material: aço" - } - }, - "question": "De que é feito o banco (assento)?", - "render": "Material: {material}" - }, - "bench-seats": { - "question": "Quantos assentos este banco tem?", - "render": "{seats} assentos" - }, - "bench-survey:date": { - "question": "Quando esta bancada foi pesquisada pela última vez?", - "render": "Esta bancada foi pesquisada pela última vez em {survey:date}" - } - }, - "title": { - "render": "Banco" - } - }, - "bench_at_pt": { - "name": "Bancos em pontos de transporte público", - "tagRenderings": { - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Banco em ponto de transporte público" - }, - "1": { - "then": "Banco em abrigo" - } - }, - "render": "Banco" - } - }, - "bicycle_library": { - "description": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos", - "name": "Biblioteca de bicicleta", - "presets": { - "0": { - "title": "Biblioteca de bicicletas" - } - }, - "tagRenderings": { - "bicycle-library-target-group": { - "mappings": { - "0": { - "then": "Bicicletas para crianças disponíveis" - }, - "1": { - "then": "Bicicletas para adulto disponíveis" - }, - "2": { - "then": "Bicicletas para deficientes físicos disponíveis" - } - }, - "question": "Quem pode emprestar bicicletas aqui?" - }, - "bicycle_library-charge": { - "mappings": { - "0": { - "then": "Emprestar uma bicicleta é grátis" - }, - "1": { - "then": "Emprestar uma bicicleta custa €20/ano e €20 de garantia" - } - }, - "question": "Quanto custa um empréstimo de bicicleta?", - "render": "Custos de empréstimo de bicicleta {charge}" - }, - "bicycle_library-name": { - "question": "Qual o nome desta biblioteca de bicicleta?", - "render": "Esta biblioteca de bicicleta é chamada de {name}" - } - }, - "title": { - "render": "Biblioteca de bicicleta" - } - }, - "bicycle_tube_vending_machine": { - "name": "Máquina de venda automática de tubos de bicicleta", - "presets": { - "0": { - "title": "Máquina de venda automática de tubos de bicicleta" - } - }, - "tagRenderings": { - "Still in use?": { - "mappings": { - "0": { - "then": "Esta máquina de venda automática funciona" - }, - "1": { - "then": "Esta máquina de venda automática está quebrada" - }, - "2": { - "then": "Esta máquina de venda automática está fechada" - } - }, - "question": "Esta máquina de venda automática ainda está operacional?", - "render": "O estado operacional é: {operational_status" - } - }, - "title": { - "render": "Máquina de venda automática de tubos de bicicleta" - } - }, - "bike_cafe": { - "name": "Café de bicicletas", - "presets": { - "0": { - "title": "Café de bicicleta" - } - }, - "tagRenderings": { - "bike_cafe-email": { - "question": "Qual o endereço de email de {name}?" - }, - "bike_cafe-name": { - "question": "Qual o nome deste café de bicicleta?", - "render": "Este café de bicicleta se chama {name}" - }, - "bike_cafe-opening_hours": { - "question": "Quando este café de bicicleta abre?" - }, - "bike_cafe-phone": { - "question": "Qual é o número de telefone de {name}?" - }, - "bike_cafe-repair-service": { - "mappings": { - "0": { - "then": "Este café de bicicleta conserta bicicletas" - }, - "1": { - "then": "Este café de bicicleta não conserta bicicletas" - } - }, - "question": "Este café de bicicleta conserta bicicletas?" - }, - "bike_cafe-repair-tools": { - "mappings": { - "0": { - "then": "Este café de bicicleta oferece ferramentas de reparo faça você mesmo" - }, - "1": { - "then": "Este café de bicicleta não oferece ferramentas de reparo faça você mesmo" - } - }, - "question": "Há ferramentas aqui para consertar a sua própria bicicleta?" - }, - "bike_cafe-website": { - "question": "Qual o website de {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Café de bicicleta {name}" - } - }, - "render": "Café de bicicleta" - } - }, - "bike_cleaning": { - "name": "Serviço de limpeza de bicicletas", - "presets": { - "0": { - "title": "Serviço de limpeza de bicicletas" - } - }, - "title": { - "mappings": { - "0": { - "then": "Serviço de limpeza de bicicletas {name}" - } - }, - "render": "Serviço de limpeza de bicicletas" - } - }, - "bike_parking": { - "name": "Estacionamento de bicicletas", - "presets": { - "0": { - "title": "Estacionamento de bicicletas" - } - }, - "tagRenderings": { - "Access": { - "mappings": { - "0": { - "then": "Acessível ao público" - }, - "1": { - "then": "Acesso é principalmente para visitantes de uma empresa" - }, - "2": { - "then": "Acesso é limitado aos membros de uma escola, companhia ou organização" - } - }, - "question": "Quem pode usar este estacionamento de bicicletas?", - "render": "{access}" - }, - "Bicycle parking type": { - "question": "Qual o tipo deste estacionamento de bicicletas?", - "render": "Este é um estacionamento de bicicletas do tipo: {bicycle_parking}" - }, - "Capacity": { - "render": "Lugar para {capacity} bicicletas" - }, - "Cargo bike capacity?": { - "question": "Quantas bicicletas de carga cabem neste estacionamento de bicicletas?", - "render": "Neste estacionamento cabem {capacity:cargo_bike} bicicletas de carga" - }, - "Cargo bike spaces?": { - "mappings": { - "0": { - "then": "Este estacionamento tem vagas para bicicletas de carga" - }, - "1": { - "then": "Este estacionamento tem vagas (oficiais) projetadas para bicicletas de carga." - }, - "2": { - "then": "Não tem permissão para estacionar bicicletas de carga" - } - }, - "question": "O estacionamento de bicicletas tem vagas para bicicletas de carga?" - }, - "Is covered?": { - "mappings": { - "0": { - "then": "Este estacionamento é coberto (tem um telhado)" - }, - "1": { - "then": "Este estacionamento não é coberto" - } - }, - "question": "Este estacionamento é coberto? Também selecione \"coberto\" para estacionamentos internos." - }, - "Underground?": { - "mappings": { - "0": { - "then": "Estacionamento subterrâneo" - }, - "1": { - "then": "Estacionamento subterrâneo" - }, - "2": { - "then": "Estacionamento de superfície" - }, - "3": { - "then": "Estacionamento ao nível da superfície" - }, - "4": { - "then": "Estacionamento no telhado" - } - }, - "question": "Qual a localização relativa deste estacionamento de bicicletas?" - } - }, - "title": { - "render": "Estacionamento de bicicletas" - } - }, - "bike_repair_station": { - "presets": { - "0": { - "description": "Um aparelho para encher os seus pneus num local fixa no espaço público

    Exemplos de bombas de bicicletas

    " - } - }, - "tagRenderings": { - "bike_repair_station-available-services": { - "mappings": { - "0": { - "then": "Há somente uma bomba presente" - }, - "1": { - "then": "Há somente ferramentas (chaves de fenda, alicates...) presentes" - }, - "2": { - "then": "Há tanto ferramentas e uma bomba presente" - } - }, - "question": "Quais serviços estão disponíveis nesta estação de bicicletas?" - }, - "bike_repair_station-bike-chain-tool": { - "mappings": { - "0": { - "then": "Há uma ferramenta de corrente" - }, - "1": { - "then": "Não há uma ferramenta de corrente" - } - } - }, - "bike_repair_station-bike-stand": { - "mappings": { - "0": { - "then": "Há um gancho ou um suporte" - }, - "1": { - "then": "Não há um gancho ou um suporte" - } - } - }, - "bike_repair_station-electrical_pump": { - "mappings": { - "0": { - "then": "Bomba manual" - }, - "1": { - "then": "Bomba elétrica" - } - } - }, - "bike_repair_station-manometer": { - "mappings": { - "0": { - "then": "Há um manômetro" - }, - "1": { - "then": "Não há um manômetro" - }, - "2": { - "then": "Há um manômetro mas está quebrado" - } - } - }, - "bike_repair_station-opening_hours": { - "mappings": { - "0": { - "then": "Sempre aberto" - }, - "1": { - "then": "Sempre aberto" - } - } - }, - "bike_repair_station-operator": { - "question": "Quem faz a manutenção desta bomba de ciclo?", - "render": "Mantida por {operator}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Estação de reparo de bicicletas" - }, - "1": { - "then": "Estação de reparo de bicicletas" - } - } - } - }, - "bike_shop": { - "description": "Uma loja que vende especificamente bicicletas ou itens relacionados", - "name": "Reparo/loja de bicicletas", - "tagRenderings": { - "bike_repair_rents-bikes": { - "mappings": { - "0": { - "then": "Esta loja aluga bicicletas" - }, - "1": { - "then": "Esta loja não aluga bicicletas" - } - }, - "question": "Esta loja aluga bicicletas?" - }, - "bike_repair_repairs-bikes": { - "mappings": { - "0": { - "then": "Esta loja conserta bicicletas" - }, - "1": { - "then": "Esta loja não conserta bicicletas" - }, - "2": { - "then": "Esta loja conserta bicicletas compradas aqui" - }, - "3": { - "then": "Esta loja conserta bicicletas de uma certa marca" - } - }, - "question": "Esta loja conserta bicicletas?" - }, - "bike_repair_sells-bikes": { - "mappings": { - "0": { - "then": "Esta loja vende bicicletas" - }, - "1": { - "then": "Esta loja não vende bicicletas" - } - }, - "question": "Esta loja vende bicicletas?" - }, - "bike_shop-email": { - "question": "Qual o endereço de email de {name}?" - }, - "bike_shop-is-bicycle_shop": { - "render": "Esta loja é especializada em vender {shop} e faz atividades relacionadas à bicicletas" - }, - "bike_shop-name": { - "question": "Qual o nome desta loja de bicicletas?", - "render": "Esta loja de bicicletas se chama {nome}" - }, - "bike_shop-phone": { - "question": "Qual é o número de telefone de {name}?" - }, - "bike_shop-website": { - "question": "Qual o website de {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Loja de equipamentos desportivos {name}" - }, - "2": { - "then": "Aluguel de bicicletas {name}" - }, - "3": { - "then": "Reparo de bicicletas {name}" - }, - "4": { - "then": "Loja de bicicletas {name}" - }, - "5": { - "then": "Loja/reparo de bicicletas {name}" - } - }, - "render": "Reparo/loja de bicicletas" - } - }, - "ghost_bike": { - "name": "Bicicleta fantasma", - "title": { - "render": "Bicicleta fantasma" - } - }, - "shops": { - "tagRenderings": { - "shops-shop": { - "mappings": { - "5": { - "then": "Oficina de automóveis" - } - } - } + "title": { + "mappings": { + "0": { + "then": "Obra de arte {name}" } + }, + "render": "Obra de arte" } + }, + "bench": { + "name": "Bancos", + "presets": { + "0": { + "title": "banco" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Encosto: Sim" + }, + "1": { + "then": "Encosto: Não" + } + }, + "question": "Este assento tem um escosto?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "Cor: castanho" + }, + "1": { + "then": "Cor: verde" + }, + "2": { + "then": "Cor: cinzento" + }, + "3": { + "then": "Cor: branco" + }, + "4": { + "then": "Cor: vermelho" + }, + "5": { + "then": "Cor: preto" + }, + "6": { + "then": "Cor: azul" + }, + "7": { + "then": "Cor: amarelo" + } + }, + "question": "Qual a cor dessa bancada?", + "render": "Cor: {colour}" + }, + "bench-direction": { + "question": "Em que direção olha quando está sentado no banco?", + "render": "Ao sentar-se no banco, olha-se para {direction} °." + }, + "bench-material": { + "mappings": { + "0": { + "then": "Material: madeira" + }, + "1": { + "then": "Material: metal" + }, + "2": { + "then": "Material: pedra" + }, + "3": { + "then": "Material: concreto" + }, + "4": { + "then": "Material: plástico" + }, + "5": { + "then": "Material: aço" + } + }, + "question": "De que é feito o banco (assento)?", + "render": "Material: {material}" + }, + "bench-seats": { + "question": "Quantos assentos este banco tem?", + "render": "{seats} assentos" + }, + "bench-survey:date": { + "question": "Quando esta bancada foi pesquisada pela última vez?", + "render": "Esta bancada foi pesquisada pela última vez em {survey:date}" + } + }, + "title": { + "render": "Banco" + } + }, + "bench_at_pt": { + "name": "Bancos em pontos de transporte público", + "tagRenderings": { + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Banco em ponto de transporte público" + }, + "1": { + "then": "Banco em abrigo" + } + }, + "render": "Banco" + } + }, + "bicycle_library": { + "description": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos", + "name": "Biblioteca de bicicleta", + "presets": { + "0": { + "title": "Biblioteca de bicicletas" + } + }, + "tagRenderings": { + "bicycle-library-target-group": { + "mappings": { + "0": { + "then": "Bicicletas para crianças disponíveis" + }, + "1": { + "then": "Bicicletas para adulto disponíveis" + }, + "2": { + "then": "Bicicletas para deficientes físicos disponíveis" + } + }, + "question": "Quem pode emprestar bicicletas aqui?" + }, + "bicycle_library-charge": { + "mappings": { + "0": { + "then": "Emprestar uma bicicleta é grátis" + }, + "1": { + "then": "Emprestar uma bicicleta custa €20/ano e €20 de garantia" + } + }, + "question": "Quanto custa um empréstimo de bicicleta?", + "render": "Custos de empréstimo de bicicleta {charge}" + }, + "bicycle_library-name": { + "question": "Qual o nome desta biblioteca de bicicleta?", + "render": "Esta biblioteca de bicicleta é chamada de {name}" + } + }, + "title": { + "render": "Biblioteca de bicicleta" + } + }, + "bicycle_tube_vending_machine": { + "name": "Máquina de venda automática de tubos de bicicleta", + "presets": { + "0": { + "title": "Máquina de venda automática de tubos de bicicleta" + } + }, + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "Esta máquina de venda automática funciona" + }, + "1": { + "then": "Esta máquina de venda automática está quebrada" + }, + "2": { + "then": "Esta máquina de venda automática está fechada" + } + }, + "question": "Esta máquina de venda automática ainda está operacional?", + "render": "O estado operacional é: {operational_status}" + } + }, + "title": { + "render": "Máquina de venda automática de tubos de bicicleta" + } + }, + "bike_cafe": { + "name": "Café de bicicletas", + "presets": { + "0": { + "title": "Café de bicicleta" + } + }, + "tagRenderings": { + "bike_cafe-email": { + "question": "Qual o endereço de email de {name}?" + }, + "bike_cafe-name": { + "question": "Qual o nome deste café de bicicleta?", + "render": "Este café de bicicleta se chama {name}" + }, + "bike_cafe-opening_hours": { + "question": "Quando este café de bicicleta abre?" + }, + "bike_cafe-phone": { + "question": "Qual é o número de telefone de {name}?" + }, + "bike_cafe-repair-service": { + "mappings": { + "0": { + "then": "Este café de bicicleta conserta bicicletas" + }, + "1": { + "then": "Este café de bicicleta não conserta bicicletas" + } + }, + "question": "Este café de bicicleta conserta bicicletas?" + }, + "bike_cafe-repair-tools": { + "mappings": { + "0": { + "then": "Este café de bicicleta oferece ferramentas de reparo faça você mesmo" + }, + "1": { + "then": "Este café de bicicleta não oferece ferramentas de reparo faça você mesmo" + } + }, + "question": "Há ferramentas aqui para consertar a sua própria bicicleta?" + }, + "bike_cafe-website": { + "question": "Qual o website de {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Café de bicicleta {name}" + } + }, + "render": "Café de bicicleta" + } + }, + "bike_cleaning": { + "name": "Serviço de limpeza de bicicletas", + "presets": { + "0": { + "title": "Serviço de limpeza de bicicletas" + } + }, + "title": { + "mappings": { + "0": { + "then": "Serviço de limpeza de bicicletas {name}" + } + }, + "render": "Serviço de limpeza de bicicletas" + } + }, + "bike_parking": { + "name": "Estacionamento de bicicletas", + "presets": { + "0": { + "title": "Estacionamento de bicicletas" + } + }, + "tagRenderings": { + "Access": { + "mappings": { + "0": { + "then": "Acessível ao público" + }, + "1": { + "then": "Acesso é principalmente para visitantes de uma empresa" + }, + "2": { + "then": "Acesso é limitado aos membros de uma escola, companhia ou organização" + } + }, + "question": "Quem pode usar este estacionamento de bicicletas?", + "render": "{access}" + }, + "Bicycle parking type": { + "question": "Qual o tipo deste estacionamento de bicicletas?", + "render": "Este é um estacionamento de bicicletas do tipo: {bicycle_parking}" + }, + "Capacity": { + "render": "Lugar para {capacity} bicicletas" + }, + "Cargo bike capacity?": { + "question": "Quantas bicicletas de carga cabem neste estacionamento de bicicletas?", + "render": "Neste estacionamento cabem {capacity:cargo_bike} bicicletas de carga" + }, + "Cargo bike spaces?": { + "mappings": { + "0": { + "then": "Este estacionamento tem vagas para bicicletas de carga" + }, + "1": { + "then": "Este estacionamento tem vagas (oficiais) projetadas para bicicletas de carga." + }, + "2": { + "then": "Não tem permissão para estacionar bicicletas de carga" + } + }, + "question": "O estacionamento de bicicletas tem vagas para bicicletas de carga?" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "Este estacionamento é coberto (tem um telhado)" + }, + "1": { + "then": "Este estacionamento não é coberto" + } + }, + "question": "Este estacionamento é coberto? Também selecione \"coberto\" para estacionamentos internos." + }, + "Underground?": { + "mappings": { + "0": { + "then": "Estacionamento subterrâneo" + }, + "1": { + "then": "Estacionamento de superfície" + }, + "2": { + "then": "Estacionamento no telhado" + }, + "3": { + "then": "Estacionamento ao nível da superfície" + }, + "4": { + "then": "Estacionamento no telhado" + } + }, + "question": "Qual a localização relativa deste estacionamento de bicicletas?" + } + }, + "title": { + "render": "Estacionamento de bicicletas" + } + }, + "bike_repair_station": { + "presets": { + "0": { + "description": "Um aparelho para encher os seus pneus num local fixa no espaço público

    Exemplos de bombas de bicicletas

    " + } + }, + "tagRenderings": { + "bike_repair_station-available-services": { + "mappings": { + "0": { + "then": "Há somente uma bomba presente" + }, + "1": { + "then": "Há somente ferramentas (chaves de fenda, alicates...) presentes" + }, + "2": { + "then": "Há tanto ferramentas e uma bomba presente" + } + }, + "question": "Quais serviços estão disponíveis nesta estação de bicicletas?" + }, + "bike_repair_station-bike-chain-tool": { + "mappings": { + "0": { + "then": "Há uma ferramenta de corrente" + }, + "1": { + "then": "Não há uma ferramenta de corrente" + } + } + }, + "bike_repair_station-bike-stand": { + "mappings": { + "0": { + "then": "Há um gancho ou um suporte" + }, + "1": { + "then": "Não há um gancho ou um suporte" + } + } + }, + "bike_repair_station-electrical_pump": { + "mappings": { + "0": { + "then": "Bomba manual" + }, + "1": { + "then": "Bomba elétrica" + } + } + }, + "bike_repair_station-manometer": { + "mappings": { + "0": { + "then": "Há um manômetro" + }, + "1": { + "then": "Não há um manômetro" + }, + "2": { + "then": "Há um manômetro mas está quebrado" + } + } + }, + "bike_repair_station-opening_hours": { + "mappings": { + "0": { + "then": "Sempre aberto" + }, + "1": { + "then": "Sempre aberto" + } + } + }, + "bike_repair_station-operator": { + "question": "Quem faz a manutenção desta bomba de ciclo?", + "render": "Mantida por {operator}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Estação de reparo de bicicletas" + }, + "1": { + "then": "Estação de reparo de bicicletas" + } + } + } + }, + "bike_shop": { + "description": "Uma loja que vende especificamente bicicletas ou itens relacionados", + "name": "Reparo/loja de bicicletas", + "tagRenderings": { + "bike_repair_rents-bikes": { + "mappings": { + "0": { + "then": "Esta loja aluga bicicletas" + }, + "1": { + "then": "Esta loja não aluga bicicletas" + } + }, + "question": "Esta loja aluga bicicletas?" + }, + "bike_repair_repairs-bikes": { + "mappings": { + "0": { + "then": "Esta loja conserta bicicletas" + }, + "1": { + "then": "Esta loja não conserta bicicletas" + }, + "2": { + "then": "Esta loja conserta bicicletas compradas aqui" + }, + "3": { + "then": "Esta loja conserta bicicletas de uma certa marca" + } + }, + "question": "Esta loja conserta bicicletas?" + }, + "bike_repair_sells-bikes": { + "mappings": { + "0": { + "then": "Esta loja vende bicicletas" + }, + "1": { + "then": "Esta loja não vende bicicletas" + } + }, + "question": "Esta loja vende bicicletas?" + }, + "bike_shop-email": { + "question": "Qual o endereço de email de {name}?" + }, + "bike_shop-is-bicycle_shop": { + "render": "Esta loja é especializada em vender {shop} e faz atividades relacionadas à bicicletas" + }, + "bike_shop-name": { + "question": "Qual o nome desta loja de bicicletas?", + "render": "Esta loja de bicicletas se chama {name}" + }, + "bike_shop-phone": { + "question": "Qual é o número de telefone de {name}?" + }, + "bike_shop-website": { + "question": "Qual o website de {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Loja de equipamentos desportivos {name}" + }, + "2": { + "then": "Aluguel de bicicletas {name}" + }, + "3": { + "then": "Reparo de bicicletas {name}" + }, + "4": { + "then": "Loja de bicicletas {name}" + }, + "5": { + "then": "Loja/reparo de bicicletas {name}" + } + }, + "render": "Reparo/loja de bicicletas" + } + }, + "ghost_bike": { + "name": "Bicicleta fantasma", + "title": { + "render": "Bicicleta fantasma" + } + }, + "shops": { + "tagRenderings": { + "shops-shop": { + "mappings": { + "5": { + "then": "Oficina de automóveis" + } + } + } + } + } } \ No newline at end of file diff --git a/langs/layers/pt_BR.json b/langs/layers/pt_BR.json index 8a16a2ab0a..a0f45d6f80 100644 --- a/langs/layers/pt_BR.json +++ b/langs/layers/pt_BR.json @@ -1,555 +1,554 @@ { - "artwork": { - "presets": { - "0": { - "title": "Obra de arte" - } - }, - "title": { - "mappings": { - "0": { - "then": "Obra de arte {name}" - } - }, - "render": "Obra de arte" - } + "artwork": { + "presets": { + "0": { + "title": "Obra de arte" + } }, - "bench": { - "name": "Bancos", - "presets": { - "0": { - "title": "banco" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Encosto: Sim" - }, - "1": { - "then": "Encosto: Não" - } - }, - "question": "Este assento tem um escosto?", - "render": "Encosto" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "Cor: marrom" - }, - "1": { - "then": "Cor: verde" - }, - "2": { - "then": "Cor: cinza" - }, - "3": { - "then": "Cor: branco" - }, - "4": { - "then": "Cor: vermelho" - }, - "5": { - "then": "Cor: preto" - }, - "6": { - "then": "Cor: azul" - }, - "7": { - "then": "Cor: amarelo" - } - }, - "question": "Qual a cor dessa bancada?", - "render": "Cor: {colour}" - }, - "bench-direction": { - "question": "Em que direção você olha quando está sentado no banco?", - "render": "Ao sentar-se no banco, olha-se para {direction} °." - }, - "bench-material": { - "mappings": { - "0": { - "then": "Material: madeira" - }, - "1": { - "then": "Material: metal" - }, - "2": { - "then": "Material: pedra" - }, - "3": { - "then": "Material: concreto" - }, - "4": { - "then": "Material: plástico" - }, - "5": { - "then": "Material: aço" - } - }, - "question": "De que é feito o banco (assento)?", - "render": "Material: {material}" - }, - "bench-seats": { - "question": "Quantos assentos este banco tem?", - "render": "{seats} assentos" - }, - "bench-survey:date": { - "question": "Quando esta bancada foi pesquisada pela última vez?", - "render": "Esta bancada foi pesquisada pela última vez em {survey:date}" - } - }, - "title": { - "render": "Banco" - } - }, - "bench_at_pt": { - "name": "Bancos em pontos de transporte público", - "tagRenderings": { - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Banco em ponto de transporte público" - }, - "1": { - "then": "Banco em abrigo" - } - }, - "render": "Banco" - } - }, - "bicycle_library": { - "description": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos", - "name": "Biblioteca de bicicleta", - "presets": { - "0": { - "title": "Biblioteca de bicicletas" - } - }, - "tagRenderings": { - "bicycle-library-target-group": { - "mappings": { - "0": { - "then": "Bicicletas para crianças disponíveis" - }, - "1": { - "then": "Bicicletas para adulto disponíveis" - }, - "2": { - "then": "Bicicletas para deficientes físicos disponíveis" - } - }, - "question": "Quem pode emprestar bicicletas aqui?" - }, - "bicycle_library-charge": { - "mappings": { - "0": { - "then": "Emprestar uma bicicleta é grátis" - }, - "1": { - "then": "Emprestar uma bicicleta custa €20/ano e €20 de garantia" - } - }, - "question": "Quanto custa um empréstimo de bicicleta?", - "render": "Custos de empréstimo de bicicleta {charge}" - }, - "bicycle_library-name": { - "question": "Qual o nome desta biblioteca de bicicleta?", - "render": "Esta biblioteca de bicicleta é chamada de {name}" - } - }, - "title": { - "render": "Biblioteca de bicicleta" - } - }, - "bicycle_tube_vending_machine": { - "name": "Máquina de venda automática de tubos de bicicleta", - "presets": { - "0": { - "title": "Máquina de venda automática de tubos de bicicleta" - } - }, - "tagRenderings": { - "Still in use?": { - "mappings": { - "0": { - "then": "Esta máquina de venda automática funciona" - }, - "1": { - "then": "Esta máquina de venda automática está quebrada" - }, - "2": { - "then": "Esta máquina de venda automática está fechada" - } - }, - "question": "Esta máquina de venda automática ainda está operacional?", - "render": "O estado operacional é: {operational_status" - } - }, - "title": { - "render": "Máquina de venda automática de tubos de bicicleta" - } - }, - "bike_cafe": { - "name": "Café de bicicletas", - "presets": { - "0": { - "title": "Café de bicicleta" - } - }, - "tagRenderings": { - "bike_cafe-email": { - "question": "Qual o endereço de email de {name}?" - }, - "bike_cafe-name": { - "question": "Qual o nome deste café de bicicleta?", - "render": "Este café de bicicleta se chama {name}" - }, - "bike_cafe-opening_hours": { - "question": "Quando este café de bicicleta abre?" - }, - "bike_cafe-phone": { - "question": "Qual o número de telefone de {name}?" - }, - "bike_cafe-repair-service": { - "mappings": { - "0": { - "then": "Este café de bicicleta conserta bicicletas" - }, - "1": { - "then": "Este café de bicicleta não conserta bicicletas" - } - }, - "question": "Este café de bicicleta conserta bicicletas?" - }, - "bike_cafe-repair-tools": { - "mappings": { - "0": { - "then": "Este café de bicicleta oferece ferramentas de reparo faça você mesmo" - }, - "1": { - "then": "Este café de bicicleta não oferece ferramentas de reparo faça você mesmo" - } - }, - "question": "Há ferramentas aqui para consertar sua bicicleta?" - }, - "bike_cafe-website": { - "question": "Qual o website de {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Café de bicicleta {name}" - } - }, - "render": "Café de bicicleta" - } - }, - "bike_cleaning": { - "name": "Serviço de limpeza de bicicletas", - "presets": { - "0": { - "title": "Serviço de limpeza de bicicletas" - } - }, - "title": { - "mappings": { - "0": { - "then": "Serviço de limpeza de bicicletas {name}" - } - }, - "render": "Serviço de limpeza de bicicletas" - } - }, - "bike_parking": { - "name": "Estacionamento de bicicletas", - "presets": { - "0": { - "title": "Estacionamento de bicicletas" - } - }, - "tagRenderings": { - "Access": { - "mappings": { - "0": { - "then": "Acessível ao público" - }, - "1": { - "then": "Acesso é principalmente para visitantes de uma empresa" - }, - "2": { - "then": "Acesso é limitado aos membros de uma escola, companhia ou organização" - } - }, - "question": "Quem pode usar este estacionamento de bicicletas?", - "render": "{access}" - }, - "Bicycle parking type": { - "question": "Qual o tipo deste estacionamento de bicicletas?", - "render": "Este é um estacionamento de bicicletas do tipo: {bicycle_parking}" - }, - "Capacity": { - "render": "Lugar para {capacity} bicicletas" - }, - "Cargo bike capacity?": { - "question": "Quantas bicicletas de carga cabem neste estacionamento de bicicletas?", - "render": "Neste estacionamento cabem {capacity:cargo_bike} bicicletas de carga" - }, - "Cargo bike spaces?": { - "mappings": { - "0": { - "then": "Este estacionamento tem vagas para bicicletas de carga" - }, - "1": { - "then": "Este estacionamento tem vagas (oficiais) projetadas para bicicletas de carga." - }, - "2": { - "then": "Você não tem permissão para estacionar bicicletas de carga" - } - }, - "question": "O estacionamento de bicicletas tem vagas para bicicletas de carga?" - }, - "Is covered?": { - "mappings": { - "0": { - "then": "Este estacionamento é coberto (tem um telhado)" - }, - "1": { - "then": "Este estacionamento não é coberto" - } - }, - "question": "Este estacionamento é coberto? Também selecione \"coberto\" para estacionamentos internos." - }, - "Underground?": { - "mappings": { - "0": { - "then": "Estacionamento subterrâneo" - }, - "1": { - "then": "Estacionamento subterrâneo" - }, - "2": { - "then": "Estacionamento de superfície" - }, - "3": { - "then": "Estacionamento ao nível da superfície" - }, - "4": { - "then": "Estacionamento no telhado" - } - }, - "question": "Qual a localização relativa deste estacionamento de bicicletas?" - } - }, - "title": { - "render": "Estacionamento de bicicletas" - } - }, - "bike_repair_station": { - "name": "Estações de bicicletas (reparo, bomba ou ambos)", - "presets": { - "0": { - "description": "Um dispositivo para encher seus pneus em um local fixa no espaço público

    Exemplos de bombas de bicicletas

    ", - "title": "Bomba de bicicleta" - } - }, - "tagRenderings": { - "bike_repair_station-available-services": { - "mappings": { - "0": { - "then": "Há somente uma bomba presente" - }, - "1": { - "then": "Há somente ferramentas (chaves de fenda, alicates...) presentes" - }, - "2": { - "then": "Há tanto ferramentas e uma bomba presente" - } - }, - "question": "Quais serviços estão disponíveis nesta estação de bicicletas?" - }, - "bike_repair_station-bike-chain-tool": { - "mappings": { - "0": { - "then": "Há uma ferramenta de corrente" - }, - "1": { - "then": "Não há uma ferramenta de corrente" - } - } - }, - "bike_repair_station-bike-stand": { - "mappings": { - "0": { - "then": "Há um gancho ou um suporte" - }, - "1": { - "then": "Não há um gancho ou um suporte" - } - } - }, - "bike_repair_station-electrical_pump": { - "mappings": { - "0": { - "then": "Bomba manual" - }, - "1": { - "then": "Bomba elétrica" - } - } - }, - "bike_repair_station-manometer": { - "mappings": { - "0": { - "then": "Há um manômetro" - }, - "1": { - "then": "Não há um manômetro" - }, - "2": { - "then": "Há um manômetro mas está quebrado" - } - } - }, - "bike_repair_station-opening_hours": { - "mappings": { - "0": { - "then": "Sempre aberto" - }, - "1": { - "then": "Sempre aberto" - } - } - }, - "bike_repair_station-operator": { - "question": "Quem faz a manutenção desta bomba de ciclo?", - "render": "Mantida por {operator}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Estação de reparo de bicicletas" - }, - "1": { - "then": "Estação de reparo de bicicletas" - }, - "2": { - "then": "Bomba quebrada" - }, - "3": { - "then": "Bomba de bicicleta {name}" - }, - "4": { - "then": "Bomba de bicicleta" - } - }, - "render": "Estação de bicicletas (bomba e reparo)" - } - }, - "bike_shop": { - "description": "Uma loja que vende especificamente bicicletas ou itens relacionados", - "name": "Reparo/loja de bicicletas", - "tagRenderings": { - "bike_repair_rents-bikes": { - "mappings": { - "0": { - "then": "Esta loja aluga bicicletas" - }, - "1": { - "then": "Esta loja não aluga bicicletas" - } - }, - "question": "Esta loja aluga bicicletas?" - }, - "bike_repair_repairs-bikes": { - "mappings": { - "0": { - "then": "Esta loja conserta bicicletas" - }, - "1": { - "then": "Esta loja não conserta bicicletas" - }, - "2": { - "then": "Esta loja conserta bicicletas compradas aqui" - }, - "3": { - "then": "Esta loja conserta bicicletas de uma certa marca" - } - }, - "question": "Esta loja conserta bicicletas?" - }, - "bike_repair_sells-bikes": { - "mappings": { - "0": { - "then": "Esta loja vende bicicletas" - }, - "1": { - "then": "Esta loja não vende bicicletas" - } - }, - "question": "Esta loja vende bicicletas?" - }, - "bike_shop-email": { - "question": "Qual o endereço de email de {name}?" - }, - "bike_shop-is-bicycle_shop": { - "render": "Esta loja é especializada em vender {shop} e faz atividades relacionadas à bicicletas" - }, - "bike_shop-name": { - "question": "Qual o nome desta loja de bicicletas?", - "render": "Esta loja de bicicletas se chama {nome}" - }, - "bike_shop-phone": { - "question": "Qual o número de telefone de {name}?" - }, - "bike_shop-website": { - "question": "Qual o website de {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Loja de equipamentos esportivos {name}" - }, - "2": { - "then": "Aluguel de bicicletas {name}" - }, - "3": { - "then": "Reparo de bicicletas {name}" - }, - "4": { - "then": "Loja de bicicletas {name}" - }, - "5": { - "then": "Loja/reparo de bicicletas {name}" - } - }, - "render": "Reparo/loja de bicicletas" - } - }, - "ghost_bike": { - "name": "Bicicleta fantasma", - "title": { - "render": "Bicicleta fantasma" - } - }, - "shops": { - "tagRenderings": { - "shops-shop": { - "mappings": { - "5": { - "then": "Oficina Mecânica" - } - } - } + "title": { + "mappings": { + "0": { + "then": "Obra de arte {name}" } + }, + "render": "Obra de arte" } + }, + "bench": { + "name": "Bancos", + "presets": { + "0": { + "title": "banco" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Encosto: Sim" + }, + "1": { + "then": "Encosto: Não" + } + }, + "question": "Este assento tem um escosto?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "Cor: marrom" + }, + "1": { + "then": "Cor: verde" + }, + "2": { + "then": "Cor: cinza" + }, + "3": { + "then": "Cor: branco" + }, + "4": { + "then": "Cor: vermelho" + }, + "5": { + "then": "Cor: preto" + }, + "6": { + "then": "Cor: azul" + }, + "7": { + "then": "Cor: amarelo" + } + }, + "question": "Qual a cor dessa bancada?", + "render": "Cor: {colour}" + }, + "bench-direction": { + "question": "Em que direção você olha quando está sentado no banco?", + "render": "Ao sentar-se no banco, olha-se para {direction} °." + }, + "bench-material": { + "mappings": { + "0": { + "then": "Material: madeira" + }, + "1": { + "then": "Material: metal" + }, + "2": { + "then": "Material: pedra" + }, + "3": { + "then": "Material: concreto" + }, + "4": { + "then": "Material: plástico" + }, + "5": { + "then": "Material: aço" + } + }, + "question": "De que é feito o banco (assento)?", + "render": "Material: {material}" + }, + "bench-seats": { + "question": "Quantos assentos este banco tem?", + "render": "{seats} assentos" + }, + "bench-survey:date": { + "question": "Quando esta bancada foi pesquisada pela última vez?", + "render": "Esta bancada foi pesquisada pela última vez em {survey:date}" + } + }, + "title": { + "render": "Banco" + } + }, + "bench_at_pt": { + "name": "Bancos em pontos de transporte público", + "tagRenderings": { + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Banco em ponto de transporte público" + }, + "1": { + "then": "Banco em abrigo" + } + }, + "render": "Banco" + } + }, + "bicycle_library": { + "description": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos", + "name": "Biblioteca de bicicleta", + "presets": { + "0": { + "title": "Biblioteca de bicicletas" + } + }, + "tagRenderings": { + "bicycle-library-target-group": { + "mappings": { + "0": { + "then": "Bicicletas para crianças disponíveis" + }, + "1": { + "then": "Bicicletas para adulto disponíveis" + }, + "2": { + "then": "Bicicletas para deficientes físicos disponíveis" + } + }, + "question": "Quem pode emprestar bicicletas aqui?" + }, + "bicycle_library-charge": { + "mappings": { + "0": { + "then": "Emprestar uma bicicleta é grátis" + }, + "1": { + "then": "Emprestar uma bicicleta custa €20/ano e €20 de garantia" + } + }, + "question": "Quanto custa um empréstimo de bicicleta?", + "render": "Custos de empréstimo de bicicleta {charge}" + }, + "bicycle_library-name": { + "question": "Qual o nome desta biblioteca de bicicleta?", + "render": "Esta biblioteca de bicicleta é chamada de {name}" + } + }, + "title": { + "render": "Biblioteca de bicicleta" + } + }, + "bicycle_tube_vending_machine": { + "name": "Máquina de venda automática de tubos de bicicleta", + "presets": { + "0": { + "title": "Máquina de venda automática de tubos de bicicleta" + } + }, + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "Esta máquina de venda automática funciona" + }, + "1": { + "then": "Esta máquina de venda automática está quebrada" + }, + "2": { + "then": "Esta máquina de venda automática está fechada" + } + }, + "question": "Esta máquina de venda automática ainda está operacional?", + "render": "O estado operacional é: {operational_status}" + } + }, + "title": { + "render": "Máquina de venda automática de tubos de bicicleta" + } + }, + "bike_cafe": { + "name": "Café de bicicletas", + "presets": { + "0": { + "title": "Café de bicicleta" + } + }, + "tagRenderings": { + "bike_cafe-email": { + "question": "Qual o endereço de email de {name}?" + }, + "bike_cafe-name": { + "question": "Qual o nome deste café de bicicleta?", + "render": "Este café de bicicleta se chama {name}" + }, + "bike_cafe-opening_hours": { + "question": "Quando este café de bicicleta abre?" + }, + "bike_cafe-phone": { + "question": "Qual o número de telefone de {name}?" + }, + "bike_cafe-repair-service": { + "mappings": { + "0": { + "then": "Este café de bicicleta conserta bicicletas" + }, + "1": { + "then": "Este café de bicicleta não conserta bicicletas" + } + }, + "question": "Este café de bicicleta conserta bicicletas?" + }, + "bike_cafe-repair-tools": { + "mappings": { + "0": { + "then": "Este café de bicicleta oferece ferramentas de reparo faça você mesmo" + }, + "1": { + "then": "Este café de bicicleta não oferece ferramentas de reparo faça você mesmo" + } + }, + "question": "Há ferramentas aqui para consertar sua bicicleta?" + }, + "bike_cafe-website": { + "question": "Qual o website de {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Café de bicicleta {name}" + } + }, + "render": "Café de bicicleta" + } + }, + "bike_cleaning": { + "name": "Serviço de limpeza de bicicletas", + "presets": { + "0": { + "title": "Serviço de limpeza de bicicletas" + } + }, + "title": { + "mappings": { + "0": { + "then": "Serviço de limpeza de bicicletas {name}" + } + }, + "render": "Serviço de limpeza de bicicletas" + } + }, + "bike_parking": { + "name": "Estacionamento de bicicletas", + "presets": { + "0": { + "title": "Estacionamento de bicicletas" + } + }, + "tagRenderings": { + "Access": { + "mappings": { + "0": { + "then": "Acessível ao público" + }, + "1": { + "then": "Acesso é principalmente para visitantes de uma empresa" + }, + "2": { + "then": "Acesso é limitado aos membros de uma escola, companhia ou organização" + } + }, + "question": "Quem pode usar este estacionamento de bicicletas?", + "render": "{access}" + }, + "Bicycle parking type": { + "question": "Qual o tipo deste estacionamento de bicicletas?", + "render": "Este é um estacionamento de bicicletas do tipo: {bicycle_parking}" + }, + "Capacity": { + "render": "Lugar para {capacity} bicicletas" + }, + "Cargo bike capacity?": { + "question": "Quantas bicicletas de carga cabem neste estacionamento de bicicletas?", + "render": "Neste estacionamento cabem {capacity:cargo_bike} bicicletas de carga" + }, + "Cargo bike spaces?": { + "mappings": { + "0": { + "then": "Este estacionamento tem vagas para bicicletas de carga" + }, + "1": { + "then": "Este estacionamento tem vagas (oficiais) projetadas para bicicletas de carga." + }, + "2": { + "then": "Você não tem permissão para estacionar bicicletas de carga" + } + }, + "question": "O estacionamento de bicicletas tem vagas para bicicletas de carga?" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "Este estacionamento é coberto (tem um telhado)" + }, + "1": { + "then": "Este estacionamento não é coberto" + } + }, + "question": "Este estacionamento é coberto? Também selecione \"coberto\" para estacionamentos internos." + }, + "Underground?": { + "mappings": { + "0": { + "then": "Estacionamento subterrâneo" + }, + "1": { + "then": "Estacionamento de superfície" + }, + "2": { + "then": "Estacionamento no telhado" + }, + "3": { + "then": "Estacionamento ao nível da superfície" + }, + "4": { + "then": "Estacionamento no telhado" + } + }, + "question": "Qual a localização relativa deste estacionamento de bicicletas?" + } + }, + "title": { + "render": "Estacionamento de bicicletas" + } + }, + "bike_repair_station": { + "name": "Estações de bicicletas (reparo, bomba ou ambos)", + "presets": { + "0": { + "description": "Um dispositivo para encher seus pneus em um local fixa no espaço público

    Exemplos de bombas de bicicletas

    ", + "title": "Bomba de bicicleta" + } + }, + "tagRenderings": { + "bike_repair_station-available-services": { + "mappings": { + "0": { + "then": "Há somente uma bomba presente" + }, + "1": { + "then": "Há somente ferramentas (chaves de fenda, alicates...) presentes" + }, + "2": { + "then": "Há tanto ferramentas e uma bomba presente" + } + }, + "question": "Quais serviços estão disponíveis nesta estação de bicicletas?" + }, + "bike_repair_station-bike-chain-tool": { + "mappings": { + "0": { + "then": "Há uma ferramenta de corrente" + }, + "1": { + "then": "Não há uma ferramenta de corrente" + } + } + }, + "bike_repair_station-bike-stand": { + "mappings": { + "0": { + "then": "Há um gancho ou um suporte" + }, + "1": { + "then": "Não há um gancho ou um suporte" + } + } + }, + "bike_repair_station-electrical_pump": { + "mappings": { + "0": { + "then": "Bomba manual" + }, + "1": { + "then": "Bomba elétrica" + } + } + }, + "bike_repair_station-manometer": { + "mappings": { + "0": { + "then": "Há um manômetro" + }, + "1": { + "then": "Não há um manômetro" + }, + "2": { + "then": "Há um manômetro mas está quebrado" + } + } + }, + "bike_repair_station-opening_hours": { + "mappings": { + "0": { + "then": "Sempre aberto" + }, + "1": { + "then": "Sempre aberto" + } + } + }, + "bike_repair_station-operator": { + "question": "Quem faz a manutenção desta bomba de ciclo?", + "render": "Mantida por {operator}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Estação de reparo de bicicletas" + }, + "1": { + "then": "Estação de reparo de bicicletas" + }, + "2": { + "then": "Bomba quebrada" + }, + "3": { + "then": "Bomba de bicicleta {name}" + }, + "4": { + "then": "Bomba de bicicleta" + } + }, + "render": "Estação de bicicletas (bomba e reparo)" + } + }, + "bike_shop": { + "description": "Uma loja que vende especificamente bicicletas ou itens relacionados", + "name": "Reparo/loja de bicicletas", + "tagRenderings": { + "bike_repair_rents-bikes": { + "mappings": { + "0": { + "then": "Esta loja aluga bicicletas" + }, + "1": { + "then": "Esta loja não aluga bicicletas" + } + }, + "question": "Esta loja aluga bicicletas?" + }, + "bike_repair_repairs-bikes": { + "mappings": { + "0": { + "then": "Esta loja conserta bicicletas" + }, + "1": { + "then": "Esta loja não conserta bicicletas" + }, + "2": { + "then": "Esta loja conserta bicicletas compradas aqui" + }, + "3": { + "then": "Esta loja conserta bicicletas de uma certa marca" + } + }, + "question": "Esta loja conserta bicicletas?" + }, + "bike_repair_sells-bikes": { + "mappings": { + "0": { + "then": "Esta loja vende bicicletas" + }, + "1": { + "then": "Esta loja não vende bicicletas" + } + }, + "question": "Esta loja vende bicicletas?" + }, + "bike_shop-email": { + "question": "Qual o endereço de email de {name}?" + }, + "bike_shop-is-bicycle_shop": { + "render": "Esta loja é especializada em vender {shop} e faz atividades relacionadas à bicicletas" + }, + "bike_shop-name": { + "question": "Qual o nome desta loja de bicicletas?", + "render": "Esta loja de bicicletas se chama {name}" + }, + "bike_shop-phone": { + "question": "Qual o número de telefone de {name}?" + }, + "bike_shop-website": { + "question": "Qual o website de {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Loja de equipamentos esportivos {name}" + }, + "2": { + "then": "Aluguel de bicicletas {name}" + }, + "3": { + "then": "Reparo de bicicletas {name}" + }, + "4": { + "then": "Loja de bicicletas {name}" + }, + "5": { + "then": "Loja/reparo de bicicletas {name}" + } + }, + "render": "Reparo/loja de bicicletas" + } + }, + "ghost_bike": { + "name": "Bicicleta fantasma", + "title": { + "render": "Bicicleta fantasma" + } + }, + "shops": { + "tagRenderings": { + "shops-shop": { + "mappings": { + "5": { + "then": "Oficina Mecânica" + } + } + } + } + } } \ No newline at end of file diff --git a/langs/layers/ru.json b/langs/layers/ru.json index 0711a616a3..447b79dca7 100644 --- a/langs/layers/ru.json +++ b/langs/layers/ru.json @@ -1,1399 +1,1409 @@ { - "artwork": { - "description": "Разнообразные произведения искусства", - "name": "Произведения искусства", - "presets": { - "0": { - "title": "Художественная работа" - } + "artwork": { + "description": "Разнообразные произведения искусства", + "name": "Произведения искусства", + "presets": { + "0": { + "title": "Художественная работа" + } + }, + "tagRenderings": { + "artwork-artist_name": { + "question": "Какой художник создал это?", + "render": "Создано {artist_name}" + }, + "artwork-artwork_type": { + "mappings": { + "0": { + "then": "Архитектура" + }, + "1": { + "then": "Фреска" + }, + "2": { + "then": "Живопись" + }, + "3": { + "then": "Скульптура" + }, + "4": { + "then": "Статуя" + }, + "5": { + "then": "Бюст" + }, + "6": { + "then": "Камень" + }, + "7": { + "then": "Инсталляция" + }, + "8": { + "then": "Граффити" + }, + "9": { + "then": "Рельеф" + }, + "10": { + "then": "Азуле́жу (испанская роспись глазурованной керамической плитки)" + }, + "11": { + "then": "Плитка (мозаика)" + } }, - "tagRenderings": { - "artwork-artist_name": { - "question": "Какой художник создал это?", - "render": "Создано {artist_name}" - }, - "artwork-artwork_type": { - "mappings": { - "0": { - "then": "Архитектура" - }, - "1": { - "then": "Фреска" - }, - "2": { - "then": "Живопись" - }, - "3": { - "then": "Скульптура" - }, - "4": { - "then": "Статуя" - }, - "5": { - "then": "Бюст" - }, - "6": { - "then": "Камень" - }, - "7": { - "then": "Инсталляция" - }, - "8": { - "then": "Граффити" - }, - "9": { - "then": "Рельеф" - }, - "10": { - "then": "Азуле́жу (испанская роспись глазурованной керамической плитки)" - }, - "11": { - "then": "Плитка (мозаика)" - } - }, - "question": "К какому типу относится эта работа?", - "render": "Это {artwork_type}" - }, - "artwork-website": { - "question": "Есть ли сайт с более подробной информацией об этой работе?", - "render": "Больше информации на этом сайте" - }, - "artwork-wikidata": { - "question": "Какая запись в Wikidata соответсвует этой работе?", - "render": "Запись об этой работе в wikidata: {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Художественная работа {name}" - } - }, - "render": "Художественная работа" + "question": "К какому типу относится эта работа?", + "render": "Это {artwork_type}" + }, + "artwork-website": { + "question": "Есть ли сайт с более подробной информацией об этой работе?", + "render": "Больше информации на этом сайте" + }, + "artwork-wikidata": { + "question": "Какая запись в Wikidata соответсвует этой работе?", + "render": "Запись об этой работе в wikidata: {wikidata}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Художественная работа {name}" } - }, - "barrier": { - "name": "Препятствия", - "presets": { - "0": { - "title": "Прикол" - } - }, - "title": { - "mappings": { - "0": { - "then": "Прикол" - } - }, - "render": "Препятствие" - } - }, - "bench": { - "name": "Скамейки", - "presets": { - "0": { - "title": "cкамейка" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "Со спинкой" - }, - "1": { - "then": "Без спинки" - } - }, - "question": "Есть ли у этой скамейки спинка?", - "render": "Спинка" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "Цвет: коричневый" - }, - "1": { - "then": "Цвет: зеленый" - }, - "2": { - "then": "Цвет: серый" - }, - "3": { - "then": "Цвет: белый" - }, - "4": { - "then": "Цвет: красный" - }, - "5": { - "then": "Цвет: чёрный" - }, - "6": { - "then": "Цвет: синий" - }, - "7": { - "then": "Цвет: желтый" - } - }, - "question": "Какого цвета скамейка?", - "render": "Цвет: {colour}" - }, - "bench-direction": { - "question": "В каком направлении вы смотрите, когда сидите на скамейке?", - "render": "Сидя на скамейке, вы смотрите в сторону {direction}°." - }, - "bench-material": { - "mappings": { - "0": { - "then": "Материал: дерево" - }, - "1": { - "then": "Материал: металл" - }, - "2": { - "then": "Материал: камень" - }, - "3": { - "then": "Материал: бетон" - }, - "4": { - "then": "Материал: пластик" - }, - "5": { - "then": "Материал: сталь" - } - }, - "question": "Из какого материала сделана скамейка?", - "render": "Материал: {material}" - }, - "bench-seats": { - "question": "Сколько мест на этой скамейке?", - "render": "{seats} мест" - }, - "bench-survey:date": { - "question": "Когда последний раз обследовали эту скамейку?", - "render": "Последний раз обследование этой скамейки проводилось {survey:date}" - } - }, - "title": { - "render": "Скамейка" - } - }, - "bench_at_pt": { - "name": "Скамейки на остановках общественного транспорта", - "tagRenderings": { - "bench_at_pt-bench": { - "render": "Встаньте на скамейке" - }, - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Скамейка на остановке общественного транспорта" - }, - "1": { - "then": "Скамейка в укрытии" - } - }, - "render": "Скамейка" - } - }, - "bicycle_library": { - "description": "Учреждение, где велосипед может быть арендован на более длительный срок", - "name": "Велосипедная библиотека", - "presets": { - "0": { - "description": "В велосипедной библиотеке есть велосипеды для аренды", - "title": "Велосипедная библиотека" - } - }, - "tagRenderings": { - "bicycle-library-target-group": { - "mappings": { - "0": { - "then": "Доступны детские велосипеды" - }, - "1": { - "then": "Доступны велосипеды для взрослых" - }, - "2": { - "then": "Доступны велосипеды для людей с ограниченными возможностями" - } - }, - "question": "Кто здесь может арендовать велосипед?" - }, - "bicycle_library-charge": { - "mappings": { - "0": { - "then": "Прокат велосипедов бесплатен" - }, - "1": { - "then": "Прокат велосипеда стоит €20/год и €20 залог" - } - }, - "question": "Сколько стоит прокат велосипеда?", - "render": "Стоимость аренды велосипеда {charge}" - }, - "bicycle_library-name": { - "question": "Как называется эта велосипедная библиотека?", - "render": "Эта велосипедная библиотека называется {name}" - } - }, - "title": { - "render": "Велосипедная библиотека" - } - }, - "bicycle_tube_vending_machine": { - "name": "Торговый автомат для велосипедистов", - "presets": { - "0": { - "title": "Торговый автомат для велосипедистов" - } - }, - "tagRenderings": { - "Still in use?": { - "mappings": { - "0": { - "then": "Этот торговый автомат работает" - }, - "1": { - "then": "Этот торговый автомат сломан" - }, - "2": { - "then": "Этот торговый автомат закрыт" - } - }, - "question": "Этот торговый автомат все еще работает?", - "render": "Рабочий статус: {operational_status" - } - }, - "title": { - "render": "Торговый автомат для велосипедистов" - } - }, - "bike_cafe": { - "name": "Велосипедное кафе", - "presets": { - "0": { - "title": "Велосипедное кафе" - } - }, - "tagRenderings": { - "bike_cafe-bike-pump": { - "mappings": { - "0": { - "then": "В этом велосипедном кафе есть велосипедный насос для всеобщего использования" - }, - "1": { - "then": "В этом велосипедном кафе нет велосипедного насоса для всеобщего использования" - } - }, - "question": "Есть ли в этом велосипедном кафе велосипедный насос для всеобщего использования?" - }, - "bike_cafe-email": { - "question": "Какой адрес электронной почты у {name}?" - }, - "bike_cafe-name": { - "question": "Как называется это байк-кафе?", - "render": "Это велосипедное кафе называется {name}" - }, - "bike_cafe-opening_hours": { - "question": "Каков режим работы этого велосипедного кафе?" - }, - "bike_cafe-phone": { - "question": "Какой номер телефона у {name}?" - }, - "bike_cafe-repair-service": { - "mappings": { - "0": { - "then": "В этом велосипедном кафе есть услуги ремонта велосипедов" - }, - "1": { - "then": "В этом велосипедном кафе нет услуг ремонта велосипедов" - } - }, - "question": "Есть ли услуги ремонта велосипедов в этом велосипедном кафе?" - }, - "bike_cafe-repair-tools": { - "mappings": { - "0": { - "then": "В этом велосипедном кафе есть инструменты для починки своего велосипеда" - }, - "1": { - "then": "В этом велосипедном кафе нет инструментов для починки своего велосипеда" - } - }, - "question": "Есть ли здесь инструменты для починки вашего велосипеда?" - }, - "bike_cafe-website": { - "question": "Какой сайт у {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Велосипедное кафе {name}" - } - }, - "render": "Велосипедное кафе" - } - }, - "bike_parking": { - "name": "Велопарковка", - "presets": { - "0": { - "title": "Велопарковка" - } - }, - "tagRenderings": { - "Access": { - "question": "Кто может пользоваться этой велопарковкой?", - "render": "{access}" - }, - "Bicycle parking type": { - "mappings": { - "3": { - "then": "Стойка " - }, - "4": { - "then": "Двухуровневая " - }, - "5": { - "then": "Навес " - } - }, - "question": "К какому типу относится эта велопарковка?", - "render": "Это велопарковка типа {bicycle_parking}" - }, - "Capacity": { - "render": "Место для {capacity} велосипеда(ов)" - }, - "Is covered?": { - "mappings": { - "0": { - "then": "Это крытая парковка (есть крыша/навес)" - }, - "1": { - "then": "Это открытая парковка" - } - } - }, - "Underground?": { - "mappings": { - "0": { - "then": "Подземная парковка" - }, - "1": { - "then": "Подземная парковка" - }, - "4": { - "then": "Парковка на крыше" - } - } - } - }, - "title": { - "render": "Велопарковка" - } - }, - "bike_repair_station": { - "presets": { - "0": { - "title": "Велосипедный насос" - } - }, - "tagRenderings": { - "Operational status": { - "mappings": { - "0": { - "then": "Велосипедный насос сломан" - }, - "1": { - "then": "Велосипедный насос работает" - } - }, - "question": "Велосипедный насос все еще работает?" - }, - "bike_repair_station-electrical_pump": { - "mappings": { - "0": { - "then": "Ручной насос" - }, - "1": { - "then": "Электрический насос" - } - }, - "question": "Это электрический велосипедный насос?" - }, - "bike_repair_station-manometer": { - "mappings": { - "0": { - "then": "Есть манометр" - }, - "1": { - "then": "Нет манометра" - }, - "2": { - "then": "Есть манометр, но он сломан" - } - } - }, - "bike_repair_station-opening_hours": { - "mappings": { - "0": { - "then": "Всегда открыто" - } - }, - "question": "Когда работает эта точка обслуживания велосипедов?" - }, - "bike_repair_station-valves": { - "mappings": { - "0": { - "then": "Клапан Presta (также известный как французский клапан)" - }, - "1": { - "then": "Клапан Dunlop" - } - }, - "render": "Этот насос поддерживает следующие клапаны: {valves}" - } - }, - "title": { - "mappings": { - "2": { - "then": "Сломанный насос" - }, - "3": { - "then": "Велосипедный насос {name}" - }, - "4": { - "then": "Велосипедный насос" - } - } - } - }, - "bike_shop": { - "description": "Магазин, специализирующийся на продаже велосипедов или сопутствующих товаров", - "name": "Обслуживание велосипедов/магазин", - "presets": { - "0": { - "title": "Обслуживание велосипедов/магазин" - } - }, - "tagRenderings": { - "bike_repair_bike-pump-service": { - "mappings": { - "0": { - "then": "В этом магазине есть велосипедный насос для всеобщего пользования" - }, - "1": { - "then": "В этом магазине нет велосипедного насоса для всеобщего пользования" - } - }, - "question": "Предлагается ли в этом магазине велосипедный насос для всеобщего пользования?" - }, - "bike_repair_bike-wash": { - "mappings": { - "0": { - "then": "В этом магазине оказываются услуги мойки/чистки велосипедов" - }, - "2": { - "then": "В этом магазине нет услуг мойки/чистки велосипедов" - } - }, - "question": "Здесь моют велосипеды?" - }, - "bike_repair_rents-bikes": { - "mappings": { - "0": { - "then": "Этот магазин сдает велосипеды в аренду" - }, - "1": { - "then": "Этот магазин не сдает велосипеды напрокат" - } - }, - "question": "Этот магазин сдает велосипеды в аренду?" - }, - "bike_repair_repairs-bikes": { - "mappings": { - "0": { - "then": "Этот магазин ремонтирует велосипеды" - }, - "1": { - "then": "Этот магазин не ремонтирует велосипеды" - }, - "2": { - "then": "Этот магазин ремонтирует только велосипеды, купленные здесь" - }, - "3": { - "then": "В этом магазине обслуживают велосипеды определённого бренда" - } - }, - "question": "В этом магазине ремонтируют велосипеды?" - }, - "bike_repair_second-hand-bikes": { - "mappings": { - "0": { - "then": "В этом магазине продаются подержанные велосипеды" - }, - "1": { - "then": "В этом магазине не продаются подержанные велосипеды" - }, - "2": { - "then": "В этом магазине продаются только подержанные велосипеды" - } - }, - "question": "В этом магазине продаются подержанные велосипеды?" - }, - "bike_repair_sells-bikes": { - "mappings": { - "0": { - "then": "В этом магазине продаются велосипеды" - }, - "1": { - "then": "В этом магазине не продают велосипеды" - } - }, - "question": "Продаются ли велосипеды в этом магазине?" - }, - "bike_repair_tools-service": { - "mappings": { - "2": { - "then": "Инструменты для починки доступны только при покупке/аренде велосипеда в магазине" - } - }, - "question": "Есть ли здесь инструменты для починки собственного велосипеда?" - }, - "bike_shop-email": { - "question": "Какой адрес электронной почты у {name}?" - }, - "bike_shop-name": { - "question": "Как называется магазин велосипедов?", - "render": "Этот магазин велосипедов называется {name}" - }, - "bike_shop-phone": { - "question": "Какой номер телефона у {name}?" - }, - "bike_shop-website": { - "question": "Какой сайт у {name}?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Магазин спортивного инвентаря {name}" - }, - "2": { - "then": "Прокат велосипедов {name}" - }, - "3": { - "then": "Ремонт велосипедов {name}" - }, - "4": { - "then": "Магазин велосипедов {name}" - } - }, - "render": "Обслуживание велосипедов/магазин" - } - }, - "binocular": { - "description": "Бинокли", - "name": "Бинокль", - "presets": { - "0": { - "title": "бинокль" - } - }, - "title": { - "render": "Бинокль" - } - }, - "cafe_pub": { - "presets": { - "0": { - "title": "паб" - }, - "1": { - "title": "бар" - }, - "2": { - "title": "кафе" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - } - } - }, - "crossings": { - "presets": { - "1": { - "title": "Светофор" - } - }, - "title": { - "mappings": { - "0": { - "then": "Светофор" - } - } - } - }, - "cycleways_and_roads": { - "title": { - "mappings": { - "0": { - "then": "Велосипедная дорожка" - } - }, - "render": "Велосипедные дорожки" - } - }, - "defibrillator": { - "name": "Дефибрилляторы", - "presets": { - "0": { - "title": "Дефибриллятор" - } - }, - "tagRenderings": { - "defibrillator-access": { - "mappings": { - "0": { - "then": "Общедоступный" - }, - "1": { - "then": "Общедоступный" - }, - "2": { - "then": "Доступно только для клиентов" - } - } - }, - "defibrillator-defibrillator": { - "mappings": { - "1": { - "then": "Это обычный автоматический дефибриллятор" - } - } - }, - "defibrillator-description": { - "render": "Дополнительная информация: {description}" - }, - "defibrillator-fixme": { - "render": "Дополнительная информация для экспертов OpenStreetMap: {fixme}" - }, - "defibrillator-opening_hours": { - "question": "В какое время доступен этот дефибриллятор?", - "render": "{opening_hours_table(opening_hours)}" - }, - "defibrillator-survey:date": { - "mappings": { - "0": { - "then": "Проверено сегодня!" - } - } - } - }, - "title": { - "render": "Дефибриллятор" - } - }, - "direction": { - "name": "Визуализация направления" - }, - "drinking_water": { - "name": "Питьевая вода", - "presets": { - "0": { - "title": "питьевая вода" - } - }, - "title": { - "render": "Питьевая вода" - } - }, - "food": { - "presets": { - "0": { - "title": "ресторан" - }, - "1": { - "title": "быстрое питание" - } - }, - "tagRenderings": { - "friture-take-your-container": { - "mappings": { - "1": { - "then": "Приносить свою тару не разрешено" - } - } - } - } - }, - "ghost_bike": { - "name": "Велосипед Ghost", - "tagRenderings": { - "ghost_bike-inscription": { - "render": "{inscription}" - }, - "ghost_bike-name": { - "render": "В знак памяти о {name}" - }, - "ghost_bike-source": { - "render": "Доступна более подробная информация" - }, - "ghost_bike-start_date": { - "render": "Установлен {start_date}" - } - }, - "title": { - "render": "Велосипед Ghost" - } - }, - "information_board": { - "name": "Информационные щиты", - "presets": { - "0": { - "title": "информационный щит" - } - }, - "title": { - "render": "Информационный щит" - } - }, - "map": { - "name": "Карты", - "presets": { - "0": { - "title": "Карта" - } - }, - "tagRenderings": { - "map-map_source": { - "mappings": { - "0": { - "then": "Эта карта основана на OpenStreetMap" - } - }, - "render": "Эта карта основана на {map_source}" - } - }, - "title": { - "render": "Карта" - } - }, - "nature_reserve": { - "tagRenderings": { - "Email": { - "render": "{email}" - }, - "phone": { - "render": "{phone}" - } - } - }, - "observation_tower": { - "name": "Смотровые башни", - "presets": { - "0": { - "title": "смотровая башня" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Смотровая башня" - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " метр" - } - } - } - } - }, - "picnic_table": { - "description": "Слой, отображающий столы для пикника", - "name": "Столы для пикника", - "presets": { - "0": { - "title": "стол для пикника" - } - }, - "tagRenderings": { - "picnic_table-material": { - "mappings": { - "0": { - "then": "Это деревянный стол для пикника" - }, - "1": { - "then": "Это бетонный стол для пикника" - } - }, - "question": "Из чего изготовлен этот стол для пикника?", - "render": "Этот стол для пикника сделан из {material}" - } - }, - "title": { - "render": "Стол для пикника" - } - }, - "playground": { - "description": "Детские площадки", - "name": "Детские площадки", - "presets": { - "0": { - "title": "Детская площадка" - } - }, - "tagRenderings": { - "Playground-wheelchair": { - "mappings": { - "0": { - "then": "Полностью доступна пользователям кресел-колясок" - }, - "1": { - "then": "Частично доступна пользователям кресел-колясок" - }, - "2": { - "then": "Недоступна пользователям кресел-колясок" - } - }, - "question": "Доступна ли детская площадка пользователям кресел-колясок?" - }, - "playground-access": { - "mappings": { - "4": { - "then": "Недоступно" - } - } - }, - "playground-email": { - "render": "{email}" - }, - "playground-lit": { - "mappings": { - "0": { - "then": "Эта детская площадка освещается ночью" - }, - "1": { - "then": "Эта детская площадка не освещается ночью" - } - }, - "question": "Эта игровая площадка освещается ночью?" - }, - "playground-max_age": { - "render": "Доступно детям до {max_age}" - }, - "playground-min_age": { - "question": "С какого возраста доступна эта детская площадка?", - "render": "Доступно для детей старше {min_age} лет" - }, - "playground-opening_hours": { - "mappings": { - "0": { - "then": "Открыто от рассвета до заката" - }, - "1": { - "then": "Всегда доступен" - }, - "2": { - "then": "Всегда доступен" - } - }, - "question": "Когда открыта эта игровая площадка?" - }, - "playground-phone": { - "render": "{phone}" - }, - "playground-surface": { - "mappings": { - "0": { - "then": "Поверхность - трава" - }, - "1": { - "then": "Поверхность - песок" - }, - "2": { - "then": "Покрытие из щепы" - }, - "3": { - "then": "Поверхность - брусчатка" - }, - "4": { - "then": "Поверхность - асфальт" - }, - "5": { - "then": "Поверхность - бетон" - } - }, - "render": "Поверхность - {surface}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Детская площадка {name}" - } - }, - "render": "Детская площадка" - } - }, - "public_bookcase": { - "description": "Уличный шкаф с книгами, доступными для всех", - "name": "Книжные шкафы", - "presets": { - "0": { - "title": "Книжный шкаф" - } - }, - "tagRenderings": { - "bookcase-booktypes": { - "mappings": { - "0": { - "then": "В основном детские книги" - }, - "1": { - "then": "В основном книги для взрослых" - }, - "2": { - "then": "Книги и для детей, и для взрослых" - } - }, - "question": "Какие книги можно найти в этом общественном книжном шкафу?" - }, - "bookcase-is-accessible": { - "mappings": { - "0": { - "then": "Свободный доступ" - } - }, - "question": "Имеется ли свободный доступ к этому общественному книжному шкафу?" - }, - "public_bookcase-capacity": { - "question": "Сколько книг помещается в этом общественном книжном шкафу?", - "render": "{capacity} книг помещается в этот книжный шкаф" - }, - "public_bookcase-name": { - "mappings": { - "0": { - "then": "У этого книжного шкафа нет названия" - } - }, - "question": "Как называется этот общественный книжный шкаф?", - "render": "Название книжного шкафа — {name}" - }, - "public_bookcase-start_date": { - "question": "Когда был установлен этот общественный книжный шкаф?", - "render": "Установлен {start_date}" - }, - "public_bookcase-website": { - "question": "Есть ли веб-сайт с более подробной информацией об этом общественном книжном шкафе?", - "render": "Более подробная информация на сайте" - } - }, - "title": { - "mappings": { - "0": { - "then": "Общественный книжный шкаф {name}" - } - }, - "render": "Книжный шкаф" - } - }, - "shops": { - "description": "Магазин", - "name": "Магазин", - "presets": { - "0": { - "description": "Добавить новый магазин", - "title": "Магазин" - } - }, - "tagRenderings": { - "shops-email": { - "question": "Каков адрес электронной почты этого магазина?", - "render": "{email}" - }, - "shops-name": { - "question": "Как называется этот магазин?" - }, - "shops-opening_hours": { - "question": "Каковы часы работы этого магазина?", - "render": "{opening_hours_table(opening_hours)}" - }, - "shops-phone": { - "question": "Какой телефон?", - "render": "{phone}" - }, - "shops-shop": { - "mappings": { - "1": { - "then": "Супермаркет" - }, - "2": { - "then": "Магазин одежды" - }, - "3": { - "then": "Парикмахерская" - }, - "5": { - "then": "Автомастерская" - }, - "6": { - "then": "Автосалон" - } - }, - "question": "Что продаётся в этом магазине?" - }, - "shops-website": { - "question": "Какой веб-сайт у этого магазина?", - "render": "{website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - }, - "1": { - "then": "{shop}" - } - }, - "render": "Магазин" - } - }, - "slow_roads": { - "tagRenderings": { - "slow_roads-surface": { - "mappings": { - "0": { - "then": "Поверхность - трава" - }, - "1": { - "then": "Поверхность - земля" - }, - "3": { - "then": "Поверхность - песок" - }, - "4": { - "then": "Поверхность - брусчатка" - }, - "5": { - "then": "Поверхность - асфальт" - }, - "6": { - "then": "Поверхность - бетон" - } - }, - "render": "Поверхность - {surface}" - } - } - }, - "sport_pitch": { - "description": "Спортивная площадка", - "name": "Спортивные площадки", - "presets": { - "0": { - "title": "Стол для настольного тенниса" - }, - "1": { - "title": "Спортивная площадка" - } - }, - "tagRenderings": { - "sport-pitch-access": { - "mappings": { - "0": { - "then": "Свободный доступ" - }, - "1": { - "then": "Ограниченный доступ (напр., только по записи, в определённые часы, ...)" - }, - "2": { - "then": "Доступ только членам клуба" - } - }, - "question": "Есть ли свободный доступ к этой спортивной площадке?" - }, - "sport-pitch-reservation": { - "mappings": { - "1": { - "then": "Желательна предварительная запись для доступа на эту спортивную площадку" - }, - "2": { - "then": "Предварительная запись для доступа на эту спортивную площадку возможна, но не обязательна" - }, - "3": { - "then": "Невозможна предварительная запись" - } - }, - "question": "Нужна ли предварительная запись для доступа на эту спортивную площадку?" - }, - "sport_pitch-opening_hours": { - "mappings": { - "1": { - "then": "Всегда доступен" - } - }, - "question": "В какое время доступна эта площадка?" - }, - "sport_pitch-sport": { - "mappings": { - "0": { - "then": "Здесь можно играть в баскетбол" - }, - "1": { - "then": "Здесь можно играть в футбол" - }, - "2": { - "then": "Это стол для пинг-понга" - }, - "3": { - "then": "Здесь можно играть в теннис" - }, - "4": { - "then": "Здесь можно играть в корфбол" - }, - "5": { - "then": "Здесь можно играть в баскетбол" - } - } - }, - "sport_pitch-surface": { - "mappings": { - "0": { - "then": "Поверхность - трава" - }, - "1": { - "then": "Поверхность - песок" - }, - "2": { - "then": "Поверхность - брусчатка" - }, - "3": { - "then": "Поверхность - асфальт" - }, - "4": { - "then": "Поверхность - бетон" - } - }, - "question": "Какое покрытие на этой спортивной площадке?", - "render": "Поверхность - {surface}" - } - }, - "title": { - "render": "Спортивная площадка" - } - }, - "surveillance_camera": { - "name": "Камеры наблюдения", - "tagRenderings": { - "Camera type: fixed; panning; dome": { - "mappings": { - "1": { - "then": "Камера с поворотным механизмом" - }, - "2": { - "then": "Панорамная камера" - } - }, - "question": "Какая это камера?" - }, - "Indoor camera? This isn't clear for 'public'-cameras": { - "mappings": { - "1": { - "then": "Эта камера расположена снаружи" - }, - "2": { - "then": "Возможно, эта камера расположена снаружи" - } - } - }, - "camera:mount": { - "question": "Как расположена эта камера?" - } - }, - "title": { - "render": "Камера наблюдения" - } - }, - "toilet": { - "name": "Туалеты", - "presets": { - "0": { - "description": "Туалет или комната отдыха со свободным доступом", - "title": "tуалет" - }, - "1": { - "title": "tуалет с доступом для пользователей кресел-колясок" - } - }, - "tagRenderings": { - "toilet-access": { - "mappings": { - "0": { - "then": "Свободный доступ" - }, - "2": { - "then": "Недоступно" - }, - "4": { - "then": "Свободный доступ" - } - }, - "question": "Есть ли свободный доступ к этим туалетам?" - }, - "toilet-charge": { - "question": "Сколько стоит посещение туалета?", - "render": "Стоимость {charge}" - }, - "toilets-fee": { - "mappings": { - "0": { - "then": "Это платные туалеты" - } - } - }, - "toilets-type": { - "question": "Какие это туалеты?" - }, - "toilets-wheelchair": { - "mappings": { - "1": { - "then": "Недоступно пользователям кресел-колясок" - } - } - } - }, - "title": { - "render": "Туалет" - } - }, - "trail": { - "name": "Тропы", - "title": { - "render": "Тропа" - } - }, - "tree_node": { - "name": "Дерево", - "presets": { - "0": { - "title": "Лиственное дерево" - }, - "1": { - "description": "Дерево с хвоей (иглами), например, сосна или ель.", - "title": "Хвойное дерево" - }, - "2": { - "description": "Если вы не уверены в том, лиственное это дерево или хвойное.", - "title": "Дерево" - } - }, - "tagRenderings": { - "tree-decidouous": { - "mappings": { - "0": { - "then": "Листопадное: у дерева опадают листья в определённое время года." - }, - "1": { - "then": "Вечнозелёное." - } - }, - "question": "Это дерево вечнозелёное или листопадное?" - }, - "tree-height": { - "mappings": { - "0": { - "then": "Высота: {height} м" - } - }, - "render": "Высота: {height}" - }, - "tree_node-name": { - "mappings": { - "0": { - "then": "У этого дерева нет названия." - } - }, - "question": "Есть ли у этого дерева название?", - "render": "Название: {name}" - }, - "tree_node-ref:OnroerendErfgoed": { - "render": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}" - }, - "tree_node-wikidata": { - "render": "\"\"/ Wikidata: {wikidata}" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Дерево" - } - }, - "viewpoint": { - "name": "Смотровая площадка", - "presets": { - "0": { - "title": "Смотровая площадка" - } - }, - "tagRenderings": { - "viewpoint-description": { - "question": "Вы хотите добавить описание?" - } - }, - "title": { - "render": "Смотровая площадка" - } - }, - "visitor_information_centre": { - "title": { - "mappings": { - "1": { - "then": "{name}" - } - }, - "render": "{name}" - } - }, - "waste_basket": { - "iconSize": { - "mappings": { - "0": { - "then": "Контейнер для мусора" - } - } - }, - "name": "Контейнер для мусора", - "presets": { - "0": { - "title": "Контейнер для мусора" - } - }, - "title": { - "render": "Контейнер для мусора" - } - }, - "watermill": { - "name": "Водяная мельница" + }, + "render": "Художественная работа" } + }, + "barrier": { + "name": "Препятствия", + "presets": { + "0": { + "title": "Прикол" + } + }, + "title": { + "mappings": { + "0": { + "then": "Прикол" + } + }, + "render": "Препятствие" + } + }, + "bench": { + "name": "Скамейки", + "presets": { + "0": { + "title": "cкамейка" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "Со спинкой" + }, + "1": { + "then": "Без спинки" + } + }, + "question": "Есть ли у этой скамейки спинка?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "Цвет: коричневый" + }, + "1": { + "then": "Цвет: зеленый" + }, + "2": { + "then": "Цвет: серый" + }, + "3": { + "then": "Цвет: белый" + }, + "4": { + "then": "Цвет: красный" + }, + "5": { + "then": "Цвет: чёрный" + }, + "6": { + "then": "Цвет: синий" + }, + "7": { + "then": "Цвет: желтый" + } + }, + "question": "Какого цвета скамейка?", + "render": "Цвет: {colour}" + }, + "bench-direction": { + "question": "В каком направлении вы смотрите, когда сидите на скамейке?", + "render": "Сидя на скамейке, вы смотрите в сторону {direction}°." + }, + "bench-material": { + "mappings": { + "0": { + "then": "Материал: дерево" + }, + "1": { + "then": "Материал: металл" + }, + "2": { + "then": "Материал: камень" + }, + "3": { + "then": "Материал: бетон" + }, + "4": { + "then": "Материал: пластик" + }, + "5": { + "then": "Материал: сталь" + } + }, + "question": "Из какого материала сделана скамейка?", + "render": "Материал: {material}" + }, + "bench-seats": { + "question": "Сколько мест на этой скамейке?", + "render": "{seats} мест" + }, + "bench-survey:date": { + "question": "Когда последний раз обследовали эту скамейку?", + "render": "Последний раз обследование этой скамейки проводилось {survey:date}" + } + }, + "title": { + "render": "Скамейка" + } + }, + "bench_at_pt": { + "name": "Скамейки на остановках общественного транспорта", + "tagRenderings": { + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "Встаньте на скамейке" + } + } + }, + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Скамейка на остановке общественного транспорта" + }, + "1": { + "then": "Скамейка в укрытии" + } + }, + "render": "Скамейка" + } + }, + "bicycle_library": { + "description": "Учреждение, где велосипед может быть арендован на более длительный срок", + "name": "Велосипедная библиотека", + "presets": { + "0": { + "description": "В велосипедной библиотеке есть велосипеды для аренды", + "title": "Велосипедная библиотека" + } + }, + "tagRenderings": { + "bicycle-library-target-group": { + "mappings": { + "0": { + "then": "Доступны детские велосипеды" + }, + "1": { + "then": "Доступны велосипеды для взрослых" + }, + "2": { + "then": "Доступны велосипеды для людей с ограниченными возможностями" + } + }, + "question": "Кто здесь может арендовать велосипед?" + }, + "bicycle_library-charge": { + "mappings": { + "0": { + "then": "Прокат велосипедов бесплатен" + }, + "1": { + "then": "Прокат велосипеда стоит €20/год и €20 залог" + } + }, + "question": "Сколько стоит прокат велосипеда?", + "render": "Стоимость аренды велосипеда {charge}" + }, + "bicycle_library-name": { + "question": "Как называется эта велосипедная библиотека?", + "render": "Эта велосипедная библиотека называется {name}" + } + }, + "title": { + "render": "Велосипедная библиотека" + } + }, + "bicycle_tube_vending_machine": { + "name": "Торговый автомат для велосипедистов", + "presets": { + "0": { + "title": "Торговый автомат для велосипедистов" + } + }, + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "Этот торговый автомат работает" + }, + "1": { + "then": "Этот торговый автомат сломан" + }, + "2": { + "then": "Этот торговый автомат закрыт" + } + }, + "question": "Этот торговый автомат все еще работает?", + "render": "Рабочий статус: {operational_status}" + } + }, + "title": { + "render": "Торговый автомат для велосипедистов" + } + }, + "bike_cafe": { + "name": "Велосипедное кафе", + "presets": { + "0": { + "title": "Велосипедное кафе" + } + }, + "tagRenderings": { + "bike_cafe-bike-pump": { + "mappings": { + "0": { + "then": "В этом велосипедном кафе есть велосипедный насос для всеобщего использования" + }, + "1": { + "then": "В этом велосипедном кафе нет велосипедного насоса для всеобщего использования" + } + }, + "question": "Есть ли в этом велосипедном кафе велосипедный насос для всеобщего использования?" + }, + "bike_cafe-email": { + "question": "Какой адрес электронной почты у {name}?" + }, + "bike_cafe-name": { + "question": "Как называется это байк-кафе?", + "render": "Это велосипедное кафе называется {name}" + }, + "bike_cafe-opening_hours": { + "question": "Каков режим работы этого велосипедного кафе?" + }, + "bike_cafe-phone": { + "question": "Какой номер телефона у {name}?" + }, + "bike_cafe-repair-service": { + "mappings": { + "0": { + "then": "В этом велосипедном кафе есть услуги ремонта велосипедов" + }, + "1": { + "then": "В этом велосипедном кафе нет услуг ремонта велосипедов" + } + }, + "question": "Есть ли услуги ремонта велосипедов в этом велосипедном кафе?" + }, + "bike_cafe-repair-tools": { + "mappings": { + "0": { + "then": "В этом велосипедном кафе есть инструменты для починки своего велосипеда" + }, + "1": { + "then": "В этом велосипедном кафе нет инструментов для починки своего велосипеда" + } + }, + "question": "Есть ли здесь инструменты для починки вашего велосипеда?" + }, + "bike_cafe-website": { + "question": "Какой сайт у {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Велосипедное кафе {name}" + } + }, + "render": "Велосипедное кафе" + } + }, + "bike_parking": { + "name": "Велопарковка", + "presets": { + "0": { + "title": "Велопарковка" + } + }, + "tagRenderings": { + "Access": { + "question": "Кто может пользоваться этой велопарковкой?", + "render": "{access}" + }, + "Bicycle parking type": { + "mappings": { + "3": { + "then": "Стойка " + }, + "4": { + "then": "Двухуровневая " + }, + "5": { + "then": "Навес " + } + }, + "question": "К какому типу относится эта велопарковка?", + "render": "Это велопарковка типа {bicycle_parking}" + }, + "Capacity": { + "render": "Место для {capacity} велосипеда(ов)" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "Это крытая парковка (есть крыша/навес)" + }, + "1": { + "then": "Это открытая парковка" + } + } + }, + "Underground?": { + "mappings": { + "0": { + "then": "Подземная парковка" + }, + "1": { + "then": "Подземная парковка" + }, + "2": { + "then": "Парковка на крыше" + }, + "4": { + "then": "Парковка на крыше" + } + } + } + }, + "title": { + "render": "Велопарковка" + } + }, + "bike_repair_station": { + "presets": { + "0": { + "title": "Велосипедный насос" + } + }, + "tagRenderings": { + "Operational status": { + "mappings": { + "0": { + "then": "Велосипедный насос сломан" + }, + "1": { + "then": "Велосипедный насос работает" + } + }, + "question": "Велосипедный насос все еще работает?" + }, + "bike_repair_station-electrical_pump": { + "mappings": { + "0": { + "then": "Ручной насос" + }, + "1": { + "then": "Электрический насос" + } + }, + "question": "Это электрический велосипедный насос?" + }, + "bike_repair_station-manometer": { + "mappings": { + "0": { + "then": "Есть манометр" + }, + "1": { + "then": "Нет манометра" + }, + "2": { + "then": "Есть манометр, но он сломан" + } + } + }, + "bike_repair_station-opening_hours": { + "mappings": { + "0": { + "then": "Всегда открыто" + } + }, + "question": "Когда работает эта точка обслуживания велосипедов?" + }, + "bike_repair_station-valves": { + "mappings": { + "0": { + "then": "Клапан Presta (также известный как французский клапан)" + }, + "1": { + "then": "Клапан Dunlop" + } + }, + "render": "Этот насос поддерживает следующие клапаны: {valves}" + } + }, + "title": { + "mappings": { + "2": { + "then": "Сломанный насос" + }, + "3": { + "then": "Велосипедный насос {name}" + }, + "4": { + "then": "Велосипедный насос" + } + } + } + }, + "bike_shop": { + "description": "Магазин, специализирующийся на продаже велосипедов или сопутствующих товаров", + "name": "Обслуживание велосипедов/магазин", + "presets": { + "0": { + "title": "Обслуживание велосипедов/магазин" + } + }, + "tagRenderings": { + "bike_repair_bike-pump-service": { + "mappings": { + "0": { + "then": "В этом магазине есть велосипедный насос для всеобщего пользования" + }, + "1": { + "then": "В этом магазине нет велосипедного насоса для всеобщего пользования" + } + }, + "question": "Предлагается ли в этом магазине велосипедный насос для всеобщего пользования?" + }, + "bike_repair_bike-wash": { + "mappings": { + "0": { + "then": "В этом магазине оказываются услуги мойки/чистки велосипедов" + }, + "2": { + "then": "В этом магазине нет услуг мойки/чистки велосипедов" + } + }, + "question": "Здесь моют велосипеды?" + }, + "bike_repair_rents-bikes": { + "mappings": { + "0": { + "then": "Этот магазин сдает велосипеды в аренду" + }, + "1": { + "then": "Этот магазин не сдает велосипеды напрокат" + } + }, + "question": "Этот магазин сдает велосипеды в аренду?" + }, + "bike_repair_repairs-bikes": { + "mappings": { + "0": { + "then": "Этот магазин ремонтирует велосипеды" + }, + "1": { + "then": "Этот магазин не ремонтирует велосипеды" + }, + "2": { + "then": "Этот магазин ремонтирует только велосипеды, купленные здесь" + }, + "3": { + "then": "В этом магазине обслуживают велосипеды определённого бренда" + } + }, + "question": "В этом магазине ремонтируют велосипеды?" + }, + "bike_repair_second-hand-bikes": { + "mappings": { + "0": { + "then": "В этом магазине продаются подержанные велосипеды" + }, + "1": { + "then": "В этом магазине не продаются подержанные велосипеды" + }, + "2": { + "then": "В этом магазине продаются только подержанные велосипеды" + } + }, + "question": "В этом магазине продаются подержанные велосипеды?" + }, + "bike_repair_sells-bikes": { + "mappings": { + "0": { + "then": "В этом магазине продаются велосипеды" + }, + "1": { + "then": "В этом магазине не продают велосипеды" + } + }, + "question": "Продаются ли велосипеды в этом магазине?" + }, + "bike_repair_tools-service": { + "mappings": { + "2": { + "then": "Инструменты для починки доступны только при покупке/аренде велосипеда в магазине" + } + }, + "question": "Есть ли здесь инструменты для починки собственного велосипеда?" + }, + "bike_shop-email": { + "question": "Какой адрес электронной почты у {name}?" + }, + "bike_shop-name": { + "question": "Как называется магазин велосипедов?", + "render": "Этот магазин велосипедов называется {name}" + }, + "bike_shop-phone": { + "question": "Какой номер телефона у {name}?" + }, + "bike_shop-website": { + "question": "Какой сайт у {name}?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Магазин спортивного инвентаря {name}" + }, + "2": { + "then": "Прокат велосипедов {name}" + }, + "3": { + "then": "Ремонт велосипедов {name}" + }, + "4": { + "then": "Магазин велосипедов {name}" + } + }, + "render": "Обслуживание велосипедов/магазин" + } + }, + "binocular": { + "description": "Бинокли", + "name": "Бинокль", + "presets": { + "0": { + "title": "бинокль" + } + }, + "title": { + "render": "Бинокль" + } + }, + "cafe_pub": { + "presets": { + "0": { + "title": "паб" + }, + "1": { + "title": "бар" + }, + "2": { + "title": "кафе" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + } + } + }, + "crossings": { + "presets": { + "1": { + "title": "Светофор" + } + }, + "title": { + "mappings": { + "0": { + "then": "Светофор" + } + } + } + }, + "cycleways_and_roads": { + "title": { + "mappings": { + "0": { + "then": "Велосипедная дорожка" + } + }, + "render": "Велосипедные дорожки" + } + }, + "defibrillator": { + "name": "Дефибрилляторы", + "presets": { + "0": { + "title": "Дефибриллятор" + } + }, + "tagRenderings": { + "defibrillator-access": { + "mappings": { + "0": { + "then": "Общедоступный" + }, + "1": { + "then": "Общедоступный" + }, + "2": { + "then": "Доступно только для клиентов" + } + } + }, + "defibrillator-defibrillator": { + "mappings": { + "2": { + "then": "Это обычный автоматический дефибриллятор" + } + } + }, + "defibrillator-description": { + "render": "Дополнительная информация: {description}" + }, + "defibrillator-fixme": { + "render": "Дополнительная информация для экспертов OpenStreetMap: {fixme}" + }, + "defibrillator-opening_hours": { + "question": "В какое время доступен этот дефибриллятор?", + "render": "{opening_hours_table(opening_hours)}" + }, + "defibrillator-survey:date": { + "mappings": { + "0": { + "then": "Проверено сегодня!" + } + } + } + }, + "title": { + "render": "Дефибриллятор" + } + }, + "direction": { + "name": "Визуализация направления" + }, + "drinking_water": { + "name": "Питьевая вода", + "presets": { + "0": { + "title": "питьевая вода" + } + }, + "title": { + "render": "Питьевая вода" + } + }, + "food": { + "presets": { + "0": { + "title": "ресторан" + }, + "1": { + "title": "быстрое питание" + } + }, + "tagRenderings": { + "friture-take-your-container": { + "mappings": { + "1": { + "then": "Приносить свою тару не разрешено" + } + } + } + } + }, + "ghost_bike": { + "name": "Велосипед Ghost", + "tagRenderings": { + "ghost_bike-inscription": { + "render": "{inscription}" + }, + "ghost_bike-name": { + "render": "В знак памяти о {name}" + }, + "ghost_bike-source": { + "render": "Доступна более подробная информация" + }, + "ghost_bike-start_date": { + "render": "Установлен {start_date}" + } + }, + "title": { + "render": "Велосипед Ghost" + } + }, + "information_board": { + "name": "Информационные щиты", + "presets": { + "0": { + "title": "информационный щит" + } + }, + "title": { + "render": "Информационный щит" + } + }, + "map": { + "name": "Карты", + "presets": { + "0": { + "title": "Карта" + } + }, + "tagRenderings": { + "map-map_source": { + "mappings": { + "0": { + "then": "Эта карта основана на OpenStreetMap" + } + }, + "render": "Эта карта основана на {map_source}" + } + }, + "title": { + "render": "Карта" + } + }, + "nature_reserve": { + "tagRenderings": { + "Email": { + "render": "{email}" + }, + "phone": { + "render": "{phone}" + } + } + }, + "observation_tower": { + "name": "Смотровые башни", + "presets": { + "0": { + "title": "смотровая башня" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Смотровая башня" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " метр" + } + } + } + } + }, + "picnic_table": { + "description": "Слой, отображающий столы для пикника", + "name": "Столы для пикника", + "presets": { + "0": { + "title": "стол для пикника" + } + }, + "tagRenderings": { + "picnic_table-material": { + "mappings": { + "0": { + "then": "Это деревянный стол для пикника" + }, + "1": { + "then": "Это бетонный стол для пикника" + } + }, + "question": "Из чего изготовлен этот стол для пикника?", + "render": "Этот стол для пикника сделан из {material}" + } + }, + "title": { + "render": "Стол для пикника" + } + }, + "playground": { + "description": "Детские площадки", + "name": "Детские площадки", + "presets": { + "0": { + "title": "Детская площадка" + } + }, + "tagRenderings": { + "Playground-wheelchair": { + "mappings": { + "0": { + "then": "Полностью доступна пользователям кресел-колясок" + }, + "1": { + "then": "Частично доступна пользователям кресел-колясок" + }, + "2": { + "then": "Недоступна пользователям кресел-колясок" + } + }, + "question": "Доступна ли детская площадка пользователям кресел-колясок?" + }, + "playground-access": { + "mappings": { + "4": { + "then": "Недоступно" + } + } + }, + "playground-email": { + "render": "{email}" + }, + "playground-lit": { + "mappings": { + "0": { + "then": "Эта детская площадка освещается ночью" + }, + "1": { + "then": "Эта детская площадка не освещается ночью" + } + }, + "question": "Эта игровая площадка освещается ночью?" + }, + "playground-max_age": { + "render": "Доступно детям до {max_age}" + }, + "playground-min_age": { + "question": "С какого возраста доступна эта детская площадка?", + "render": "Доступно для детей старше {min_age} лет" + }, + "playground-opening_hours": { + "mappings": { + "0": { + "then": "Открыто от рассвета до заката" + }, + "1": { + "then": "Всегда доступен" + }, + "2": { + "then": "Всегда доступен" + } + }, + "question": "Когда открыта эта игровая площадка?" + }, + "playground-phone": { + "render": "{phone}" + }, + "playground-surface": { + "mappings": { + "0": { + "then": "Поверхность - трава" + }, + "1": { + "then": "Поверхность - песок" + }, + "2": { + "then": "Покрытие из щепы" + }, + "3": { + "then": "Поверхность - брусчатка" + }, + "4": { + "then": "Поверхность - асфальт" + }, + "5": { + "then": "Поверхность - бетон" + } + }, + "render": "Поверхность - {surface}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Детская площадка {name}" + } + }, + "render": "Детская площадка" + } + }, + "public_bookcase": { + "description": "Уличный шкаф с книгами, доступными для всех", + "name": "Книжные шкафы", + "presets": { + "0": { + "title": "Книжный шкаф" + } + }, + "tagRenderings": { + "bookcase-booktypes": { + "mappings": { + "0": { + "then": "В основном детские книги" + }, + "1": { + "then": "В основном книги для взрослых" + }, + "2": { + "then": "Книги и для детей, и для взрослых" + } + }, + "question": "Какие книги можно найти в этом общественном книжном шкафу?" + }, + "bookcase-is-accessible": { + "mappings": { + "0": { + "then": "Свободный доступ" + } + }, + "question": "Имеется ли свободный доступ к этому общественному книжному шкафу?" + }, + "public_bookcase-capacity": { + "question": "Сколько книг помещается в этом общественном книжном шкафу?", + "render": "{capacity} книг помещается в этот книжный шкаф" + }, + "public_bookcase-name": { + "mappings": { + "0": { + "then": "У этого книжного шкафа нет названия" + } + }, + "question": "Как называется этот общественный книжный шкаф?", + "render": "Название книжного шкафа — {name}" + }, + "public_bookcase-start_date": { + "question": "Когда был установлен этот общественный книжный шкаф?", + "render": "Установлен {start_date}" + }, + "public_bookcase-website": { + "question": "Есть ли веб-сайт с более подробной информацией об этом общественном книжном шкафе?", + "render": "Более подробная информация на сайте" + } + }, + "title": { + "mappings": { + "0": { + "then": "Общественный книжный шкаф {name}" + } + }, + "render": "Книжный шкаф" + } + }, + "shops": { + "description": "Магазин", + "name": "Магазин", + "presets": { + "0": { + "description": "Добавить новый магазин", + "title": "Магазин" + } + }, + "tagRenderings": { + "shops-email": { + "question": "Каков адрес электронной почты этого магазина?", + "render": "{email}" + }, + "shops-name": { + "question": "Как называется этот магазин?" + }, + "shops-opening_hours": { + "question": "Каковы часы работы этого магазина?", + "render": "{opening_hours_table(opening_hours)}" + }, + "shops-phone": { + "question": "Какой телефон?", + "render": "{phone}" + }, + "shops-shop": { + "mappings": { + "1": { + "then": "Супермаркет" + }, + "2": { + "then": "Магазин одежды" + }, + "3": { + "then": "Парикмахерская" + }, + "5": { + "then": "Автомастерская" + }, + "6": { + "then": "Автосалон" + } + }, + "question": "Что продаётся в этом магазине?" + }, + "shops-website": { + "question": "Какой веб-сайт у этого магазина?", + "render": "{website}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "{shop}" + } + }, + "render": "Магазин" + } + }, + "slow_roads": { + "tagRenderings": { + "slow_roads-surface": { + "mappings": { + "0": { + "then": "Поверхность - трава" + }, + "1": { + "then": "Поверхность - земля" + }, + "3": { + "then": "Поверхность - песок" + }, + "4": { + "then": "Поверхность - брусчатка" + }, + "5": { + "then": "Поверхность - асфальт" + }, + "6": { + "then": "Поверхность - бетон" + } + }, + "render": "Поверхность - {surface}" + } + } + }, + "sport_pitch": { + "description": "Спортивная площадка", + "name": "Спортивные площадки", + "presets": { + "0": { + "title": "Стол для настольного тенниса" + }, + "1": { + "title": "Спортивная площадка" + } + }, + "tagRenderings": { + "sport-pitch-access": { + "mappings": { + "0": { + "then": "Свободный доступ" + }, + "1": { + "then": "Ограниченный доступ (напр., только по записи, в определённые часы, ...)" + }, + "2": { + "then": "Доступ только членам клуба" + } + }, + "question": "Есть ли свободный доступ к этой спортивной площадке?" + }, + "sport-pitch-reservation": { + "mappings": { + "1": { + "then": "Желательна предварительная запись для доступа на эту спортивную площадку" + }, + "2": { + "then": "Предварительная запись для доступа на эту спортивную площадку возможна, но не обязательна" + }, + "3": { + "then": "Невозможна предварительная запись" + } + }, + "question": "Нужна ли предварительная запись для доступа на эту спортивную площадку?" + }, + "sport_pitch-opening_hours": { + "mappings": { + "1": { + "then": "Всегда доступен" + } + }, + "question": "В какое время доступна эта площадка?" + }, + "sport_pitch-sport": { + "mappings": { + "0": { + "then": "Здесь можно играть в баскетбол" + }, + "1": { + "then": "Здесь можно играть в футбол" + }, + "2": { + "then": "Это стол для пинг-понга" + }, + "3": { + "then": "Здесь можно играть в теннис" + }, + "4": { + "then": "Здесь можно играть в корфбол" + }, + "5": { + "then": "Здесь можно играть в баскетбол" + } + } + }, + "sport_pitch-surface": { + "mappings": { + "0": { + "then": "Поверхность - трава" + }, + "1": { + "then": "Поверхность - песок" + }, + "2": { + "then": "Поверхность - брусчатка" + }, + "3": { + "then": "Поверхность - асфальт" + }, + "4": { + "then": "Поверхность - бетон" + } + }, + "question": "Какое покрытие на этой спортивной площадке?", + "render": "Поверхность - {surface}" + } + }, + "title": { + "render": "Спортивная площадка" + } + }, + "surveillance_camera": { + "name": "Камеры наблюдения", + "tagRenderings": { + "Camera type: fixed; panning; dome": { + "mappings": { + "1": { + "then": "Камера с поворотным механизмом" + }, + "2": { + "then": "Панорамная камера" + } + }, + "question": "Какая это камера?" + }, + "camera:mount": { + "question": "Как расположена эта камера?" + }, + "is_indoor": { + "mappings": { + "1": { + "then": "Эта камера расположена снаружи" + }, + "2": { + "then": "Возможно, эта камера расположена снаружи" + } + } + } + }, + "title": { + "render": "Камера наблюдения" + } + }, + "toilet": { + "name": "Туалеты", + "presets": { + "0": { + "description": "Туалет или комната отдыха со свободным доступом", + "title": "tуалет" + }, + "1": { + "title": "tуалет с доступом для пользователей кресел-колясок" + } + }, + "tagRenderings": { + "toilet-access": { + "mappings": { + "0": { + "then": "Свободный доступ" + }, + "2": { + "then": "Недоступно" + }, + "4": { + "then": "Свободный доступ" + } + }, + "question": "Есть ли свободный доступ к этим туалетам?" + }, + "toilet-charge": { + "question": "Сколько стоит посещение туалета?", + "render": "Стоимость {charge}" + }, + "toilets-fee": { + "mappings": { + "0": { + "then": "Это платные туалеты" + } + } + }, + "toilets-type": { + "question": "Какие это туалеты?" + }, + "toilets-wheelchair": { + "mappings": { + "1": { + "then": "Недоступно пользователям кресел-колясок" + } + } + } + }, + "title": { + "render": "Туалет" + } + }, + "trail": { + "name": "Тропы", + "title": { + "render": "Тропа" + } + }, + "tree_node": { + "name": "Дерево", + "presets": { + "0": { + "title": "Лиственное дерево" + }, + "1": { + "description": "Дерево с хвоей (иглами), например, сосна или ель.", + "title": "Хвойное дерево" + }, + "2": { + "description": "Если вы не уверены в том, лиственное это дерево или хвойное.", + "title": "Дерево" + } + }, + "tagRenderings": { + "tree-decidouous": { + "mappings": { + "0": { + "then": "Листопадное: у дерева опадают листья в определённое время года." + }, + "1": { + "then": "Вечнозелёное." + } + }, + "question": "Это дерево вечнозелёное или листопадное?" + }, + "tree-height": { + "mappings": { + "0": { + "then": "Высота: {height} м" + } + }, + "render": "Высота: {height}" + }, + "tree_node-name": { + "mappings": { + "0": { + "then": "У этого дерева нет названия." + } + }, + "question": "Есть ли у этого дерева название?", + "render": "Название: {name}" + }, + "tree_node-ref:OnroerendErfgoed": { + "render": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}" + }, + "tree_node-wikidata": { + "render": "\"\"/ Wikidata: {wikidata}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Дерево" + } + }, + "viewpoint": { + "name": "Смотровая площадка", + "presets": { + "0": { + "title": "Смотровая площадка" + } + }, + "tagRenderings": { + "viewpoint-description": { + "question": "Вы хотите добавить описание?" + } + }, + "title": { + "render": "Смотровая площадка" + } + }, + "visitor_information_centre": { + "title": { + "mappings": { + "1": { + "then": "{name}" + } + }, + "render": "{name}" + } + }, + "waste_basket": { + "mapRendering": { + "0": { + "iconSize": { + "mappings": { + "0": { + "then": "Контейнер для мусора" + } + } + } + } + }, + "name": "Контейнер для мусора", + "presets": { + "0": { + "title": "Контейнер для мусора" + } + }, + "title": { + "render": "Контейнер для мусора" + } + }, + "watermill": { + "name": "Водяная мельница" + } } \ No newline at end of file diff --git a/langs/layers/sv.json b/langs/layers/sv.json index 5aca32268c..fd555286ac 100644 --- a/langs/layers/sv.json +++ b/langs/layers/sv.json @@ -1,34 +1,34 @@ { - "artwork": { - "presets": { - "0": { - "title": "Konstverk" - } - }, - "title": { - "mappings": { - "0": { - "then": "Konstverk {name}" - } - }, - "render": "Konstverk" - } + "artwork": { + "presets": { + "0": { + "title": "Konstverk" + } }, - "ghost_bike": { - "name": "Spökcykel", - "title": { - "render": "Spökcykel" - } - }, - "shops": { - "tagRenderings": { - "shops-shop": { - "mappings": { - "5": { - "then": "Bilverkstad" - } - } - } + "title": { + "mappings": { + "0": { + "then": "Konstverk {name}" } + }, + "render": "Konstverk" } + }, + "ghost_bike": { + "name": "Spökcykel", + "title": { + "render": "Spökcykel" + } + }, + "shops": { + "tagRenderings": { + "shops-shop": { + "mappings": { + "5": { + "then": "Bilverkstad" + } + } + } + } + } } \ No newline at end of file diff --git a/langs/layers/zh_Hans.json b/langs/layers/zh_Hans.json index 360a52c611..c6a570228a 100644 --- a/langs/layers/zh_Hans.json +++ b/langs/layers/zh_Hans.json @@ -1,205 +1,208 @@ { - "bench": { - "name": "长椅", - "presets": { - "0": { - "title": "长椅" - } - }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "靠背:有" - }, - "1": { - "then": "靠背:无" - } - }, - "question": "这个长椅有靠背吗?", - "render": "靠背" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "颜色:棕" - }, - "1": { - "then": "颜色:绿" - }, - "2": { - "then": "颜色:灰" - }, - "3": { - "then": "颜色:白" - }, - "4": { - "then": "颜色:红" - }, - "5": { - "then": "颜色:黑" - }, - "6": { - "then": "颜色:蓝" - }, - "7": { - "then": "颜色:黄" - } - }, - "question": "这个长椅是什么颜色的?", - "render": "颜色: {colour}" - }, - "bench-direction": { - "question": "坐在长椅上的时候你目视的方向是哪边?", - "render": "坐在长椅上的时候目视方向为 {direction}°方位。" - }, - "bench-material": { - "mappings": { - "0": { - "then": "材质:木" - }, - "1": { - "then": "材质:金属" - }, - "2": { - "then": "材质:石头" - }, - "3": { - "then": "材质:混凝土" - }, - "4": { - "then": "材质:塑料" - }, - "5": { - "then": "材质:不锈钢" - } - }, - "question": "这个长椅(或座椅)是用什么材料做的?", - "render": "材质: {material}" - }, - "bench-seats": { - "question": "这个长椅有几个座位?" - }, - "bench-survey:date": { - "question": "上次对这个长椅实地调查是什么时候?", - "render": "这个长椅于 {survey:date}最后一次实地调查" - } - }, - "title": { - "render": "长椅" - } + "bench": { + "name": "长椅", + "presets": { + "0": { + "title": "长椅" + } }, - "bench_at_pt": { - "name": "在公交站点的长椅", - "tagRenderings": { - "bench_at_pt-bench": { - "render": "站立长凳" - }, - "bench_at_pt-name": { - "render": "{name}" - } + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "靠背:有" + }, + "1": { + "then": "靠背:无" + } }, - "title": { - "mappings": { - "0": { - "then": "在公交站点的长椅" - }, - "1": { - "then": "在庇护所的长椅" - } - }, - "render": "长椅" - } - }, - "bicycle_library": { - "tagRenderings": { - "bicycle-library-target-group": { - "question": "谁可以从这里借自行车?" - } - } - }, - "bicycle_tube_vending_machine": { - "tagRenderings": { - "Still in use?": { - "mappings": { - "0": { - "then": "这个借还机正常工作" - }, - "1": { - "then": "这个借还机已经损坏" - }, - "2": { - "then": "这个借还机被关闭了" - } - } - } - } - }, - "bike_cafe": { - "name": "自行车咖啡", - "presets": { - "0": { - "title": "自行车咖啡" - } + "question": "这个长椅有靠背吗?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "颜色:棕" + }, + "1": { + "then": "颜色:绿" + }, + "2": { + "then": "颜色:灰" + }, + "3": { + "then": "颜色:白" + }, + "4": { + "then": "颜色:红" + }, + "5": { + "then": "颜色:黑" + }, + "6": { + "then": "颜色:蓝" + }, + "7": { + "then": "颜色:黄" + } }, - "tagRenderings": { - "bike_cafe-bike-pump": { - "mappings": { - "0": { - "then": "这家自行车咖啡为每个人提供打气筒" - }, - "1": { - "then": "这家自行车咖啡不为每个人提供打气筒" - } - }, - "question": "这家自行车咖啡为每个使用者提供打气筒吗?" - }, - "bike_cafe-email": { - "question": "{name}的电子邮箱是什么?" - }, - "bike_cafe-name": { - "question": "这个自行车咖啡的名字是什么?", - "render": "这家自行车咖啡叫做 {name}" - }, - "bike_cafe-opening_hours": { - "question": "这家自行车咖啡什么时候开门营业?" - }, - "bike_cafe-phone": { - "question": "{name}的电话号码是什么?" - }, - "bike_cafe-repair-service": { - "mappings": { - "0": { - "then": "这家自行车咖啡可以修车" - }, - "1": { - "then": "这家自行车咖啡不能修车" - } - }, - "question": "这家自行车咖啡t提供修车服务吗?" - }, - "bike_cafe-repair-tools": { - "mappings": { - "0": { - "then": "这家自行车咖啡为DIY修理者提供工具" - }, - "1": { - "then": "这家自行车咖啡不为DIY修理者提供工具" - } - }, - "question": "这里有供你修车用的工具吗?" - }, - "bike_cafe-website": { - "question": "{name}的网站是什么?" - } + "question": "这个长椅是什么颜色的?", + "render": "颜色: {colour}" + }, + "bench-direction": { + "question": "坐在长椅上的时候你目视的方向是哪边?", + "render": "坐在长椅上的时候目视方向为 {direction}°方位。" + }, + "bench-material": { + "mappings": { + "0": { + "then": "材质:木" + }, + "1": { + "then": "材质:金属" + }, + "2": { + "then": "材质:石头" + }, + "3": { + "then": "材质:混凝土" + }, + "4": { + "then": "材质:塑料" + }, + "5": { + "then": "材质:不锈钢" + } }, - "title": { - "mappings": { - "0": { - "then": "自行车咖啡 {name}" - } - }, - "render": "自行车咖啡" - } + "question": "这个长椅(或座椅)是用什么材料做的?", + "render": "材质: {material}" + }, + "bench-seats": { + "question": "这个长椅有几个座位?" + }, + "bench-survey:date": { + "question": "上次对这个长椅实地调查是什么时候?", + "render": "这个长椅于 {survey:date}最后一次实地调查" + } + }, + "title": { + "render": "长椅" } + }, + "bench_at_pt": { + "name": "在公交站点的长椅", + "tagRenderings": { + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "站立长凳" + } + } + }, + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "在公交站点的长椅" + }, + "1": { + "then": "在庇护所的长椅" + } + }, + "render": "长椅" + } + }, + "bicycle_library": { + "tagRenderings": { + "bicycle-library-target-group": { + "question": "谁可以从这里借自行车?" + } + } + }, + "bicycle_tube_vending_machine": { + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "这个借还机正常工作" + }, + "1": { + "then": "这个借还机已经损坏" + }, + "2": { + "then": "这个借还机被关闭了" + } + } + } + } + }, + "bike_cafe": { + "name": "自行车咖啡", + "presets": { + "0": { + "title": "自行车咖啡" + } + }, + "tagRenderings": { + "bike_cafe-bike-pump": { + "mappings": { + "0": { + "then": "这家自行车咖啡为每个人提供打气筒" + }, + "1": { + "then": "这家自行车咖啡不为每个人提供打气筒" + } + }, + "question": "这家自行车咖啡为每个使用者提供打气筒吗?" + }, + "bike_cafe-email": { + "question": "{name}的电子邮箱是什么?" + }, + "bike_cafe-name": { + "question": "这个自行车咖啡的名字是什么?", + "render": "这家自行车咖啡叫做 {name}" + }, + "bike_cafe-opening_hours": { + "question": "这家自行车咖啡什么时候开门营业?" + }, + "bike_cafe-phone": { + "question": "{name}的电话号码是什么?" + }, + "bike_cafe-repair-service": { + "mappings": { + "0": { + "then": "这家自行车咖啡可以修车" + }, + "1": { + "then": "这家自行车咖啡不能修车" + } + }, + "question": "这家自行车咖啡t提供修车服务吗?" + }, + "bike_cafe-repair-tools": { + "mappings": { + "0": { + "then": "这家自行车咖啡为DIY修理者提供工具" + }, + "1": { + "then": "这家自行车咖啡不为DIY修理者提供工具" + } + }, + "question": "这里有供你修车用的工具吗?" + }, + "bike_cafe-website": { + "question": "{name}的网站是什么?" + } + }, + "title": { + "mappings": { + "0": { + "then": "自行车咖啡 {name}" + } + }, + "render": "自行车咖啡" + } + } } \ No newline at end of file diff --git a/langs/layers/zh_Hant.json b/langs/layers/zh_Hant.json index 59f59f5aa6..92fdbfe65e 100644 --- a/langs/layers/zh_Hant.json +++ b/langs/layers/zh_Hant.json @@ -1,454 +1,457 @@ { - "artwork": { - "description": "不同類型的藝術品", - "name": "藝術品", - "presets": { - "0": { - "title": "藝術品" - } - }, - "tagRenderings": { - "artwork-artist_name": { - "question": "創造這個的藝術家是誰?", - "render": "{artist_name} 創作" - }, - "artwork-artwork_type": { - "mappings": { - "0": { - "then": "建築物" - }, - "1": { - "then": "壁畫" - }, - "2": { - "then": "繪畫" - }, - "3": { - "then": "雕塑" - }, - "4": { - "then": "雕像" - }, - "5": { - "then": "半身像" - }, - "6": { - "then": "石頭" - }, - "7": { - "then": "安裝" - }, - "8": { - "then": "塗鴨" - }, - "9": { - "then": "寬慰" - }, - "10": { - "then": "Azulejo (西班牙雕塑作品名稱)" - }, - "11": { - "then": "瓷磚" - } - }, - "question": "這是什麼類型的藝術品?", - "render": "這是 {artwork_type}" - }, - "artwork-website": { - "question": "在那個網站能夠找到更多藝術品的資訊?", - "render": "這個網站有更多資訊" - }, - "artwork-wikidata": { - "question": "這個藝術品有那個對應的 Wikidata 項目?", - "render": "與 {wikidata}對應" - } - }, - "title": { - "mappings": { - "0": { - "then": "藝術品{name}" - } - }, - "render": "藝術品" - } + "artwork": { + "description": "不同類型的藝術品", + "name": "藝術品", + "presets": { + "0": { + "title": "藝術品" + } }, - "bench": { - "name": "長椅", - "presets": { - "0": { - "title": "長椅" - } + "tagRenderings": { + "artwork-artist_name": { + "question": "創造這個的藝術家是誰?", + "render": "{artist_name} 創作" + }, + "artwork-artwork_type": { + "mappings": { + "0": { + "then": "建築物" + }, + "1": { + "then": "壁畫" + }, + "2": { + "then": "繪畫" + }, + "3": { + "then": "雕塑" + }, + "4": { + "then": "雕像" + }, + "5": { + "then": "半身像" + }, + "6": { + "then": "石頭" + }, + "7": { + "then": "安裝" + }, + "8": { + "then": "塗鴨" + }, + "9": { + "then": "寬慰" + }, + "10": { + "then": "Azulejo (西班牙雕塑作品名稱)" + }, + "11": { + "then": "瓷磚" + } }, - "tagRenderings": { - "bench-backrest": { - "mappings": { - "0": { - "then": "靠背:有" - }, - "1": { - "then": "靠背:無" - } - }, - "question": "這個長椅是否有靠背?", - "render": "靠背" - }, - "bench-colour": { - "mappings": { - "0": { - "then": "顏色:棕色" - }, - "1": { - "then": "顏色:綠色" - }, - "2": { - "then": "顏色:灰色" - }, - "3": { - "then": "顏色:白色" - }, - "4": { - "then": "顏色:紅色" - }, - "5": { - "then": "顏色:黑色" - }, - "6": { - "then": "顏色:藍色" - }, - "7": { - "then": "顏色:黃色" - } - }, - "question": "這個長椅是什麼顏色的?", - "render": "顏色:{colour}" - }, - "bench-direction": { - "question": "坐在長椅時是面對那個方向?", - "render": "當坐在長椅時,那個人朝向 {direction}°。" - }, - "bench-material": { - "mappings": { - "0": { - "then": "材質:木頭" - }, - "1": { - "then": "材質:金屬" - }, - "2": { - "then": "材質:石頭" - }, - "3": { - "then": "材質:水泥" - }, - "4": { - "then": "材質:塑膠" - }, - "5": { - "then": "材質:鋼鐵" - } - }, - "question": "這個長椅 (座位) 是什麼做的?", - "render": "材質:{material}" - }, - "bench-seats": { - "question": "這個長椅有幾個位子?", - "render": "{seats} 座位數" - }, - "bench-survey:date": { - "question": "上一次探察長椅是什麼時候?", - "render": "這個長椅最後是在 {survey:date} 探查的" - } - }, - "title": { - "render": "長椅" - } + "question": "這是什麼類型的藝術品?", + "render": "這是 {artwork_type}" + }, + "artwork-website": { + "question": "在那個網站能夠找到更多藝術品的資訊?", + "render": "這個網站有更多資訊" + }, + "artwork-wikidata": { + "question": "這個藝術品有那個對應的 Wikidata 項目?", + "render": "與 {wikidata}對應" + } }, - "bench_at_pt": { - "name": "大眾運輸站點的長椅", - "tagRenderings": { - "bench_at_pt-bench": { - "render": "站立長椅" - }, - "bench_at_pt-name": { - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "大眾運輸站點的長椅" - }, - "1": { - "then": "涼亭內的長椅" - } - }, - "render": "長椅" - } - }, - "bicycle_library": { - "description": "能夠長期租用單車的設施", - "name": "單車圖書館", - "presets": { - "0": { - "description": "單車圖書館有一大批單車供人租借", - "title": "自行車圖書館 ( Fietsbibliotheek)" - } - }, - "tagRenderings": { - "bicycle-library-target-group": { - "mappings": { - "0": { - "then": "提供兒童單車" - }, - "1": { - "then": "有提供成人單車" - }, - "2": { - "then": "有提供行動不便人士的單車" - } - }, - "question": "誰可以在這裡租單車?" - }, - "bicycle_library-charge": { - "mappings": { - "0": { - "then": "租借單車免費" - }, - "1": { - "then": "租借單車價錢 €20/year 與 €20 保證金" - } - }, - "question": "租用單車的費用多少?", - "render": "租借單車需要 {charge}" - }, - "bicycle_library-name": { - "question": "這個單車圖書館的名稱是?", - "render": "這個單車圖書館叫做 {name}" - } - }, - "title": { - "render": "單車圖書館" - } - }, - "bicycle_tube_vending_machine": { - "name": "自行車內胎自動售貨機", - "presets": { - "0": { - "title": "自行車內胎自動售貨機" - } - }, - "tagRenderings": { - "Still in use?": { - "mappings": { - "0": { - "then": "這個自動販賣機仍運作" - }, - "1": { - "then": "這個自動販賣機沒有運作了" - }, - "2": { - "then": "這個自動販賣機已經關閉了" - } - }, - "question": "這個自動販賣機仍有運作嗎?", - "render": "運作狀態是 {operational_status" - } - }, - "title": { - "render": "自行車內胎自動售貨機" - } - }, - "bike_cafe": { - "name": "單車咖啡廳", - "presets": { - "0": { - "title": "單車咖啡廳" - } - }, - "tagRenderings": { - "bike_cafe-bike-pump": { - "mappings": { - "0": { - "then": "這個單車咖啡廳有提供給任何人都能使用的單車打氣甬" - }, - "1": { - "then": "這個單車咖啡廳並沒有為所有人提供單車打氣甬" - } - }, - "question": "這個單車咖啡廳有提供給任何人都能使用的單車打氣甬嗎?" - }, - "bike_cafe-email": { - "question": "{name} 的電子郵件地址是?" - }, - "bike_cafe-name": { - "question": "這個單車咖啡廳的名稱是?", - "render": "這個單車咖啡廳叫做 {name}" - }, - "bike_cafe-opening_hours": { - "question": "何時這個單車咖啡廳營運?" - }, - "bike_cafe-phone": { - "question": "{name} 的電話號碼是?" - }, - "bike_cafe-repair-service": { - "mappings": { - "0": { - "then": "這個單車咖啡廳修理單車" - }, - "1": { - "then": "這個單車咖啡廳並不修理單車" - } - }, - "question": "這個單車咖啡廳是否能修理單車?" - }, - "bike_cafe-repair-tools": { - "mappings": { - "0": { - "then": "這個單車咖啡廳提供工具讓你修理" - }, - "1": { - "then": "這個單車咖啡廳並沒有提供工具讓你修理" - } - }, - "question": "這裡是否有工具修理你的單車嗎?" - }, - "bike_cafe-website": { - "question": "{name} 的網站是?" - } - }, - "title": { - "mappings": { - "0": { - "then": "單車咖啡廳{name}" - } - }, - "render": "單車咖啡廳" - } - }, - "bike_cleaning": { - "name": "單車清理服務", - "presets": { - "0": { - "title": "單車清理服務" - } - }, - "title": { - "mappings": { - "0": { - "then": "單車清理服務 {name}" - } - }, - "render": "單車清理服務" - } - }, - "bike_parking": { - "name": "單車停車場", - "presets": { - "0": { - "title": "單車停車場" - } - }, - "tagRenderings": { - "Access": { - "mappings": { - "0": { - "then": "公開可用" - }, - "1": { - "then": "通行性主要是為了企業的顧客" - }, - "2": { - "then": "通行性僅限學校、公司或組織的成員" - } - }, - "question": "誰可以使用這個單車停車場?", - "render": "{access}" - }, - "Bicycle parking type": { - "mappings": { - "0": { - "then": "單車架 " - }, - "1": { - "then": "車輪架/圓圈 " - }, - "2": { - "then": "車把架 " - }, - "3": { - "then": "車架" - }, - "4": { - "then": "兩層" - }, - "5": { - "then": "車棚 " - }, - "6": { - "then": "柱子 " - }, - "7": { - "then": "樓層當中標示為單車停車場的區域" - } - }, - "question": "這是那種類型的單車停車場?", - "render": "這個單車停車場的類型是:{bicycle_parking}" - }, - "Capacity": { - "question": "這個單車停車場能放幾台單車 (包括裝箱單車)?", - "render": "{capacity} 單車的地方" - }, - "Cargo bike spaces?": { - "mappings": { - "0": { - "then": "這個停車場有地方可以放裝箱單車" - }, - "1": { - "then": "這停車場有設計 (官方) 空間給裝箱的單車。" - } - }, - "question": "這個單車停車場有地方放裝箱的單車嗎?" - }, - "Is covered?": { - "mappings": { - "0": { - "then": "這個停車場有遮蔽 (有屋頂)" - }, - "1": { - "then": "這個停車場沒有遮蔽" - } - }, - "question": "這個停車場是否有車棚?如果是室內停車場也請選擇\"遮蔽\"。" - }, - "Underground?": { - "mappings": { - "0": { - "then": "地下停車場" - }, - "1": { - "then": "地下停車場" - }, - "2": { - "then": "地面停車場" - }, - "3": { - "then": "地面層停車場" - }, - "4": { - "then": "屋頂停車場" - } - }, - "question": "這個單車停車場的相對位置是?" - } - }, - "title": { - "render": "單車停車場" - } - }, - "ghost_bike": { - "name": "幽靈單車", - "title": { - "render": "幽靈單車" + "title": { + "mappings": { + "0": { + "then": "藝術品{name}" } + }, + "render": "藝術品" } + }, + "bench": { + "name": "長椅", + "presets": { + "0": { + "title": "長椅" + } + }, + "tagRenderings": { + "bench-backrest": { + "mappings": { + "0": { + "then": "靠背:有" + }, + "1": { + "then": "靠背:無" + } + }, + "question": "這個長椅是否有靠背?" + }, + "bench-colour": { + "mappings": { + "0": { + "then": "顏色:棕色" + }, + "1": { + "then": "顏色:綠色" + }, + "2": { + "then": "顏色:灰色" + }, + "3": { + "then": "顏色:白色" + }, + "4": { + "then": "顏色:紅色" + }, + "5": { + "then": "顏色:黑色" + }, + "6": { + "then": "顏色:藍色" + }, + "7": { + "then": "顏色:黃色" + } + }, + "question": "這個長椅是什麼顏色的?", + "render": "顏色:{colour}" + }, + "bench-direction": { + "question": "坐在長椅時是面對那個方向?", + "render": "當坐在長椅時,那個人朝向 {direction}°。" + }, + "bench-material": { + "mappings": { + "0": { + "then": "材質:木頭" + }, + "1": { + "then": "材質:金屬" + }, + "2": { + "then": "材質:石頭" + }, + "3": { + "then": "材質:水泥" + }, + "4": { + "then": "材質:塑膠" + }, + "5": { + "then": "材質:鋼鐵" + } + }, + "question": "這個長椅 (座位) 是什麼做的?", + "render": "材質:{material}" + }, + "bench-seats": { + "question": "這個長椅有幾個位子?", + "render": "{seats} 座位數" + }, + "bench-survey:date": { + "question": "上一次探察長椅是什麼時候?", + "render": "這個長椅最後是在 {survey:date} 探查的" + } + }, + "title": { + "render": "長椅" + } + }, + "bench_at_pt": { + "name": "大眾運輸站點的長椅", + "tagRenderings": { + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "站立長椅" + } + } + }, + "bench_at_pt-name": { + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "大眾運輸站點的長椅" + }, + "1": { + "then": "涼亭內的長椅" + } + }, + "render": "長椅" + } + }, + "bicycle_library": { + "description": "能夠長期租用單車的設施", + "name": "單車圖書館", + "presets": { + "0": { + "description": "單車圖書館有一大批單車供人租借", + "title": "自行車圖書館 ( Fietsbibliotheek)" + } + }, + "tagRenderings": { + "bicycle-library-target-group": { + "mappings": { + "0": { + "then": "提供兒童單車" + }, + "1": { + "then": "有提供成人單車" + }, + "2": { + "then": "有提供行動不便人士的單車" + } + }, + "question": "誰可以在這裡租單車?" + }, + "bicycle_library-charge": { + "mappings": { + "0": { + "then": "租借單車免費" + }, + "1": { + "then": "租借單車價錢 €20/year 與 €20 保證金" + } + }, + "question": "租用單車的費用多少?", + "render": "租借單車需要 {charge}" + }, + "bicycle_library-name": { + "question": "這個單車圖書館的名稱是?", + "render": "這個單車圖書館叫做 {name}" + } + }, + "title": { + "render": "單車圖書館" + } + }, + "bicycle_tube_vending_machine": { + "name": "自行車內胎自動售貨機", + "presets": { + "0": { + "title": "自行車內胎自動售貨機" + } + }, + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "這個自動販賣機仍運作" + }, + "1": { + "then": "這個自動販賣機沒有運作了" + }, + "2": { + "then": "這個自動販賣機已經關閉了" + } + }, + "question": "這個自動販賣機仍有運作嗎?", + "render": "運作狀態是 {operational_status}" + } + }, + "title": { + "render": "自行車內胎自動售貨機" + } + }, + "bike_cafe": { + "name": "單車咖啡廳", + "presets": { + "0": { + "title": "單車咖啡廳" + } + }, + "tagRenderings": { + "bike_cafe-bike-pump": { + "mappings": { + "0": { + "then": "這個單車咖啡廳有提供給任何人都能使用的單車打氣甬" + }, + "1": { + "then": "這個單車咖啡廳並沒有為所有人提供單車打氣甬" + } + }, + "question": "這個單車咖啡廳有提供給任何人都能使用的單車打氣甬嗎?" + }, + "bike_cafe-email": { + "question": "{name} 的電子郵件地址是?" + }, + "bike_cafe-name": { + "question": "這個單車咖啡廳的名稱是?", + "render": "這個單車咖啡廳叫做 {name}" + }, + "bike_cafe-opening_hours": { + "question": "何時這個單車咖啡廳營運?" + }, + "bike_cafe-phone": { + "question": "{name} 的電話號碼是?" + }, + "bike_cafe-repair-service": { + "mappings": { + "0": { + "then": "這個單車咖啡廳修理單車" + }, + "1": { + "then": "這個單車咖啡廳並不修理單車" + } + }, + "question": "這個單車咖啡廳是否能修理單車?" + }, + "bike_cafe-repair-tools": { + "mappings": { + "0": { + "then": "這個單車咖啡廳提供工具讓你修理" + }, + "1": { + "then": "這個單車咖啡廳並沒有提供工具讓你修理" + } + }, + "question": "這裡是否有工具修理你的單車嗎?" + }, + "bike_cafe-website": { + "question": "{name} 的網站是?" + } + }, + "title": { + "mappings": { + "0": { + "then": "單車咖啡廳{name}" + } + }, + "render": "單車咖啡廳" + } + }, + "bike_cleaning": { + "name": "單車清理服務", + "presets": { + "0": { + "title": "單車清理服務" + } + }, + "title": { + "mappings": { + "0": { + "then": "單車清理服務 {name}" + } + }, + "render": "單車清理服務" + } + }, + "bike_parking": { + "name": "單車停車場", + "presets": { + "0": { + "title": "單車停車場" + } + }, + "tagRenderings": { + "Access": { + "mappings": { + "0": { + "then": "公開可用" + }, + "1": { + "then": "通行性主要是為了企業的顧客" + }, + "2": { + "then": "通行性僅限學校、公司或組織的成員" + } + }, + "question": "誰可以使用這個單車停車場?", + "render": "{access}" + }, + "Bicycle parking type": { + "mappings": { + "0": { + "then": "單車架 " + }, + "1": { + "then": "車輪架/圓圈 " + }, + "2": { + "then": "車把架 " + }, + "3": { + "then": "車架" + }, + "4": { + "then": "兩層" + }, + "5": { + "then": "車棚 " + }, + "6": { + "then": "柱子 " + }, + "7": { + "then": "樓層當中標示為單車停車場的區域" + } + }, + "question": "這是那種類型的單車停車場?", + "render": "這個單車停車場的類型是:{bicycle_parking}" + }, + "Capacity": { + "question": "這個單車停車場能放幾台單車 (包括裝箱單車)?", + "render": "{capacity} 單車的地方" + }, + "Cargo bike spaces?": { + "mappings": { + "0": { + "then": "這個停車場有地方可以放裝箱單車" + }, + "1": { + "then": "這停車場有設計 (官方) 空間給裝箱的單車。" + } + }, + "question": "這個單車停車場有地方放裝箱的單車嗎?" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "這個停車場有遮蔽 (有屋頂)" + }, + "1": { + "then": "這個停車場沒有遮蔽" + } + }, + "question": "這個停車場是否有車棚?如果是室內停車場也請選擇\"遮蔽\"。" + }, + "Underground?": { + "mappings": { + "0": { + "then": "地下停車場" + }, + "1": { + "then": "地面停車場" + }, + "2": { + "then": "屋頂停車場" + }, + "3": { + "then": "地面層停車場" + }, + "4": { + "then": "屋頂停車場" + } + }, + "question": "這個單車停車場的相對位置是?" + } + }, + "title": { + "render": "單車停車場" + } + }, + "ghost_bike": { + "name": "幽靈單車", + "title": { + "render": "幽靈單車" + } + } } \ No newline at end of file diff --git a/langs/layers/zh_Hanå¨s.json b/langs/layers/zh_Hanå¨s.json index 0efb218224..272d0dfd9d 100644 --- a/langs/layers/zh_Hanå¨s.json +++ b/langs/layers/zh_Hanå¨s.json @@ -1,9 +1,9 @@ { - "bench": { - "tagRenderings": { - "bench-material": { - "render": "材质: {material}" - } - } + "bench": { + "tagRenderings": { + "bench-material": { + "render": "材质: {material}" + } } + } } \ No newline at end of file diff --git a/langs/nan.json b/langs/nan.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/langs/nan.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/langs/nb_NO.json b/langs/nb_NO.json index 7b37488737..df74de38d4 100644 --- a/langs/nb_NO.json +++ b/langs/nb_NO.json @@ -1,276 +1,276 @@ { - "general": { - "skip": "Hopp over dette spørsmålet", - "cancel": "Avbryt", - "save": "Lagre", - "search": { - "searching": "Søker …", - "search": "Søk etter et sted", - "nothing": "Resultatløst …", - "error": "Noe gikk galt ." - }, - "welcomeBack": "Du er innlogget. Velkommen tilbake.", - "pdf": { - "versionInfo": "v{version}. Generert {date}", - "attr": "Kartdata © OpenStreetMap-bidragsytere, gjenbrukbart med ODbL-lisens", - "generatedWith": "Generert av MapComplete.osm.be", - "attrBackground": "Bakgrunnslag: {background}" - }, - "loginToStart": "Logg inn for å besvare dette spørsmålet", - "osmLinkTooltip": "Vis dette objektet på OpenStreetMap for historikk og flere redigeringsvalg", - "add": { - "presetInfo": "Det nye interessepunktet vil få {tags}", - "zoomInFurther": "Forstørr mer for å legge til et punkt.", - "title": "Legg til et nytt punkt?", - "intro": "Du klikket et sted der ingen data er kjent enda.
    ", - "addNewMapLabel": "Legg til nytt element", - "confirmIntro": "

    Legg til {title} her?

    Punktet du oppretter her vil være synlig for alle. Kun legg til ting på kartet hvis de virkelig finnes. Mange programmer bruker denne dataen.", - "layerNotEnabled": "Laget {layer} er ikke påslått. Skru på dette laget for å legge til et punkt.", - "confirmButton": "Legg til en {category} her.
    Din endring er synlig for alle
    ", - "openLayerControl": "Åpne lagkontrollboksen", - "hasBeenImported": "Dette punktet har allerede blitt importert", - "stillLoading": "Dataen lastes fremdeles inn. Vent litt før du legger til et nytt punkt.", - "warnVisibleForEveryone": "Din endring vil være synlig for alle", - "zoomInMore": "Forstørr mer for å importere denne funksjonen", - "disableFilters": "Skru av alle filtre", - "disableFiltersExplanation": "Det kan hende noen funksjoner er skjult av et filter", - "addNew": "Legg til en ny {category} her", - "pleaseLogin": "Logg inn for å legge til et nytt punkt" - }, - "noNameCategory": "{category} uten navn", - "morescreen": { - "requestATheme": "Hvis du ønsker et brukerdefinert tema kan du forespørre det i feilsporeren", - "intro": "

    Flere temakart?

    Liker du å samle inn geodata?
    Det er flere tilgjengelige temaer.", - "createYourOwnTheme": "Opprett ditt eget MapComplete-tema fra grunnen av", - "hiddenExplanation": "Disse temaene er kun tilgjengelige hvis du kjenner lenken. Du har oppdaget {hidden_discovered} av {total_hidden} hidden tema.", - "previouslyHiddenTitle": "Tidligere besøkte skjulte tema", - "streetcomplete": "Et annet lignende program er StreetComplete." - }, - "questions": { - "emailIs": "E-postadressen til {category} er {email}", - "websiteIs": "Nettside: {website}", - "emailOf": "Hva er e-postadressen til {category}?", - "phoneNumberOf": "Hva er telefonnummeret til {category}?", - "websiteOf": "Hva er nettsiden til {category}?", - "phoneNumberIs": "Telefonnummeret til denne {category} er {phone}" - }, - "sharescreen": { - "thanksForSharing": "Takk for at du bidrar.", - "copiedToClipboard": "Lenke kopiert til utklippstavle", - "intro": "

    Del dette kartet

    Del dette kartet ved å kopiere lenken nedenfor og sende den til venner og familie:", - "fsUserbadge": "Skru på innloggingsknappen", - "fsSearch": "Skru på søkefeltet", - "fsWelcomeMessage": "Vis velkomst-oppsprettsmeldinger og tilknyttede faner", - "editThisTheme": "Rediger dette temaet", - "fsGeolocation": "Skru på «Geolokaliser meg»-knappen (kun for mobil)", - "fsIncludeCurrentBackgroundMap": "Inkluder nåværende bakgrunnsvalg {name}", - "fsLayerControlToggle": "Start med lagkontrollen utvidet", - "addToHomeScreen": "

    Legg til på hjemmeskjermen din

    Du kan enkelt legge til denne nettsiden på din smarttelefon-hjemmeskjerm for å få det hele integrert. Klikk på «Legg til på hjemmeskjerm»-knappen i nettadressefeltet for å gjøre dette.", - "fsLayers": "Skru på lagkontrollen", - "fsIncludeCurrentLayers": "Inkluder nåværende lagvalg", - "fsIncludeCurrentLocation": "Inkluder nåværende posisjon", - "embedIntro": "

    Bygg inn på nettsiden din

    Legg til dette kartet på nettsiden din.
    Du oppfordres til å gjøre dette, og trenger ikke å spørre om tillatelse.
    Det er fritt, og vil alltid være det. Desto flere som bruker dette, desto mer verdifullt blir det." - }, - "attribution": { - "mapContributionsBy": "Den dataen som er synlig nå har redigeringer gjort av {contributors}", - "attributionContent": "

    All data er fra OpenStreetMap, fritt gjenbrukbart med Open DataBase-lisens.

    ", - "codeContributionsBy": "MapComplete har blitt bygd av {contributors} og {hiddenCount} bidragsytere til", - "mapContributionsByAndHidden": "Data som vises nå har redigeringer gjort av {contributors} og {hiddenCount} andre bidragsytere", - "iconAttribution": { - "title": "Brukte ikoner" - }, - "themeBy": "Tema vedlikeholdt av {author}", - "attributionTitle": "Tilskrivelsesmerknad" - }, - "backgroundMap": "Bakgrunnskart", - "loginOnlyNeededToEdit": "hvis du ønsker å redigere kartet", - "readYourMessages": "Les alle OpenStreetMap-meldingene dine før du legger til et nytt punkt.", - "noTagsSelected": "Ingen etiketter valgt", - "customThemeIntro": "

    Egendefinerte tema

    Dette er tidligere besøkte brukergenererte tema.", - "layerSelection": { - "zoomInToSeeThisLayer": "Forstørr kartet hvis du vil se dette kartet", - "title": "Velg lag" - }, - "download": { - "downloadCSV": "Last ned synlig data som CSV", - "downloadAsPdfHelper": "Ideelt for utskrift av nåværende kart", - "noDataLoaded": "Ingen data innlastet enda. Nedlasting vil være tilgjengelig snart.", - "downloadAsPdf": "Last ned PDF av nåværende kart", - "downloadCSVHelper": "Kompatibelt med LibreOffice Calc, Excel, …", - "title": "Last ned synlig data", - "downloadGeojson": "Last ned synlig data som GeoJSON", - "licenseInfo": "

    Opphavsrettsmerknad

    Tilbudt data er tilgjengelig med ODbL-lisens. Gjenbruk er gratis for alle formål, men
    • tilskrivelsen© OpenStreetMap-bidragsytere kreves
    • Enhver endring må publiseres under samme lisens
    Les hele opphavsrettsmerknaden for detaljer.", - "exporting": "Eksporterer …", - "includeMetaData": "Inkluder metadata (siste bidragsytere, utregnede verdier, …)", - "downloadGeoJsonHelper": "Kompatibelt med QGIS, ArcGIS, ESRI, …" - }, - "weekdays": { - "friday": "Fredag", - "saturday": "Lørdag", - "sunday": "Søndag", - "wednesday": "Onsdag", - "abbreviations": { - "thursday": "Tor", - "sunday": "Søn", - "monday": "Man", - "wednesday": "Ons", - "tuesday": "Tir", - "saturday": "Lør", - "friday": "Fre" - }, - "thursday": "Torsdag", - "monday": "Mandag", - "tuesday": "Tirsdag" - }, - "opening_hours": { - "openTill": "til", - "closed_until": "Stengt til {date}", - "open_24_7": "Døgnåpent", - "closed_permanently": "Stengt på ubestemt tid", - "ph_open_as_usual": "åpen som vanlig", - "loadingCountry": "Bestemmer land …", - "error_loading": "Feil: Kunne ikke visualisere disse åpningstidene.", - "open_during_ph": "På offentlige helligdager og ferier er dette stedet", - "not_all_rules_parsed": "Åpningstidene for dette stedet er kompliserte. Følgende regler ble sett bort fra i inndataelementet:", - "ph_not_known": " ", - "ph_closed": "stengt", - "opensAt": "fra", - "ph_open": "åpen" - }, - "histogram": { - "error_loading": "Kunne ikke laste inn histogrammet" - }, - "loading": "Laster inn …", - "openTheMap": "Åpne kartet", - "testing": "Testing. ingen endringer vil bli lagret.", - "wikipedia": { - "wikipediaboxTitle": "Wikipedia", - "loading": "Laster inn Wikipedia …", - "doSearch": "Søk ovenfor for å se resultater", - "noResults": "Fant ikke noe for {search}", - "noWikipediaPage": "Dette Wikipedia-elementet har ingen tilknyttet Wikipedia-side enda.", - "searchWikidata": "Søk på Wikipedia", - "createNewWikidata": "Opprett et nytt Wikipedia-element", - "failed": "Innlasting av Wikipedia-artikkel mislyktes" - }, - "returnToTheMap": "Gå tilbake til kartet", - "skippedQuestions": "Noen spørsmål ble hoppet over", - "oneSkippedQuestion": "Et spørsmål ble hoppet over", - "number": "tall", - "pickLanguage": "Velg språk: ", - "goToInbox": "Åpne innboks", - "getStartedNewAccount": " eller opprett en ny konto", - "getStartedLogin": "Logg inn med OpenStreetMap for å begynne", - "fewChangesBefore": "Besvar et par spørsmål for eksisterende punkter før du legger til et nytt." + "general": { + "skip": "Hopp over dette spørsmålet", + "cancel": "Avbryt", + "save": "Lagre", + "search": { + "searching": "Søker …", + "search": "Søk etter et sted", + "nothing": "Resultatløst …", + "error": "Noe gikk galt ." }, - "index": { - "pickTheme": "Begynn ved å velge et av temaene nedenfor.", - "title": "Velkommen til MapComplete", - "intro": "MapComplete er en OpenStreetMap-viser og redigerer, som viser deg info om funksjoner for et gitt tema og tillater oppdatering av det.", - "featuredThemeTitle": "Framhevet denne uken" + "welcomeBack": "Du er innlogget. Velkommen tilbake.", + "pdf": { + "versionInfo": "v{version}. Generert {date}", + "attr": "Kartdata © OpenStreetMap-bidragsytere, gjenbrukbart med ODbL-lisens", + "generatedWith": "Generert av MapComplete.osm.be", + "attrBackground": "Bakgrunnslag: {background}" }, - "centerMessage": { - "ready": "Ferdig", - "zoomIn": "Forstørr for å vise eller redigere data", - "loadingData": "Laster inn data …", - "retrying": "Kunne ikke laste inn data. Prøver igjen om {count} sekunder …" + "loginToStart": "Logg inn for å besvare dette spørsmålet", + "osmLinkTooltip": "Vis dette objektet på OpenStreetMap for historikk og flere redigeringsvalg", + "add": { + "presetInfo": "Det nye interessepunktet vil få {tags}", + "zoomInFurther": "Forstørr mer for å legge til et punkt.", + "title": "Legg til et nytt punkt?", + "intro": "Du klikket et sted der ingen data er kjent enda.
    ", + "addNewMapLabel": "Legg til nytt element", + "confirmIntro": "

    Legg til {title} her?

    Punktet du oppretter her vil være synlig for alle. Kun legg til ting på kartet hvis de virkelig finnes. Mange programmer bruker denne dataen.", + "layerNotEnabled": "Laget {layer} er ikke påslått. Skru på dette laget for å legge til et punkt.", + "confirmButton": "Legg til en {category} her.
    Din endring er synlig for alle
    ", + "openLayerControl": "Åpne lagkontrollboksen", + "hasBeenImported": "Dette punktet har allerede blitt importert", + "stillLoading": "Dataen lastes fremdeles inn. Vent litt før du legger til et nytt punkt.", + "warnVisibleForEveryone": "Din endring vil være synlig for alle", + "zoomInMore": "Forstørr mer for å importere denne funksjonen", + "disableFilters": "Skru av alle filtre", + "disableFiltersExplanation": "Det kan hende noen funksjoner er skjult av et filter", + "addNew": "Legg til en ny {category} her", + "pleaseLogin": "Logg inn for å legge til et nytt punkt" }, - "image": { - "isDeleted": "Slettet", - "doDelete": "Fjern bilde", - "dontDelete": "Avbryt", - "uploadingMultiple": "Laster opp {count} bilder …", - "uploadingPicture": "Laster opp bildet ditt …", - "addPicture": "Legg til bilde", - "pleaseLogin": "Logg inn for å legge til et bilde", - "ccbs": "med CC-BY-SA-lisens", - "ccb": "med CC-BY-lisens", - "willBePublished": "Ditt bilde vil bli publisert: ", - "uploadFailed": "Kunne ikke laste opp bildet ditt. Er du tilkoblet Internett og tillater tredjeparts-API-er? Brave-nettleseren eller uMatrix-programtillegget kan blokkere dem.", - "uploadDone": "Bildet ditt ble lagt til. Takk for at du hjelper til.", - "uploadMultipleDone": "{count} bilder har blitt lagt til. Takk for at du hjelper til.", - "toBig": "Bildet ditt på {actual_size} er for stort. Det kan maksimalt være {max_size}." + "noNameCategory": "{category} uten navn", + "morescreen": { + "requestATheme": "Hvis du ønsker et brukerdefinert tema kan du forespørre det i feilsporeren", + "intro": "

    Flere temakart?

    Liker du å samle inn geodata?
    Det er flere tilgjengelige temaer.", + "createYourOwnTheme": "Opprett ditt eget MapComplete-tema fra grunnen av", + "hiddenExplanation": "Disse temaene er kun tilgjengelige hvis du kjenner lenken. Du har oppdaget {hidden_discovered} av {total_hidden} hidden tema.", + "previouslyHiddenTitle": "Tidligere besøkte skjulte tema", + "streetcomplete": "Et annet lignende program er StreetComplete." }, - "delete": { - "explanations": { - "hardDelete": "Dette punktet vil bli slettet i OpenStreetMap. Det kan gjenopprettes av en dreven bidragsyter.", - "softDelete": "Denne funksjonen vil bli oppdatert og skjult fra programmet. {reason}", - "selectReason": "Velg hvorfor denne funksjonen skal slettes" - }, - "delete": "Slett", - "isDeleted": "Denne funksjonen har blitt slettet", - "loginToDelete": "Du må være innlogget for å slette et punkt", - "cancel": "Avbryt", - "cannotBeDeleted": "Denne funksjonen kan ikke slettes", - "notEnoughExperience": "Dette punktet ble opprettet av noen andre.", - "loading": "Inspiserer egenskaper for å sjekke om denne funksjonen kan slettes.", - "whyDelete": "Hvorfor bør dette punktet slettes?", - "reasons": { - "duplicate": "Dette punktet er et duplikat av en annen funksjon", - "disused": "Denne funksjonen er ute av bruk eller fjernet", - "test": "Dette var et testpunkt, funksjonen var aldri operativ", - "notFound": "Fant ikke funksjonen" - }, - "safeDelete": "Dette punktet kan trygt slettes.", - "onlyEditedByLoggedInUser": "Dette punktet har kun blitt redigert av deg. Du kan trygt slette det.", - "useSomethingElse": "Bruk en annen OpenStreetMap-redigerer til å slette det istedenfor.", - "isntAPoint": "Kun punkter kan slettes, valgt funksjon er en vei, et område, eller en relasjon.", - "partOfOthers": "Dette punktet er en del av en vei eller relasjon, og kan derfor ikke slettes direkte.", - "readMessages": "Du har uleste meldinger. Les dette før sletting av et punkt, fordi noen kan ha tilbakemeldinger å komme med." + "questions": { + "emailIs": "E-postadressen til {category} er {email}", + "websiteIs": "Nettside: {website}", + "emailOf": "Hva er e-postadressen til {category}?", + "phoneNumberOf": "Hva er telefonnummeret til {category}?", + "websiteOf": "Hva er nettsiden til {category}?", + "phoneNumberIs": "Telefonnummeret til denne {category} er {phone}" }, - "reviews": { - "posting_as": "Anmelder som", - "saving_review": "Lagrer …", - "title": "{count} vurderinger", - "no_rating": "Ingen vurdering gitt", - "plz_login": "Logg inn for å legge igjen en vurdering", - "write_a_comment": "Legg igjen en vurdering …", - "title_singular": "Én vurdering", - "name_required": "Et navn kreves for å vise og opprette vurderinger", - "affiliated_reviewer_warning": "(Tilknyttet vurdering)", - "saved": "Vurdering lagret. Takk for at du deler din mening.", - "no_reviews_yet": "Ingen vurderinger enda. Vær først til å skrive en og hjelp åpen data og bevegelsen.", - "tos": "Hvis du lager en vurdering, samtykker du til tjenestevilkårene til Mangrove.reviews", - "attribution": "Vurderinger er muliggjort av Mangrove Reviews og er tilgjengelige som CC-BY 4.0.", - "i_am_affiliated": "Jeg har en tilknytning til dette objektet
    Sjekk om du er eier, skaper, ansatt, …" + "sharescreen": { + "thanksForSharing": "Takk for at du bidrar.", + "copiedToClipboard": "Lenke kopiert til utklippstavle", + "intro": "

    Del dette kartet

    Del dette kartet ved å kopiere lenken nedenfor og sende den til venner og familie:", + "fsUserbadge": "Skru på innloggingsknappen", + "fsSearch": "Skru på søkefeltet", + "fsWelcomeMessage": "Vis velkomst-oppsprettsmeldinger og tilknyttede faner", + "editThisTheme": "Rediger dette temaet", + "fsGeolocation": "Skru på «Geolokaliser meg»-knappen (kun for mobil)", + "fsIncludeCurrentBackgroundMap": "Inkluder nåværende bakgrunnsvalg {name}", + "fsLayerControlToggle": "Start med lagkontrollen utvidet", + "addToHomeScreen": "

    Legg til på hjemmeskjermen din

    Du kan enkelt legge til denne nettsiden på din smarttelefon-hjemmeskjerm for å få det hele integrert. Klikk på «Legg til på hjemmeskjerm»-knappen i nettadressefeltet for å gjøre dette.", + "fsLayers": "Skru på lagkontrollen", + "fsIncludeCurrentLayers": "Inkluder nåværende lagvalg", + "fsIncludeCurrentLocation": "Inkluder nåværende posisjon", + "embedIntro": "

    Bygg inn på nettsiden din

    Legg til dette kartet på nettsiden din.
    Du oppfordres til å gjøre dette, og trenger ikke å spørre om tillatelse.
    Det er fritt, og vil alltid være det. Desto flere som bruker dette, desto mer verdifullt blir det." }, - "move": { - "cancel": "Avbryt flytting", - "pointIsMoved": "Punktet har blitt flyttet", - "selectReason": "Hvorfor flytter du dette objektet?", - "loginToMove": "Du må være innlogget for å flytte et punkt", - "inviteToMoveAgain": "Flytt dette punktet igjen", - "moveTitle": "Flytt dette punktet", - "whyMove": "Hvorfor vil du flytte dette punktet?", - "confirmMove": "Flytt hit", - "reasons": { - "reasonInaccurate": "Posisjonen til dette objektet er unøyaktig og bør flyttes noen meter", - "reasonRelocation": "Objektet har blitt flyttet til et helt annet sted" - }, - "inviteToMove": { - "reasonInaccurate": "Forbedre nøyaktigheten for dette punktet", - "generic": "Flytt dette punktet", - "reasonRelocation": "Flytt dette objektet til et annet sted fordi det har blitt flyttet" - }, - "isRelation": "Denne funksjonen er en relasjon og kan ikke flyttes", - "cannotBeMoved": "Denne funksjonen kan ikke flyttes.", - "isWay": "Denne funksjonen er en vei. Bruk en annen OpenStreetMap-redigerer for å flytte den.", - "partOfRelation": "Denne funksjonen er en del av en relasjon. Bruk en annen redigerer for å flytte den.", - "partOfAWay": "Denne funksjonen er en del av en annen vei. Bruk en annen redigerer for å flytte den.", - "zoomInFurther": "Forstørr mer for å bekrefte denne flyttingen" + "attribution": { + "mapContributionsBy": "Den dataen som er synlig nå har redigeringer gjort av {contributors}", + "attributionContent": "

    All data er fra OpenStreetMap, fritt gjenbrukbart med Open DataBase-lisens.

    ", + "codeContributionsBy": "MapComplete har blitt bygd av {contributors} og {hiddenCount} bidragsytere til", + "mapContributionsByAndHidden": "Data som vises nå har redigeringer gjort av {contributors} og {hiddenCount} andre bidragsytere", + "iconAttribution": { + "title": "Brukte ikoner" + }, + "themeBy": "Tema vedlikeholdt av {author}", + "attributionTitle": "Tilskrivelsesmerknad" }, - "favourite": { - "reload": "Last inn dataen igjen" + "backgroundMap": "Bakgrunnskart", + "loginOnlyNeededToEdit": "hvis du ønsker å redigere kartet", + "readYourMessages": "Les alle OpenStreetMap-meldingene dine før du legger til et nytt punkt.", + "noTagsSelected": "Ingen etiketter valgt", + "customThemeIntro": "

    Egendefinerte tema

    Dette er tidligere besøkte brukergenererte tema.", + "layerSelection": { + "zoomInToSeeThisLayer": "Forstørr kartet hvis du vil se dette kartet", + "title": "Velg lag" }, - "split": { - "cancel": "Avbryt", - "loginToSplit": "Du må være innlogget for å dele en vei", - "split": "Del", - "splitTitle": "Velg hvor på kartet veien skal deles", - "hasBeenSplit": "Denne veien har blitt delt", - "inviteToSplit": "Inndel denne veien i mindre segmenter. Dette lar deg gi den forskjellige egenskaper for forskjellige strekk." + "download": { + "downloadCSV": "Last ned synlig data som CSV", + "downloadAsPdfHelper": "Ideelt for utskrift av nåværende kart", + "noDataLoaded": "Ingen data innlastet enda. Nedlasting vil være tilgjengelig snart.", + "downloadAsPdf": "Last ned PDF av nåværende kart", + "downloadCSVHelper": "Kompatibelt med LibreOffice Calc, Excel, …", + "title": "Last ned synlig data", + "downloadGeojson": "Last ned synlig data som GeoJSON", + "licenseInfo": "

    Opphavsrettsmerknad

    Tilbudt data er tilgjengelig med ODbL-lisens. Gjenbruk er gratis for alle formål, men
    • tilskrivelsen© OpenStreetMap-bidragsytere kreves
    • Enhver endring må publiseres under samme lisens
    Les hele opphavsrettsmerknaden for detaljer.", + "exporting": "Eksporterer …", + "includeMetaData": "Inkluder metadata (siste bidragsytere, utregnede verdier, …)", + "downloadGeoJsonHelper": "Kompatibelt med QGIS, ArcGIS, ESRI, …" }, - "multi_apply": { - "autoApply": "Ved endring av attributteene {attr_names}, legges de automatisk til for {count} andre objekter også" - } + "weekdays": { + "friday": "Fredag", + "saturday": "Lørdag", + "sunday": "Søndag", + "wednesday": "Onsdag", + "abbreviations": { + "thursday": "Tor", + "sunday": "Søn", + "monday": "Man", + "wednesday": "Ons", + "tuesday": "Tir", + "saturday": "Lør", + "friday": "Fre" + }, + "thursday": "Torsdag", + "monday": "Mandag", + "tuesday": "Tirsdag" + }, + "opening_hours": { + "openTill": "til", + "closed_until": "Stengt til {date}", + "open_24_7": "Døgnåpent", + "closed_permanently": "Stengt på ubestemt tid", + "ph_open_as_usual": "åpen som vanlig", + "loadingCountry": "Bestemmer land …", + "error_loading": "Feil: Kunne ikke visualisere disse åpningstidene.", + "open_during_ph": "På offentlige helligdager og ferier er dette stedet", + "not_all_rules_parsed": "Åpningstidene for dette stedet er kompliserte. Følgende regler ble sett bort fra i inndataelementet:", + "ph_not_known": " ", + "ph_closed": "stengt", + "opensAt": "fra", + "ph_open": "åpen" + }, + "histogram": { + "error_loading": "Kunne ikke laste inn histogrammet" + }, + "loading": "Laster inn …", + "openTheMap": "Åpne kartet", + "testing": "Testing. ingen endringer vil bli lagret.", + "wikipedia": { + "wikipediaboxTitle": "Wikipedia", + "loading": "Laster inn Wikipedia …", + "doSearch": "Søk ovenfor for å se resultater", + "noResults": "Fant ikke noe for {search}", + "noWikipediaPage": "Dette Wikipedia-elementet har ingen tilknyttet Wikipedia-side enda.", + "searchWikidata": "Søk på Wikipedia", + "createNewWikidata": "Opprett et nytt Wikipedia-element", + "failed": "Innlasting av Wikipedia-artikkel mislyktes" + }, + "returnToTheMap": "Gå tilbake til kartet", + "skippedQuestions": "Noen spørsmål ble hoppet over", + "oneSkippedQuestion": "Et spørsmål ble hoppet over", + "number": "tall", + "pickLanguage": "Velg språk: ", + "goToInbox": "Åpne innboks", + "getStartedNewAccount": " eller opprett en ny konto", + "getStartedLogin": "Logg inn med OpenStreetMap for å begynne", + "fewChangesBefore": "Besvar et par spørsmål for eksisterende punkter før du legger til et nytt." + }, + "index": { + "pickTheme": "Begynn ved å velge et av temaene nedenfor.", + "title": "Velkommen til MapComplete", + "intro": "MapComplete er en OpenStreetMap-viser og redigerer, som viser deg info om funksjoner for et gitt tema og tillater oppdatering av det.", + "featuredThemeTitle": "Framhevet denne uken" + }, + "centerMessage": { + "ready": "Ferdig", + "zoomIn": "Forstørr for å vise eller redigere data", + "loadingData": "Laster inn data …", + "retrying": "Kunne ikke laste inn data. Prøver igjen om {count} sekunder …" + }, + "image": { + "isDeleted": "Slettet", + "doDelete": "Fjern bilde", + "dontDelete": "Avbryt", + "uploadingMultiple": "Laster opp {count} bilder …", + "uploadingPicture": "Laster opp bildet ditt …", + "addPicture": "Legg til bilde", + "pleaseLogin": "Logg inn for å legge til et bilde", + "ccbs": "med CC-BY-SA-lisens", + "ccb": "med CC-BY-lisens", + "willBePublished": "Ditt bilde vil bli publisert: ", + "uploadFailed": "Kunne ikke laste opp bildet ditt. Er du tilkoblet Internett og tillater tredjeparts-API-er? Brave-nettleseren eller uMatrix-programtillegget kan blokkere dem.", + "uploadDone": "Bildet ditt ble lagt til. Takk for at du hjelper til.", + "uploadMultipleDone": "{count} bilder har blitt lagt til. Takk for at du hjelper til.", + "toBig": "Bildet ditt på {actual_size} er for stort. Det kan maksimalt være {max_size}." + }, + "delete": { + "explanations": { + "hardDelete": "Dette punktet vil bli slettet i OpenStreetMap. Det kan gjenopprettes av en dreven bidragsyter.", + "softDelete": "Denne funksjonen vil bli oppdatert og skjult fra programmet. {reason}", + "selectReason": "Velg hvorfor denne funksjonen skal slettes" + }, + "delete": "Slett", + "isDeleted": "Denne funksjonen har blitt slettet", + "loginToDelete": "Du må være innlogget for å slette et punkt", + "cancel": "Avbryt", + "cannotBeDeleted": "Denne funksjonen kan ikke slettes", + "notEnoughExperience": "Dette punktet ble opprettet av noen andre.", + "loading": "Inspiserer egenskaper for å sjekke om denne funksjonen kan slettes.", + "whyDelete": "Hvorfor bør dette punktet slettes?", + "reasons": { + "duplicate": "Dette punktet er et duplikat av en annen funksjon", + "disused": "Denne funksjonen er ute av bruk eller fjernet", + "test": "Dette var et testpunkt, funksjonen var aldri operativ", + "notFound": "Fant ikke funksjonen" + }, + "safeDelete": "Dette punktet kan trygt slettes.", + "onlyEditedByLoggedInUser": "Dette punktet har kun blitt redigert av deg. Du kan trygt slette det.", + "useSomethingElse": "Bruk en annen OpenStreetMap-redigerer til å slette det istedenfor.", + "isntAPoint": "Kun punkter kan slettes, valgt funksjon er en vei, et område, eller en relasjon.", + "partOfOthers": "Dette punktet er en del av en vei eller relasjon, og kan derfor ikke slettes direkte.", + "readMessages": "Du har uleste meldinger. Les dette før sletting av et punkt, fordi noen kan ha tilbakemeldinger å komme med." + }, + "reviews": { + "posting_as": "Anmelder som", + "saving_review": "Lagrer …", + "title": "{count} vurderinger", + "no_rating": "Ingen vurdering gitt", + "plz_login": "Logg inn for å legge igjen en vurdering", + "write_a_comment": "Legg igjen en vurdering …", + "title_singular": "Én vurdering", + "name_required": "Et navn kreves for å vise og opprette vurderinger", + "affiliated_reviewer_warning": "(Tilknyttet vurdering)", + "saved": "Vurdering lagret. Takk for at du deler din mening.", + "no_reviews_yet": "Ingen vurderinger enda. Vær først til å skrive en og hjelp åpen data og bevegelsen.", + "tos": "Hvis du lager en vurdering, samtykker du til tjenestevilkårene til Mangrove.reviews", + "attribution": "Vurderinger er muliggjort av Mangrove Reviews og er tilgjengelige som CC-BY 4.0.", + "i_am_affiliated": "Jeg har en tilknytning til dette objektet
    Sjekk om du er eier, skaper, ansatt, …" + }, + "move": { + "cancel": "Avbryt flytting", + "pointIsMoved": "Punktet har blitt flyttet", + "selectReason": "Hvorfor flytter du dette objektet?", + "loginToMove": "Du må være innlogget for å flytte et punkt", + "inviteToMoveAgain": "Flytt dette punktet igjen", + "moveTitle": "Flytt dette punktet", + "whyMove": "Hvorfor vil du flytte dette punktet?", + "confirmMove": "Flytt hit", + "reasons": { + "reasonInaccurate": "Posisjonen til dette objektet er unøyaktig og bør flyttes noen meter", + "reasonRelocation": "Objektet har blitt flyttet til et helt annet sted" + }, + "inviteToMove": { + "reasonInaccurate": "Forbedre nøyaktigheten for dette punktet", + "generic": "Flytt dette punktet", + "reasonRelocation": "Flytt dette objektet til et annet sted fordi det har blitt flyttet" + }, + "isRelation": "Denne funksjonen er en relasjon og kan ikke flyttes", + "cannotBeMoved": "Denne funksjonen kan ikke flyttes.", + "isWay": "Denne funksjonen er en vei. Bruk en annen OpenStreetMap-redigerer for å flytte den.", + "partOfRelation": "Denne funksjonen er en del av en relasjon. Bruk en annen redigerer for å flytte den.", + "partOfAWay": "Denne funksjonen er en del av en annen vei. Bruk en annen redigerer for å flytte den.", + "zoomInFurther": "Forstørr mer for å bekrefte denne flyttingen" + }, + "favourite": { + "reload": "Last inn dataen igjen" + }, + "split": { + "cancel": "Avbryt", + "loginToSplit": "Du må være innlogget for å dele en vei", + "split": "Del", + "splitTitle": "Velg hvor på kartet veien skal deles", + "hasBeenSplit": "Denne veien har blitt delt", + "inviteToSplit": "Inndel denne veien i mindre segmenter. Dette lar deg gi den forskjellige egenskaper for forskjellige strekk." + }, + "multi_apply": { + "autoApply": "Ved endring av attributteene {attr_names}, legges de automatisk til for {count} andre objekter også" + } } diff --git a/langs/nl.json b/langs/nl.json index 1f4321e12e..8cf786e465 100644 --- a/langs/nl.json +++ b/langs/nl.json @@ -1,316 +1,316 @@ { - "image": { - "addPicture": "Voeg foto toe", - "uploadingPicture": "Bezig met een foto te uploaden…", - "uploadingMultiple": "Bezig met {count} foto's te uploaden…", - "pleaseLogin": "Gelieve je aan te melden om een foto toe te voegen", - "willBePublished": "Jouw foto wordt gepubliceerd: ", - "cco": "in het publiek domein", - "ccbs": "onder de CC-BY-SA-licentie", - "ccb": "onder de CC-BY-licentie", - "uploadFailed": "Afbeelding uploaden mislukt. Heb je internet? Gebruik je Brave of UMatrix? Dan moet je derde partijen toelaten.", - "respectPrivacy": "Fotografeer geen mensen of nummerplaten. Voeg geen Google Maps, Google Streetview of foto's met auteursrechten toe.", - "uploadDone": "Je afbeelding is toegevoegd. Bedankt om te helpen!", - "dontDelete": "Annuleren", - "doDelete": "Verwijder afbeelding", - "isDeleted": "Verwijderd", - "uploadMultipleDone": "{count} afbeeldingen zijn toegevoegd. Bedankt voor je bijdrage!", - "toBig": "Je afbeelding is te groot, namelijk {actual_size}. Gelieve afbeeldingen van maximaal {max_size} te gebruiken" + "image": { + "addPicture": "Voeg foto toe", + "uploadingPicture": "Bezig met een foto te uploaden…", + "uploadingMultiple": "Bezig met {count} foto's te uploaden…", + "pleaseLogin": "Gelieve je aan te melden om een foto toe te voegen", + "willBePublished": "Jouw foto wordt gepubliceerd: ", + "cco": "in het publiek domein", + "ccbs": "onder de CC-BY-SA-licentie", + "ccb": "onder de CC-BY-licentie", + "uploadFailed": "Afbeelding uploaden mislukt. Heb je internet? Gebruik je Brave of UMatrix? Dan moet je derde partijen toelaten.", + "respectPrivacy": "Fotografeer geen mensen of nummerplaten. Voeg geen Google Maps, Google Streetview of foto's met auteursrechten toe.", + "uploadDone": "Je afbeelding is toegevoegd. Bedankt om te helpen!", + "dontDelete": "Annuleren", + "doDelete": "Verwijder afbeelding", + "isDeleted": "Verwijderd", + "uploadMultipleDone": "{count} afbeeldingen zijn toegevoegd. Bedankt voor je bijdrage!", + "toBig": "Je afbeelding is te groot, namelijk {actual_size}. Gelieve afbeeldingen van maximaal {max_size} te gebruiken" + }, + "centerMessage": { + "loadingData": "Data wordt geladen...", + "zoomIn": "Zoom in om de data te zien en te bewerken", + "ready": "Klaar!", + "retrying": "Data inladen mislukt - wordt opnieuw geprobeerd over {count} seconden" + }, + "index": { + "#": "These texts are shown above the theme buttons when no theme is loaded", + "title": "Welkom bij MapComplete", + "intro": "MapComplete is een OpenStreetMap-applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.", + "pickTheme": "Kies hieronder een thema om te beginnen.", + "featuredThemeTitle": "Thema van de week" + }, + "general": { + "loginWithOpenStreetMap": "Aanmelden met OpenStreetMap", + "welcomeBack": "Je bent aangemeld. Welkom terug!", + "loginToStart": "Meld je aan om deze vraag te beantwoorden", + "search": { + "search": "Zoek naar een locatie", + "searching": "Aan het zoeken...", + "nothing": "Niet gevonden...", + "error": "Niet gelukt..." + }, + "add": { + "addNewMapLabel": "Voeg item toe", + "addNew": "Voeg hier een {category} toe", + "title": "Nieuw punt toevoegen?", + "intro": "Je klikte ergens waar er nog geen data is. Kies hieronder welk punt je wilt toevoegen
    ", + "pleaseLogin": "Gelieve je aan te melden om een punt to te voegen", + "zoomInFurther": "Gelieve verder in te zoomen om een punt toe te voegen.", + "stillLoading": "De data worden nog geladen. Nog even geduld en dan kan je een punt toevoegen.", + "confirmIntro": "

    Voeg hier een {title} toe?

    Het punt dat je hier toevoegt, is zichtbaar voor iedereen. Veel applicaties gebruiken deze data, voeg dus enkel punten toe die echt bestaan.", + "confirmButton": "Voeg hier een {category} toe
    Je toevoeging is voor iedereen zichtbaar
    ", + "openLayerControl": "Open de laag-instellingen", + "layerNotEnabled": "De laag {layer} is gedeactiveerd. Activeer deze om een punt toe te voegen", + "presetInfo": "Het nieuwe punt krijgt de attributen {tags}", + "disableFiltersExplanation": "Interessepunten kunnen verborgen zijn door een filter", + "disableFilters": "Zet alle filters af", + "hasBeenImported": "Dit punt is reeds geimporteerd", + "warnVisibleForEveryone": "Je toevoeging is voor iedereen zichtbaar", + "zoomInMore": "Zoom meer in om dit punt te importeren" + }, + "pickLanguage": "Kies je taal: ", + "about": "Bewerk en voeg data toe aan OpenStreetMap over een specifiek onderwerp op een gemakkelijke manier", + "nameInlineQuestion": "De naam van dit {category} is $$$", + "noNameCategory": "{category} zonder naam", + "questions": { + "phoneNumberOf": "Wat is het telefoonnummer van {category}?", + "phoneNumberIs": "Het telefoonnummer van {category} is {phone}", + "websiteOf": "Wat is de website van {category}?", + "websiteIs": "Website: {website}", + "emailOf": "Wat is het email-adres van {category}?", + "emailIs": "Het email-adres van {category} is {email}" + }, + "openStreetMapIntro": "

    Een open kaart

    Zou het niet fantastisch zijn als er een open kaart zou zijn die door iedereen aangepast én gebruikt kan worden? Een kaart waar iedereen zijn interesses aan zou kunnen toevoegen? Dan zouden er geen duizend-en-één verschillende kleine kaartjes, websites, ... meer nodig zijn

    OpenStreetMap is deze open kaart. Je mag de kaartdata gratis gebruiken (mits bronvermelding en herpublicatie van aanpassingen). Daarenboven mag je de kaart ook gratis aanpassen als je een account maakt. Ook deze website is gebaseerd op OpenStreetMap. Als je hier een vraag beantwoord, gaat het antwoord daar ook naartoe

    Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Organic Maps, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram,...
    Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!

    Kortom, als je hier een punt toevoegd of een vraag beantwoord, zal dat na een tijdje ook in al dié applicaties te zien zijn.

    ", + "attribution": { + "attributionTitle": "Met dank aan", + "attributionContent": "

    Alle data is voorzien door OpenStreetMap, gratis en vrij te hergebruiken onder de Open DataBase Licentie.

    ", + "themeBy": "Thema gemaakt door {author}", + "iconAttribution": { + "title": "Iconen en afbeeldingen" + }, + "mapContributionsByAndHidden": "De zichtbare data heeft bijdragen van {contributors} en {hiddenCount} andere bijdragers", + "mapContributionsBy": "De huidige data is bijgedragen door {contributors}", + "codeContributionsBy": "MapComplete is gebouwd door {contributors} en {hiddenCount} andere bijdragers" + }, + "sharescreen": { + "intro": "

    Deel deze kaart

    Kopieer onderstaande link om deze kaart naar vrienden en familie door te sturen:", + "addToHomeScreen": "

    Voeg toe aan je thuis-scherm

    Je kan deze website aan je thuisscherm van je smartphone toevoegen voor een native feel", + "embedIntro": "

    Plaats dit op je website

    Voeg dit kaartje toe op je eigen website.
    We moedigen dit zelfs aan - je hoeft geen toestemming te vragen.
    Het is gratis en zal dat altijd blijven. Hoe meer het gebruikt wordt, hoe waardevoller", + "copiedToClipboard": "Link gekopieerd naar klembord", + "thanksForSharing": "Bedankt om te delen!", + "editThisTheme": "Pas dit thema aan", + "editThemeDescription": "Pas vragen aan of voeg vragen toe aan dit kaartthema", + "fsUserbadge": "Activeer de login-knop", + "fsSearch": "Activeer de zoekbalk", + "fsWelcomeMessage": "Toon het welkomstbericht en de bijhorende tabbladen", + "fsLayers": "Toon de knop voor laagbediening", + "fsLayerControlToggle": "Toon de laagbediening meteen volledig", + "fsAddNew": "Activeer het toevoegen van nieuwe POI", + "fsGeolocation": "Toon het knopje voor geolocalisatie (enkel op mobiel)", + "fsIncludeCurrentBackgroundMap": "Gebruik de huidige achtergrond {name}", + "fsIncludeCurrentLayers": "Toon enkel de huidig getoonde lagen", + "fsIncludeCurrentLocation": "Start op de huidige locatie" }, "centerMessage": { - "loadingData": "Data wordt geladen...", - "zoomIn": "Zoom in om de data te zien en te bewerken", - "ready": "Klaar!", - "retrying": "Data inladen mislukt - wordt opnieuw geprobeerd over {count} seconden" + "loadingData": "Data wordt geladen…", + "zoomIn": "Zoom in om de data te zien en te bewerken", + "ready": "Klaar!", + "retrying": "Data inladen mislukt. Opnieuw proberen over {count} seconden…" }, "index": { - "#": "These texts are shown above the theme buttons when no theme is loaded", - "title": "Welkom bij MapComplete", - "intro": "MapComplete is een OpenStreetMap-applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.", - "pickTheme": "Kies hieronder een thema om te beginnen.", - "featuredThemeTitle": "Thema van de week" - }, - "general": { - "loginWithOpenStreetMap": "Aanmelden met OpenStreetMap", - "welcomeBack": "Je bent aangemeld. Welkom terug!", - "loginToStart": "Meld je aan om deze vraag te beantwoorden", - "search": { - "search": "Zoek naar een locatie", - "searching": "Aan het zoeken...", - "nothing": "Niet gevonden...", - "error": "Niet gelukt..." - }, - "add": { - "addNewMapLabel": "Voeg item toe", - "addNew": "Voeg hier een {category} toe", - "title": "Nieuw punt toevoegen?", - "intro": "Je klikte ergens waar er nog geen data is. Kies hieronder welk punt je wilt toevoegen
    ", - "pleaseLogin": "Gelieve je aan te melden om een punt to te voegen", - "zoomInFurther": "Gelieve verder in te zoomen om een punt toe te voegen.", - "stillLoading": "De data worden nog geladen. Nog even geduld en dan kan je een punt toevoegen.", - "confirmIntro": "

    Voeg hier een {title} toe?

    Het punt dat je hier toevoegt, is zichtbaar voor iedereen. Veel applicaties gebruiken deze data, voeg dus enkel punten toe die echt bestaan.", - "confirmButton": "Voeg hier een {category} toe
    Je toevoeging is voor iedereen zichtbaar
    ", - "openLayerControl": "Open de laag-instellingen", - "layerNotEnabled": "De laag {layer} is gedeactiveerd. Activeer deze om een punt toe te voegen", - "presetInfo": "Het nieuwe punt krijgt de attributen {tags}", - "disableFiltersExplanation": "Interessepunten kunnen verborgen zijn door een filter", - "disableFilters": "Zet alle filters af", - "hasBeenImported": "Dit punt is reeds geimporteerd", - "warnVisibleForEveryone": "Je toevoeging is voor iedereen zichtbaar", - "zoomInMore": "Zoom meer in om dit punt te importeren" - }, - "pickLanguage": "Kies je taal: ", - "about": "Bewerk en voeg data toe aan OpenStreetMap over een specifiek onderwerp op een gemakkelijke manier", - "nameInlineQuestion": "De naam van dit {category} is $$$", - "noNameCategory": "{category} zonder naam", - "questions": { - "phoneNumberOf": "Wat is het telefoonnummer van {category}?", - "phoneNumberIs": "Het telefoonnummer van {category} is {phone}", - "websiteOf": "Wat is de website van {category}?", - "websiteIs": "Website: {website}", - "emailOf": "Wat is het email-adres van {category}?", - "emailIs": "Het email-adres van {category} is {email}" - }, - "openStreetMapIntro": "

    Een open kaart

    Zou het niet fantastisch zijn als er een open kaart zou zijn die door iedereen aangepast én gebruikt kan worden? Een kaart waar iedereen zijn interesses aan zou kunnen toevoegen? Dan zouden er geen duizend-en-één verschillende kleine kaartjes, websites, ... meer nodig zijn

    OpenStreetMap is deze open kaart. Je mag de kaartdata gratis gebruiken (mits bronvermelding en herpublicatie van aanpassingen). Daarenboven mag je de kaart ook gratis aanpassen als je een account maakt. Ook deze website is gebaseerd op OpenStreetMap. Als je hier een vraag beantwoord, gaat het antwoord daar ook naartoe

    Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Organic Maps, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram,...
    Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!

    Kortom, als je hier een punt toevoegd of een vraag beantwoord, zal dat na een tijdje ook in al dié applicaties te zien zijn.

    ", - "attribution": { - "attributionTitle": "Met dank aan", - "attributionContent": "

    Alle data is voorzien door OpenStreetMap, gratis en vrij te hergebruiken onder de Open DataBase Licentie.

    ", - "themeBy": "Thema gemaakt door {author}", - "iconAttribution": { - "title": "Iconen en afbeeldingen" - }, - "mapContributionsByAndHidden": "De zichtbare data heeft bijdragen van {contributors} en {hiddenCount} andere bijdragers", - "mapContributionsBy": "De huidige data is bijgedragen door {contributors}", - "codeContributionsBy": "MapComplete is gebouwd door {contributors} en {hiddenCount} andere bijdragers" - }, - "sharescreen": { - "intro": "

    Deel deze kaart

    Kopieer onderstaande link om deze kaart naar vrienden en familie door te sturen:", - "addToHomeScreen": "

    Voeg toe aan je thuis-scherm

    Je kan deze website aan je thuisscherm van je smartphone toevoegen voor een native feel", - "embedIntro": "

    Plaats dit op je website

    Voeg dit kaartje toe op je eigen website.
    We moedigen dit zelfs aan - je hoeft geen toestemming te vragen.
    Het is gratis en zal dat altijd blijven. Hoe meer het gebruikt wordt, hoe waardevoller", - "copiedToClipboard": "Link gekopieerd naar klembord", - "thanksForSharing": "Bedankt om te delen!", - "editThisTheme": "Pas dit thema aan", - "editThemeDescription": "Pas vragen aan of voeg vragen toe aan dit kaartthema", - "fsUserbadge": "Activeer de login-knop", - "fsSearch": "Activeer de zoekbalk", - "fsWelcomeMessage": "Toon het welkomstbericht en de bijhorende tabbladen", - "fsLayers": "Toon de knop voor laagbediening", - "fsLayerControlToggle": "Toon de laagbediening meteen volledig", - "fsAddNew": "Activeer het toevoegen van nieuwe POI", - "fsGeolocation": "Toon het knopje voor geolocalisatie (enkel op mobiel)", - "fsIncludeCurrentBackgroundMap": "Gebruik de huidige achtergrond {name}", - "fsIncludeCurrentLayers": "Toon enkel de huidig getoonde lagen", - "fsIncludeCurrentLocation": "Start op de huidige locatie" - }, - "centerMessage": { - "loadingData": "Data wordt geladen…", - "zoomIn": "Zoom in om de data te zien en te bewerken", - "ready": "Klaar!", - "retrying": "Data inladen mislukt. Opnieuw proberen over {count} seconden…" - }, - "index": { - "#": "Deze teksten worden getoond boven de themaknoppen als er geen thema is geladen", - "title": "Welkom bij MapComplete", - "intro": "MapComplete is een OpenStreetMap applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.", - "pickTheme": "Kies hieronder een thema om te beginnen." - }, - "reviews": { - "title": "{count} beoordelingen", - "title_singular": "Eén beoordeling", - "name_required": "De naam van dit object moet gekend zijn om een review te kunnen maken", - "no_reviews_yet": "Er zijn nog geen beoordelingen. Wees de eerste om een beoordeling te schrijven en help open data en het bedrijf!", - "write_a_comment": "Schrijf een beoordeling…", - "no_rating": "Geen score bekend", - "posting_as": "Ingelogd als", - "i_am_affiliated": "Ik ben persoonlijk betrokken
    Vink aan indien je de oprichter, maker, werknemer, ... of dergelijke bent", - "affiliated_reviewer_warning": "(Review door betrokkene)", - "saving_review": "Opslaan…", - "saved": "Bedankt om je beoordeling te delen!", - "tos": "Als je je review publiceert, ga je akkoord met de de gebruiksvoorwaarden en privacy policy van Mangrove.reviews", - "attribution": "De beoordelingen worden voorzien door Mangrove Reviews en zijn beschikbaar onder deCC-BY 4.0-licentie.", - "plz_login": "Meld je aan om een beoordeling te geven" - }, - "morescreen": { - "intro": "

    Meer thematische kaarten

    Vind je het leuk om geodata te verzamelen?
    Hier vind je meer kaartthemas.", - "requestATheme": "Wil je een eigen kaartthema, vraag dit in de issue tracker.", - "streetcomplete": "Een andere, gelijkaardige Android-applicatie is StreetComplete.", - "createYourOwnTheme": "Maak je eigen MapComplete-kaart", - "previouslyHiddenTitle": "Eerder bezochte verborgen themas", - "hiddenExplanation": "Deze thema's zijn enkel zichtbaar indien je de link kent. Je hebt {hidden_discovered} van {total_hidden} verborgen thema's ontdekt" - }, - "readYourMessages": "Gelieve eerst je berichten op OpenStreetMap te lezen alvorens nieuwe punten toe te voegen.", - "fewChangesBefore": "Gelieve eerst enkele vragen van bestaande punten te beantwoorden vooraleer zelf punten toe te voegen.", - "goToInbox": "Ga naar de berichten", - "getStartedLogin": "Login met OpenStreetMap om te beginnen", - "getStartedNewAccount": " of maak een nieuwe account aan", - "noTagsSelected": "Geen tags geselecteerd", - "customThemeIntro": "

    Onofficiële thema's

    De onderstaande thema's heb je eerder bezocht en zijn gemaakt door andere OpenStreetMappers.", - "aboutMapcomplete": "

    Over MapComplete

    Met MapComplete kun je OpenStreetMap verrijken met informatie over een bepaald thema. Beantwoord enkele vragen, en binnen een paar minuten is jouw bijdrage wereldwijd beschikbaar! De maker van het thema bepaalt de elementen, vragen en taalversies voor het thema.

    Ontdek meer

    MapComplete biedt altijd de volgende stap naar meer OpenStreetMap:

    • Indien ingebed in een website linkt het iframe naar de volledige MapComplete
    • De volledige versie heeft uitleg over OpenStreetMap
    • Bekijken kan altijd, maar wijzigen vereist een OSM-account
    • Als je niet aangemeld bent, wordt je gevraagd dit te doen
    • Als je minstens één vraag hebt beantwoord, kan je ook elementen toevoegen
    • Heb je genoeg changesets, dan verschijnen de OSM-tags, nog later links naar de wiki

    Merk je een bug of wil je een extra feature? Wil je helpen vertalen? Bezoek dan de broncode en issue tracker.

    Wil je je vorderingen zien? Volg de edits op OsmCha.

    ", - "backgroundMap": "Achtergrondkaart", - "layerSelection": { - "zoomInToSeeThisLayer": "Vergroot de kaart om deze laag te zien", - "title": "Selecteer lagen" - }, - "weekdays": { - "abbreviations": { - "monday": "Maan", - "tuesday": "Din", - "wednesday": "Woe", - "thursday": "Don", - "friday": "Vrij", - "saturday": "Zat", - "sunday": "Zon" - }, - "monday": "Maandag", - "tuesday": "Dinsdag", - "wednesday": "Woensdag", - "thursday": "Donderdag", - "friday": "Vrijdag", - "saturday": "Zaterdag", - "sunday": "Zondag" - }, - "opening_hours": { - "error_loading": "Sorry, deze openingsuren kunnen niet getoond worden", - "open_during_ph": "Op een feestdag is deze zaak", - "opensAt": "vanaf", - "openTill": "tot", - "closed_until": "Gesloten - open op {date}", - "closed_permanently": "Gesloten voor onbepaalde tijd", - "open_24_7": "Dag en nacht open", - "ph_not_known": " ", - "ph_closed": "gesloten", - "ph_open": "open", - "ph_open_as_usual": "geopend zoals gewoonlijk", - "not_all_rules_parsed": "De openingsuren van deze zaak zijn ingewikkeld. De volgende regels worden niet getoond bij het ingeven:", - "loadingCountry": "Het land wordt nog bepaald…" - }, - "skippedQuestions": "Enkele vragen werden overgeslaan", - "skip": "Sla deze vraag over", - "save": "Opslaan", - "returnToTheMap": "Ga terug naar de kaart", - "pdf": { - "versionInfo": "v{version} - gemaakt op {date}", - "attr": "Kaartgegevens © OpenStreetMap-bijdragers, herbruikbaar volgens ODbL", - "generatedWith": "Gemaakt met MapComplete.osm.be", - "attrBackground": "Achtergrondlaag: {background}" - }, - "osmLinkTooltip": "Bekijk dit object op OpenStreetMap om de geschiedenis te zien en meer te kunnen aanpassen", - "oneSkippedQuestion": "Een vraag werd overgeslaan", - "number": "getal", - "loginOnlyNeededToEdit": "als je de kaart wilt aanpassen", - "download": { - "noDataLoaded": "Er is nog geen data ingeladen. Downloaden kan zodra de data geladen is.", - "licenseInfo": "

    Copyright

    De voorziene data is beschikbaar onder de ODbL. Het hergebruiken van deze data is gratis voor elke toepassing, maar
    • de bronvermelding © OpenStreetMap bijdragers is vereist
    • Elke wijziging aan deze data moet opnieuw gepubliceerd worden onder dezelfde licentie
    Gelieve de volledige licentie te lezen voor details", - "includeMetaData": "Exporteer metadata (zoals laatste aanpassing, berekende waardes, …)", - "downloadCSVHelper": "Compatibel met LibreOffice Calc, Excel, …", - "downloadCSV": "Download de zichtbare data als CSV", - "downloadGeoJsonHelper": "Compatibel met QGIS, ArcGIS, ESRI, …", - "downloadGeojson": "Download de zichtbare data als GeoJSON", - "downloadAsPdfHelper": "Perfect om de huidige kaart af te printen", - "downloadAsPdf": "Download een PDF van de huidig zichtbare kaart", - "title": "Download de zichtbare data", - "exporting": "Aan het exporteren..." - }, - "cancel": "Annuleren", - "testing": "Testmode - wijzigingen worden niet opgeslaan", - "openTheMap": "Naar de kaart", - "wikipedia": { - "failed": "Het Wikipedia-artikel inladen is mislukt", - "wikipediaboxTitle": "Wikipedia", - "loading": "Wikipedia aan het laden...", - "noWikipediaPage": "Dit Wikidata-item heeft nog geen overeenkomstig Wikipedia-artikel", - "createNewWikidata": "Maak een nieuw Wikidata-item", - "searchWikidata": "Zoek op Wikidata", - "noResults": "Niet gevonden voor {search}", - "doSearch": "Zoek hierboven om resultaten te zien" - }, - "histogram": { - "error_loading": "Kan het histogram niet laden" - }, - "loading": "Aan het laden..." + "#": "Deze teksten worden getoond boven de themaknoppen als er geen thema is geladen", + "title": "Welkom bij MapComplete", + "intro": "MapComplete is een OpenStreetMap applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.", + "pickTheme": "Kies hieronder een thema om te beginnen." }, "reviews": { - "title": "{count} beoordelingen", - "title_singular": "Eén beoordeling", - "name_required": "De naam van dit object moet gekend zijn om een review te kunnen maken", - "no_reviews_yet": "Er zijn nog geen beoordelingen. Wees de eerste om een beoordeling te schrijven en help open data en het bedrijf!", - "write_a_comment": "Schrijf een beoordeling...", - "no_rating": "Geen score bekend", - "posting_as": "Ingelogd als", - "i_am_affiliated": "Ik ben persoonlijk betrokken
    Vink aan indien je de oprichter, maker, werknemer, ... of dergelijke bent", - "affiliated_reviewer_warning": "(Review door betrokkene)", - "saving_review": "Opslaan...", - "saved": "Bedankt om je beoordeling te delen!", - "tos": "Als je je review publiceert, ga je akkoord met de de gebruiksvoorwaarden en privacy policy van Mangrove.reviews", - "attribution": "De beoordelingen worden voorzien door Mangrove Reviews en zijn beschikbaar onder deCC-BY 4.0-licentie. ", - "plz_login": "Meld je aan om een beoordeling te geven" + "title": "{count} beoordelingen", + "title_singular": "Eén beoordeling", + "name_required": "De naam van dit object moet gekend zijn om een review te kunnen maken", + "no_reviews_yet": "Er zijn nog geen beoordelingen. Wees de eerste om een beoordeling te schrijven en help open data en het bedrijf!", + "write_a_comment": "Schrijf een beoordeling…", + "no_rating": "Geen score bekend", + "posting_as": "Ingelogd als", + "i_am_affiliated": "Ik ben persoonlijk betrokken
    Vink aan indien je de oprichter, maker, werknemer, ... of dergelijke bent", + "affiliated_reviewer_warning": "(Review door betrokkene)", + "saving_review": "Opslaan…", + "saved": "Bedankt om je beoordeling te delen!", + "tos": "Als je je review publiceert, ga je akkoord met de de gebruiksvoorwaarden en privacy policy van Mangrove.reviews", + "attribution": "De beoordelingen worden voorzien door Mangrove Reviews en zijn beschikbaar onder deCC-BY 4.0-licentie.", + "plz_login": "Meld je aan om een beoordeling te geven" }, - "favourite": { - "reload": "Herlaad de data", - "loginNeeded": "

    Log in

    Je moet je aanmelden met OpenStreetMap om een persoonlijk thema te gebruiken", - "panelIntro": "

    Jouw persoonlijke thema

    Activeer je favorite lagen van alle andere themas" + "morescreen": { + "intro": "

    Meer thematische kaarten

    Vind je het leuk om geodata te verzamelen?
    Hier vind je meer kaartthemas.", + "requestATheme": "Wil je een eigen kaartthema, vraag dit in de issue tracker.", + "streetcomplete": "Een andere, gelijkaardige Android-applicatie is StreetComplete.", + "createYourOwnTheme": "Maak je eigen MapComplete-kaart", + "previouslyHiddenTitle": "Eerder bezochte verborgen themas", + "hiddenExplanation": "Deze thema's zijn enkel zichtbaar indien je de link kent. Je hebt {hidden_discovered} van {total_hidden} verborgen thema's ontdekt" }, - "delete": { - "readMessages": "Je hebt ongelezen berichten. Je moet deze lezen voordat je een punt verwijderd, een andere bijdrager heeft misschien feedback", - "explanations": { - "softDelete": "Dit punt zal aangepast worden en zal in deze applicatie niet meer getoond worden. {reason}", - "hardDelete": "Dit punt zal verwijderd worden in OpenStreetMap. Een ervaren bijdrager kan dit ongedaan maken.", - "selectReason": "Gelieve aan te duiden waarom dit punt verwijderd moet worden" - }, - "reasons": { - "notFound": "Het kon niet gevonden worden", - "disused": "Het wordt niet meer onderhouden of is verwijderd", - "test": "Dit punt was een test en was nooit echt aanwezig", - "duplicate": "Dit punt is een duplicaat van een ander punt" - }, - "cancel": "Annuleren", - "isDeleted": "Dit object is verwijderd", - "delete": "Verwijder", - "partOfOthers": "Dit punt maakt deel uit van een lijn, oppervlakte of een relatie en kan niet verwijderd worden.", - "whyDelete": "Waarom moet dit punt van de kaart verwijderd worden?", - "loginToDelete": "Je moet aangemeld zijn om een object van de kaart te verwijderen", - "onlyEditedByLoggedInUser": "Dit punt is enkel door jezelf bewerkt, je kan dit veilig verwijderen.", - "cannotBeDeleted": "Dit object kan niet van de kaart verwijderd worden", - "safeDelete": "Dit punt kan veilig verwijderd worden van de kaart.", - "isntAPoint": "Enkel punten kunnen verwijderd worden, het geselecteerde object is een lijn, een oppervlakte of een relatie.", - "notEnoughExperience": "Dit punt is door iemand anders gemaakt.", - "useSomethingElse": "Gebruik een ander OpenStreetMap-editeerprogramma om dit object te verwijderen", - "loading": "Aan het bekijken of dit object veilig verwijderd kan worden." + "readYourMessages": "Gelieve eerst je berichten op OpenStreetMap te lezen alvorens nieuwe punten toe te voegen.", + "fewChangesBefore": "Gelieve eerst enkele vragen van bestaande punten te beantwoorden vooraleer zelf punten toe te voegen.", + "goToInbox": "Ga naar de berichten", + "getStartedLogin": "Login met OpenStreetMap om te beginnen", + "getStartedNewAccount": " of maak een nieuwe account aan", + "noTagsSelected": "Geen tags geselecteerd", + "customThemeIntro": "

    Onofficiële thema's

    De onderstaande thema's heb je eerder bezocht en zijn gemaakt door andere OpenStreetMappers.", + "aboutMapcomplete": "

    Over MapComplete

    Met MapComplete kun je OpenStreetMap verrijken met informatie over een bepaald thema. Beantwoord enkele vragen, en binnen een paar minuten is jouw bijdrage wereldwijd beschikbaar! De maker van het thema bepaalt de elementen, vragen en taalversies voor het thema.

    Ontdek meer

    MapComplete biedt altijd de volgende stap naar meer OpenStreetMap:

    • Indien ingebed in een website linkt het iframe naar de volledige MapComplete
    • De volledige versie heeft uitleg over OpenStreetMap
    • Bekijken kan altijd, maar wijzigen vereist een OSM-account
    • Als je niet aangemeld bent, wordt je gevraagd dit te doen
    • Als je minstens één vraag hebt beantwoord, kan je ook elementen toevoegen
    • Heb je genoeg changesets, dan verschijnen de OSM-tags, nog later links naar de wiki

    Merk je een bug of wil je een extra feature? Wil je helpen vertalen? Bezoek dan de broncode en issue tracker.

    Wil je je vorderingen zien? Volg de edits op OsmCha.

    ", + "backgroundMap": "Achtergrondkaart", + "layerSelection": { + "zoomInToSeeThisLayer": "Vergroot de kaart om deze laag te zien", + "title": "Selecteer lagen" }, - "move": { - "cannotBeMoved": "Dit object kan niet verplaatst worden.", - "inviteToMove": { - "reasonRelocation": "Verplaats dit punt naar een andere locatie omdat het verhuisd is", - "reasonInaccurate": "Verbeter de precieze locatie van dit punt", - "generic": "Verplaats dit punt" - }, - "pointIsMoved": "Dit punt is verplaatst", - "confirmMove": "Verplaats", - "reasons": { - "reasonRelocation": "Dit object is verhuisd naar een andere locatie", - "reasonInaccurate": "De locatie van dit object is niet accuraat en moet een paar meter verschoven worden" - }, - "partOfAWay": "Dit punt is deel van een lijn of een oppervlakte. Gebruik een ander OpenStreetMap-bewerkprogramma om het te verplaatsen", - "partOfRelation": "Dit punt maakt deel uit van een relatie. Gebruik een ander OpenStreetMap-bewerkprogramma om het te verplaatsen", - "cancel": "Annuleer verplaatsing", - "loginToMove": "Je moet aangemeld zijn om een punt te verplaatsen", - "zoomInFurther": "Zoom verder in om de verplaatsing te bevestigen", - "isRelation": "Dit object is een relatie en kan niet verplaatst worden", - "inviteToMoveAgain": "Verplaats dit punt opnieuw", - "moveTitle": "Verplaats dit punt", - "whyMove": "Waarom verplaats je dit punt?", - "selectReason": "Waarom verplaats je dit object?", - "isWay": "Dit object is een lijn of een oppervlakte. Gebruik een ander OpenStreetMap-bewerkprogramma op het te verplaatsen." + "weekdays": { + "abbreviations": { + "monday": "Maan", + "tuesday": "Din", + "wednesday": "Woe", + "thursday": "Don", + "friday": "Vrij", + "saturday": "Zat", + "sunday": "Zon" + }, + "monday": "Maandag", + "tuesday": "Dinsdag", + "wednesday": "Woensdag", + "thursday": "Donderdag", + "friday": "Vrijdag", + "saturday": "Zaterdag", + "sunday": "Zondag" }, - "split": { - "cancel": "Annuleren", - "split": "Knip weg", - "splitTitle": "Duid op de kaart aan waar de weg geknipt moet worden", - "inviteToSplit": "Knip deze weg in kleinere segmenten (om andere eigenschappen per segment toe te kennen)", - "loginToSplit": "Je moet aangemeld zijn om een weg te knippen", - "hasBeenSplit": "Deze weg is verknipt" + "opening_hours": { + "error_loading": "Sorry, deze openingsuren kunnen niet getoond worden", + "open_during_ph": "Op een feestdag is dit", + "opensAt": "vanaf", + "openTill": "tot", + "closed_until": "Gesloten - open op {date}", + "closed_permanently": "Gesloten voor onbepaalde tijd", + "open_24_7": "Dag en nacht open", + "ph_not_known": " ", + "ph_closed": "gesloten", + "ph_open": "open", + "ph_open_as_usual": "geopend zoals gewoonlijk", + "not_all_rules_parsed": "De openingsuren zijn ingewikkeld. De volgende regels worden niet getoond bij het ingeven:", + "loadingCountry": "Het land wordt nog bepaald…" }, - "multi_apply": { - "autoApply": "Wijzigingen aan eigenschappen {attr_names} zullen ook worden uitgevoerd op {count} andere objecten." - } -} + "skippedQuestions": "Enkele vragen werden overgeslaan", + "skip": "Sla deze vraag over", + "save": "Opslaan", + "returnToTheMap": "Ga terug naar de kaart", + "pdf": { + "versionInfo": "v{version} - gemaakt op {date}", + "attr": "Kaartgegevens © OpenStreetMap-bijdragers, herbruikbaar volgens ODbL", + "generatedWith": "Gemaakt met MapComplete.osm.be", + "attrBackground": "Achtergrondlaag: {background}" + }, + "osmLinkTooltip": "Bekijk dit object op OpenStreetMap om de geschiedenis te zien en meer te kunnen aanpassen", + "oneSkippedQuestion": "Een vraag werd overgeslaan", + "number": "getal", + "loginOnlyNeededToEdit": "als je de kaart wilt aanpassen", + "download": { + "noDataLoaded": "Er is nog geen data ingeladen. Downloaden kan zodra de data geladen is.", + "licenseInfo": "

    Copyright

    De voorziene data is beschikbaar onder de ODbL. Het hergebruiken van deze data is gratis voor elke toepassing, maar
    • de bronvermelding © OpenStreetMap bijdragers is vereist
    • Elke wijziging aan deze data moet opnieuw gepubliceerd worden onder dezelfde licentie
    Gelieve de volledige licentie te lezen voor details", + "includeMetaData": "Exporteer metadata (zoals laatste aanpassing, berekende waardes, …)", + "downloadCSVHelper": "Compatibel met LibreOffice Calc, Excel, …", + "downloadCSV": "Download de zichtbare data als CSV", + "downloadGeoJsonHelper": "Compatibel met QGIS, ArcGIS, ESRI, …", + "downloadGeojson": "Download de zichtbare data als GeoJSON", + "downloadAsPdfHelper": "Perfect om de huidige kaart af te printen", + "downloadAsPdf": "Download een PDF van de huidig zichtbare kaart", + "title": "Download de zichtbare data", + "exporting": "Aan het exporteren..." + }, + "cancel": "Annuleren", + "testing": "Testmode - wijzigingen worden niet opgeslaan", + "openTheMap": "Naar de kaart", + "wikipedia": { + "failed": "Het Wikipedia-artikel inladen is mislukt", + "wikipediaboxTitle": "Wikipedia", + "loading": "Wikipedia aan het laden...", + "noWikipediaPage": "Dit Wikidata-item heeft nog geen overeenkomstig Wikipedia-artikel", + "createNewWikidata": "Maak een nieuw Wikidata-item", + "searchWikidata": "Zoek op Wikidata", + "noResults": "Niet gevonden voor {search}", + "doSearch": "Zoek hierboven om resultaten te zien" + }, + "histogram": { + "error_loading": "Kan het histogram niet laden" + }, + "loading": "Aan het laden..." + }, + "reviews": { + "title": "{count} beoordelingen", + "title_singular": "Eén beoordeling", + "name_required": "De naam van dit object moet gekend zijn om een review te kunnen maken", + "no_reviews_yet": "Er zijn nog geen beoordelingen. Wees de eerste om een beoordeling te schrijven en help open data en het bedrijf!", + "write_a_comment": "Schrijf een beoordeling...", + "no_rating": "Geen score bekend", + "posting_as": "Ingelogd als", + "i_am_affiliated": "Ik ben persoonlijk betrokken
    Vink aan indien je de oprichter, maker, werknemer, ... of dergelijke bent", + "affiliated_reviewer_warning": "(Review door betrokkene)", + "saving_review": "Opslaan...", + "saved": "Bedankt om je beoordeling te delen!", + "tos": "Als je je review publiceert, ga je akkoord met de de gebruiksvoorwaarden en privacy policy van Mangrove.reviews", + "attribution": "De beoordelingen worden voorzien door Mangrove Reviews en zijn beschikbaar onder deCC-BY 4.0-licentie. ", + "plz_login": "Meld je aan om een beoordeling te geven" + }, + "favourite": { + "reload": "Herlaad de data", + "loginNeeded": "

    Log in

    Je moet je aanmelden met OpenStreetMap om een persoonlijk thema te gebruiken", + "panelIntro": "

    Jouw persoonlijke thema

    Activeer je favorite lagen van alle andere themas" + }, + "delete": { + "readMessages": "Je hebt ongelezen berichten. Je moet deze lezen voordat je een punt verwijderd, een andere bijdrager heeft misschien feedback", + "explanations": { + "softDelete": "Dit punt zal aangepast worden en zal in deze applicatie niet meer getoond worden. {reason}", + "hardDelete": "Dit punt zal verwijderd worden in OpenStreetMap. Een ervaren bijdrager kan dit ongedaan maken.", + "selectReason": "Gelieve aan te duiden waarom dit punt verwijderd moet worden" + }, + "reasons": { + "notFound": "Het kon niet gevonden worden", + "disused": "Het wordt niet meer onderhouden of is verwijderd", + "test": "Dit punt was een test en was nooit echt aanwezig", + "duplicate": "Dit punt is een duplicaat van een ander punt" + }, + "cancel": "Annuleren", + "isDeleted": "Dit object is verwijderd", + "delete": "Verwijder", + "partOfOthers": "Dit punt maakt deel uit van een lijn, oppervlakte of een relatie en kan niet verwijderd worden.", + "whyDelete": "Waarom moet dit punt van de kaart verwijderd worden?", + "loginToDelete": "Je moet aangemeld zijn om een object van de kaart te verwijderen", + "onlyEditedByLoggedInUser": "Dit punt is enkel door jezelf bewerkt, je kan dit veilig verwijderen.", + "cannotBeDeleted": "Dit object kan niet van de kaart verwijderd worden", + "safeDelete": "Dit punt kan veilig verwijderd worden van de kaart.", + "isntAPoint": "Enkel punten kunnen verwijderd worden, het geselecteerde object is een lijn, een oppervlakte of een relatie.", + "notEnoughExperience": "Dit punt is door iemand anders gemaakt.", + "useSomethingElse": "Gebruik een ander OpenStreetMap-editeerprogramma om dit object te verwijderen", + "loading": "Aan het bekijken of dit object veilig verwijderd kan worden." + }, + "move": { + "cannotBeMoved": "Dit object kan niet verplaatst worden.", + "inviteToMove": { + "reasonRelocation": "Verplaats dit punt naar een andere locatie omdat het verhuisd is", + "reasonInaccurate": "Verbeter de precieze locatie van dit punt", + "generic": "Verplaats dit punt" + }, + "pointIsMoved": "Dit punt is verplaatst", + "confirmMove": "Verplaats", + "reasons": { + "reasonRelocation": "Dit object is verhuisd naar een andere locatie", + "reasonInaccurate": "De locatie van dit object is niet accuraat en moet een paar meter verschoven worden" + }, + "partOfAWay": "Dit punt is deel van een lijn of een oppervlakte. Gebruik een ander OpenStreetMap-bewerkprogramma om het te verplaatsen", + "partOfRelation": "Dit punt maakt deel uit van een relatie. Gebruik een ander OpenStreetMap-bewerkprogramma om het te verplaatsen", + "cancel": "Annuleer verplaatsing", + "loginToMove": "Je moet aangemeld zijn om een punt te verplaatsen", + "zoomInFurther": "Zoom verder in om de verplaatsing te bevestigen", + "isRelation": "Dit object is een relatie en kan niet verplaatst worden", + "inviteToMoveAgain": "Verplaats dit punt opnieuw", + "moveTitle": "Verplaats dit punt", + "whyMove": "Waarom verplaats je dit punt?", + "selectReason": "Waarom verplaats je dit object?", + "isWay": "Dit object is een lijn of een oppervlakte. Gebruik een ander OpenStreetMap-bewerkprogramma op het te verplaatsen." + }, + "split": { + "cancel": "Annuleren", + "split": "Knip weg", + "splitTitle": "Duid op de kaart aan waar de weg geknipt moet worden", + "inviteToSplit": "Knip deze weg in kleinere segmenten (om andere eigenschappen per segment toe te kennen)", + "loginToSplit": "Je moet aangemeld zijn om een weg te knippen", + "hasBeenSplit": "Deze weg is verknipt" + }, + "multi_apply": { + "autoApply": "Wijzigingen aan eigenschappen {attr_names} zullen ook worden uitgevoerd op {count} andere objecten." + } +} \ No newline at end of file diff --git a/langs/pt.json b/langs/pt.json index 50537983eb..fabdb6a7ac 100644 --- a/langs/pt.json +++ b/langs/pt.json @@ -1,42 +1,42 @@ { - "centerMessage": { - "retrying": "Surgiu uma falha ao carregar os dados. A tentar novamente dentro de {count} segundos…", - "ready": "Concluído!", - "zoomIn": "Amplie para ver ou editar os dados", - "loadingData": "A carregar os dados…" + "centerMessage": { + "retrying": "Surgiu uma falha ao carregar os dados. A tentar novamente dentro de {count} segundos…", + "ready": "Concluído!", + "zoomIn": "Amplie para ver ou editar os dados", + "loadingData": "A carregar os dados…" + }, + "image": { + "isDeleted": "Eliminada", + "doDelete": "Remover imagem", + "dontDelete": "Cancelar", + "uploadDone": "A sua imagem foi adicionada. Obrigado pela ajuda!", + "respectPrivacy": "Não fotografe pessoas nem placas de veículos. Não envie imagens do Google Maps, do Google Streetview ou outras fontes protegidas por direitos de autor.", + "uploadFailed": "Não foi possível enviar a sua imagem. Está conectado à Internet e permite APIs de terceiros? O navegador \"Brave\" ou o plugin \"uMatrix\" podem estar a bloqueá-los.", + "ccb": "sob a licença CC-BY", + "ccbs": "sob a licença CC-BY-SA", + "cco": "no domínio público", + "willBePublished": "A sua imagem será publicada: ", + "pleaseLogin": "Entre na sua conta para adicionar uma imagem", + "uploadingMultiple": "A enviar {count} imagens…", + "uploadingPicture": "A enviar a sua imagem…", + "addPicture": "Adicionar imagem", + "uploadMultipleDone": "Foram adicionadas {count} fotografias. Obrigado por ajudar!", + "toBig": "A sua imagem é muito grande porque tem {actual_size}. Use imagens com o máximo {max_size}" + }, + "index": { + "#": "Estes textos são mostrados acima dos botões do tema quando nenhum tema é carregado", + "title": "Bem-vindo(a) ao MapComplete", + "intro": "O MapComplete é um visualizador e editor do OpenStreetMap, que mostra informações sobre um tema específico.", + "pickTheme": "Escolha um tema abaixo para começar.", + "featuredThemeTitle": "Destaque desta semana" + }, + "delete": { + "reasons": { + "notFound": "Não foi possível encontrar este elemento" }, - "image": { - "isDeleted": "Eliminada", - "doDelete": "Remover imagem", - "dontDelete": "Cancelar", - "uploadDone": "A sua imagem foi adicionada. Obrigado pela ajuda!", - "respectPrivacy": "Não fotografe pessoas nem placas de veículos. Não envie imagens do Google Maps, do Google Streetview ou outras fontes protegidas por direitos de autor.", - "uploadFailed": "Não foi possível enviar a sua imagem. Está conectado à Internet e permite APIs de terceiros? O navegador \"Brave\" ou o plugin \"uMatrix\" podem estar a bloqueá-los.", - "ccb": "sob a licença CC-BY", - "ccbs": "sob a licença CC-BY-SA", - "cco": "no domínio público", - "willBePublished": "A sua imagem será publicada: ", - "pleaseLogin": "Entre na sua conta para adicionar uma imagem", - "uploadingMultiple": "A enviar {count} imagens…", - "uploadingPicture": "A enviar a sua imagem…", - "addPicture": "Adicionar imagem", - "uploadMultipleDone": "Foram adicionadas {count} fotografias. Obrigado por ajudar!", - "toBig": "A sua imagem é muito grande porque tem {actual_size}. Use imagens com o máximo {max_size}" - }, - "index": { - "#": "Estes textos são mostrados acima dos botões do tema quando nenhum tema é carregado", - "title": "Bem-vindo(a) ao MapComplete", - "intro": "O MapComplete é um visualizador e editor do OpenStreetMap, que mostra informações sobre um tema específico.", - "pickTheme": "Escolha um tema abaixo para começar.", - "featuredThemeTitle": "Destaque desta semana" - }, - "delete": { - "reasons": { - "notFound": "Não foi possível encontrar este elemento" - }, - "explanations": { - "selectReason": "Por favor, selecione a razão porque este elemento deve ser eliminado", - "hardDelete": "Este ponto será eliminado no OpenStreetMap. Pode ser recuperado por um contribuidor com experiência" - } + "explanations": { + "selectReason": "Por favor, selecione a razão porque este elemento deve ser eliminado", + "hardDelete": "Este ponto será eliminado no OpenStreetMap. Pode ser recuperado por um contribuidor com experiência" } + } } diff --git a/langs/shared-questions/de.json b/langs/shared-questions/de.json index 24b5582b65..0413ec8000 100644 --- a/langs/shared-questions/de.json +++ b/langs/shared-questions/de.json @@ -1,99 +1,99 @@ { - "undefined": { - "description": { - "question": "Gibt es noch etwas, das die vorhergehenden Fragen nicht abgedeckt haben? Hier wäre Platz dafür.
    Bitte keine bereits erhobenen Informationen." + "undefined": { + "description": { + "question": "Gibt es noch etwas, das die vorhergehenden Fragen nicht abgedeckt haben? Hier wäre Platz dafür.
    Bitte keine bereits erhobenen Informationen." + }, + "dog-access": { + "mappings": { + "0": { + "then": "Hunde sind erlaubt" }, - "dog-access": { - "mappings": { - "0": { - "then": "Hunde sind erlaubt" - }, - "1": { - "then": "Hunde sind nicht erlaubt" - }, - "2": { - "then": "Hunde sind erlaubt, müssen aber angeleint sein" - }, - "3": { - "then": "Hunde sind erlaubt und können frei herumlaufen" - } - }, - "question": "Sind Hunde in diesem Geschäft erlaubt?" + "1": { + "then": "Hunde sind nicht erlaubt" }, - "email": { - "question": "Was ist die Mail-Adresse von {name}?" + "2": { + "then": "Hunde sind erlaubt, müssen aber angeleint sein" }, - "level": { - "mappings": { - "0": { - "then": "Unterirdisch gelegen" - }, - "1": { - "then": "Ist im Erdgeschoss" - }, - "2": { - "then": "Ist im Erdgeschoss" - }, - "3": { - "then": "Ist im ersten Stock" - } - }, - "question": "In welchem Stockwerk befindet sich dieses Objekt?", - "render": "Befindet sich im {level}ten Stock" - }, - "opening_hours": { - "question": "Was sind die Öffnungszeiten von {name}?", - "render": "

    Öffnungszeiten

    {opening_hours_table(opening_hours)}" - }, - "payment-options": { - "mappings": { - "0": { - "then": "Hier wird Bargeld akzeptiert" - }, - "1": { - "then": "Hier werden Zahlungskarten akzeptiert" - } - }, - "question": "Welche Zahlungsmethoden werden hier akzeptiert?" - }, - "phone": { - "question": "Was ist die Telefonnummer von {name}?" - }, - "website": { - "question": "Was ist die Website von {name}?" - }, - "wheelchair-access": { - "mappings": { - "0": { - "then": "Dieser Ort ist speziell für Rollstuhlfahrer eingerichtet" - }, - "1": { - "then": "Dieser Ort ist mit einem Rollstuhl leicht zu erreichen" - }, - "2": { - "then": "Es ist möglich, diesen Ort mit einem Rollstuhl zu erreichen, aber es ist nicht einfach" - }, - "3": { - "then": "Dieser Ort ist nicht mit einem Rollstuhl erreichbar" - } - }, - "question": "Ist dieser Ort mit einem Rollstuhl zugänglich?" - }, - "wikipedia": { - "mappings": { - "0": { - "then": "Es wurde noch keine Wikipedia-Seite verlinkt" - } - }, - "question": "Was ist das entsprechende Wikidata Element?" - }, - "wikipedialink": { - "mappings": { - "0": { - "then": "Nicht mit Wikipedia verknüpft" - } - }, - "question": "Was ist der entsprechende Artikel auf Wikipedia?" + "3": { + "then": "Hunde sind erlaubt und können frei herumlaufen" } + }, + "question": "Sind Hunde in diesem Geschäft erlaubt?" + }, + "email": { + "question": "Was ist die Mail-Adresse von {name}?" + }, + "level": { + "mappings": { + "0": { + "then": "Unterirdisch gelegen" + }, + "1": { + "then": "Ist im Erdgeschoss" + }, + "2": { + "then": "Ist im Erdgeschoss" + }, + "3": { + "then": "Ist im ersten Stock" + } + }, + "question": "In welchem Stockwerk befindet sich dieses Objekt?", + "render": "Befindet sich im {level}ten Stock" + }, + "opening_hours": { + "question": "Was sind die Öffnungszeiten von {name}?", + "render": "

    Öffnungszeiten

    {opening_hours_table(opening_hours)}" + }, + "payment-options": { + "mappings": { + "0": { + "then": "Hier wird Bargeld akzeptiert" + }, + "1": { + "then": "Hier werden Zahlungskarten akzeptiert" + } + }, + "question": "Welche Zahlungsmethoden werden hier akzeptiert?" + }, + "phone": { + "question": "Was ist die Telefonnummer von {name}?" + }, + "website": { + "question": "Was ist die Website von {name}?" + }, + "wheelchair-access": { + "mappings": { + "0": { + "then": "Dieser Ort ist speziell für Rollstuhlfahrer eingerichtet" + }, + "1": { + "then": "Dieser Ort ist mit einem Rollstuhl leicht zu erreichen" + }, + "2": { + "then": "Es ist möglich, diesen Ort mit einem Rollstuhl zu erreichen, aber es ist nicht einfach" + }, + "3": { + "then": "Dieser Ort ist nicht mit einem Rollstuhl erreichbar" + } + }, + "question": "Ist dieser Ort mit einem Rollstuhl zugänglich?" + }, + "wikipedia": { + "mappings": { + "0": { + "then": "Es wurde noch keine Wikipedia-Seite verlinkt" + } + }, + "question": "Was ist das entsprechende Wikidata Element?" + }, + "wikipedialink": { + "mappings": { + "0": { + "then": "Nicht mit Wikipedia verknüpft" + } + }, + "question": "Was ist der entsprechende Artikel auf Wikipedia?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/en.json b/langs/shared-questions/en.json index 22861f3156..4d3aaeef19 100644 --- a/langs/shared-questions/en.json +++ b/langs/shared-questions/en.json @@ -1,99 +1,116 @@ { - "undefined": { - "description": { - "question": "Is there still something relevant you couldn't give in the previous questions? Add it here.
    Don't repeat already stated facts" + "undefined": { + "description": { + "question": "Is there still something relevant you couldn't give in the previous questions? Add it here.
    Don't repeat already stated facts" + }, + "dog-access": { + "mappings": { + "0": { + "then": "Dogs are allowed" }, - "dog-access": { - "mappings": { - "0": { - "then": "Dogs are allowed" - }, - "1": { - "then": "Dogs are not allowed" - }, - "2": { - "then": "Dogs are allowed, but they have to be leashed" - }, - "3": { - "then": "Dogs are allowed and can run around freely" - } - }, - "question": "Are dogs allowed in this business?" + "1": { + "then": "Dogs are not allowed" }, - "email": { - "question": "What is the email address of {name}?" + "2": { + "then": "Dogs are allowed, but they have to be leashed" }, - "level": { - "mappings": { - "0": { - "then": "Located underground" - }, - "1": { - "then": "Located on the ground floor" - }, - "2": { - "then": "Located on the ground floor" - }, - "3": { - "then": "Located on the first floor" - } - }, - "question": "On what level is this feature located?", - "render": "Located on the {level}th floor" - }, - "opening_hours": { - "question": "What are the opening hours of {name}?", - "render": "

    Opening hours

    {opening_hours_table(opening_hours)}" - }, - "payment-options": { - "mappings": { - "0": { - "then": "Cash is accepted here" - }, - "1": { - "then": "Payment cards are accepted here" - } - }, - "question": "Which methods of payment are accepted here?" - }, - "phone": { - "question": "What is the phone number of {name}?" - }, - "website": { - "question": "What is the website of {name}?" - }, - "wheelchair-access": { - "mappings": { - "0": { - "then": "This place is specially adapted for wheelchair users" - }, - "1": { - "then": "This place is easily reachable with a wheelchair" - }, - "2": { - "then": "It is possible to reach this place in a wheelchair, but it is not easy" - }, - "3": { - "then": "This place is not reachable with a wheelchair" - } - }, - "question": "Is this place accessible with a wheelchair?" - }, - "wikipedia": { - "mappings": { - "0": { - "then": "No Wikipedia page has been linked yet" - } - }, - "question": "What is the corresponding Wikidata entity?" - }, - "wikipedialink": { - "mappings": { - "0": { - "then": "Not linked with Wikipedia" - } - }, - "question": "What is the corresponding item on Wikipedia?" + "3": { + "then": "Dogs are allowed and can run around freely" } + }, + "question": "Are dogs allowed in this business?" + }, + "email": { + "question": "What is the email address of {name}?" + }, + "level": { + "mappings": { + "0": { + "then": "Located underground" + }, + "1": { + "then": "Located on the ground floor" + }, + "2": { + "then": "Located on the ground floor" + }, + "3": { + "then": "Located on the first floor" + } + }, + "question": "On what level is this feature located?", + "render": "Located on the {level}th floor" + }, + "opening_hours": { + "question": "What are the opening hours of {name}?", + "render": "

    Opening hours

    {opening_hours_table(opening_hours)}" + }, + "payment-options": { + "mappings": { + "0": { + "then": "Cash is accepted here" + }, + "1": { + "then": "Payment cards are accepted here" + } + }, + "question": "Which methods of payment are accepted here?" + }, + "phone": { + "question": "What is the phone number of {name}?" + }, + "service:electricity": { + "mappings": { + "0": { + "then": "There are plenty of domestic sockets available to customers seated indoors, where they can charge their electronics" + }, + "1": { + "then": "There are a few domestic sockets available to customers seated indoors, where they can charge their electronics" + }, + "2": { + "then": "There are no sockets available indoors to customers, but charging might be possible if the staff is asked" + }, + "3": { + "then": "There are a no domestic sockets available to customers seated indoors" + } + }, + "question": "Does this amenity have electrical outlets, available to customers when they are inside?" + }, + "website": { + "question": "What is the website of {name}?" + }, + "wheelchair-access": { + "mappings": { + "0": { + "then": "This place is specially adapted for wheelchair users" + }, + "1": { + "then": "This place is easily reachable with a wheelchair" + }, + "2": { + "then": "It is possible to reach this place in a wheelchair, but it is not easy" + }, + "3": { + "then": "This place is not reachable with a wheelchair" + } + }, + "question": "Is this place accessible with a wheelchair?" + }, + "wikipedia": { + "mappings": { + "0": { + "then": "No Wikipedia page has been linked yet" + } + }, + "question": "What is the corresponding Wikidata entity?" + }, + "wikipedialink": { + "mappings": { + "0": { + "then": "Not linked with Wikipedia" + } + }, + "question": "What is the corresponding item on Wikipedia?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/eo.json b/langs/shared-questions/eo.json index 636b21d23c..dfa5731905 100644 --- a/langs/shared-questions/eo.json +++ b/langs/shared-questions/eo.json @@ -1,40 +1,40 @@ { - "undefined": { - "dog-access": { - "mappings": { - "0": { - "then": "Hundoj estas permesataj" - }, - "1": { - "then": "Hundoj estas malpermesataj" - } - } + "undefined": { + "dog-access": { + "mappings": { + "0": { + "then": "Hundoj estas permesataj" }, - "email": { - "question": "Kio estas la retpoŝta adreso de {name}?" - }, - "level": { - "mappings": { - "1": { - "then": "En la teretaĝo" - }, - "2": { - "then": "En la teretaĝo" - }, - "3": { - "then": "En la unua etaĝo" - } - }, - "render": "En la {level}a etaĝo" - }, - "opening_hours": { - "render": "

    Malfermitaj horoj

    {opening_hours_table(opening_hours)}" - }, - "phone": { - "question": "Kio estas la telefonnumero de {name}?" - }, - "website": { - "question": "Kie estas la retejo de {name}?" + "1": { + "then": "Hundoj estas malpermesataj" } + } + }, + "email": { + "question": "Kio estas la retpoŝta adreso de {name}?" + }, + "level": { + "mappings": { + "1": { + "then": "En la teretaĝo" + }, + "2": { + "then": "En la teretaĝo" + }, + "3": { + "then": "En la unua etaĝo" + } + }, + "render": "En la {level}a etaĝo" + }, + "opening_hours": { + "render": "

    Malfermitaj horoj

    {opening_hours_table(opening_hours)}" + }, + "phone": { + "question": "Kio estas la telefonnumero de {name}?" + }, + "website": { + "question": "Kie estas la retejo de {name}?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/fr.json b/langs/shared-questions/fr.json index 7f0de79045..3f78960991 100644 --- a/langs/shared-questions/fr.json +++ b/langs/shared-questions/fr.json @@ -1,77 +1,77 @@ { - "undefined": { - "description": { - "question": "Y a-t-il quelque chose de pertinent que vous n'avez pas pu donner à la dernière question ? Ajoutez-le ici.
    Ne répétez pas des réponses déjà données" + "undefined": { + "description": { + "question": "Y a-t-il quelque chose de pertinent que vous n'avez pas pu donner à la dernière question ? Ajoutez-le ici.
    Ne répétez pas des réponses déjà données" + }, + "dog-access": { + "mappings": { + "0": { + "then": "Chiens admis" }, - "dog-access": { - "mappings": { - "0": { - "then": "Chiens admis" - }, - "1": { - "then": "Les chiens ne sont pas admis" - }, - "2": { - "then": "Les chiens sont admis, mais ils doivent être tenus en laisse" - }, - "3": { - "then": "Les chiens sont admis et peuvent circuler librement" - } - }, - "question": "Est-ce que les chiens sont admis ici ?" + "1": { + "then": "Les chiens ne sont pas admis" }, - "email": { - "question": "Quelle est l'adresse courriel de {name} ?" + "2": { + "then": "Les chiens sont admis, mais ils doivent être tenus en laisse" }, - "level": { - "mappings": { - "0": { - "then": "En sous-sol" - }, - "1": { - "then": "Rez-de-chaussée" - }, - "2": { - "then": "Rez-de-chaussée" - }, - "3": { - "then": "Premier étage" - } - }, - "question": "À quel étage se situe l’élément ?", - "render": "Étage {level}" - }, - "opening_hours": { - "question": "Quelles sont les horaires d'ouverture de {name} ?", - "render": "

    Horaires d'ouverture

    {opening_hours_table(opening_hours)}" - }, - "payment-options": { - "mappings": { - "0": { - "then": "Paiement en liquide accepté" - }, - "1": { - "then": "Paiement par carte accepté" - } - }, - "question": "Quelles sont les méthodes de paiement acceptées ici ?" - }, - "phone": { - "question": "Quel est le numéro de téléphone de {name} ?" - }, - "website": { - "question": "Quel est le site web de {name} ?" - }, - "wheelchair-access": { - "mappings": { - "2": { - "then": "Il est possible d'accéder à cet endroit en chaise roulante, mais ce n'est pas facile" - }, - "3": { - "then": "Cet endroit n'est pas accessible en chaise roulante" - } - }, - "question": "Est-ce que cet endroit est accessible en chaise roulante ?" + "3": { + "then": "Les chiens sont admis et peuvent circuler librement" } + }, + "question": "Est-ce que les chiens sont admis ici ?" + }, + "email": { + "question": "Quelle est l'adresse courriel de {name} ?" + }, + "level": { + "mappings": { + "0": { + "then": "En sous-sol" + }, + "1": { + "then": "Rez-de-chaussée" + }, + "2": { + "then": "Rez-de-chaussée" + }, + "3": { + "then": "Premier étage" + } + }, + "question": "À quel étage se situe l’élément ?", + "render": "Étage {level}" + }, + "opening_hours": { + "question": "Quelles sont les horaires d'ouverture de {name} ?", + "render": "

    Horaires d'ouverture

    {opening_hours_table(opening_hours)}" + }, + "payment-options": { + "mappings": { + "0": { + "then": "Paiement en liquide accepté" + }, + "1": { + "then": "Paiement par carte accepté" + } + }, + "question": "Quelles sont les méthodes de paiement acceptées ici ?" + }, + "phone": { + "question": "Quel est le numéro de téléphone de {name} ?" + }, + "website": { + "question": "Quel est le site web de {name} ?" + }, + "wheelchair-access": { + "mappings": { + "2": { + "then": "Il est possible d'accéder à cet endroit en chaise roulante, mais ce n'est pas facile" + }, + "3": { + "then": "Cet endroit n'est pas accessible en chaise roulante" + } + }, + "question": "Est-ce que cet endroit est accessible en chaise roulante ?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/gl.json b/langs/shared-questions/gl.json index 2d52f7307a..40baca77ee 100644 --- a/langs/shared-questions/gl.json +++ b/langs/shared-questions/gl.json @@ -1,7 +1,7 @@ { - "undefined": { - "website": { - "question": "Cal é a páxina web de {name}?" - } + "undefined": { + "website": { + "question": "Cal é a páxina web de {name}?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/hu.json b/langs/shared-questions/hu.json index d639475e1c..d6a75d5426 100644 --- a/langs/shared-questions/hu.json +++ b/langs/shared-questions/hu.json @@ -1,99 +1,99 @@ { - "undefined": { - "description": { - "question": "Van-e még valami lényeges, amit nem tudott megadni az előző kérdésekben? Itt megteheti.
    Ne ismételjen meg már megadott tényeket" + "undefined": { + "description": { + "question": "Van-e még valami lényeges, amit nem tudott megadni az előző kérdésekben? Itt megteheti.
    Ne ismételjen meg már megadott tényeket" + }, + "dog-access": { + "mappings": { + "0": { + "then": "Kutya bevihető" }, - "dog-access": { - "mappings": { - "0": { - "then": "Kutya bevihető" - }, - "1": { - "then": "Kutya nem vihető be" - }, - "2": { - "then": "Kutya bevihető, de csak pórázon" - }, - "3": { - "then": "Kutya bevihető és szabadon szaladgálhat" - } - }, - "question": "Be lehet-e vinni kutyát ebbe az üzletbe?" + "1": { + "then": "Kutya nem vihető be" }, - "email": { - "question": "Mi a(z) {name} e-mail címe?" + "2": { + "then": "Kutya bevihető, de csak pórázon" }, - "level": { - "mappings": { - "0": { - "then": "A föld alatt található" - }, - "1": { - "then": "A földszinten található" - }, - "2": { - "then": "A földszinten található" - }, - "3": { - "then": "Az első emeleten található" - } - }, - "question": "Melyik szinten található ez a létesítmény?", - "render": "{level}. emeleten található" - }, - "opening_hours": { - "question": "Mikor van nyitva ez: {name}?", - "render": "

    Nyitva tartás

    {opening_hours_table(opening_hours)}" - }, - "payment-options": { - "mappings": { - "0": { - "then": "Itt készpénzzel is lehet fizetni" - }, - "1": { - "then": "Itt fizetőkártyákkal is lehet fizetni" - } - }, - "question": "Milyen fizetési módokat fogadnak el itt?" - }, - "phone": { - "question": "Mi a telefonszáma ennek: {name}?" - }, - "website": { - "question": "Mi a weboldala ennek: {name}?" - }, - "wheelchair-access": { - "mappings": { - "0": { - "then": "Ez a hely kifejezetten kerekesszékeseknek lett kialakítva" - }, - "1": { - "then": "Ez a hely könnyedén elérhető kerekesszékkel" - }, - "2": { - "then": "Ez a hely ugyan elérhető kerekesszékkel, de nehezen" - }, - "3": { - "then": "Ez a hely kerekesszékkel elérhetetlen" - } - }, - "question": "Akadálymentes-e ez a hely?" - }, - "wikipedia": { - "mappings": { - "0": { - "then": "Még nincs Wikipédia-oldal belinkelve" - } - }, - "question": "Mi a megfelelő Wikidata-elem?" - }, - "wikipedialink": { - "mappings": { - "0": { - "then": "Nincs belinkelve a Wikipédiához" - } - }, - "question": "Mi a megfelelő szócikk a Wikipédián?" + "3": { + "then": "Kutya bevihető és szabadon szaladgálhat" } + }, + "question": "Be lehet-e vinni kutyát ebbe az üzletbe?" + }, + "email": { + "question": "Mi a(z) {name} e-mail címe?" + }, + "level": { + "mappings": { + "0": { + "then": "A föld alatt található" + }, + "1": { + "then": "A földszinten található" + }, + "2": { + "then": "A földszinten található" + }, + "3": { + "then": "Az első emeleten található" + } + }, + "question": "Melyik szinten található ez a létesítmény?", + "render": "{level}. emeleten található" + }, + "opening_hours": { + "question": "Mikor van nyitva ez: {name}?", + "render": "

    Nyitva tartás

    {opening_hours_table(opening_hours)}" + }, + "payment-options": { + "mappings": { + "0": { + "then": "Itt készpénzzel is lehet fizetni" + }, + "1": { + "then": "Itt fizetőkártyákkal is lehet fizetni" + } + }, + "question": "Milyen fizetési módokat fogadnak el itt?" + }, + "phone": { + "question": "Mi a telefonszáma ennek: {name}?" + }, + "website": { + "question": "Mi a weboldala ennek: {name}?" + }, + "wheelchair-access": { + "mappings": { + "0": { + "then": "Ez a hely kifejezetten kerekesszékeseknek lett kialakítva" + }, + "1": { + "then": "Ez a hely könnyedén elérhető kerekesszékkel" + }, + "2": { + "then": "Ez a hely ugyan elérhető kerekesszékkel, de nehezen" + }, + "3": { + "then": "Ez a hely kerekesszékkel elérhetetlen" + } + }, + "question": "Akadálymentes-e ez a hely?" + }, + "wikipedia": { + "mappings": { + "0": { + "then": "Még nincs Wikipédia-oldal belinkelve" + } + }, + "question": "Mi a megfelelő Wikidata-elem?" + }, + "wikipedialink": { + "mappings": { + "0": { + "then": "Nincs belinkelve a Wikipédiához" + } + }, + "question": "Mi a megfelelő szócikk a Wikipédián?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/id.json b/langs/shared-questions/id.json index 7c29ed6e61..61cc25a1a0 100644 --- a/langs/shared-questions/id.json +++ b/langs/shared-questions/id.json @@ -1,32 +1,32 @@ { - "undefined": { - "email": { - "question": "Apa alamat surel dari {name}?" - }, - "level": { - "mappings": { - "3": { - "then": "Berlokasi di lantai pertama" - } - }, - "question": "Pada tingkat apa fitur ini diletakkan?" - }, - "payment-options": { - "mappings": { - "0": { - "then": "Disini menerima pembayaran tunai" - }, - "1": { - "then": "Disini menerima pembayaran dengan kartu" - } - }, - "question": "Metode pembayaran manakah yang di terima disini?" - }, - "phone": { - "question": "Nomor telepon dari {name|?" - }, - "website": { - "question": "Apa situs web dari {name}?" + "undefined": { + "email": { + "question": "Apa alamat surel dari {name}?" + }, + "level": { + "mappings": { + "3": { + "then": "Berlokasi di lantai pertama" } + }, + "question": "Pada tingkat apa fitur ini diletakkan?" + }, + "payment-options": { + "mappings": { + "0": { + "then": "Disini menerima pembayaran tunai" + }, + "1": { + "then": "Disini menerima pembayaran dengan kartu" + } + }, + "question": "Metode pembayaran manakah yang di terima disini?" + }, + "phone": { + "question": "Nomor telepon dari {name|?" + }, + "website": { + "question": "Apa situs web dari {name}?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/it.json b/langs/shared-questions/it.json index 2b13ebb8b0..99a937c8e3 100644 --- a/langs/shared-questions/it.json +++ b/langs/shared-questions/it.json @@ -1,99 +1,99 @@ { - "undefined": { - "description": { - "question": "C'è ancora qualche informazione importante che non è stato possibile fornire nelle domande precedenti? Aggiungila qui.
    Non ripetere informazioni già fornite" + "undefined": { + "description": { + "question": "C'è ancora qualche informazione importante che non è stato possibile fornire nelle domande precedenti? Aggiungila qui.
    Non ripetere informazioni già fornite" + }, + "dog-access": { + "mappings": { + "0": { + "then": "Cani ammessi" }, - "dog-access": { - "mappings": { - "0": { - "then": "Cani ammessi" - }, - "1": { - "then": "I cani non sono ammessi" - }, - "2": { - "then": "Cani ammessi ma solo se tenuti al guinzaglio" - }, - "3": { - "then": "I cani sono ammessi e possono andare in giro liberamente" - } - }, - "question": "I cani sono ammessi in quest’attività?" + "1": { + "then": "I cani non sono ammessi" }, - "email": { - "question": "Qual è l'indirizzo email di {name}?" + "2": { + "then": "Cani ammessi ma solo se tenuti al guinzaglio" }, - "level": { - "mappings": { - "0": { - "then": "Si trova sotto il livello stradale" - }, - "1": { - "then": "Si trova al pianoterra" - }, - "2": { - "then": "Si trova al pianoterra" - }, - "3": { - "then": "Si trova al primo piano" - } - }, - "question": "A quale piano si trova questo elemento?", - "render": "Si trova al piano numero {level}" - }, - "opening_hours": { - "question": "Quali sono gli orari di apertura di {name}?", - "render": "

    Orari di apertura

    {opening_hours_table(opening_hours)}" - }, - "payment-options": { - "mappings": { - "0": { - "then": "I contanti sono accettati" - }, - "1": { - "then": "I pagamenti con la carta sono accettati" - } - }, - "question": "Quali metodi di pagamento sono accettati qui?" - }, - "phone": { - "question": "Qual è il numero di telefono di {name}?" - }, - "website": { - "question": "Qual è il sito web di {name}?" - }, - "wheelchair-access": { - "mappings": { - "0": { - "then": "Questo luogo è stato adattato per favorire le persone in sedia a rotelle" - }, - "1": { - "then": "Questo luogo è facilmente raggiungibile con una sedia a rotelle" - }, - "2": { - "then": "È possibile raggiungere questo luogo con una sedia a rotella ma non è semplice" - }, - "3": { - "then": "Questo luogo non è accessibile con una sedia a rotelle" - } - }, - "question": "Questo luogo è accessibile con una sedia a rotelle?" - }, - "wikipedia": { - "mappings": { - "0": { - "then": "Nessuna pagina Wikipedia è ancora stata collegata" - } - }, - "question": "Qual è l’elemento Wikidata corrispondente?" - }, - "wikipedialink": { - "mappings": { - "0": { - "then": "Non collegato a Wikipedia" - } - }, - "question": "Qual è il corrispondente elemento su Wikipedia?" + "3": { + "then": "I cani sono ammessi e possono andare in giro liberamente" } + }, + "question": "I cani sono ammessi in quest’attività?" + }, + "email": { + "question": "Qual è l'indirizzo email di {name}?" + }, + "level": { + "mappings": { + "0": { + "then": "Si trova sotto il livello stradale" + }, + "1": { + "then": "Si trova al pianoterra" + }, + "2": { + "then": "Si trova al pianoterra" + }, + "3": { + "then": "Si trova al primo piano" + } + }, + "question": "A quale piano si trova questo elemento?", + "render": "Si trova al piano numero {level}" + }, + "opening_hours": { + "question": "Quali sono gli orari di apertura di {name}?", + "render": "

    Orari di apertura

    {opening_hours_table(opening_hours)}" + }, + "payment-options": { + "mappings": { + "0": { + "then": "I contanti sono accettati" + }, + "1": { + "then": "I pagamenti con la carta sono accettati" + } + }, + "question": "Quali metodi di pagamento sono accettati qui?" + }, + "phone": { + "question": "Qual è il numero di telefono di {name}?" + }, + "website": { + "question": "Qual è il sito web di {name}?" + }, + "wheelchair-access": { + "mappings": { + "0": { + "then": "Questo luogo è stato adattato per favorire le persone in sedia a rotelle" + }, + "1": { + "then": "Questo luogo è facilmente raggiungibile con una sedia a rotelle" + }, + "2": { + "then": "È possibile raggiungere questo luogo con una sedia a rotella ma non è semplice" + }, + "3": { + "then": "Questo luogo non è accessibile con una sedia a rotelle" + } + }, + "question": "Questo luogo è accessibile con una sedia a rotelle?" + }, + "wikipedia": { + "mappings": { + "0": { + "then": "Nessuna pagina Wikipedia è ancora stata collegata" + } + }, + "question": "Qual è l’elemento Wikidata corrispondente?" + }, + "wikipedialink": { + "mappings": { + "0": { + "then": "Non collegato a Wikipedia" + } + }, + "question": "Qual è il corrispondente elemento su Wikipedia?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/nan.json b/langs/shared-questions/nan.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/langs/shared-questions/nan.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/langs/shared-questions/nb_NO.json b/langs/shared-questions/nb_NO.json index 1dfffd0e37..841617aa2d 100644 --- a/langs/shared-questions/nb_NO.json +++ b/langs/shared-questions/nb_NO.json @@ -1,97 +1,97 @@ { - "undefined": { - "description": { - "question": "Er det noe mer som er relevant du ikke kunne opplyse om i tidligere svar? Legg det til her.
    Ikke gjenta fakta som allerede er nevnt" + "undefined": { + "description": { + "question": "Er det noe mer som er relevant du ikke kunne opplyse om i tidligere svar? Legg det til her.
    Ikke gjenta fakta som allerede er nevnt" + }, + "dog-access": { + "mappings": { + "0": { + "then": "Hunder tillates" }, - "dog-access": { - "mappings": { - "0": { - "then": "Hunder tillates" - }, - "1": { - "then": "Hunder tillates ikke" - }, - "2": { - "then": "Hunder tillates, men de må være i bånd" - }, - "3": { - "then": "Hunder tillates og kan gå fritt" - } - }, - "question": "Tillates hunder i denne forretningen?" + "1": { + "then": "Hunder tillates ikke" }, - "email": { - "question": "Hva er e-postadressen til {name}?" + "2": { + "then": "Hunder tillates, men de må være i bånd" }, - "level": { - "mappings": { - "0": { - "then": "Under bakken" - }, - "1": { - "then": "På gateplan" - }, - "2": { - "then": "På gateplan" - }, - "3": { - "then": "I andre etasje" - } - } - }, - "opening_hours": { - "question": "Hva er åpningstidene for {name})", - "render": "

    Åpningstider

    {opening_hours_table(opening_hours)}" - }, - "payment-options": { - "mappings": { - "0": { - "then": "Kontanter godtas her" - }, - "1": { - "then": "Betalingskort godtas her" - } - }, - "question": "Hvilke betalingsmetoder godtas her?" - }, - "phone": { - "question": "Hva er telefonnummeret til {name}?" - }, - "website": { - "question": "Hva er nettsiden til {name}?" - }, - "wheelchair-access": { - "mappings": { - "0": { - "then": "Dette stedet er spesielt tilpasset rullestolsbrukere" - }, - "1": { - "then": "Dette stedet kan enkelt besøkes med rullestol" - }, - "2": { - "then": "Det er mulig å besøke dette stedet i rullestol, men det er ikke lett" - }, - "3": { - "then": "Dette stedet er ikke tilgjengelig for besøk med rullestol" - } - }, - "question": "Er dette stedet tilgjengelig for rullestoler?" - }, - "wikipedia": { - "mappings": { - "0": { - "then": "Ingen Wikipedia-side lenket enda" - } - }, - "question": "Hva er respektivt Wikipedia-element?" - }, - "wikipedialink": { - "mappings": { - "0": { - "then": "Ikke lenket med Wikipedia" - } - }, - "question": "Hva er respektivt element på Wikipedia?" + "3": { + "then": "Hunder tillates og kan gå fritt" } + }, + "question": "Tillates hunder i denne forretningen?" + }, + "email": { + "question": "Hva er e-postadressen til {name}?" + }, + "level": { + "mappings": { + "0": { + "then": "Under bakken" + }, + "1": { + "then": "På gateplan" + }, + "2": { + "then": "På gateplan" + }, + "3": { + "then": "I andre etasje" + } + } + }, + "opening_hours": { + "question": "Hva er åpningstidene for {name})", + "render": "

    Åpningstider

    {opening_hours_table(opening_hours)}" + }, + "payment-options": { + "mappings": { + "0": { + "then": "Kontanter godtas her" + }, + "1": { + "then": "Betalingskort godtas her" + } + }, + "question": "Hvilke betalingsmetoder godtas her?" + }, + "phone": { + "question": "Hva er telefonnummeret til {name}?" + }, + "website": { + "question": "Hva er nettsiden til {name}?" + }, + "wheelchair-access": { + "mappings": { + "0": { + "then": "Dette stedet er spesielt tilpasset rullestolsbrukere" + }, + "1": { + "then": "Dette stedet kan enkelt besøkes med rullestol" + }, + "2": { + "then": "Det er mulig å besøke dette stedet i rullestol, men det er ikke lett" + }, + "3": { + "then": "Dette stedet er ikke tilgjengelig for besøk med rullestol" + } + }, + "question": "Er dette stedet tilgjengelig for rullestoler?" + }, + "wikipedia": { + "mappings": { + "0": { + "then": "Ingen Wikipedia-side lenket enda" + } + }, + "question": "Hva er respektivt Wikipedia-element?" + }, + "wikipedialink": { + "mappings": { + "0": { + "then": "Ikke lenket med Wikipedia" + } + }, + "question": "Hva er respektivt element på Wikipedia?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/nl.json b/langs/shared-questions/nl.json index f3345bcb7e..3a712fb585 100644 --- a/langs/shared-questions/nl.json +++ b/langs/shared-questions/nl.json @@ -1,99 +1,116 @@ { - "undefined": { - "description": { - "question": "Zijn er nog andere relevante zaken die je niet in de bovenstaande vragen kwijt kon? Vul ze hier in.
    Herhaal geen antwoorden die je reeds gaf" + "undefined": { + "description": { + "question": "Zijn er nog andere relevante zaken die je niet in de bovenstaande vragen kwijt kon? Vul ze hier in.
    Herhaal geen antwoorden die je reeds gaf" + }, + "dog-access": { + "mappings": { + "0": { + "then": "honden zijn toegelaten" }, - "dog-access": { - "mappings": { - "0": { - "then": "honden zijn toegelaten" - }, - "1": { - "then": "honden zijn niet toegelaten" - }, - "2": { - "then": "honden zijn enkel aan de leiband welkom" - }, - "3": { - "then": "honden zijn welkom en mogen vrij rondlopen" - } - }, - "question": "Zijn honden toegelaten in deze zaak?" + "1": { + "then": "honden zijn niet toegelaten" }, - "email": { - "question": "Wat is het e-mailadres van {name}?" + "2": { + "then": "honden zijn enkel aan de leiband welkom" }, - "level": { - "mappings": { - "0": { - "then": "Bevindt zich ondergronds" - }, - "1": { - "then": "Bevindt zich op de begane grond" - }, - "2": { - "then": "Bevindt zich gelijkvloers" - }, - "3": { - "then": "Bevindt zich op de eerste verdieping" - } - }, - "question": "Op welke verdieping bevindt dit punt zich?", - "render": "Bevindt zich op de {level}de verdieping" - }, - "opening_hours": { - "question": "Wat zijn de openingstijden van {name}?", - "render": "

    Openingstijden

    {opening_hours_table(opening_hours)}" - }, - "payment-options": { - "mappings": { - "0": { - "then": "Cash geld wordt hier aanvaard" - }, - "1": { - "then": "Betalen met bankkaarten kan hier" - } - }, - "question": "Welke betaalmiddelen worden hier geaccepteerd?" - }, - "phone": { - "question": "Wat is het telefoonnummer van {name}?" - }, - "website": { - "question": "Wat is de website van {name}?" - }, - "wheelchair-access": { - "mappings": { - "0": { - "then": "Deze plaats is speciaal aangepast voor gebruikers van een rolstoel" - }, - "1": { - "then": "Deze plaats is vlot bereikbaar met een rolstoel" - }, - "2": { - "then": "Deze plaats is bereikbaar met een rolstoel, maar het is niet makkelijk" - }, - "3": { - "then": "Niet rolstoeltoegankelijk" - } - }, - "question": "Is deze plaats rolstoeltoegankelijk?" - }, - "wikipedia": { - "mappings": { - "0": { - "then": "Er werd nog geen Wikipedia-pagina gekoppeld" - } - }, - "question": "Welk Wikidata-item komt overeen met dit object?" - }, - "wikipedialink": { - "mappings": { - "0": { - "then": "Nog geen Wikipedia-artikel bekend" - } - }, - "question": "Welk Wikipedia-artikel beschrijft dit object?" + "3": { + "then": "honden zijn welkom en mogen vrij rondlopen" } + }, + "question": "Zijn honden toegelaten in deze zaak?" + }, + "email": { + "question": "Wat is het e-mailadres van {name}?" + }, + "level": { + "mappings": { + "0": { + "then": "Bevindt zich ondergronds" + }, + "1": { + "then": "Bevindt zich op de begane grond" + }, + "2": { + "then": "Bevindt zich gelijkvloers" + }, + "3": { + "then": "Bevindt zich op de eerste verdieping" + } + }, + "question": "Op welke verdieping bevindt dit punt zich?", + "render": "Bevindt zich op de {level}de verdieping" + }, + "opening_hours": { + "question": "Wat zijn de openingstijden van {name}?", + "render": "

    Openingstijden

    {opening_hours_table(opening_hours)}" + }, + "payment-options": { + "mappings": { + "0": { + "then": "Cash geld wordt hier aanvaard" + }, + "1": { + "then": "Betalen met bankkaarten kan hier" + } + }, + "question": "Welke betaalmiddelen worden hier geaccepteerd?" + }, + "phone": { + "question": "Wat is het telefoonnummer van {name}?" + }, + "service:electricity": { + "mappings": { + "0": { + "then": "Er zijn binnen veel stekkers beschikbaar voor klanten die electronica wensen op te laden" + }, + "1": { + "then": "Er zijn binnen enkele stekkers beschikbaar voor klanten die electronica wensen op te laden" + }, + "2": { + "then": "Er zijn binnen geen stekkers beschikbaar, maar electronica opladen kan indien men dit aan het personeel vraagt" + }, + "3": { + "then": "Er zijn binnen geen stekkers beschikbaar" + } + }, + "question": "Zijn er stekkers beschikbaar voor klanten die binnen zitten?" + }, + "website": { + "question": "Wat is de website van {name}?" + }, + "wheelchair-access": { + "mappings": { + "0": { + "then": "Deze plaats is speciaal aangepast voor gebruikers van een rolstoel" + }, + "1": { + "then": "Deze plaats is vlot bereikbaar met een rolstoel" + }, + "2": { + "then": "Deze plaats is bereikbaar met een rolstoel, maar het is niet makkelijk" + }, + "3": { + "then": "Niet rolstoeltoegankelijk" + } + }, + "question": "Is deze plaats rolstoeltoegankelijk?" + }, + "wikipedia": { + "mappings": { + "0": { + "then": "Er werd nog geen Wikipedia-pagina gekoppeld" + } + }, + "question": "Welk Wikidata-item komt overeen met dit object?" + }, + "wikipedialink": { + "mappings": { + "0": { + "then": "Nog geen Wikipedia-artikel bekend" + } + }, + "question": "Welk Wikipedia-artikel beschrijft dit object?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/pl.json b/langs/shared-questions/pl.json index 6715900e92..ae2b3280c8 100644 --- a/langs/shared-questions/pl.json +++ b/langs/shared-questions/pl.json @@ -1,38 +1,38 @@ { - "undefined": { - "description": { - "question": "Czy jest jeszcze coś istotnego, czego nie mogłeś podać w poprzednich pytaniach? Dodaj to tutaj.
    Nie powtarzaj już podanych faktów" + "undefined": { + "description": { + "question": "Czy jest jeszcze coś istotnego, czego nie mogłeś podać w poprzednich pytaniach? Dodaj to tutaj.
    Nie powtarzaj już podanych faktów" + }, + "email": { + "question": "Jaki jest adres e-mail do {name}?" + }, + "level": { + "mappings": { + "0": { + "then": "Znajduje się pod ziemią" }, - "email": { - "question": "Jaki jest adres e-mail do {name}?" + "1": { + "then": "Znajduje się na parterze" }, - "level": { - "mappings": { - "0": { - "then": "Znajduje się pod ziemią" - }, - "1": { - "then": "Znajduje się na parterze" - }, - "2": { - "then": "Znajduje się na parterze" - }, - "3": { - "then": "Znajduje się na pierwszym piętrze" - } - }, - "question": "Na jakim poziomie znajduje się ta funkcja?", - "render": "Znajduje się na {level} piętrze" + "2": { + "then": "Znajduje się na parterze" }, - "opening_hours": { - "question": "Jakie są godziny otwarcia {name}?", - "render": "

    Godziny otwarcia

    {opening_hours_table(opening_hours)}" - }, - "phone": { - "question": "Jaki jest numer telefonu do {name}?" - }, - "website": { - "question": "Jaka jest strona internetowa {name}?" + "3": { + "then": "Znajduje się na pierwszym piętrze" } + }, + "question": "Na jakim poziomie znajduje się ta funkcja?", + "render": "Znajduje się na {level} piętrze" + }, + "opening_hours": { + "question": "Jakie są godziny otwarcia {name}?", + "render": "

    Godziny otwarcia

    {opening_hours_table(opening_hours)}" + }, + "phone": { + "question": "Jaki jest numer telefonu do {name}?" + }, + "website": { + "question": "Jaka jest strona internetowa {name}?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/pt.json b/langs/shared-questions/pt.json index b1f25a4351..ea89c725d7 100644 --- a/langs/shared-questions/pt.json +++ b/langs/shared-questions/pt.json @@ -1,99 +1,99 @@ { - "undefined": { - "description": { - "question": "Ainda há algo de relevante que não tenha podido dar nas perguntas anteriores? Adicione-o aqui.
    Não repita factos já declarados" + "undefined": { + "description": { + "question": "Ainda há algo de relevante que não tenha podido dar nas perguntas anteriores? Adicione-o aqui.
    Não repita factos já declarados" + }, + "dog-access": { + "mappings": { + "0": { + "then": "Os cães são permitidos" }, - "dog-access": { - "mappings": { - "0": { - "then": "Os cães são permitidos" - }, - "1": { - "then": "Os cães não são permitidos" - }, - "2": { - "then": "Os cães são permitidos, mas têm de ser presos pela trela" - }, - "3": { - "then": "Os cães são permitidos e podem correr livremente" - } - }, - "question": "Os cães são permitidos neste estabelecimento?" + "1": { + "then": "Os cães não são permitidos" }, - "email": { - "question": "Qual é o endereço de e-mail de {name}?" + "2": { + "then": "Os cães são permitidos, mas têm de ser presos pela trela" }, - "level": { - "mappings": { - "0": { - "then": "Está no subsolo" - }, - "1": { - "then": "Está ao nível do rés-do-chão" - }, - "2": { - "then": "Está ao nível do rés-do-chão" - }, - "3": { - "then": "Está no primeiro andar" - } - }, - "question": "Em que nível se encontra este elemento?", - "render": "Está no {nível}º andar" - }, - "opening_hours": { - "question": "Qual é o horário de funcionamento de {name}?", - "render": "

    Horário de funcionamento

    {opening_hours_table(opening_hours)}" - }, - "payment-options": { - "mappings": { - "0": { - "then": "Aceitam pagamento com dinheiro aqui" - }, - "1": { - "then": "Aceitam pagamento com cartões bancários aqui" - } - }, - "question": "Que métodos de pagamento são aceites aqui?" - }, - "phone": { - "question": "Qual é o número de telefone de {name}?" - }, - "website": { - "question": "Qual é o sítio web de {name}?" - }, - "wheelchair-access": { - "mappings": { - "0": { - "then": "Este lugar está especialmente adaptado para utilizadores de cadeira de rodas" - }, - "1": { - "then": "Este lugar é de fácil acesso com uma cadeira de rodas" - }, - "2": { - "then": "É possível chegar a este local em cadeira de rodas, mas não é fácil" - }, - "3": { - "then": "Este lugar não é acessível com uma cadeira de rodas" - } - }, - "question": "Este lugar é acessível a utilizadores de cadeiras de rodas?" - }, - "wikipedia": { - "mappings": { - "0": { - "then": "Ainda não foi vinculada nenhuma página da Wikipédia" - } - }, - "question": "Qual é a entidade Wikidata correspondente?" - }, - "wikipedialink": { - "mappings": { - "0": { - "then": "Não vinculado à Wikipédia" - } - }, - "question": "Qual é o item correspondente na Wikipédia?" + "3": { + "then": "Os cães são permitidos e podem correr livremente" } + }, + "question": "Os cães são permitidos neste estabelecimento?" + }, + "email": { + "question": "Qual é o endereço de e-mail de {name}?" + }, + "level": { + "mappings": { + "0": { + "then": "Está no subsolo" + }, + "1": { + "then": "Está ao nível do rés-do-chão" + }, + "2": { + "then": "Está ao nível do rés-do-chão" + }, + "3": { + "then": "Está no primeiro andar" + } + }, + "question": "Em que nível se encontra este elemento?", + "render": "Está no {level}º andar" + }, + "opening_hours": { + "question": "Qual é o horário de funcionamento de {name}?", + "render": "

    Horário de funcionamento

    {opening_hours_table(opening_hours)}" + }, + "payment-options": { + "mappings": { + "0": { + "then": "Aceitam pagamento com dinheiro aqui" + }, + "1": { + "then": "Aceitam pagamento com cartões bancários aqui" + } + }, + "question": "Que métodos de pagamento são aceites aqui?" + }, + "phone": { + "question": "Qual é o número de telefone de {name}?" + }, + "website": { + "question": "Qual é o sítio web de {name}?" + }, + "wheelchair-access": { + "mappings": { + "0": { + "then": "Este lugar está especialmente adaptado para utilizadores de cadeira de rodas" + }, + "1": { + "then": "Este lugar é de fácil acesso com uma cadeira de rodas" + }, + "2": { + "then": "É possível chegar a este local em cadeira de rodas, mas não é fácil" + }, + "3": { + "then": "Este lugar não é acessível com uma cadeira de rodas" + } + }, + "question": "Este lugar é acessível a utilizadores de cadeiras de rodas?" + }, + "wikipedia": { + "mappings": { + "0": { + "then": "Ainda não foi vinculada nenhuma página da Wikipédia" + } + }, + "question": "Qual é a entidade Wikidata correspondente?" + }, + "wikipedialink": { + "mappings": { + "0": { + "then": "Não vinculado à Wikipédia" + } + }, + "question": "Qual é o item correspondente na Wikipédia?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/pt_BR.json b/langs/shared-questions/pt_BR.json index 6599af377e..1f47d793ce 100644 --- a/langs/shared-questions/pt_BR.json +++ b/langs/shared-questions/pt_BR.json @@ -1,66 +1,66 @@ { - "undefined": { - "description": { - "question": "Ainda há algo de relevante que não pôde dar nas perguntas anteriores? Adicione aqui.
    Não repita fatos já declarados" + "undefined": { + "description": { + "question": "Ainda há algo de relevante que não pôde dar nas perguntas anteriores? Adicione aqui.
    Não repita fatos já declarados" + }, + "email": { + "question": "Qual o endereço de e-mail de {name}?" + }, + "level": { + "mappings": { + "0": { + "then": "Localizado no subsolo" }, - "email": { - "question": "Qual o endereço de e-mail de {name}?" + "1": { + "then": "Localizado no térreo" }, - "level": { - "mappings": { - "0": { - "then": "Localizado no subsolo" - }, - "1": { - "then": "Localizado no térreo" - }, - "2": { - "then": "Localizado no térreo" - }, - "3": { - "then": "Localizado no primeiro andar" - } - }, - "question": "Em que nível esse recurso está localizado?", - "render": "Localizado no {level}o andar" + "2": { + "then": "Localizado no térreo" }, - "opening_hours": { - "question": "Qual o horário de funcionamento de {name}?", - "render": "

    Horário de funcionamento

    {opening_hours_table(opening_hours)}" - }, - "payment-options": { - "mappings": { - "0": { - "then": "Dinheiro é aceito aqui" - }, - "1": { - "then": "Cartões de pagamento são aceitos aqui" - } - }, - "question": "Quais métodos de pagamento são aceitos aqui?" - }, - "phone": { - "question": "Qual o número de telefone de {name}?" - }, - "website": { - "question": "Qual o site de {name}?" - }, - "wheelchair-access": { - "mappings": { - "0": { - "then": "Este lugar é especialmente adaptado para usuários de cadeira de rodas" - }, - "1": { - "then": "Este lugar é facilmente acessível com uma cadeira de rodas" - }, - "2": { - "then": "É possível chegar a esse local em uma cadeira de rodas, mas não é fácil" - }, - "3": { - "then": "Este lugar não é alcançável com uma cadeira de rodas" - } - }, - "question": "Este lugar é acessível com uma cadeira de rodas?" + "3": { + "then": "Localizado no primeiro andar" } + }, + "question": "Em que nível esse recurso está localizado?", + "render": "Localizado no {level}o andar" + }, + "opening_hours": { + "question": "Qual o horário de funcionamento de {name}?", + "render": "

    Horário de funcionamento

    {opening_hours_table(opening_hours)}" + }, + "payment-options": { + "mappings": { + "0": { + "then": "Dinheiro é aceito aqui" + }, + "1": { + "then": "Cartões de pagamento são aceitos aqui" + } + }, + "question": "Quais métodos de pagamento são aceitos aqui?" + }, + "phone": { + "question": "Qual o número de telefone de {name}?" + }, + "website": { + "question": "Qual o site de {name}?" + }, + "wheelchair-access": { + "mappings": { + "0": { + "then": "Este lugar é especialmente adaptado para usuários de cadeira de rodas" + }, + "1": { + "then": "Este lugar é facilmente acessível com uma cadeira de rodas" + }, + "2": { + "then": "É possível chegar a esse local em uma cadeira de rodas, mas não é fácil" + }, + "3": { + "then": "Este lugar não é alcançável com uma cadeira de rodas" + } + }, + "question": "Este lugar é acessível com uma cadeira de rodas?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/ru.json b/langs/shared-questions/ru.json index ace53f5cd7..441b15343d 100644 --- a/langs/shared-questions/ru.json +++ b/langs/shared-questions/ru.json @@ -1,38 +1,38 @@ { - "undefined": { - "description": { - "question": "Есть ли ещё что-то важное, о чём вы не смогли рассказать в предыдущих вопросах? Добавьте это здесь.
    Не повторяйте уже изложенные факты" + "undefined": { + "description": { + "question": "Есть ли ещё что-то важное, о чём вы не смогли рассказать в предыдущих вопросах? Добавьте это здесь.
    Не повторяйте уже изложенные факты" + }, + "email": { + "question": "Какой адрес электронной почты у {name}?" + }, + "level": { + "mappings": { + "0": { + "then": "Расположено под землей" }, - "email": { - "question": "Какой адрес электронной почты у {name}?" + "1": { + "then": "Расположено на первом этаже" }, - "level": { - "mappings": { - "0": { - "then": "Расположено под землей" - }, - "1": { - "then": "Расположено на первом этаже" - }, - "2": { - "then": "Расположено на первом этаже" - }, - "3": { - "then": "Расположено на первом этаже" - } - }, - "question": "На каком этаже находится этот объект?", - "render": "Расположено на {level}ом этаже" + "2": { + "then": "Расположено на первом этаже" }, - "opening_hours": { - "question": "Какое время работы у {name}?", - "render": "

    Часы работы

    {opening_hours_table(opening_hours)}" - }, - "phone": { - "question": "Какой номер телефона у {name}?" - }, - "website": { - "question": "Какой сайт у {name}?" + "3": { + "then": "Расположено на первом этаже" } + }, + "question": "На каком этаже находится этот объект?", + "render": "Расположено на {level}ом этаже" + }, + "opening_hours": { + "question": "Какое время работы у {name}?", + "render": "

    Часы работы

    {opening_hours_table(opening_hours)}" + }, + "phone": { + "question": "Какой номер телефона у {name}?" + }, + "website": { + "question": "Какой сайт у {name}?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/sv.json b/langs/shared-questions/sv.json index 8b19944e41..b4c946d6a7 100644 --- a/langs/shared-questions/sv.json +++ b/langs/shared-questions/sv.json @@ -1,34 +1,34 @@ { - "undefined": { - "email": { - "question": "Vad är e-postadressen till {name}?" + "undefined": { + "email": { + "question": "Vad är e-postadressen till {name}?" + }, + "level": { + "mappings": { + "0": { + "then": "Ligger under jorden" }, - "level": { - "mappings": { - "0": { - "then": "Ligger under jorden" - }, - "1": { - "then": "Ligger på bottenvåningen" - }, - "2": { - "then": "Ligger på bottenvåningen" - }, - "3": { - "then": "Ligger på första våningen" - } - }, - "render": "Ligger på {level}:e våningen" + "1": { + "then": "Ligger på bottenvåningen" }, - "opening_hours": { - "question": "Vilka är öppettiderna för {name}?", - "render": "

    Öppettider

    {opening_hours_table(opening_hours)}" + "2": { + "then": "Ligger på bottenvåningen" }, - "phone": { - "question": "Vad är telefonnumret till {name}?" - }, - "website": { - "question": "Vad är webbplatsen för {name}?" + "3": { + "then": "Ligger på första våningen" } + }, + "render": "Ligger på {level}:e våningen" + }, + "opening_hours": { + "question": "Vilka är öppettiderna för {name}?", + "render": "

    Öppettider

    {opening_hours_table(opening_hours)}" + }, + "phone": { + "question": "Vad är telefonnumret till {name}?" + }, + "website": { + "question": "Vad är webbplatsen för {name}?" } + } } \ No newline at end of file diff --git a/langs/shared-questions/zh_HANŨS.json b/langs/shared-questions/zh_HANŨS.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/langs/shared-questions/zh_HANŨS.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/langs/shared-questions/zh_Hans.json b/langs/shared-questions/zh_Hans.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/langs/shared-questions/zh_Hans.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/langs/shared-questions/zh_Hant.json b/langs/shared-questions/zh_Hant.json index eb0b0c8c87..cb2f72c44c 100644 --- a/langs/shared-questions/zh_Hant.json +++ b/langs/shared-questions/zh_Hant.json @@ -1,38 +1,38 @@ { - "undefined": { - "description": { - "question": "有什麼相關的資訊你無法在先前的問題回應的嗎?請加在這邊吧。
    不要重覆答覆已經知道的事情" + "undefined": { + "description": { + "question": "有什麼相關的資訊你無法在先前的問題回應的嗎?請加在這邊吧。
    不要重覆答覆已經知道的事情" + }, + "email": { + "question": "{name} 的電子郵件地址是什麼?" + }, + "level": { + "mappings": { + "0": { + "then": "位於地下" }, - "email": { - "question": "{name} 的電子郵件地址是什麼?" + "1": { + "then": "位於 1 樓" }, - "level": { - "mappings": { - "0": { - "then": "位於地下" - }, - "1": { - "then": "位於 1 樓" - }, - "2": { - "then": "位於 1 樓" - }, - "3": { - "then": "位於 2 樓" - } - }, - "question": "此圖徽位於哪個樓層/層級?", - "render": "位於 {level} 樓" + "2": { + "then": "位於 1 樓" }, - "opening_hours": { - "question": "{name} 的開放時間是什麼?", - "render": "

    開放時間

    {opening_hours_table(opening_hours)}" - }, - "phone": { - "question": "{name} 的電話號碼是什麼?" - }, - "website": { - "question": "{name} 網址是什麼?" + "3": { + "then": "位於 2 樓" } + }, + "question": "此圖徽位於哪個樓層/層級?", + "render": "位於 {level} 樓" + }, + "opening_hours": { + "question": "{name} 的開放時間是什麼?", + "render": "

    開放時間

    {opening_hours_table(opening_hours)}" + }, + "phone": { + "question": "{name} 的電話號碼是什麼?" + }, + "website": { + "question": "{name} 網址是什麼?" } + } } \ No newline at end of file diff --git a/langs/sv.json b/langs/sv.json index a3dd6a81ff..842df07e7e 100644 --- a/langs/sv.json +++ b/langs/sv.json @@ -1,63 +1,63 @@ { - "general": { - "opening_hours": { - "ph_open": "öppet", - "ph_closed": "stängt", - "ph_not_known": " ", - "open_24_7": "Öppet dygnet runt", - "closed_permanently": "Stängt tills vidare", - "closed_until": "Stängt till", - "openTill": "till", - "opensAt": "från", - "open_during_ph": "Om det är en röd dag är det här stället", - "error_loading": "Fel: kunde inte visualisera öppettiderna." - }, - "weekdays": { - "sunday": "Söndag", - "saturday": "Lördag", - "friday": "Fredag", - "thursday": "Torsdag", - "wednesday": "Onsdag", - "tuesday": "Tisdag", - "monday": "Måndag", - "abbreviations": { - "friday": "Fre", - "wednesday": "Ons", - "tuesday": "Tis", - "thursday": "Tor", - "sunday": "Sön", - "saturday": "Lör", - "monday": "Mån" - } - }, - "cancel": "Avbryt" + "general": { + "opening_hours": { + "ph_open": "öppet", + "ph_closed": "stängt", + "ph_not_known": " ", + "open_24_7": "Öppet dygnet runt", + "closed_permanently": "Stängt tills vidare", + "closed_until": "Stängt till", + "openTill": "till", + "opensAt": "från", + "open_during_ph": "Om det är en röd dag är det här stället", + "error_loading": "Fel: kunde inte visualisera öppettiderna." }, - "centerMessage": { - "ready": "Klar!", - "zoomIn": "Zooma in för att visa eller redigera data", - "loadingData": "Laddar data…", - "retrying": "Det gick inte att ladda in data. Försöker igen om {count} sekunder…" + "weekdays": { + "sunday": "Söndag", + "saturday": "Lördag", + "friday": "Fredag", + "thursday": "Torsdag", + "wednesday": "Onsdag", + "tuesday": "Tisdag", + "monday": "Måndag", + "abbreviations": { + "friday": "Fre", + "wednesday": "Ons", + "tuesday": "Tis", + "thursday": "Tor", + "sunday": "Sön", + "saturday": "Lör", + "monday": "Mån" + } }, - "image": { - "isDeleted": "Borttagen", - "doDelete": "Ta bort bild", - "dontDelete": "Avbryt", - "uploadDone": "Din bild har lagts till. Tack för att du bidrar!", - "respectPrivacy": "Fotografera inte personer eller registreringsskyltar. Ladda inte upp från Google Maps, Google Streetview eller andra upphovsrättsskyddade källor.", - "uploadFailed": "Misslyckades med att ladda upp din bild. Är du säker på att du är uppkopplad och tredjeparts-API:er tillåts? Brave eller uMatrix kanske blockerar dem.", - "ccb": "under CC-BY-licensen", - "ccbs": "under CC-BY-SA-licensen", - "cco": "med fri användning (public domain)", - "willBePublished": "Din bild kommer att publiceras: ", - "pleaseLogin": "Logga in för att lägga till en bild", - "uploadingMultiple": "Laddar upp {count} bilder…", - "uploadingPicture": "Laddar upp din bild…", - "addPicture": "Lägg till bild" - }, - "split": { - "cancel": "Avbryt" - }, - "delete": { - "cancel": "Avbryt" - } + "cancel": "Avbryt" + }, + "centerMessage": { + "ready": "Klar!", + "zoomIn": "Zooma in för att visa eller redigera data", + "loadingData": "Laddar data…", + "retrying": "Det gick inte att ladda in data. Försöker igen om {count} sekunder…" + }, + "image": { + "isDeleted": "Borttagen", + "doDelete": "Ta bort bild", + "dontDelete": "Avbryt", + "uploadDone": "Din bild har lagts till. Tack för att du bidrar!", + "respectPrivacy": "Fotografera inte personer eller registreringsskyltar. Ladda inte upp från Google Maps, Google Streetview eller andra upphovsrättsskyddade källor.", + "uploadFailed": "Misslyckades med att ladda upp din bild. Är du säker på att du är uppkopplad och tredjeparts-API:er tillåts? Brave eller uMatrix kanske blockerar dem.", + "ccb": "under CC-BY-licensen", + "ccbs": "under CC-BY-SA-licensen", + "cco": "med fri användning (public domain)", + "willBePublished": "Din bild kommer att publiceras: ", + "pleaseLogin": "Logga in för att lägga till en bild", + "uploadingMultiple": "Laddar upp {count} bilder…", + "uploadingPicture": "Laddar upp din bild…", + "addPicture": "Lägg till bild" + }, + "split": { + "cancel": "Avbryt" + }, + "delete": { + "cancel": "Avbryt" + } } diff --git a/langs/themes/ca.json b/langs/themes/ca.json index 475988277d..74dfc60b85 100644 --- a/langs/themes/ca.json +++ b/langs/themes/ca.json @@ -1,49 +1,49 @@ { - "aed": { - "description": "En aquest mapa , qualsevol pot trobar i marcar els desfibril·ladors externs automàtics més propers", - "title": "Mapa obert de desfibril·ladors (DEA)" - }, - "climbing": { - "layers": { - "0": { - "tagRenderings": { - "climbing_club-name": { - "render": "{name}" - } - } - }, - "1": { - "tagRenderings": { - "name": { - "render": "{name}" - } - } - }, - "2": { - "tagRenderings": { - "Name": { - "render": "{name}" - } - } - }, - "3": { - "tagRenderings": { - "name": { - "render": "{name}" - } - } - }, - "4": { - "tagRenderings": { - "climbing-opportunity-name": { - "render": "{name}" - } - } - } + "aed": { + "description": "En aquest mapa , qualsevol pot trobar i marcar els desfibril·ladors externs automàtics més propers", + "title": "Mapa obert de desfibril·ladors (DEA)" + }, + "climbing": { + "layers": { + "0": { + "tagRenderings": { + "climbing_club-name": { + "render": "{name}" + } } - }, - "personal": { - "description": "Crea una interfície basada en totes les capes disponibles de totes les interfícies", - "title": "Interfície personal" + }, + "1": { + "tagRenderings": { + "name": { + "render": "{name}" + } + } + }, + "2": { + "tagRenderings": { + "Name": { + "render": "{name}" + } + } + }, + "3": { + "tagRenderings": { + "name": { + "render": "{name}" + } + } + }, + "4": { + "tagRenderings": { + "climbing-opportunity-name": { + "render": "{name}" + } + } + } } + }, + "personal": { + "description": "Crea una interfície basada en totes les capes disponibles de totes les interfícies", + "title": "Interfície personal" + } } \ No newline at end of file diff --git a/langs/themes/de.json b/langs/themes/de.json index 8915bde92c..910c87b74d 100644 --- a/langs/themes/de.json +++ b/langs/themes/de.json @@ -1,1166 +1,1158 @@ { - "aed": { - "description": "Auf dieser Karte kann man nahe gelegene Defibrillatoren finden und markieren", - "title": "AED-Karte öffnen" - }, - "artwork": { - "description": "Willkommen bei der Freien Kunst-Karte, einer Karte mit Statuen, Büsten, Grafitti, ... auf der ganzen Welt", - "title": "Freie Kunstwerk-Karte" - }, - "benches": { - "description": "Diese Karte zeigt alle Sitzbänke, die in OpenStreetMap eingetragen sind: Einzeln stehende Bänke und Bänke, die zu Haltestellen oder Unterständen gehören. Mit einem OpenStreetMap-Account können Sie neue Bänke eintragen oder Detailinformationen existierender Bänke bearbeiten.", - "shortDescription": "Eine Karte aller Sitzbänke", - "title": "Sitzbänke" - }, - "bicyclelib": { - "description": "Fahrradbibliotheken sind Orte, um Fahrräder auszuleihen, oft gegen eine geringe Gebühr. Ein wichtiger Anwendungsfall sind Fahrradbibliotheken für Kinder, die es ihnen ermöglichen, auf ein größeres Fahrrad umzusteigen, wenn sie aus ihrem aktuellen Fahrrad herausgewachsen sind", - "title": "Fahrradbibliothek" - }, - "binoculars": { - "description": "Eine Karte mit festinstallierten Ferngläsern. Man findet sie typischerweise an touristischen Orten, Aussichtspunkten, auf Aussichtstürmen oder gelegentlich in einem Naturschutzgebiet.", - "shortDescription": "Eine Karte mit festinstallierten Ferngläsern", - "title": "Ferngläser" - }, - "bookcases": { - "description": "Bücherschränke sind alte Schaltschränke, Telefonzellen oder andere Einrichtungen, zur Aufbewahrung von Büchern. Jeder kann Bücher abstellen oder mitnehmen. Die Karte zielt darauf ab, alle Orte mit Bücherschränken zu sammeln. Sie können neue Bücherschränke in der Nähe entdecken und mit einem kostenlosen OpenStreetMap-Konto schnell Ihre Lieblingsbücherschränke hinzufügen.", - "title": "Öffentliche Bücherschränke Karte" - }, - "cafes_and_pubs": { - "title": "Cafés und Kneipen" - }, - "campersite": { - "description": "Auf dieser Seite finden Sie alle offiziellen Wohnmobilstellplätze und Orte zur Entsorgung von Schmutzwasser. Sie können Details über die angebotenen Dienstleistungen und die Kosten hinzufügen. Fügen Sie Bilder und Bewertungen hinzu. Dies ist eine Webseite und eine Webapp. Die Daten werden in OpenStreetMap gespeichert, so dass sie für immer kostenlos sind und von jeder App weiterverwendet werden können.", - "layers": { + "aed": { + "description": "Auf dieser Karte kann man nahe gelegene Defibrillatoren finden und markieren", + "title": "AED-Karte öffnen" + }, + "artwork": { + "description": "Willkommen bei der Freien Kunst-Karte, einer Karte mit Statuen, Büsten, Grafitti, ... auf der ganzen Welt", + "title": "Freie Kunstwerk-Karte" + }, + "benches": { + "description": "Diese Karte zeigt alle Sitzbänke, die in OpenStreetMap eingetragen sind: Einzeln stehende Bänke und Bänke, die zu Haltestellen oder Unterständen gehören. Mit einem OpenStreetMap-Account können Sie neue Bänke eintragen oder Detailinformationen existierender Bänke bearbeiten.", + "shortDescription": "Eine Karte aller Sitzbänke", + "title": "Sitzbänke" + }, + "bicyclelib": { + "description": "Fahrradbibliotheken sind Orte, um Fahrräder auszuleihen, oft gegen eine geringe Gebühr. Ein wichtiger Anwendungsfall sind Fahrradbibliotheken für Kinder, die es ihnen ermöglichen, auf ein größeres Fahrrad umzusteigen, wenn sie aus ihrem aktuellen Fahrrad herausgewachsen sind", + "title": "Fahrradbibliothek" + }, + "binoculars": { + "description": "Eine Karte mit festinstallierten Ferngläsern. Man findet sie typischerweise an touristischen Orten, Aussichtspunkten, auf Aussichtstürmen oder gelegentlich in einem Naturschutzgebiet.", + "shortDescription": "Eine Karte mit festinstallierten Ferngläsern", + "title": "Ferngläser" + }, + "bookcases": { + "description": "Bücherschränke sind alte Schaltschränke, Telefonzellen oder andere Einrichtungen, zur Aufbewahrung von Büchern. Jeder kann Bücher abstellen oder mitnehmen. Die Karte zielt darauf ab, alle Orte mit Bücherschränken zu sammeln. Sie können neue Bücherschränke in der Nähe entdecken und mit einem kostenlosen OpenStreetMap-Konto schnell Ihre Lieblingsbücherschränke hinzufügen.", + "title": "Öffentliche Bücherschränke Karte" + }, + "cafes_and_pubs": { + "title": "Cafés und Kneipen" + }, + "campersite": { + "description": "Auf dieser Seite finden Sie alle offiziellen Wohnmobilstellplätze und Orte zur Entsorgung von Schmutzwasser. Sie können Details über die angebotenen Dienstleistungen und die Kosten hinzufügen. Fügen Sie Bilder und Bewertungen hinzu. Dies ist eine Webseite und eine Webapp. Die Daten werden in OpenStreetMap gespeichert, so dass sie für immer kostenlos sind und von jeder App weiterverwendet werden können.", + "layers": { + "0": { + "description": "Wohnmobilstellplätze", + "name": "Wohnmobilstellplätze", + "presets": { + "0": { + "description": "Fügen Sie einen neuen offiziellen Wohnmobilstellplatz hinzu. Dies sind ausgewiesene Plätze, an denen Sie in Ihrem Wohnmobil übernachten können. Sie können wie ein richtiger Campingplatz oder nur wie ein Parkplatz aussehen. Möglicherweise sind sie gar nicht ausgeschildert, sondern nur in einem Gemeindebeschluss festgelegt. Ein normaler Parkplatz für Wohnmobile, auf dem übernachten nicht zulässig ist, ist kein Wohnmobilstellplatz. ", + "title": "Wohnmobilstellplatz" + } + }, + "tagRenderings": { + "caravansites-capacity": { + "question": "Wie viele Wohnmobile können hier parken? (Überspringen, wenn es keine offensichtliche Anzahl von Stellplätzen oder erlaubten Fahrzeugen gibt)", + "render": "{capacity} Wohnmobile können diesen Platz gleichzeitig nutzen" + }, + "caravansites-charge": { + "question": "Wie hoch ist die Gebühr an diesem Ort?", + "render": "Die Gebühr beträgt {charge}" + }, + "caravansites-description": { + "question": "Möchten Sie eine allgemeine Beschreibung für diesen Ort hinzufügen? (Bitte wiederholen Sie keine Informationen, die Sie bereits zuvor angegeben haben. Bitte bleiben Sie objektiv - Meinungen gehen in die Bewertungen ein)", + "render": "Mehr Details über diesen Ort: {description}" + }, + "caravansites-fee": { + "mappings": { + "0": { + "then": "Sie müssen für die Nutzung bezahlen" + }, + "1": { + "then": "Nutzung kostenlos" + } + }, + "question": "Wird hier eine Gebühr erhoben?" + }, + "caravansites-internet": { + "mappings": { + "0": { + "then": "Internetzugang ist vorhanden" + }, + "1": { + "then": "Internetzugang ist vorhanden" + }, + "2": { + "then": "Kein Internetzugang vorhanden" + } + }, + "question": "Ist an diesem Ort ein Internetzugang vorhanden?" + }, + "caravansites-internet-fee": { + "mappings": { + "0": { + "then": "Der Internetzugang ist gebührenpflichtig" + }, + "1": { + "then": "Der Internetzugang ist kostenlos" + } + }, + "question": "Ist der Internetzugang gebührenpflichtig?" + }, + "caravansites-long-term": { + "mappings": { + "0": { + "then": "Ja, es gibt einige Plätze für Langzeitmieten, aber Sie können auch tageweise bleiben" + }, + "1": { + "then": "Nein, hier gibt es keine Dauergäste" + }, + "2": { + "then": "Es sind nur Plätze für Dauercamper vorhanden (wenn Sie diese Antwort auswählen, wird dieser Ort wird von der Karte verschwinden)" + } + }, + "question": "Gibt es a diesem Ort Plätze für Dauercamper?" + }, + "caravansites-name": { + "question": "Wie heißt dieser Ort?", + "render": "Dieser Ort heißt {name}" + }, + "caravansites-sanitary-dump": { + "mappings": { + "0": { + "then": "Dieser Ort hat eine sanitäre Entsorgungsstation" + }, + "1": { + "then": "Dieser Ort hat keine sanitäre Entsorgungsstation" + } + }, + "question": "Hat dieser Ort eine sanitäre Entsorgungsstation?" + }, + "caravansites-toilets": { + "mappings": { + "0": { + "then": "Dieser Ort verfügt über Toiletten" + }, + "1": { + "then": "Dieser Ort verfügt nicht über Toiletten" + } + }, + "question": "Verfügt dieser Ort über Toiletten?" + }, + "caravansites-website": { + "question": "Hat dieser Ort eine Webseite?", + "render": "Offizielle Webseite: {website}" + } + }, + "title": { + "mappings": { "0": { - "description": "Wohnmobilstellplätze", - "name": "Wohnmobilstellplätze", - "presets": { - "0": { - "description": "Fügen Sie einen neuen offiziellen Wohnmobilstellplatz hinzu. Dies sind ausgewiesene Plätze, an denen Sie in Ihrem Wohnmobil übernachten können. Sie können wie ein richtiger Campingplatz oder nur wie ein Parkplatz aussehen. Möglicherweise sind sie gar nicht ausgeschildert, sondern nur in einem Gemeindebeschluss festgelegt. Ein normaler Parkplatz für Wohnmobile, auf dem Übernachten nicht zulässig ist, ist kein Wohnmobilstellplatz. ", - "title": "Wohnmobilstellplatz" - } - }, - "tagRenderings": { - "caravansites-capacity": { - "question": "Wie viele Wohnmobile können hier parken? (Überspringen, wenn es keine offensichtliche Anzahl von Stellplätzen oder erlaubten Fahrzeugen gibt)", - "render": "{capacity} Wohnmobile können diesen Platz gleichzeitig nutzen" - }, - "caravansites-charge": { - "question": "Wie hoch ist die Gebühr an diesem Ort?", - "render": "Die Gebühr beträgt {charge}" - }, - "caravansites-description": { - "question": "Möchten Sie eine allgemeine Beschreibung für diesen Ort hinzufügen? (Bitte wiederholen Sie keine Informationen, die Sie bereits zuvor angegeben haben. Bitte bleiben Sie objektiv - Meinungen gehen in die Bewertungen ein)", - "render": "Mehr Details über diesen Ort: {description}" - }, - "caravansites-fee": { - "mappings": { - "0": { - "then": "Sie müssen für die Nutzung bezahlen" - }, - "1": { - "then": "Nutzung kostenlos" - } - }, - "question": "Wird hier eine Gebühr erhoben?" - }, - "caravansites-internet": { - "mappings": { - "0": { - "then": "Internetzugang ist vorhanden" - }, - "1": { - "then": "Internetzugang ist vorhanden" - }, - "2": { - "then": "Kein Internetzugang vorhanden" - } - }, - "question": "Ist an diesem Ort ein Internetzugang vorhanden?" - }, - "caravansites-internet-fee": { - "mappings": { - "0": { - "then": "Der Internetzugang ist gebührenpflichtig" - }, - "1": { - "then": "Der Internetzugang ist kostenlos" - } - }, - "question": "Ist der Internetzugang gebührenpflichtig?" - }, - "caravansites-long-term": { - "mappings": { - "0": { - "then": "Ja, es gibt einige Plätze für Langzeitmieten, aber Sie können auch tageweise bleiben" - }, - "1": { - "then": "Nein, hier gibt es keine Dauergäste" - }, - "2": { - "then": "Es sind nur Plätze für Dauercamper vorhanden (wenn Sie diese Antwort auswählen, wird dieser Ort wird von der Karte verschwinden)" - } - }, - "question": "Gibt es a diesem Ort Plätze für Dauercamper?" - }, - "caravansites-name": { - "question": "Wie heißt dieser Ort?", - "render": "Dieser Ort heißt {name}" - }, - "caravansites-sanitary-dump": { - "mappings": { - "0": { - "then": "Dieser Ort hat eine sanitäre Entsorgungsstation" - }, - "1": { - "then": "Dieser Ort hat keine sanitäre Entsorgungsstation" - } - }, - "question": "Hat dieser Ort eine sanitäre Entsorgungsstation?" - }, - "caravansites-toilets": { - "mappings": { - "0": { - "then": "Dieser Ort verfügt über Toiletten" - }, - "1": { - "then": "Dieser Ort verfügt nicht über Toiletten" - } - }, - "question": "Verfügt dieser Ort über Toiletten?" - }, - "caravansites-website": { - "question": "Hat dieser Ort eine Webseite?", - "render": "Offizielle Webseite: {website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Unbenannter Wohnmobilstellplatz" - } - }, - "render": "Wohnmobilstellplatz {name}" - } - }, - "1": { - "description": "Sanitäre Entsorgungsstationen", - "name": "Sanitäre Entsorgungsstationen", - "presets": { - "0": { - "description": "Fügen Sie eine neue sanitäre Entsorgungsstation hinzu. Hier können Camper Abwasser oder chemischen Toilettenabfälle entsorgen. Oft gibt es auch Trinkwasser und Strom.", - "title": "Sanitäre Entsorgungsstation" - } - }, - "tagRenderings": { - "dumpstations-access": { - "mappings": { - "0": { - "then": "Sie benötigen einen Schlüssel/Code zur Benutzung" - }, - "1": { - "then": "Sie müssen Kunde des Campingplatzes sein, um diesen Ort nutzen zu können" - }, - "2": { - "then": "Jeder darf diese sanitäre Entsorgungsstation nutzen" - }, - "3": { - "then": "Jeder darf diese sanitäre Entsorgungsstation nutzen" - } - }, - "question": "Wer darf diese sanitäre Entsorgungsstation nutzen?" - }, - "dumpstations-charge": { - "question": "Wie hoch ist die Gebühr an diesem Ort?", - "render": "Die Gebühr beträgt {charge}" - }, - "dumpstations-chemical-waste": { - "mappings": { - "0": { - "then": "Hier können Sie chemische Toilettenabfälle entsorgen" - }, - "1": { - "then": "Hier können Sie keine chemischen Toilettenabfälle entsorgen" - } - }, - "question": "Können Sie hier chemische Toilettenabfälle entsorgen?" - }, - "dumpstations-fee": { - "mappings": { - "0": { - "then": "Sie müssen für die Nutzung bezahlen" - }, - "1": { - "then": "Nutzung kostenlos" - } - }, - "question": "Wird hier eine Gebühr erhoben?" - }, - "dumpstations-grey-water": { - "mappings": { - "0": { - "then": "Hier können Sie Brauch-/Grauwasser entsorgen" - }, - "1": { - "then": "Hier können Sie kein Brauch-/Grauwasser entsorgen" - } - }, - "question": "Können Sie hier Brauch-/Grauwasser entsorgen?" - }, - "dumpstations-network": { - "question": "Zu welchem Verbund/Netzwerk gehört dieser Ort? (Überspringen, wenn nicht zutreffend)", - "render": "Diese Station gehört zum Verbund/Netzwerk {network}" - }, - "dumpstations-waterpoint": { - "mappings": { - "0": { - "then": "Dieser Ort hat eine Wasserstelle" - }, - "1": { - "then": "Dieser Ort hat keine Wasserstelle" - } - }, - "question": "Hat dieser Ort eine Wasserstelle?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Entsorgungsstation" - } - }, - "render": "Entsorgungsstation {name}" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "Wer betreibt diesen Ort?", - "render": "Dieser Ort wird betrieben von {operator}" - }, - "1": { - "mappings": { - "0": { - "then": "Dieser Ort hat eine Stromversorgung" - }, - "1": { - "then": "Dieser Ort hat keine Stromversorgung" - } - }, - "question": "Hat dieser Ort eine Stromversorgung?" - } - } - }, - "shortDescription": "Finden Sie Plätze zum Übernachten mit Ihrem Wohnmobil", - "title": "Wohnmobilstellplätze" - }, - "charging_stations": { - "description": "Auf dieser freien Karte kann man Informationen über Ladestationen finden und hinzufügen", - "shortDescription": "Eine weltweite Karte mit Ladestationen", - "title": "Ladestationen" - }, - "climbing": { - "description": "Eine Karte mit Klettermöglichkeiten wie Kletterhallen, Kletterparks oder Felsen.", - "descriptionTail": "

    kletterspots.de wird betrieben von Christian Neumann. Bitte melden Sie sich, wenn Sie Feedback oder Fragen haben.

    Das Projekt nutzt Daten des OpenStreetMap Projekts und basiert auf der freien Software MapComplete.

    ", - "layers": { - "0": { - "description": "Ein Kletterverein oder eine Organisation", - "name": "Kletterverein", - "presets": { - "0": { - "description": "Ein Kletterverein", - "title": "Kletterverein" - }, - "1": { - "description": "Eine Organisation, welche sich mit dem Klettern beschäftigt", - "title": "Eine Kletter-Organisation" - } - }, - "tagRenderings": { - "climbing_club-name": { - "question": "Wie lautet der Name dieses Vereins oder Organisation?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Kletter-Organisation" - } - }, - "render": "Kletterverein" - } - }, - "1": { - "description": "Eine Kletterhalle", - "name": "Kletterhallen", - "tagRenderings": { - "name": { - "question": "Wie heißt diese Kletterhalle?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Kletterhalle {name}" - } - }, - "render": "Kletterhalle" - } - }, - "2": { - "name": "Kletterrouten", - "presets": { - "0": { - "title": "Kletterroute" - } - }, - "tagRenderings": { - "Bolts": { - "mappings": { - "0": { - "then": "Auf dieser Kletterroute sind keine Haken vorhanden" - }, - "1": { - "then": "Auf dieser Kletterroute sind keine Haken vorhanden" - } - }, - "question": "Wie viele Haken gibt es auf dieser Kletterroute bevor der Umlenker bzw. Standhaken erreicht ist?", - "render": "Diese Kletterroute hat {climbing:bolts} Haken" - }, - "Difficulty": { - "question": "Wie hoch ist der Schwierigkeitsgrad dieser Kletterroute nach dem französisch/belgischen System?", - "render": "Die Schwierigkeit ist {climbing:grade:french} entsprechend des französisch/belgischen Systems" - }, - "Length": { - "question": "Wie lang ist diese Kletterroute (in Metern)?", - "render": "Diese Route ist {canonical(climbing:length)} lang" - }, - "Name": { - "mappings": { - "0": { - "then": "Diese Kletterroute hat keinen Namen" - } - }, - "question": "Wie heißt diese Kletterroute?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Kleterroute {name}" - } - }, - "render": "Kleterroute" - } - }, - "3": { - "description": "Eine Klettergelegenheit", - "name": "Klettermöglichkeiten", - "presets": { - "0": { - "description": "Eine Klettergelegenheit", - "title": "Klettermöglichkeit" - } - }, - "tagRenderings": { - "Contained routes hist": { - "render": "

    Schwierigkeitsübersicht

    {histogram(_difficulty_hist)}" - }, - "Contained routes length hist": { - "render": "

    Längenübersicht

    {histogramm(_length_hist)}" - }, - "Rock type (crag/rock/cliff only)": { - "mappings": { - "0": { - "then": "Kalkstein" - } - }, - "question": "Welchen Gesteinstyp gibt es hier?", - "render": "Der Gesteinstyp ist {rock}" - }, - "Type": { - "mappings": { - "0": { - "then": "Ein Kletterfelsen - ein einzelner Felsen oder eine Klippe mit einer oder wenigen Kletterrouten, die ohne Seil sicher bestiegen werden können" - } - } - }, - "name": { - "mappings": { - "0": { - "then": "Diese Klettergelegenheit hat keinen Namen" - } - }, - "question": "Wie heißt diese Klettergelegenheit?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "1": { - "then": "Klettergebiet {name}" - }, - "2": { - "then": "Klettergebiet" - }, - "3": { - "then": "Klettermöglichkeit {name}" - } - }, - "render": "Klettermöglichkeit" - } - }, - "4": { - "description": "Eine Klettergelegenheit?", - "name": "Klettermöglichkeiten?", - "tagRenderings": { - "climbing-opportunity-name": { - "render": "{name}" - }, - "climbing-possible": { - "mappings": { - "0": { - "then": "Hier kann nicht geklettert werden" - }, - "1": { - "then": "Hier kann geklettert werden" - }, - "2": { - "then": "Hier kann nicht geklettert werden" - } - }, - "question": "Kann hier geklettert werden?" - } - }, - "title": { - "render": "Klettermöglichkeit?" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "Gibt es eine (inoffizielle) Website mit mehr Informationen (z.B. Topos)?" - }, - "2": { - "mappings": { - "0": { - "then": "Öffentlich zugänglich für jedermann" - }, - "1": { - "then": "Zugang nur mit Genehmigung" - }, - "2": { - "then": "Nur für Kunden" - }, - "3": { - "then": "Nur für Vereinsmitglieder" - } - }, - "question": "Wer hat hier Zugang?" - }, - "4": { - "question": "Wie lang sind die Routen (durchschnittlich) in Metern?", - "render": "Die Routen sind durchschnittlich {canonical(climbing:length)} lang" - }, - "5": { - "question": "Welche Schwierigkeit hat hier die leichteste Route (französisch/belgisches System)?", - "render": "Die leichteste Route hat hier die Schwierigkeit {climbing:grade:french:min} (französisch/belgisches System)" - }, - "6": { - "question": "Welche Schwierigkeit hat hier die schwerste Route (französisch/belgisches System)?", - "render": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:min} (französisch/belgisches System)" - }, - "7": { - "mappings": { - "0": { - "then": "Hier kann gebouldert werden" - }, - "1": { - "then": "Hier kann nicht gebouldert werden" - }, - "2": { - "then": "Bouldern ist hier nur an wenigen Routen möglich" - }, - "3": { - "then": "Hier gibt es {climbing:boulder} Boulder-Routen" - } - }, - "question": "Kann hier gebouldert werden?" - }, - "8": { - "mappings": { - "0": { - "then": "Toprope-Klettern ist hier möglich" - }, - "1": { - "then": "Toprope-Climbing ist hier nicht möglich" - }, - "2": { - "then": "Hier gibt es {climbing:toprope} Toprope-Routen" - } - }, - "question": "Ist Toprope-Klettern hier möglich?" - }, - "9": { - "mappings": { - "0": { - "then": "Sportklettern ist hier möglich" - }, - "1": { - "then": "Sportklettern ist hier nicht möglich" - }, - "2": { - "then": "Hier gibt es {climbing:sport} Sportkletter-Routen" - } - }, - "question": "Ist hier Sportklettern möglich (feste Ankerpunkte)?" - }, - "10": { - "mappings": { - "0": { - "then": "Traditionelles Klettern ist hier möglich" - }, - "1": { - "then": "Traditionelles Klettern ist hier nicht möglich" - }, - "2": { - "then": "Hier gibt es {climbing:traditional} Routen für traditionelles Klettern" - } - }, - "question": "Ist hier traditionelles Klettern möglich (eigene Sicherung z.B. mit Klemmkleilen)?" - }, - "11": { - "mappings": { - "0": { - "then": "Hier gibt es eine Speedkletter-Wand" - }, - "1": { - "then": "Hier gibt es keine Speedkletter-Wand" - }, - "2": { - "then": "Hier gibt es {climbing:speed} Speedkletter-Routen" - } - }, - "question": "Gibt es hier eine Speedkletter-Wand?" - } - }, - "units+": { - "0": { - "applicableUnits": { - "0": { - "human": " Meter" - }, - "1": { - "human": " Fuß" - } - } - } - } - }, - "title": "Offene Kletterkarte" - }, - "cycle_highways": { - "description": "Diese Karte zeigt Radschnellwege", - "layers": { - "0": { - "name": "Radschnellwege", - "title": { - "render": "Radschnellweg" - } - } - }, - "title": "Radschnellwege" - }, - "cycle_infra": { - "description": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur. Erstellt während #osoc21.", - "shortDescription": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur.", - "title": "Fahrradinfrastruktur" - }, - "cyclestreets": { - "description": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr Radfahrer nicht überholen darf. Sie sind durch ein spezielles Verkehrsschild gekennzeichnet. Fahrradstraßen gibt es in den Niederlanden und Belgien, aber auch in Deutschland und Frankreich. ", - "layers": { - "0": { - "description": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr einen Radfahrer nicht überholen darf", - "name": "Fahrradstraßen" - }, - "1": { - "description": "Diese Straße wird bald eine Fahrradstraße sein", - "name": "Zukünftige Fahrradstraße", - "title": { - "mappings": { - "0": { - "then": "{name} wird bald eine Fahrradstraße werden" - } - }, - "render": "Zukünftige Fahrradstraße" - } - }, - "2": { - "description": "Ebene zur Kennzeichnung einer Straße als Fahrradstraße", - "name": "Alle Straßen", - "title": { - "render": "Straße" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "mappings": { - "0": { - "then": "Diese Straße ist eine Fahrradstraße (mit einer Geschwindigkeitsbegrenzung von 30 km/h)" - }, - "1": { - "then": "Diese Straße ist eine Fahrradstraße" - }, - "2": { - "then": "Diese Straße wird bald eine Fahrradstraße sein" - }, - "3": { - "then": "Diese Straße ist keine Fahrradstraße" - } - }, - "question": "Ist diese Straße eine Fahrradstraße?" - }, - "1": { - "question": "Wann wird diese Straße eine Fahrradstraße?", - "render": "Diese Straße wird am {cyclestreet:start_date} zu einer Fahrradstraße" - } - } - }, - "shortDescription": "Eine Karte von Fahrradstraßen", - "title": "Fahrradstraßen" - }, - "cyclofix": { - "description": "Mit dieser Karte wird Radfahrern eine einfache Lösung bereitgestellt, um die passende Fahrradinfrastruktur zu finden.

    Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können auch interessante Orte zur Karte hinzuzufügen oder bearbeiten und weitere Daten durch Beantwortung von Fragen bereitstellen.

    Ihre Änderungen, werden automatisch in OpenStreetMap gespeichert und können von anderen frei verwendet werden.

    Weitere Informationen über Cyclofix finden Sie unter cyclofix.osm.be.", - "title": "Cyclofix — eine freie Karte für Radfahrer" - }, - "drinking_water": { - "description": "Eine Karte zum Anzeigen und Bearbeiten öffentlicher Trinkwasserstellen", - "title": "Trinkwasserstelle" - }, - "etymology": { - "description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.

    Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.", - "layers": { - "1": { - "override": { - "name": "Straßen ohne Informationen zur Namensherkunft" - } - }, - "2": { - "override": { - "name": "Parks und Waldflächen ohne Informationen zur Namensherkunft" - } - } - }, - "shortDescription": "Was ist der Ursprung eines Ortsnamens?", - "title": "Open Etymology Map" - }, - "facadegardens": { - "layers": { - "0": { - "description": "Fassadengärten", - "name": "Fassadengärten", - "presets": { - "0": { - "description": "Einen Fassadengarten hinzufügen", - "title": "Fassadengarten" - } - }, - "tagRenderings": { - "facadegardens-description": { - "question": "Zusätzliche Informationen über den Garten (falls erforderlich und oben noch nicht beschrieben)", - "render": "Weitere Details: {description}" - }, - "facadegardens-direction": { - "question": "Wie ist der Garten ausgerichtet?", - "render": "Ausrichtung: {direction} (wobei 0=N und 90=O)" - }, - "facadegardens-edible": { - "mappings": { - "0": { - "then": "Es gibt essbare Pflanzen" - }, - "1": { - "then": "Es gibt keine essbaren Pflanzen" - } - }, - "question": "Gibt es essbare Pflanzen?" - }, - "facadegardens-plants": { - "mappings": { - "0": { - "then": "Es gibt Weinreben" - }, - "1": { - "then": "Es gibt blühende Pflanzen" - }, - "2": { - "then": "Es gibt Sträucher" - }, - "3": { - "then": "Es gibt Bodendecker" - } - }, - "question": "Welche Pflanzen wachsen hier?" - }, - "facadegardens-rainbarrel": { - "mappings": { - "0": { - "then": "Es gibt eine Regentonne" - }, - "1": { - "then": "Es gibt keine Regentonne" - } - }, - "question": "Gibt es ein Wasserfass für den Garten?" - }, - "facadegardens-start_date": { - "question": "Wann wurde der Garten angelegt? (Jahr ist ausreichend)", - "render": "Errichtungsdatum des Gartens: {start_date}" - }, - "facadegardens-sunshine": { - "mappings": { - "0": { - "then": "Der Garten liegt in voller Sonne" - }, - "1": { - "then": "Der Garten liegt im Halbschatten" - }, - "2": { - "then": "Der Garten liegt im Schatten" - } - }, - "question": "Ist der Garten schattig oder sonnig?" - } - }, - "title": { - "render": "Fassadengarten" - } - } - }, - "shortDescription": "Diese Karte zeigt Fassadengärten mit Bildern und Details zu Ausrichtung, Sonneneinstrahlung und Pflanzen.", - "title": "Fassadengärten", - "description": "Fassadengärten, grüne Fassaden und Bäume in der Stadt bringen nicht nur Ruhe und Frieden, sondern auch eine schönere Stadt, eine größere Artenvielfalt, einen Kühleffekt und eine bessere Luftqualität.
    Klimaan VZW und Mechelen Klimaatneutraal wollen bestehende und neue Fassadengärten als Beispiel für Menschen, die ihren eigenen Garten anlegen wollen, oder für naturverbundene Stadtspaziergänger kartieren.
    Mehr Informationen über das Projekt unter klimaan.be." - }, - "food": { - "title": "Restaurants und Schnellimbisse" - }, - "fritures": { - "layers": { - "0": { - "override": { - "name": "Pommesbude" - } + "then": "Unbenannter Wohnmobilstellplatz" } + }, + "render": "Wohnmobilstellplatz {name}" } - }, - "ghostbikes": { - "description": "Ein Geisterrad ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde.

    Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.", - "title": "Geisterräder" - }, - "hackerspaces": { - "description": "Auf dieser Karte können Sie Hackerspaces sehen, einen neuen Hackerspace hinzufügen oder Daten direkt aktualisieren", - "layers": { - "0": { - "description": "Hackerspace", - "icon": { - "mappings": { - "0": { - "then": "./assets/themes/hackerspaces/led.png" - } - } - }, - "name": "Hackerspace", - "presets": { - "0": { - "description": "Ein Hackerspace ist ein Ort, an dem sich Menschen treffen, die sich für Software interessieren", - "title": "Hackerspace" - }, - "1": { - "description": "Ein Makerspace ist ein Ort, an dem Heimwerker-Enthusiasten zusammenkommen, um mit Elektronik zu experimentieren, wie Arduino, LED-Strips, ...", - "title": "Makerspace" - } - }, - "tagRenderings": { - "hackerspaces-name": { - "question": "Wie lautet der Name dieses Hackerspace?", - "render": "Dieser Hackerspace heißt {name}" - }, - "hackerspaces-opening_hours": { - "mappings": { - "0": { - "then": "durchgehend geöffnet" - } - }, - "question": "Wann hat dieser Hackerspace geöffnet?", - "render": "{opening_hours_table()}" - }, - "hackerspaces-start_date": { - "question": "Wann wurde dieser Hackerspace gegründet?", - "render": "Dieser Hackerspace wurde gegründet am {start_date}" - }, - "hs-club-mate": { - "mappings": { - "0": { - "then": "In diesem Hackerspace gibt es Club Mate" - }, - "1": { - "then": "In diesem Hackerspace gibt es kein Club Mate" - } - }, - "question": "Gibt es in diesem Hackerspace Club Mate?" - }, - "is_makerspace": { - "mappings": { - "0": { - "then": "Dies ist ein Makerspace" - }, - "1": { - "then": "Dies ist ein traditioneller (softwareorientierter) Hackerspace" - } - }, - "question": "Ist dies ein Hackerspace oder ein Makerspace?" - } - }, - "title": { - "mappings": { - "0": { - "then": " {name}" - } - }, - "render": "Hackerspace" - } - } + }, + "1": { + "description": "Sanitäre Entsorgungsstationen", + "name": "Sanitäre Entsorgungsstationen", + "presets": { + "0": { + "description": "Fügen Sie eine neue sanitäre Entsorgungsstation hinzu. Hier können Camper Abwasser oder chemischen Toilettenabfälle entsorgen. Oft gibt es auch Trinkwasser und Strom.", + "title": "Sanitäre Entsorgungsstation" + } }, - "shortDescription": "Eine Karte von Hackerspaces", - "title": "Hackerspaces" - }, - "hailhydrant": { - "description": "Auf dieser Karte können Sie Hydranten, Feuerwachen, Krankenwagen und Feuerlöscher in Ihren bevorzugten Stadtvierteln finden und aktualisieren.\n\nSie können Ihren genauen Standort verfolgen (nur mobil) und in der unteren linken Ecke die für Sie relevanten Ebenen auswählen. Sie können mit diesem Tool auch Pins (Points of Interest) zur Karte hinzufügen oder bearbeiten und durch die Beantwortung verfügbarer Fragen zusätzliche Angaben machen.\n\nAlle von Ihnen vorgenommenen Änderungen werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei weiterverwendet werden.", - "layers": { + "tagRenderings": { + "dumpstations-access": { + "mappings": { + "0": { + "then": "Sie benötigen einen Schlüssel/Code zur Benutzung" + }, + "1": { + "then": "Sie müssen Kunde des Campingplatzes sein, um diesen Ort nutzen zu können" + }, + "2": { + "then": "Jeder darf diese sanitäre Entsorgungsstation nutzen" + }, + "3": { + "then": "Jeder darf diese sanitäre Entsorgungsstation nutzen" + } + }, + "question": "Wer darf diese sanitäre Entsorgungsstation nutzen?" + }, + "dumpstations-charge": { + "question": "Wie hoch ist die Gebühr an diesem Ort?", + "render": "Die Gebühr beträgt {charge}" + }, + "dumpstations-chemical-waste": { + "mappings": { + "0": { + "then": "Hier können Sie chemische Toilettenabfälle entsorgen" + }, + "1": { + "then": "Hier können Sie keine chemischen Toilettenabfälle entsorgen" + } + }, + "question": "Können Sie hier chemische Toilettenabfälle entsorgen?" + }, + "dumpstations-fee": { + "mappings": { + "0": { + "then": "Sie müssen für die Nutzung bezahlen" + }, + "1": { + "then": "Nutzung kostenlos" + } + }, + "question": "Wird hier eine Gebühr erhoben?" + }, + "dumpstations-grey-water": { + "mappings": { + "0": { + "then": "Hier können Sie Brauch-/Grauwasser entsorgen" + }, + "1": { + "then": "Hier können Sie kein Brauch-/Grauwasser entsorgen" + } + }, + "question": "Können Sie hier Brauch-/Grauwasser entsorgen?" + }, + "dumpstations-network": { + "question": "Zu welchem Verbund/Netzwerk gehört dieser Ort? (Überspringen, wenn nicht zutreffend)", + "render": "Diese Station gehört zum Verbund/Netzwerk {network}" + }, + "dumpstations-waterpoint": { + "mappings": { + "0": { + "then": "Dieser Ort hat eine Wasserstelle" + }, + "1": { + "then": "Dieser Ort hat keine Wasserstelle" + } + }, + "question": "Hat dieser Ort eine Wasserstelle?" + } + }, + "title": { + "mappings": { "0": { - "description": "Kartenebene zur Anzeige von Hydranten.", - "name": "Karte der Hydranten", - "presets": { - "0": { - "description": "Ein Hydrant ist ein Anschlusspunkt, an dem die Feuerwehr Wasser zapfen kann. Er kann sich unterirdisch befinden.", - "title": "Löschwasser-Hydrant" - } - }, - "tagRenderings": { - "hydrant-color": { - "mappings": { - "0": { - "then": "Die Farbe des Hydranten ist unbekannt." - }, - "1": { - "then": "Die Farbe des Hydranten ist gelb." - }, - "2": { - "then": "Die Farbe des Hydranten ist rot." - } - }, - "question": "Welche Farbe hat der Hydrant?", - "render": "Der Hydrant hat die Farbe {colour}" - }, - "hydrant-state": { - "mappings": { - "0": { - "then": "Der Hydrant ist (ganz oder teilweise) in Betrieb." - }, - "1": { - "then": "Der Hydrant ist nicht verfügbar." - }, - "2": { - "then": "Der Hydrant wurde entfernt." - } - }, - "question": "Aktualisieren Sie den Lebenszyklusstatus des Hydranten.", - "render": "Lebenszyklus-Status" - }, - "hydrant-type": { - "mappings": { - "0": { - "then": "Der Typ des Hydranten ist unbekannt." - }, - "1": { - "then": " Säulenart." - }, - "2": { - "then": " Rohrtyp." - }, - "3": { - "then": " Wandtyp." - }, - "4": { - "then": " Untergrundtyp." - } - }, - "question": "Um welche Art von Hydrant handelt es sich?", - "render": " Hydranten-Typ: {fire_hydrant:type}" - } - }, - "title": { - "render": "Hydrant" - } + "then": "Entsorgungsstation" + } + }, + "render": "Entsorgungsstation {name}" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "Wer betreibt diesen Ort?", + "render": "Dieser Ort wird betrieben von {operator}" + }, + "1": { + "mappings": { + "0": { + "then": "Dieser Ort hat eine Stromversorgung" }, "1": { - "description": "Kartenebene zur Anzeige von Hydranten.", - "name": "Karte mit Feuerlöschern.", - "presets": { - "0": { - "description": "Ein Feuerlöscher ist ein kleines, tragbares Gerät, das dazu dient, ein Feuer zu löschen", - "title": "Feuerlöscher" - } - }, - "tagRenderings": { - "extinguisher-location": { - "mappings": { - "0": { - "then": "Im Innenraum vorhanden." - }, - "1": { - "then": "Im Außenraum vorhanden." - } - }, - "question": "Wo befindet er sich?", - "render": "Standort: {location}" - } - }, - "title": { - "render": "Feuerlöscher" - } + "then": "Dieser Ort hat keine Stromversorgung" + } + }, + "question": "Hat dieser Ort eine Stromversorgung?" + } + } + }, + "shortDescription": "Finden Sie Plätze zum Übernachten mit Ihrem Wohnmobil", + "title": "Wohnmobilstellplätze" + }, + "charging_stations": { + "description": "Auf dieser freien Karte kann man Informationen über Ladestationen finden und hinzufügen", + "shortDescription": "Eine weltweite Karte mit Ladestationen", + "title": "Ladestationen" + }, + "climbing": { + "description": "Eine Karte mit Klettermöglichkeiten wie Kletterhallen, Kletterparks oder Felsen.", + "descriptionTail": "

    kletterspots.de wird betrieben von Christian Neumann. Bitte melden Sie sich, wenn Sie Feedback oder Fragen haben.

    Das Projekt nutzt Daten des OpenStreetMap Projekts und basiert auf der freien Software MapComplete.

    ", + "layers": { + "0": { + "description": "Ein Kletterverein oder eine Organisation", + "name": "Kletterverein", + "presets": { + "0": { + "description": "Ein Kletterverein", + "title": "Kletterverein" + }, + "1": { + "description": "Eine Organisation, welche sich mit dem Klettern beschäftigt", + "title": "Eine Kletter-Organisation" + } + }, + "tagRenderings": { + "climbing_club-name": { + "question": "Wie lautet der Name dieses Vereins oder Organisation?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Kletter-Organisation" + } + }, + "render": "Kletterverein" + } + }, + "1": { + "description": "Eine Kletterhalle", + "name": "Kletterhallen", + "tagRenderings": { + "name": { + "question": "Wie heißt diese Kletterhalle?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Kletterhalle {name}" + } + }, + "render": "Kletterhalle" + } + }, + "2": { + "name": "Kletterrouten", + "presets": { + "0": { + "title": "Kletterroute" + } + }, + "tagRenderings": { + "Bolts": { + "mappings": { + "0": { + "then": "Auf dieser Kletterroute sind keine Haken vorhanden" + }, + "1": { + "then": "Auf dieser Kletterroute sind keine Haken vorhanden" + } + }, + "question": "Wie viele Haken gibt es auf dieser Kletterroute bevor der Umlenker bzw. Standhaken erreicht ist?", + "render": "Diese Kletterroute hat {climbing:bolts} Haken" + }, + "Difficulty": { + "question": "Wie hoch ist der Schwierigkeitsgrad dieser Kletterroute nach dem französisch/belgischen System?", + "render": "Die Schwierigkeit ist {climbing:grade:french} entsprechend des französisch/belgischen Systems" + }, + "Length": { + "question": "Wie lang ist diese Kletterroute (in Metern)?", + "render": "Diese Route ist {canonical(climbing:length)} lang" + }, + "Name": { + "mappings": { + "0": { + "then": "Diese Kletterroute hat keinen Namen" + } + }, + "question": "Wie heißt diese Kletterroute?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Kleterroute {name}" + } + }, + "render": "Kleterroute" + } + }, + "3": { + "description": "Eine Klettergelegenheit", + "name": "Klettermöglichkeiten", + "presets": { + "0": { + "description": "Eine Klettergelegenheit", + "title": "Klettermöglichkeit" + } + }, + "tagRenderings": { + "Contained routes hist": { + "render": "

    Schwierigkeitsübersicht

    {histogram(_difficulty_hist)}" + }, + "Contained routes length hist": { + "render": "

    Längenübersicht

    {histogramm(_length_hist)}" + }, + "Rock type (crag/rock/cliff only)": { + "mappings": { + "0": { + "then": "Kalkstein" + } + }, + "question": "Welchen Gesteinstyp gibt es hier?", + "render": "Der Gesteinstyp ist {rock}" + }, + "Type": { + "mappings": { + "0": { + "then": "Ein Kletterfelsen - ein einzelner Felsen oder eine Klippe mit einer oder wenigen Kletterrouten, die ohne Seil sicher bestiegen werden können" + } + } + }, + "name": { + "mappings": { + "0": { + "then": "Diese Klettergelegenheit hat keinen Namen" + } + }, + "question": "Wie heißt diese Klettergelegenheit?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "1": { + "then": "Klettergebiet {name}" }, "2": { - "description": "Kartenebene zur Darstellung von Feuerwachen.", - "name": "Karte der Feuerwachen", - "presets": { - "0": { - "description": "Eine Feuerwache ist ein Ort, an dem die Feuerwehrfahrzeuge und die Feuerwehrleute untergebracht sind, wenn sie nicht im Einsatz sind.", - "title": "Feuerwache" - } - }, - "tagRenderings": { - "station-name": { - "question": "Wie lautet der Name dieser Feuerwache?" - }, - "station-agency": { - "mappings": { - "0": { - "then": "Brandschutzbehörde" - } - } - } - }, - "title": { - "render": "Feuerwache" - } + "then": "Klettergebiet" }, "3": { - "presets": { - "0": { - "description": "Eine Rettungsstation der Karte hinzufügen", - "title": "Rettungswache" - } - }, - "description": "Eine Rettungswache ist ein Ort, an dem Rettungsfahrzeuge, medizinische Ausrüstung, persönliche Schutzausrüstung und anderes medizinisches Material untergebracht sind.", - "name": "Karte der Rettungswachen", - "title": { - "render": "Rettungswache" - } + "then": "Klettermöglichkeit {name}" } + }, + "render": "Klettermöglichkeit" + } + }, + "4": { + "description": "Eine Klettergelegenheit?", + "name": "Klettermöglichkeiten?", + "tagRenderings": { + "climbing-opportunity-name": { + "render": "{name}" + }, + "climbing-possible": { + "mappings": { + "0": { + "then": "Hier kann nicht geklettert werden" + }, + "1": { + "then": "Hier kann geklettert werden" + }, + "2": { + "then": "Hier kann nicht geklettert werden" + } + }, + "question": "Kann hier geklettert werden?" + } }, - "shortDescription": "Hydranten, Feuerlöscher, Feuerwachen und Rettungswachen." + "title": { + "render": "Klettermöglichkeit?" + } + } }, - "maps": { - "title": "Eine Karte der Karten", - "shortDescription": "Eine Karte mit allen (touristischen) Karten, die OpenStreetMap kennt", - "description": "Auf dieser Karte findest du alle Karten, die OpenStreetMap kennt - typischerweise eine große Karte auf einer Informationstafel, die das Gebiet, die Stadt oder die Region zeigt, z.B. eine touristische Karte auf der Rückseite einer Plakatwand, eine Karte eines Naturschutzgebietes, eine Karte der Radwegenetze in der Region, ...)

    Wenn eine Karte fehlt, können Sie diese leicht auf OpenStreetMap kartieren." - }, - "natuurpunt": { - "shortDescription": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt", - "title": "Naturschutzgebiete", - "description": "Auf dieser Karte können Sie alle Naturschutzgebiete von Natuurpunt finden " - }, - "observation_towers": { - "description": "Öffentlich zugänglicher Aussichtsturm", - "shortDescription": "Öffentlich zugänglicher Aussichtsturm", - "title": "Aussichtstürme" - }, - "openwindpowermap": { - "description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen.", - "layers": { - "0": { - "name": "Windrad", - "presets": { - "0": { - "title": "Windrad" - } - }, - "title": { - "render": "Windrad" - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " Megawatt" - }, - "1": { - "human": " Kilowatt" - }, - "2": { - "human": " Watt" - }, - "3": { - "human": " Gigawatt" - } - } - }, - "1": { - "applicableUnits": { - "0": { - "human": " Meter" - } - } - } - } - } + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "Gibt es eine (inoffizielle) Website mit mehr Informationen (z.B. Topos)?" }, - "title": "Freie Windenergie-Karte" - }, - "parkings": { - "description": "Diese Karte zeigt Parkplätze", - "shortDescription": "Diese Karte zeigt Parkplätze", - "title": "Parken" - }, - "personal": { - "description": "Erstellen Sie ein persönliches Thema, das auf allen verfügbaren Ebenen aller Themen basiert. Um Daten anzuzeigen, öffnen Sie die Ebenenauswahl", - "title": "Persönliches Thema" - }, - "playgrounds": { - "shortDescription": "Eine Karte mit Spielplätzen", - "title": "Spielplätze", - "description": "Auf dieser Karte finden Sie Spielplätze und können weitere Informationen hinzufügen" - }, - "postboxes": { - "layers": { + "2": { + "mappings": { "0": { - "description": "Die Ebene zeigt Briefkästen.", - "name": "Brieflästen", - "presets": { - "0": { - "title": "Briefkasten" - } - }, - "title": { - "render": "Briefkasten" - } + "then": "Öffentlich zugänglich für jedermann" }, "1": { - "description": "Eine Ebene mit Postämtern.", - "filter": { - "0": { - "options": { - "0": { - "question": "Aktuell geöffnet" - } - } - } - }, - "name": "Poststellen", - "presets": { - "0": { - "title": "Poststelle" - } - }, - "tagRenderings": { - "OH": { - "mappings": { - "0": { - "then": "durchgehend geöffnet (auch an Feiertagen)" - } - } - } - }, - "title": { - "render": "Poststelle" - } + "then": "Zugang nur mit Genehmigung" + }, + "2": { + "then": "Nur für Kunden" + }, + "3": { + "then": "Nur für Vereinsmitglieder" } + }, + "question": "Wer hat hier Zugang?" }, - "shortDescription": "Eine Karte die Briefkästen und Poststellen anzeigt", - "title": "Karte mit Briefkästen und Poststellen" - }, - "shops": { - "shortDescription": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen", - "title": "Freie Geschäftskarte", - "description": "Auf dieser Karte kann man grundlegende Informationen über Geschäfte markieren, Öffnungszeiten und Telefonnummern hinzufügen" - }, - "sport_pitches": { - "description": "Ein Sportplatz ist eine Fläche, auf der Sportarten gespielt werden", - "shortDescription": "Eine Karte mit Sportplätzen", - "title": "Sportplätze" - }, - "surveillance": { - "description": "Auf dieser offenen Karte finden Sie Überwachungskameras.", - "shortDescription": "Überwachungskameras und andere Mittel zur Überwachung", - "title": "Überwachung unter Überwachung" - }, - "toilets": { - "description": "Eine Karte mit öffentlich zugänglichen Toiletten", - "title": "Freie Toilettenkarte" - }, - "trees": { - "description": "Kartieren Sie alle Bäume!", - "shortDescription": "Kartieren Sie alle Bäume", - "title": "Bäume" - }, - "uk_addresses": { - "description": "Tragen Sie zu OpenStreetMap bei, indem Sie Adressinformationen ausfüllen", - "layers": { - "1": { - "description": "Adressen", - "name": "Bekannte Adressen in OSM", - "tagRenderings": { - "uk_addresses_explanation_osm": { - "render": "Diese Adresse ist in OpenStreetMap gespeichert" - }, - "uk_addresses_housenumber": { - "mappings": { - "0": { - "then": "Dieses Gebäude hat keine Hausnummer" - } - }, - "question": "Wie lautet die Nummer dieses Hauses?", - "render": "Die Hausnummer ist {addr:housenumber}" - }, - "uk_addresses_street": { - "question": "In welcher Straße befindet sich diese Adresse?", - "render": "Diese Adresse befindet sich in der Straße {addr:street}" - } - }, - "title": { - "render": "Bekannte Adresse" - } - } + "4": { + "question": "Wie lang sind die Routen (durchschnittlich) in Metern?", + "render": "Die Routen sind durchschnittlich {canonical(climbing:length)} lang" }, - "shortDescription": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen", - "tileLayerSources": { + "5": { + "question": "Welche Schwierigkeit hat hier die leichteste Route (französisch/belgisches System)?", + "render": "Die leichteste Route hat hier die Schwierigkeit {climbing:grade:french:min} (französisch/belgisches System)" + }, + "6": { + "question": "Welche Schwierigkeit hat hier die schwerste Route (französisch/belgisches System)?", + "render": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:max} (französisch/belgisches System)" + }, + "7": { + "mappings": { "0": { - "name": "Grenzverläufe gemäß osmuk.org" + "then": "Hier kann gebouldert werden" + }, + "1": { + "then": "Hier kann nicht gebouldert werden" + }, + "2": { + "then": "Bouldern ist hier nur an wenigen Routen möglich" + }, + "3": { + "then": "Hier gibt es {climbing:boulder} Boulder-Routen" } + }, + "question": "Kann hier gebouldert werden?" }, - "title": "Adressen in Großbritannien" + "8": { + "mappings": { + "0": { + "then": "Toprope-Klettern ist hier möglich" + }, + "1": { + "then": "Toprope-Climbing ist hier nicht möglich" + }, + "2": { + "then": "Hier gibt es {climbing:toprope} Toprope-Routen" + } + }, + "question": "Ist Toprope-Klettern hier möglich?" + }, + "9": { + "mappings": { + "0": { + "then": "Sportklettern ist hier möglich" + }, + "1": { + "then": "Sportklettern ist hier nicht möglich" + }, + "2": { + "then": "Hier gibt es {climbing:sport} Sportkletter-Routen" + } + }, + "question": "Ist hier Sportklettern möglich (feste Ankerpunkte)?" + }, + "10": { + "mappings": { + "0": { + "then": "Traditionelles Klettern ist hier möglich" + }, + "1": { + "then": "Traditionelles Klettern ist hier nicht möglich" + }, + "2": { + "then": "Hier gibt es {climbing:traditional} Routen für traditionelles Klettern" + } + }, + "question": "Ist hier traditionelles Klettern möglich (eigene Sicherung z.B. mit Klemmkleilen)?" + }, + "11": { + "mappings": { + "0": { + "then": "Hier gibt es eine Speedkletter-Wand" + }, + "1": { + "then": "Hier gibt es keine Speedkletter-Wand" + }, + "2": { + "then": "Hier gibt es {climbing:speed} Speedkletter-Routen" + } + }, + "question": "Gibt es hier eine Speedkletter-Wand?" + } + }, + "units+": { + "0": { + "applicableUnits": { + "0": { + "human": " Meter" + }, + "1": { + "human": " Fuß" + } + } + } + } }, - "waste_basket": { - "description": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen", - "shortDescription": "Eine Karte mit Abfalleimern", - "title": "Abfalleimer" + "title": "Offene Kletterkarte" + }, + "cycle_highways": { + "description": "Diese Karte zeigt Radschnellwege", + "layers": { + "0": { + "name": "Radschnellwege", + "title": { + "render": "Radschnellweg" + } + } + }, + "title": "Radschnellwege" + }, + "cycle_infra": { + "description": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur. Erstellt während #osoc21.", + "shortDescription": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur.", + "title": "Fahrradinfrastruktur" + }, + "cyclestreets": { + "description": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr Radfahrer nicht überholen darf. Sie sind durch ein spezielles Verkehrsschild gekennzeichnet. Fahrradstraßen gibt es in den Niederlanden und Belgien, aber auch in Deutschland und Frankreich. ", + "layers": { + "0": { + "description": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr einen Radfahrer nicht überholen darf", + "name": "Fahrradstraßen" + }, + "1": { + "description": "Diese Straße wird bald eine Fahrradstraße sein", + "name": "Zukünftige Fahrradstraße", + "title": { + "mappings": { + "0": { + "then": "{name} wird bald eine Fahrradstraße werden" + } + }, + "render": "Zukünftige Fahrradstraße" + } + }, + "2": { + "description": "Ebene zur Kennzeichnung einer Straße als Fahrradstraße", + "name": "Alle Straßen", + "title": { + "render": "Straße" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "mappings": { + "0": { + "then": "Diese Straße ist eine Fahrradstraße (mit einer Geschwindigkeitsbegrenzung von 30 km/h)" + }, + "1": { + "then": "Diese Straße ist eine Fahrradstraße" + }, + "2": { + "then": "Diese Straße wird bald eine Fahrradstraße sein" + }, + "3": { + "then": "Diese Straße ist keine Fahrradstraße" + } + }, + "question": "Ist diese Straße eine Fahrradstraße?" + }, + "1": { + "question": "Wann wird diese Straße eine Fahrradstraße?", + "render": "Diese Straße wird am {cyclestreet:start_date} zu einer Fahrradstraße" + } + } + }, + "shortDescription": "Eine Karte von Fahrradstraßen", + "title": "Fahrradstraßen" + }, + "cyclofix": { + "description": "Mit dieser Karte wird Radfahrern eine einfache Lösung bereitgestellt, um die passende Fahrradinfrastruktur zu finden.

    Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können auch interessante Orte zur Karte hinzuzufügen oder bearbeiten und weitere Daten durch Beantwortung von Fragen bereitstellen.

    Ihre Änderungen, werden automatisch in OpenStreetMap gespeichert und können von anderen frei verwendet werden.

    Weitere Informationen über Cyclofix finden Sie unter cyclofix.osm.be.", + "title": "Cyclofix — eine freie Karte für Radfahrer" + }, + "drinking_water": { + "description": "Eine Karte zum Anzeigen und Bearbeiten öffentlicher Trinkwasserstellen", + "title": "Trinkwasserstelle" + }, + "etymology": { + "description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.

    Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.", + "layers": { + "1": { + "override": { + "name": "Straßen ohne Informationen zur Namensherkunft" + } + }, + "2": { + "override": { + "name": "Parks und Waldflächen ohne Informationen zur Namensherkunft" + } + } + }, + "shortDescription": "Was ist der Ursprung eines Ortsnamens?", + "title": "Open Etymology Map" + }, + "facadegardens": { + "description": "Fassadengärten, grüne Fassaden und Bäume in der Stadt bringen nicht nur Ruhe und Frieden, sondern auch eine schönere Stadt, eine größere Artenvielfalt, einen Kühleffekt und eine bessere Luftqualität.
    Klimaan VZW und Mechelen Klimaatneutraal wollen bestehende und neue Fassadengärten als Beispiel für Menschen, die ihren eigenen Garten anlegen wollen, oder für naturverbundene Stadtspaziergänger kartieren.
    Mehr Informationen über das Projekt unter klimaan.be.", + "layers": { + "0": { + "description": "Fassadengärten", + "name": "Fassadengärten", + "presets": { + "0": { + "description": "Einen Fassadengarten hinzufügen", + "title": "Fassadengarten" + } + }, + "tagRenderings": { + "facadegardens-description": { + "question": "Zusätzliche Informationen über den Garten (falls erforderlich und oben noch nicht beschrieben)", + "render": "Weitere Details: {description}" + }, + "facadegardens-direction": { + "question": "Wie ist der Garten ausgerichtet?", + "render": "Ausrichtung: {direction} (wobei 0=N und 90=O)" + }, + "facadegardens-edible": { + "mappings": { + "0": { + "then": "Es gibt essbare Pflanzen" + }, + "1": { + "then": "Es gibt keine essbaren Pflanzen" + } + }, + "question": "Gibt es essbare Pflanzen?" + }, + "facadegardens-plants": { + "mappings": { + "0": { + "then": "Es gibt Weinreben" + }, + "1": { + "then": "Es gibt blühende Pflanzen" + }, + "2": { + "then": "Es gibt Sträucher" + }, + "3": { + "then": "Es gibt Bodendecker" + } + }, + "question": "Welche Pflanzen wachsen hier?" + }, + "facadegardens-rainbarrel": { + "mappings": { + "0": { + "then": "Es gibt eine Regentonne" + }, + "1": { + "then": "Es gibt keine Regentonne" + } + }, + "question": "Gibt es ein Wasserfass für den Garten?" + }, + "facadegardens-start_date": { + "question": "Wann wurde der Garten angelegt? (Jahr ist ausreichend)", + "render": "Errichtungsdatum des Gartens: {start_date}" + }, + "facadegardens-sunshine": { + "mappings": { + "0": { + "then": "Der Garten liegt in voller Sonne" + }, + "1": { + "then": "Der Garten liegt im Halbschatten" + }, + "2": { + "then": "Der Garten liegt im Schatten" + } + }, + "question": "Ist der Garten schattig oder sonnig?" + } + }, + "title": { + "render": "Fassadengarten" + } + } + }, + "shortDescription": "Diese Karte zeigt Fassadengärten mit Bildern und Details zu Ausrichtung, Sonneneinstrahlung und Pflanzen.", + "title": "Fassadengärten" + }, + "food": { + "title": "Restaurants und Schnellimbisse" + }, + "fritures": { + "layers": { + "0": { + "override": { + "name": "Pommesbude" + } + } } + }, + "ghostbikes": { + "description": "Ein Geisterrad ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde.

    Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.", + "title": "Geisterräder" + }, + "hackerspaces": { + "description": "Auf dieser Karte können Sie Hackerspaces sehen, einen neuen Hackerspace hinzufügen oder Daten direkt aktualisieren", + "layers": { + "0": { + "description": "Hackerspace", + "name": "Hackerspace", + "presets": { + "0": { + "description": "Ein Hackerspace ist ein Ort, an dem sich Menschen treffen, die sich für Software interessieren", + "title": "Hackerspace" + }, + "1": { + "description": "Ein Makerspace ist ein Ort, an dem Heimwerker-Enthusiasten zusammenkommen, um mit Elektronik zu experimentieren, wie Arduino, LED-Strips, ...", + "title": "Makerspace" + } + }, + "tagRenderings": { + "hackerspaces-name": { + "question": "Wie lautet der Name dieses Hackerspace?", + "render": "Dieser Hackerspace heißt {name}" + }, + "hackerspaces-opening_hours": { + "mappings": { + "0": { + "then": "durchgehend geöffnet" + } + }, + "question": "Wann hat dieser Hackerspace geöffnet?", + "render": "{opening_hours_table()}" + }, + "hackerspaces-start_date": { + "question": "Wann wurde dieser Hackerspace gegründet?", + "render": "Dieser Hackerspace wurde gegründet am {start_date}" + }, + "hs-club-mate": { + "mappings": { + "0": { + "then": "In diesem Hackerspace gibt es Club Mate" + }, + "1": { + "then": "In diesem Hackerspace gibt es kein Club Mate" + } + }, + "question": "Gibt es in diesem Hackerspace Club Mate?" + }, + "is_makerspace": { + "mappings": { + "0": { + "then": "Dies ist ein Makerspace" + }, + "1": { + "then": "Dies ist ein traditioneller (softwareorientierter) Hackerspace" + } + }, + "question": "Ist dies ein Hackerspace oder ein Makerspace?" + } + }, + "title": { + "mappings": { + "0": { + "then": " {name}" + } + }, + "render": "Hackerspace" + } + } + }, + "shortDescription": "Eine Karte von Hackerspaces", + "title": "Hackerspaces" + }, + "hailhydrant": { + "description": "Auf dieser Karte können Sie Hydranten, Feuerwachen, Krankenwagen und Feuerlöscher in Ihren bevorzugten Stadtvierteln finden und aktualisieren. \n\nSie können Ihren genauen Standort verfolgen (nur mobil) und in der unteren linken Ecke die für Sie relevanten Ebenen auswählen. Sie können mit diesem Tool auch Pins (Points of Interest) zur Karte hinzufügen oder bearbeiten und durch die Beantwortung verfügbarer Fragen zusätzliche Angaben machen. \n\nAlle von Ihnen vorgenommenen Änderungen werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei weiterverwendet werden.", + "layers": { + "0": { + "description": "Kartenebene zur Anzeige von Hydranten.", + "name": "Karte der Hydranten", + "presets": { + "0": { + "description": "Ein Hydrant ist ein Anschlusspunkt, an dem die Feuerwehr Wasser zapfen kann. Er kann sich unterirdisch befinden.", + "title": "Löschwasser-Hydrant" + } + }, + "tagRenderings": { + "hydrant-color": { + "mappings": { + "0": { + "then": "Die Farbe des Hydranten ist unbekannt." + }, + "1": { + "then": "Die Farbe des Hydranten ist gelb." + }, + "2": { + "then": "Die Farbe des Hydranten ist rot." + } + }, + "question": "Welche Farbe hat der Hydrant?", + "render": "Der Hydrant hat die Farbe {colour}" + }, + "hydrant-state": { + "mappings": { + "0": { + "then": "Der Hydrant ist (ganz oder teilweise) in Betrieb." + }, + "1": { + "then": "Der Hydrant ist nicht verfügbar." + }, + "2": { + "then": "Der Hydrant wurde entfernt." + } + }, + "question": "Aktualisieren Sie den Lebenszyklusstatus des Hydranten." + }, + "hydrant-type": { + "mappings": { + "0": { + "then": "Der Typ des Hydranten ist unbekannt." + }, + "1": { + "then": " Säulenart." + }, + "2": { + "then": " Rohrtyp." + }, + "3": { + "then": " Wandtyp." + }, + "4": { + "then": " Untergrundtyp." + } + }, + "question": "Um welche Art von Hydrant handelt es sich?", + "render": " Hydranten-Typ: {fire_hydrant:type}" + } + }, + "title": { + "render": "Hydrant" + } + }, + "1": { + "description": "Kartenebene zur Anzeige von Hydranten.", + "name": "Karte mit Feuerlöschern.", + "presets": { + "0": { + "description": "Ein Feuerlöscher ist ein kleines, tragbares Gerät, das dazu dient, ein Feuer zu löschen", + "title": "Feuerlöscher" + } + }, + "tagRenderings": { + "extinguisher-location": { + "mappings": { + "0": { + "then": "Im Innenraum vorhanden." + }, + "1": { + "then": "Im Außenraum vorhanden." + } + }, + "question": "Wo befindet er sich?", + "render": "Standort: {location}" + } + }, + "title": { + "render": "Feuerlöscher" + } + }, + "2": { + "description": "Kartenebene zur Darstellung von Feuerwachen.", + "name": "Karte der Feuerwachen", + "presets": { + "0": { + "description": "Eine Feuerwache ist ein Ort, an dem die Feuerwehrfahrzeuge und die Feuerwehrleute untergebracht sind, wenn sie nicht im Einsatz sind.", + "title": "Feuerwache" + } + }, + "tagRenderings": { + "station-agency": { + "mappings": { + "0": { + "then": "Brandschutzbehörde" + } + } + }, + "station-name": { + "question": "Wie lautet der Name dieser Feuerwache?" + } + }, + "title": { + "render": "Feuerwache" + } + }, + "3": { + "description": "Eine Rettungswache ist ein Ort, an dem Rettungsfahrzeuge, medizinische Ausrüstung, persönliche Schutzausrüstung und anderes medizinisches Material untergebracht sind.", + "name": "Karte der Rettungswachen", + "presets": { + "0": { + "description": "Eine Rettungsstation der Karte hinzufügen", + "title": "Rettungswache" + } + }, + "title": { + "render": "Rettungswache" + } + } + }, + "shortDescription": "Hydranten, Feuerlöscher, Feuerwachen und Rettungswachen." + }, + "maps": { + "description": "Auf dieser Karte findest du alle Karten, die OpenStreetMap kennt - typischerweise eine große Karte auf einer Informationstafel, die das Gebiet, die Stadt oder die Region zeigt, z.B. eine touristische Karte auf der Rückseite einer Plakatwand, eine Karte eines Naturschutzgebietes, eine Karte der Radwegenetze in der Region, ...)

    Wenn eine Karte fehlt, können Sie diese leicht auf OpenStreetMap kartieren.", + "shortDescription": "Dieses Thema zeigt alle (touristischen) Karten, die OpenStreetMap kennt", + "title": "Eine Karte der Karten" + }, + "natuurpunt": { + "description": "Auf dieser Karte können Sie alle Naturschutzgebiete von Natuurpunt finden ", + "shortDescription": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt", + "title": "Naturschutzgebiete" + }, + "observation_towers": { + "description": "Öffentlich zugänglicher Aussichtsturm", + "shortDescription": "Öffentlich zugänglicher Aussichtsturm", + "title": "Aussichtstürme" + }, + "openwindpowermap": { + "description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen.", + "layers": { + "0": { + "name": "Windrad", + "presets": { + "0": { + "title": "Windrad" + } + }, + "title": { + "render": "Windrad" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " Megawatt" + }, + "1": { + "human": " Kilowatt" + }, + "2": { + "human": " Watt" + }, + "3": { + "human": " Gigawatt" + } + } + }, + "1": { + "applicableUnits": { + "0": { + "human": " Meter" + } + } + } + } + } + }, + "title": "OpenWindPowerMap" + }, + "parkings": { + "description": "Diese Karte zeigt Parkplätze", + "shortDescription": "Diese Karte zeigt Parkplätze", + "title": "Parken" + }, + "personal": { + "description": "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen", + "title": "Persönliches Thema" + }, + "playgrounds": { + "description": "Auf dieser Karte finden Sie Spielplätze und können weitere Informationen hinzufügen", + "shortDescription": "Eine Karte mit Spielplätzen", + "title": "Spielpläzte" + }, + "postboxes": { + "layers": { + "0": { + "description": "Die Ebene zeigt Briefkästen.", + "name": "Brieflästen", + "presets": { + "0": { + "title": "Briefkasten" + } + }, + "title": { + "render": "Briefkasten" + } + }, + "1": { + "description": "Eine Ebene mit Postämtern.", + "filter": { + "0": { + "options": { + "0": { + "question": "Aktuell geöffnet" + } + } + } + }, + "name": "Poststellen", + "presets": { + "0": { + "title": "Poststelle" + } + }, + "tagRenderings": { + "OH": { + "mappings": { + "0": { + "then": "durchgehend geöffnet (auch an Feiertagen)" + } + } + } + }, + "title": { + "render": "Poststelle" + } + } + }, + "shortDescription": "Eine Karte die Briefkästen und Poststellen anzeigt", + "title": "Karte mit Briefkästen und Poststellen" + }, + "shops": { + "description": "Auf dieser Karte kann man grundlegende Informationen über Geschäfte markieren, Öffnungszeiten und Telefonnummern hinzufügen", + "shortDescription": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen", + "title": "Freie Geschäftskarte" + }, + "sport_pitches": { + "description": "Ein Sportplatz ist eine Fläche, auf der Sportarten gespielt werden", + "shortDescription": "Eine Karte mit Sportplätzen", + "title": "Sportplätze" + }, + "surveillance": { + "description": "Auf dieser offenen Karte finden Sie Überwachungskameras.", + "shortDescription": "Überwachungskameras und andere Mittel zur Überwachung", + "title": "Überwachung unter Überwachung" + }, + "toilets": { + "description": "Eine Karte mit öffentlich zugänglichen Toiletten", + "title": "Freie Toilettenkarte" + }, + "trees": { + "description": "Kartieren Sie alle Bäume!", + "shortDescription": "Kartieren Sie alle Bäume", + "title": "Bäume" + }, + "uk_addresses": { + "description": "Tragen Sie zu OpenStreetMap bei, indem Sie Adressinformationen ausfüllen", + "layers": { + "2": { + "description": "Adressen", + "name": "Bekannte Adressen in OSM", + "tagRenderings": { + "uk_addresses_explanation_osm": { + "render": "Diese Adresse ist in OpenStreetMap gespeichert" + }, + "uk_addresses_housenumber": { + "mappings": { + "0": { + "then": "Dieses Gebäude hat keine Hausnummer" + } + }, + "question": "Wie lautet die Nummer dieses Hauses?", + "render": "Die Hausnummer ist {addr:housenumber}" + }, + "uk_addresses_street": { + "question": "In welcher Straße befindet sich diese Adresse?", + "render": "Diese Adresse befindet sich in der Straße {addr:street}" + } + }, + "title": { + "render": "Bekannte Adresse" + } + } + }, + "shortDescription": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen", + "tileLayerSources": { + "0": { + "name": "Grenzverläufe gemäß osmuk.org" + } + }, + "title": "Adressen in Großbritannien" + }, + "waste_basket": { + "description": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen", + "shortDescription": "Eine Karte mit Abfalleimern", + "title": "Abfalleimer" + } } \ No newline at end of file diff --git a/langs/themes/en.json b/langs/themes/en.json index 3e5c386cf9..01c86e54e3 100644 --- a/langs/themes/en.json +++ b/langs/themes/en.json @@ -1,1290 +1,1395 @@ { - "aed": { - "description": "On this map, one can find and mark nearby defibrillators", - "title": "Open AED Map" - }, - "artwork": { - "description": "Welcome to Open Artwork Map, a map of statues, busts, grafittis and other artwork all over the world", - "title": "Open Artwork Map" - }, - "benches": { - "description": "This map shows all benches that are recorded in OpenStreetMap: Individual benches, and benches belonging to public transport stops or shelters. With an OpenStreetMap account, you can map new benches or edit details of existing benches.", - "shortDescription": "A map of benches", - "title": "Benches" - }, - "bicyclelib": { - "description": "A bicycle library is a place where bicycles can be lent, often for a small yearly fee. A notable use case are bicycle libraries for kids, which allows them to change for a bigger bike when they've outgrown their current bike", - "title": "Bicycle libraries" - }, - "binoculars": { - "description": "A map with binoculars fixed in place with a pole. It can typically be found on touristic locations, viewpoints, on top of panoramic towers or occasionally on a nature reserve.", - "shortDescription": "A map with fixed binoculars", - "title": "Binoculars" - }, - "bookcases": { - "description": "A public bookcase is a small streetside cabinet, box, old phone boot or some other objects where books are stored. Everyone can place or take a book. This map aims to collect all these bookcases. You can discover new bookcases nearby and, with a free OpenStreetMap account, quickly add your favourite bookcases.", - "title": "Open Bookcase Map" - }, - "cafes_and_pubs": { - "title": "Cafés and pubs" - }, - "campersite": { - "description": "This site collects all official camper stopover places and places where you can dump grey and black water. You can add details about the services provided and the cost. Add pictures and reviews. This is a website and a webapp. The data is stored in OpenStreetMap, so it will be free forever and can be re-used by any app.", - "layers": { + "aed": { + "description": "On this map, one can find and mark nearby defibrillators", + "title": "Open AED Map" + }, + "artwork": { + "description": "Welcome to Open Artwork Map, a map of statues, busts, grafittis and other artwork all over the world", + "title": "Open Artwork Map" + }, + "benches": { + "description": "This map shows all benches that are recorded in OpenStreetMap: Individual benches, and benches belonging to public transport stops or shelters. With an OpenStreetMap account, you can map new benches or edit details of existing benches.", + "shortDescription": "A map of benches", + "title": "Benches" + }, + "bicyclelib": { + "description": "A bicycle library is a place where bicycles can be lent, often for a small yearly fee. A notable use case are bicycle libraries for kids, which allows them to change for a bigger bike when they've outgrown their current bike", + "title": "Bicycle libraries" + }, + "binoculars": { + "description": "A map with binoculars fixed in place with a pole. It can typically be found on touristic locations, viewpoints, on top of panoramic towers or occasionally on a nature reserve.", + "shortDescription": "A map with fixed binoculars", + "title": "Binoculars" + }, + "bookcases": { + "description": "A public bookcase is a small streetside cabinet, box, old phone boot or some other objects where books are stored. Everyone can place or take a book. This map aims to collect all these bookcases. You can discover new bookcases nearby and, with a free OpenStreetMap account, quickly add your favourite bookcases.", + "title": "Open Bookcase Map" + }, + "cafes_and_pubs": { + "title": "Cafés and pubs" + }, + "campersite": { + "description": "This site collects all official camper stopover places and places where you can dump grey and black water. You can add details about the services provided and the cost. Add pictures and reviews. This is a website and a webapp. The data is stored in OpenStreetMap, so it will be free forever and can be re-used by any app.", + "layers": { + "0": { + "description": "camper sites", + "name": "Camper sites", + "presets": { + "0": { + "description": "Add a new official camper site. These are designated places to stay overnight with your camper. They might look like a real camping or just look like a parking. They might not be signposted at all, but just be defined in a municipal decision. A regular parking intended for campers where it is not expected to spend the night, is -not- a camper site ", + "title": "camper site" + } + }, + "tagRenderings": { + "caravansites-capacity": { + "question": "How many campers can stay here? (skip if there is no obvious number of spaces or allowed vehicles)", + "render": "{capacity} campers can use this place at the same time" + }, + "caravansites-charge": { + "question": "How much does this place charge?", + "render": "This place charges {charge}" + }, + "caravansites-description": { + "question": "Would you like to add a general description of this place? (Do not repeat information previously asked or shown above. Please keep it objective - opinions go into the reviews)", + "render": "More details about this place: {description}" + }, + "caravansites-fee": { + "mappings": { + "0": { + "then": "You need to pay for use" + }, + "1": { + "then": "Can be used for free" + } + }, + "question": "Does this place charge a fee?" + }, + "caravansites-internet": { + "mappings": { + "0": { + "then": "There is internet access" + }, + "1": { + "then": "There is internet access" + }, + "2": { + "then": "There is no internet access" + } + }, + "question": "Does this place provide internet access?" + }, + "caravansites-internet-fee": { + "mappings": { + "0": { + "then": "You need to pay extra for internet access" + }, + "1": { + "then": "You do not need to pay extra for internet access" + } + }, + "question": "Do you have to pay for the internet access?" + }, + "caravansites-long-term": { + "mappings": { + "0": { + "then": "Yes, there are some spots for long term rental, but you can also stay on a daily basis" + }, + "1": { + "then": "No, there are no permanent guests here" + }, + "2": { + "then": "It is only possible to stay here if you have a long term contract(this place will disappear from this map if you choose this)" + } + }, + "question": "Does this place offer spots for long term rental?" + }, + "caravansites-name": { + "question": "What is this place called?", + "render": "This place is called {name}" + }, + "caravansites-sanitary-dump": { + "mappings": { + "0": { + "then": "This place has a sanitary dump station" + }, + "1": { + "then": "This place does not have a sanitary dump station" + } + }, + "question": "Does this place have a sanitary dump station?" + }, + "caravansites-toilets": { + "mappings": { + "0": { + "then": "This place has toilets" + }, + "1": { + "then": "This place does not have toilets" + } + }, + "question": "Does this place have toilets?" + }, + "caravansites-website": { + "question": "Does this place have a website?", + "render": "Official website: {website}" + } + }, + "title": { + "mappings": { "0": { - "description": "camper sites", - "name": "Camper sites", - "presets": { - "0": { - "description": "Add a new official camper site. These are designated places to stay overnight with your camper. They might look like a real camping or just look like a parking. They might not be signposted at all, but just be defined in a municipal decision. A regular parking intended for campers where it is not expected to spend the night, is -not- a camper site ", - "title": "camper site" - } - }, - "tagRenderings": { - "caravansites-capacity": { - "question": "How many campers can stay here? (skip if there is no obvious number of spaces or allowed vehicles)", - "render": "{capacity} campers can use this place at the same time" - }, - "caravansites-charge": { - "question": "How much does this place charge?", - "render": "This place charges {charge}" - }, - "caravansites-description": { - "question": "Would you like to add a general description of this place? (Do not repeat information previously asked or shown above. Please keep it objective - opinions go into the reviews)", - "render": "More details about this place: {description}" - }, - "caravansites-fee": { - "mappings": { - "0": { - "then": "You need to pay for use" - }, - "1": { - "then": "Can be used for free" - } - }, - "question": "Does this place charge a fee?" - }, - "caravansites-internet": { - "mappings": { - "0": { - "then": "There is internet access" - }, - "1": { - "then": "There is internet access" - }, - "2": { - "then": "There is no internet access" - } - }, - "question": "Does this place provide internet access?" - }, - "caravansites-internet-fee": { - "mappings": { - "0": { - "then": "You need to pay extra for internet access" - }, - "1": { - "then": "You do not need to pay extra for internet access" - } - }, - "question": "Do you have to pay for the internet access?" - }, - "caravansites-long-term": { - "mappings": { - "0": { - "then": "Yes, there are some spots for long term rental, but you can also stay on a daily basis" - }, - "1": { - "then": "No, there are no permanent guests here" - }, - "2": { - "then": "It is only possible to stay here if you have a long term contract(this place will disappear from this map if you choose this)" - } - }, - "question": "Does this place offer spots for long term rental?" - }, - "caravansites-name": { - "question": "What is this place called?", - "render": "This place is called {name}" - }, - "caravansites-sanitary-dump": { - "mappings": { - "0": { - "then": "This place has a sanitary dump station" - }, - "1": { - "then": "This place does not have a sanitary dump station" - } - }, - "question": "Does this place have a sanitary dump station?" - }, - "caravansites-toilets": { - "mappings": { - "0": { - "then": "This place has toilets" - }, - "1": { - "then": "This place does not have toilets" - } - }, - "question": "Does this place have toilets?" - }, - "caravansites-website": { - "question": "Does this place have a website?", - "render": "Official website: {website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Unnamed camper site" - } - }, - "render": "Camper site {name}" - } - }, - "1": { - "description": "Sanitary dump stations", - "name": "Sanitary dump stations", - "presets": { - "0": { - "description": "Add a new sanitary dump station. This is a place where camper drivers can dump waste water or chemical toilet waste. Often there's also drinking water and electricity.", - "title": "sanitary dump station" - } - }, - "tagRenderings": { - "dumpstations-access": { - "mappings": { - "0": { - "then": "You need a network key/code to use this" - }, - "1": { - "then": "You need to be a customer of camping/campersite to use this place" - }, - "2": { - "then": "Anyone can use this dump station" - }, - "3": { - "then": "Anyone can use this dump station" - } - }, - "question": "Who can use this dump station?" - }, - "dumpstations-charge": { - "question": "How much does this place charge?", - "render": "This place charges {charge}" - }, - "dumpstations-chemical-waste": { - "mappings": { - "0": { - "then": "You can dispose of chemical toilet waste here" - }, - "1": { - "then": "You cannot dispose of chemical toilet waste here" - } - }, - "question": "Can you dispose of chemical toilet waste here?" - }, - "dumpstations-fee": { - "mappings": { - "0": { - "then": "You need to pay for use" - }, - "1": { - "then": "Can be used for free" - } - }, - "question": "Does this place charge a fee?" - }, - "dumpstations-grey-water": { - "mappings": { - "0": { - "then": "You can dispose of grey water here" - }, - "1": { - "then": "You cannot dispose of gray water here" - } - }, - "question": "Can you dispose of grey water here?" - }, - "dumpstations-network": { - "question": "What network is this place a part of? (skip if none)", - "render": "This station is part of network {network}" - }, - "dumpstations-waterpoint": { - "mappings": { - "0": { - "then": "This place has a water point" - }, - "1": { - "then": "This place does not have a water point" - } - }, - "question": "Does this place have a water point?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Dump station" - } - }, - "render": "Dump station {name}" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "Who operates this place?", - "render": "This place is operated by {operator}" - }, - "1": { - "mappings": { - "0": { - "then": "This place has a power supply" - }, - "1": { - "then": "This place does not have power supply" - } - }, - "question": "Does this place have a power supply?" - } - } - }, - "shortDescription": "Find sites to spend the night with your camper", - "title": "Campersites" - }, - "charging_stations": { - "description": "On this open map, one can find and mark information about charging stations", - "shortDescription": "A worldwide map of charging stations", - "title": "Charging stations" - }, - "climbing": { - "description": "On this map you will find various climbing opportunities such as climbing gyms, bouldering halls and rocks in nature.", - "descriptionTail": "The climbing map was originally made by Christian Neumann. Please get in touch if you have feedback or questions.

    The project uses data of the OpenStreetMap project.

    ", - "layers": { - "0": { - "description": "A climbing club or organisations", - "name": "Climbing club", - "presets": { - "0": { - "description": "A climbing club", - "title": "Climbing club" - }, - "1": { - "description": "A NGO working around climbing", - "title": "Climbing NGO" - } - }, - "tagRenderings": { - "climbing_club-name": { - "question": "What is the name of this climbing club or NGO?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Climbing NGO" - } - }, - "render": "Climbing club" - } - }, - "1": { - "description": "A climbing gym", - "name": "Climbing gyms", - "tagRenderings": { - "name": { - "question": "What is the name of this climbing gym?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Climbing gym {name}" - } - }, - "render": "Climbing gym" - } - }, - "2": { - "name": "Climbing routes", - "presets": { - "0": { - "title": "Climbing route" - } - }, - "tagRenderings": { - "Bolts": { - "mappings": { - "0": { - "then": "This route is not bolted" - }, - "1": { - "then": "This route is not bolted" - } - }, - "question": "How much bolts does this route have before reaching the moulinette?", - "render": "This route has {climbing:bolts} bolts" - }, - "Difficulty": { - "question": "What is the difficulty of this climbing route according to the french/belgian system?", - "render": "The difficulty is {climbing:grade:french} according to the french/belgian system" - }, - "Length": { - "question": "How long is this climbing route (in meters)?", - "render": "This route is {canonical(climbing:length)} long" - }, - "Name": { - "mappings": { - "0": { - "then": "This climbing route doesn't have a name" - } - }, - "question": "What is the name of this climbing route?", - "render": "{name}" - }, - "Rock type": { - "render": "The rock type is {_embedding_features_with_rock:rock} as stated on the surrounding crag" - } - }, - "title": { - "mappings": { - "0": { - "then": "Climbing route {name}" - } - }, - "render": "Climbing route" - } - }, - "3": { - "description": "A climbing opportunity", - "name": "Climbing opportunities", - "presets": { - "0": { - "description": "A climbing opportunity", - "title": "Climbing opportunity" - } - }, - "tagRenderings": { - "Containe {_contained_climbing_routes_count} routes": { - "render": "

    Contains {_contained_climbing_routes_count} routes

      {_contained_climbing_routes}
    " - }, - "Contained routes hist": { - "render": "

    Difficulties overview

    {histogram(_difficulty_hist)}" - }, - "Contained routes length hist": { - "render": "

    Length overview

    {histogram(_length_hist)}" - }, - "Rock type (crag/rock/cliff only)": { - "mappings": { - "0": { - "then": "Limestone" - } - }, - "question": "What is the rock type here?", - "render": "The rock type is {rock}" - }, - "Type": { - "mappings": { - "0": { - "then": "A climbing boulder - a single rock or cliff with one or a few climbing routes which can be climbed safely without rope" - }, - "1": { - "then": "A climbing crag - a single rock or cliff with at least a few climbing routes" - } - } - }, - "name": { - "mappings": { - "0": { - "then": "This climbing opportunity doesn't have a name" - } - }, - "question": "What is the name of this climbing opportunity?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Climbing crag {name}" - }, - "1": { - "then": "Climbing area {name}" - }, - "2": { - "then": "Climbing site" - }, - "3": { - "then": "Climbing opportunity {name}" - } - }, - "render": "Climbing opportunity" - } - }, - "4": { - "description": "A climbing opportunity?", - "name": "Climbing opportunities?", - "tagRenderings": { - "climbing-opportunity-name": { - "render": "{name}" - }, - "climbing-possible": { - "mappings": { - "0": { - "then": "Climbing is not possible here" - }, - "1": { - "then": "Climbing is possible here" - }, - "2": { - "then": "Climbing is not possible here" - } - }, - "question": "Is climbing possible here?" - } - }, - "title": { - "render": "Climbing opportunity?" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "Is there a (unofficial) website with more informations (e.g. topos)?" - }, - "1": { - "mappings": { - "0": { - "then": "The containing feature states that this is publicly accessible
    {_embedding_feature:access:description}" - }, - "1": { - "then": "The containing feature states that a permit is needed to access
    {_embedding_feature:access:description}" - }, - "2": { - "then": "The containing feature states that this is only accessible to customers
    {_embedding_feature:access:description}" - }, - "3": { - "then": "The containing feature states that this is only accessible to club members
    {_embedding_feature:access:description}" - } - } - }, - "2": { - "mappings": { - "0": { - "then": "Publicly accessible to anyone" - }, - "1": { - "then": "You need a permit to access here" - }, - "2": { - "then": "Only custumers" - }, - "3": { - "then": "Only club members" - } - }, - "question": "Who can access here?" - }, - "4": { - "question": "What is the (average) length of the routes in meters?", - "render": "The routes are {canonical(climbing:length)} long on average" - }, - "5": { - "question": "What is the level of the easiest route here, accoring to the french classification system?", - "render": "The minimal difficulty is {climbing:grade:french:min} according to the french/belgian system" - }, - "6": { - "question": "What is the level of the most difficult route here, accoring to the french classification system?", - "render": "The maximal difficulty is {climbing:grade:french:max} according to the french/belgian system" - }, - "7": { - "mappings": { - "0": { - "then": "Bouldering is possible here" - }, - "1": { - "then": "Bouldering is not possible here" - }, - "2": { - "then": "Bouldering is possible, allthough there are only a few routes" - }, - "3": { - "then": "There are {climbing:boulder} boulder routes" - } - }, - "question": "Is bouldering possible here?" - }, - "8": { - "mappings": { - "0": { - "then": "Toprope climbing is possible here" - }, - "1": { - "then": "Toprope climbing is not possible here" - }, - "2": { - "then": "There are {climbing:toprope} toprope routes" - } - }, - "question": "Is toprope climbing possible here?" - }, - "9": { - "mappings": { - "0": { - "then": "Sport climbing is possible here" - }, - "1": { - "then": "Sport climbing is not possible here" - }, - "2": { - "then": "There are {climbing:sport} sport climbing routes" - } - }, - "question": "Is sport climbing possible here on fixed anchors?" - }, - "10": { - "mappings": { - "0": { - "then": "Traditional climbing is possible here" - }, - "1": { - "then": "Traditional climbing is not possible here" - }, - "2": { - "then": "There are {climbing:traditional} traditional climbing routes" - } - }, - "question": "Is traditional climbing possible here (using own gear e.g. chocks)?" - }, - "11": { - "mappings": { - "0": { - "then": "There is a speed climbing wall" - }, - "1": { - "then": "There is no speed climbing wall" - }, - "2": { - "then": "There are {climbing:speed} speed climbing walls" - } - }, - "question": "Is there a speed climbing wall?" - } - }, - "units+": { - "0": { - "applicableUnits": { - "0": { - "human": " meter" - }, - "1": { - "human": " feet" - } - } - } - } - }, - "title": "Open Climbing Map" - }, - "cycle_highways": { - "description": "This map shows cycle highways", - "layers": { - "0": { - "name": "cycle highways", - "title": { - "render": "cycle highway" - } - } - }, - "title": "Cycle highways" - }, - "cycle_infra": { - "description": "A map where you can view and edit things related to the bicycle infrastructure. Made during #osoc21.", - "shortDescription": "A map where you can view and edit things related to the bicycle infrastructure.", - "title": "Bicycle infrastructure" - }, - "cyclestreets": { - "description": "A cyclestreet is a street where motorized traffic is not allowed to overtake cyclists. They are signposted by a special traffic sign. Cyclestreets can be found in the Netherlands and Belgium, but also in Germany and France. ", - "layers": { - "0": { - "description": "A cyclestreet is a street where motorized traffic is not allowed to overtake a cyclist", - "name": "Cyclestreets" - }, - "1": { - "description": "This street will become a cyclestreet soon", - "name": "Future cyclestreet", - "title": { - "mappings": { - "0": { - "then": "{name} will become a cyclestreet soon" - } - }, - "render": "Future cyclestreet" - } - }, - "2": { - "description": "Layer to mark any street as cyclestreet", - "name": "All streets", - "title": { - "render": "Street" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "mappings": { - "0": { - "then": "This street is a cyclestreet (and has a speed limit of 30 km/h)" - }, - "1": { - "then": "This street is a cyclestreet" - }, - "2": { - "then": "This street will become a cyclstreet soon" - }, - "3": { - "then": "This street is not a cyclestreet" - } - }, - "question": "Is this street a cyclestreet?" - }, - "1": { - "question": "When will this street become a cyclestreet?", - "render": "This street will become a cyclestreet at {cyclestreet:start_date}" - } - } - }, - "shortDescription": "A map of cyclestreets", - "title": "Cyclestreets" - }, - "cyclofix": { - "description": "The goal of this map is to present cyclists with an easy-to-use solution to find the appropriate infrastructure for their needs.

    You can track your precise location (mobile only) and select layers that are relevant for you in the bottom left corner. You can also use this tool to add or edit pins (points of interest) to the map and provide more data by answering the questions.

    All changes you make will automatically be saved in the global database of OpenStreetMap and can be freely re-used by others.

    For more information about the cyclofix project, go to cyclofix.osm.be.", - "title": "Cyclofix — an open map for cyclists" - }, - "drinking_water": { - "description": "On this map, publicly accessible drinking water spots are shown and can be easily added", - "title": "Drinking Water" - }, - "etymology": { - "description": "On this map, you can see what an object is named after. The streets, buildings, ... come from OpenStreetMap which got linked with Wikidata. In the popup, you'll see the Wikipedia article (if it exists) or a Wikidata box of what the object is named after. If the object itself has a Wikipedia page, that'll be shown too.

    You can help contribute too!Zoom in enough and all streets will show up. You can click one and a Wikidata-search box will popup. With a few clicks, you can add an etymology link. Note that you need a free OpenStreetMap account to do this.", - "layers": { - "1": { - "override": { - "name": "Streets without etymology information" - } - }, - "2": { - "override": { - "name": "Parks and forests without etymology information" - } - } - }, - "shortDescription": "What is the origin of a toponym?", - "title": "Open Etymology Map" - }, - "facadegardens": { - "description": "Facade gardens, green facades and trees in the city not only bring peace and quiet, but also a more beautiful city, greater biodiversity, a cooling effect and better air quality.
    Klimaan VZW and Mechelen Klimaatneutraal want to map existing and new facade gardens as an example for people who want to build their own garden or for city walkers who love nature.
    More info about the project at klimaan.be.", - "layers": { - "0": { - "description": "Facade gardens", - "name": "Facade gardens", - "presets": { - "0": { - "description": "Add a facade garden", - "title": "facade garden" - } - }, - "tagRenderings": { - "facadegardens-description": { - "question": "Extra describing info about the garden (if needed and not yet described above)", - "render": "More details: {description}" - }, - "facadegardens-direction": { - "question": "What is the orientation of the garden?", - "render": "Orientation: {direction} (where 0=N and 90=E)" - }, - "facadegardens-edible": { - "mappings": { - "0": { - "then": "There are edible plants" - }, - "1": { - "then": "There are no edible plants" - } - }, - "question": "Are there any edible plants?" - }, - "facadegardens-plants": { - "mappings": { - "0": { - "then": "There are vines" - }, - "1": { - "then": "There are flowering plants" - }, - "2": { - "then": "There are shrubs" - }, - "3": { - "then": "There are groundcovering plants" - } - }, - "question": "What kinds of plants grow here?" - }, - "facadegardens-rainbarrel": { - "mappings": { - "0": { - "then": "There is a rain barrel" - }, - "1": { - "then": "There is no rain barrel" - } - }, - "question": "Is there a water barrel installed for the garden?" - }, - "facadegardens-start_date": { - "question": "When was the garden constructed? (a year is sufficient)", - "render": "Construction date of the garden: {start_date}" - }, - "facadegardens-sunshine": { - "mappings": { - "0": { - "then": "The garden is in full sun" - }, - "1": { - "then": "The garden is in partial shade" - }, - "2": { - "then": "The garden is in the shade" - } - }, - "question": "Is the garden shaded or sunny?" - } - }, - "title": { - "render": "Facade garden" - } - } - }, - "shortDescription": "This map shows facade gardens with pictures and useful info about orientation, sunshine and plant types.", - "title": "Facade gardens" - }, - "food": { - "title": "Restaurants and fast food" - }, - "fritures": { - "layers": { - "0": { - "override": { - "name": "Fries shop" - } + "then": "Unnamed camper site" } + }, + "render": "Camper site {name}" } - }, - "ghostbikes": { - "description": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location.

    On this map, one can see all the ghost bikes which are known by OpenStreetMap. Is a ghost bike missing? Everyone can add or update information here - you only need to have a (free) OpenStreetMap account.", - "title": "Ghost bikes" - }, - "hackerspaces": { - "description": "On this map you can see hackerspaces, add a new hackerspace or update data directly", - "layers": { - "0": { - "description": "Hackerspace", - "icon": { - "mappings": { - "0": { - "then": "./assets/themes/hackerspaces/led.png" - } - } - }, - "name": "Hackerspace", - "presets": { - "0": { - "description": "A hackerspace is an area where people interested in software gather", - "title": "Hackerspace" - }, - "1": { - "description": "A makerspace is a place where DIY-enthusiasts gather to experiment with electronics such as arduino, LEDstrips, ...", - "title": "Makerspace" - } - }, - "tagRenderings": { - "hackerspaces-name": { - "question": "What is the name of this hackerspace?", - "render": "This hackerspace is named {name}" - }, - "hackerspaces-opening_hours": { - "mappings": { - "0": { - "then": "Opened 24/7" - } - }, - "question": "When is this hackerspace opened?", - "render": "{opening_hours_table()}" - }, - "hackerspaces-start_date": { - "question": "When was this hackerspace founded?", - "render": "This hackerspace was founded at {start_date}" - }, - "hs-club-mate": { - "mappings": { - "0": { - "then": "This hackerspace serves club mate" - }, - "1": { - "then": "This hackerspace does not serve club mate" - } - }, - "question": "Does this hackerspace serve Club Mate?" - }, - "is_makerspace": { - "mappings": { - "0": { - "then": "This is a makerspace" - }, - "1": { - "then": "This is a traditional (software oriented) hackerspace" - } - }, - "question": "Is this a hackerspace or a makerspace?" - } - }, - "title": { - "mappings": { - "0": { - "then": " {name}" - } - }, - "render": "Hackerspace" - } - } + }, + "1": { + "description": "Sanitary dump stations", + "name": "Sanitary dump stations", + "presets": { + "0": { + "description": "Add a new sanitary dump station. This is a place where camper drivers can dump waste water or chemical toilet waste. Often there's also drinking water and electricity.", + "title": "sanitary dump station" + } }, - "shortDescription": "A map of hackerspaces", - "title": "Hackerspaces" - }, - "hailhydrant": { - "description": "On this map you can find and update hydrants, fire stations, ambulance stations, and extinguishers in your favorite neighborhoods.\n\nYou can track your precise location (mobile only) and select layers that are relevant for you in the bottom left corner. You can also use this tool to add or edit pins (points of interest) to the map and provide additional details by answering available questions.\n\nAll changes you make will automatically be saved in the global database of OpenStreetMap and can be freely re-used by others.", - "layers": { + "tagRenderings": { + "dumpstations-access": { + "mappings": { + "0": { + "then": "You need a network key/code to use this" + }, + "1": { + "then": "You need to be a customer of camping/campersite to use this place" + }, + "2": { + "then": "Anyone can use this dump station" + }, + "3": { + "then": "Anyone can use this dump station" + } + }, + "question": "Who can use this dump station?" + }, + "dumpstations-charge": { + "question": "How much does this place charge?", + "render": "This place charges {charge}" + }, + "dumpstations-chemical-waste": { + "mappings": { + "0": { + "then": "You can dispose of chemical toilet waste here" + }, + "1": { + "then": "You cannot dispose of chemical toilet waste here" + } + }, + "question": "Can you dispose of chemical toilet waste here?" + }, + "dumpstations-fee": { + "mappings": { + "0": { + "then": "You need to pay for use" + }, + "1": { + "then": "Can be used for free" + } + }, + "question": "Does this place charge a fee?" + }, + "dumpstations-grey-water": { + "mappings": { + "0": { + "then": "You can dispose of grey water here" + }, + "1": { + "then": "You cannot dispose of gray water here" + } + }, + "question": "Can you dispose of grey water here?" + }, + "dumpstations-network": { + "question": "What network is this place a part of? (skip if none)", + "render": "This station is part of network {network}" + }, + "dumpstations-waterpoint": { + "mappings": { + "0": { + "then": "This place has a water point" + }, + "1": { + "then": "This place does not have a water point" + } + }, + "question": "Does this place have a water point?" + } + }, + "title": { + "mappings": { "0": { - "description": "Map layer to show fire hydrants.", - "name": "Map of hydrants", - "presets": { - "0": { - "description": "A hydrant is a connection point where firefighters can tap water. It might be located underground.", - "title": "Fire hydrant" - } - }, - "tagRenderings": { - "hydrant-color": { - "mappings": { - "0": { - "then": "The hydrant color is unknown." - }, - "1": { - "then": "The hydrant color is yellow." - }, - "2": { - "then": "The hydrant color is red." - } - }, - "question": "What color is the hydrant?", - "render": "The hydrant color is {colour}" - }, - "hydrant-state": { - "mappings": { - "0": { - "then": "The hydrant is (fully or partially) working." - }, - "1": { - "then": "The hydrant is unavailable." - }, - "2": { - "then": "The hydrant has been removed." - } - }, - "question": "Update the lifecycle status of the hydrant.", - "render": "Lifecycle status" - }, - "hydrant-type": { - "mappings": { - "0": { - "then": "The hydrant type is unknown." - }, - "1": { - "then": " Pillar type." - }, - "2": { - "then": " Pipe type." - }, - "3": { - "then": " Wall type." - }, - "4": { - "then": " Underground type." - } - }, - "question": "What type of hydrant is it?", - "render": " Hydrant type: {fire_hydrant:type}" - } - }, - "title": { - "render": "Hydrant" - } + "then": "Dump station" + } + }, + "render": "Dump station {name}" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "Who operates this place?", + "render": "This place is operated by {operator}" + }, + "1": { + "mappings": { + "0": { + "then": "This place has a power supply" }, "1": { - "description": "Map layer to show fire hydrants.", - "name": "Map of fire extinguishers.", - "presets": { - "0": { - "description": "A fire extinguisher is a small, portable device used to stop a fire", - "title": "Fire extinguisher" - } - }, - "tagRenderings": { - "extinguisher-location": { - "mappings": { - "0": { - "then": "Found indoors." - }, - "1": { - "then": "Found outdoors." - } - }, - "question": "Where is it positioned?", - "render": "Location: {location}" - } - }, - "title": { - "render": "Extinguishers" - } + "then": "This place does not have power supply" + } + }, + "question": "Does this place have a power supply?" + } + } + }, + "shortDescription": "Find sites to spend the night with your camper", + "title": "Campersites" + }, + "charging_stations": { + "description": "On this open map, one can find and mark information about charging stations", + "shortDescription": "A worldwide map of charging stations", + "title": "Charging stations" + }, + "climbing": { + "description": "On this map you will find various climbing opportunities such as climbing gyms, bouldering halls and rocks in nature.", + "descriptionTail": "The climbing map was originally made by Christian Neumann. Please get in touch if you have feedback or questions.

    The project uses data of the OpenStreetMap project.

    ", + "layers": { + "0": { + "description": "A climbing club or organisations", + "name": "Climbing club", + "presets": { + "0": { + "description": "A climbing club", + "title": "Climbing club" + }, + "1": { + "description": "A NGO working around climbing", + "title": "Climbing NGO" + } + }, + "tagRenderings": { + "climbing_club-name": { + "question": "What is the name of this climbing club or NGO?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Climbing NGO" + } + }, + "render": "Climbing club" + } + }, + "1": { + "description": "A climbing gym", + "name": "Climbing gyms", + "tagRenderings": { + "name": { + "question": "What is the name of this climbing gym?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Climbing gym {name}" + } + }, + "render": "Climbing gym" + } + }, + "2": { + "name": "Climbing routes", + "presets": { + "0": { + "title": "Climbing route" + } + }, + "tagRenderings": { + "Bolts": { + "mappings": { + "0": { + "then": "This route is not bolted" + }, + "1": { + "then": "This route is not bolted" + } + }, + "question": "How much bolts does this route have before reaching the moulinette?", + "render": "This route has {climbing:bolts} bolts" + }, + "Difficulty": { + "question": "What is the difficulty of this climbing route according to the french/belgian system?", + "render": "The difficulty is {climbing:grade:french} according to the french/belgian system" + }, + "Length": { + "question": "How long is this climbing route (in meters)?", + "render": "This route is {canonical(climbing:length)} long" + }, + "Name": { + "mappings": { + "0": { + "then": "This climbing route doesn't have a name" + } + }, + "question": "What is the name of this climbing route?", + "render": "{name}" + }, + "Rock type": { + "render": "The rock type is {_embedding_features_with_rock:rock} as stated on the surrounding crag" + } + }, + "title": { + "mappings": { + "0": { + "then": "Climbing route {name}" + } + }, + "render": "Climbing route" + } + }, + "3": { + "description": "A climbing opportunity", + "name": "Climbing opportunities", + "presets": { + "0": { + "description": "A climbing opportunity", + "title": "Climbing opportunity" + } + }, + "tagRenderings": { + "Contained routes hist": { + "render": "

    Difficulties overview

    {histogram(_difficulty_hist)}" + }, + "Contained routes length hist": { + "render": "

    Length overview

    {histogram(_length_hist)}" + }, + "Contained_climbing_routes": { + "render": "

    Contains {_contained_climbing_routes_count} routes

      {_contained_climbing_routes}
    " + }, + "Rock type (crag/rock/cliff only)": { + "mappings": { + "0": { + "then": "Limestone" + } + }, + "question": "What is the rock type here?", + "render": "The rock type is {rock}" + }, + "Type": { + "mappings": { + "0": { + "then": "A climbing boulder - a single rock or cliff with one or a few climbing routes which can be climbed safely without rope" + }, + "1": { + "then": "A climbing crag - a single rock or cliff with at least a few climbing routes" + } + } + }, + "name": { + "mappings": { + "0": { + "then": "This climbing opportunity doesn't have a name" + } + }, + "question": "What is the name of this climbing opportunity?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Climbing crag {name}" + }, + "1": { + "then": "Climbing area {name}" }, "2": { - "description": "Map layer to show fire stations.", - "name": "Map of fire stations", - "presets": { - "0": { - "description": "A fire station is a place where the fire trucks and firefighters are located when not in operation.", - "title": "Fire station" - } - }, - "tagRenderings": { - "station-agency": { - "mappings": { - "0": { - "then": "Bureau of Fire Protection" - } - }, - "question": "What agency operates this station?", - "render": "This station is operated by {operator}." - }, - "station-name": { - "question": "What is the name of this fire station?", - "render": "This station is called {name}." - }, - "station-operator": { - "mappings": { - "0": { - "then": "The station is operated by the government." - }, - "1": { - "then": "The station is operated by a community-based, or informal organization." - }, - "2": { - "then": "The station is operated by a formal group of volunteers." - }, - "3": { - "then": "The station is privately operated." - } - }, - "question": "How is the station operator classified?", - "render": "The operator is a(n) {operator:type} entity." - }, - "station-place": { - "question": "Where is the station located? (e.g. name of neighborhood, villlage, or town)", - "render": "This station is found within {addr:place}." - }, - "station-street": { - "question": " What is the street name where the station located?", - "render": "This station is along a highway called {addr:street}." - } - }, - "title": { - "render": "Fire Station" - } + "then": "Climbing site" }, "3": { - "description": "An ambulance station is an area for storage of ambulance vehicles, medical equipment, personal protective equipment, and other medical supplies.", - "name": "Map of ambulance stations", - "presets": { - "0": { - "description": "Add an ambulance station to the map", - "title": "Ambulance station" - } - }, - "tagRenderings": { - "ambulance-agency": { - "question": "What agency operates this station?", - "render": "This station is operated by {operator}." - }, - "ambulance-name": { - "question": "What is the name of this ambulance station?", - "render": "This station is called {name}." - }, - "ambulance-operator-type": { - "mappings": { - "0": { - "then": "The station is operated by the government." - }, - "1": { - "then": "The station is operated by a community-based, or informal organization." - }, - "2": { - "then": "The station is operated by a formal group of volunteers." - }, - "3": { - "then": "The station is privately operated." - } - }, - "question": "How is the station operator classified?", - "render": "The operator is a(n) {operator:type} entity." - }, - "ambulance-place": { - "question": "Where is the station located? (e.g. name of neighborhood, villlage, or town)", - "render": "This station is found within {addr:place}." - }, - "ambulance-street": { - "question": " What is the street name where the station located?", - "render": "This station is along a highway called {addr:street}." - } - }, - "title": { - "render": "Ambulance Station" - } + "then": "Climbing opportunity {name}" } + }, + "render": "Climbing opportunity" + } + }, + "4": { + "description": "A climbing opportunity?", + "name": "Climbing opportunities?", + "tagRenderings": { + "climbing-opportunity-name": { + "render": "{name}" + }, + "climbing-possible": { + "mappings": { + "0": { + "then": "Climbing is not possible here" + }, + "1": { + "then": "Climbing is possible here" + }, + "2": { + "then": "Climbing is not possible here" + } + }, + "question": "Is climbing possible here?" + } }, - "shortDescription": "Map to show hydrants, extinguishers, fire stations, and ambulance stations.", - "title": "Hydrants, Extinguishers, Fire stations, and Ambulance stations." + "title": { + "render": "Climbing opportunity?" + } + } }, - "maps": { - "description": "On this map you can find all maps OpenStreetMap knows - typically a big map on an information board showing the area, city or region, e.g. a tourist map on the back of a billboard, a map of a nature reserve, a map of cycling networks in the region, ...)

    If a map is missing, you can easily map this map on OpenStreetMap.", - "shortDescription": "This theme shows all (touristic) maps that OpenStreetMap knows of", - "title": "A map of maps" - }, - "natuurpunt": { - "description": "On this map you can find all the nature reserves that Natuurpunt offers ", - "shortDescription": "This map shows the nature reserves of Natuurpunt", - "title": "Nature Reserves" - }, - "observation_towers": { - "description": "Publicly accessible towers to enjoy the view", - "shortDescription": "Publicly accessible towers to enjoy the view", - "title": "Observation towers" - }, - "openwindpowermap": { - "description": "A map for showing and editing wind turbines.", - "layers": { - "0": { - "name": "wind turbine", - "presets": { - "0": { - "title": "wind turbine" - } - }, - "tagRenderings": { - "turbine-diameter": { - "question": "What is the rotor diameter of this wind turbine, in metres?", - "render": "The rotor diameter of this wind turbine is {rotor:diameter} metres." - }, - "turbine-height": { - "question": "What is the total height of this wind turbine (including rotor radius), in metres?", - "render": "The total height (including rotor radius) of this wind turbine is {height} metres." - }, - "turbine-operator": { - "question": "Who operates this wind turbine?", - "render": "This wind turbine is operated by {operator}." - }, - "turbine-output": { - "question": "What is the power output of this wind turbine? (e.g. 2.3 MW)", - "render": "The power output of this wind turbine is {generator:output:electricity}." - }, - "turbine-start-date": { - "question": "When did this wind turbine go into operation?", - "render": "This wind turbine went into operation on/in {start_date}." - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "wind turbine" - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " megawatts" - }, - "1": { - "human": " kilowatts" - }, - "2": { - "human": " watts" - }, - "3": { - "human": " gigawatts" - } - } - }, - "1": { - "applicableUnits": { - "0": { - "human": " meter" - } - } - } - } - } + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "Is there a (unofficial) website with more informations (e.g. topos)?" }, - "title": "OpenWindPowerMap" - }, - "parkings": { - "description": "This map shows different parking spots", - "shortDescription": "This map shows different parking spots", - "title": "Parking" - }, - "personal": { - "description": "Create a personal theme based on all the available layers of all themes. In order to show some data, open layer selection", - "title": "Personal theme" - }, - "playgrounds": { - "description": "On this map, you find playgrounds and can add more information", - "shortDescription": "A map with playgrounds", - "title": "Playgrounds" - }, - "postboxes": { - "description": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :)
    Spotted an error or is a post box missing? You can edit this map with a free OpenStreetMap account. ", - "layers": { + "1": { + "mappings": { "0": { - "description": "The layer showing postboxes.", - "name": "Postboxes", - "presets": { - "0": { - "title": "postbox" - } - }, - "title": { - "render": "Postbox" - } + "then": "The containing feature states that this is publicly accessible
    {_embedding_feature:access:description}" }, "1": { - "description": "A layer showing post offices.", - "filter": { - "0": { - "options": { - "0": { - "question": "Currently open" - } - } - } - }, - "name": "Post offices", - "presets": { - "0": { - "title": "Post Office" - } - }, - "tagRenderings": { - "OH": { - "mappings": { - "0": { - "then": "24/7 opened (including holidays)" - } - }, - "question": "What are the opening hours for this post office?", - "render": "Opening Hours: {opening_hours_table()}" - } - }, - "title": { - "render": "Post Office" - } + "then": "The containing feature states that a permit is needed to access
    {_embedding_feature:access:description}" + }, + "2": { + "then": "The containing feature states that this is only accessible to customers
    {_embedding_feature:access:description}" + }, + "3": { + "then": "The containing feature states that this is only accessible to club members
    {_embedding_feature:access:description}" } + } }, - "shortDescription": "A map showing postboxes and post offices", - "title": "Postbox and Post Office Map" - }, - "shops": { - "description": "On this map, one can mark basic information about shops, add opening hours and phone numbers", - "shortDescription": "An editable map with basic shop information", - "title": "Open Shop Map" - }, - "sport_pitches": { - "description": "A sport pitch is an area where sports are played", - "shortDescription": "A map showing sport pitches", - "title": "Sport pitches" - }, - "surveillance": { - "description": "On this open map, you can find surveillance cameras.", - "shortDescription": "Surveillance cameras and other means of surveillance", - "title": "Surveillance under Surveillance" - }, - "toilets": { - "description": "A map of public toilets", - "title": "Open Toilet Map" - }, - "trees": { - "description": "Map all the trees!", - "shortDescription": "Map all the trees", - "title": "Trees" - }, - "uk_addresses": { - "description": "Contribute to OpenStreetMap by filling out address information", - "layers": { - "1": { - "description": "Addresses", - "name": "Known addresses in OSM", - "tagRenderings": { - "uk_addresses_explanation_osm": { - "render": "This address is saved in OpenStreetMap" - }, - "uk_addresses_housenumber": { - "mappings": { - "0": { - "then": "This building has no house number" - } - }, - "question": "What is the number of this house?", - "render": "The housenumber is {addr:housenumber}" - }, - "uk_addresses_street": { - "question": "What street is this address located in?", - "render": "This address is in street {addr:street}" - } - }, - "title": { - "render": "Known address" - } - } - }, - "shortDescription": "Help to build an open dataset of UK addresses", - "tileLayerSources": { + "2": { + "mappings": { "0": { - "name": "Property boundaries by osmuk.org" + "then": "Publicly accessible to anyone" + }, + "1": { + "then": "You need a permit to access here" + }, + "2": { + "then": "Only custumers" + }, + "3": { + "then": "Only club members" } + }, + "question": "Who can access here?" }, - "title": "UK Addresses" + "4": { + "question": "What is the (average) length of the routes in meters?", + "render": "The routes are {canonical(climbing:length)} long on average" + }, + "5": { + "question": "What is the level of the easiest route here, accoring to the french classification system?", + "render": "The minimal difficulty is {climbing:grade:french:min} according to the french/belgian system" + }, + "6": { + "question": "What is the level of the most difficult route here, accoring to the french classification system?", + "render": "The maximal difficulty is {climbing:grade:french:max} according to the french/belgian system" + }, + "7": { + "mappings": { + "0": { + "then": "Bouldering is possible here" + }, + "1": { + "then": "Bouldering is not possible here" + }, + "2": { + "then": "Bouldering is possible, allthough there are only a few routes" + }, + "3": { + "then": "There are {climbing:boulder} boulder routes" + } + }, + "question": "Is bouldering possible here?" + }, + "8": { + "mappings": { + "0": { + "then": "Toprope climbing is possible here" + }, + "1": { + "then": "Toprope climbing is not possible here" + }, + "2": { + "then": "There are {climbing:toprope} toprope routes" + } + }, + "question": "Is toprope climbing possible here?" + }, + "9": { + "mappings": { + "0": { + "then": "Sport climbing is possible here" + }, + "1": { + "then": "Sport climbing is not possible here" + }, + "2": { + "then": "There are {climbing:sport} sport climbing routes" + } + }, + "question": "Is sport climbing possible here on fixed anchors?" + }, + "10": { + "mappings": { + "0": { + "then": "Traditional climbing is possible here" + }, + "1": { + "then": "Traditional climbing is not possible here" + }, + "2": { + "then": "There are {climbing:traditional} traditional climbing routes" + } + }, + "question": "Is traditional climbing possible here (using own gear e.g. chocks)?" + }, + "11": { + "mappings": { + "0": { + "then": "There is a speed climbing wall" + }, + "1": { + "then": "There is no speed climbing wall" + }, + "2": { + "then": "There are {climbing:speed} speed climbing walls" + } + }, + "question": "Is there a speed climbing wall?" + } + }, + "units+": { + "0": { + "applicableUnits": { + "0": { + "human": " meter" + }, + "1": { + "human": " feet" + } + } + } + } }, - "waste_basket": { - "description": "On this map, you'll find waste baskets near you. If a waste basket is missing on this map, you can add it yourself", - "shortDescription": "A map with waste baskets", - "title": "Waste Basket" + "title": "Open Climbing Map" + }, + "cycle_highways": { + "description": "This map shows cycle highways", + "layers": { + "0": { + "name": "cycle highways", + "title": { + "render": "cycle highway" + } + } + }, + "title": "Cycle highways" + }, + "cycle_infra": { + "description": "A map where you can view and edit things related to the bicycle infrastructure. Made during #osoc21.", + "shortDescription": "A map where you can view and edit things related to the bicycle infrastructure.", + "title": "Bicycle infrastructure" + }, + "cyclestreets": { + "description": "A cyclestreet is is a street where motorized traffic is not allowed to overtake cyclists. They are signposted by a special traffic sign. Cyclestreets can be found in the Netherlands and Belgium, but also in Germany and France. ", + "layers": { + "0": { + "description": "A cyclestreet is a street where motorized traffic is not allowed to overtake a cyclist", + "name": "Cyclestreets" + }, + "1": { + "description": "This street will become a cyclestreet soon", + "name": "Future cyclestreet", + "title": { + "mappings": { + "0": { + "then": "{name} will become a cyclestreet soon" + } + }, + "render": "Future cyclestreet" + } + }, + "2": { + "description": "Layer to mark any street as cyclestreet", + "name": "All streets", + "title": { + "render": "Street" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "mappings": { + "0": { + "then": "This street is a cyclestreet (and has a speed limit of 30 km/h)" + }, + "1": { + "then": "This street is a cyclestreet" + }, + "2": { + "then": "This street will become a cyclstreet soon" + }, + "3": { + "then": "This street is not a cyclestreet" + } + }, + "question": "Is the street {name} a cyclestreet?" + }, + "1": { + "question": "When will this street become a cyclestreet?", + "render": "This street will become a cyclestreet at {cyclestreet:start_date}" + } + } + }, + "shortDescription": "A map of cyclestreets", + "title": "Cyclestreets" + }, + "cyclofix": { + "description": "The goal of this map is to present cyclists with an easy-to-use solution to find the appropriate infrastructure for their needs.

    You can track your precise location (mobile only) and select layers that are relevant for you in the bottom left corner. You can also use this tool to add or edit pins (points of interest) to the map and provide more data by answering the questions.

    All changes you make will automatically be saved in the global database of OpenStreetMap and can be freely re-used by others.

    For more information about the cyclofix project, go to cyclofix.osm.be.", + "title": "Cyclofix - an open map for cyclists" + }, + "drinking_water": { + "description": "On this map, publicly accessible drinking water spots are shown and can be easily added", + "title": "Drinking Water" + }, + "etymology": { + "description": "On this map, you can see what an object is named after. The streets, buildings, ... come from OpenStreetMap which got linked with Wikidata. In the popup, you'll see the Wikipedia article (if it exists) or a wikidata box of what the object is named after. If the object itself has a wikipedia page, that'll be shown too.

    You can help contribute too!Zoom in enough and all streets will show up. You can click one and a Wikidata-search box will popup. With a few clicks, you can add an etymology link. Note that you need a free OpenStreetMap account to do this.", + "layers": { + "1": { + "override": { + "name": "Streets without etymology information" + } + }, + "2": { + "override": { + "name": "Parks and forests without etymology information" + } + } + }, + "shortDescription": "What is the origin of a toponym?", + "title": "Open Etymology Map" + }, + "facadegardens": { + "description": "Facade gardens, green facades and trees in the city not only bring peace and quiet, but also a more beautiful city, greater biodiversity, a cooling effect and better air quality.
    Klimaan VZW and Mechelen Klimaatneutraal want to map existing and new facade gardens as an example for people who want to build their own garden or for city walkers who love nature.
    More info about the project at klimaan.be.", + "layers": { + "0": { + "description": "Facade gardens", + "name": "Facade gardens", + "presets": { + "0": { + "description": "Add a facade garden", + "title": "facade garden" + } + }, + "tagRenderings": { + "facadegardens-description": { + "question": "Extra describing info about the garden (if needed and not yet described above)", + "render": "More details: {description}" + }, + "facadegardens-direction": { + "question": "What is the orientation of the garden?", + "render": "Orientation: {direction} (where 0=N and 90=O)" + }, + "facadegardens-edible": { + "mappings": { + "0": { + "then": "There are edible plants" + }, + "1": { + "then": "There are no edible plants" + } + }, + "question": "Are there any edible plants?" + }, + "facadegardens-plants": { + "mappings": { + "0": { + "then": "There are vines" + }, + "1": { + "then": "There are flowering plants" + }, + "2": { + "then": "There are shrubs" + }, + "3": { + "then": "There are groundcovering plants" + } + }, + "question": "What kinds of plants grow here?" + }, + "facadegardens-rainbarrel": { + "mappings": { + "0": { + "then": "There is a rain barrel" + }, + "1": { + "then": "There is no rain barrel" + } + }, + "question": "Is there a water barrel installed for the garden?" + }, + "facadegardens-start_date": { + "question": "When was the garden constructed? (a year is sufficient)", + "render": "Construction date of the garden: {start_date}" + }, + "facadegardens-sunshine": { + "mappings": { + "0": { + "then": "The garden is in full sun" + }, + "1": { + "then": "The garden is in partial shade" + }, + "2": { + "then": "The garden is in the shade" + } + }, + "question": "Is the garden shaded or sunny?" + } + }, + "title": { + "render": "Facade garden" + } + } + }, + "shortDescription": "This map shows facade gardens with pictures and useful info about orientation, sunshine and plant types.", + "title": "Facade gardens" + }, + "food": { + "title": "Restaurants and fast food" + }, + "fritures": { + "layers": { + "0": { + "override": { + "name": "Fries shop" + } + } } + }, + "ghostbikes": { + "description": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location.

    On this map, one can see all the ghost bikes which are known by OpenStreetMap. Is a ghost bike missing? Everyone can add or update information here - you only need to have a (free) OpenStreetMap account.", + "title": "Ghost bikes" + }, + "grb": { + "description": "This theme is an attempt to help automating the GRB import.
    Note that this is very hacky and 'steals' the GRB data from an external site; in order to do this, you need to install and activate this firefox extension for it to work.", + "layers": { + "1": { + "tagRenderings": { + "building type": { + "question": "What kind of building is this?" + } + } + } + } + }, + "hackerspaces": { + "description": "On this map you can see hackerspaces, add a new hackerspace or update data directly", + "layers": { + "0": { + "description": "Hackerspace", + "name": "Hackerspace", + "presets": { + "0": { + "description": "A hackerspace is an area where people interested in software gather", + "title": "Hackerspace" + }, + "1": { + "description": "A makerspace is a place where DIY-enthusiasts gather to experiment with electronics such as arduino, LEDstrips, ...", + "title": "Makerspace" + } + }, + "tagRenderings": { + "hackerspaces-name": { + "question": "What is the name of this hackerspace?", + "render": "This hackerspace is named {name}" + }, + "hackerspaces-opening_hours": { + "mappings": { + "0": { + "then": "Opened 24/7" + } + }, + "question": "When is this hackerspace opened?", + "render": "{opening_hours_table()}" + }, + "hackerspaces-start_date": { + "question": "When was this hackerspace founded?", + "render": "This hackerspace was founded at {start_date}" + }, + "hs-club-mate": { + "mappings": { + "0": { + "then": "This hackerspace serves club mate" + }, + "1": { + "then": "This hackerspace does not serve club mate" + } + }, + "question": "Does this hackerspace serve Club Mate?" + }, + "is_makerspace": { + "mappings": { + "0": { + "then": "This is a makerspace" + }, + "1": { + "then": "This is a traditional (software oriented) hackerspace" + } + }, + "question": "Is this a hackerspace or a makerspace?" + } + }, + "title": { + "mappings": { + "0": { + "then": " {name}" + } + }, + "render": "Hackerspace" + } + } + }, + "shortDescription": "A map of hackerspaces", + "title": "Hackerspaces" + }, + "hailhydrant": { + "description": "On this map you can find and update hydrants, fire stations, ambulance stations, and extinguishers in your favorite neighborhoods.\n\nYou can track your precise location (mobile only) and select layers that are relevant for you in the bottom left corner. You can also use this tool to add or edit pins (points of interest) to the map and provide additional details by answering available questions.\n\nAll changes you make will automatically be saved in the global database of OpenStreetMap and can be freely re-used by others.", + "layers": { + "0": { + "description": "Map layer to show fire hydrants.", + "name": "Map of hydrants", + "presets": { + "0": { + "description": "A hydrant is a connection point where firefighters can tap water. It might be located underground.", + "title": "Fire hydrant" + } + }, + "tagRenderings": { + "hydrant-color": { + "mappings": { + "0": { + "then": "The hydrant color is unknown." + }, + "1": { + "then": "The hydrant color is yellow." + }, + "2": { + "then": "The hydrant color is red." + } + }, + "question": "What color is the hydrant?", + "render": "The hydrant color is {colour}" + }, + "hydrant-state": { + "mappings": { + "0": { + "then": "The hydrant is (fully or partially) working" + }, + "1": { + "then": "The hydrant is unavailable" + }, + "2": { + "then": "The hydrant has been removed" + } + }, + "question": "Is this hydrant still working?" + }, + "hydrant-type": { + "mappings": { + "0": { + "then": "The hydrant type is unknown." + }, + "1": { + "then": " Pillar type." + }, + "2": { + "then": " Pipe type." + }, + "3": { + "then": " Wall type." + }, + "4": { + "then": " Underground type." + } + }, + "question": "What type of hydrant is it?", + "render": " Hydrant type: {fire_hydrant:type}" + } + }, + "title": { + "render": "Hydrant" + } + }, + "1": { + "description": "Map layer to show fire hydrants.", + "name": "Map of fire extinguishers.", + "presets": { + "0": { + "description": "A fire extinguisher is a small, portable device used to stop a fire", + "title": "Fire extinguisher" + } + }, + "tagRenderings": { + "extinguisher-location": { + "mappings": { + "0": { + "then": "Found indoors." + }, + "1": { + "then": "Found outdoors." + } + }, + "question": "Where is it positioned?", + "render": "Location: {location}" + } + }, + "title": { + "render": "Extinguishers" + } + }, + "2": { + "description": "Map layer to show fire stations.", + "name": "Map of fire stations", + "presets": { + "0": { + "description": "A fire station is a place where the fire trucks and firefighters are located when not in operation.", + "title": "Fire station" + } + }, + "tagRenderings": { + "station-agency": { + "mappings": { + "0": { + "then": "Bureau of Fire Protection" + } + }, + "question": "What agency operates this station?", + "render": "This station is operated by {operator}." + }, + "station-name": { + "question": "What is the name of this fire station?", + "render": "This station is called {name}." + }, + "station-operator": { + "mappings": { + "0": { + "then": "The station is operated by the government." + }, + "1": { + "then": "The station is operated by a community-based, or informal organization." + }, + "2": { + "then": "The station is operated by a formal group of volunteers." + }, + "3": { + "then": "The station is privately operated." + } + }, + "question": "How is the station operator classified?", + "render": "The operator is a(n) {operator:type} entity." + }, + "station-place": { + "question": "Where is the station located? (e.g. name of neighborhood, villlage, or town)", + "render": "This station is found within {addr:place}." + }, + "station-street": { + "question": " What is the street name where the station located?", + "render": "This station is along a highway called {addr:street}." + } + }, + "title": { + "render": "Fire Station" + } + }, + "3": { + "description": "An ambulance station is an area for storage of ambulance vehicles, medical equipment, personal protective equipment, and other medical supplies.", + "name": "Map of ambulance stations", + "presets": { + "0": { + "description": "Add an ambulance station to the map", + "title": "Ambulance station" + } + }, + "tagRenderings": { + "ambulance-agency": { + "question": "What agency operates this station?", + "render": "This station is operated by {operator}." + }, + "ambulance-name": { + "question": "What is the name of this ambulance station?", + "render": "This station is called {name}." + }, + "ambulance-operator-type": { + "mappings": { + "0": { + "then": "The station is operated by the government." + }, + "1": { + "then": "The station is operated by a community-based, or informal organization." + }, + "2": { + "then": "The station is operated by a formal group of volunteers." + }, + "3": { + "then": "The station is privately operated." + } + }, + "question": "How is the station operator classified?", + "render": "The operator is a(n) {operator:type} entity." + }, + "ambulance-place": { + "question": "Where is the station located? (e.g. name of neighborhood, villlage, or town)", + "render": "This station is found within {addr:place}." + }, + "ambulance-street": { + "question": " What is the street name where the station located?", + "render": "This station is along a highway called {addr:street}." + } + }, + "title": { + "render": "Ambulance Station" + } + } + }, + "shortDescription": "Map to show hydrants, extinguishers, fire stations, and ambulance stations.", + "title": "Hydrants, Extinguishers, Fire stations, and Ambulance stations." + }, + "maps": { + "description": "On this map you can find all maps OpenStreetMap knows - typically a big map on an information board showing the area, city or region, e.g. a tourist map on the back of a billboard, a map of a nature reserve, a map of cycling networks in the region, ...)

    If a map is missing, you can easily map this map on OpenStreetMap.", + "shortDescription": "This theme shows all (touristic) maps that OpenStreetMap knows of", + "title": "A map of maps" + }, + "natuurpunt": { + "description": "On this map you can find all the nature reserves that Natuurpunt offers ", + "shortDescription": "This map shows the nature reserves of Natuurpunt", + "title": "Nature Reserves" + }, + "observation_towers": { + "description": "Publicly accessible towers to enjoy the view", + "shortDescription": "Publicly accessible towers to enjoy the view", + "title": "Observation towers" + }, + "openwindpowermap": { + "description": "A map for showing and editing wind turbines.", + "layers": { + "0": { + "name": "wind turbine", + "presets": { + "0": { + "title": "wind turbine" + } + }, + "tagRenderings": { + "turbine-diameter": { + "question": "What is the rotor diameter of this wind turbine, in metres?", + "render": "The rotor diameter of this wind turbine is {rotor:diameter} metres." + }, + "turbine-height": { + "question": "What is the total height of this wind turbine (including rotor radius), in metres?", + "render": "The total height (including rotor radius) of this wind turbine is {height} metres." + }, + "turbine-operator": { + "question": "Who operates this wind turbine?", + "render": "This wind turbine is operated by {operator}." + }, + "turbine-output": { + "question": "What is the power output of this wind turbine? (e.g. 2.3 MW)", + "render": "The power output of this wind turbine is {generator:output:electricity}." + }, + "turbine-start-date": { + "question": "When did this wind turbine go into operation?", + "render": "This wind turbine went into operation on/in {start_date}." + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "wind turbine" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " megawatts" + }, + "1": { + "human": " kilowatts" + }, + "2": { + "human": " watts" + }, + "3": { + "human": " gigawatts" + } + } + }, + "1": { + "applicableUnits": { + "0": { + "human": " meter" + } + } + } + } + } + }, + "title": "OpenWindPowerMap" + }, + "parkings": { + "description": "This map shows different parking spots", + "shortDescription": "This map shows different parking spots", + "title": "Parking" + }, + "personal": { + "description": "Create a personal theme based on all the available layers of all themes. In order to show some data, open layer selection", + "title": "Personal theme" + }, + "playgrounds": { + "description": "On this map, you find playgrounds and can add more information", + "shortDescription": "A map with playgrounds", + "title": "Playgrounds" + }, + "postboxes": { + "description": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :)
    Spotted an error or is a post box missing? You can edit this map with a free OpenStreetMap account. ", + "layers": { + "0": { + "description": "The layer showing postboxes.", + "name": "Postboxes", + "presets": { + "0": { + "title": "postbox" + } + }, + "title": { + "render": "Postbox" + } + }, + "1": { + "description": "A layer showing post offices.", + "filter": { + "0": { + "options": { + "0": { + "question": "Currently open" + } + } + } + }, + "name": "Post offices", + "presets": { + "0": { + "title": "Post Office" + } + }, + "tagRenderings": { + "OH": { + "mappings": { + "0": { + "then": "24/7 opened (including holidays)" + } + }, + "question": "What are the opening hours for this post office?", + "render": "Opening Hours: {opening_hours_table()}" + } + }, + "title": { + "render": "Post Office" + } + } + }, + "shortDescription": "A map showing postboxes and post offices", + "title": "Postbox and Post Office Map" + }, + "shops": { + "description": "On this map, one can mark basic information about shops, add opening hours and phone numbers", + "shortDescription": "An editable map with basic shop information", + "title": "Open Shop Map" + }, + "sidewalks": { + "description": "Experimental theme", + "layers": { + "0": { + "description": "Layer showing sidewalks of highways", + "name": "Sidewalks", + "tagRenderings": { + "streetname": { + "render": "This street is named {name}" + } + }, + "title": { + "render": "{name}" + } + } + }, + "shortDescription": "Sidewalk mapping", + "title": "Sidewalks" + }, + "sport_pitches": { + "description": "A sport pitch is an area where sports are played", + "shortDescription": "A map showing sport pitches", + "title": "Sport pitches" + }, + "street_lighting": { + "description": "On this map you can find everything about street lighting", + "layers": { + "1": { + "name": "Lit streets", + "tagRenderings": { + "lit": { + "mappings": { + "0": { + "then": "This street is lit" + }, + "1": { + "then": "This street is not lit" + }, + "2": { + "then": "This street is lit at night" + }, + "3": { + "then": "This street is lit 24/7" + } + }, + "question": "Is this street lit?" + } + }, + "title": { + "render": "Lit street" + } + }, + "2": { + "name": "All streets", + "tagRenderings": { + "lit": { + "mappings": { + "0": { + "then": "This street is lit" + }, + "1": { + "then": "This street is not lit" + }, + "2": { + "then": "This street is lit at night" + }, + "3": { + "then": "This street is lit 24/7" + } + }, + "question": "Is this street lit?" + } + }, + "title": { + "render": "Street" + } + } + }, + "title": "Street Lighting" + }, + "surveillance": { + "description": "On this open map, you can find surveillance cameras.", + "shortDescription": "Surveillance cameras and other means of surveillance", + "title": "Surveillance under Surveillance" + }, + "toilets": { + "description": "A map of public toilets", + "title": "Open Toilet Map" + }, + "trees": { + "description": "Map all the trees!", + "shortDescription": "Map all the trees", + "title": "Trees" + }, + "uk_addresses": { + "description": "Contribute to OpenStreetMap by filling out address information", + "layers": { + "1": { + "tagRenderings": { + "uk_addresses_embedding_outline": { + "mappings": { + "0": { + "then": "The INSPIRE-polygon containing this point has at least one address contained" + }, + "1": { + "then": "The INSPIRE-polygon containing this point has no addresses contained" + } + } + }, + "uk_addresses_explanation": { + "render": "There probably is an address here" + } + }, + "title": { + "render": "Address to be determined" + } + }, + "2": { + "description": "Addresses", + "name": "Known addresses in OSM", + "tagRenderings": { + "address-sign-image": { + "render": "{image_carousel(image:address)}
    {image_upload(image:address, Add image of the address)}" + }, + "fixme": { + "question": "What should be fixed here? Please explain" + }, + "uk_addresses_explanation_osm": { + "render": "This address is saved in OpenStreetMap" + }, + "uk_addresses_housenumber": { + "mappings": { + "0": { + "then": "This building has no house number" + } + }, + "question": "What is the number of this house?", + "render": "The housenumber is {addr:housenumber}" + }, + "uk_addresses_street": { + "question": "What street is this address located in?", + "render": "This address is in street {addr:street}" + } + }, + "title": { + "render": "Known address" + } + } + }, + "shortDescription": "Help to build an open dataset of UK addresses", + "tileLayerSources": { + "0": { + "name": "Property boundaries by osmuk.org" + } + }, + "title": "UK Addresses" + }, + "waste_basket": { + "description": "On this map, you'll find waste baskets near you. If a waste basket is missing on this map, you can add it yourself", + "shortDescription": "A map with waste baskets", + "title": "Waste Basket" + } } \ No newline at end of file diff --git a/langs/themes/eo.json b/langs/themes/eo.json index e598b007f7..b9035ce2a5 100644 --- a/langs/themes/eo.json +++ b/langs/themes/eo.json @@ -1,119 +1,94 @@ { - "climbing": { - "overrideAll": { - "units+": { - "0": { - "applicableUnits": { - "0": { - "human": " metro" - }, - "1": { - "human": " futo" - } - } - } - } - } - }, - "cyclestreets": { - "layers": { - "2": { - "name": "Ĉiuj stratoj", - "title": { - "render": "Strato" - } - } - } - }, - "facadegardens": { - "layers": { + "climbing": { + "overrideAll": { + "units+": { + "0": { + "applicableUnits": { "0": { - "tagRenderings": { - "facadegardens-description": { - "render": "Pliaj detaloj: {description}" - } - } - } - } - }, - "ghostbikes": { - "title": "Fantombicikloj" - }, - "hackerspaces": { - "layers": { - "0": { - "icon": { - "mappings": { - "0": { - "then": "./assets/themes/hackerspaces/led.png" - } - } - }, - "tagRenderings": { - "hackerspaces-opening_hours": { - "render": "{opening_hours_table()}" - } - }, - "title": { - "mappings": { - "0": { - "then": " {name}" - } - } - } - } - } - }, - "hailhydrant": { - "layers": { + "human": " metro" + }, "1": { - "tagRenderings": { - "extinguisher-location": { - "render": "Loko: {location}" - } - } - } - } - }, - "maps": { - "title": "Mapo de mapoj" - }, - "openwindpowermap": { - "layers": { - "0": { - "title": { - "mappings": { - "0": { - "then": "{name}" - } - } - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " megavatoj" - }, - "1": { - "human": " kilovatoj" - }, - "2": { - "human": " vatoj" - }, - "3": { - "human": " gigavatoj" - } - } - }, - "1": { - "applicableUnits": { - "0": { - "human": " metro" - } - } - } - } + "human": " futo" } + } } + } } + }, + "cyclestreets": { + "layers": { + "2": { + "name": "Ĉiuj stratoj", + "title": { + "render": "Strato" + } + } + } + }, + "facadegardens": { + "layers": { + "0": { + "tagRenderings": { + "facadegardens-description": { + "render": "Pliaj detaloj: {description}" + } + } + } + } + }, + "ghostbikes": { + "title": "Fantombicikloj" + }, + "hailhydrant": { + "layers": { + "1": { + "tagRenderings": { + "extinguisher-location": { + "render": "Loko: {location}" + } + } + } + } + }, + "maps": { + "title": "Mapo de mapoj" + }, + "openwindpowermap": { + "layers": { + "0": { + "title": { + "mappings": { + "0": { + "then": "{name}" + } + } + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " megavatoj" + }, + "1": { + "human": " kilovatoj" + }, + "2": { + "human": " vatoj" + }, + "3": { + "human": " gigavatoj" + } + } + }, + "1": { + "applicableUnits": { + "0": { + "human": " metro" + } + } + } + } + } + } + } } \ No newline at end of file diff --git a/langs/themes/es.json b/langs/themes/es.json index 8d15340174..dc5f8827b0 100644 --- a/langs/themes/es.json +++ b/langs/themes/es.json @@ -1,16 +1,16 @@ { - "aed": { - "description": "En este mapa , cualquiera puede encontrar y marcar los desfibriladores externos automáticos más cercanos", - "title": "Mapa abierto de desfibriladores (DEA)" - }, - "artwork": { - "description": "Bienvenido a Open Artwork Map, un mapa de estatuas, bustos, grafitis y otras obras de arte de todo el mundo" - }, - "ghostbikes": { - "title": "Bicicleta blanca" - }, - "personal": { - "description": "Crea una interficie basada en todas las capas disponibles de todas las interficies", - "title": "Interficie personal" - } + "aed": { + "description": "En este mapa , cualquiera puede encontrar y marcar los desfibriladores externos automáticos más cercanos", + "title": "Mapa abierto de desfibriladores (DEA)" + }, + "artwork": { + "description": "Bienvenido a Open Artwork Map, un mapa de estatuas, bustos, grafitis y otras obras de arte de todo el mundo" + }, + "ghostbikes": { + "title": "Bicicleta blanca" + }, + "personal": { + "description": "Crea una interficie basada en todas las capas disponibles de todas las interficies", + "title": "Interficie personal" + } } \ No newline at end of file diff --git a/langs/themes/fi.json b/langs/themes/fi.json index 62f2d561dc..6d8f44a4a2 100644 --- a/langs/themes/fi.json +++ b/langs/themes/fi.json @@ -1,5 +1,5 @@ { - "ghostbikes": { - "title": "Haamupyörä" - } + "ghostbikes": { + "title": "Haamupyörä" + } } \ No newline at end of file diff --git a/langs/themes/fr.json b/langs/themes/fr.json index f258a5cb04..98ac69f0a0 100644 --- a/langs/themes/fr.json +++ b/langs/themes/fr.json @@ -1,959 +1,958 @@ { - "aed": { - "description": "Sur cette carte, vous pouvez trouver et améliorer les informations sur les défibrillateurs", - "title": "Carte des défibrillateurs (DAE)" - }, - "artwork": { - "description": "Bienvenue sur la carte ouverte des œuvres d'art, une carte des statues, fresques, ... du monde entier", - "title": "Carte ouverte des œuvres d'art" - }, - "benches": { - "description": "Cette carte affiche les bancs mappés dans OpenStreetMap, entre autres : bancs des transports en commun, bancs publics, etc. À l'aide de votre compte OpenStretMap, vous pourrez ajouter de nouveaux bancs ou modifier les bancs existants.", - "shortDescription": "Carte des bancs", - "title": "Bancs" - }, - "bicyclelib": { - "description": "Une vélothèque est un endroit où on peut emprunter des vélos, souvent moyennant une petite somme annuelle. Un cas d'utilisation notable est celui des vélothèques pour les enfants, qui leur permettent de passer à un vélo plus grand quand ils sont trop grands pour leur vélo actuel", - "title": "Vélothèques" - }, - "bookcases": { - "description": "Une microbibliothèques, également appelée boite à livre, est un élément de mobilier urbain (étagère, armoire, etc) dans lequel sont stockés des livres et autres objets en accès libre. Découvrez les boites à livres prêt de chez vous, ou ajouter en une nouvelle à l'aide de votre compte OpenStreetMap.", - "title": "Carte des microbibliothèques" - }, - "campersite": { - "description": "Ce site collecte les zones de camping officielles ainsi que les aires de vidange. Il est possible d’ajouter des détails à propos des services proposés ainsi que leurs coûts. Ajoutez vos images et avis. C’est un site et une application. Les données sont stockées sur OpenStreetMap, elles seront toujours gratuites et peuvent être réutilisées par n’importe quelle application.", - "layers": { + "aed": { + "description": "Sur cette carte, vous pouvez trouver et améliorer les informations sur les défibrillateurs", + "title": "Carte des défibrillateurs (DAE)" + }, + "artwork": { + "description": "Bienvenue sur la carte ouverte des œuvres d'art, une carte des statues, fresques, ... du monde entier", + "title": "Carte ouverte des œuvres d'art" + }, + "benches": { + "description": "Cette carte affiche les bancs mappés dans OpenStreetMap, entre autres : bancs des transports en commun, bancs publics, etc. À l'aide de votre compte OpenStretMap, vous pourrez ajouter de nouveaux bancs ou modifier les bancs existants.", + "shortDescription": "Carte des bancs", + "title": "Bancs" + }, + "bicyclelib": { + "description": "Une vélothèque est un endroit où on peut emprunter des vélos, souvent moyennant une petite somme annuelle. Un cas d'utilisation notable est celui des vélothèques pour les enfants, qui leur permettent de passer à un vélo plus grand quand ils sont trop grands pour leur vélo actuel", + "title": "Vélothèques" + }, + "bookcases": { + "description": "Une microbibliothèques, également appelée boite à livre, est un élément de mobilier urbain (étagère, armoire, etc) dans lequel sont stockés des livres et autres objets en accès libre. Découvrez les boites à livres prêt de chez vous, ou ajouter en une nouvelle à l'aide de votre compte OpenStreetMap.", + "title": "Carte des microbibliothèques" + }, + "campersite": { + "description": "Ce site collecte les zones de camping officielles ainsi que les aires de vidange. Il est possible d’ajouter des détails à propos des services proposés ainsi que leurs coûts. Ajoutez vos images et avis. C’est un site et une application. Les données sont stockées sur OpenStreetMap, elles seront toujours gratuites et peuvent être réutilisées par n’importe quelle application.", + "layers": { + "0": { + "description": "campings", + "name": "Campings", + "presets": { + "0": { + "description": "Ajouter une nouvelle aire de camping officielle, destinée à y passer la nuit avec un camping-car. Elle ne nécessite pas d’infrastructures particulières et peut être simplement désignée sous arrêté municipal, un simple parking ne suffit pas à rentrer dans cette catégorie ", + "title": "Aire de camping" + } + }, + "tagRenderings": { + "caravansites-capacity": { + "question": "Combien de personnes peuvent camper ici ? (Passez s’il n’y a pas de places délimitées)", + "render": "{capacity} personnes peuvent utiliser cet espace en même temps" + }, + "caravansites-charge": { + "question": "Combien coûte cet endroit ?", + "render": "Ce site fait payer {charge}" + }, + "caravansites-description": { + "question": "Souhaitez-vous ajouter une description générale du lieu ? (Ne pas répéter les informations précédentes et rester neutre, les opinions vont dans les avis)", + "render": "Plus de détails à propos du site : {description}" + }, + "caravansites-fee": { + "mappings": { + "0": { + "then": "L’utilisation est payante" + }, + "1": { + "then": "Peut être utilisé gratuitement" + } + }, + "question": "Cet endroit est-il payant ?" + }, + "caravansites-internet": { + "mappings": { + "0": { + "then": "Il y a un accès internet" + }, + "1": { + "then": "Il y a un accès internet" + }, + "2": { + "then": "Il n’y a pas d’accès internet" + } + }, + "question": "Cet endroit offre-t-il un accès à Internet ?" + }, + "caravansites-internet-fee": { + "mappings": { + "0": { + "then": "L’accès internet est en supplément" + }, + "1": { + "then": "L’accès internet est inclus" + } + }, + "question": "L’accès internet est-il payant ?" + }, + "caravansites-long-term": { + "mappings": { + "0": { + "then": "Oui, mais il est possible d’y passer seulement une nuit" + }, + "1": { + "then": "Non, il n’y a pas de résidents permanents" + }, + "2": { + "then": "C’est possible sous contrat (Cette option fera disparaître le site de la carte)" + } + }, + "question": "Ce site permet-il la location longue durée ?" + }, + "caravansites-name": { + "question": "Comment s'appelle cet endroit ?", + "render": "Cet endroit s'appelle {name}" + }, + "caravansites-sanitary-dump": { + "mappings": { + "0": { + "then": "Cet endroit a une station de vidange sanitaire" + }, + "1": { + "then": "Ce site ne possède pas de lieu de vidange" + } + }, + "question": "Ce site possède-t’il un lieu de vidange ?" + }, + "caravansites-toilets": { + "mappings": { + "0": { + "then": "Ce site a des toilettes" + }, + "1": { + "then": "Ce site n’a pas de toilettes" + } + }, + "question": "Y-a-t’il des toilettes sur le site ?" + }, + "caravansites-website": { + "question": "Ce lieu a-t’il un site internet ?", + "render": "Site officiel : {website}" + } + }, + "title": { + "mappings": { "0": { - "description": "campings", - "name": "Campings", - "presets": { - "0": { - "description": "Ajouter une nouvelle aire de camping officielle, destinée à y passer la nuit avec un camping-car. Elle ne nécessite pas d’infrastructures particulières et peut être simplement désignée sous arrêté municipal, un simple parking ne suffit pas à rentrer dans cette catégorie ", - "title": "Aire de camping" - } - }, - "tagRenderings": { - "caravansites-capacity": { - "question": "Combien de personnes peuvent camper ici ? (Passez s’il n’y a pas de places délimitées)", - "render": "{capacity} personnes peuvent utiliser cet espace en même temps" - }, - "caravansites-charge": { - "question": "Combien coûte cet endroit ?", - "render": "Ce site fait payer {charge}" - }, - "caravansites-description": { - "question": "Souhaitez-vous ajouter une description générale du lieu ? (Ne pas répéter les informations précédentes et rester neutre, les opinions vont dans les avis)", - "render": "Plus de détails à propos du site : {description}" - }, - "caravansites-fee": { - "mappings": { - "0": { - "then": "L’utilisation est payante" - }, - "1": { - "then": "Peut être utilisé gratuitement" - } - }, - "question": "Cet endroit est-il payant ?" - }, - "caravansites-internet": { - "mappings": { - "0": { - "then": "Il y a un accès internet" - }, - "1": { - "then": "Il y a un accès internet" - }, - "2": { - "then": "Il n’y a pas d’accès internet" - } - }, - "question": "Cet endroit offre-t-il un accès à Internet ?" - }, - "caravansites-internet-fee": { - "mappings": { - "0": { - "then": "L’accès internet est en supplément" - }, - "1": { - "then": "L’accès internet est inclus" - } - }, - "question": "L’accès internet est-il payant ?" - }, - "caravansites-long-term": { - "mappings": { - "0": { - "then": "Oui, mais il est possible d’y passer seulement une nuit" - }, - "1": { - "then": "Non, il n’y a pas de résidents permanents" - }, - "2": { - "then": "C’est possible sous contrat (Cette option fera disparaître le site de la carte)" - } - }, - "question": "Ce site permet-il la location longue durée ?" - }, - "caravansites-name": { - "question": "Comment s'appelle cet endroit ?", - "render": "Cet endroit s'appelle {nom}" - }, - "caravansites-sanitary-dump": { - "mappings": { - "0": { - "then": "Cet endroit a une station de vidange sanitaire" - }, - "1": { - "then": "Ce site ne possède pas de lieu de vidange" - } - }, - "question": "Ce site possède-t’il un lieu de vidange ?" - }, - "caravansites-toilets": { - "mappings": { - "0": { - "then": "Ce site a des toilettes" - }, - "1": { - "then": "Ce site n’a pas de toilettes" - } - }, - "question": "Y-a-t’il des toilettes sur le site ?" - }, - "caravansites-website": { - "question": "Ce lieu a-t’il un site internet ?", - "render": "Site officiel : {website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Camping sans nom" - } - }, - "render": "Camping {name}" - } + "then": "Camping sans nom" + } + }, + "render": "Camping {name}" + } + }, + "1": { + "description": "Site de vidange", + "name": "Site de vidange", + "presets": { + "0": { + "description": "Ajouter un nouveau site de vidange. Un espace où évacuer ses eaux usées (grises et/ou noires) généralement alimenté en eau potable et électricité.", + "title": "Site de vidange" + } + }, + "tagRenderings": { + "dumpstations-access": { + "mappings": { + "0": { + "then": "Un code est nécessaire" + }, + "1": { + "then": "Le site est réservés aux clients" + }, + "2": { + "then": "Le site est en libre-service" + }, + "3": { + "then": "Le site est en libre-service" + } + }, + "question": "Qui peut utiliser le site de vidange ?" + }, + "dumpstations-charge": { + "question": "Combien ce site demande t’il de payer ?", + "render": "Ce site fait payer {charge}" + }, + "dumpstations-chemical-waste": { + "mappings": { + "0": { + "then": "Il est possible d’y vidanger ses toilettes chimiques" + }, + "1": { + "then": "Il n’est pas possible d’y vidanger ses toilettes chimiques" + } + }, + "question": "Est-il possible d’y vidanger ses toilettes chimiques ?" + }, + "dumpstations-fee": { + "mappings": { + "0": { + "then": "Ce site demande un paiement" + }, + "1": { + "then": "Ce site ne demande pas de paiement" + } + }, + "question": "Ce site est-il payant ?" + }, + "dumpstations-grey-water": { + "mappings": { + "0": { + "then": "Il est possible d’y vidanger ses eaux usées" + }, + "1": { + "then": "Il n’est pas possible d’y vidanger ses eaux usées" + } + }, + "question": "Est-il possible d’y faire sa vidange des eaux usées ?" + }, + "dumpstations-network": { + "question": "De quel réseau fait-elle partie ? (Passer si aucun)", + "render": "Cette station fait parte d’un réseau {network}" + }, + "dumpstations-waterpoint": { + "mappings": { + "0": { + "then": "Ce site a un point d’eau" + }, + "1": { + "then": "Ce site n’a pas de point d’eau" + } + }, + "question": "Ce site dispose-t’il d’un point d’eau ?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Site de vidange" + } + }, + "render": "Site de vidange {name}" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "Qui est l’exploitant du site ?", + "render": "Ce site est exploité par {operator}" + }, + "1": { + "mappings": { + "0": { + "then": "Ce site a une source d’alimentation" }, "1": { - "description": "Site de vidange", - "name": "Site de vidange", - "presets": { - "0": { - "description": "Ajouter un nouveau site de vidange. Un espace où évacuer ses eaux usées (grises et/ou noires) généralement alimenté en eau potable et électricité.", - "title": "Site de vidange" - } - }, - "tagRenderings": { - "dumpstations-access": { - "mappings": { - "0": { - "then": "Un code est nécessaire" - }, - "1": { - "then": "Le site est réservés aux clients" - }, - "2": { - "then": "Le site est en libre-service" - }, - "3": { - "then": "Le site est en libre-service" - } - }, - "question": "Qui peut utiliser le site de vidange ?" - }, - "dumpstations-charge": { - "question": "Combien ce site demande t’il de payer ?", - "render": "Ce site fait payer {charge}" - }, - "dumpstations-chemical-waste": { - "mappings": { - "0": { - "then": "Il est possible d’y vidanger ses toilettes chimiques" - }, - "1": { - "then": "Il n’est pas possible d’y vidanger ses toilettes chimiques" - } - }, - "question": "Est-il possible d’y vidanger ses toilettes chimiques ?" - }, - "dumpstations-fee": { - "mappings": { - "0": { - "then": "Ce site demande un paiement" - }, - "1": { - "then": "Ce site ne demande pas de paiement" - } - }, - "question": "Ce site est-il payant ?" - }, - "dumpstations-grey-water": { - "mappings": { - "0": { - "then": "Il est possible d’y vidanger ses eaux usées" - }, - "1": { - "then": "Il n’est pas possible d’y vidanger ses eaux usées" - } - }, - "question": "Est-il possible d’y faire sa vidange des eaux usées ?" - }, - "dumpstations-network": { - "question": "De quel réseau fait-elle partie ? (Passer si aucun)", - "render": "Cette station fait parte d’un réseau {network}" - }, - "dumpstations-waterpoint": { - "mappings": { - "0": { - "then": "Ce site a un point d’eau" - }, - "1": { - "then": "Ce site n’a pas de point d’eau" - } - }, - "question": "Ce site dispose-t’il d’un point d’eau ?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Site de vidange" - } - }, - "render": "Site de vidange {name}" - } + "then": "Ce site n’a pas de source d’alimentation" } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "Qui est l’exploitant du site ?", - "render": "Ce site est exploité par {operator}" - }, - "1": { - "mappings": { - "0": { - "then": "Ce site a une source d’alimentation" - }, - "1": { - "then": "Ce site n’a pas de source d’alimentation" - } - }, - "question": "Ce site a-t’il une source d’électricité ?" - } - } - }, - "shortDescription": "Trouver des sites pour passer la nuit avec votre camping-car", - "title": "Campings" + }, + "question": "Ce site a-t’il une source d’électricité ?" + } + } }, - "climbing": { - "description": "Cette carte indique les sites d’escalades comme les salles d’escalade ou les sites naturels.", - "descriptionTail": "La carte a été créée par Christian Neumann. Merci de le contacter pour des avis ou des questions.

    Ce projet utilise les données OpenStreetMap.

    ", - "layers": { + "shortDescription": "Trouver des sites pour passer la nuit avec votre camping-car", + "title": "Campings" + }, + "climbing": { + "description": "Cette carte indique les sites d’escalades comme les salles d’escalade ou les sites naturels.", + "descriptionTail": "La carte a été créée par Christian Neumann. Merci de le contacter pour des avis ou des questions.

    Ce projet utilise les données OpenStreetMap.

    ", + "layers": { + "0": { + "description": "Club ou association d’escalade", + "name": "Club d’escalade", + "presets": { + "0": { + "description": "Un club d’escalade", + "title": "Club d’escalade" + }, + "1": { + "description": "Une association d’escalade", + "title": "Association d’escalade" + } + }, + "tagRenderings": { + "climbing_club-name": { + "question": "Quel est le nom du club ou de l’association ?", + "render": "{name}" + } + }, + "title": { + "mappings": { "0": { - "description": "Club ou association d’escalade", - "name": "Club d’escalade", - "presets": { - "0": { - "description": "Un club d’escalade", - "title": "Club d’escalade" - }, - "1": { - "description": "Une association d’escalade", - "title": "Association d’escalade" - } - }, - "tagRenderings": { - "climbing_club-name": { - "question": "Quel est le nom du club ou de l’association ?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Association d’escalade" - } - }, - "render": "Club d’escalade" - } + "then": "Association d’escalade" + } + }, + "render": "Club d’escalade" + } + }, + "1": { + "description": "Une salle d’escalade", + "name": "Salle d’escalade", + "tagRenderings": { + "name": { + "question": "Quel est le nom de la salle d’escalade ?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Salle d’escalade {name}" + } + }, + "render": "Salle d’escalade" + } + }, + "2": { + "name": "Voies d’escalade", + "presets": { + "0": { + "title": "Voie d’escalade" + } + }, + "tagRenderings": { + "Bolts": { + "mappings": { + "0": { + "then": "Cette voie n’a pas de prises" + }, + "1": { + "then": "Cette voie n’a pas de prises" + } + }, + "question": "Combien de prises cette voie possède avant d’atteindre la moulinette ?", + "render": "Cette voie a {climbing:bolts} prises" + }, + "Difficulty": { + "question": "Quelle est la difficulté de cette voie selon le système franco-belge ?", + "render": "Selon le système franco-belge, la difficulté de cette voie est de {climbing:grade:french}" + }, + "Length": { + "question": "Quelle est la longueur de cette voie (en mètres) ?", + "render": "Cette voie fait {canonical(climbing:length)} de long" + }, + "Name": { + "mappings": { + "0": { + "then": "Cette voie n’a pas de nom" + } + }, + "question": "Quel est le nom de cette voie d’escalade ?", + "render": "{name}" + }, + "Rock type": { + "render": "Le type de roche est {_embedding_features_with_rock:rock} selon le mur" + } + }, + "title": { + "mappings": { + "0": { + "then": "Voie d’escalade {name}" + } + }, + "render": "Voie d’escalade" + } + }, + "3": { + "description": "Opportunité d’escalade", + "name": "Opportunité d’escalade", + "presets": { + "0": { + "description": "Opportunité d’escalade", + "title": "Opportunité d’escalade" + } + }, + "tagRenderings": { + "Contained routes hist": { + "render": "

    Résumé des difficultés

    {histogram(_difficulty_hist)}" + }, + "Contained routes length hist": { + "render": "

    Résumé de longueur

    {histogram(_length_hist)}" + }, + "Contained_climbing_routes": { + "render": "

    Contient {_contained_climbing_routes_count} voies

      {_contained_climbing_routes}
    " + }, + "Rock type (crag/rock/cliff only)": { + "mappings": { + "0": { + "then": "Calcaire" + } + }, + "question": "Quel est le type de roche ?", + "render": "La roche est du {rock}" + }, + "Type": { + "mappings": { + "0": { + "then": "Rocher d’escalade, rocher avec une ou peu de voie permettant d’escalader sans corde" + }, + "1": { + "then": "Mur d’escalade, rocher avec plusieurs voies d’escalades" + } + } + }, + "name": { + "mappings": { + "0": { + "then": "Ce site n’a pas de nom" + } + }, + "question": "Quel est le nom de ce site ?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Mur d’escalade {name}" }, "1": { - "description": "Une salle d’escalade", - "name": "Salle d’escalade", - "tagRenderings": { - "name": { - "question": "Quel est le nom de la salle d’escalade ?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Salle d’escalade {name}" - } - }, - "render": "Salle d’escalade" - } + "then": "Zone d’escalade {name}" }, "2": { - "name": "Voies d’escalade", - "presets": { - "0": { - "title": "Voie d’escalade" - } - }, - "tagRenderings": { - "Bolts": { - "mappings": { - "0": { - "then": "Cette voie n’a pas de prises" - }, - "1": { - "then": "Cette voie n’a pas de prises" - } - }, - "question": "Combien de prises cette voie possède avant d’atteindre la moulinette ?", - "render": "Cette voie a {climbing:bolts} prises" - }, - "Difficulty": { - "question": "Quelle est la difficulté de cette voie selon le système franco-belge ?", - "render": "Selon le système franco-belge, la difficulté de cette voie est de {climbing:grade:french}" - }, - "Length": { - "question": "Quelle est la longueur de cette voie (en mètres) ?", - "render": "Cette voie fait {canonical(climbing:length)} de long" - }, - "Name": { - "mappings": { - "0": { - "then": "Cette voie n’a pas de nom" - } - }, - "question": "Quel est le nom de cette voie d’escalade ?", - "render": "{name}" - }, - "Rock type": { - "render": "Le type de roche est {_embedding_features_with_rock:rock} selon le mur" - } - }, - "title": { - "mappings": { - "0": { - "then": "Voie d’escalade {name}" - } - }, - "render": "Voie d’escalade" - } + "then": "Site d’escalade" }, "3": { - "description": "Opportunité d’escalade", - "name": "Opportunité d’escalade", - "presets": { - "0": { - "description": "Opportunité d’escalade", - "title": "Opportunité d’escalade" - } - }, - "tagRenderings": { - "Containe {_contained_climbing_routes_count} routes": { - "render": "

    Contient {_contained_climbing_routes_count} voies

      {_contained_climbing_routes}
    " - }, - "Contained routes hist": { - "render": "

    Résumé des difficultés

    {histogram(_difficulty_hist)}" - }, - "Contained routes length hist": { - "render": "

    Résumé de longueur

    {histogram(_length_hist)}" - }, - "Rock type (crag/rock/cliff only)": { - "mappings": { - "0": { - "then": "Calcaire" - } - }, - "question": "Quel est le type de roche ?", - "render": "La roche est du {rock}" - }, - "Type": { - "mappings": { - "0": { - "then": "Rocher d’escalade, rocher avec une ou peu de voie permettant d’escalader sans corde" - }, - "1": { - "then": "Mur d’escalade, rocher avec plusieurs voies d’escalades" - } - } - }, - "name": { - "mappings": { - "0": { - "then": "Ce site n’a pas de nom" - } - }, - "question": "Quel est le nom de ce site ?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Mur d’escalade {name}" - }, - "1": { - "then": "Zone d’escalade {name}" - }, - "2": { - "then": "Site d’escalade" - }, - "3": { - "then": "Opportunité d’escalade {name}" - } - }, - "render": "Opportunité d’escalade" - } + "then": "Opportunité d’escalade {name}" + } + }, + "render": "Opportunité d’escalade" + } + }, + "4": { + "description": "Opportunité d’escalade ?", + "name": "Opportunités d’escalade ?", + "tagRenderings": { + "climbing-opportunity-name": { + "render": "{name}" + }, + "climbing-possible": { + "mappings": { + "0": { + "then": "Escalader n’est pas possible" + }, + "1": { + "then": "Escalader est possible" + }, + "2": { + "then": "Escalader n’est pas possible" + } }, - "4": { - "description": "Opportunité d’escalade ?", - "name": "Opportunités d’escalade ?", - "tagRenderings": { - "climbing-opportunity-name": { - "render": "{name}" - }, - "climbing-possible": { - "mappings": { - "0": { - "then": "Escalader n’est pas possible" - }, - "1": { - "then": "Escalader est possible" - }, - "2": { - "then": "Escalader n’est pas possible" - } - }, - "question": "Est-il possible d’escalader ici ?" - } - }, - "title": { - "render": "Opportunité d’escalade ?" - } - } + "question": "Est-il possible d’escalader ici ?" + } }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "Existe-t’il un site avec plus d’informations (ex : topographie) ?" - }, - "1": { - "mappings": { - "0": { - "then": "L’élément englobant indique un accès libre
    {_embedding_feature:access:description}" - }, - "1": { - "then": "L’élément englobant indique qu’ une autorisation d’accès est nécessaire
    {_embedding_feature:access:description}" - }, - "2": { - "then": "L’élément englobant indique que l’accès est réservés aux clients
    {_embedding_feature:access:description}" - }, - "3": { - "then": "L’élément englobant indique que l’accès est réservé aux membres
    {_embedding_feature:access:description}" - } - } - }, - "2": { - "mappings": { - "0": { - "then": "Libre d’accès" - }, - "1": { - "then": "Une autorisation est nécessaire" - }, - "2": { - "then": "Réservé aux clients" - }, - "3": { - "then": "Réservé aux membres" - } - }, - "question": "Qui peut y accéder ?" - }, - "4": { - "question": "Quelle est la longueur moyenne des voies en mètres ?", - "render": "Les voies font {canonical(climbing:length)} de long en moyenne" - }, - "5": { - "question": "Quel est le niveau de la voie la plus simple selon la classification franco-belge ?", - "render": "La difficulté minimale est {climbing:grade:french:min} selon la classification franco-belge" - }, - "6": { - "question": "Quel est le niveau de la voie la plus difficile selon la classification franco-belge ?", - "render": "La difficulté maximale est {climbing:grade:french:max} selon la classification franco-belge" - }, - "7": { - "mappings": { - "0": { - "then": "L’escalade de bloc est possible" - }, - "1": { - "then": "L’escalade de bloc n’est pas possible" - }, - "2": { - "then": "L’escalade de bloc est possible sur des voies précises" - }, - "3": { - "then": "Il y a {climbing:boulder} voies d’escalade de bloc" - } - }, - "question": "L’escalade de bloc est-elle possible ici ?" - }, - "8": { - "mappings": { - "0": { - "then": "L’escalade à la moulinette est possible" - }, - "1": { - "then": "L’escalade à la moulinette n’est pas possible" - }, - "2": { - "then": "{climbing:toprope} voies sont équipées de moulinettes" - } - }, - "question": "Est-il possible d’escalader à la moulinette ?" - } - }, - "units+": { - "0": { - "applicableUnits": { - "0": { - "human": " mètres" - }, - "1": { - "human": " pieds" - } - } - } - } + "title": { + "render": "Opportunité d’escalade ?" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "Existe-t’il un site avec plus d’informations (ex : topographie) ?" }, - "title": "Open Climbing Map" - }, - "cyclofix": { - "description": "Le but de cette carte est de présenter aux cyclistes une solution facile à utiliser pour trouver l'infrastructure appropriée à leurs besoins.

    Vous pouvez suivre votre localisation précise (mobile uniquement) et sélectionner les couches qui vous concernent dans le coin inférieur gauche. Vous pouvez également utiliser cet outil pour ajouter ou modifier des épingles (points d'intérêt) sur la carte et fournir plus de données en répondant aux questions.

    Toutes les modifications que vous apportez seront automatiquement enregistrées dans la base de données mondiale d'OpenStreetMap et peuvent être librement réutilisées par d'autres.

    Pour plus d'informations sur le projet cyclofix, rendez-vous sur cyclofix.osm.be.", - "title": "Cyclofix - Une carte ouverte pour les cyclistes" - }, - "drinking_water": { - "description": "Cette carte affiche les points d'accès public à de l'eau potable, et permet d'en ajouter facilement", - "title": "Eau potable" - }, - "facadegardens": { - "description": "Les jardins muraux en ville n’apportent pas seulement paix et tranquillité mais contribuent à embellir la ville, favoriser la biodiversité, régule la température et assainit l’air.
    Klimaan VZW et Mechelen Klimaatneutraal veulent cartographier les jardins muraux comme exemple pour les personnes souhaitant en construire ainsi que celles aimant la nature.
    Plus d’infos sur klimaan.be.", - "layers": { + "1": { + "mappings": { "0": { - "description": "Jardins muraux", - "name": "Jardins muraux", - "presets": { - "0": { - "description": "Ajouter un jardin mural", - "title": "jardin mural" - } - }, - "tagRenderings": { - "facadegardens-description": { - "question": "Détails supplémentaires sur le jardin (si nécessaire et non décrit précédemment)", - "render": "Plus de détails : {description}" - }, - "facadegardens-direction": { - "question": "Quelle est l’orientation du jardin ?", - "render": "Orientation : {direction} (0 pour le Nord et 90 pour l’Ouest)" - }, - "facadegardens-edible": { - "mappings": { - "0": { - "then": "Il y a des plantes comestibles" - }, - "1": { - "then": "Il n’y a pas de plantes comestibles" - } - }, - "question": "Y-a-t’il des plantes comestibles ?" - }, - "facadegardens-plants": { - "mappings": { - "0": { - "then": "Il y a des plantes grimpantes" - }, - "1": { - "then": "Il y a des fleurs" - }, - "2": { - "then": "Il y a des buissons" - }, - "3": { - "then": "Il y a des plantes couvre-sol" - } - }, - "question": "Quel type de plantes pousse ici ?" - }, - "facadegardens-rainbarrel": { - "mappings": { - "0": { - "then": "Il y a des réserves" - }, - "1": { - "then": "Il n’y a pas de réserves" - } - }, - "question": "Des réserves d’eau ont-elles été installées pour le jardin ?" - }, - "facadegardens-start_date": { - "question": "Quand le jardin a-t’il été construit ? (L’année suffit)", - "render": "Date de construction du jardin : {start_date}" - }, - "facadegardens-sunshine": { - "mappings": { - "0": { - "then": "Le jardin est en plein soleil" - }, - "1": { - "then": "Le jardin est partiellement ensoleillé" - }, - "2": { - "then": "Le jardin est à l’ombre" - } - }, - "question": "Quel est l’ensoleillement du jardin ?" - } - }, - "title": { - "render": "Jardin mural" - } - } - }, - "shortDescription": "Cette carte indique les murs végétalisés avec des photos et des informations comme leur orientation, l’ensoleillement et le type de plantes.", - "title": "Facade gardens" - }, - "fritures": { - "layers": { - "0": { - "override": { - "name": "Friteries" - } - } - }, - "title": "Carte des friteries" - }, - "ghostbikes": { - "description": "Les vélos fantômes sont des mémoriaux pour les cyclistes tuées sur la route, prenant la forme de vélos blancs placés à proximité des faits.

    Cette carte indique leur emplacement à partir d’OpenStreetMap. Il est possible de contribuer aux informations ici, sous réserve d’avoir un compte OpenStreetMap (gratuit).", - "title": "Vélo fantôme" - }, - "hailhydrant": { - "description": "Sur cette carte on trouve et met à jour les bornes incendies, extincteurs, casernes de pompiers et ambulanciers dans son quartier.
    Les options en haut à gauche permettent de localiser sa position (sur téléphone) et de filtrer les éléments. Il est possible d’utiliser cet outil pour ajouter et éditer les points d’intérêt de la carte et d’y ajouter des détails en répondant aux questions.
    Toutes les modifications sont automatiquement enregistrées dans la base de données OpenStreetMap et peuvent êtres librement réutilisées par d’autres.", - "layers": { - "0": { - "description": "Couche des bornes incendie.", - "name": "Carte des bornes incendie", - "presets": { - "0": { - "description": "Une borne incendie est un point où les pompiers peuvent s’alimenter en eau. Elle peut être enterrée.", - "title": "Borne incendie" - } - }, - "tagRenderings": { - "hydrant-color": { - "mappings": { - "0": { - "then": "La borne est de couleur inconnue." - }, - "1": { - "then": "La borne est jaune." - }, - "2": { - "then": "La borne est rouge." - } - }, - "question": "Quelle est la couleur de la borne ?", - "render": "La borne est {colour}" - }, - "hydrant-state": { - "mappings": { - "0": { - "then": "La borne est en état, ou partiellement en état, de fonctionner." - }, - "1": { - "then": "La borne est hors-service." - }, - "2": { - "then": "La borne a été retirée." - } - }, - "question": "Mettre à jour l’état de la borne.", - "render": "État" - }, - "hydrant-type": { - "mappings": { - "0": { - "then": "La borne est de type inconnu." - }, - "1": { - "then": " Pilier." - }, - "2": { - "then": " Tuyau." - }, - "3": { - "then": " Mural." - }, - "4": { - "then": " Enterré." - } - }, - "question": "De quel type de borne s’agit-il ?", - "render": " Type de borne : {fire_hydrant:type}" - } - }, - "title": { - "render": "Bornes incendie" - } + "then": "L’élément englobant indique un accès libre
    {_embedding_feature:access:description}" }, "1": { - "description": "Couche des lances à incendie.", - "name": "Couche des extincteurs.", - "presets": { - "0": { - "description": "Un extincteur est un appareil portatif servant à éteindre un feu", - "title": "Extincteur" - } - }, - "tagRenderings": { - "extinguisher-location": { - "mappings": { - "0": { - "then": "Intérieur." - }, - "1": { - "then": "Extérieur." - } - }, - "question": "Où est-elle positionnée ?", - "render": "Emplacement : {location}" - } - }, - "title": { - "render": "Exctincteurs" - } + "then": "L’élément englobant indique qu’ une autorisation d’accès est nécessaire
    {_embedding_feature:access:description}" }, "2": { - "description": "Couche des stations de pompiers.", - "name": "Couche des stations de pompiers", - "presets": { - "0": { - "description": "Une caserne de pompiers est un lieu où les pompiers et leur équipements sont situés en dehors des missions.", - "title": "Caserne de pompiers" - } - }, - "tagRenderings": { - "station-agency": { - "mappings": { - "0": { - "then": "Brigade de Protection du Feu" - } - }, - "question": "Quel est l’exploitant de la station ?", - "render": "Cette station est opérée par {operator}." - }, - "station-name": { - "question": "Quel est le nom de la station ?", - "render": "Cette station s’appelle {name}." - }, - "station-operator": { - "mappings": { - "0": { - "then": "La station est opérée par le gouvernement." - }, - "1": { - "then": "La station est opérée par une organisation informelle." - }, - "2": { - "then": "La station est opérée par un groupe officiel de bénévoles." - }, - "3": { - "then": "La station est opérée par un groupe privé." - } - }, - "question": "Quel est le type d’exploitant ?", - "render": "L’exploitant est de type {operator:type}." - }, - "station-place": { - "question": "Dans quelle localité la station est-elle située ?", - "render": "La station fait partie de {addr:place}." - }, - "station-street": { - "question": " Quel est le nom de la rue dans lequel elle se situe ?", - "render": "La station fait partie de la {addr:street}." - } - }, - "title": { - "render": "Station de pompiers" - } + "then": "L’élément englobant indique que l’accès est réservés aux clients
    {_embedding_feature:access:description}" }, "3": { - "description": "Une station d’ambulance est un lieu où sont stockés les véhicules d’urgence ainsi que de l’équipement médical.", - "name": "Couche des ambulances", - "presets": { - "0": { - "description": "Ajouter une station d’ambulances à la carte", - "title": "Station d’ambulances" - } - }, - "tagRenderings": { - "ambulance-agency": { - "question": "Quel est l’exploitant de la station ?", - "render": "Cette station est opérée par {operator}." - }, - "ambulance-name": { - "question": "Quel est le nom de cette station ?", - "render": "Cette station s’appelle {name}." - }, - "ambulance-operator-type": { - "mappings": { - "0": { - "then": "La station est opérée par le gouvernement." - }, - "1": { - "then": "La station est opérée par une organisation informelle." - }, - "2": { - "then": "La station est opérée par un groupe officiel de bénévoles." - }, - "3": { - "then": "La station est opérée par un groupe privé." - } - }, - "question": "Quel est le type d’exploitant ?", - "render": "L’exploitant est de type {operator:type}." - }, - "ambulance-place": { - "question": "Dans quelle localité la station est-elle située ?", - "render": "La station fait partie de {addr:place}." - }, - "ambulance-street": { - "question": " Quel est le nom de la rue où la station se situe ?", - "render": "La station fait partie de {addr:street}." - } - }, - "title": { - "render": "Station d’ambulances" - } + "then": "L’élément englobant indique que l’accès est réservé aux membres
    {_embedding_feature:access:description}" } + } }, - "shortDescription": "Carte indiquant les bornes incendies, extincteurs, casernes de pompiers et ambulanciers.", - "title": "Bornes incendies, extincteurs, casernes de pompiers et ambulanciers." - }, - "maps": { - "description": "Sur cette carte sont affichées les cartes (plans) mappées dans OpenStreetMap.

    Si une carte est manquante, vous pouvez l'ajouer facilement avec un compte OpenStreetMap.", - "shortDescription": "Cette carte affiche toutes les cartes (plans) mappés dans OpenStreetMap", - "title": "Carte des cartes" - }, - "openwindpowermap": { - "description": "Une carte indiquant les éoliennes et permettant leur édition.", - "layers": { + "2": { + "mappings": { "0": { - "name": "Éolienne", - "presets": { - "0": { - "title": "Éolienne" - } - }, - "tagRenderings": { - "turbine-diameter": { - "question": "Quel est le diamètre du rotor en mètres ?", - "render": "Le diamètre du rotor est de {rotor:diameter} mètres." - }, - "turbine-height": { - "question": "Quelle est la hauteur totale de l’éolienne en mètres, pales incluses ?", - "render": "La hauteur totale, incluant les pales, est de {height} mètres." - }, - "turbine-operator": { - "question": "Qui est l’exploitant de cette éolienne ?", - "render": "Cette éolienne est opérée par {operator}." - }, - "turbine-output": { - "question": "Quel est la puissance générée par cette éolienne ?", - "render": "La puissance générée par cette éolienne est de {generator:output:electricity}." - }, - "turbine-start-date": { - "question": "Depuis quand l’éolienne est-elle en fonctionnement ?", - "render": "L’éolienne est active depuis {start_date}." - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "éolienne" - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " megawatts" - }, - "1": { - "human": " kilowatts" - }, - "2": { - "human": " watts" - }, - "3": { - "human": " gigawatts" - } - } - }, - "1": { - "applicableUnits": { - "0": { - "human": " mètres" - } - } - } - } + "then": "Libre d’accès" + }, + "1": { + "then": "Une autorisation est nécessaire" + }, + "2": { + "then": "Réservé aux clients" + }, + "3": { + "then": "Réservé aux membres" } + }, + "question": "Qui peut y accéder ?" }, - "title": "OpenWindPowerMap" + "4": { + "question": "Quelle est la longueur moyenne des voies en mètres ?", + "render": "Les voies font {canonical(climbing:length)} de long en moyenne" + }, + "5": { + "question": "Quel est le niveau de la voie la plus simple selon la classification franco-belge ?", + "render": "La difficulté minimale est {climbing:grade:french:min} selon la classification franco-belge" + }, + "6": { + "question": "Quel est le niveau de la voie la plus difficile selon la classification franco-belge ?", + "render": "La difficulté maximale est {climbing:grade:french:max} selon la classification franco-belge" + }, + "7": { + "mappings": { + "0": { + "then": "L’escalade de bloc est possible" + }, + "1": { + "then": "L’escalade de bloc n’est pas possible" + }, + "2": { + "then": "L’escalade de bloc est possible sur des voies précises" + }, + "3": { + "then": "Il y a {climbing:boulder} voies d’escalade de bloc" + } + }, + "question": "L’escalade de bloc est-elle possible ici ?" + }, + "8": { + "mappings": { + "0": { + "then": "L’escalade à la moulinette est possible" + }, + "1": { + "then": "L’escalade à la moulinette n’est pas possible" + }, + "2": { + "then": "{climbing:toprope} voies sont équipées de moulinettes" + } + }, + "question": "Est-il possible d’escalader à la moulinette ?" + } + }, + "units+": { + "0": { + "applicableUnits": { + "0": { + "human": " mètres" + }, + "1": { + "human": " pieds" + } + } + } + } }, - "personal": { - "description": "Crée un thème personnalisé basé sur toutes les couches disponibles de tous les thèmes", - "title": "Thème personnalisé" + "title": "Open Climbing Map" + }, + "cyclofix": { + "description": "Le but de cette carte est de présenter aux cyclistes une solution facile à utiliser pour trouver l'infrastructure appropriée à leurs besoins.

    Vous pouvez suivre votre localisation précise (mobile uniquement) et sélectionner les couches qui vous concernent dans le coin inférieur gauche. Vous pouvez également utiliser cet outil pour ajouter ou modifier des épingles (points d'intérêt) sur la carte et fournir plus de données en répondant aux questions.

    Toutes les modifications que vous apportez seront automatiquement enregistrées dans la base de données mondiale d'OpenStreetMap et peuvent être librement réutilisées par d'autres.

    Pour plus d'informations sur le projet cyclofix, rendez-vous sur cyclofix.osm.be.", + "title": "Cyclofix - Une carte ouverte pour les cyclistes" + }, + "drinking_water": { + "description": "Cette carte affiche les points d'accès public à de l'eau potable, et permet d'en ajouter facilement", + "title": "Eau potable" + }, + "facadegardens": { + "description": "Les jardins muraux en ville n’apportent pas seulement paix et tranquillité mais contribuent à embellir la ville, favoriser la biodiversité, régule la température et assainit l’air.
    Klimaan VZW et Mechelen Klimaatneutraal veulent cartographier les jardins muraux comme exemple pour les personnes souhaitant en construire ainsi que celles aimant la nature.
    Plus d’infos sur klimaan.be.", + "layers": { + "0": { + "description": "Jardins muraux", + "name": "Jardins muraux", + "presets": { + "0": { + "description": "Ajouter un jardin mural", + "title": "jardin mural" + } + }, + "tagRenderings": { + "facadegardens-description": { + "question": "Détails supplémentaires sur le jardin (si nécessaire et non décrit précédemment)", + "render": "Plus de détails : {description}" + }, + "facadegardens-direction": { + "question": "Quelle est l’orientation du jardin ?", + "render": "Orientation : {direction} (0 pour le Nord et 90 pour l’Ouest)" + }, + "facadegardens-edible": { + "mappings": { + "0": { + "then": "Il y a des plantes comestibles" + }, + "1": { + "then": "Il n’y a pas de plantes comestibles" + } + }, + "question": "Y-a-t’il des plantes comestibles ?" + }, + "facadegardens-plants": { + "mappings": { + "0": { + "then": "Il y a des plantes grimpantes" + }, + "1": { + "then": "Il y a des fleurs" + }, + "2": { + "then": "Il y a des buissons" + }, + "3": { + "then": "Il y a des plantes couvre-sol" + } + }, + "question": "Quel type de plantes pousse ici ?" + }, + "facadegardens-rainbarrel": { + "mappings": { + "0": { + "then": "Il y a des réserves" + }, + "1": { + "then": "Il n’y a pas de réserves" + } + }, + "question": "Des réserves d’eau ont-elles été installées pour le jardin ?" + }, + "facadegardens-start_date": { + "question": "Quand le jardin a-t’il été construit ? (L’année suffit)", + "render": "Date de construction du jardin : {start_date}" + }, + "facadegardens-sunshine": { + "mappings": { + "0": { + "then": "Le jardin est en plein soleil" + }, + "1": { + "then": "Le jardin est partiellement ensoleillé" + }, + "2": { + "then": "Le jardin est à l’ombre" + } + }, + "question": "Quel est l’ensoleillement du jardin ?" + } + }, + "title": { + "render": "Jardin mural" + } + } }, - "playgrounds": { - "description": "Cette carte affiche les aires de jeux et permet d'ajouter plus d'informations", - "shortDescription": "Une carte des aires de jeux", - "title": "Aires de jeux" + "shortDescription": "Cette carte indique les murs végétalisés avec des photos et des informations comme leur orientation, l’ensoleillement et le type de plantes.", + "title": "Facade gardens" + }, + "fritures": { + "layers": { + "0": { + "override": { + "name": "Friteries" + } + } }, - "shops": { - "description": "Sur cette carte, vous pouvez ajouter des informations sur les magasins, horaires d'ouverture et numéro de téléphone", - "shortDescription": "Carte modifiable affichant les informations de base des magasins", - "title": "Carte des magasins" + "title": "Carte des friteries" + }, + "ghostbikes": { + "description": "Les vélos fantômes sont des mémoriaux pour les cyclistes tuées sur la route, prenant la forme de vélos blancs placés à proximité des faits.

    Cette carte indique leur emplacement à partir d’OpenStreetMap. Il est possible de contribuer aux informations ici, sous réserve d’avoir un compte OpenStreetMap (gratuit).", + "title": "Vélo fantôme" + }, + "hailhydrant": { + "description": "Sur cette carte on trouve et met à jour les bornes incendies, extincteurs, casernes de pompiers et ambulanciers dans son quartier.
    Les options en haut à gauche permettent de localiser sa position (sur téléphone) et de filtrer les éléments. Il est possible d’utiliser cet outil pour ajouter et éditer les points d’intérêt de la carte et d’y ajouter des détails en répondant aux questions.
    Toutes les modifications sont automatiquement enregistrées dans la base de données OpenStreetMap et peuvent êtres librement réutilisées par d’autres.", + "layers": { + "0": { + "description": "Couche des bornes incendie.", + "name": "Carte des bornes incendie", + "presets": { + "0": { + "description": "Une borne incendie est un point où les pompiers peuvent s’alimenter en eau. Elle peut être enterrée.", + "title": "Borne incendie" + } + }, + "tagRenderings": { + "hydrant-color": { + "mappings": { + "0": { + "then": "La borne est de couleur inconnue." + }, + "1": { + "then": "La borne est jaune." + }, + "2": { + "then": "La borne est rouge." + } + }, + "question": "Quelle est la couleur de la borne ?", + "render": "La borne est {colour}" + }, + "hydrant-state": { + "mappings": { + "0": { + "then": "La borne est en état, ou partiellement en état, de fonctionner." + }, + "1": { + "then": "La borne est hors-service." + }, + "2": { + "then": "La borne a été retirée." + } + }, + "question": "Mettre à jour l’état de la borne." + }, + "hydrant-type": { + "mappings": { + "0": { + "then": "La borne est de type inconnu." + }, + "1": { + "then": " Pilier." + }, + "2": { + "then": " Tuyau." + }, + "3": { + "then": " Mural." + }, + "4": { + "then": " Enterré." + } + }, + "question": "De quel type de borne s’agit-il ?", + "render": " Type de borne : {fire_hydrant:type}" + } + }, + "title": { + "render": "Bornes incendie" + } + }, + "1": { + "description": "Couche des lances à incendie.", + "name": "Couche des extincteurs.", + "presets": { + "0": { + "description": "Un extincteur est un appareil portatif servant à éteindre un feu", + "title": "Extincteur" + } + }, + "tagRenderings": { + "extinguisher-location": { + "mappings": { + "0": { + "then": "Intérieur." + }, + "1": { + "then": "Extérieur." + } + }, + "question": "Où est-elle positionnée ?", + "render": "Emplacement : {location}" + } + }, + "title": { + "render": "Exctincteurs" + } + }, + "2": { + "description": "Couche des stations de pompiers.", + "name": "Couche des stations de pompiers", + "presets": { + "0": { + "description": "Une caserne de pompiers est un lieu où les pompiers et leur équipements sont situés en dehors des missions.", + "title": "Caserne de pompiers" + } + }, + "tagRenderings": { + "station-agency": { + "mappings": { + "0": { + "then": "Brigade de Protection du Feu" + } + }, + "question": "Quel est l’exploitant de la station ?", + "render": "Cette station est opérée par {operator}." + }, + "station-name": { + "question": "Quel est le nom de la station ?", + "render": "Cette station s’appelle {name}." + }, + "station-operator": { + "mappings": { + "0": { + "then": "La station est opérée par le gouvernement." + }, + "1": { + "then": "La station est opérée par une organisation informelle." + }, + "2": { + "then": "La station est opérée par un groupe officiel de bénévoles." + }, + "3": { + "then": "La station est opérée par un groupe privé." + } + }, + "question": "Quel est le type d’exploitant ?", + "render": "L’exploitant est de type {operator:type}." + }, + "station-place": { + "question": "Dans quelle localité la station est-elle située ?", + "render": "La station fait partie de {addr:place}." + }, + "station-street": { + "question": " Quel est le nom de la rue dans lequel elle se situe ?", + "render": "La station fait partie de la {addr:street}." + } + }, + "title": { + "render": "Station de pompiers" + } + }, + "3": { + "description": "Une station d’ambulance est un lieu où sont stockés les véhicules d’urgence ainsi que de l’équipement médical.", + "name": "Couche des ambulances", + "presets": { + "0": { + "description": "Ajouter une station d’ambulances à la carte", + "title": "Station d’ambulances" + } + }, + "tagRenderings": { + "ambulance-agency": { + "question": "Quel est l’exploitant de la station ?", + "render": "Cette station est opérée par {operator}." + }, + "ambulance-name": { + "question": "Quel est le nom de cette station ?", + "render": "Cette station s’appelle {name}." + }, + "ambulance-operator-type": { + "mappings": { + "0": { + "then": "La station est opérée par le gouvernement." + }, + "1": { + "then": "La station est opérée par une organisation informelle." + }, + "2": { + "then": "La station est opérée par un groupe officiel de bénévoles." + }, + "3": { + "then": "La station est opérée par un groupe privé." + } + }, + "question": "Quel est le type d’exploitant ?", + "render": "L’exploitant est de type {operator:type}." + }, + "ambulance-place": { + "question": "Dans quelle localité la station est-elle située ?", + "render": "La station fait partie de {addr:place}." + }, + "ambulance-street": { + "question": " Quel est le nom de la rue où la station se situe ?", + "render": "La station fait partie de {addr:street}." + } + }, + "title": { + "render": "Station d’ambulances" + } + } }, - "sport_pitches": { - "description": "Un terrain de sport est une zone faite pour pratiquer un sport", - "shortDescription": "Une carte montrant les terrains de sport", - "title": "Terrains de sport" + "shortDescription": "Carte indiquant les bornes incendies, extincteurs, casernes de pompiers et ambulanciers.", + "title": "Bornes incendies, extincteurs, casernes de pompiers et ambulanciers." + }, + "maps": { + "description": "Sur cette carte sont affichées les cartes (plans) mappées dans OpenStreetMap.

    Si une carte est manquante, vous pouvez l'ajouer facilement avec un compte OpenStreetMap.", + "shortDescription": "Cette carte affiche toutes les cartes (plans) mappés dans OpenStreetMap", + "title": "Carte des cartes" + }, + "openwindpowermap": { + "description": "Une carte indiquant les éoliennes et permettant leur édition.", + "layers": { + "0": { + "name": "Éolienne", + "presets": { + "0": { + "title": "Éolienne" + } + }, + "tagRenderings": { + "turbine-diameter": { + "question": "Quel est le diamètre du rotor en mètres ?", + "render": "Le diamètre du rotor est de {rotor:diameter} mètres." + }, + "turbine-height": { + "question": "Quelle est la hauteur totale de l’éolienne en mètres, pales incluses ?", + "render": "La hauteur totale, incluant les pales, est de {height} mètres." + }, + "turbine-operator": { + "question": "Qui est l’exploitant de cette éolienne ?", + "render": "Cette éolienne est opérée par {operator}." + }, + "turbine-output": { + "question": "Quel est la puissance générée par cette éolienne ?", + "render": "La puissance générée par cette éolienne est de {generator:output:electricity}." + }, + "turbine-start-date": { + "question": "Depuis quand l’éolienne est-elle en fonctionnement ?", + "render": "L’éolienne est active depuis {start_date}." + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "éolienne" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " megawatts" + }, + "1": { + "human": " kilowatts" + }, + "2": { + "human": " watts" + }, + "3": { + "human": " gigawatts" + } + } + }, + "1": { + "applicableUnits": { + "0": { + "human": " mètres" + } + } + } + } + } }, - "surveillance": { - "description": "Cette carte indique l’emplacement des caméras de surveillance.", - "shortDescription": "Caméras et autres dispositifs de surveillance", - "title": "Surveillance" - }, - "toilets": { - "description": "Carte affichant les WC et toilettes publiques", - "title": "Carte des WC et toilettes publiques" - }, - "trees": { - "description": "Cartographions tous les arbres !", - "shortDescription": "Carte des arbres", - "title": "Arbres" - } + "title": "OpenWindPowerMap" + }, + "personal": { + "description": "Crée un thème personnalisé basé sur toutes les couches disponibles de tous les thèmes", + "title": "Thème personnalisé" + }, + "playgrounds": { + "description": "Cette carte affiche les aires de jeux et permet d'ajouter plus d'informations", + "shortDescription": "Une carte des aires de jeux", + "title": "Aires de jeux" + }, + "shops": { + "description": "Sur cette carte, vous pouvez ajouter des informations sur les magasins, horaires d'ouverture et numéro de téléphone", + "shortDescription": "Carte modifiable affichant les informations de base des magasins", + "title": "Carte des magasins" + }, + "sport_pitches": { + "description": "Un terrain de sport est une zone faite pour pratiquer un sport", + "shortDescription": "Une carte montrant les terrains de sport", + "title": "Terrains de sport" + }, + "surveillance": { + "description": "Cette carte indique l’emplacement des caméras de surveillance.", + "shortDescription": "Caméras et autres dispositifs de surveillance", + "title": "Surveillance" + }, + "toilets": { + "description": "Carte affichant les WC et toilettes publiques", + "title": "Carte des WC et toilettes publiques" + }, + "trees": { + "description": "Cartographions tous les arbres !", + "shortDescription": "Carte des arbres", + "title": "Arbres" + } } \ No newline at end of file diff --git a/langs/themes/gl.json b/langs/themes/gl.json index 907a31cae9..652320aced 100644 --- a/langs/themes/gl.json +++ b/langs/themes/gl.json @@ -1,13 +1,13 @@ { - "cyclofix": { - "description": "O obxectivo deste mapa é amosar ós ciclistas unha solución doada de empregar para atopar a infraestrutura axeitada para as súas necesidades.

    Podes obter a túa localización precisa (só para dispositivos móbiles) e escoller as capas que sexan relevantes para ti na esquina inferior esquerda. Tamén podes empregar esta ferramenta para engadir ou editar puntos de interese ó mapa e fornecer máis datos respondendo as cuestións.

    Todas as modificacións que fagas serán gardadas de xeito automático na base de datos global do OpenStreetMap e outros poderán reutilizalos libremente.

    Para máis información sobre o proxecto cyclofix, vai a cyclofix.osm.be.", - "title": "Cyclofix - Un mapa aberto para os ciclistas" - }, - "ghostbikes": { - "title": "Bicicleta pantasma" - }, - "personal": { - "description": "Crea un tema baseado en todas as capas dispoñíbeis de todos os temas", - "title": "Tema personalizado" - } + "cyclofix": { + "description": "O obxectivo deste mapa é amosar ós ciclistas unha solución doada de empregar para atopar a infraestrutura axeitada para as súas necesidades.

    Podes obter a túa localización precisa (só para dispositivos móbiles) e escoller as capas que sexan relevantes para ti na esquina inferior esquerda. Tamén podes empregar esta ferramenta para engadir ou editar puntos de interese ó mapa e fornecer máis datos respondendo as cuestións.

    Todas as modificacións que fagas serán gardadas de xeito automático na base de datos global do OpenStreetMap e outros poderán reutilizalos libremente.

    Para máis información sobre o proxecto cyclofix, vai a cyclofix.osm.be.", + "title": "Cyclofix - Un mapa aberto para os ciclistas" + }, + "ghostbikes": { + "title": "Bicicleta pantasma" + }, + "personal": { + "description": "Crea un tema baseado en todas as capas dispoñíbeis de todos os temas", + "title": "Tema personalizado" + } } \ No newline at end of file diff --git a/langs/themes/hu.json b/langs/themes/hu.json index 202f0811d0..18b688c24c 100644 --- a/langs/themes/hu.json +++ b/langs/themes/hu.json @@ -1,11 +1,11 @@ { - "aed": { - "title": "Nyílt AED Térkép" - }, - "artwork": { - "title": "Nyít Műalkotás Térkép" - }, - "ghostbikes": { - "title": "Emlékkerékpár" - } + "aed": { + "title": "Nyílt AED Térkép" + }, + "artwork": { + "title": "Nyít Műalkotás Térkép" + }, + "ghostbikes": { + "title": "Emlékkerékpár" + } } \ No newline at end of file diff --git a/langs/themes/id.json b/langs/themes/id.json index 8fd97982c5..e07cf79729 100644 --- a/langs/themes/id.json +++ b/langs/themes/id.json @@ -1,127 +1,147 @@ { - "aed": { - "description": "Di peta ini, seseorang dapat menemukan dan menandai defibrillator terdekat", - "title": "Buka Peta AED" - }, - "artwork": { - "description": "Selamat datang di Open Artwork Map, peta untuk patung, grafiti, dan karya seni lain di seluruh dunia", - "title": "Buka Peta Karya Seni" - }, - "campersite": { - "layers": { - "0": { - "tagRenderings": { - "caravansites-fee": { - "mappings": { - "1": { - "then": "Boleh digunakan tanpa bayaran" - } - } - }, - "caravansites-internet": { - "mappings": { - "0": { - "then": "Akses Web tersedia" - }, - "1": { - "then": "Akses Web tersedia" - }, - "2": { - "then": "Tiada akses Web" - } - }, - "question": "Tempat ini berbagi akses Web?" - }, - "caravansites-name": { - "question": "Apakah nama tempat ini?" - }, - "caravansites-toilets": { - "mappings": { - "0": { - "then": "Tempat sini ada tandas" - }, - "1": { - "then": "Tempat sini tiada tandas" - } - } - }, - "caravansites-website": { - "question": "Tempat sini terada situs web?", - "render": "Situs resmi: {website}" - } - } + "aed": { + "description": "Di peta ini, seseorang dapat menemukan dan menandai defibrillator terdekat", + "title": "Buka Peta AED" + }, + "artwork": { + "description": "Selamat datang di Open Artwork Map, peta untuk patung, grafiti, dan karya seni lain di seluruh dunia", + "title": "Buka Peta Karya Seni" + }, + "benches": { + "title": "Bangku" + }, + "cafes_and_pubs": { + "title": "Kafe dan pub" + }, + "campersite": { + "layers": { + "0": { + "tagRenderings": { + "caravansites-fee": { + "mappings": { + "1": { + "then": "Boleh digunakan tanpa bayaran" + } } - }, - "overrideAll": { - "tagRenderings+": { - "1": { - "mappings": { - "0": { - "then": "Tempat ini memiliki catu daya" - }, - "1": { - "then": "Tempat ini tidak memiliki sumber listrik" - } - } - } + }, + "caravansites-internet": { + "mappings": { + "0": { + "then": "Akses Web tersedia" + }, + "1": { + "then": "Akses Web tersedia" + }, + "2": { + "then": "Tiada akses Web" + } + }, + "question": "Tempat ini berbagi akses Web?" + }, + "caravansites-name": { + "question": "Apakah nama tempat ini?" + }, + "caravansites-toilets": { + "mappings": { + "0": { + "then": "Tempat sini ada tandas" + }, + "1": { + "then": "Tempat sini tiada tandas" + } } + }, + "caravansites-website": { + "question": "Tempat sini terada situs web?", + "render": "Situs resmi: {website}" + } } + } }, - "charging_stations": { - "title": "Stasiun pengisian daya" - }, - "climbing": { - "layers": { + "overrideAll": { + "tagRenderings+": { + "1": { + "mappings": { "0": { - "tagRenderings": { - "climbing_club-name": { - "render": "{name}" - } - } + "then": "Tempat ini memiliki catu daya" }, "1": { - "tagRenderings": { - "name": { - "render": "{name}" - } - } - }, - "2": { - "tagRenderings": { - "Name": { - "render": "{name}" - } - } - }, - "3": { - "tagRenderings": { - "name": { - "render": "{name}" - } - } - }, - "4": { - "tagRenderings": { - "climbing-opportunity-name": { - "render": "{name}" - } - } - } - } - }, - "hailhydrant": { - "layers": { - "0": { - "tagRenderings": { - "hydrant-type": { - "mappings": { - "3": { - "then": " Jenis dinding." - } - } - } - } + "then": "Tempat ini tidak memiliki sumber listrik" } + } } + } } + }, + "charging_stations": { + "title": "Stasiun pengisian daya" + }, + "climbing": { + "layers": { + "0": { + "tagRenderings": { + "climbing_club-name": { + "render": "{name}" + } + } + }, + "1": { + "tagRenderings": { + "name": { + "render": "{name}" + } + } + }, + "2": { + "tagRenderings": { + "Name": { + "render": "{name}" + } + } + }, + "3": { + "tagRenderings": { + "name": { + "render": "{name}" + } + } + }, + "4": { + "tagRenderings": { + "climbing-opportunity-name": { + "render": "{name}" + } + } + } + } + }, + "hailhydrant": { + "layers": { + "0": { + "tagRenderings": { + "hydrant-type": { + "mappings": { + "3": { + "then": " Jenis dinding." + } + } + } + } + } + } + }, + "trees": { + "title": "Pohon" + }, + "uk_addresses": { + "description": "Berkontribusi untuk OpenStreetMap dengan mengisi informasi alamat", + "layers": { + "1": { + "title": { + "render": "Alamat yang diketahui" + } + } + }, + "title": "Alamat Inggris" + } } \ No newline at end of file diff --git a/langs/themes/it.json b/langs/themes/it.json index ba7383d7aa..ece0994328 100644 --- a/langs/themes/it.json +++ b/langs/themes/it.json @@ -1,1290 +1,1131 @@ { - "aed": { - "description": "Su questa mappa puoi trovare e segnalare i defibrillatori nelle vicinanze", - "title": "Mappa dei defibrillatori (DAE)" - }, - "artwork": { - "description": "Benvenuto/a sulla mappa libera dell’arte, una mappa delle statue, i busti, i graffiti e le altre realizzazioni artistiche di tutto il mondo", - "title": "Mappa libera delle opere d'arte" - }, - "benches": { - "description": "Questa mappa mostra tutte le panchine che sono state aggiunte su OpenStreetMap: panchine individuali e quelle alle fermate del trasporto pubblico o nei ripari. Se disponi di un account OpenStreetMap puoi mappare delle nuove panchine o modificare i dettagli di quelle esistenti.", - "shortDescription": "Una mappa delle panchine", - "title": "Panchine" - }, - "bicyclelib": { - "description": "«Biciclette in prestito» è un luogo dove le biciclette possono essere prese in prestito, spesso in cambio di un piccolo contributo annuale. Un caso degno di nota è quello delle biciclette in prestito per bambini che permettono loro di cambiare le dimensioni della propria bici quando quella attuale diventa troppo piccola", - "title": "Biciclette in prestito" - }, - "binoculars": { - "description": "Una cartina dei binocoli su un palo fissi in un luogo. Si trovano tipicamente nei luoghi turistici, nei belvedere, in cima a torri panoramiche oppure occasionalmente nelle riserve naturali.", - "shortDescription": "Una cartina dei binocoli pubblici fissi", - "title": "Binocoli" - }, - "bookcases": { - "description": "Una minibiblioteca è una piccola cabina a lato della strada, una scatola, una vecchia cabina telefonica o qualche altro contenitore che ospita libri. Tutti può lasciare o prendere un libro. Questa mappa punta a rappresentarle tutte. Puoi facilmente scoprire nuove minibiblioteche nelle tue vicinanze e, con un account gratuito su OpenStreetMap, puoi aggiungerne altre.", - "title": "Mappa libera delle microbiblioteche" - }, - "cafes_and_pubs": { - "title": "Caffè e pub" - }, - "campersite": { - "description": "Questo sito raccoglie tutti i luoghi ufficiali dove sostare con il camper e aree dove è possibile scaricare acque grigie e nere. Puoi aggiungere dettagli riguardanti i servizi forniti e il loro costo. Aggiungi foto e recensioni. Questo è al contempo un sito web e una web app. I dati sono memorizzati su OpenStreetMap in modo tale che siano per sempre liberi e riutilizzabili da qualsiasi app.", - "layers": { + "aed": { + "description": "Su questa mappa puoi trovare e segnalare i defibrillatori nelle vicinanze", + "title": "Mappa dei defibrillatori (DAE)" + }, + "artwork": { + "description": "Benvenuto/a sulla mappa libera dell’arte, una mappa delle statue, i busti, i graffiti e le altre realizzazioni artistiche di tutto il mondo", + "title": "Mappa libera delle opere d'arte" + }, + "benches": { + "description": "Questa mappa mostra tutte le panchine che sono state aggiunte su OpenStreetMap: panchine individuali e quelle alle fermate del trasporto pubblico o nei ripari. Se disponi di un account OpenStreetMap puoi mappare delle nuove panchine o modificare i dettagli di quelle esistenti.", + "shortDescription": "Una mappa delle panchine", + "title": "Panchine" + }, + "bicyclelib": { + "description": "«Biciclette in prestito» è un luogo dove le biciclette possono essere prese in prestito, spesso in cambio di un piccolo contributo annuale. Un caso degno di nota è quello delle biciclette in prestito per bambini che permettono loro di cambiare le dimensioni della propria bici quando quella attuale diventa troppo piccola", + "title": "Biciclette in prestito" + }, + "binoculars": { + "description": "Una cartina dei binocoli su un palo fissi in un luogo. Si trovano tipicamente nei luoghi turistici, nei belvedere, in cima a torri panoramiche oppure occasionalmente nelle riserve naturali.", + "shortDescription": "Una cartina dei binocoli pubblici fissi", + "title": "Binocoli" + }, + "bookcases": { + "description": "Una minibiblioteca è una piccola cabina a lato della strada, una scatola, una vecchia cabina telefonica o qualche altro contenitore che ospita libri. Tutti può lasciare o prendere un libro. Questa mappa punta a rappresentarle tutte. Puoi facilmente scoprire nuove minibiblioteche nelle tue vicinanze e, con un account gratuito su OpenStreetMap, puoi aggiungerne altre.", + "title": "Mappa libera delle microbiblioteche" + }, + "cafes_and_pubs": { + "title": "Caffè e pub" + }, + "campersite": { + "description": "Questo sito raccoglie tutti i luoghi ufficiali dove sostare con il camper e aree dove è possibile scaricare acque grigie e nere. Puoi aggiungere dettagli riguardanti i servizi forniti e il loro costo. Aggiungi foto e recensioni. Questo è al contempo un sito web e una web app. I dati sono memorizzati su OpenStreetMap in modo tale che siano per sempre liberi e riutilizzabili da qualsiasi app.", + "layers": { + "0": { + "description": "Aree camper", + "name": "Aree camper", + "presets": { + "0": { + "description": "Aggiungi una nuova area di sosta ufficiale per camper. Si tratta di aree destinate alla sosta notturna dei camper. Potrebbe trattarsi di luoghi di campeggio o semplici parcheggi. Potrebbero anche non essere segnalati sul posto, ma semplicemente indicati in una delibera comunale. Un parcheggio destinato ai camper in cui non è però consentito trascorrere la notte -non- va considerato un'area di sosta per camper. ", + "title": "luogo di campeggio" + } + }, + "tagRenderings": { + "caravansites-capacity": { + "question": "Quanti camper possono stare qua? (non rispondere se non c’è un numero chario di spazi o veicoli ammessi)", + "render": "{capacity} camper possono usare questo luogo al contempo" + }, + "caravansites-charge": { + "question": "Quanto costa questo luogo?", + "render": "Questo luogo costa {charge}" + }, + "caravansites-description": { + "question": "Desideri aggiungere una descrizione del luogo? (Non vanno ripetute informazioni già richieste e mostrate precedentemente. Si prega di attenersi a dati oggettivi - le opinioni vanno nelle recensioni)", + "render": "Maggiori dettagli su questo luogo: {description}" + }, + "caravansites-fee": { + "mappings": { + "0": { + "then": "Devi pagare per usarlo" + }, + "1": { + "then": "Può essere usato gratuitamente" + } + }, + "question": "Ha una tariffa questo luogo?" + }, + "caravansites-internet": { + "mappings": { + "0": { + "then": "C’è l’accesso a internet" + }, + "1": { + "then": "C’è l’accesso a internet" + }, + "2": { + "then": "Non c’è l’accesso a internet" + } + }, + "question": "Questo luogo ha l’accesso a internet?" + }, + "caravansites-internet-fee": { + "mappings": { + "0": { + "then": "Occorre pagare un extra per avere l’accesso a internet" + }, + "1": { + "then": "Non occorre pagare per l’accesso a internet" + } + }, + "question": "Occorre pagare per avere l’accesso a internet?" + }, + "caravansites-long-term": { + "mappings": { + "0": { + "then": "Sì, ci sono spazi per il noleggio a lungo termine, ma puoi anche pagare per singola giornata" + }, + "1": { + "then": "No, non ci sono ospiti a lungo termine qui" + }, + "2": { + "then": "Puoi soggiornare qui solo se hai un contratto a lungo termine (se selezioni questa opzione, questo luogo sarà rimosso da questa mappa)" + } + }, + "question": "Questo luogo offre spazi per il noleggio a lungo termine?" + }, + "caravansites-name": { + "question": "Come viene chiamato questo luogo?", + "render": "Questo luogo è chiamato {name}" + }, + "caravansites-sanitary-dump": { + "mappings": { + "0": { + "then": "Questo luogo ha una stazione per lo scarico delle acque" + }, + "1": { + "then": "Questo luogo non ha una stazione per lo scarico delle acque" + } + }, + "question": "Questo luogo ha una stazione per lo scarico delle acque?" + }, + "caravansites-toilets": { + "mappings": { + "0": { + "then": "Questo luogo ha i servizi igienici" + }, + "1": { + "then": "Questo luogo non ha i servizi igienici" + } + }, + "question": "Questo luogo dispone di servizi igienici?" + }, + "caravansites-website": { + "question": "Questo luogo ha un sito web?", + "render": "Sito web ufficiale: {website}" + } + }, + "title": { + "mappings": { "0": { - "description": "Aree camper", - "name": "Aree camper", - "presets": { - "0": { - "description": "Aggiungi una nuova area di sosta ufficiale per camper. Si tratta di aree destinate alla sosta notturna dei camper. Potrebbe trattarsi di luoghi di campeggio o semplici parcheggi. Potrebbero anche non essere segnalati sul posto, ma semplicemente indicati in una delibera comunale. Un parcheggio destinato ai camper in cui non è però consentito trascorrere la notte -non- va considerato un'area di sosta per camper. ", - "title": "luogo di campeggio" - } - }, - "tagRenderings": { - "caravansites-capacity": { - "question": "Quanti camper possono stare qua? (non rispondere se non c’è un numero chario di spazi o veicoli ammessi)", - "render": "{capacity} camper possono usare questo luogo al contempo" - }, - "caravansites-charge": { - "question": "Quanto costa questo luogo?", - "render": "Questo luogo costa {charge}" - }, - "caravansites-description": { - "question": "Desideri aggiungere una descrizione del luogo? (Non vanno ripetute informazioni già richieste e mostrate precedentemente. Si prega di attenersi a dati oggettivi - le opinioni vanno nelle recensioni)", - "render": "Maggiori dettagli su questo luogo: {description}" - }, - "caravansites-fee": { - "mappings": { - "0": { - "then": "Devi pagare per usarlo" - }, - "1": { - "then": "Può essere usato gratuitamente" - } - }, - "question": "Ha una tariffa questo luogo?" - }, - "caravansites-internet": { - "mappings": { - "0": { - "then": "C’è l’accesso a internet" - }, - "1": { - "then": "C’è l’accesso a internet" - }, - "2": { - "then": "Non c’è l’accesso a internet" - } - }, - "question": "Questo luogo ha l’accesso a internet?" - }, - "caravansites-internet-fee": { - "mappings": { - "0": { - "then": "Occorre pagare un extra per avere l’accesso a internet" - }, - "1": { - "then": "Non occorre pagare per l’accesso a internet" - } - }, - "question": "Occorre pagare per avere l’accesso a internet?" - }, - "caravansites-long-term": { - "mappings": { - "0": { - "then": "Sì, ci sono spazi per il noleggio a lungo termine, ma puoi anche pagare per singola giornata" - }, - "1": { - "then": "No, non ci sono ospiti a lungo termine qui" - }, - "2": { - "then": "Puoi soggiornare qui solo se hai un contratto a lungo termine (se selezioni questa opzione, questo luogo sarà rimosso da questa mappa)" - } - }, - "question": "Questo luogo offre spazi per il noleggio a lungo termine?" - }, - "caravansites-name": { - "question": "Come viene chiamato questo luogo?", - "render": "Questo luogo è chiamato {name}" - }, - "caravansites-sanitary-dump": { - "mappings": { - "0": { - "then": "Questo luogo ha una stazione per lo scarico delle acque" - }, - "1": { - "then": "Questo luogo non ha una stazione per lo scarico delle acque" - } - }, - "question": "Questo luogo ha una stazione per lo scarico delle acque?" - }, - "caravansites-toilets": { - "mappings": { - "0": { - "then": "Questo luogo ha i servizi igienici" - }, - "1": { - "then": "Questo luogo non ha i servizi igienici" - } - }, - "question": "Questo luogo dispone di servizi igienici?" - }, - "caravansites-website": { - "question": "Questo luogo ha un sito web?", - "render": "Sito web ufficiale: {website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Area camper senza nome" - } - }, - "render": "Area camper {name}" - } - }, - "1": { - "description": "Luoghi di sversamento delle acque reflue", - "name": "Luoghi di sversamento delle acque reflue", - "presets": { - "0": { - "description": "Aggiungi un nuovo luogo di sversamento delle acque reflue. Si tratta di luoghi dove chi viaggia in camper può smaltire le acque grigie o le acque nere. Spesso forniscono anche acqua ed elettricità.", - "title": "luogo di sversamento delle acque reflue" - } - }, - "tagRenderings": { - "dumpstations-access": { - "mappings": { - "0": { - "then": "Servono una chiave o un codice di accesso" - }, - "1": { - "then": "È obbligatorio essere un cliente di questo campeggio o di questa area camper" - }, - "2": { - "then": "Chiunque può farne uso" - }, - "3": { - "then": "Chiunque può farne uso" - } - }, - "question": "Chi può utilizzare questo luogo di sversamento?" - }, - "dumpstations-charge": { - "question": "Qual è la tariffa di questo luogo?", - "render": "Ha una tariffa di {charge}" - }, - "dumpstations-chemical-waste": { - "mappings": { - "0": { - "then": "È possibile smaltire le acque del WC chimico qui" - }, - "1": { - "then": "Non è possibile smaltire le acque del WC chimico qui" - } - }, - "question": "È possibile smaltire le acque del WC chimico qui?" - }, - "dumpstations-fee": { - "mappings": { - "0": { - "then": "A pagamento" - }, - "1": { - "then": "È gratuito" - } - }, - "question": "Questo luogo è a pagamento?" - }, - "dumpstations-grey-water": { - "mappings": { - "0": { - "then": "Si possono smaltire le acque grigie qui" - }, - "1": { - "then": "Non si possono smaltire le acque grigie qui" - } - }, - "question": "Si possono smaltire le acque grigie qui?" - }, - "dumpstations-network": { - "question": "Di quale rete fa parte questo luogo? (se non fa parte di nessuna rete, salta)", - "render": "Questo luogo è parte della rete {network}" - }, - "dumpstations-waterpoint": { - "mappings": { - "0": { - "then": "Questo luogo ha un punto per l'approvvigionamento di acqua" - }, - "1": { - "then": "Questo luogo non ha un punto per l'approvvigionamento di acqua" - } - }, - "question": "Questo luogo ha un punto per l'approvvigionamento di acqua?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Luogo di sversamento" - } - }, - "render": "Luogo di sversamento {name}" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "Chi gestisce questo luogo?", - "render": "Questo luogo è gestito da {operator}" - }, - "1": { - "mappings": { - "0": { - "then": "Questo luogo fornisce corrente elettrica" - }, - "1": { - "then": "Questo luogo non fornisce corrente elettrica" - } - }, - "question": "Questo luogo fornisce corrente elettrica?" - } - } - }, - "shortDescription": "Trova aree dove passare la notte con il tuo camper", - "title": "Aree camper" - }, - "charging_stations": { - "description": "Su questa mappa aperta, puoi individuare le stazioni di ricarica o aggiungere informazioni", - "shortDescription": "Una mappa mondiale delle stazioni di ricarica", - "title": "Stazioni di ricarica" - }, - "climbing": { - "description": "In questa cartina puoi trovare vari luoghi per arrampicata come ad esempio palestre di arrampicata, sale di pratica e rocce naturali.", - "descriptionTail": "La cartina di arrampicata è stata originariamente creata da Christian Neumann. Si prega di scrivere qua se si hanno commenti o domande da fare.

    Il progetto usa i dati del progetto OpenStreetMap.

    ", - "layers": { - "0": { - "description": "Un club o associazione di arrampacata", - "name": "Club di arrampicata", - "presets": { - "0": { - "description": "Un club di arrampicata", - "title": "Club di arrampicata" - }, - "1": { - "description": "Un’associazione che ha a che fare con l’arrampicata", - "title": "Associazione di arrampicata" - } - }, - "tagRenderings": { - "climbing_club-name": { - "question": "Qual è il nome di questo club o associazione di arrampicata?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Associazione di arrampicata" - } - }, - "render": "Club di arrampicata" - } - }, - "1": { - "description": "Una palestra di arrampicata", - "name": "Palestre di arrampicata", - "tagRenderings": { - "name": { - "question": "Qual è il nome di questa palestra di arrampicata?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Palestra di arrampicata {name}" - } - }, - "render": "Palestra di arrampicata" - } - }, - "2": { - "name": "Vie di arrampicata", - "presets": { - "0": { - "title": "Via di arrampicata" - } - }, - "tagRenderings": { - "Bolts": { - "mappings": { - "0": { - "then": "In questo percorso non sono presenti bulloni" - }, - "1": { - "then": "In questo percorso non sono presenti bulloni" - } - }, - "question": "Quanti bulloni sono presenti in questo percorso prima di arrivare alla moulinette?", - "render": "Questo percorso ha {climbing:bolts} bulloni" - }, - "Difficulty": { - "question": "Qual è la difficoltà di questa via di arrampicata nel sistema francese/belga?", - "render": "Il grado di difficoltà è {climbing:grade:french} nel sistema francese/belga" - }, - "Length": { - "question": "Quanto è lunga questa via di arrampicata (in metri)?", - "render": "Questo percorso è lungo {canonical(climbing:length)}" - }, - "Name": { - "mappings": { - "0": { - "then": "Questa via di arrampicata non ha un nome" - } - }, - "question": "Come si chiama questa via di arrampicata?", - "render": "{name}" - }, - "Rock type": { - "render": "Il tipo di roccia è {_embedding_features_with_rock:rock} come dichiarato sul muro circostante" - } - }, - "title": { - "mappings": { - "0": { - "then": "Via di arrampicata {name}" - } - }, - "render": "Via di arrampicata" - } - }, - "3": { - "description": "Un’opportunità di arrampicata", - "name": "Opportunità di arrampicata", - "presets": { - "0": { - "description": "Un’opportunità di arrampicata", - "title": "Opportunità di arrampicata" - } - }, - "tagRenderings": { - "Containe {_contained_climbing_routes_count} routes": { - "render": "

    Contiene {_contained_climbing_routes_count} vie

      {_contained_climbing_routes}
    " - }, - "Contained routes hist": { - "render": "

    Riassunto delle difficoltà

    {histogram(_difficulty_hist)}" - }, - "Contained routes length hist": { - "render": "

    Riassunto della lunghezza

    {histogram(_length_hist)}" - }, - "Rock type (crag/rock/cliff only)": { - "mappings": { - "0": { - "then": "Calcare" - } - }, - "question": "Qual è il tipo di roccia qua?", - "render": "Il tipo di roccia è {rock}" - }, - "Type": { - "mappings": { - "0": { - "then": "Un masso per arrampicata (una singola roccia o falesia con una o poche vie di arrampicata che possono essere scalate in sicurezza senza una corda)" - }, - "1": { - "then": "Un muro da arrampicata (un singolo masso o falesia con almeno qualche via per arrampicata)" - } - } - }, - "name": { - "mappings": { - "0": { - "then": "Questa opportunità di arrampicata non ha un nome" - } - }, - "question": "Qual è il nome di questa opportunità di arrampicata?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Muro da arrampicata {name}" - }, - "1": { - "then": "Area di arrampicata {name}" - }, - "2": { - "then": "Sito di arrampicata" - }, - "3": { - "then": "Opportunità di arrampicata {name}" - } - }, - "render": "Opportunità di arrampicata" - } - }, - "4": { - "description": "Un’opportunità di arrampicata?", - "name": "Opportunità di arrampicata?", - "tagRenderings": { - "climbing-opportunity-name": { - "render": "{name}" - }, - "climbing-possible": { - "mappings": { - "0": { - "then": "Non è possibile arrampicarsi qua" - }, - "1": { - "then": "È possibile arrampicarsi qua" - }, - "2": { - "then": "Non è possibile arrampicarsi qua" - } - }, - "question": "È possibile arrampicarsi qua?" - } - }, - "title": { - "render": "Opportunità di arrampicata?" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "C’è un sito web (anche non ufficiale) con qualche informazione in più (ad es. topografie)?" - }, - "1": { - "mappings": { - "0": { - "then": "L’ elemento in cui è contenuto indica che è pubblicamente accessibile
    {_embedding_feature:access:description}" - }, - "1": { - "then": "L’elemento che lo contiene indica che è richiesto un’autorizzazione per accedervi
    {_embedding_feature:access:description}" - }, - "2": { - "then": "L’ elemento che lo contiene indica che è accessibile solo ai clienti
    {_embedding_feature:access:description}" - }, - "3": { - "then": "L’ elemento che lo contiene indica che è accessibile solamente ai membri del club
    {_embedding_feature:access:description}" - } - } - }, - "2": { - "mappings": { - "0": { - "then": "Pubblicamente accessibile a chiunque" - }, - "1": { - "then": "È necessario avere un’autorizzazione per entrare" - }, - "2": { - "then": "Riservato ai clienti" - }, - "3": { - "then": "Riservato ai membri del club" - } - }, - "question": "Chi può accedervi?" - }, - "4": { - "question": "Quale è la lunghezza (media) delle vie in metri?", - "render": "Le vie sono lunghe mediamente {canonical(climbing:length)}" - }, - "5": { - "question": "Qual è il livello della via più facile qua, secondo il sistema di classificazione francese?", - "render": "Il minimo livello di difficoltà è {climbing:grade:french:min} secondo il sistema francese/belga" - }, - "6": { - "question": "Qual è il livello della via più difficile qua, secondo il sistema di classificazione francese?", - "render": "Il massimo livello di difficoltà è {climbing:grade:french:max} secondo il sistema francese/belga" - }, - "7": { - "mappings": { - "0": { - "then": "L’arrampicata su massi è possibile qua" - }, - "1": { - "then": "L’arrampicata su massi non è possibile qua" - }, - "2": { - "then": "L’arrampicata su massi è possibile anche se su poche vie" - }, - "3": { - "then": "Sono presenti {climbing:boulder} vie di arrampicata su massi" - } - }, - "question": "È possibile praticare ‘bouldering’ qua?" - }, - "8": { - "mappings": { - "0": { - "then": "È possibile arrampicarsi con moulinette qua" - }, - "1": { - "then": "Non è possibile arrampicarsi con moulinette qua" - }, - "2": { - "then": "Sono presenti {climbing:toprope} vie con moulinette" - } - }, - "question": "È possibile arrampicarsi con la corda dall’alto qua?" - }, - "9": { - "mappings": { - "0": { - "then": "L’arrampicata sportiva è possibile qua" - }, - "1": { - "then": "L’arrampicata sportiva non è possibile qua" - }, - "2": { - "then": "Sono presenti {climbing:sport} vie di arrampicata sportiva" - } - }, - "question": "È possibile arrampicarsi qua con ancoraggi fissi?" - }, - "10": { - "mappings": { - "0": { - "then": "L’arrampicata tradizionale è possibile qua" - }, - "1": { - "then": "L’arrampicata tradizionale non è possibile qua" - }, - "2": { - "then": "Sono presenti {climbing:traditional} vie di arrampicata tradizionale" - } - }, - "question": "È possibile arrampicarsi in maniera tradizionale qua (usando attrezzi propri, ad es. dadi)?" - }, - "11": { - "mappings": { - "0": { - "then": "È presente una parete per l’arrampicata di velocità" - }, - "1": { - "then": "Non è presente una parete per l’arrampicata di velocità" - }, - "2": { - "then": "Sono presenti {climbing:speed} pareti per l’arrampicata di velocità" - } - }, - "question": "È presente una prete per l’arrampicata di velocità?" - } - }, - "units+": { - "0": { - "applicableUnits": { - "0": { - "human": " metri" - }, - "1": { - "human": " piedi" - } - } - } - } - }, - "title": "Mappa aperta per le arrampicate" - }, - "cycle_highways": { - "description": "Questa cartina mostra le strade per velocipedi", - "layers": { - "0": { - "name": "strade per velocipedi", - "title": { - "render": "strada per velocipedi" - } - } - }, - "title": "Strade per velocipedi" - }, - "cycle_infra": { - "description": "Una cartina dove vedere e modificare gli elementi riguardanti l’infrastruttura dei velocipedi. Realizzata durante #osoc21.", - "shortDescription": "Una cartina dove vedere e modificare gli elementi riguardanti l’infrastruttura dei velocipedi.", - "title": "Infrastruttura dei velocipedi" - }, - "cyclestreets": { - "description": "Una strada ciclabile è una strada dove il traffico motorizzato non può superare i velocipedi. La sua presenza è segnalata da un cartello stradale specifico. Le strade ciclabili sono diffuse in Olanda e Belgio, ma si possono trovare anche in Germania e in Francia. ", - "layers": { - "0": { - "description": "Una strada ciclabile è una strada in cui i veicoli a motore non possono sorpassare le persone in bicicletta", - "name": "Strade ciclabili" - }, - "1": { - "description": "Questa strada diventerà presto una strada ciclabile", - "name": "Futura strada ciclabile", - "title": { - "mappings": { - "0": { - "then": "{name} diventerà presto una strada ciclabile" - } - }, - "render": "Futura strada ciclabile" - } - }, - "2": { - "description": "Livello per contrassegnare tutte le strade come strade ciclabili", - "name": "Tutte le strade", - "title": { - "render": "Strada" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "mappings": { - "0": { - "then": "Questa è una strada ciclabile (e ha un limite di velocità massima di 30 km/h)" - }, - "1": { - "then": "Questa è una strada ciclabile" - }, - "2": { - "then": "Diverrà tra poco una strada ciclabile" - }, - "3": { - "then": "Questa strada non è una strada ciclabile" - } - }, - "question": "È una strada ciclabile?" - }, - "1": { - "question": "Questa strada diventerà una strada ciclabile quando?", - "render": "Questa strada diventerà una strada ciclabile dal {cyclestreet:start_date}" - } - } - }, - "shortDescription": "Una cartina per le strade ciclabili", - "title": "Strade ciclabili" - }, - "cyclofix": { - "description": "Questa mappa offre a chi va in bici una soluzione semplice per trovare tutte le infrastrutture di cui ha bisogno.

    Puoi tracciare la tua posizione esatta (solo su mobile) e selezionare i livelli che ti interessano nell'angolo in basso a sinistra. Puoi anche usare questo strumento per aggiungere o modificare punti di interesse alla mappa e aggiungere nuove informazioni rispendendo alle domande.

    Tutte le modifiche che apporterai saranno automaticamente salvate nel database mondiale di OpenStreetMap e potranno essere liberamente riutilizzate da tutti e tutte.

    Per maggiori informazioni sul progetto ciclofix, visita cyclofix.osm.be.", - "title": "Cyclofix — una mappa libera per chi va in bici" - }, - "drinking_water": { - "description": "Questa mappa mostra tutti i luoghi in cui è disponibile acqua potabile ed è possibile aggiungerne di nuovi", - "title": "Acqua potabile" - }, - "etymology": { - "description": "Su questa cartina sono visibili i nomi a cui sono riferiti gli oggetti. Le strade, gli edifici, etc. provengono da OpenStreetMap che è a sua volta collegata a Wikidata. Nel popup, se esiste, verrà mostrato l’articolo Wikipedia o l'elemento Wikidata a cui si riferisce il nome di quell’oggetto. Se l’oggetto stesso ha una pagina Wikpedia, anch’essa verrà mostrata.

    Anche tu puoi contribuire!Ingrandisci abbastanza e tutte le strade appariranno. Puoi cliccare su una e apparirà un popup con la ricerca Wikidata. Con pochi clic puoi aggiungere un collegamento etimologico. Tieni presente che per farlo, hai bisogno di un account gratuito su OpenStreetMap.", - "layers": { - "1": { - "override": { - "name": "Strade senza informazioni etimologiche" - } - }, - "2": { - "override": { - "name": "Parchi e foreste senza informazioni etimologiche" - } - } - }, - "shortDescription": "Qual è l’origine di un toponimo?", - "title": "Apri Carta Etimologica" - }, - "facadegardens": { - "description": "I giardini veritcali e gli alberi in città non solo portano pace e tranquillità ma creano anche un ambiente più bello, aumentano la biodiversità, rendono il clima più fresco e migliorano la qualità dell’aria.
    Klimaan VZW e Mechelen Klimaatneutraal vogliono mappare sia i giardini verticali esistenti che quelli nuovi per mostrarli a quanti vogliono costruire un loro proprio giardino o per quelli che amano la natura e vogliono camminare per la città.
    Per ulteriori informazioni visita klimaan.be.", - "layers": { - "0": { - "description": "Giardini verticali", - "name": "Giardini verticali", - "presets": { - "0": { - "description": "Aggiungi un giardino verticale", - "title": "giardino verticale" - } - }, - "tagRenderings": { - "facadegardens-description": { - "question": "Altre informazioni per descrivere il giardino (se necessarie e non riportate qui sopra)", - "render": "Maggiori dettagli: {description}" - }, - "facadegardens-direction": { - "question": "Com’è orientato questo giardino?", - "render": "Orientamento: {direction} (0 per il Nord e 90 per l’Est)" - }, - "facadegardens-edible": { - "mappings": { - "0": { - "then": "Ci sono piante commestibili" - }, - "1": { - "then": "Non ci sono piante commestibili" - } - }, - "question": "Ci sono piante commestibili?" - }, - "facadegardens-plants": { - "mappings": { - "0": { - "then": "Ci sono viti" - }, - "1": { - "then": "Ci sono piante da fiore" - }, - "2": { - "then": "Ci sono arbusti" - }, - "3": { - "then": "Ci sono piante tappezzanti" - } - }, - "question": "Che tipi di piante sono presenti qui?" - }, - "facadegardens-rainbarrel": { - "mappings": { - "0": { - "then": "C'è un contenitore per raccogliere la pioggia" - }, - "1": { - "then": "Non c'è un contenitore per raccogliere la pioggia" - } - }, - "question": "È stata installata una riserva d’acqua per il giardino?" - }, - "facadegardens-start_date": { - "question": "Quando è stato realizzato il giardino? (è sufficiente l'anno)", - "render": "Data di realizzazione del giardino: {start_date}" - }, - "facadegardens-sunshine": { - "mappings": { - "0": { - "then": "Il giardino è completamente illuminato dal sole" - }, - "1": { - "then": "Il giardino è parzialmente in ombra" - }, - "2": { - "then": "Il giardino è in ombra" - } - }, - "question": "Il giardino è al sole o in ombra?" - } - }, - "title": { - "render": "Giardino verticale" - } - } - }, - "shortDescription": "Questa mappa mostra i giardini verticali, con foto e informazioni utili sulla loro orientazione, sull'illuminazione solare e sui tipi di piante.", - "title": "Giardini verticali" - }, - "food": { - "title": "Ristoranti e fast food" - }, - "fritures": { - "layers": { - "0": { - "override": { - "name": "Friggitoria" - } + "then": "Area camper senza nome" } + }, + "render": "Area camper {name}" } - }, - "ghostbikes": { - "description": "Una bici fantasma è un monumento in ricordo di un ciclista che è morto in un incidente stradale, che ha la forma di un una bicicletta bianca installata in maniera permanente ne luogo dell’incidente.

    In questa cartina, è possibile vedere tutte le bici fantasma che sono state aggiunte su OpenStreetMap. Ne manca una? Chiunque può aggiungere o migliorare le informazioni qui presenti (è solo richiesto un account gratuito su OpenStreetMap).", - "title": "Bici fantasma" - }, - "hackerspaces": { - "description": "Su questa cartina è possibile vedere gli hackerspace, aggiungerne di nuovi o aggiornare le informazioni tutto in maniera pratica", - "layers": { - "0": { - "description": "Hackerspace", - "icon": { - "mappings": { - "0": { - "then": "./assets/themes/hackerspaces/led.png" - } - } - }, - "name": "Hackerspace", - "presets": { - "0": { - "description": "Un hackerspace è un’area dove si ritrovano le persone interessate al software", - "title": "Hackerspace" - }, - "1": { - "description": "Un makerspace è un luogo dove gli amanti del fai-da-te si ritrovano per sperimentare con dispositivi di elettronica come arduino, strisce LED, etc.", - "title": "Makerspace" - } - }, - "tagRenderings": { - "hackerspaces-name": { - "question": "Qual è il nome di questo hackerspace?", - "render": "Questo hackerspace si chiama {name}" - }, - "hackerspaces-opening_hours": { - "mappings": { - "0": { - "then": "Aperto sempre" - } - }, - "question": "Quando è aperto questo hackerspace?", - "render": "{opening_hours_table()}" - }, - "hackerspaces-start_date": { - "question": "Quando è stato creato questo hackerspace?", - "render": "Questo hackerspace è stato creato il {start_date}" - }, - "hs-club-mate": { - "mappings": { - "0": { - "then": "In questo hackerspace viene servito Club-Mate" - }, - "1": { - "then": "In questo hackerspace non viene servito Club-Mate" - } - }, - "question": "In questo hackerspace si serve Club-Mate?" - }, - "is_makerspace": { - "mappings": { - "0": { - "then": "Si tratta di un makerspace" - }, - "1": { - "then": "Si tratta di un hackerspace tradizionale (orientato al software)" - } - }, - "question": "È un hackerspace o un makerspace?" - } - }, - "title": { - "mappings": { - "0": { - "then": " {name}" - } - }, - "render": "Hackerspace" - } - } + }, + "1": { + "description": "Luoghi di sversamento delle acque reflue", + "name": "Luoghi di sversamento delle acque reflue", + "presets": { + "0": { + "description": "Aggiungi un nuovo luogo di sversamento delle acque reflue. Si tratta di luoghi dove chi viaggia in camper può smaltire le acque grigie o le acque nere. Spesso forniscono anche acqua ed elettricità.", + "title": "luogo di sversamento delle acque reflue" + } }, - "shortDescription": "Una cartina degli hackerspace", - "title": "Hackerspace" - }, - "hailhydrant": { - "description": "In questa cartina puoi vedere e aggiornare idranti, stazioni dei pompieri, stazioni delle ambulanze ed estintori del tuo quartiere preferito.\n\nPuoi seguire la tua posizione precisa (solo su cellulare) e selezionare i livelli che ti interessano nell’angolo in basso a sinistra. Puoi anche usare questo strumento per aggiungere o modificare i PDI sulla mappa e fornire ulteriori dettagli rispondendo alle domande.\n\nTutte le modifiche che farai verranno automaticamente salvate nel database globale di OpenStreetMap e potranno essere riutilizzate liberamente da tutti.", - "layers": { + "tagRenderings": { + "dumpstations-access": { + "mappings": { + "0": { + "then": "Servono una chiave o un codice di accesso" + }, + "1": { + "then": "È obbligatorio essere un cliente di questo campeggio o di questa area camper" + }, + "2": { + "then": "Chiunque può farne uso" + }, + "3": { + "then": "Chiunque può farne uso" + } + }, + "question": "Chi può utilizzare questo luogo di sversamento?" + }, + "dumpstations-charge": { + "question": "Qual è la tariffa di questo luogo?", + "render": "Ha una tariffa di {charge}" + }, + "dumpstations-chemical-waste": { + "mappings": { + "0": { + "then": "È possibile smaltire le acque del WC chimico qui" + }, + "1": { + "then": "Non è possibile smaltire le acque del WC chimico qui" + } + }, + "question": "È possibile smaltire le acque del WC chimico qui?" + }, + "dumpstations-fee": { + "mappings": { + "0": { + "then": "A pagamento" + }, + "1": { + "then": "È gratuito" + } + }, + "question": "Questo luogo è a pagamento?" + }, + "dumpstations-grey-water": { + "mappings": { + "0": { + "then": "Si possono smaltire le acque grigie qui" + }, + "1": { + "then": "Non si possono smaltire le acque grigie qui" + } + }, + "question": "Si possono smaltire le acque grigie qui?" + }, + "dumpstations-network": { + "question": "Di quale rete fa parte questo luogo? (se non fa parte di nessuna rete, salta)", + "render": "Questo luogo è parte della rete {network}" + }, + "dumpstations-waterpoint": { + "mappings": { + "0": { + "then": "Questo luogo ha un punto per l'approvvigionamento di acqua" + }, + "1": { + "then": "Questo luogo non ha un punto per l'approvvigionamento di acqua" + } + }, + "question": "Questo luogo ha un punto per l'approvvigionamento di acqua?" + } + }, + "title": { + "mappings": { "0": { - "description": "Livello della mappa che mostra gli idranti antincendio.", - "name": "Mappa degli idranti", - "presets": { - "0": { - "description": "Un idrante è un punto di collegamento dove i pompieri possono estrarre acqua. Potrebbe trovarsi sottoterra.", - "title": "Idrante antincendio" - } - }, - "tagRenderings": { - "hydrant-color": { - "mappings": { - "0": { - "then": "Il colore dell’idrante è sconosciuto." - }, - "1": { - "then": "Il colore dell’idrante è giallo." - }, - "2": { - "then": "L'idrante è rosso." - } - }, - "question": "Qual è il colore dell’idrante?", - "render": "Il colore dell’idrante è {colour}" - }, - "hydrant-state": { - "mappings": { - "0": { - "then": "L’idrante è (parzialmente o completamente) funzionante." - }, - "1": { - "then": "L’idrante è fuori servizio." - }, - "2": { - "then": "L’idrante è stato rimosso." - } - }, - "question": "Aggiorna lo stato di funzionamento dell’idrante.", - "render": "Stato di funzionamento" - }, - "hydrant-type": { - "mappings": { - "0": { - "then": "Il tipo di idrante è sconosciuto." - }, - "1": { - "then": " Soprasuolo." - }, - "2": { - "then": " Tubo." - }, - "3": { - "then": " A muro." - }, - "4": { - "then": " Sottosuolo." - } - }, - "question": "Di che tipo è questo idrante?", - "render": " Tipo di idrante: {fire_hydrant:type}" - } - }, - "title": { - "render": "Idrante" - } + "then": "Luogo di sversamento" + } + }, + "render": "Luogo di sversamento {name}" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "Chi gestisce questo luogo?", + "render": "Questo luogo è gestito da {operator}" + }, + "1": { + "mappings": { + "0": { + "then": "Questo luogo fornisce corrente elettrica" }, "1": { - "description": "Livello della mappa che mostra gli idranti antincendio.", - "name": "Cartina degli estintori.", - "presets": { - "0": { - "description": "Un estintore è un dispositivo portatile di piccole dimensioni usato per spegnere un incendio", - "title": "Estintore" - } - }, - "tagRenderings": { - "extinguisher-location": { - "mappings": { - "0": { - "then": "Si trova all’interno." - }, - "1": { - "then": "Si trova all’esterno." - } - }, - "question": "Dove è posizionato?", - "render": "Posizione: {location}" - } - }, - "title": { - "render": "Estintori" - } + "then": "Questo luogo non fornisce corrente elettrica" + } + }, + "question": "Questo luogo fornisce corrente elettrica?" + } + } + }, + "shortDescription": "Trova aree dove passare la notte con il tuo camper", + "title": "Aree camper" + }, + "charging_stations": { + "description": "Su questa mappa aperta, puoi individuare le stazioni di ricarica o aggiungere informazioni", + "shortDescription": "Una mappa mondiale delle stazioni di ricarica", + "title": "Stazioni di ricarica" + }, + "climbing": { + "description": "In questa cartina puoi trovare vari luoghi per arrampicata come ad esempio palestre di arrampicata, sale di pratica e rocce naturali.", + "descriptionTail": "La cartina di arrampicata è stata originariamente creata da Christian Neumann. Si prega di scrivere qua se si hanno commenti o domande da fare.

    Il progetto usa i dati del progetto OpenStreetMap.

    ", + "layers": { + "0": { + "description": "Un club o associazione di arrampacata", + "name": "Club di arrampicata", + "presets": { + "0": { + "description": "Un club di arrampicata", + "title": "Club di arrampicata" + }, + "1": { + "description": "Un’associazione che ha a che fare con l’arrampicata", + "title": "Associazione di arrampicata" + } + }, + "tagRenderings": { + "climbing_club-name": { + "question": "Qual è il nome di questo club o associazione di arrampicata?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Associazione di arrampicata" + } + }, + "render": "Club di arrampicata" + } + }, + "1": { + "description": "Una palestra di arrampicata", + "name": "Palestre di arrampicata", + "tagRenderings": { + "name": { + "question": "Qual è il nome di questa palestra di arrampicata?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Palestra di arrampicata {name}" + } + }, + "render": "Palestra di arrampicata" + } + }, + "2": { + "name": "Vie di arrampicata", + "presets": { + "0": { + "title": "Via di arrampicata" + } + }, + "tagRenderings": { + "Bolts": { + "mappings": { + "0": { + "then": "In questo percorso non sono presenti bulloni" + }, + "1": { + "then": "In questo percorso non sono presenti bulloni" + } + }, + "question": "Quanti bulloni sono presenti in questo percorso prima di arrivare alla moulinette?", + "render": "Questo percorso ha {climbing:bolts} bulloni" + }, + "Difficulty": { + "question": "Qual è la difficoltà di questa via di arrampicata nel sistema francese/belga?", + "render": "Il grado di difficoltà è {climbing:grade:french} nel sistema francese/belga" + }, + "Length": { + "question": "Quanto è lunga questa via di arrampicata (in metri)?", + "render": "Questo percorso è lungo {canonical(climbing:length)}" + }, + "Name": { + "mappings": { + "0": { + "then": "Questa via di arrampicata non ha un nome" + } + }, + "question": "Come si chiama questa via di arrampicata?", + "render": "{name}" + }, + "Rock type": { + "render": "Il tipo di roccia è {_embedding_features_with_rock:rock} come dichiarato sul muro circostante" + } + }, + "title": { + "mappings": { + "0": { + "then": "Via di arrampicata {name}" + } + }, + "render": "Via di arrampicata" + } + }, + "3": { + "description": "Un’opportunità di arrampicata", + "name": "Opportunità di arrampicata", + "presets": { + "0": { + "description": "Un’opportunità di arrampicata", + "title": "Opportunità di arrampicata" + } + }, + "tagRenderings": { + "Contained routes hist": { + "render": "

    Riassunto delle difficoltà

    {histogram(_difficulty_hist)}" + }, + "Contained routes length hist": { + "render": "

    Riassunto della lunghezza

    {histogram(_length_hist)}" + }, + "Contained_climbing_routes": { + "render": "

    Contiene {_contained_climbing_routes_count} vie

      {_contained_climbing_routes}
    " + }, + "Rock type (crag/rock/cliff only)": { + "mappings": { + "0": { + "then": "Calcare" + } + }, + "question": "Qual è il tipo di roccia qua?", + "render": "Il tipo di roccia è {rock}" + }, + "Type": { + "mappings": { + "0": { + "then": "Un masso per arrampicata (una singola roccia o falesia con una o poche vie di arrampicata che possono essere scalate in sicurezza senza una corda)" + }, + "1": { + "then": "Un muro da arrampicata (un singolo masso o falesia con almeno qualche via per arrampicata)" + } + } + }, + "name": { + "mappings": { + "0": { + "then": "Questa opportunità di arrampicata non ha un nome" + } + }, + "question": "Qual è il nome di questa opportunità di arrampicata?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Muro da arrampicata {name}" + }, + "1": { + "then": "Area di arrampicata {name}" }, "2": { - "description": "Livello che mostra le caserme dei vigili del fuoco.", - "name": "Mappa delle caserme dei vigili del fuoco", - "presets": { - "0": { - "description": "Una caserma dei pompieri è un luogo dove si trovano i mezzi antincendio e i pompieri tra una missione e l’altra.", - "title": "Caserma dei vigili del fuoco" - } - }, - "tagRenderings": { - "station-agency": { - "mappings": { - "0": { - "then": "Servizio antincendio governativo" - } - }, - "question": "Quale agenzia gestisce questa stazione?", - "render": "Questa stazione è gestita da {operator}." - }, - "station-name": { - "question": "Come si chiama questa caserma dei vigili del fuoco?", - "render": "Questa caserma si chiama {name}." - }, - "station-operator": { - "mappings": { - "0": { - "then": "Questa stazione è gestita dal governo." - }, - "1": { - "then": "Questa stazione è gestita dalla comunità oppure un’associazione informale." - }, - "2": { - "then": "Questa stazione è gestita da un gruppo di volontari ufficiale." - }, - "3": { - "then": "Questa stazione è gestita da privati." - } - }, - "question": "Com’è classificato il gestore di questa stazione?", - "render": "Il gestore è un ente {operator:type}." - }, - "station-place": { - "question": "In che località si trova la stazione? (ad es. quartiere, paese o città)", - "render": "La stazione si trova a {addr:place}." - }, - "station-street": { - "question": " Qual è il nome della via in cui si trova la caserma?", - "render": "La stazione si trova in una strada chiamata {addr:street}." - } - }, - "title": { - "render": "Caserma dei vigili del fuoco" - } + "then": "Sito di arrampicata" }, "3": { - "description": "La stazione delle ambulanze è un’area per lo stoccaggio delle ambulanze, dell’equipaggiamento medico, dei dispositivi di protezione individuale e di altre forniture medicali.", - "name": "Carta delle stazioni delle ambulanze", - "presets": { - "0": { - "description": "Aggiungi una stazione delle ambulanza alla mappa", - "title": "Stazione delle ambulanze" - } - }, - "tagRenderings": { - "ambulance-agency": { - "question": "Quale agenzia gestisce questa stazione?", - "render": "Questa stazione è gestita da {operator}." - }, - "ambulance-name": { - "question": "Qual è il nome di questa stazione delle ambulanze?", - "render": "Questa stazione è chiamata {name}." - }, - "ambulance-operator-type": { - "mappings": { - "0": { - "then": "La stazione è gestita dal governo." - }, - "1": { - "then": "La stazione è gestita dalla comunità o un’organizzazione non ufficiale." - }, - "2": { - "then": "La stazione è gestita da un gruppo ufficiale di volontari." - }, - "3": { - "then": "La stazione è gestita da un privato." - } - }, - "question": "Com’è classificato il gestore della stazione?", - "render": "L’operatore è un ente {operator:type}." - }, - "ambulance-place": { - "question": "Dove si trova la stazione? (ad es. quartiere, paese o città)", - "render": "La stazione si trova a {addr:place}." - }, - "ambulance-street": { - "question": " Come si chiama la strada in cui si trova questa stazione?", - "render": "Questa stazione si trova in {addr:street}." - } - }, - "title": { - "render": "Stazione delle ambulanze" - } + "then": "Opportunità di arrampicata {name}" } + }, + "render": "Opportunità di arrampicata" + } + }, + "4": { + "description": "Un’opportunità di arrampicata?", + "name": "Opportunità di arrampicata?", + "tagRenderings": { + "climbing-opportunity-name": { + "render": "{name}" + }, + "climbing-possible": { + "mappings": { + "0": { + "then": "Non è possibile arrampicarsi qua" + }, + "1": { + "then": "È possibile arrampicarsi qua" + }, + "2": { + "then": "Non è possibile arrampicarsi qua" + } + }, + "question": "È possibile arrampicarsi qua?" + } }, - "shortDescription": "Carta che mostra gli idranti, gli estintori, le caserme dei vigili del fuoco e le stazioni delle ambulanze.", - "title": "Idranti, estintori, caserme dei vigili del fuoco e stazioni delle ambulanze." + "title": { + "render": "Opportunità di arrampicata?" + } + } }, - "maps": { - "description": "In questa carta puoi trovare tutte le mappe conosciute da OpenStreetMap (tipicamente una grossa mappa su di un pannello informativo che mostra l’area, la città o la regione, ad es. una mappa turistica dietro a un manifesto, la mappa di una riserva naturale, la mappa della rete ciclistica regionale, etc.)

    Se manca una mappa, puoi aggiungerla facilmente a questa su OpenStreetMap.", - "shortDescription": "Questo tema mostra tutte le mappe (turistiche) conosciute da OpenStreetMap", - "title": "Una cartina delle cartine" - }, - "natuurpunt": { - "description": "In questa cartina è possibile trovare tutte le riserve naturali offerte da Natuupunt. ", - "shortDescription": "Questa cartina mostra le riserve naturali di Natuurpunt", - "title": "Riserve naturali" - }, - "observation_towers": { - "description": "Torri pubblicamente accessibili per godere della vista", - "shortDescription": "Torri pubblicamente accessibili per godere della vista", - "title": "Torri di osservazione" - }, - "openwindpowermap": { - "description": "Una cartina per la visione e la modifica delle turbine eoliche.", - "layers": { - "0": { - "name": "pala eolica", - "presets": { - "0": { - "title": "pala eolica" - } - }, - "tagRenderings": { - "turbine-diameter": { - "question": "Qual è il diametro (in metri) del rotore di questa pala eolica?", - "render": "Il diametro del rotore di questa pala eolica è di {rotor:diameter} metri." - }, - "turbine-height": { - "question": "Qual è l’altezza (in metri e raggio del rotore incluso) di questa pala eolica?", - "render": "L’altezza totale (raggio del rotore incluso) di questa pala eolica è di {height} metri." - }, - "turbine-operator": { - "question": "Chi gestisce questa pala eolica?", - "render": "Questa pala eolica è gestita da {operator}." - }, - "turbine-output": { - "question": "Quant’è la potenza generata da questa pala eolica? (ad es. 2.3 MW)", - "render": "La potenza generata da questa pala eolica è {generator:output:electricity}." - }, - "turbine-start-date": { - "question": "Quando è entrata in funzione questa pala eolica?", - "render": "Questa pala eolica è entrata in funzione in data {start_date}." - } - }, - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "pala eolica" - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " megawatt" - }, - "1": { - "human": " kilowatt" - }, - "2": { - "human": " watt" - }, - "3": { - "human": " gigawatt" - } - } - }, - "1": { - "applicableUnits": { - "0": { - "human": " metri" - } - } - } - } - } + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "C’è un sito web (anche non ufficiale) con qualche informazione in più (ad es. topografie)?" }, - "title": "OpenWindPowerMap" - }, - "parkings": { - "description": "Questa cartina mostra diversi posti dove parcheggiare", - "shortDescription": "Questa cartina mostra diversi posti dove parcheggiare", - "title": "Parcheggio" - }, - "personal": { - "description": "Crea un tema personale basato sui livelli disponibili per tutti i temi. Per mostrare dei dati, apri selezione livello", - "title": "Tema personalizzato" - }, - "playgrounds": { - "description": "In questa cartina vengono mostrati i parchi giochi a cui è possibile aggiungere dettagli", - "shortDescription": "Una cartina dei parchi giochi", - "title": "Parchi giochi" - }, - "postboxes": { - "description": "In questa cartina puoi veder e modificare gli uffici postali e le buche delle lettere. Puoi usare questa cartina per trovare dove imbucare la tua prossima cartolina! :)
    Hai trovato un errore o una buca delle lettere mancante? Puoi modificare questa cartina con un account gratuito su OpenStreetMap. ", - "layers": { + "1": { + "mappings": { "0": { - "description": "Il livello che mostra le buche delle lettere.", - "name": "Buche delle lettere", - "presets": { - "0": { - "title": "Buca delle lettere" - } - }, - "title": { - "render": "Buca delle lettere" - } + "then": "L’ elemento in cui è contenuto indica che è pubblicamente accessibile
    {_embedding_feature:access:description}" }, "1": { - "description": "Un livello che mostra gli uffici postali.", - "filter": { - "0": { - "options": { - "0": { - "question": "Aperto adesso" - } - } - } - }, - "name": "Uffici postali", - "presets": { - "0": { - "title": "Ufficio postale" - } - }, - "tagRenderings": { - "OH": { - "mappings": { - "0": { - "then": "aperto 24/24h (feste incluse)" - } - }, - "question": "Quali sono gli orari di apertura di questo ufficio postale?", - "render": "Orari di apertura: {opening_hours_table()}" - } - }, - "title": { - "render": "Ufficio postale" - } + "then": "L’elemento che lo contiene indica che è richiesto un’autorizzazione per accedervi
    {_embedding_feature:access:description}" + }, + "2": { + "then": "L’ elemento che lo contiene indica che è accessibile solo ai clienti
    {_embedding_feature:access:description}" + }, + "3": { + "then": "L’ elemento che lo contiene indica che è accessibile solamente ai membri del club
    {_embedding_feature:access:description}" } + } }, - "shortDescription": "Una cartina che mostra le buche delle lettere e gli uffici postali", - "title": "Buche delle lettere e uffici postali" - }, - "shops": { - "description": "In questa cartina è possibile aggiungere informazioni di base di un negozio, orari di apertura e numeri di telefono", - "shortDescription": "Una cartina modificabile con informazioni di base dei negozi", - "title": "Mappa dei negozi" - }, - "sport_pitches": { - "description": "Una campo sportivo è un’area dove vengono praticati gli sport", - "shortDescription": "Una cartina che mostra i campi sportivi", - "title": "Campi sportivi" - }, - "surveillance": { - "description": "In questa cartina puoi trovare le telecamera di sorveglianza.", - "shortDescription": "Telecamere e altri di mezzi di sorveglianza", - "title": "Sorveglianza sotto controllo" - }, - "toilets": { - "description": "Una cartina dei servizi igienici pubblici", - "title": "Mappa libera delle toilet" - }, - "trees": { - "description": "Mappa tutti gli alberi!", - "shortDescription": "Mappa tutti gli alberi", - "title": "Alberi" - }, - "uk_addresses": { - "description": "Contribuisci a OpenStreetMap inserendo le informazioni sull’indirizzo", - "layers": { - "1": { - "description": "Indirizzi", - "name": "Indirizzo presente su OSM", - "tagRenderings": { - "uk_addresses_explanation_osm": { - "render": "Questo indirizzo è salvato su OpenStreetMap" - }, - "uk_addresses_housenumber": { - "mappings": { - "0": { - "then": "Questo edificio non ha indirizzo" - } - }, - "question": "Qual è il numero civico di questa casa?", - "render": "Il numero civico è {addr:housenumber}" - }, - "uk_addresses_street": { - "question": "Qual è la via in cui si trova?", - "render": "L’indirizzo è in via {addr:street}" - } - }, - "title": { - "render": "Indirizzo conosciuto" - } - } - }, - "shortDescription": "Aiuta a costruire un dataset libero per gli indirizzi nel Regno Unito", - "tileLayerSources": { + "2": { + "mappings": { "0": { - "name": "Confini delle proprietà di osmuk.org" + "then": "Pubblicamente accessibile a chiunque" + }, + "1": { + "then": "È necessario avere un’autorizzazione per entrare" + }, + "2": { + "then": "Riservato ai clienti" + }, + "3": { + "then": "Riservato ai membri del club" } + }, + "question": "Chi può accedervi?" }, - "title": "Indirizzi UK" + "4": { + "question": "Quale è la lunghezza (media) delle vie in metri?", + "render": "Le vie sono lunghe mediamente {canonical(climbing:length)}" + }, + "5": { + "question": "Qual è il livello della via più facile qua, secondo il sistema di classificazione francese?", + "render": "Il minimo livello di difficoltà è {climbing:grade:french:min} secondo il sistema francese/belga" + }, + "6": { + "question": "Qual è il livello della via più difficile qua, secondo il sistema di classificazione francese?", + "render": "Il massimo livello di difficoltà è {climbing:grade:french:max} secondo il sistema francese/belga" + }, + "7": { + "mappings": { + "0": { + "then": "L’arrampicata su massi è possibile qua" + }, + "1": { + "then": "L’arrampicata su massi non è possibile qua" + }, + "2": { + "then": "L’arrampicata su massi è possibile anche se su poche vie" + }, + "3": { + "then": "Sono presenti {climbing:boulder} vie di arrampicata su massi" + } + }, + "question": "È possibile praticare ‘bouldering’ qua?" + }, + "8": { + "mappings": { + "0": { + "then": "È possibile arrampicarsi con moulinette qua" + }, + "1": { + "then": "Non è possibile arrampicarsi con moulinette qua" + }, + "2": { + "then": "Sono presenti {climbing:toprope} vie con moulinette" + } + }, + "question": "È possibile arrampicarsi con la corda dall’alto qua?" + }, + "9": { + "mappings": { + "0": { + "then": "L’arrampicata sportiva è possibile qua" + }, + "1": { + "then": "L’arrampicata sportiva non è possibile qua" + }, + "2": { + "then": "Sono presenti {climbing:sport} vie di arrampicata sportiva" + } + }, + "question": "È possibile arrampicarsi qua con ancoraggi fissi?" + }, + "10": { + "mappings": { + "0": { + "then": "L’arrampicata tradizionale è possibile qua" + }, + "1": { + "then": "L’arrampicata tradizionale non è possibile qua" + }, + "2": { + "then": "Sono presenti {climbing:traditional} vie di arrampicata tradizionale" + } + }, + "question": "È possibile arrampicarsi in maniera tradizionale qua (usando attrezzi propri, ad es. dadi)?" + }, + "11": { + "mappings": { + "0": { + "then": "È presente una parete per l’arrampicata di velocità" + }, + "1": { + "then": "Non è presente una parete per l’arrampicata di velocità" + }, + "2": { + "then": "Sono presenti {climbing:speed} pareti per l’arrampicata di velocità" + } + }, + "question": "È presente una prete per l’arrampicata di velocità?" + } + }, + "units+": { + "0": { + "applicableUnits": { + "0": { + "human": " metri" + }, + "1": { + "human": " piedi" + } + } + } + } }, - "waste_basket": { - "description": "In questa cartina troverai i cestini dei rifiuti nei tuoi paraggi. Se manca un cestino, puoi inserirlo tu stesso", - "shortDescription": "Una cartina dei cestini dei rifiuti", - "title": "Cestino dei rifiuti" + "title": "Mappa aperta per le arrampicate" + }, + "cycle_highways": { + "description": "Questa cartina mostra le strade per velocipedi", + "title": "Strade per velocipedi" + }, + "cycle_infra": { + "description": "Una cartina dove vedere e modificare gli elementi riguardanti l’infrastruttura dei velocipedi. Realizzata durante #osoc21.", + "shortDescription": "Una cartina dove vedere e modificare gli elementi riguardanti l’infrastruttura dei velocipedi.", + "title": "Infrastruttura dei velocipedi" + }, + "cyclestreets": { + "description": "Una strada ciclabile è una strada dove il traffico motorizzato non può superare i velocipedi. La sua presenza è segnalata da un cartello stradale specifico. Le strade ciclabili sono diffuse in Olanda e Belgio, ma si possono trovare anche in Germania e in Francia. ", + "layers": { + "0": { + "description": "Una strada ciclabile è una strada in cui i veicoli a motore non possono sorpassare le persone in bicicletta", + "name": "Strade ciclabili" + }, + "1": { + "description": "Questa strada diventerà presto una strada ciclabile", + "name": "Futura strada ciclabile", + "title": { + "mappings": { + "0": { + "then": "{name} diventerà presto una strada ciclabile" + } + }, + "render": "Futura strada ciclabile" + } + }, + "2": { + "description": "Livello per contrassegnare tutte le strade come strade ciclabili", + "name": "Tutte le strade", + "title": { + "render": "Strada" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "mappings": { + "0": { + "then": "Questa è una strada ciclabile (e ha un limite di velocità massima di 30 km/h)" + }, + "1": { + "then": "Questa è una strada ciclabile" + }, + "2": { + "then": "Diverrà tra poco una strada ciclabile" + }, + "3": { + "then": "Questa strada non è una strada ciclabile" + } + }, + "question": "È una strada ciclabile?" + }, + "1": { + "question": "Questa strada diventerà una strada ciclabile quando?", + "render": "Questa strada diventerà una strada ciclabile dal {cyclestreet:start_date}" + } + } + }, + "shortDescription": "Una cartina per le strade ciclabili", + "title": "Strade ciclabili" + }, + "cyclofix": { + "description": "Questa mappa offre a chi va in bici una soluzione semplice per trovare tutte le infrastrutture di cui ha bisogno.

    Puoi tracciare la tua posizione esatta (solo su mobile) e selezionare i livelli che ti interessano nell'angolo in basso a sinistra. Puoi anche usare questo strumento per aggiungere o modificare punti di interesse alla mappa e aggiungere nuove informazioni rispendendo alle domande.

    Tutte le modifiche che apporterai saranno automaticamente salvate nel database mondiale di OpenStreetMap e potranno essere liberamente riutilizzate da tutti e tutte.

    Per maggiori informazioni sul progetto ciclofix, visita cyclofix.osm.be.", + "title": "Cyclofix - una mappa libera per chi va in bici" + }, + "drinking_water": { + "description": "Questa mappa mostra tutti i luoghi in cui è disponibile acqua potabile ed è possibile aggiungerne di nuovi", + "title": "Acqua potabile" + }, + "etymology": { + "description": "Su questa cartina sono visibili i nomi a cui sono riferiti gli oggetti. Le strade, gli edifici, etc. provengono da OpenStreetMap che è a sua volta collegata a Wikidata. Nel popup, se esiste, verrà mostrato l’articolo Wikipedia o l'elemento Wikidata a cui si riferisce il nome di quell’oggetto. Se l’oggetto stesso ha una pagina Wikpedia, anch’essa verrà mostrata.

    Anche tu puoi contribuire!Ingrandisci abbastanza e tutte le strade appariranno. Puoi cliccare su una e apparirà un popup con la ricerca Wikidata. Con pochi clic puoi aggiungere un collegamento etimologico. Tieni presente che per farlo, hai bisogno di un account gratuito su OpenStreetMap.", + "layers": { + "1": { + "override": { + "name": "Strade senza informazioni etimologiche" + } + }, + "2": { + "override": { + "name": "Parchi e foreste senza informazioni etimologiche" + } + } + }, + "shortDescription": "Qual è l’origine di un toponimo?", + "title": "Apri Carta Etimologica" + }, + "facadegardens": { + "description": "I giardini veritcali e gli alberi in città non solo portano pace e tranquillità ma creano anche un ambiente più bello, aumentano la biodiversità, rendono il clima più fresco e migliorano la qualità dell’aria.
    Klimaan VZW e Mechelen Klimaatneutraal vogliono mappare sia i giardini verticali esistenti che quelli nuovi per mostrarli a quanti vogliono costruire un loro proprio giardino o per quelli che amano la natura e vogliono camminare per la città.
    Per ulteriori informazioni visita klimaan.be.", + "layers": { + "0": { + "description": "Giardini verticali", + "name": "Giardini verticali", + "presets": { + "0": { + "description": "Aggiungi un giardino verticale", + "title": "giardino verticale" + } + }, + "tagRenderings": { + "facadegardens-description": { + "question": "Altre informazioni per descrivere il giardino (se necessarie e non riportate qui sopra)", + "render": "Maggiori dettagli: {description}" + }, + "facadegardens-direction": { + "question": "Com’è orientato questo giardino?", + "render": "Orientamento: {direction} (0 per il Nord e 90 per l’Est)" + }, + "facadegardens-edible": { + "mappings": { + "0": { + "then": "Ci sono piante commestibili" + }, + "1": { + "then": "Non ci sono piante commestibili" + } + }, + "question": "Ci sono piante commestibili?" + }, + "facadegardens-plants": { + "mappings": { + "0": { + "then": "Ci sono viti" + }, + "1": { + "then": "Ci sono piante da fiore" + }, + "2": { + "then": "Ci sono arbusti" + }, + "3": { + "then": "Ci sono piante tappezzanti" + } + }, + "question": "Che tipi di piante sono presenti qui?" + }, + "facadegardens-rainbarrel": { + "mappings": { + "0": { + "then": "C'è un contenitore per raccogliere la pioggia" + }, + "1": { + "then": "Non c'è un contenitore per raccogliere la pioggia" + } + }, + "question": "È stata installata una riserva d’acqua per il giardino?" + }, + "facadegardens-start_date": { + "question": "Quando è stato realizzato il giardino? (è sufficiente l'anno)", + "render": "Data di realizzazione del giardino: {start_date}" + }, + "facadegardens-sunshine": { + "mappings": { + "0": { + "then": "Il giardino è completamente illuminato dal sole" + }, + "1": { + "then": "Il giardino è parzialmente in ombra" + }, + "2": { + "then": "Il giardino è in ombra" + } + }, + "question": "Il giardino è al sole o in ombra?" + } + }, + "title": { + "render": "Giardino verticale" + } + } + }, + "shortDescription": "Questa mappa mostra i giardini verticali, con foto e informazioni utili sulla loro orientazione, sull'illuminazione solare e sui tipi di piante.", + "title": "Giardini verticali" + }, + "food": { + "title": "Ristoranti e fast food" + }, + "fritures": { + "layers": { + "0": { + "override": { + "name": "Friggitoria" + } + } } + }, + "ghostbikes": { + "description": "Una bici fantasma è un monumento in ricordo di un ciclista che è morto in un incidente stradale, che ha la forma di un una bicicletta bianca installata in maniera permanente ne luogo dell’incidente.

    In questa cartina, è possibile vedere tutte le bici fantasma che sono state aggiunte su OpenStreetMap. Ne manca una? Chiunque può aggiungere o migliorare le informazioni qui presenti (è solo richiesto un account gratuito su OpenStreetMap).", + "title": "Bici fantasma" + }, + "hackerspaces": { + "description": "Su questa cartina è possibile vedere gli hackerspace, aggiungerne di nuovi o aggiornare le informazioni tutto in maniera pratica", + "shortDescription": "Una cartina degli hackerspace", + "title": "Hackerspace" + }, + "hailhydrant": { + "description": "In questa cartina puoi vedere e aggiornare idranti, stazioni dei pompieri, stazioni delle ambulanze ed estintori del tuo quartiere preferito.\n\nPuoi seguire la tua posizione precisa (solo su cellulare) e selezionare i livelli che ti interessano nell’angolo in basso a sinistra. Puoi anche usare questo strumento per aggiungere o modificare i PDI sulla mappa e fornire ulteriori dettagli rispondendo alle domande.\n\nTutte le modifiche che farai verranno automaticamente salvate nel database globale di OpenStreetMap e potranno essere riutilizzate liberamente da tutti.", + "layers": { + "0": { + "description": "Livello della mappa che mostra gli idranti antincendio.", + "name": "Mappa degli idranti", + "presets": { + "0": { + "description": "Un idrante è un punto di collegamento dove i pompieri possono estrarre acqua. Potrebbe trovarsi sottoterra.", + "title": "Idrante antincendio" + } + }, + "tagRenderings": { + "hydrant-color": { + "mappings": { + "0": { + "then": "Il colore dell’idrante è sconosciuto." + }, + "1": { + "then": "Il colore dell’idrante è giallo." + }, + "2": { + "then": "L'idrante è rosso." + } + }, + "question": "Qual è il colore dell’idrante?", + "render": "Il colore dell’idrante è {colour}" + }, + "hydrant-state": { + "mappings": { + "0": { + "then": "L’idrante è (parzialmente o completamente) funzionante." + }, + "1": { + "then": "L’idrante è fuori servizio." + }, + "2": { + "then": "L’idrante è stato rimosso." + } + }, + "question": "Aggiorna lo stato di funzionamento dell’idrante." + }, + "hydrant-type": { + "mappings": { + "0": { + "then": "Il tipo di idrante è sconosciuto." + }, + "1": { + "then": " Soprasuolo." + }, + "2": { + "then": " Tubo." + }, + "3": { + "then": " A muro." + }, + "4": { + "then": " Sottosuolo." + } + }, + "question": "Di che tipo è questo idrante?", + "render": " Tipo di idrante: {fire_hydrant:type}" + } + }, + "title": { + "render": "Idrante" + } + }, + "1": { + "description": "Livello della mappa che mostra gli idranti antincendio.", + "name": "Cartina degli estintori.", + "presets": { + "0": { + "description": "Un estintore è un dispositivo portatile di piccole dimensioni usato per spegnere un incendio", + "title": "Estintore" + } + }, + "tagRenderings": { + "extinguisher-location": { + "mappings": { + "0": { + "then": "Si trova all’interno." + }, + "1": { + "then": "Si trova all’esterno." + } + }, + "question": "Dove è posizionato?", + "render": "Posizione: {location}" + } + }, + "title": { + "render": "Estintori" + } + }, + "2": { + "description": "Livello che mostra le caserme dei vigili del fuoco.", + "name": "Mappa delle caserme dei vigili del fuoco", + "presets": { + "0": { + "description": "Una caserma dei pompieri è un luogo dove si trovano i mezzi antincendio e i pompieri tra una missione e l’altra.", + "title": "Caserma dei vigili del fuoco" + } + }, + "tagRenderings": { + "station-agency": { + "mappings": { + "0": { + "then": "Servizio antincendio governativo" + } + }, + "question": "Quale agenzia gestisce questa stazione?", + "render": "Questa stazione è gestita da {operator}." + }, + "station-name": { + "question": "Come si chiama questa caserma dei vigili del fuoco?", + "render": "Questa caserma si chiama {name}." + }, + "station-operator": { + "mappings": { + "0": { + "then": "Questa stazione è gestita dal governo." + }, + "1": { + "then": "Questa stazione è gestita dalla comunità oppure un’associazione informale." + }, + "2": { + "then": "Questa stazione è gestita da un gruppo di volontari ufficiale." + }, + "3": { + "then": "Questa stazione è gestita da privati." + } + }, + "question": "Com’è classificato il gestore di questa stazione?", + "render": "Il gestore è un ente {operator:type}." + }, + "station-place": { + "question": "In che località si trova la stazione? (ad es. quartiere, paese o città)", + "render": "La stazione si trova a {addr:place}." + }, + "station-street": { + "question": " Qual è il nome della via in cui si trova la caserma?", + "render": "La stazione si trova in una strada chiamata {addr:street}." + } + }, + "title": { + "render": "Caserma dei vigili del fuoco" + } + }, + "3": { + "description": "La stazione delle ambulanze è un’area per lo stoccaggio delle ambulanze, dell’equipaggiamento medico, dei dispositivi di protezione individuale e di altre forniture medicali.", + "name": "Carta delle stazioni delle ambulanze", + "presets": { + "0": { + "description": "Aggiungi una stazione delle ambulanza alla mappa", + "title": "Stazione delle ambulanze" + } + }, + "tagRenderings": { + "ambulance-agency": { + "question": "Quale agenzia gestisce questa stazione?", + "render": "Questa stazione è gestita da {operator}." + }, + "ambulance-name": { + "question": "Qual è il nome di questa stazione delle ambulanze?", + "render": "Questa stazione è chiamata {name}." + }, + "ambulance-operator-type": { + "mappings": { + "0": { + "then": "La stazione è gestita dal governo." + }, + "1": { + "then": "La stazione è gestita dalla comunità o un’organizzazione non ufficiale." + }, + "2": { + "then": "La stazione è gestita da un gruppo ufficiale di volontari." + }, + "3": { + "then": "La stazione è gestita da un privato." + } + }, + "question": "Com’è classificato il gestore della stazione?", + "render": "L’operatore è un ente {operator:type}." + }, + "ambulance-place": { + "question": "Dove si trova la stazione? (ad es. quartiere, paese o città)", + "render": "La stazione si trova a {addr:place}." + }, + "ambulance-street": { + "question": " Come si chiama la strada in cui si trova questa stazione?", + "render": "Questa stazione si trova in {addr:street}." + } + }, + "title": { + "render": "Stazione delle ambulanze" + } + } + }, + "shortDescription": "Carta che mostra gli idranti, gli estintori, le caserme dei vigili del fuoco e le stazioni delle ambulanze.", + "title": "Idranti, estintori, caserme dei vigili del fuoco e stazioni delle ambulanze." + }, + "maps": { + "description": "In questa carta puoi trovare tutte le mappe conosciute da OpenStreetMap (tipicamente una grossa mappa su di un pannello informativo che mostra l’area, la città o la regione, ad es. una mappa turistica dietro a un manifesto, la mappa di una riserva naturale, la mappa della rete ciclistica regionale, etc.)

    Se manca una mappa, puoi aggiungerla facilmente a questa su OpenStreetMap.", + "shortDescription": "Questo tema mostra tutte le mappe (turistiche) conosciute da OpenStreetMap", + "title": "Una cartina delle cartine" + }, + "natuurpunt": { + "description": "In questa cartina è possibile trovare tutte le riserve naturali offerte da Natuupunt. ", + "shortDescription": "Questa cartina mostra le riserve naturali di Natuurpunt", + "title": "Riserve naturali" + }, + "observation_towers": { + "description": "Torri pubblicamente accessibili per godere della vista", + "shortDescription": "Torri pubblicamente accessibili per godere della vista", + "title": "Torri di osservazione" + }, + "openwindpowermap": { + "description": "Una cartina per la visione e la modifica delle turbine eoliche.", + "layers": { + "0": { + "name": "pala eolica", + "presets": { + "0": { + "title": "pala eolica" + } + }, + "tagRenderings": { + "turbine-diameter": { + "question": "Qual è il diametro (in metri) del rotore di questa pala eolica?", + "render": "Il diametro del rotore di questa pala eolica è di {rotor:diameter} metri." + }, + "turbine-height": { + "question": "Qual è l’altezza (in metri e raggio del rotore incluso) di questa pala eolica?", + "render": "L’altezza totale (raggio del rotore incluso) di questa pala eolica è di {height} metri." + }, + "turbine-operator": { + "question": "Chi gestisce questa pala eolica?", + "render": "Questa pala eolica è gestita da {operator}." + }, + "turbine-output": { + "question": "Quant’è la potenza generata da questa pala eolica? (ad es. 2.3 MW)", + "render": "La potenza generata da questa pala eolica è {generator:output:electricity}." + }, + "turbine-start-date": { + "question": "Quando è entrata in funzione questa pala eolica?", + "render": "Questa pala eolica è entrata in funzione in data {start_date}." + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "pala eolica" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " megawatt" + }, + "1": { + "human": " kilowatt" + }, + "2": { + "human": " watt" + }, + "3": { + "human": " gigawatt" + } + } + }, + "1": { + "applicableUnits": { + "0": { + "human": " metri" + } + } + } + } + } + }, + "title": "OpenWindPowerMap" + }, + "parkings": { + "description": "Questa cartina mostra diversi posti dove parcheggiare", + "shortDescription": "Questa cartina mostra diversi posti dove parcheggiare", + "title": "Parcheggio" + }, + "personal": { + "description": "Crea un tema personale basato sui livelli disponibili per tutti i temi. Per mostrare dei dati, apri selezione livello", + "title": "Tema personalizzato" + }, + "playgrounds": { + "description": "In questa cartina vengono mostrati i parchi giochi a cui è possibile aggiungere dettagli", + "shortDescription": "Una cartina dei parchi giochi", + "title": "Parchi giochi" + }, + "postboxes": { + "description": "In questa cartina puoi veder e modificare gli uffici postali e le buche delle lettere. Puoi usare questa cartina per trovare dove imbucare la tua prossima cartolina! :)
    Hai trovato un errore o una buca delle lettere mancante? Puoi modificare questa cartina con un account gratuito su OpenStreetMap. ", + "shortDescription": "Una cartina che mostra le buche delle lettere e gli uffici postali", + "title": "Buche delle lettere e uffici postali" + }, + "shops": { + "description": "In questa cartina è possibile aggiungere informazioni di base di un negozio, orari di apertura e numeri di telefono", + "shortDescription": "Una cartina modificabile con informazioni di base dei negozi", + "title": "Mappa dei negozi" + }, + "sport_pitches": { + "description": "Una campo sportivo è un’area dove vengono praticati gli sport", + "shortDescription": "Una cartina che mostra i campi sportivi", + "title": "Campi sportivi" + }, + "surveillance": { + "description": "In questa cartina puoi trovare le telecamera di sorveglianza.", + "shortDescription": "Telecamere e altri di mezzi di sorveglianza", + "title": "Sorveglianza sotto controllo" + }, + "toilets": { + "description": "Una cartina dei servizi igienici pubblici", + "title": "Mappa libera delle toilet" + }, + "trees": { + "description": "Mappa tutti gli alberi!", + "shortDescription": "Mappa tutti gli alberi", + "title": "Alberi" + }, + "uk_addresses": { + "description": "Contribuisci a OpenStreetMap inserendo le informazioni sull’indirizzo", + "shortDescription": "Aiuta a costruire un dataset libero per gli indirizzi nel Regno Unito", + "title": "Indirizzi UK" + }, + "waste_basket": { + "description": "In questa cartina troverai i cestini dei rifiuti nei tuoi paraggi. Se manca un cestino, puoi inserirlo tu stesso", + "shortDescription": "Una cartina dei cestini dei rifiuti", + "title": "Cestino dei rifiuti" + } } \ No newline at end of file diff --git a/langs/themes/ja.json b/langs/themes/ja.json index de0493785d..b4c8afeb57 100644 --- a/langs/themes/ja.json +++ b/langs/themes/ja.json @@ -1,873 +1,872 @@ { - "aed": { - "description": "この地図では近くにある除細動器(AED)を見つけてマークします", - "title": "オープンAEDマップ" - }, - "artwork": { - "description": "オープン アートワーク マップへようこそ。世界中の銅像や胸像、壁の落書きなどのアートワークの地図です", - "title": "オープン アートワーク マップ" - }, - "benches": { - "description": "このマップには、OpenStreetMapに記録されているすべてのベンチが表示されます。個々のベンチ、および公共交通機関の停留所または避難場所に属するベンチです。OpenStreetMapアカウントを使用すると、新しいベンチをマップしたり、既存のベンチの詳細を編集したりできます。", - "shortDescription": "ベンチの地図", - "title": "ベンチ" - }, - "bicyclelib": { - "description": "自転車ライブラリは、少額の年間料金で自転車を借りられる場所です。注目すべきユースケースとしては、子供向けの自転車ライブラリで、子どもの成長にあわせて大きな自転車へ借り替えられます", - "title": "自転車ライブラリ" - }, - "bookcases": { - "description": "公共の本棚とは、本が保管されている小さな街角のキャビネット、箱、古い電話のトランク、その他の物のことです。誰でも本を置いたり持ったりすることができます。このマップは、すべての公共の本棚を収集することを目的としています。近くで新しい本棚を見つけることができ、無料のOpenStreetMapアカウントを使えば、お気に入りの本棚を簡単に追加できます。", - "title": "オープン本棚マップ" - }, - "campersite": { - "description": "このWebサイトでは、すべてのキャンピングカーの公式停車場所と、汚水を捨てることができる場所を収集します。提供されるサービスとコストに関する詳細を追加できます。写真とレビューを追加します。これはウェブサイトとウェブアプリです。データはOpenStreetMapに保存されるので、永遠に無料で、どんなアプリからでも再利用できます。", - "layers": { + "aed": { + "description": "この地図では近くにある除細動器(AED)を見つけてマークします", + "title": "オープンAEDマップ" + }, + "artwork": { + "description": "オープン アートワーク マップへようこそ。世界中の銅像や胸像、壁の落書きなどのアートワークの地図です", + "title": "オープン アートワーク マップ" + }, + "benches": { + "description": "このマップには、OpenStreetMapに記録されているすべてのベンチが表示されます。個々のベンチ、および公共交通機関の停留所または避難場所に属するベンチです。OpenStreetMapアカウントを使用すると、新しいベンチをマップしたり、既存のベンチの詳細を編集したりできます。", + "shortDescription": "ベンチの地図", + "title": "ベンチ" + }, + "bicyclelib": { + "description": "自転車ライブラリは、少額の年間料金で自転車を借りられる場所です。注目すべきユースケースとしては、子供向けの自転車ライブラリで、子どもの成長にあわせて大きな自転車へ借り替えられます", + "title": "自転車ライブラリ" + }, + "bookcases": { + "description": "公共の本棚とは、本が保管されている小さな街角のキャビネット、箱、古い電話のトランク、その他の物のことです。誰でも本を置いたり持ったりすることができます。このマップは、すべての公共の本棚を収集することを目的としています。近くで新しい本棚を見つけることができ、無料のOpenStreetMapアカウントを使えば、お気に入りの本棚を簡単に追加できます。", + "title": "オープン本棚マップ" + }, + "campersite": { + "description": "このWebサイトでは、すべてのキャンピングカーの公式停車場所と、汚水を捨てることができる場所を収集します。提供されるサービスとコストに関する詳細を追加できます。写真とレビューを追加します。これはウェブサイトとウェブアプリです。データはOpenStreetMapに保存されるので、永遠に無料で、どんなアプリからでも再利用できます。", + "layers": { + "0": { + "description": "キャンプサイト", + "name": "キャンプサイト", + "presets": { + "0": { + "description": "新しい公式キャンプサイトを追加します。お客様のキャンピングカーで一泊する指定の場所です。本物のキャンプのように見えるかもしれないし、単なる駐車場のように見えるかもしれない。それらは全く署名されていないかもしれませんが、自治体の決定で定義されているだけです。夜を過ごすことが予想されないキャンパー向けの通常の駐車場は、キャンプサイトではない ", + "title": "キャンプサイト" + } + }, + "tagRenderings": { + "caravansites-capacity": { + "question": "ここには何人のキャンパーが泊まれますか?(許可された車両の数や駐車スペースが明らかでない場合は省略)", + "render": "{capacity} 人が同時に使用できます" + }, + "caravansites-charge": { + "question": "ここはいくらかかりますか?", + "render": "この場所は{charge} が必要" + }, + "caravansites-description": { + "question": "この場所の一般的な説明を追加しますか?(前に問い合わせた情報や上記の情報を繰り返し入力しないでください。客観的な意見はレビューに反映されます)", + "render": "この場所の詳細:{description}" + }, + "caravansites-fee": { + "mappings": { + "0": { + "then": "使用料を支払う必要がある" + }, + "1": { + "then": "無料で使用可能" + } + }, + "question": "ここは有料ですか?" + }, + "caravansites-internet": { + "mappings": { + "0": { + "then": "インターネットアクセスがある" + }, + "1": { + "then": "インターネットアクセスがある" + }, + "2": { + "then": "インターネットにアクセスできない" + } + }, + "question": "この場所はインターネットにアクセスできますか?" + }, + "caravansites-internet-fee": { + "mappings": { + "0": { + "then": "インターネット接続には別途料金が必要です" + }, + "1": { + "then": "インターネット接続に追加料金を支払う必要はありません" + } + }, + "question": "インターネット接続にお金はかかりますか?" + }, + "caravansites-long-term": { + "mappings": { + "0": { + "then": "はい、長期レンタルのスポットもあり、日常的に滞在することもできます" + }, + "1": { + "then": "いいえ、ここには長期滞在者はいません" + }, + "2": { + "then": "長期契約をしている場合のみ宿泊可能です(これを選択すると、この場所はこの地図から消えます)" + } + }, + "question": "ここには長期レンタルのスポットがありますか?" + }, + "caravansites-name": { + "question": "ここは何というところですか?", + "render": "この場所は {name} と呼ばれています" + }, + "caravansites-sanitary-dump": { + "mappings": { + "0": { + "then": "この場所には衛生的なゴミ捨て場がある" + }, + "1": { + "then": "この場所には衛生的なゴミ捨て場がない" + } + }, + "question": "この場所に衛生的なゴミ捨て場はありますか?" + }, + "caravansites-toilets": { + "mappings": { + "0": { + "then": "ここにはトイレがある" + }, + "1": { + "then": "ここにはトイレがない" + } + }, + "question": "ここにトイレはありますか?" + }, + "caravansites-website": { + "question": "ここにはウェブサイトがありますか?", + "render": "公式Webサイト: {website}" + } + }, + "title": { + "mappings": { "0": { - "description": "キャンプサイト", - "name": "キャンプサイト", - "presets": { - "0": { - "description": "新しい公式キャンプサイトを追加します。お客様のキャンピングカーで一泊する指定の場所です。本物のキャンプのように見えるかもしれないし、単なる駐車場のように見えるかもしれない。それらは全く署名されていないかもしれませんが、自治体の決定で定義されているだけです。夜を過ごすことが予想されないキャンパー向けの通常の駐車場は、キャンプサイトではない ", - "title": "キャンプサイト" - } - }, - "tagRenderings": { - "caravansites-capacity": { - "question": "ここには何人のキャンパーが泊まれますか?(許可された車両の数や駐車スペースが明らかでない場合は省略)", - "render": "{capacity} 人が同時に使用できます" - }, - "caravansites-charge": { - "question": "ここはいくらかかりますか?", - "render": "この場所は{charge} が必要" - }, - "caravansites-description": { - "question": "この場所の一般的な説明を追加しますか?(前に問い合わせた情報や上記の情報を繰り返し入力しないでください。客観的な意見はレビューに反映されます)", - "render": "この場所の詳細:{description}" - }, - "caravansites-fee": { - "mappings": { - "0": { - "then": "使用料を支払う必要がある" - }, - "1": { - "then": "無料で使用可能" - } - }, - "question": "ここは有料ですか?" - }, - "caravansites-internet": { - "mappings": { - "0": { - "then": "インターネットアクセスがある" - }, - "1": { - "then": "インターネットアクセスがある" - }, - "2": { - "then": "インターネットにアクセスできない" - } - }, - "question": "この場所はインターネットにアクセスできますか?" - }, - "caravansites-internet-fee": { - "mappings": { - "0": { - "then": "インターネット接続には別途料金が必要です" - }, - "1": { - "then": "インターネット接続に追加料金を支払う必要はありません" - } - }, - "question": "インターネット接続にお金はかかりますか?" - }, - "caravansites-long-term": { - "mappings": { - "0": { - "then": "はい、長期レンタルのスポットもあり、日常的に滞在することもできます" - }, - "1": { - "then": "いいえ、ここには長期滞在者はいません" - }, - "2": { - "then": "長期契約をしている場合のみ宿泊可能です(これを選択すると、この場所はこの地図から消えます)" - } - }, - "question": "ここには長期レンタルのスポットがありますか?" - }, - "caravansites-name": { - "question": "ここは何というところですか?", - "render": "この場所は {name} と呼ばれています" - }, - "caravansites-sanitary-dump": { - "mappings": { - "0": { - "then": "この場所には衛生的なゴミ捨て場がある" - }, - "1": { - "then": "この場所には衛生的なゴミ捨て場がない" - } - }, - "question": "この場所に衛生的なゴミ捨て場はありますか?" - }, - "caravansites-toilets": { - "mappings": { - "0": { - "then": "ここにはトイレがある" - }, - "1": { - "then": "ここにはトイレがない" - } - }, - "question": "ここにトイレはありますか?" - }, - "caravansites-website": { - "question": "ここにはウェブサイトがありますか?", - "render": "公式Webサイト: {website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "無名のキャンプサイト" - } - }, - "render": "キャンプサイト {name}" - } + "then": "無名のキャンプサイト" + } + }, + "render": "キャンプサイト {name}" + } + }, + "1": { + "description": "衛生ゴミ捨て場", + "name": "衛生ゴミ捨て場", + "presets": { + "0": { + "description": "新しい衛生ゴミ捨て場を追加します。ここは、キャンピングカーの運転手が排水や携帯トイレの廃棄物を捨てることができる場所です。飲料水や電気もあることが多いです。", + "title": "衛生ゴミ捨て場" + } + }, + "tagRenderings": { + "dumpstations-access": { + "mappings": { + "0": { + "then": "これを使用するには、ネットワークキー/コードが必要です" + }, + "1": { + "then": "この場所を使用するには、キャンプ/キャンプサイトのお客様である必要があります" + }, + "2": { + "then": "誰でもこのゴミ捨て場を使用できます" + }, + "3": { + "then": "誰でもこのゴミ捨て場を使用できます" + } + }, + "question": "このゴミ捨て場は誰が使えるんですか?" + }, + "dumpstations-charge": { + "question": "ここはいくらかかりますか?", + "render": "この場所は{charge} が必要" + }, + "dumpstations-chemical-waste": { + "mappings": { + "0": { + "then": "携帯トイレのゴミはここで処分できます" + }, + "1": { + "then": "ここでは携帯トイレの廃棄物を処分することはできません" + } + }, + "question": "携帯トイレのゴミはこちらで処分できますか?" + }, + "dumpstations-fee": { + "mappings": { + "0": { + "then": "使用料を支払う必要がある" + }, + "1": { + "then": "無料で使用可能" + } + }, + "question": "ここは有料ですか?" + }, + "dumpstations-grey-water": { + "mappings": { + "0": { + "then": "ここで汚水(雑排水)を捨てることができます" + }, + "1": { + "then": "ここでは汚水(雑排水)を捨てることはできない" + } + }, + "question": "汚水(雑排水)はこちらで処分できますか?" + }, + "dumpstations-network": { + "question": "ここは何のネットワークの一部ですか?(なければスキップ)", + "render": "このステーションはネットワーク{network}の一部です" + }, + "dumpstations-waterpoint": { + "mappings": { + "0": { + "then": "この場所には給水所がある" + }, + "1": { + "then": "この場所には給水所がない" + } + }, + "question": "この場所には給水所がありますか?" + } + }, + "title": { + "mappings": { + "0": { + "then": "ゴミ捨て場" + } + }, + "render": "ゴミ捨て場 {name}" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "この店は誰が経営しているんですか?", + "render": "この場所は{operator}によって運営されます" + }, + "1": { + "mappings": { + "0": { + "then": "この場所には電源があります" }, "1": { - "description": "衛生ゴミ捨て場", - "name": "衛生ゴミ捨て場", - "presets": { - "0": { - "description": "新しい衛生ゴミ捨て場を追加します。ここは、キャンピングカーの運転手が排水や携帯トイレの廃棄物を捨てることができる場所です。飲料水や電気もあることが多いです。", - "title": "衛生ゴミ捨て場" - } - }, - "tagRenderings": { - "dumpstations-access": { - "mappings": { - "0": { - "then": "これを使用するには、ネットワークキー/コードが必要です" - }, - "1": { - "then": "この場所を使用するには、キャンプ/キャンプサイトのお客様である必要があります" - }, - "2": { - "then": "誰でもこのゴミ捨て場を使用できます" - }, - "3": { - "then": "誰でもこのゴミ捨て場を使用できます" - } - }, - "question": "このゴミ捨て場は誰が使えるんですか?" - }, - "dumpstations-charge": { - "question": "ここはいくらかかりますか?", - "render": "この場所は{charge} が必要" - }, - "dumpstations-chemical-waste": { - "mappings": { - "0": { - "then": "携帯トイレのゴミはここで処分できます" - }, - "1": { - "then": "ここでは携帯トイレの廃棄物を処分することはできません" - } - }, - "question": "携帯トイレのゴミはこちらで処分できますか?" - }, - "dumpstations-fee": { - "mappings": { - "0": { - "then": "使用料を支払う必要がある" - }, - "1": { - "then": "無料で使用可能" - } - }, - "question": "ここは有料ですか?" - }, - "dumpstations-grey-water": { - "mappings": { - "0": { - "then": "ここで汚水(雑排水)を捨てることができます" - }, - "1": { - "then": "ここでは汚水(雑排水)を捨てることはできない" - } - }, - "question": "汚水(雑排水)はこちらで処分できますか?" - }, - "dumpstations-network": { - "question": "ここは何のネットワークの一部ですか?(なければスキップ)", - "render": "このステーションはネットワーク{network}の一部です" - }, - "dumpstations-waterpoint": { - "mappings": { - "0": { - "then": "この場所には給水所がある" - }, - "1": { - "then": "この場所には給水所がない" - } - }, - "question": "この場所には給水所がありますか?" - } - }, - "title": { - "mappings": { - "0": { - "then": "ゴミ捨て場" - } - }, - "render": "ゴミ捨て場 {name}" - } + "then": "この場所には電源がありません" } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "この店は誰が経営しているんですか?", - "render": "この場所は{operator}によって運営されます" - }, - "1": { - "mappings": { - "0": { - "then": "この場所には電源があります" - }, - "1": { - "then": "この場所には電源がありません" - } - }, - "question": "この場所に電源はありますか?" - } - } - }, - "shortDescription": "キャンパーと夜を共にするキャンプサイトを見つける", - "title": "キャンプサイト" + }, + "question": "この場所に電源はありますか?" + } + } }, - "charging_stations": { - "description": "このオープンマップでは充電ステーションに関する情報を見つけてマークすることができます", - "shortDescription": "充電ステーションの世界地図", - "title": "充電ステーション" - }, - "climbing": { - "description": "この地図には、自然の中のクライミングジム、ボルダリングホール、岩など、さまざまなクライミングの機会があります。", - "descriptionTail": "登山地図はもともと Christian Neumann によって作成されたものです。フィードバックや質問がありましたら、ご連絡ください。

    このプロジェクトでは、OpenStreetMapプロジェクトのデータを使用します。

    ", - "layers": { + "shortDescription": "キャンパーと夜を共にするキャンプサイトを見つける", + "title": "キャンプサイト" + }, + "charging_stations": { + "description": "このオープンマップでは充電ステーションに関する情報を見つけてマークすることができます", + "shortDescription": "充電ステーションの世界地図", + "title": "充電ステーション" + }, + "climbing": { + "description": "この地図には、自然の中のクライミングジム、ボルダリングホール、岩など、さまざまなクライミングの機会があります。", + "descriptionTail": "登山地図はもともと Christian Neumann によって作成されたものです。フィードバックや質問がありましたら、ご連絡ください。

    このプロジェクトでは、OpenStreetMapプロジェクトのデータを使用します。

    ", + "layers": { + "0": { + "description": "クライミングクラブや団体", + "name": "クライミングクラブ", + "presets": { + "0": { + "description": "クライミングクラブ", + "title": "クライミングクラブ" + }, + "1": { + "description": "登山に関わるNGO", + "title": "クライミングNGO" + } + }, + "tagRenderings": { + "climbing_club-name": { + "question": "この登山クラブやNGOの名前は何ですか?", + "render": "{name}" + } + }, + "title": { + "mappings": { "0": { - "description": "クライミングクラブや団体", - "name": "クライミングクラブ", - "presets": { - "0": { - "description": "クライミングクラブ", - "title": "クライミングクラブ" - }, - "1": { - "description": "登山に関わるNGO", - "title": "クライミングNGO" - } - }, - "tagRenderings": { - "climbing_club-name": { - "question": "この登山クラブやNGOの名前は何ですか?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "クライミングNGO" - } - }, - "render": "クライミングクラブ" - } + "then": "クライミングNGO" + } + }, + "render": "クライミングクラブ" + } + }, + "1": { + "description": "クライミングジム", + "name": "クライミングジム", + "tagRenderings": { + "name": { + "question": "このクライミングジムは何という名前ですか?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "クライミングジム{name}" + } + }, + "render": "クライミングジム" + } + }, + "2": { + "name": "登坂ルート", + "tagRenderings": { + "Difficulty": { + "render": "フランス/ベルギーのランク評価システムによると、{climbing:grade:french}の困難度です" + }, + "Length": { + "render": "このルート長は、 {canonical(climbing:length)} メーターです" + }, + "Name": { + "mappings": { + "0": { + "then": "この登坂ルートには名前がありません" + } + }, + "question": "この登坂ルートの名前は何ですか?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "登坂ルート{name}" + } + }, + "render": "登坂ルート" + } + }, + "3": { + "description": "登坂教室", + "name": "登坂教室", + "presets": { + "0": { + "description": "登坂教室", + "title": "登坂教室" + } + }, + "tagRenderings": { + "name": { + "mappings": { + "0": { + "then": "この登坂教室には名前がついていない" + } + }, + "question": "この登坂教室の名前は何ですか?", + "render": "{name}" + } + }, + "title": { + "render": "登坂教室" + } + }, + "4": { + "description": "登坂教室?", + "name": "登坂教室?", + "tagRenderings": { + "climbing-opportunity-name": { + "render": "{name}" + }, + "climbing-possible": { + "mappings": { + "0": { + "then": "ここでは登ることができない" + }, + "1": { + "then": "ここでは登ることができる" + }, + "2": { + "then": "ここでは登ることができない" + } + }, + "question": "ここで登坂はできますか?" + } + }, + "title": { + "render": "登坂教室?" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "もっと情報のある(非公式の)ウェブサイトはありますか(例えば、topos)?" + }, + "4": { + "question": "ルートの(平均)長さはメートル単位でいくつですか?", + "render": "ルートの長さは平均で{canonical(climbing:length)}です" + }, + "5": { + "question": "ここで一番簡単なルートのレベルは、フランスのランク評価システムで何ですか?", + "render": "フランス/ベルギーのランク評価システムでは、最小の難易度は{climbing:grade:french:min}です" + }, + "6": { + "question": "フランスのランク評価によると、ここで一番難しいルートのレベルはどれくらいですか?", + "render": "フランス/ベルギーのランク評価システムでは、最大の難易度は{climbing:grade:french:max}です" + }, + "7": { + "mappings": { + "0": { + "then": "ボルダリングはここで可能です" }, "1": { - "description": "クライミングジム", - "name": "クライミングジム", - "tagRenderings": { - "name": { - "question": "このクライミングジムは何という名前ですか?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "クライミングジム{name}" - } - }, - "render": "クライミングジム" - } + "then": "ここではボルダリングはできません" }, "2": { - "name": "登坂ルート", - "tagRenderings": { - "Difficulty": { - "render": "フランス/ベルギーのランク評価システムによると、{climbing:grade:french}の困難度です" - }, - "Length": { - "render": "このルート長は、 {canonical(climbing:length)} メーターです" - }, - "Name": { - "mappings": { - "0": { - "then": "この登坂ルートには名前がありません" - } - }, - "question": "この登坂ルートの名前は何ですか?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "登坂ルート{name}" - } - }, - "render": "登坂ルート" - } + "then": "ボルダリングは可能ですが、少しのルートしかありません" }, "3": { - "description": "登坂教室", - "name": "登坂教室", - "presets": { - "0": { - "description": "登坂教室", - "title": "登坂教室" - } - }, - "tagRenderings": { - "name": { - "mappings": { - "0": { - "then": "この登坂教室には名前がついていない" - } - }, - "question": "この登坂教室の名前は何ですか?", - "render": "{name}" - } - }, - "title": { - "render": "登坂教室" - } - }, - "4": { - "description": "登坂教室?", - "name": "登坂教室?", - "tagRenderings": { - "climbing-opportunity-name": { - "render": "{name}" - }, - "climbing-possible": { - "mappings": { - "0": { - "then": "ここでは登ることができない" - }, - "1": { - "then": "ここでは登ることができる" - }, - "2": { - "then": "ここでは登ることができない" - } - }, - "question": "ここで登坂はできますか?" - } - }, - "title": { - "render": "登坂教室?" - } + "then": "{climbing:boulder} ボルダールートがある" } + }, + "question": "ここでボルダリングはできますか?" }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "もっと情報のある(非公式の)ウェブサイトはありますか(例えば、topos)?" - }, - "4": { - "question": "ルートの(平均)長さはメートル単位でいくつですか?", - "render": "ルートの長さは平均で{canonical(climbing:length)}です" - }, - "5": { - "question": "ここで一番簡単なルートのレベルは、フランスのランク評価システムで何ですか?", - "render": "フランス/ベルギーのランク評価システムでは、最小の難易度は{climbing:grade:french:min}です" - }, - "6": { - "question": "フランスのランク評価によると、ここで一番難しいルートのレベルはどれくらいですか?", - "render": "フランス/ベルギーのランク評価システムでは、最大の難易度は{climbing:grade:french:max}です" - }, - "7": { - "mappings": { - "0": { - "then": "ボルダリングはここで可能です" - }, - "1": { - "then": "ここではボルダリングはできません" - }, - "2": { - "then": "ボルダリングは可能ですが、少しのルートしかありません" - }, - "3": { - "then": "{climbing:boulder} ボルダールートがある" - } - }, - "question": "ここでボルダリングはできますか?" - }, - "8": { - "mappings": { - "0": { - "then": "ここでToprope登坂ができます" - }, - "1": { - "then": "ここではToprope登坂はできません" - }, - "2": { - "then": "{climbing:toprope} 登坂ルートがある" - } - }, - "question": "ここでtoprope登坂はできますか?" - }, - "9": { - "mappings": { - "0": { - "then": "ここでスポーツクライミングができます" - }, - "1": { - "then": "ここではスポーツクライミングはできません" - }, - "2": { - "then": "スポーツクライミングの {climbing:sport} ルートがある" - } - }, - "question": "ここでは固定アンカー式のスポーツクライミングはできますか?" - }, - "10": { - "mappings": { - "0": { - "then": "ここでは伝統的な登山が可能です" - }, - "1": { - "then": "伝統的な登山はここではできない" - }, - "2": { - "then": "{climbing:traditional} の伝統的な登山ルートがある" - } - }, - "question": "伝統的な登山はここで可能ですか(例えば、チョックのような独自のギアを使用して)?" - }, - "11": { - "mappings": { - "0": { - "then": "スピードクライミングウォールがある" - }, - "1": { - "then": "スピードクライミングウォールがない" - }, - "2": { - "then": "{climbing:speed} のスピードクライミングウォールがある" - } - }, - "question": "スピードクライミングウォールはありますか?" - } - } - }, - "title": "登山地図を開く" - }, - "cyclestreets": { - "description": "cyclestreetとは、自動車がサイクリストを追い越すことができない道です。専用の道路標識で表示されます。Cyclestreetsはオランダやベルギーにもありますが、ドイツやフランスにもあります。 ", - "layers": { + "8": { + "mappings": { "0": { - "description": "cyclestreetとは、自動車による交通がサイクリストを追い越すことができない道路です", - "name": "Cyclestreets" + "then": "ここでToprope登坂ができます" }, "1": { - "description": "この通りはまもなくcyclestreetになります", - "name": "将来のcyclestreet", - "title": { - "mappings": { - "0": { - "then": "{name}は、もうすぐcyclestreetになる" - } - }, - "render": "将来のcyclestreet" - } + "then": "ここではToprope登坂はできません" }, "2": { - "description": "任意の道路をCycle Streetとしてマークするレイヤ", - "name": "すべての道路", - "title": { - "render": "ストリート" - } + "then": "{climbing:toprope} 登坂ルートがある" } + }, + "question": "ここでtoprope登坂はできますか?" }, - "overrideAll": { - "tagRenderings+": { - "0": { - "mappings": { - "0": { - "then": "cyclestreet(最高速度は30km/h)" - }, - "1": { - "then": "この通りはcyclestreetだ" - }, - "2": { - "then": "この通りはまもなくcyclstreetになるだろう" - }, - "3": { - "then": "この通りはcyclestreetではない" - } - }, - "question": "この通りはcyclestreetですか?" - }, - "1": { - "question": "この通りはいつcyclestreetになるんですか?", - "render": "この通りは{cyclestreet:start_date}に、cyclestreetになります" - } - } - }, - "shortDescription": "cyclestreetsの地図", - "title": "Cyclestreets" - }, - "cyclofix": { - "description": "このマップの目的は、サイクリストのニーズに適した施設を見つけるための使いやすいソリューションを提供することです。

    正確な位置を追跡し(モバイルのみ)、左下コーナーで関連するレイヤを選択できます。このツールを使用して、マップにピン(注目点)を追加または編集したり、質問に答えることでより多くのデータを提供することもできます。

    変更内容はすべてOpenStreetMapのグローバルデータベースに自動的に保存され、他のユーザーが自由に再利用できます。

    cyclofixプロジェクトの詳細については、 cyclofix.osm.be を参照してください。", - "title": "Cyclofix - サイクリストのためのオープンマップ" - }, - "drinking_water": { - "description": "この地図には、一般にアクセス可能な飲料水スポットが示されており、簡単に追加することができる", - "title": "飲料水" - }, - "facadegardens": { - "description": "ファサード庭園、都市の緑のファサードと樹木は、平和と静けさをもたらすだけでなく、より美しい都市、より大きな生物多様性、冷却効果、より良い大気質をもたらす。
    KlimaanのVZWとMechelenのKlimaatneutraalは、自分で庭を作りたい人や自然を愛する都市の歩行者のために、既存のファサード庭園と新しいファサード庭園のマッピングしたいと考えています。
    このプロジェクトに関する詳細情報はklimaanにあります。", - "layers": { + "9": { + "mappings": { "0": { - "description": "ファサード庭園", - "name": "ファサード庭園", - "presets": { - "0": { - "description": "ファサード庭園を追加する", - "title": "ファサード庭園" - } - }, - "tagRenderings": { - "facadegardens-description": { - "question": "庭園に関する追加の説明情報(必要な場合でまだ上記に記載されていない場合)", - "render": "詳細情報: {description}" - }, - "facadegardens-direction": { - "question": "庭の向きはどうなっていますか?", - "render": "方向: {direction} (0=N で 90=O)" - }, - "facadegardens-edible": { - "mappings": { - "0": { - "then": "食用の植物がある" - }, - "1": { - "then": "食用植物は存在しない" - } - }, - "question": "食用の植物はありますか?" - }, - "facadegardens-plants": { - "mappings": { - "0": { - "then": "つるがある" - }, - "1": { - "then": "花を咲かせる植物がある" - }, - "2": { - "then": "低木がある" - }, - "3": { - "then": "地をはう植物がある" - } - }, - "question": "ここではどんな植物が育つんですか?" - }, - "facadegardens-rainbarrel": { - "mappings": { - "0": { - "then": "雨樽がある" - }, - "1": { - "then": "雨樽はありません" - } - }, - "question": "庭に水桶が設置されているのですか?" - }, - "facadegardens-start_date": { - "question": "その庭園はいつ造られたのですか?(建設年で十分です)", - "render": "庭園の建設日: {start_date}" - }, - "facadegardens-sunshine": { - "mappings": { - "0": { - "then": "庭は日があたっている" - }, - "1": { - "then": "庭は部分的に日陰である" - }, - "2": { - "then": "庭は日陰である" - } - }, - "question": "庭は日陰ですか、日当たりがいいですか?" - } - }, - "title": { - "render": "ファサード庭園" - } - } - }, - "shortDescription": "このマップには、ファサード庭園が図とともに表示され、方向、日照、植物のタイプに関する有用な情報が示されます。", - "title": "ファサード庭園" - }, - "ghostbikes": { - "description": "ゴーストバイクは、交通事故で死亡したサイクリストを記念するもので、事故現場の近くに恒久的に置かれた白い自転車の形をしています。

    このマップには、OpenStreetMapで知られているゴーストバイクがすべて表示されます。ゴーストバイクは行方不明ですか?誰でもここで情報の追加や更新ができます。必要なのは(無料の)OpenStreetMapアカウントだけです。", - "title": "ゴーストバイク" - }, - "hailhydrant": { - "description": "このマップでは、お気に入りの近隣にある消火栓、消防署、救急ステーション、消火器を検索して更新できます。\n\n正確な位置を追跡し(モバイルのみ)、左下コーナーで関連するレイヤを選択できます。このツールを使用して、マップにピン(注視点)を追加または編集したり、利用可能な質問に答えることによって追加の詳細を提供することもできます。\n\nすべての変更は自動的にOpenStreetMapのグローバルデータベースに保存され、他のユーザが自由に再利用できます。", - "layers": { - "0": { - "description": "消火栓を表示するマップレイヤ。", - "name": "消火栓の地図", - "presets": { - "0": { - "description": "消火栓は消防士が水を汲み上げることができる接続点です。地下にあるかもしれません。", - "title": "消火栓" - } - }, - "tagRenderings": { - "hydrant-color": { - "mappings": { - "0": { - "then": "消火栓の色は不明です。" - }, - "1": { - "then": "消火栓の色は黄色です。" - }, - "2": { - "then": "消火栓の色は赤です。" - } - }, - "question": "消火栓の色は何色ですか?", - "render": "消火栓の色は{color}です" - }, - "hydrant-state": { - "mappings": { - "0": { - "then": "消火栓は(完全にまたは部分的に)機能しています。" - }, - "1": { - "then": "消火栓は使用できません。" - }, - "2": { - "then": "消火栓が撤去されました。" - } - }, - "question": "消火栓のライフサイクルステータスを更新します。", - "render": "ライフサイクルステータス" - }, - "hydrant-type": { - "mappings": { - "0": { - "then": "消火栓の種類は不明です。" - }, - "1": { - "then": " ピラー型。" - }, - "2": { - "then": " パイプ型。" - }, - "3": { - "then": " 壁型。" - }, - "4": { - "then": "地下式。" - } - }, - "question": "どんな消火栓なんですか?", - "render": " 消火栓のタイプ:{fire_hydrant:type}" - } - }, - "title": { - "render": "消火栓" - } + "then": "ここでスポーツクライミングができます" }, "1": { - "description": "消火栓を表示するマップレイヤ。", - "name": "消火器の地図です。", - "presets": { - "0": { - "description": "消火器は、火災を止めるために使用される小型で携帯可能な装置である", - "title": "消火器" - } - }, - "tagRenderings": { - "extinguisher-location": { - "mappings": { - "0": { - "then": "屋内にある。" - }, - "1": { - "then": "屋外にある。" - } - }, - "question": "どこにあるんですか?", - "render": "場所:{location}" - } - }, - "title": { - "render": "消火器" - } + "then": "ここではスポーツクライミングはできません" }, "2": { - "description": "消防署を表示するためのマップレイヤ。", - "name": "消防署の地図", - "presets": { - "0": { - "description": "消防署は、運転していないときに消防車や消防士がいる場所です。", - "title": "消防署" - } - }, - "tagRenderings": { - "station-agency": { - "mappings": { - "0": { - "then": "消防局(消防庁)" - } - }, - "question": "このステーションを運営しているのはどこですか?", - "render": "このステーションは{operator}によって運営されています。" - }, - "station-name": { - "question": "この消防署の名前は何ですか?", - "render": "このステーションの名前は{name}です。" - }, - "station-operator": { - "mappings": { - "0": { - "then": "ステーションは自治体が運営する。" - }, - "1": { - "then": "任意団体やコミュニティが運営しているステーションである。" - }, - "2": { - "then": "公益団体が運営しているステーションである。" - }, - "3": { - "then": "個人が運営しているステーションである。" - } - }, - "question": "ステーションの運営の分類は?", - "render": "運営者は、{operator:type} です。" - }, - "station-place": { - "question": "このステーションの住所は?(例: 地区、村、または町の名称)", - "render": "このステーションは{addr:place}にあります。" - }, - "station-street": { - "question": " 救急ステーションの所在地はどこですか?", - "render": "{addr:street} 沿いにあります。" - } - }, - "title": { - "render": "消防署" - } + "then": "スポーツクライミングの {climbing:sport} ルートがある" + } + }, + "question": "ここでは固定アンカー式のスポーツクライミングはできますか?" + }, + "10": { + "mappings": { + "0": { + "then": "ここでは伝統的な登山が可能です" + }, + "1": { + "then": "伝統的な登山はここではできない" + }, + "2": { + "then": "{climbing:traditional} の伝統的な登山ルートがある" + } + }, + "question": "伝統的な登山はここで可能ですか(例えば、チョックのような独自のギアを使用して)?" + }, + "11": { + "mappings": { + "0": { + "then": "スピードクライミングウォールがある" + }, + "1": { + "then": "スピードクライミングウォールがない" + }, + "2": { + "then": "{climbing:speed} のスピードクライミングウォールがある" + } + }, + "question": "スピードクライミングウォールはありますか?" + } + } + }, + "title": "登山地図を開く" + }, + "cyclestreets": { + "description": "cyclestreetとは、自動車がサイクリストを追い越すことができない道です。専用の道路標識で表示されます。Cyclestreetsはオランダやベルギーにもありますが、ドイツやフランスにもあります。 ", + "layers": { + "0": { + "description": "cyclestreetとは、自動車による交通がサイクリストを追い越すことができない道路です", + "name": "Cyclestreets" + }, + "1": { + "description": "この通りはまもなくcyclestreetになります", + "name": "将来のcyclestreet", + "title": { + "mappings": { + "0": { + "then": "{name}は、もうすぐcyclestreetになる" + } + }, + "render": "将来のcyclestreet" + } + }, + "2": { + "description": "任意の道路をCycle Streetとしてマークするレイヤ", + "name": "すべての道路", + "title": { + "render": "ストリート" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "mappings": { + "0": { + "then": "cyclestreet(最高速度は30km/h)" + }, + "1": { + "then": "この通りはcyclestreetだ" + }, + "2": { + "then": "この通りはまもなくcyclstreetになるだろう" }, "3": { - "description": "救急ステーションは、救急車、医療機器、個人用保護具、およびその他の医療用品を保管する場所です。", - "name": "救急ステーションの地図", - "presets": { - "0": { - "description": "救急ステーション(消防署)をマップに追加する", - "title": "救急ステーション(消防署)" - } - }, - "tagRenderings": { - "ambulance-agency": { - "question": "このステーションを運営しているのはどこですか?", - "render": "このステーションは{operator}によって運営されています。" - }, - "ambulance-name": { - "question": "この救急ステーションの名前は何ですか?", - "render": "このステーションの名前は{name}です。" - }, - "ambulance-operator-type": { - "mappings": { - "0": { - "then": "ステーションは自治体が運営する。" - }, - "1": { - "then": "任意団体やコミュニティが運営しているステーションである。" - }, - "2": { - "then": "公益団体が運営しているステーションである。" - }, - "3": { - "then": "個人が運営しているステーションである。" - } - }, - "question": "ステーションの運営の分類は?", - "render": "運営者は、{operator:type} です。" - }, - "ambulance-place": { - "question": "このステーションの住所は?(例: 地区、村、または町の名称)", - "render": "このステーションは{addr:place}にあります。" - }, - "ambulance-street": { - "question": " 救急ステーションの所在地はどこですか?", - "render": "{addr:street} 沿いにあります。" - } - }, - "title": { - "render": "救急ステーション" - } + "then": "この通りはcyclestreetではない" } + }, + "question": "この通りはcyclestreetですか?" }, - "shortDescription": "消火栓、消火器、消防署消火栓、消火器、消防署、および救急ステーションを表示します。", - "title": "消火栓、消火器、消防署、救急ステーションです。" + "1": { + "question": "この通りはいつcyclestreetになるんですか?", + "render": "この通りは{cyclestreet:start_date}に、cyclestreetになります" + } + } }, - "maps": { - "description": "このマップには、OpenStreetMapが知っているすべてのマップが表示されます。通常は、エリア、都市、または地域を示す情報ボード上の大きなマップが表示されます。たとえば、ビルボードの背面にある観光マップ、自然保護区のマップ、地域内のサイクリングネットワークのマップなどです。)

    マップがない場合は、このマップをOpenStreetMapに簡単にマップできます。", - "shortDescription": "このテーマには、OpenStreetMapが知っているすべての(観光)マップが表示されます", - "title": "マップのマップ" + "shortDescription": "cyclestreetsの地図", + "title": "Cyclestreets" + }, + "cyclofix": { + "description": "このマップの目的は、サイクリストのニーズに適した施設を見つけるための使いやすいソリューションを提供することです。

    正確な位置を追跡し(モバイルのみ)、左下コーナーで関連するレイヤを選択できます。このツールを使用して、マップにピン(注目点)を追加または編集したり、質問に答えることでより多くのデータを提供することもできます。

    変更内容はすべてOpenStreetMapのグローバルデータベースに自動的に保存され、他のユーザーが自由に再利用できます。

    cyclofixプロジェクトの詳細については、 cyclofix.osm.be を参照してください。", + "title": "Cyclofix - サイクリストのためのオープンマップ" + }, + "drinking_water": { + "description": "この地図には、一般にアクセス可能な飲料水スポットが示されており、簡単に追加することができる", + "title": "飲料水" + }, + "facadegardens": { + "description": "ファサード庭園、都市の緑のファサードと樹木は、平和と静けさをもたらすだけでなく、より美しい都市、より大きな生物多様性、冷却効果、より良い大気質をもたらす。
    KlimaanのVZWとMechelenのKlimaatneutraalは、自分で庭を作りたい人や自然を愛する都市の歩行者のために、既存のファサード庭園と新しいファサード庭園のマッピングしたいと考えています。
    このプロジェクトに関する詳細情報はklimaanにあります。", + "layers": { + "0": { + "description": "ファサード庭園", + "name": "ファサード庭園", + "presets": { + "0": { + "description": "ファサード庭園を追加する", + "title": "ファサード庭園" + } + }, + "tagRenderings": { + "facadegardens-description": { + "question": "庭園に関する追加の説明情報(必要な場合でまだ上記に記載されていない場合)", + "render": "詳細情報: {description}" + }, + "facadegardens-direction": { + "question": "庭の向きはどうなっていますか?", + "render": "方向: {direction} (0=N で 90=O)" + }, + "facadegardens-edible": { + "mappings": { + "0": { + "then": "食用の植物がある" + }, + "1": { + "then": "食用植物は存在しない" + } + }, + "question": "食用の植物はありますか?" + }, + "facadegardens-plants": { + "mappings": { + "0": { + "then": "つるがある" + }, + "1": { + "then": "花を咲かせる植物がある" + }, + "2": { + "then": "低木がある" + }, + "3": { + "then": "地をはう植物がある" + } + }, + "question": "ここではどんな植物が育つんですか?" + }, + "facadegardens-rainbarrel": { + "mappings": { + "0": { + "then": "雨樽がある" + }, + "1": { + "then": "雨樽はありません" + } + }, + "question": "庭に水桶が設置されているのですか?" + }, + "facadegardens-start_date": { + "question": "その庭園はいつ造られたのですか?(建設年で十分です)", + "render": "庭園の建設日: {start_date}" + }, + "facadegardens-sunshine": { + "mappings": { + "0": { + "then": "庭は日があたっている" + }, + "1": { + "then": "庭は部分的に日陰である" + }, + "2": { + "then": "庭は日陰である" + } + }, + "question": "庭は日陰ですか、日当たりがいいですか?" + } + }, + "title": { + "render": "ファサード庭園" + } + } }, - "personal": { - "description": "すべてのテーマの使用可能なすべてのレイヤーに基づいて個人用テーマを作成する", - "title": "個人的なテーマ" + "shortDescription": "このマップには、ファサード庭園が図とともに表示され、方向、日照、植物のタイプに関する有用な情報が示されます。", + "title": "ファサード庭園" + }, + "ghostbikes": { + "description": "ゴーストバイクは、交通事故で死亡したサイクリストを記念するもので、事故現場の近くに恒久的に置かれた白い自転車の形をしています。

    このマップには、OpenStreetMapで知られているゴーストバイクがすべて表示されます。ゴーストバイクは行方不明ですか?誰でもここで情報の追加や更新ができます。必要なのは(無料の)OpenStreetMapアカウントだけです。", + "title": "ゴーストバイク" + }, + "hailhydrant": { + "description": "このマップでは、お気に入りの近隣にある消火栓、消防署、救急ステーション、消火器を検索して更新できます。\n\n正確な位置を追跡し(モバイルのみ)、左下コーナーで関連するレイヤを選択できます。このツールを使用して、マップにピン(注視点)を追加または編集したり、利用可能な質問に答えることによって追加の詳細を提供することもできます。\n\nすべての変更は自動的にOpenStreetMapのグローバルデータベースに保存され、他のユーザが自由に再利用できます。", + "layers": { + "0": { + "description": "消火栓を表示するマップレイヤ。", + "name": "消火栓の地図", + "presets": { + "0": { + "description": "消火栓は消防士が水を汲み上げることができる接続点です。地下にあるかもしれません。", + "title": "消火栓" + } + }, + "tagRenderings": { + "hydrant-color": { + "mappings": { + "0": { + "then": "消火栓の色は不明です。" + }, + "1": { + "then": "消火栓の色は黄色です。" + }, + "2": { + "then": "消火栓の色は赤です。" + } + }, + "question": "消火栓の色は何色ですか?", + "render": "消火栓の色は{colour}です" + }, + "hydrant-state": { + "mappings": { + "0": { + "then": "消火栓は(完全にまたは部分的に)機能しています。" + }, + "1": { + "then": "消火栓は使用できません。" + }, + "2": { + "then": "消火栓が撤去されました。" + } + }, + "question": "消火栓のライフサイクルステータスを更新します。" + }, + "hydrant-type": { + "mappings": { + "0": { + "then": "消火栓の種類は不明です。" + }, + "1": { + "then": " ピラー型。" + }, + "2": { + "then": " パイプ型。" + }, + "3": { + "then": " 壁型。" + }, + "4": { + "then": "地下式。" + } + }, + "question": "どんな消火栓なんですか?", + "render": " 消火栓のタイプ:{fire_hydrant:type}" + } + }, + "title": { + "render": "消火栓" + } + }, + "1": { + "description": "消火栓を表示するマップレイヤ。", + "name": "消火器の地図です。", + "presets": { + "0": { + "description": "消火器は、火災を止めるために使用される小型で携帯可能な装置である", + "title": "消火器" + } + }, + "tagRenderings": { + "extinguisher-location": { + "mappings": { + "0": { + "then": "屋内にある。" + }, + "1": { + "then": "屋外にある。" + } + }, + "question": "どこにあるんですか?", + "render": "場所:{location}" + } + }, + "title": { + "render": "消火器" + } + }, + "2": { + "description": "消防署を表示するためのマップレイヤ。", + "name": "消防署の地図", + "presets": { + "0": { + "description": "消防署は、運転していないときに消防車や消防士がいる場所です。", + "title": "消防署" + } + }, + "tagRenderings": { + "station-agency": { + "mappings": { + "0": { + "then": "消防局(消防庁)" + } + }, + "question": "このステーションを運営しているのはどこですか?", + "render": "このステーションは{operator}によって運営されています。" + }, + "station-name": { + "question": "この消防署の名前は何ですか?", + "render": "このステーションの名前は{name}です。" + }, + "station-operator": { + "mappings": { + "0": { + "then": "ステーションは自治体が運営する。" + }, + "1": { + "then": "任意団体やコミュニティが運営しているステーションである。" + }, + "2": { + "then": "公益団体が運営しているステーションである。" + }, + "3": { + "then": "個人が運営しているステーションである。" + } + }, + "question": "ステーションの運営の分類は?", + "render": "運営者は、{operator:type} です。" + }, + "station-place": { + "question": "このステーションの住所は?(例: 地区、村、または町の名称)", + "render": "このステーションは{addr:place}にあります。" + }, + "station-street": { + "question": " 救急ステーションの所在地はどこですか?", + "render": "{addr:street} 沿いにあります。" + } + }, + "title": { + "render": "消防署" + } + }, + "3": { + "description": "救急ステーションは、救急車、医療機器、個人用保護具、およびその他の医療用品を保管する場所です。", + "name": "救急ステーションの地図", + "presets": { + "0": { + "description": "救急ステーション(消防署)をマップに追加する", + "title": "救急ステーション(消防署)" + } + }, + "tagRenderings": { + "ambulance-agency": { + "question": "このステーションを運営しているのはどこですか?", + "render": "このステーションは{operator}によって運営されています。" + }, + "ambulance-name": { + "question": "この救急ステーションの名前は何ですか?", + "render": "このステーションの名前は{name}です。" + }, + "ambulance-operator-type": { + "mappings": { + "0": { + "then": "ステーションは自治体が運営する。" + }, + "1": { + "then": "任意団体やコミュニティが運営しているステーションである。" + }, + "2": { + "then": "公益団体が運営しているステーションである。" + }, + "3": { + "then": "個人が運営しているステーションである。" + } + }, + "question": "ステーションの運営の分類は?", + "render": "運営者は、{operator:type} です。" + }, + "ambulance-place": { + "question": "このステーションの住所は?(例: 地区、村、または町の名称)", + "render": "このステーションは{addr:place}にあります。" + }, + "ambulance-street": { + "question": " 救急ステーションの所在地はどこですか?", + "render": "{addr:street} 沿いにあります。" + } + }, + "title": { + "render": "救急ステーション" + } + } }, - "playgrounds": { - "description": "この地図では遊び場を見つけ情報を追加することができます", - "shortDescription": "遊び場のある地図", - "title": "遊び場" - }, - "shops": { - "description": "この地図には店の基本情報を記入したり営業時間や電話番号を追加することができます", - "shortDescription": "基本的なショップ情報を含む編集可能なマップ", - "title": "オープン ショップ マップ" - }, - "sport_pitches": { - "description": "スポーツ競技場は、スポーツが行われる場所です", - "shortDescription": "スポーツ競技場を示す地図", - "title": "スポーツ競技場" - }, - "surveillance": { - "description": "このオープンマップでは、監視カメラを確認できます。", - "shortDescription": "監視カメラおよびその他の監視手段", - "title": "監視カメラの監視" - }, - "toilets": { - "description": "公衆トイレの地図", - "title": "オープントイレマップ" - }, - "trees": { - "description": "すべての樹木をマッピングします!", - "shortDescription": "すべての樹木をマッピングする", - "title": "樹木" - } + "shortDescription": "消火栓、消火器、消防署消火栓、消火器、消防署、および救急ステーションを表示します。", + "title": "消火栓、消火器、消防署、救急ステーションです。" + }, + "maps": { + "description": "このマップには、OpenStreetMapが知っているすべてのマップが表示されます。通常は、エリア、都市、または地域を示す情報ボード上の大きなマップが表示されます。たとえば、ビルボードの背面にある観光マップ、自然保護区のマップ、地域内のサイクリングネットワークのマップなどです。)

    マップがない場合は、このマップをOpenStreetMapに簡単にマップできます。", + "shortDescription": "このテーマには、OpenStreetMapが知っているすべての(観光)マップが表示されます", + "title": "マップのマップ" + }, + "personal": { + "description": "すべてのテーマの使用可能なすべてのレイヤーに基づいて個人用テーマを作成する", + "title": "個人的なテーマ" + }, + "playgrounds": { + "description": "この地図では遊び場を見つけ情報を追加することができます", + "shortDescription": "遊び場のある地図", + "title": "遊び場" + }, + "shops": { + "description": "この地図には店の基本情報を記入したり営業時間や電話番号を追加することができます", + "shortDescription": "基本的なショップ情報を含む編集可能なマップ", + "title": "オープン ショップ マップ" + }, + "sport_pitches": { + "description": "スポーツ競技場は、スポーツが行われる場所です", + "shortDescription": "スポーツ競技場を示す地図", + "title": "スポーツ競技場" + }, + "surveillance": { + "description": "このオープンマップでは、監視カメラを確認できます。", + "shortDescription": "監視カメラおよびその他の監視手段", + "title": "監視カメラの監視" + }, + "toilets": { + "description": "公衆トイレの地図", + "title": "オープントイレマップ" + }, + "trees": { + "description": "すべての樹木をマッピングします!", + "shortDescription": "すべての樹木をマッピングする", + "title": "樹木" + } } \ No newline at end of file diff --git a/langs/themes/nan.json b/langs/themes/nan.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/langs/themes/nan.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/langs/themes/nb_NO.json b/langs/themes/nb_NO.json index a423c9f02b..0738450f8e 100644 --- a/langs/themes/nb_NO.json +++ b/langs/themes/nb_NO.json @@ -1,406 +1,341 @@ { - "aed": { - "description": "Defibrillatorer i nærheten", - "title": "Åpent AED-kart" - }, - "artwork": { - "description": "Velkommen til det åpne kunstverkskartet, et kart over statuer, byster, grafitti, og andre kunstverk i verden" - }, - "benches": { - "shortDescription": "Et benkekart", - "title": "Benker" - }, - "bicyclelib": { - "title": "Sykkelbibliotek" - }, - "binoculars": { - "shortDescription": "Et kart over fastmonterte kikkerter", - "title": "Kikkerter" - }, - "bookcases": { - "title": "Kart over åpne bokhyller" - }, - "cafes_and_pubs": { - "title": "Kafeer og kneiper" - }, - "campersite": { - "layers": { - "0": { - "tagRenderings": { - "caravansites-charge": { - "question": "pø", - "render": "Dette stedet tar {charge}" - }, - "caravansites-description": { - "render": "Flere detaljer om dette stedet: {description}" - }, - "caravansites-fee": { - "mappings": { - "0": { - "then": "Man må betale for bruk" - }, - "1": { - "then": "Kan brukes gratis" - } - } - }, - "caravansites-internet": { - "mappings": { - "0": { - "then": "Det finnes tilgang til Internett" - }, - "1": { - "then": "Det er tilgang til Internett" - }, - "2": { - "then": "Det er tilgang til Internett" - } - }, - "question": "Tilbyr dette stedet tilgang til Internett?" - }, - "caravansites-internet-fee": { - "mappings": { - "0": { - "then": "Man må betale ekstra for tilgang til Internett" - }, - "1": { - "then": "Man må ikke betale ekstra for tilgang til Internett" - } - }, - "question": "Må man betale for tilgang til Internett?" - }, - "caravansites-toilets": { - "mappings": { - "0": { - "then": "Dette stedet har toalettfasiliteter" - }, - "1": { - "then": "Dette stedet har ikke toalettfasiliteter" - } - }, - "question": "Har dette stedet toaletter?" - }, - "caravansites-website": { - "question": "Har dette stedet en nettside?", - "render": "Offisiell nettside: {website}" - } - } + "aed": { + "description": "Defibrillatorer i nærheten", + "title": "Åpne AED-kart" + }, + "artwork": { + "description": "Velkommen til det åpne kunstverkskartet, et kart over statuer, byster, grafitti, og andre kunstverk i verden" + }, + "benches": { + "shortDescription": "Et benkekart", + "title": "Benker" + }, + "bicyclelib": { + "title": "Sykkelbibliotek" + }, + "binoculars": { + "shortDescription": "Et kart over fastmonterte kikkerter", + "title": "Kikkerter" + }, + "bookcases": { + "title": "Kart over åpne bokhyller" + }, + "cafes_and_pubs": { + "title": "Kafeer og kneiper" + }, + "campersite": { + "layers": { + "0": { + "tagRenderings": { + "caravansites-charge": { + "question": "pø", + "render": "Dette stedet tar {charge}" + }, + "caravansites-description": { + "render": "Flere detaljer om dette stedet: {description}" + }, + "caravansites-fee": { + "mappings": { + "1": { + "then": "Kan brukes gratis" + } } + }, + "caravansites-toilets": { + "mappings": { + "0": { + "then": "Dette stedet har toalettfasiliteter" + }, + "1": { + "then": "Dette stedet har ikke toalettfasiliteter" + } + }, + "question": "Har dette stedet toaletter?" + }, + "caravansites-website": { + "question": "Har dette stedet en nettside?", + "render": "Offisiell nettside: {website}" + } } + } + } + }, + "charging_stations": { + "shortDescription": "Et verdensomspennende kart over ladestasjoner", + "title": "Ladestasjoner" + }, + "climbing": { + "layers": { + "0": { + "description": "En klatreklubb eller organisasjoner", + "name": "Klatreklubb", + "presets": { + "0": { + "description": "En klatreklubb", + "title": "Klatreklubb" + } + }, + "title": { + "render": "Klatreklubb" + } + }, + "2": { + "name": "Klatreruter", + "tagRenderings": { + "Length": { + "question": "Hvor mange meter er klatreruten?", + "render": "Denne ruten er {canonical(climbing:length)} lang" + }, + "Name": { + "mappings": { + "0": { + "then": "Denne klatreruten har ikke noe navn" + } + }, + "question": "Hva er navnet på denne klatreruten?", + "render": "{name}" + } + }, + "title": { + "render": "Klatrerute" + } + }, + "3": { + "description": "En klatremulighet", + "presets": { + "0": { + "description": "En klatremulighet", + "title": "Klatremulighet" + } + }, + "title": { + "render": "Klatremulighet" + } + }, + "4": { + "description": "En klatremulighet?", + "name": "Klatremuligheter?", + "tagRenderings": { + "climbing-possible": { + "mappings": { + "0": { + "then": "Klatring er ikke mulig her" + }, + "1": { + "then": "Klatring er mulig her" + }, + "2": { + "then": "Klatring er ikke mulig her" + } + }, + "question": "Er klatring mulig her?" + } + }, + "title": { + "render": "Klatremulighet?" + } + } }, - "charging_stations": { - "shortDescription": "Et verdensomspennende kart over ladestasjoner", - "title": "Ladestasjoner" - }, - "climbing": { - "layers": { + "overrideAll": { + "tagRenderings+": { + "7": { + "mappings": { "0": { - "description": "En klatreklubb eller organisasjoner", - "name": "Klatreklubb", - "presets": { - "0": { - "description": "En klatreklubb", - "title": "Klatreklubb" - } - }, - "title": { - "render": "Klatreklubb" - } + "then": "Buldring er mulig her" + }, + "1": { + "then": "Buldring er ikke mulig her" + } + }, + "question": "Er buldring mulig her?" + } + } + }, + "title": "Åpent klatrekart" + }, + "cycle_infra": { + "shortDescription": "Alt relatert til sykkelinfrastruktur.", + "title": "Sykkelinfrastruktur" + }, + "cyclestreets": { + "layers": { + "0": { + "name": "Sykkelgater" + }, + "1": { + "description": "Denne gaten vil bli sykkelgate snart", + "name": "Fremtidig sykkelvei", + "title": { + "mappings": { + "0": { + "then": "{name} vil bli sykkelgate snart" + } + }, + "render": "Fremtidig sykkelvei" + } + }, + "2": { + "description": "Lag for å markere hvilken som helst gate som sykkelvei", + "name": "Alle gater", + "title": { + "render": "Gate" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "mappings": { + "0": { + "then": "Denne gaten er en sykkelvei (og har en fartsgrense på 30 km/t)" + }, + "1": { + "then": "Denne gaten er en sykkelvei" }, "2": { - "name": "Klatreruter", - "tagRenderings": { - "Length": { - "question": "Hvor mange meter er klatreruten?", - "render": "Denne ruten er {canonical(climbing:length)} lang" - }, - "Name": { - "mappings": { - "0": { - "then": "Denne klatreruten har ikke noe navn" - } - }, - "question": "Hva er navnet på denne klatreruten?", - "render": "{name}" - } - }, - "title": { - "render": "Klatrerute" - } + "then": "Denne gaten vil bli sykkelvei ganske snart" }, "3": { - "description": "En klatremulighet", - "presets": { - "0": { - "description": "En klatremulighet", - "title": "Klatremulighet" - } - }, - "title": { - "render": "Klatremulighet" - } - }, - "4": { - "description": "En klatremulighet?", - "name": "Klatremuligheter?", - "tagRenderings": { - "climbing-possible": { - "mappings": { - "0": { - "then": "Klatring er ikke mulig her" - }, - "1": { - "then": "Klatring er mulig her" - }, - "2": { - "then": "Klatring er ikke mulig her" - } - }, - "question": "Er klatring mulig her?" - } - }, - "title": { - "render": "Klatremulighet?" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "7": { - "mappings": { - "0": { - "then": "Buldring er mulig her" - }, - "1": { - "then": "Buldring er ikke mulig her" - } - }, - "question": "Er buldring mulig her?" - } - } - }, - "title": "Åpent klatrekart" - }, - "cycle_infra": { - "shortDescription": "Alt relatert til sykkelinfrastruktur.", - "title": "Sykkelinfrastruktur" - }, - "cyclestreets": { - "layers": { - "0": { - "name": "Sykkelgater" - }, - "1": { - "description": "Denne gaten vil bli sykkelgate snart", - "name": "Fremtidig sykkelvei", - "title": { - "mappings": { - "0": { - "then": "{name} vil bli sykkelgate snart" - } - }, - "render": "Fremtidig sykkelvei" - } - }, - "2": { - "description": "Lag for å markere hvilken som helst gate som sykkelvei", - "name": "Alle gater", - "title": { - "render": "Gate" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "mappings": { - "0": { - "then": "Denne gaten er en sykkelvei (og har en fartsgrense på 30 km/t)" - }, - "1": { - "then": "Denne gaten er en sykkelvei" - }, - "2": { - "then": "Denne gaten vil bli sykkelvei ganske snart" - }, - "3": { - "then": "Denne gaten er ikke en sykkelvei" - } - }, - "question": "Er denne gaten en sykkelvei?" - } - } - }, - "shortDescription": "Et kart over sykkelveier", - "title": "Sykkelgater" - }, - "cyclofix": { - "title": "Cyclofix — et åpent kart for syklister" - }, - "drinking_water": { - "description": "Offentlig tilgjengelig drikkevannssteder", - "title": "Drikkevann" - }, - "facadegardens": { - "layers": { - "0": { - "tagRenderings": { - "facadegardens-sunshine": { - "mappings": { - "1": { - "then": "Denne hagen er i delvis skygge" - } - } - } - } + "then": "Denne gaten er ikke en sykkelvei" } + }, + "question": "Er denne gaten en sykkelvei?" } + } }, - "food": { - "title": "Restauranter og søppelmat" - }, - "ghostbikes": { - "title": "Spøkelsessykler" - }, - "hailhydrant": { - "layers": { - "0": { - "description": "Kartlag for å vise brannhydranter.", - "name": "Kart over brannhydranter", - "presets": { - "0": { - "title": "Brannhydrant" - } - }, - "tagRenderings": { - "hydrant-color": { - "question": "Hvilken farge har brannhydranten?", - "render": "Brannhydranter er {colour}" - } - }, - "title": { - "render": "Brannhydrant" - } - }, - "1": { - "description": "Kartlag for å vise brannslokkere.", - "name": "Kart over brannhydranter", - "presets": { - "0": { - "title": "Brannslukker" - } - }, - "title": { - "render": "Brannslokkere" - } - }, - "2": { - "name": "Kart over brannstasjoner", - "presets": { - "0": { - "title": "Brannstasjon" - } - }, - "tagRenderings": { - "station-name": { - "render": "Denne stasjonen heter {name}." - }, - "station-operator": { - "mappings": { - "0": { - "then": "Stasjonen drives av myndighetene." - } - } - } - }, - "title": { - "render": "Brannstasjon" - } - } - }, - "title": "Hydranter, brannslukkere, brannstasjoner, og ambulansestasjoner." - }, - "maps": { - "title": "Et kart over kart" - }, - "natuurpunt": { - "title": "Naturreservater" - }, - "openwindpowermap": { - "layers": { - "0": { - "units": { - "0": { - "applicableUnits": { - "1": { - "human": " kilowatt" - } - } - } - } - } - } - }, - "parkings": { - "shortDescription": "Dette kartet viser forskjellige parkeringsplasser", - "title": "Parkering" - }, - "personal": { - "title": "Personlig tema" - }, - "playgrounds": { - "shortDescription": "Et kart med lekeplasser", - "title": "Lekeplasser" - }, - "postboxes": { - "layers": { - "0": { - "description": "Laget viser postbokser.", - "name": "Postbokser", - "presets": { - "0": { - "title": "postboks" - } - }, - "title": { - "render": "Postboks" - } - }, - "1": { - "description": "Et lag som viser postkontor.", - "name": "Postkontor", - "presets": { - "0": { - "title": "Postkontor" - } - }, - "title": { - "render": "Postkontor" - } - } - }, - "title": "Postboks og postkontor-kart" - }, - "shops": { - "title": "Kart over åpne butikker" - }, - "toilets": { - "title": "Åpent toalettkart" - }, - "trees": { - "description": "Kartlegg trærne.", - "shortDescription": "Kartlegg alle trærne", - "title": "Trær" - }, - "uk_addresses": { - "layers": { - "1": { - "description": "Adresser", - "name": "Kjente adresser i OSM", - "title": { - "render": "Kjent adresse" - } + "shortDescription": "Et kart over sykkelveier", + "title": "Sykkelgater" + }, + "cyclofix": { + "title": "Cyclofix — et åpent kart for syklister" + }, + "drinking_water": { + "description": "Offentlig tilgjengelig drikkevannssteder", + "title": "Drikkevann" + }, + "facadegardens": { + "layers": { + "0": { + "tagRenderings": { + "facadegardens-sunshine": { + "mappings": { + "1": { + "then": "Denne hagen er i delvis skygge" + } } + } } + } } + }, + "food": { + "title": "Restauranter og søppelmat" + }, + "ghostbikes": { + "title": "Spøkelsessykler" + }, + "hailhydrant": { + "layers": { + "0": { + "description": "Kartlag for å vise brannhydranter.", + "name": "Kart over brannhydranter", + "presets": { + "0": { + "title": "Brannhydrant" + } + }, + "tagRenderings": { + "hydrant-color": { + "question": "Hvilken farge har brannhydranten?", + "render": "Brannhydranter er {colour}" + } + }, + "title": { + "render": "Brannhydrant" + } + }, + "1": { + "description": "Kartlag for å vise brannslokkere.", + "name": "Kart over brannhydranter", + "presets": { + "0": { + "title": "Brannslukker" + } + }, + "title": { + "render": "Brannslokkere" + } + }, + "2": { + "name": "Kart over brannstasjoner", + "presets": { + "0": { + "title": "Brannstasjon" + } + }, + "tagRenderings": { + "station-name": { + "render": "Denne stasjonen heter {name}." + }, + "station-operator": { + "mappings": { + "0": { + "then": "Stasjonen drives av myndighetene." + } + } + } + }, + "title": { + "render": "Brannstasjon" + } + } + }, + "title": "Hydranter, brannslukkere, brannstasjoner, og ambulansestasjoner." + }, + "maps": { + "title": "Et kart over kart" + }, + "natuurpunt": { + "title": "Naturreservater" + }, + "openwindpowermap": { + "layers": { + "0": { + "units": { + "0": { + "applicableUnits": { + "1": { + "human": " kilowatt" + } + } + } + } + } + } + }, + "parkings": { + "shortDescription": "Dette kartet viser forskjellige parkeringsplasser", + "title": "Parkering" + }, + "personal": { + "title": "Personlig tema" + }, + "playgrounds": { + "shortDescription": "Et kart med lekeplasser", + "title": "Lekeplasser" + }, + "postboxes": { + "title": "Postboks og postkontor-kart" + }, + "shops": { + "title": "Kart over åpne butikker" + }, + "toilets": { + "title": "Åpent toalettkart" + }, + "trees": { + "description": "Kartlegg trærne.", + "shortDescription": "Kartlegg alle trærne", + "title": "Trær" + } } \ No newline at end of file diff --git a/langs/themes/nl.json b/langs/themes/nl.json index 34fef4ae80..217b91cca3 100644 --- a/langs/themes/nl.json +++ b/langs/themes/nl.json @@ -1,971 +1,1074 @@ { - "aed": { - "description": "Op deze kaart kan je informatie over AEDs vinden en verbeteren", - "title": "Open AED-kaart" - }, - "aed_brugge": { - "description": "Op deze kaart kan je informatie over AEDs vinden en verbeteren + een export van de brugse defibrillatoren", - "title": "Open AED-kaart - Brugge edition" - }, - "artwork": { - "description": "Welkom op de open kunstwerken-kaart, een kaart van standbeelden, bustes, graffiti en andere kunstwerken over de hele wereld", - "title": "Open kunstwerken-kaart" - }, - "benches": { - "description": "Deze kaart toont alle zitbanken die zijn opgenomen in OpenStreetMap: individuele banken en banken bij bushaltes. Met een OpenStreetMap-account kan je informatie verbeteren en nieuwe zitbanken toevoegen.", - "shortDescription": "Een kaart van zitbanken", - "title": "Zitbanken" - }, - "bicyclelib": { - "description": "Een fietsbibliotheek is een plaats waar men een fiets kan lenen, vaak voor een klein bedrag per jaar. Een typisch voorbeeld zijn kinderfietsbibliotheken, waar men een fiets op maat van het kind kan lenen. Is het kind de fiets ontgroeid, dan kan het te kleine fietsje omgeruild worden voor een grotere.", - "title": "Fietsbibliotheken" - }, - "binoculars": { - "description": "Een kaart met verrekijkers die op een vaste plaats zijn gemonteerd", - "shortDescription": "Een kaart met publieke verrekijker", - "title": "Verrekijkers" - }, - "bookcases": { - "description": "Een boekenruilkast is een kastje waar iedereen een boek kan nemen of achterlaten. Op deze kaart kan je deze boekenruilkasten terugvinden en met een gratis OpenStreetMap-account, ook boekenruilkasten toevoegen of informatie verbeteren", - "title": "Open boekenruilkasten-kaart" - }, - "buurtnatuur": { - "description": "logo-groenmeld je aan voor e-mailupdates.", - "descriptionTail": "

    Tips

    • Over groen ingekleurde gebieden weten we alles wat we willen weten.
    • Bij rood ingekleurde gebieden ontbreekt nog heel wat info: klik een gebied aan en beantwoord de vragen.
    • Je kan altijd een vraag overslaan als je het antwoord niet weet of niet zeker bent
    • Je kan altijd een foto toevoegen
    • Je kan ook zelf een gebied toevoegen door op de kaart te klikken
    • Open buurtnatuur.be op je smartphone om al wandelend foto's te maken en vragen te beantwoorden

    De oorspronkelijke data komt van OpenStreetMap en je antwoorden worden daar bewaard.
    Omdat iedereen vrij kan meewerken aan dit project, kunnen we niet garanderen dat er geen fouten opduiken.Kan je hier niet aanpassen wat je wilt, dan kan je dat zelf via OpenStreetMap.org doen. Groen kan geen enkele verantwoordelijkheid nemen over de kaart.

    Je privacy is belangrijk. We tellen wel hoeveel gebruikers deze website bezoeken. We plaatsen een cookie waar geen persoonlijke informatie in bewaard wordt. Als je inlogt, komt er een tweede cookie bij met je inloggegevens.
    ", - "layers": { + "aed": { + "description": "Op deze kaart kan je informatie over AEDs vinden en verbeteren", + "title": "Open AED-kaart" + }, + "aed_brugge": { + "description": "Op deze kaart kan je informatie over AEDs vinden en verbeteren + een export van de brugse defibrillatoren", + "title": "Open AED-kaart - Brugge edition" + }, + "artwork": { + "description": "Welkom op de open kunstwerken-kaart, een kaart van standbeelden, bustes, graffiti en andere kunstwerken over de hele wereld", + "title": "Open kunstwerken-kaart" + }, + "benches": { + "description": "Deze kaart toont alle zitbanken die zijn opgenomen in OpenStreetMap: individuele banken en banken bij bushaltes. Met een OpenStreetMap-account kan je informatie verbeteren en nieuwe zitbanken toevoegen.", + "shortDescription": "Een kaart van zitbanken", + "title": "Zitbanken" + }, + "bicyclelib": { + "description": "Een fietsbibliotheek is een plaats waar men een fiets kan lenen, vaak voor een klein bedrag per jaar. Een typisch voorbeeld zijn kinderfietsbibliotheken, waar men een fiets op maat van het kind kan lenen. Is het kind de fiets ontgroeid, dan kan het te kleine fietsje omgeruild worden voor een grotere.", + "title": "Fietsbibliotheken" + }, + "binoculars": { + "description": "Een kaart met verrekijkers die op een vaste plaats zijn gemonteerd", + "shortDescription": "Een kaart met publieke verrekijker", + "title": "Verrekijkers" + }, + "bookcases": { + "description": "Een boekenruilkast is een kastje waar iedereen een boek kan nemen of achterlaten. Op deze kaart kan je deze boekenruilkasten terugvinden en met een gratis OpenStreetMap-account, ook boekenruilkasten toevoegen of informatie verbeteren", + "title": "Open boekenruilkasten-kaart" + }, + "buurtnatuur": { + "description": "logo-groenmeld je aan voor e-mailupdates.", + "descriptionTail": "

    Tips

    • Over groen ingekleurde gebieden weten we alles wat we willen weten.
    • Bij rood ingekleurde gebieden ontbreekt nog heel wat info: klik een gebied aan en beantwoord de vragen.
    • Je kan altijd een vraag overslaan als je het antwoord niet weet of niet zeker bent
    • Je kan altijd een foto toevoegen
    • Je kan ook zelf een gebied toevoegen door op de kaart te klikken
    • Open buurtnatuur.be op je smartphone om al wandelend foto's te maken en vragen te beantwoorden

    De oorspronkelijke data komt van OpenStreetMap en je antwoorden worden daar bewaard.
    Omdat iedereen vrij kan meewerken aan dit project, kunnen we niet garanderen dat er geen fouten opduiken.Kan je hier niet aanpassen wat je wilt, dan kan je dat zelf via OpenStreetMap.org doen. Groen kan geen enkele verantwoordelijkheid nemen over de kaart.

    Je privacy is belangrijk. We tellen wel hoeveel gebruikers deze website bezoeken. We plaatsen een cookie waar geen persoonlijke informatie in bewaard wordt. Als je inlogt, komt er een tweede cookie bij met je inloggegevens.
    ", + "layers": { + "0": { + "description": "Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid.", + "name": "Natuurgebied", + "presets": { + "0": { + "description": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt", + "title": "Natuurreservaat" + } + }, + "title": { + "mappings": { "0": { - "description": "Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid.", - "name": "Natuurgebied", - "presets": { - "0": { - "description": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt", - "title": "Natuurreservaat" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name:nl}" - }, - "1": { - "then": "{name}" - } - }, - "render": "Natuurgebied" - } + "then": "{name:nl}" }, "1": { - "description": "Een park is een publiek toegankelijke, groene ruimte binnen de stad. Ze is typisch ingericht voor recreatief gebruik, met (verharde) wandelpaden, zitbanken, vuilnisbakken, een gezellig vijvertje, ...", - "name": "Park", - "presets": { - "0": { - "description": "Voeg een ontbrekend park toe", - "title": "Park" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name:nl}" - }, - "1": { - "then": "{name}" - } - }, - "render": "Park" - } - }, - "2": { - "description": "Een bos is een verzameling bomen, al dan niet als productiehout.", - "name": "Bos", - "presets": { - "0": { - "description": "Voeg een ontbrekend bos toe aan de kaart", - "title": "Bos" - } - }, - "title": { - "mappings": { - "0": { - "then": "{name:nl}" - }, - "1": { - "then": "{name}" - } - }, - "render": "Bos" - } + "then": "{name}" } + }, + "render": "Natuurgebied" + } + }, + "1": { + "description": "Een park is een publiek toegankelijke, groene ruimte binnen de stad. Ze is typisch ingericht voor recreatief gebruik, met (verharde) wandelpaden, zitbanken, vuilnisbakken, een gezellig vijvertje, ...", + "name": "Park", + "presets": { + "0": { + "description": "Voeg een ontbrekend park toe", + "title": "Park" + } }, - "overrideAll": { - "tagRenderings+": { - "0": { - "mappings": { - "0": { - "then": "Dit gebied is vrij toegankelijk" - }, - "1": { - "then": "Vrij toegankelijk" - }, - "2": { - "then": "Niet toegankelijk" - }, - "3": { - "then": "Niet toegankelijk, want privégebied" - }, - "4": { - "then": "Toegankelijk, ondanks dat het privegebied is" - }, - "5": { - "then": "Enkel toegankelijk met een gids of tijdens een activiteit" - }, - "6": { - "then": "Toegankelijk mits betaling" - } - }, - "question": "Is dit gebied toegankelijk?", - "render": "De toegankelijkheid van dit gebied is: {access:description}" - }, - "1": { - "mappings": { - "1": { - "then": "Dit gebied wordt beheerd door Natuurpunt" - }, - "2": { - "then": "Dit gebied wordt beheerd door {operator}" - }, - "3": { - "then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos" - } - }, - "question": "Wie beheert dit gebied?", - "render": "Beheer door {operator}" - }, - "2": { - "render": "Extra info: {description}" - }, - "3": { - "render": "Extra info via buurtnatuur.be: {description:0}" - }, - "4": { - "question": "Wat is de Nederlandstalige naam van dit gebied?", - "render": "Dit gebied heet {name:nl}" - }, - "5": { - "mappings": { - "0": { - "then": "Dit gebied heeft geen naam" - } - }, - "question": "Wat is de naam van dit gebied?", - "render": "Dit gebied heet {name}" - } - } - }, - "shortDescription": "Met deze tool kan je natuur in je buurt in kaart brengen en meer informatie geven over je favoriete plekje", - "title": "Breng jouw buurtnatuur in kaart" - }, - "cafes_and_pubs": { - "description": "Cafés, kroegen en drinkgelegenheden", - "title": "Cafés" - }, - "campersite": { - "description": "Deze website verzamelt en toont alle officiële plaatsen waar een camper mag overnachten en afvalwater kan lozen. Ook jij kan extra gegevens toevoegen, zoals welke services er geboden worden en hoeveel dit kot, ook afbeeldingen en reviews kan je toevoegen. De data wordt op OpenStreetMap opgeslagen en is dus altijd gratis te hergebruiken, ook door andere applicaties.", - "layers": { + "title": { + "mappings": { "0": { - "description": "camperplaatsen", - "name": "Camperplaatsen", - "presets": { - "0": { - "description": "Voeg een nieuwe officiële camperplaats toe. Dit zijn speciaal aangeduide plaatsen waar het toegestaan is om te overnachten met een camper. Ze kunnen er uitzien als een parking, of soms eerder als een camping. Soms staan ze niet ter plaatse aangeduid, maar heeft de gemeente wel degelijk beslist dat dit een camperplaats is. Een parking voor campers waar je niet mag overnachten is géén camperplaats. ", - "title": "camperplaats" - } - }, - "tagRenderings": { - "caravansites-capacity": { - "question": "Hoeveel campers kunnen hier overnachten? (sla dit over als er geen duidelijk aantal plaatsen of aangeduid maximum is)", - "render": "{capacity} campers kunnen deze plaats tegelijk gebruiken" - }, - "caravansites-charge": { - "question": "Hoeveel kost deze plaats?", - "render": "Deze plaats vraagt {charge}" - }, - "caravansites-description": { - "question": "Wil je graag een algemene beschrijving toevoegen van deze plaats? (Herhaal hier niet de antwoorden op de vragen die reeds gesteld zijn. Hou het objectief - je kan je mening geven via een review)", - "render": "Meer details over deze plaats: {description}" - }, - "caravansites-fee": { - "mappings": { - "0": { - "then": "Gebruik is betalend" - }, - "1": { - "then": "Kan gratis gebruikt worden" - } - }, - "question": "Moet men betalen om deze camperplaats te gebruiken?" - }, - "caravansites-internet": { - "mappings": { - "0": { - "then": "Er is internettoegang" - }, - "1": { - "then": "Er is internettoegang" - } - } - }, - "caravansites-name": { - "question": "Wat is de naam van deze plaats?", - "render": "Deze plaats heet {name}" - }, - "caravansites-website": { - "render": "Officiële website: : {website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Camper site" - } - }, - "render": "Camperplaats {name}" - } - } - }, - "shortDescription": "Vind locaties waar je de nacht kan doorbrengen met je mobilehome", - "title": "Camperplaatsen" - }, - "charging_stations": { - "shortDescription": "Een wereldwijde kaart van oplaadpunten", - "title": "Oplaadpunten" - }, - "climbing": { - "description": "Op deze kaart vind je verschillende klimgelegenheden, zoals klimzalen, bolderzalen en klimmen in de natuur", - "descriptionTail": "De klimkaart is oorspronkelijk gemaakt door Christian Neumann op kletterspots.de.", - "layers": { - "0": { - "description": "Een klimclub of organisatie", - "name": "Klimclub", - "presets": { - "0": { - "description": "Een klimclub", - "title": "Klimclub" - }, - "1": { - "description": "Een VZW die werkt rond klimmen", - "title": "Een klimorganisatie" - } - }, - "tagRenderings": { - "climbing_club-name": { - "question": "Wat is de naam van deze klimclub?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Klimorganisatie" - } - }, - "render": "Klimclub" - } + "then": "{name:nl}" }, "1": { - "description": "Een klimzaal", - "name": "Klimzalen", - "tagRenderings": { - "name": { - "question": "Wat is de naam van dit Klimzaal?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Klimzaal {name}" - } - }, - "render": "Klimzaal" - } + "then": "{name}" + } + }, + "render": "Park" + } + }, + "2": { + "description": "Een bos is een verzameling bomen, al dan niet als productiehout.", + "name": "Bos", + "presets": { + "0": { + "description": "Voeg een ontbrekend bos toe aan de kaart", + "title": "Bos" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name:nl}" + }, + "1": { + "then": "{name}" + } + }, + "render": "Bos" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "mappings": { + "0": { + "then": "Dit gebied is vrij toegankelijk" + }, + "1": { + "then": "Vrij toegankelijk" }, "2": { - "name": "Klimroute", - "presets": { - "0": { - "title": "Klimroute" - } - }, - "tagRenderings": { - "Difficulty": { - "question": "Hoe moeilijk is deze klimroute volgens het Franse/Belgische systeem?", - "render": "De klimmoeilijkheid is {climbing:grade:french} volgens het Franse/Belgische systeem" - }, - "Length": { - "question": "Hoe lang is deze klimroute (in meters)?", - "render": "Deze klimroute is {canonical(climbing:length)} lang" - }, - "Name": { - "mappings": { - "0": { - "then": "Deze klimroute heeft geen naam" - } - }, - "question": "Hoe heet deze klimroute?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Klimroute {name}" - } - }, - "render": "Klimroute" - } + "then": "Niet toegankelijk" }, "3": { - "description": "Een klimgelegenheid", - "name": "Klimgelegenheden", - "presets": { - "0": { - "description": "Een klimgelegenheid", - "title": "Klimgelegenheid" - } - }, - "tagRenderings": { - "Rock type (crag/rock/cliff only)": { - "mappings": { - "0": { - "then": "Kalksteen" - } - } - }, - "name": { - "mappings": { - "0": { - "then": "Dit Klimgelegenheid heeft geen naam" - } - }, - "question": "Wat is de naam van dit Klimgelegenheid?", - "render": "{name}" - } - }, - "title": { - "mappings": { - "1": { - "then": "Klimsite {name}" - }, - "2": { - "then": "Klimsite" - }, - "3": { - "then": "Klimgelegenheid {name}" - } - }, - "render": "Klimgelegenheid" - } + "then": "Niet toegankelijk, want privégebied" }, "4": { - "description": "Een klimgelegenheid?", - "name": "Klimgelegenheiden?", - "tagRenderings": { - "climbing-opportunity-name": { - "render": "{name}" - }, - "climbing-possible": { - "mappings": { - "0": { - "then": "Klimmen is hier niet mogelijk" - }, - "1": { - "then": "Klimmen is hier niet toegelaten" - }, - "2": { - "then": "Klimmen is hier niet toegelaten" - } - } - } - }, - "title": { - "render": "Klimgelegenheid?" - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "Is er een (onofficiële) website met meer informatie (b.v. met topos)?" - }, - "1": { - "mappings": { - "0": { - "then": "Een omvattend element geeft aan dat dit publiek toegangkelijk is
    {_embedding_feature:access:description}" - }, - "1": { - "then": "Een omvattend element geeft aan dat een toelating nodig is om hier te klimmen
    {_embedding_feature:access:description}" - } - } - }, - "4": { - "question": "Wat is de (gemiddelde) lengte van de klimroutes, in meter?", - "render": "De klimroutes zijn gemiddeld {canonical(climbing:length)} lang" - }, - "5": { - "question": "Wat is het niveau van de makkelijkste route, volgens het Franse classificatiesysteem?", - "render": "De minimale klimmoeilijkheid is {climbing:grade:french:min} volgens het Franse/Belgische systeem" - }, - "6": { - "question": "Wat is het niveau van de moeilijkste route, volgens het Franse classificatiesysteem?", - "render": "De maximale klimmoeilijkheid is {climbing:grade:french:max} volgens het Franse/Belgische systeem" - }, - "7": { - "mappings": { - "0": { - "then": "Bolderen kan hier" - }, - "1": { - "then": "Bolderen kan hier niet" - }, - "2": { - "then": "Bolderen kan hier, maar er zijn niet zoveel routes" - }, - "3": { - "then": "Er zijn hier {climbing:boulder} bolderroutes" - } - }, - "question": "Is het mogelijk om hier te bolderen?" - }, - "8": { - "mappings": { - "0": { - "then": "Toprope-klimmen kan hier" - }, - "1": { - "then": "Toprope-klimmen kan hier niet" - }, - "2": { - "then": "Er zijn hier {climbing:toprope} toprope routes" - } - }, - "question": "Is het mogelijk om hier te toprope-klimmen?" - }, - "9": { - "mappings": { - "0": { - "then": "Sportklimmen/voorklimmen kan hier" - }, - "1": { - "then": "Sportklimmen/voorklimmen kan hier niet" - }, - "2": { - "then": "Er zijn hier {climbing:sport} sportklimroutes/voorklimroutes" - } - }, - "question": "Is het mogelijk om hier te sportklimmen/voorklimmen op reeds aangebrachte haken?" - }, - "10": { - "mappings": { - "0": { - "then": "Traditioneel klimmen kan hier" - }, - "1": { - "then": "Traditioneel klimmen kan hier niet" - }, - "2": { - "then": "Er zijn hier {climbing:traditional} traditionele klimroutes" - } - }, - "question": "Is het mogelijk om hier traditioneel te klimmen?
    (Dit is klimmen met klemblokjes en friends)" - }, - "11": { - "mappings": { - "0": { - "then": "Er is een snelklimmuur voor speed climbing" - }, - "1": { - "then": "Er is geen snelklimmuur voor speed climbing" - }, - "2": { - "then": "Er zijn hier {climbing:speed} snelklimmuren" - } - }, - "question": "Is er een snelklimmuur (speed climbing)?" - } + "then": "Toegankelijk, ondanks dat het privegebied is" }, - "units+": { - "0": { - "applicableUnits": { - "0": { - "human": " meter" - }, - "1": { - "human": " voet" - } - } - } - } - }, - "title": "Open klimkaart" - }, - "cycle_infra": { - "description": "Een kaart waar je info over de fietsinfrastructuur kan bekijken en bewerken. Gemaakt tijdens #osoc21.", - "shortDescription": "Een kaart waar je info over de fietsinfrastructuur kan bekijken en bewerken.", - "title": "Fietsinfrastructuur" - }, - "cyclestreets": { - "description": "Een fietsstraat is een straat waar
    • automobilisten geen fietsers mogen inhalen
    • Er een maximumsnelheid van 30km/u geldt
    • Fietsers gemotoriseerde voertuigen links mogen inhalen
    • Fietsers nog steeds voorrang aan rechts moeten verlenen - ook aan auto's en voetgangers op het zebrapad


    Op deze open kaart kan je alle gekende fietsstraten zien en kan je ontbrekende fietsstraten aanduiden. Om de kaart aan te passen, moet je je aanmelden met OpenStreetMap en helemaal inzoomen tot straatniveau. ", - "layers": { - "0": { - "description": "Een fietsstraat is een straat waar gemotoriseerd verkeer een fietser niet mag inhalen.", - "name": "Fietsstraten" + "5": { + "then": "Enkel toegankelijk met een gids of tijdens een activiteit" }, + "6": { + "then": "Toegankelijk mits betaling" + } + }, + "question": "Is dit gebied toegankelijk?", + "render": "De toegankelijkheid van dit gebied is: {access:description}" + }, + "1": { + "mappings": { "1": { - "description": "Deze straat wordt binnenkort een fietsstraat", - "name": "Toekomstige fietsstraat", - "title": { - "mappings": { - "0": { - "then": "{name} wordt fietsstraat" - } - }, - "render": "Toekomstige fietsstraat" - } + "then": "Dit gebied wordt beheerd door Natuurpunt" }, "2": { - "description": "Laag waar je een straat als fietsstraat kan markeren", - "name": "Alle straten", - "title": { - "render": "Straat" - } + "then": "Dit gebied wordt beheerd door {operator}" + }, + "3": { + "then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos" } + }, + "question": "Wie beheert dit gebied?", + "render": "Beheer door {operator}" }, - "overrideAll": { - "tagRenderings+": { - "0": { - "mappings": { - "0": { - "then": "Deze straat is een fietsstraat (en dus zone 30)" - }, - "1": { - "then": "Deze straat i een fietsstraat" - }, - "2": { - "then": "Deze straat wordt binnenkort een fietsstraat" - }, - "3": { - "then": "Deze straat is geen fietsstraat" - } - }, - "question": "Is deze straat een fietsstraat?" - }, - "1": { - "question": "Wanneer wordt deze straat een fietsstraat?", - "render": "Deze straat wordt fietsstraat op {cyclestreet:start_date}" - } + "2": { + "render": "Extra info: {description}" + }, + "3": { + "render": "Extra info via buurtnatuur.be: {description:0}" + }, + "4": { + "question": "Wat is de Nederlandstalige naam van dit gebied?", + "render": "Dit gebied heet {name:nl}" + }, + "5": { + "mappings": { + "0": { + "then": "Dit gebied heeft geen naam" } + }, + "question": "Wat is de naam van dit gebied?", + "render": "Dit gebied heet {name}" + } + } + }, + "shortDescription": "Met deze tool kan je natuur in je buurt in kaart brengen en meer informatie geven over je favoriete plekje", + "title": "Breng jouw buurtnatuur in kaart" + }, + "cafes_and_pubs": { + "description": "Cafés, kroegen en drinkgelegenheden", + "title": "Cafés" + }, + "campersite": { + "description": "Deze website verzamelt en toont alle officiële plaatsen waar een camper mag overnachten en afvalwater kan lozen. Ook jij kan extra gegevens toevoegen, zoals welke services er geboden worden en hoeveel dit kot, ook afbeeldingen en reviews kan je toevoegen. De data wordt op OpenStreetMap opgeslagen en is dus altijd gratis te hergebruiken, ook door andere applicaties.", + "layers": { + "0": { + "description": "camperplaatsen", + "name": "Camperplaatsen", + "presets": { + "0": { + "description": "Voeg een nieuwe officiële camperplaats toe. Dit zijn speciaal aangeduide plaatsen waar het toegestaan is om te overnachten met een camper. Ze kunnen er uitzien als een parking, of soms eerder als een camping. Soms staan ze niet ter plaatse aangeduid, maar heeft de gemeente wel degelijk beslist dat dit een camperplaats is. Een parking voor campers waar je niet mag overnachten is géén camperplaats. ", + "title": "camperplaats" + } }, - "shortDescription": "Een kaart met alle gekende fietsstraten", - "title": "Fietsstraten" + "tagRenderings": { + "caravansites-capacity": { + "question": "Hoeveel campers kunnen hier overnachten? (sla dit over als er geen duidelijk aantal plaatsen of aangeduid maximum is)", + "render": "{capacity} campers kunnen deze plaats tegelijk gebruiken" + }, + "caravansites-charge": { + "question": "Hoeveel kost deze plaats?", + "render": "Deze plaats vraagt {charge}" + }, + "caravansites-description": { + "question": "Wil je graag een algemene beschrijving toevoegen van deze plaats? (Herhaal hier niet de antwoorden op de vragen die reeds gesteld zijn. Hou het objectief - je kan je mening geven via een review)", + "render": "Meer details over deze plaats: {description}" + }, + "caravansites-fee": { + "mappings": { + "0": { + "then": "Gebruik is betalend" + }, + "1": { + "then": "Kan gratis gebruikt worden" + } + }, + "question": "Moet men betalen om deze camperplaats te gebruiken?" + }, + "caravansites-internet": { + "mappings": { + "0": { + "then": "Er is internettoegang" + }, + "1": { + "then": "Er is internettoegang" + } + } + }, + "caravansites-name": { + "question": "Wat is de naam van deze plaats?", + "render": "Deze plaats heet {name}" + }, + "caravansites-website": { + "render": "Officiële website: : {website}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Camper site" + } + }, + "render": "Camperplaats {name}" + } + } }, - "cyclofix": { - "description": "Het doel van deze kaart is om fietsers een gebruiksvriendelijke oplossing te bieden voor het vinden van de juiste infrastructuur voor hun behoeften.

    U kunt uw exacte locatie volgen (enkel mobiel) en in de linkerbenedenhoek categorieën selecteren die voor u relevant zijn. U kunt deze tool ook gebruiken om 'spelden' aan de kaart toe te voegen of te bewerken en meer gegevens te verstrekken door de vragen te beantwoorden.

    Alle wijzigingen die u maakt worden automatisch opgeslagen in de wereldwijde database van OpenStreetMap en kunnen door anderen vrij worden hergebruikt.

    Bekijk voor meer info over cyclofix ook cyclofix.osm.be.", - "title": "Cyclofix - een open kaart voor fietsers" - }, - "drinking_water": { - "description": "Op deze kaart staan publiek toegankelijke drinkwaterpunten en kan je makkelijk een nieuw drinkwaterpunt toevoegen", - "title": "Drinkwaterpunten" - }, - "etymology": { - "description": "Op deze kaart zie je waar een plaats naar is vernoemd. De straten, gebouwen, ... komen uit OpenStreetMap, waar een link naar Wikidata werd gelegd. In de popup zie je het Wikipedia-artikel van hetgeen naarwaar het vernoemd is of de Wikidata-box.

    Je kan zelf ook meehelpen!Als je ver inzoomt, krijg je alle straten te zien. Klik je een straat aan, dan krijg je een zoekfunctie waarmee je snel een nieuwe link kan leggen. Je hebt hiervoor een gratis OpenStreetMap account nodig.", - "layers": { + "shortDescription": "Vind locaties waar je de nacht kan doorbrengen met je mobilehome", + "title": "Camperplaatsen" + }, + "charging_stations": { + "shortDescription": "Een wereldwijde kaart van oplaadpunten", + "title": "Oplaadpunten" + }, + "climbing": { + "description": "Op deze kaart vind je verschillende klimgelegenheden, zoals klimzalen, bolderzalen en klimmen in de natuur", + "descriptionTail": "De klimkaart is oorspronkelijk gemaakt door Christian Neumann op kletterspots.de.", + "layers": { + "0": { + "description": "Een klimclub of organisatie", + "name": "Klimclub", + "presets": { + "0": { + "description": "Een klimclub", + "title": "Klimclub" + }, + "1": { + "description": "Een VZW die werkt rond klimmen", + "title": "Een klimorganisatie" + } + }, + "tagRenderings": { + "climbing_club-name": { + "question": "Wat is de naam van deze klimclub?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Klimorganisatie" + } + }, + "render": "Klimclub" + } + }, + "1": { + "description": "Een klimzaal", + "name": "Klimzalen", + "tagRenderings": { + "name": { + "question": "Wat is de naam van dit Klimzaal?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Klimzaal {name}" + } + }, + "render": "Klimzaal" + } + }, + "2": { + "name": "Klimroute", + "presets": { + "0": { + "title": "Klimroute" + } + }, + "tagRenderings": { + "Difficulty": { + "question": "Hoe moeilijk is deze klimroute volgens het Franse/Belgische systeem?", + "render": "De klimmoeilijkheid is {climbing:grade:french} volgens het Franse/Belgische systeem" + }, + "Length": { + "question": "Hoe lang is deze klimroute (in meters)?", + "render": "Deze klimroute is {canonical(climbing:length)} lang" + }, + "Name": { + "mappings": { + "0": { + "then": "Deze klimroute heeft geen naam" + } + }, + "question": "Hoe heet deze klimroute?", + "render": "{name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Klimroute {name}" + } + }, + "render": "Klimroute" + } + }, + "3": { + "description": "Een klimgelegenheid", + "name": "Klimgelegenheden", + "presets": { + "0": { + "description": "Een klimgelegenheid", + "title": "Klimgelegenheid" + } + }, + "tagRenderings": { + "Rock type (crag/rock/cliff only)": { + "mappings": { + "0": { + "then": "Kalksteen" + } + } + }, + "name": { + "mappings": { + "0": { + "then": "Dit Klimgelegenheid heeft geen naam" + } + }, + "question": "Wat is de naam van dit Klimgelegenheid?", + "render": "{name}" + } + }, + "title": { + "mappings": { "1": { - "override": { - "name": "Straten zonder etymologische informatie" - } + "then": "Klimsite {name}" }, "2": { - "override": { - "name": "Parken en bossen zonder etymologische informatie" - } + "then": "Klimsite" + }, + "3": { + "then": "Klimgelegenheid {name}" } - }, - "shortDescription": "Wat is de oorsprong van een plaatsnaam?", - "title": "Open Etymology-kaart" - }, - "facadegardens": { - "description": "Ontharde voortuintjes, groene gevels en bomen ín de stad brengen naast rust ook een mooiere stad, een grotere biodiversiteit, een verkoelend effect en een betere luchtkwaliteit.
    Klimaan VZW en 'Mechelen Klimaatneutraal' willen met het project Klim(t)aan je Gevel bestaande en nieuwe geveltuintjes in kaart brengen als voorbeeld voor mensen zelf een tuintje willen aanleggen of voor stadwandelaars die houden van de natuur.
    Meer info over het project op klimaan.be.", - "layers": { - "0": { - "description": "Geveltuintjes", - "name": "Geveltuintjes", - "presets": { - "0": { - "description": "Voeg geveltuintje toe", - "title": "geveltuintje" - } - }, - "tagRenderings": { - "facadegardens-description": { - "question": "Aanvullende omschrijving van de tuin (indien nodig, en voor zover nog niet omschreven hierboven)", - "render": "Meer details: {description}" - }, - "facadegardens-direction": { - "question": "Hoe is de tuin georiënteerd?", - "render": "Oriëntatie: {direction} (waarbij 0=N en 90=O)" - }, - "facadegardens-edible": { - "mappings": { - "0": { - "then": "Er staan eetbare planten" - }, - "1": { - "then": "Er staan geen eetbare planten" - } - }, - "question": "Staan er eetbare planten?" - }, - "facadegardens-plants": { - "mappings": { - "0": { - "then": "Er staat een klimplant" - }, - "1": { - "then": "Er staan bloeiende planten" - }, - "2": { - "then": "Er staan struiken" - }, - "3": { - "then": "Er staan bodembedekkers" - } - }, - "question": "Wat voor planten staan hier?" - }, - "facadegardens-rainbarrel": { - "mappings": { - "0": { - "then": "Er is een regenton" - }, - "1": { - "then": "Er is geen regenton" - } - }, - "question": "Is er een regenton voorzien bij het tuintje?" - }, - "facadegardens-start_date": { - "question": "Wanneer werd de tuin aangelegd? (vul gewoon een jaartal in)", - "render": "Aanlegdatum van de tuin: {start_date}" - }, - "facadegardens-sunshine": { - "mappings": { - "0": { - "then": "Het is een volle zon tuintje" - }, - "1": { - "then": "Het is een halfschaduw tuintje" - }, - "2": { - "then": "Het is een schaduw tuintje" - } - }, - "question": "Ligt de tuin in zon/half schaduw of schaduw?" - } - }, - "title": { - "render": "Geveltuintje" - } + }, + "render": "Klimgelegenheid" + } + }, + "4": { + "description": "Een klimgelegenheid?", + "name": "Klimgelegenheiden?", + "tagRenderings": { + "climbing-opportunity-name": { + "render": "{name}" + }, + "climbing-possible": { + "mappings": { + "0": { + "then": "Klimmen is hier niet mogelijk" + }, + "1": { + "then": "Klimmen is hier niet toegelaten" + }, + "2": { + "then": "Klimmen is hier niet toegelaten" + } } + } }, - "shortDescription": "Deze kaart toont geveltuintjes met foto's en bruikbare info over oriëntatie, zonlicht en planttypes.", - "title": "Straatgeveltuintjes" + "title": { + "render": "Klimgelegenheid?" + } + } }, - "food": { - "description": "Restaurants en fast food", - "title": "Eetgelegenheden" - }, - "fritures": { - "description": "Op deze kaart vind je je favoriete frituur!", - "layers": { - "0": { - "override": { - "name": "Frituren" - } - } + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "Is er een (onofficiële) website met meer informatie (b.v. met topos)?" }, - "title": "Friturenkaart" - }, - "fruit_trees": { - "description": "Op deze kaart vindt je boomgaarden en fruitbomen", - "layers": { + "1": { + "mappings": { "0": { - "name": "Boomgaarden", - "presets": { - "0": { - "description": "Voeg een boomgaard toe (als punt - omtrek nog te tekenen)", - "title": "Boomgaard" - } - }, - "title": { - "render": "Boomgaard" - } + "then": "Een omvattend element geeft aan dat dit publiek toegangkelijk is
    {_embedding_feature:access:description}" }, "1": { - "description": "Een boom", - "name": "Boom", - "presets": { - "0": { - "description": "Voeg hier een boom toe", - "title": "Boom" - } - }, - "tagRenderings": { - "fruitboom-description": { - "question": "Welke beschrijving past bij deze boom?", - "render": "Beschrijving: {description}" - }, - "fruitboom-ref": { - "question": "Is er een refernetienummer?", - "render": "Referentienummer: {ref}" - }, - "fruitboom-species:nl": { - "question": "Wat is de soort van deze boom (in het Nederlands)?", - "render": "De soort is {species:nl}" - }, - "fruitboom-taxon": { - "question": "Wat is het taxon (ras) van deze boom?", - "render": "Het ras (taxon) van deze boom is {taxon}" - } - }, - "title": { - "render": "Boom" - } + "then": "Een omvattend element geeft aan dat een toelating nodig is om hier te klimmen
    {_embedding_feature:access:description}" } + } }, - "shortDescription": "Boomgaarden en fruitbomen", - "title": "Open Boomgaardenkaart" - }, - "ghostbikes": { - "description": "Een Witte Fiets of Spookfiets is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat om een fiets die volledig wit is geschilderd en in de buurt van het ongeval werd geinstalleerd.

    Op deze kaart zie je alle witte fietsen die door OpenStreetMap gekend zijn. Ontbreekt er een Witte Fiets of wens je informatie aan te passen? Meld je dan aan met een (gratis) OpenStreetMap account.", - "title": "Witte Fietsen" - }, - "grb": { - "description": "GRB Fixup", - "layers": { + "4": { + "question": "Wat is de (gemiddelde) lengte van de klimroutes, in meter?", + "render": "De klimroutes zijn gemiddeld {canonical(climbing:length)} lang" + }, + "5": { + "question": "Wat is het niveau van de makkelijkste route, volgens het Franse classificatiesysteem?", + "render": "De minimale klimmoeilijkheid is {climbing:grade:french:min} volgens het Franse/Belgische systeem" + }, + "6": { + "question": "Wat is het niveau van de moeilijkste route, volgens het Franse classificatiesysteem?", + "render": "De maximale klimmoeilijkheid is {climbing:grade:french:max} volgens het Franse/Belgische systeem" + }, + "7": { + "mappings": { "0": { - "description": "Dit gebouw heeft een foutmelding", - "name": "Fixmes op gebouwen", - "tagRenderings": { - "grb-fixme": { - "mappings": { - "0": { - "then": "Geen fixme" - } - }, - "question": "Wat zegt de fixme?", - "render": "De fixme is {fixme}" - }, - "grb-housenumber": { - "mappings": { - "0": { - "then": "Geen huisnummer" - } - }, - "question": "Wat is het huisnummer?", - "render": "Het huisnummer is {addr:housenumber}" - }, - "grb-min-level": { - "question": "Hoeveel verdiepingen ontbreken?", - "render": "Dit gebouw begint maar op de {building:min_level} verdieping" - }, - "grb-street": { - "question": "Wat is de straat?", - "render": "De straat is {addr:street}" - }, - "grb-unit": { - "render": "De wooneenheid-aanduiding is {addr:unit} " - } - }, - "title": { - "mappings": { - "0": { - "then": "{fixme}" - } - }, - "render": "{addr:street} {addr:housenumber}" - } - } - }, - "shortDescription": "Grb Fixup", - "title": "GRB Fixup" - }, - "maps": { - "description": "Op deze kaart kan je alle kaarten zien die OpenStreetMap kent.

    Ontbreekt er een kaart, dan kan je die kaart hier ook gemakelijk aan deze kaart toevoegen.", - "shortDescription": "Een kaart met alle kaarten die OpenStreetMap kent", - "title": "Een kaart met Kaarten" - }, - "nature": { - "description": "Op deze kaart vind je informatie voor natuurliefhebbers, zoals info over het natuurgebied waar je inzit, vogelkijkhutten, informatieborden, ...", - "shortDescription": "Deze kaart bevat informatie voor natuurliefhebbers", - "title": "De Natuur in" - }, - "natuurpunt": { - "description": "Op deze kaart vind je alle natuurgebieden die Natuurpunt ter beschikking stelt", - "shortDescription": "Deze kaart toont de natuurgebieden van Natuurpunt", - "title": "Natuurgebieden" - }, - "observation_towers": { - "description": "Publieke uitkijktorens om van het panorama te genieten", - "shortDescription": "Publieke uitkijktorens om van het panorama te genieten", - "title": "Uitkijktorens" - }, - "openwindpowermap": { - "layers": { - "0": { - "name": "windturbine", - "presets": { - "0": { - "title": "windturbine" - } - }, - "title": { - "render": "windturbine" - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " megawatt" - }, - "1": { - "human": " kilowatt" - }, - "2": { - "human": " watt" - }, - "3": { - "human": " gigawatt" - } - } - }, - "1": { - "applicableUnits": { - "0": { - "human": " meter" - } - } - } - } - } - } - }, - "parkings": { - "description": "Deze kaart toont verschillende parkeerplekken", - "shortDescription": "Deze kaart toont verschillende parkeerplekken", - "title": "Parking" - }, - "personal": { - "description": "Stel je eigen thema samen door lagen te combineren van alle andere themas", - "title": "Persoonlijk thema" - }, - "play_forests": { - "description": "Een speelbos is een zone in een bos die vrij toegankelijk is voor spelende kinderen. Deze wordt in bossen van het Agentschap Natuur en bos altijd aangeduid met het overeenkomstige bord.", - "shortDescription": "Deze kaart toont speelbossen", - "title": "Speelbossen" - }, - "playgrounds": { - "description": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen", - "shortDescription": "Een kaart met speeltuinen", - "title": "Speelplekken" - }, - "speelplekken": { - "description": "

    Welkom bij de Groendoener!

    De Zuidrand dat is spelen, ravotten, chillen, wandelen,… in het groen. Meer dan 200 grote en kleine speelplekken liggen er in parken, in bossen en op pleintjes te wachten om ontdekt te worden. De verschillende speelplekken werden getest én goedgekeurd door kinder- en jongerenreporters uit de Zuidrand. Met leuke challenges dagen de reporters jou uit om ook op ontdekking te gaan. Klik op een speelplek op de kaart, bekijk het filmpje en ga op verkenning!

    Het project groendoener kadert binnen het strategisch project Beleefbare Open Ruimte in de Antwerpse Zuidrand en is een samenwerking tussen het departement Leefmilieu van provincie Antwerpen, Sportpret vzw, een OpenStreetMap-België Consultent en Createlli vzw. Het project kwam tot stand met steun van Departement Omgeving van de Vlaamse Overheid.
    ", - "layers": { - "7": { - "name": "Wandelroutes van provincie Antwerpen", - "tagRenderings": { - "walk-description": { - "render": "

    Korte beschrijving:

    {description}" - }, - "walk-length": { - "render": "Deze wandeling is {_length:km}km lang" - }, - "walk-operator": { - "question": "Wie beheert deze wandeling en plaatst dus de signalisatiebordjes?" - }, - "walk-operator-email": { - "question": "Naar wie kan men emailen bij problemen rond signalisatie?", - "render": "Bij problemen met signalisatie kan men emailen naar {operator:email}" - }, - "walk-type": { - "mappings": { - "0": { - "then": "Dit is een internationale wandelroute" - }, - "1": { - "then": "Dit is een nationale wandelroute" - }, - "2": { - "then": "Dit is een regionale wandelroute" - }, - "3": { - "then": "Dit is een lokale wandelroute" - } - } - } - } - } - }, - "shortDescription": "Speelplekken in de Antwerpse Zuidrand", - "title": "Welkom bij de groendoener!" - }, - "sport_pitches": { - "description": "Een sportveld is een ingerichte plaats met infrastructuur om een sport te beoefenen", - "shortDescription": "Deze kaart toont sportvelden", - "title": "Sportvelden" - }, - "surveillance": { - "description": "Op deze open kaart kan je bewakingscamera's vinden.", - "shortDescription": "Bewakingscameras en dergelijke", - "title": "Surveillance under Surveillance" - }, - "toerisme_vlaanderen": { - "description": "Op deze kaart kan je info zien die relevant is voor toerisme, zoals:
    • Eetgelegenheden
    • Cafés en bars
    • (Fiets)oplaadpunten
    • Fietspompen, fietserverhuur en fietswinkels
    • Uitkijktorens
    • ...
    Zie je fouten op de kaart? Dan kan je zelf makkelijk aanpasingen maken, die zichtbaar zijn voor iedereen. Hiervoor dien je een gratis OpenStreetMap account voor te maken.", - "descriptionTail": "Met de steun van Toerisme Vlaanderen", - "shortDescription": "Een kaart om toeristisch relevante info op aan te duiden", - "title": "Toeristisch relevante info" - }, - "toilets": { - "description": "Een kaart met openbare toiletten", - "title": "Open Toilettenkaart" - }, - "trees": { - "description": "Breng bomen in kaart!", - "shortDescription": "Breng bomen in kaart", - "title": "Bomen" - }, - "uk_addresses": { - "description": "Draag bij aan OpenStreetMap door adresinformatie in te vullen", - "layers": { + "then": "Bolderen kan hier" + }, "1": { - "description": "Adressen", - "tagRenderings": { - "uk_addresses_housenumber": { - "mappings": { - "0": { - "then": "Dit gebouw heeft geen huisnummer" - } - }, - "render": "Het huisnummer is {addr:housenumber}" - } - } + "then": "Bolderen kan hier niet" + }, + "2": { + "then": "Bolderen kan hier, maar er zijn niet zoveel routes" + }, + "3": { + "then": "Er zijn hier {climbing:boulder} bolderroutes" } + }, + "question": "Is het mogelijk om hier te bolderen?" + }, + "8": { + "mappings": { + "0": { + "then": "Toprope-klimmen kan hier" + }, + "1": { + "then": "Toprope-klimmen kan hier niet" + }, + "2": { + "then": "Er zijn hier {climbing:toprope} toprope routes" + } + }, + "question": "Is het mogelijk om hier te toprope-klimmen?" + }, + "9": { + "mappings": { + "0": { + "then": "Sportklimmen/voorklimmen kan hier" + }, + "1": { + "then": "Sportklimmen/voorklimmen kan hier niet" + }, + "2": { + "then": "Er zijn hier {climbing:sport} sportklimroutes/voorklimroutes" + } + }, + "question": "Is het mogelijk om hier te sportklimmen/voorklimmen op reeds aangebrachte haken?" + }, + "10": { + "mappings": { + "0": { + "then": "Traditioneel klimmen kan hier" + }, + "1": { + "then": "Traditioneel klimmen kan hier niet" + }, + "2": { + "then": "Er zijn hier {climbing:traditional} traditionele klimroutes" + } + }, + "question": "Is het mogelijk om hier traditioneel te klimmen?
    (Dit is klimmen met klemblokjes en friends)" + }, + "11": { + "mappings": { + "0": { + "then": "Er is een snelklimmuur voor speed climbing" + }, + "1": { + "then": "Er is geen snelklimmuur voor speed climbing" + }, + "2": { + "then": "Er zijn hier {climbing:speed} snelklimmuren" + } + }, + "question": "Is er een snelklimmuur (speed climbing)?" } + }, + "units+": { + "0": { + "applicableUnits": { + "0": { + "human": " meter" + }, + "1": { + "human": " voet" + } + } + } + } }, - "waste_basket": { - "description": "Op deze kaart vind je vuilnisbakken waar je afval in kan smijten. Ontbreekt er een vuilnisbak? Dan kan je die zelf toevoegen", - "shortDescription": "Een kaart met vuilnisbakken", - "title": "Vuilnisbak" + "title": "Open klimkaart" + }, + "cycle_infra": { + "description": "Een kaart waar je info over de fietsinfrastructuur kan bekijken en bewerken. Gemaakt tijdens #osoc21.", + "shortDescription": "Een kaart waar je info over de fietsinfrastructuur kan bekijken en bewerken.", + "title": "Fietsinfrastructuur" + }, + "cyclestreets": { + "description": "Een fietsstraat is een straat waar
    • automobilisten geen fietsers mogen inhalen
    • Er een maximumsnelheid van 30km/u geldt
    • Fietsers gemotoriseerde voertuigen links mogen inhalen
    • Fietsers nog steeds voorrang aan rechts moeten verlenen - ook aan auto's en voetgangers op het zebrapad


    Op deze open kaart kan je alle gekende fietsstraten zien en kan je ontbrekende fietsstraten aanduiden. Om de kaart aan te passen, moet je je aanmelden met OpenStreetMap en helemaal inzoomen tot straatniveau. ", + "layers": { + "0": { + "description": "Een fietsstraat is een straat waar gemotoriseerd verkeer een fietser niet mag inhalen.", + "name": "Fietsstraten" + }, + "1": { + "description": "Deze straat wordt binnenkort een fietsstraat", + "name": "Toekomstige fietsstraat", + "title": { + "mappings": { + "0": { + "then": "{name} wordt fietsstraat" + } + }, + "render": "Toekomstige fietsstraat" + } + }, + "2": { + "description": "Laag waar je een straat als fietsstraat kan markeren", + "name": "Alle straten", + "title": { + "render": "Straat" + } + } + }, + "overrideAll": { + "tagRenderings+": { + "0": { + "mappings": { + "0": { + "then": "Deze straat is een fietsstraat (en dus zone 30)" + }, + "1": { + "then": "Deze straat is een fietsstraat" + }, + "2": { + "then": "Deze straat wordt binnenkort een fietsstraat" + }, + "3": { + "then": "Deze straat is geen fietsstraat" + } + }, + "question": "Is de straat {name} een fietsstraat?" + }, + "1": { + "question": "Wanneer wordt deze straat een fietsstraat?", + "render": "Deze straat wordt fietsstraat op {cyclestreet:start_date}" + } + } + }, + "shortDescription": "Een kaart met alle gekende fietsstraten", + "title": "Fietsstraten" + }, + "cyclofix": { + "description": "Het doel van deze kaart is om fietsers een gebruiksvriendelijke oplossing te bieden voor het vinden van de juiste infrastructuur voor hun behoeften.

    U kunt uw exacte locatie volgen (enkel mobiel) en in de linkerbenedenhoek categorieën selecteren die voor u relevant zijn. U kunt deze tool ook gebruiken om 'spelden' aan de kaart toe te voegen of te bewerken en meer gegevens te verstrekken door de vragen te beantwoorden.

    Alle wijzigingen die u maakt worden automatisch opgeslagen in de wereldwijde database van OpenStreetMap en kunnen door anderen vrij worden hergebruikt.

    Bekijk voor meer info over cyclofix ook cyclofix.osm.be.", + "title": "Cyclofix - een open kaart voor fietsers" + }, + "drinking_water": { + "description": "Op deze kaart staan publiek toegankelijke drinkwaterpunten en kan je makkelijk een nieuw drinkwaterpunt toevoegen", + "title": "Drinkwaterpunten" + }, + "etymology": { + "description": "Op deze kaart zie je waar een plaats naar is vernoemd. De straten, gebouwen, ... komen uit OpenStreetMap, waar een link naar Wikidata werd gelegd. In de popup zie je het Wikipedia-artikel van hetgeen naarwaar het vernoemd is of de Wikidata-box.

    Je kan zelf ook meehelpen!Als je ver inzoomt, krijg je alle straten te zien. Klik je een straat aan, dan krijg je een zoekfunctie waarmee je snel een nieuwe link kan leggen. Je hebt hiervoor een gratis OpenStreetMap account nodig.", + "layers": { + "1": { + "override": { + "name": "Straten zonder etymologische informatie" + } + }, + "2": { + "override": { + "name": "Parken en bossen zonder etymologische informatie" + } + } + }, + "shortDescription": "Wat is de oorsprong van een plaatsnaam?", + "title": "Open Etymology-kaart" + }, + "facadegardens": { + "description": "Ontharde voortuintjes, groene gevels en bomen ín de stad brengen naast rust ook een mooiere stad, een grotere biodiversiteit, een verkoelend effect en een betere luchtkwaliteit.
    Klimaan VZW en 'Mechelen Klimaatneutraal' willen met het project Klim(t)aan je Gevel bestaande en nieuwe geveltuintjes in kaart brengen als voorbeeld voor mensen zelf een tuintje willen aanleggen of voor stadwandelaars die houden van de natuur.
    Meer info over het project op klimaan.be.", + "layers": { + "0": { + "description": "Geveltuintjes", + "name": "Geveltuintjes", + "presets": { + "0": { + "description": "Voeg geveltuintje toe", + "title": "geveltuintje" + } + }, + "tagRenderings": { + "facadegardens-description": { + "question": "Aanvullende omschrijving van de tuin (indien nodig, en voor zover nog niet omschreven hierboven)", + "render": "Meer details: {description}" + }, + "facadegardens-direction": { + "question": "Hoe is de tuin georiënteerd?", + "render": "Oriëntatie: {direction} (waarbij 0=N en 90=O)" + }, + "facadegardens-edible": { + "mappings": { + "0": { + "then": "Er staan eetbare planten" + }, + "1": { + "then": "Er staan geen eetbare planten" + } + }, + "question": "Staan er eetbare planten?" + }, + "facadegardens-plants": { + "mappings": { + "0": { + "then": "Er staat een klimplant" + }, + "1": { + "then": "Er staan bloeiende planten" + }, + "2": { + "then": "Er staan struiken" + }, + "3": { + "then": "Er staan bodembedekkers" + } + }, + "question": "Wat voor planten staan hier?" + }, + "facadegardens-rainbarrel": { + "mappings": { + "0": { + "then": "Er is een regenton" + }, + "1": { + "then": "Er is geen regenton" + } + }, + "question": "Is er een regenton voorzien bij het tuintje?" + }, + "facadegardens-start_date": { + "question": "Wanneer werd de tuin aangelegd? (vul gewoon een jaartal in)", + "render": "Aanlegdatum van de tuin: {start_date}" + }, + "facadegardens-sunshine": { + "mappings": { + "0": { + "then": "Het is een volle zon tuintje" + }, + "1": { + "then": "Het is een halfschaduw tuintje" + }, + "2": { + "then": "Het is een schaduw tuintje" + } + }, + "question": "Ligt de tuin in zon/half schaduw of schaduw?" + } + }, + "title": { + "render": "Geveltuintje" + } + } + }, + "shortDescription": "Deze kaart toont geveltuintjes met foto's en bruikbare info over oriëntatie, zonlicht en planttypes.", + "title": "Straatgeveltuintjes" + }, + "food": { + "description": "Restaurants en fast food", + "title": "Eetgelegenheden" + }, + "fritures": { + "description": "Op deze kaart vind je je favoriete frituur!", + "layers": { + "0": { + "override": { + "name": "Frituren" + } + } + }, + "title": "Friturenkaart" + }, + "fruit_trees": { + "description": "Op deze kaart vindt je boomgaarden en fruitbomen", + "layers": { + "0": { + "name": "Boomgaarden", + "presets": { + "0": { + "description": "Voeg een boomgaard toe (als punt - omtrek nog te tekenen)", + "title": "Boomgaard" + } + }, + "title": { + "render": "Boomgaard" + } + }, + "1": { + "description": "Een boom", + "name": "Boom", + "presets": { + "0": { + "description": "Voeg hier een boom toe", + "title": "Boom" + } + }, + "tagRenderings": { + "fruitboom-description": { + "question": "Welke beschrijving past bij deze boom?", + "render": "Beschrijving: {description}" + }, + "fruitboom-ref": { + "question": "Is er een refernetienummer?", + "render": "Referentienummer: {ref}" + }, + "fruitboom-species:nl": { + "question": "Wat is de soort van deze boom (in het Nederlands)?", + "render": "De soort is {species:nl}" + }, + "fruitboom-taxon": { + "question": "Wat is het taxon (ras) van deze boom?", + "render": "Het ras (taxon) van deze boom is {taxon}" + } + }, + "title": { + "render": "Boom" + } + } + }, + "shortDescription": "Boomgaarden en fruitbomen", + "title": "Open Boomgaardenkaart" + }, + "ghostbikes": { + "description": "Een Witte Fiets of Spookfiets is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat om een fiets die volledig wit is geschilderd en in de buurt van het ongeval werd geinstalleerd.

    Op deze kaart zie je alle witte fietsen die door OpenStreetMap gekend zijn. Ontbreekt er een Witte Fiets of wens je informatie aan te passen? Meld je dan aan met een (gratis) OpenStreetMap account.", + "title": "Witte Fietsen" + }, + "grb": { + "description": "GRB Fixup", + "layers": { + "3": { + "description": "Dit gebouw heeft een foutmelding", + "name": "Fixmes op gebouwen", + "tagRenderings": { + "grb-fixme": { + "mappings": { + "0": { + "then": "Geen fixme" + } + }, + "question": "Wat zegt de fixme?", + "render": "De fixme is {fixme}" + }, + "grb-housenumber": { + "mappings": { + "0": { + "then": "Geen huisnummer" + } + }, + "question": "Wat is het huisnummer?", + "render": "Het huisnummer is {addr:housenumber}" + }, + "grb-min-level": { + "question": "Hoeveel verdiepingen ontbreken?", + "render": "Dit gebouw begint maar op de {building:min_level} verdieping" + }, + "grb-street": { + "question": "Wat is de straat?", + "render": "De straat is {addr:street}" + }, + "grb-unit": { + "render": "De wooneenheid-aanduiding is {addr:unit} " + } + }, + "title": { + "mappings": { + "0": { + "then": "{fixme}" + } + }, + "render": "{addr:street} {addr:housenumber}" + } + }, + "5": { + "description": "Dit gebouw heeft een foutmelding", + "name": "Fixmes op gebouwen", + "tagRenderings": { + "grb-fixme": { + "mappings": { + "0": { + "then": "Geen fixme" + } + }, + "question": "Wat zegt de fixme?", + "render": "De fixme is {fixme}" + }, + "grb-housenumber": { + "mappings": { + "0": { + "then": "Geen huisnummer" + } + }, + "question": "Wat is het huisnummer?", + "render": "Het huisnummer is {addr:housenumber}" + }, + "grb-min-level": { + "question": "Hoeveel verdiepingen ontbreken?", + "render": "Dit gebouw begint maar op de {building:min_level} verdieping" + }, + "grb-street": { + "question": "Wat is de straat?", + "render": "De straat is {addr:street}" + }, + "grb-unit": { + "render": "De wooneenheid-aanduiding is {addr:unit} " + } + }, + "title": { + "mappings": { + "0": { + "then": "{fixme}" + } + }, + "render": "{addr:street} {addr:housenumber}" + } + } + }, + "shortDescription": "Grb Fixup", + "title": "GRB Fixup" + }, + "maps": { + "description": "Op deze kaart kan je alle kaarten zien die OpenStreetMap kent.

    Ontbreekt er een kaart, dan kan je die kaart hier ook gemakelijk aan deze kaart toevoegen.", + "shortDescription": "Een kaart met alle kaarten die OpenStreetMap kent", + "title": "Een kaart met Kaarten" + }, + "nature": { + "description": "Op deze kaart vind je informatie voor natuurliefhebbers, zoals info over het natuurgebied waar je inzit, vogelkijkhutten, informatieborden, ...", + "shortDescription": "Deze kaart bevat informatie voor natuurliefhebbers", + "title": "De Natuur in" + }, + "natuurpunt": { + "description": "Op deze kaart vind je alle natuurgebieden die Natuurpunt ter beschikking stelt", + "shortDescription": "Deze kaart toont de natuurgebieden van Natuurpunt", + "title": "Natuurgebieden" + }, + "observation_towers": { + "description": "Publieke uitkijktorens om van het panorama te genieten", + "shortDescription": "Publieke uitkijktorens om van het panorama te genieten", + "title": "Uitkijktorens" + }, + "openwindpowermap": { + "layers": { + "0": { + "name": "windturbine", + "presets": { + "0": { + "title": "windturbine" + } + }, + "title": { + "render": "windturbine" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": " megawatt" + }, + "1": { + "human": " kilowatt" + }, + "2": { + "human": " watt" + }, + "3": { + "human": " gigawatt" + } + } + }, + "1": { + "applicableUnits": { + "0": { + "human": " meter" + } + } + } + } + } } + }, + "parkings": { + "description": "Deze kaart toont verschillende parkeerplekken", + "shortDescription": "Deze kaart toont verschillende parkeerplekken", + "title": "Parking" + }, + "personal": { + "description": "Stel je eigen thema samen door lagen te combineren van alle andere themas", + "title": "Persoonlijk thema" + }, + "play_forests": { + "description": "Een speelbos is een zone in een bos die vrij toegankelijk is voor spelende kinderen. Deze wordt in bossen van het Agentschap Natuur en bos altijd aangeduid met het overeenkomstige bord.", + "shortDescription": "Deze kaart toont speelbossen", + "title": "Speelbossen" + }, + "playgrounds": { + "description": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen", + "shortDescription": "Een kaart met speeltuinen", + "title": "Speelplekken" + }, + "speelplekken": { + "description": "

    Welkom bij de Groendoener!

    De Zuidrand dat is spelen, ravotten, chillen, wandelen,… in het groen. Meer dan 200 grote en kleine speelplekken liggen er in parken, in bossen en op pleintjes te wachten om ontdekt te worden. De verschillende speelplekken werden getest én goedgekeurd door kinder- en jongerenreporters uit de Zuidrand. Met leuke challenges dagen de reporters jou uit om ook op ontdekking te gaan. Klik op een speelplek op de kaart, bekijk het filmpje en ga op verkenning!

    Het project groendoener kadert binnen het strategisch project Beleefbare Open Ruimte in de Antwerpse Zuidrand en is een samenwerking tussen het departement Leefmilieu van provincie Antwerpen, Sportpret vzw, een OpenStreetMap-België Consultent en Createlli vzw. Het project kwam tot stand met steun van Departement Omgeving van de Vlaamse Overheid.
    ", + "layers": { + "7": { + "name": "Wandelroutes van provincie Antwerpen", + "tagRenderings": { + "walk-description": { + "render": "

    Korte beschrijving:

    {description}" + }, + "walk-length": { + "render": "Deze wandeling is {_length:km}km lang" + }, + "walk-operator": { + "question": "Wie beheert deze wandeling en plaatst dus de signalisatiebordjes?" + }, + "walk-operator-email": { + "question": "Naar wie kan men emailen bij problemen rond signalisatie?", + "render": "Bij problemen met signalisatie kan men emailen naar {operator:email}" + }, + "walk-type": { + "mappings": { + "0": { + "then": "Dit is een internationale wandelroute" + }, + "1": { + "then": "Dit is een nationale wandelroute" + }, + "2": { + "then": "Dit is een regionale wandelroute" + }, + "3": { + "then": "Dit is een lokale wandelroute" + } + } + } + } + } + }, + "shortDescription": "Speelplekken in de Antwerpse Zuidrand", + "title": "Welkom bij de groendoener!" + }, + "sport_pitches": { + "description": "Een sportveld is een ingerichte plaats met infrastructuur om een sport te beoefenen", + "shortDescription": "Deze kaart toont sportvelden", + "title": "Sportvelden" + }, + "street_lighting": { + "description": "Op deze kaart vind je alles over straatlantaarns", + "layers": { + "1": { + "name": "Verlichte straten", + "tagRenderings": { + "lit": { + "mappings": { + "0": { + "then": "Deze straat is verlicht" + }, + "1": { + "then": "Deze straat is niet verlicht" + }, + "2": { + "then": "Deze straat is 's nachts verlicht" + }, + "3": { + "then": "Deze straat is 24/7 verlicht" + } + }, + "question": "Is deze straat verlicht?" + } + }, + "title": { + "render": "Verlichte straat" + } + }, + "2": { + "name": "Alle straten", + "tagRenderings": { + "lit": { + "mappings": { + "0": { + "then": "Deze straat is verlicht" + }, + "1": { + "then": "Deze straat is niet verlicht" + }, + "2": { + "then": "Deze straat is 's nachts verlicht" + }, + "3": { + "then": "Deze straat is 24/7 verlicht" + } + }, + "question": "Is deze straat verlicht?" + } + }, + "title": { + "render": "Straat" + } + } + }, + "title": "Straatverlichting" + }, + "street_lighting_assen": { + "description": "Op deze kaart vind je alles over straatlantaarns + een dataset van Assen", + "title": "Straatverlichting - Assen" + }, + "surveillance": { + "description": "Op deze open kaart kan je bewakingscamera's vinden.", + "shortDescription": "Bewakingscameras en dergelijke", + "title": "Surveillance under Surveillance" + }, + "toerisme_vlaanderen": { + "description": "Op deze kaart kan je info zien die relevant is voor toerisme, zoals:
    • Eetgelegenheden
    • Cafés en bars
    • (Fiets)oplaadpunten
    • Fietspompen, fietserverhuur en fietswinkels
    • Uitkijktorens
    • ...
    Zie je fouten op de kaart? Dan kan je zelf makkelijk aanpasingen maken, die zichtbaar zijn voor iedereen. Hiervoor dien je een gratis OpenStreetMap account voor te maken.", + "descriptionTail": "Met de steun van Toerisme Vlaanderen", + "shortDescription": "Een kaart om toeristisch relevante info op aan te duiden", + "title": "Toeristisch relevante info" + }, + "toilets": { + "description": "Een kaart met openbare toiletten", + "title": "Open Toilettenkaart" + }, + "trees": { + "description": "Breng bomen in kaart!", + "shortDescription": "Breng bomen in kaart", + "title": "Bomen" + }, + "uk_addresses": { + "description": "Draag bij aan OpenStreetMap door adresinformatie in te vullen", + "layers": { + "2": { + "description": "Adressen", + "tagRenderings": { + "uk_addresses_housenumber": { + "mappings": { + "0": { + "then": "Dit gebouw heeft geen huisnummer" + } + }, + "render": "Het huisnummer is {addr:housenumber}" + } + } + } + } + }, + "waste_basket": { + "description": "Op deze kaart vind je vuilnisbakken waar je afval in kan smijten. Ontbreekt er een vuilnisbak? Dan kan je die zelf toevoegen", + "shortDescription": "Een kaart met vuilnisbakken", + "title": "Vuilnisbak" + } } \ No newline at end of file diff --git a/langs/themes/pl.json b/langs/themes/pl.json index 48289dbab0..afaf282d97 100644 --- a/langs/themes/pl.json +++ b/langs/themes/pl.json @@ -1,24 +1,24 @@ { - "aed": { - "description": "Na tej mapie można znaleźć i oznaczyć defibrylatory w okolicy", - "title": "Otwórz mapę AED" - }, - "artwork": { - "title": "Otwórz mapę dzieł sztuki" - }, - "ghostbikes": { - "title": "Duch roweru" - }, - "surveillance": { - "description": "Na tej otwartej mapie można znaleźć kamery monitoringu.", - "shortDescription": "Kamery monitorujące i inne środki nadzoru" - }, - "toilets": { - "description": "Mapa toalet publicznych", - "title": "Mapa otwartych toalet" - }, - "trees": { - "shortDescription": "Sporządzić mapę wszystkich drzew", - "title": "Drzewa" - } + "aed": { + "description": "Na tej mapie można znaleźć i oznaczyć defibrylatory w okolicy", + "title": "Otwórz mapę AED" + }, + "artwork": { + "title": "Otwórz mapę dzieł sztuki" + }, + "ghostbikes": { + "title": "Duch roweru" + }, + "surveillance": { + "description": "Na tej otwartej mapie można znaleźć kamery monitoringu.", + "shortDescription": "Kamery monitorujące i inne środki nadzoru" + }, + "toilets": { + "description": "Mapa toalet publicznych", + "title": "Mapa otwartych toalet" + }, + "trees": { + "shortDescription": "Sporządzić mapę wszystkich drzew", + "title": "Drzewa" + } } \ No newline at end of file diff --git a/langs/themes/pt.json b/langs/themes/pt.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/langs/themes/pt.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/langs/themes/pt_BR.json b/langs/themes/pt_BR.json index 6c7de8bfd0..2116e8d9d6 100644 --- a/langs/themes/pt_BR.json +++ b/langs/themes/pt_BR.json @@ -1,172 +1,172 @@ { - "aed": { - "description": "Neste mapa, pode-se encontrar e marcar desfibriladores próximos", - "title": "Abrir mapa AED" - }, - "benches": { - "shortDescription": "Um mapa de bancadas", - "title": "Bancadas" - }, - "bicyclelib": { - "title": "Bibliotecas de bicicletas" - }, - "bookcases": { - "title": "Abrir Mapa de Estantes" - }, - "campersite": { - "layers": { - "0": { - "description": "Locais de acampamento", - "name": "Locais de acampamento", - "presets": { - "0": { - "title": "local de acampamento" - } - }, - "tagRenderings": { - "caravansites-capacity": { - "question": "Quantos campistas podem ficar aqui? (pule se não houver um número óbvio de vagas ou veículos permitidos)", - "render": "{capacity} campistas podem usar este lugar ao mesmo tempo" - }, - "caravansites-charge": { - "question": "Quanto este lugar cobra?", - "render": "Este lugar cobra {charge}" - }, - "caravansites-description": { - "render": "Mais detalhes sobre este lugar: {description}" - }, - "caravansites-fee": { - "mappings": { - "0": { - "then": "Você precisa pagar para usar" - }, - "1": { - "then": "Pode ser usado de graça" - } - }, - "question": "Este lugar cobra alguma taxa?" - }, - "caravansites-internet": { - "mappings": { - "0": { - "then": "Há acesso à internet" - }, - "1": { - "then": "Há acesso à Internet" - }, - "2": { - "then": "Não há acesso à internet" - } - }, - "question": "Este lugar fornece acesso a internet?" - }, - "caravansites-internet-fee": { - "mappings": { - "0": { - "then": "Você precisa pagar um extra pelo acesso à internet" - }, - "1": { - "then": "Você não precisa pagar um extra pelo acesso à internet" - } - }, - "question": "Você tem que pagar pelo acesso à internet?" - }, - "caravansites-long-term": { - "mappings": { - "0": { - "then": "Sim, há alguns pontos para aluguel a longo prazo, mas você também pode ficar em uma base diária" - }, - "1": { - "then": "Não, não há hóspedes permanentes aqui" - } - }, - "question": "Este lugar oferece vagas para aluguel a longo prazo?" - }, - "caravansites-name": { - "question": "Qual o nome deste lugar?", - "render": "Este lugar é chamado de {name}" - }, - "caravansites-sanitary-dump": { - "mappings": { - "0": { - "then": "Este local tem uma estação de aterro sanitário" - }, - "1": { - "then": "Este local não tem uma estação de aterro sanitário" - } - }, - "question": "Este local tem uma estação de aterro sanitário?" - }, - "caravansites-toilets": { - "mappings": { - "0": { - "then": "Este lugar tem banheiros" - }, - "1": { - "then": "Este lugar não tem banheiros" - } - }, - "question": "Este lugar tem banheiros?" - }, - "caravansites-website": { - "question": "Este lugar tem um website?", - "render": "Site oficial: {website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Locais de acampamento sem nome" - } - }, - "render": "Local de acampamento {name}" - } - }, - "1": { - "description": "Estações de despejo sanitário", - "name": "Estações de despejo sanitário", - "tagRenderings": { - "dumpstations-charge": { - "question": "Quanto este lugar cobra?", - "render": "Este lugar cobra {charge}" - }, - "dumpstations-fee": { - "mappings": { - "0": { - "then": "Você precisa pagar pelo uso" - }, - "1": { - "then": "Pode ser usado gratuitamente" - } - }, - "question": "Este lugar cobra alguma taxa?" - }, - "dumpstations-waterpoint": { - "mappings": { - "0": { - "then": "Este lugar tem um ponto de água" - }, - "1": { - "then": "Este lugar não tem um ponto de água" - } - }, - "question": "Este lugar tem um ponto de água?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Estação de despejo" - } - }, - "render": "Estação de despejo {nome}" - } - } + "aed": { + "description": "Neste mapa, pode-se encontrar e marcar desfibriladores próximos", + "title": "Abrir mapa AED" + }, + "benches": { + "shortDescription": "Um mapa de bancadas", + "title": "Bancadas" + }, + "bicyclelib": { + "title": "Bibliotecas de bicicletas" + }, + "bookcases": { + "title": "Abrir Mapa de Estantes" + }, + "campersite": { + "layers": { + "0": { + "description": "Locais de acampamento", + "name": "Locais de acampamento", + "presets": { + "0": { + "title": "local de acampamento" + } }, - "shortDescription": "Encontre locais para passar a noite com o seu campista", - "title": "Locais de acampamento" + "tagRenderings": { + "caravansites-capacity": { + "question": "Quantos campistas podem ficar aqui? (pule se não houver um número óbvio de vagas ou veículos permitidos)", + "render": "{capacity} campistas podem usar este lugar ao mesmo tempo" + }, + "caravansites-charge": { + "question": "Quanto este lugar cobra?", + "render": "Este lugar cobra {charge}" + }, + "caravansites-description": { + "render": "Mais detalhes sobre este lugar: {description}" + }, + "caravansites-fee": { + "mappings": { + "0": { + "then": "Você precisa pagar para usar" + }, + "1": { + "then": "Pode ser usado de graça" + } + }, + "question": "Este lugar cobra alguma taxa?" + }, + "caravansites-internet": { + "mappings": { + "0": { + "then": "Há acesso à internet" + }, + "1": { + "then": "Há acesso à Internet" + }, + "2": { + "then": "Não há acesso à internet" + } + }, + "question": "Este lugar fornece acesso a internet?" + }, + "caravansites-internet-fee": { + "mappings": { + "0": { + "then": "Você precisa pagar um extra pelo acesso à internet" + }, + "1": { + "then": "Você não precisa pagar um extra pelo acesso à internet" + } + }, + "question": "Você tem que pagar pelo acesso à internet?" + }, + "caravansites-long-term": { + "mappings": { + "0": { + "then": "Sim, há alguns pontos para aluguel a longo prazo, mas você também pode ficar em uma base diária" + }, + "1": { + "then": "Não, não há hóspedes permanentes aqui" + } + }, + "question": "Este lugar oferece vagas para aluguel a longo prazo?" + }, + "caravansites-name": { + "question": "Qual o nome deste lugar?", + "render": "Este lugar é chamado de {name}" + }, + "caravansites-sanitary-dump": { + "mappings": { + "0": { + "then": "Este local tem uma estação de aterro sanitário" + }, + "1": { + "then": "Este local não tem uma estação de aterro sanitário" + } + }, + "question": "Este local tem uma estação de aterro sanitário?" + }, + "caravansites-toilets": { + "mappings": { + "0": { + "then": "Este lugar tem banheiros" + }, + "1": { + "then": "Este lugar não tem banheiros" + } + }, + "question": "Este lugar tem banheiros?" + }, + "caravansites-website": { + "question": "Este lugar tem um website?", + "render": "Site oficial: {website}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Locais de acampamento sem nome" + } + }, + "render": "Local de acampamento {name}" + } + }, + "1": { + "description": "Estações de despejo sanitário", + "name": "Estações de despejo sanitário", + "tagRenderings": { + "dumpstations-charge": { + "question": "Quanto este lugar cobra?", + "render": "Este lugar cobra {charge}" + }, + "dumpstations-fee": { + "mappings": { + "0": { + "then": "Você precisa pagar pelo uso" + }, + "1": { + "then": "Pode ser usado gratuitamente" + } + }, + "question": "Este lugar cobra alguma taxa?" + }, + "dumpstations-waterpoint": { + "mappings": { + "0": { + "then": "Este lugar tem um ponto de água" + }, + "1": { + "then": "Este lugar não tem um ponto de água" + } + }, + "question": "Este lugar tem um ponto de água?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Estação de despejo" + } + }, + "render": "Estação de despejo {nome}" + } + } }, - "ghostbikes": { - "title": "Bicicleta fantasma" - } + "shortDescription": "Encontre locais para passar a noite com o seu campista", + "title": "Locais de acampamento" + }, + "ghostbikes": { + "title": "Bicicleta fantasma" + } } \ No newline at end of file diff --git a/langs/themes/ru.json b/langs/themes/ru.json index 6923005264..504e3b9cde 100644 --- a/langs/themes/ru.json +++ b/langs/themes/ru.json @@ -1,511 +1,511 @@ { - "aed": { - "description": "На этой карте вы можете найти и отметить ближайшие дефибрилляторы", - "title": "Открытая карта АВД (Автоматизированных внешних дефибрилляторов)" - }, - "artwork": { - "description": "Добро пожаловать на Open Artwork Map, карту статуй, бюстов, граффити и других произведений искусства по всему миру", - "title": "Открытая карта произведений искусства" - }, - "benches": { - "description": "На этой карте показаны все скамейки, записанные в OpenStreetMap: отдельные скамейки, а также скамейки, относящиеся к остановкам общественного транспорта или навесам. Имея учётную запись OpenStreetMap, вы можете наносить на карту новые скамейки или редактировать информацию о существующих скамейках.", - "shortDescription": "Карта скамеек", - "title": "Скамейки" - }, - "bicyclelib": { - "description": "Велосипедная библиотека - это место, где велосипеды можно взять на время, часто за небольшую ежегодную плату. Примером использования являются библиотеки велосипедов для детей, что позволяет им сменить велосипед на больший, когда они перерастают свой нынешний велосипед", - "title": "Велосипедные библиотеки" - }, - "bookcases": { - "description": "Общественный книжный шкаф - это небольшой уличный шкаф, коробка, старый телефонный аппарат или другие предметы, где хранятся книги. Каждый может положить или взять книгу. Цель этой карты - собрать все эти книжные шкафы. Вы можете обнаружить новые книжные шкафы поблизости и, имея бесплатный аккаунт OpenStreetMap, быстро добавить свои любимые книжные шкафы.", - "title": "Открытая карта книжных шкафов" - }, - "campersite": { - "description": "На этом сайте собраны все официальные места остановки кемперов и места, где можно сбросить серую и черную воду. Вы можете добавить подробную информацию о предоставляемых услугах и их стоимости. Добавлять фотографии и отзывы. Это веб-сайт и веб-приложение. Данные хранятся в OpenStreetMap, поэтому они будут бесплатными всегда и могут быть повторно использованы любым приложением.", - "layers": { + "aed": { + "description": "На этой карте вы можете найти и отметить ближайшие дефибрилляторы", + "title": "Открытая карта АВД (Автоматизированных внешних дефибрилляторов)" + }, + "artwork": { + "description": "Добро пожаловать на Open Artwork Map, карту статуй, бюстов, граффити и других произведений искусства по всему миру", + "title": "Открытая карта произведений искусства" + }, + "benches": { + "description": "На этой карте показаны все скамейки, записанные в OpenStreetMap: отдельные скамейки, а также скамейки, относящиеся к остановкам общественного транспорта или навесам. Имея учётную запись OpenStreetMap, вы можете наносить на карту новые скамейки или редактировать информацию о существующих скамейках.", + "shortDescription": "Карта скамеек", + "title": "Скамейки" + }, + "bicyclelib": { + "description": "Велосипедная библиотека - это место, где велосипеды можно взять на время, часто за небольшую ежегодную плату. Примером использования являются библиотеки велосипедов для детей, что позволяет им сменить велосипед на больший, когда они перерастают свой нынешний велосипед", + "title": "Велосипедные библиотеки" + }, + "bookcases": { + "description": "Общественный книжный шкаф - это небольшой уличный шкаф, коробка, старый телефонный аппарат или другие предметы, где хранятся книги. Каждый может положить или взять книгу. Цель этой карты - собрать все эти книжные шкафы. Вы можете обнаружить новые книжные шкафы поблизости и, имея бесплатный аккаунт OpenStreetMap, быстро добавить свои любимые книжные шкафы.", + "title": "Открытая карта книжных шкафов" + }, + "campersite": { + "description": "На этом сайте собраны все официальные места остановки кемперов и места, где можно сбросить серую и черную воду. Вы можете добавить подробную информацию о предоставляемых услугах и их стоимости. Добавлять фотографии и отзывы. Это веб-сайт и веб-приложение. Данные хранятся в OpenStreetMap, поэтому они будут бесплатными всегда и могут быть повторно использованы любым приложением.", + "layers": { + "0": { + "description": "площадки для кемпинга", + "name": "Площадки для кемпинга", + "presets": { + "0": { + "description": "Добавьте новую официальную площадку для кемпинга. Это специально отведённые места для ночлега с автофургоном. Они могут выглядеть как настоящий кемпинг или просто выглядеть как парковка. Они не могут быть обозначены вообще, а просто быть определены в муниципальном решении. Обычная парковка, предназначенная для отдыхающих, где не ожидается, что они проведут ночь это -НЕ- площадка для кемпинга ", + "title": "площадка для кемпинга" + } + }, + "tagRenderings": { + "caravansites-capacity": { + "question": "Сколько кемперов может здесь остановиться? (пропустите, если нет очевидного количества мест или разрешённых транспортных средств)", + "render": "{capacity} кемперов могут использовать это место одновременно" + }, + "caravansites-charge": { + "question": "Сколько это место взимает?", + "render": "Это место взимает {charge}" + }, + "caravansites-description": { + "question": "Хотели бы вы добавить общее описание этого места? (Не повторяйте информацию, которая уже написана выше или на которую вы уже ответили ранее. Пожалуйста, будьте объективны - мнения должны быть в отзывах)", + "render": "Более подробная информация об этом месте: {description}" + }, + "caravansites-fee": { + "mappings": { + "0": { + "then": "За использование нужно платить" + }, + "1": { + "then": "Можно использовать бесплатно" + } + }, + "question": "Взимается ли в этом месте плата?" + }, + "caravansites-internet": { + "mappings": { + "0": { + "then": "Есть доступ в Интернет" + }, + "1": { + "then": "Есть доступ в Интернет" + }, + "2": { + "then": "Нет доступа в Интернет" + } + }, + "question": "Предоставляет ли это место доступ в Интернет?" + }, + "caravansites-internet-fee": { + "mappings": { + "0": { + "then": "За доступ в Интернет нужно платить дополнительно" + }, + "1": { + "then": "Вам не нужно платить дополнительно за доступ в Интернет" + } + }, + "question": "Нужно ли платить за доступ в Интернет?" + }, + "caravansites-long-term": { + "mappings": { + "0": { + "then": "Да, здесь есть места для долгосрочной аренды, но вы можете остановиться и на сутки" + }, + "1": { + "then": "Нет, здесь нет постоянных гостей" + }, + "2": { + "then": "Здесь можно остановиться, только если у вас долгосрочный контракт (это место исчезнет с этой карты, если вы выберете это)" + } + }, + "question": "Предлагает ли эта площадка места для долгосрочной аренды?" + }, + "caravansites-name": { + "question": "Как называется это место?", + "render": "Это место называется {name}" + }, + "caravansites-sanitary-dump": { + "mappings": { + "0": { + "then": "В этом кемпинге есть место для слива отходов из туалетных резервуаров" + }, + "1": { + "then": "В этом кемпинге нет места для слива отходов из туалетных резервуаров" + } + }, + "question": "В этом кемпинге есть место для слива отходов из туалетных резервуаров?" + }, + "caravansites-toilets": { + "mappings": { + "0": { + "then": "В этом месте есть туалеты" + }, + "1": { + "then": "В этом месте нет туалетов" + } + }, + "question": "Здесь есть туалеты?" + }, + "caravansites-website": { + "question": "Есть ли у этого места веб-сайт?", + "render": "Официальный сайт: {website}" + } + }, + "title": { + "mappings": { "0": { - "description": "площадки для кемпинга", - "name": "Площадки для кемпинга", - "presets": { - "0": { - "description": "Добавьте новую официальную площадку для кемпинга. Это специально отведённые места для ночлега с автофургоном. Они могут выглядеть как настоящий кемпинг или просто выглядеть как парковка. Они не могут быть обозначены вообще, а просто быть определены в муниципальном решении. Обычная парковка, предназначенная для отдыхающих, где не ожидается, что они проведут ночь это -НЕ- площадка для кемпинга ", - "title": "площадка для кемпинга" - } - }, - "tagRenderings": { - "caravansites-capacity": { - "question": "Сколько кемперов может здесь остановиться? (пропустите, если нет очевидного количества мест или разрешённых транспортных средств)", - "render": "{capacity} кемперов могут использовать это место одновременно" - }, - "caravansites-charge": { - "question": "Сколько это место взимает?", - "render": "Это место взимает {charge}" - }, - "caravansites-description": { - "question": "Хотели бы вы добавить общее описание этого места? (Не повторяйте информацию, которая уже написана выше или на которую вы уже ответили ранее. Пожалуйста, будьте объективны - мнения должны быть в отзывах)", - "render": "Более подробная информация об этом месте: {description}" - }, - "caravansites-fee": { - "mappings": { - "0": { - "then": "За использование нужно платить" - }, - "1": { - "then": "Можно использовать бесплатно" - } - }, - "question": "Взимается ли в этом месте плата?" - }, - "caravansites-internet": { - "mappings": { - "0": { - "then": "Есть доступ в Интернет" - }, - "1": { - "then": "Есть доступ в Интернет" - }, - "2": { - "then": "Нет доступа в Интернет" - } - }, - "question": "Предоставляет ли это место доступ в Интернет?" - }, - "caravansites-internet-fee": { - "mappings": { - "0": { - "then": "За доступ в Интернет нужно платить дополнительно" - }, - "1": { - "then": "Вам не нужно платить дополнительно за доступ в Интернет" - } - }, - "question": "Нужно ли платить за доступ в Интернет?" - }, - "caravansites-long-term": { - "mappings": { - "0": { - "then": "Да, здесь есть места для долгосрочной аренды, но вы можете остановиться и на сутки" - }, - "1": { - "then": "Нет, здесь нет постоянных гостей" - }, - "2": { - "then": "Здесь можно остановиться, только если у вас долгосрочный контракт (это место исчезнет с этой карты, если вы выберете это)" - } - }, - "question": "Предлагает ли эта площадка места для долгосрочной аренды?" - }, - "caravansites-name": { - "question": "Как называется это место?", - "render": "Это место называется {name}" - }, - "caravansites-sanitary-dump": { - "mappings": { - "0": { - "then": "В этом кемпинге есть место для слива отходов из туалетных резервуаров" - }, - "1": { - "then": "В этом кемпинге нет места для слива отходов из туалетных резервуаров" - } - }, - "question": "В этом кемпинге есть место для слива отходов из туалетных резервуаров?" - }, - "caravansites-toilets": { - "mappings": { - "0": { - "then": "В этом месте есть туалеты" - }, - "1": { - "then": "В этом месте нет туалетов" - } - }, - "question": "Здесь есть туалеты?" - }, - "caravansites-website": { - "question": "Есть ли у этого места веб-сайт?", - "render": "Официальный сайт: {website}" - } - }, - "title": { - "mappings": { - "0": { - "then": "Место для кемпинга без названия" - } - }, - "render": "Место для кемпинга {name}" - } - }, - "1": { - "description": "Ассенизационные сливные станции", - "name": "Места для слива отходов из туалетных резервуаров", - "tagRenderings": { - "dumpstations-access": { - "mappings": { - "2": { - "then": "Любой может воспользоваться этой станцией утилизации" - }, - "3": { - "then": "Любой может воспользоваться этой станцией утилизации" - } - }, - "question": "Кто может использовать эту станцию утилизации?" - }, - "dumpstations-charge": { - "question": "Сколько это место взимает?", - "render": "Это место взимает {charge}" - }, - "dumpstations-chemical-waste": { - "mappings": { - "0": { - "then": "Вы можете утилизировать отходы химических туалетов здесь" - }, - "1": { - "then": "Здесь нельзя утилизировать отходы химических туалетов" - } - }, - "question": "Можно ли здесь утилизировать отходы химических туалетов?" - }, - "dumpstations-fee": { - "mappings": { - "0": { - "then": "За использование нужно платить" - }, - "1": { - "then": "Можно использовать бесплатно" - } - }, - "question": "Взимается ли в этом месте плата?" - }, - "dumpstations-grey-water": { - "mappings": { - "0": { - "then": "Вы можете утилизировать серую воду здесь" - }, - "1": { - "then": "Здесь нельзя утилизировать серую воду" - } - }, - "question": "Можно ли здесь утилизировать серую воду?" - }, - "dumpstations-network": { - "question": "К какой сети относится эта станция? (пропустите, если неприменимо)", - "render": "Эта станция - часть сети {network}" - }, - "dumpstations-waterpoint": { - "mappings": { - "0": { - "then": "В этом месте есть водоснабжение" - }, - "1": { - "then": "В этом месте нет водоснабжения" - } - }, - "question": "Есть ли в этом месте водоснабжение?" - } - }, - "title": { - "mappings": { - "0": { - "then": "Ассенизационная сливная станция" - } - }, - "render": "Ассенизационная сливная станция {name}" - } - } - }, - "shortDescription": "Найти места остановки, чтобы провести ночь в автофургоне", - "title": "Кемпинги" - }, - "charging_stations": { - "description": "На этой карте вы можно найти и отметить информацию о зарядных станциях" - }, - "climbing": { - "description": "На этой карте вы найдете различные возможности для скалолазания, такие как скалодромы, залы для боулдеринга и скалы на природе.", - "descriptionTail": "Создатель карты скалолазания — Christian Neumann. Пожалуйста, пишите если у вас есть отзыв или вопросы.

    Проект использует данные OpenStreetMap.

    ", - "layers": { - "0": { - "name": "Клуб скалолазания", - "presets": { - "0": { - "description": "Клуб скалолазания", - "title": "Клуб скалолазания" - } - }, - "tagRenderings": { - "climbing_club-name": { - "render": "{name}" - } - }, - "title": { - "render": "Клуб скалолазания" - } - }, - "1": { - "tagRenderings": { - "name": { - "render": "{name}" - } - } - }, - "2": { - "tagRenderings": { - "Name": { - "render": "{name}" - } - } - }, - "3": { - "tagRenderings": { - "name": { - "render": "{name}" - } - } - }, - "4": { - "tagRenderings": { - "climbing-opportunity-name": { - "render": "{name}" - } - } - } - }, - "overrideAll": { - "tagRenderings+": { - "0": { - "question": "Есть ли (неофициальный) веб-сайт с более подробной информацией (напр., topos)?" - }, - "2": { - "mappings": { - "3": { - "then": "Только членам клуба" - } - } - }, - "9": { - "mappings": { - "0": { - "then": "Здесь можно заняться спортивным скалолазанием" - }, - "1": { - "then": "Спортивное скалолазание здесь невозможно" - } - } - } - } - }, - "title": "Открытая карта скалолазания" - }, - "cyclestreets": { - "layers": { - "2": { - "name": "Все улицы", - "title": { - "render": "Улица" - } + "then": "Место для кемпинга без названия" } + }, + "render": "Место для кемпинга {name}" } - }, - "cyclofix": { - "title": "Cyclofix - открытая карта для велосипедистов" - }, - "drinking_water": { - "description": "На этой карте показываются и могут быть легко добавлены общедоступные точки питьевой воды", - "title": "Питьевая вода" - }, - "facadegardens": { - "layers": { + }, + "1": { + "description": "Ассенизационные сливные станции", + "name": "Места для слива отходов из туалетных резервуаров", + "tagRenderings": { + "dumpstations-access": { + "mappings": { + "2": { + "then": "Любой может воспользоваться этой станцией утилизации" + }, + "3": { + "then": "Любой может воспользоваться этой станцией утилизации" + } + }, + "question": "Кто может использовать эту станцию утилизации?" + }, + "dumpstations-charge": { + "question": "Сколько это место взимает?", + "render": "Это место взимает {charge}" + }, + "dumpstations-chemical-waste": { + "mappings": { + "0": { + "then": "Вы можете утилизировать отходы химических туалетов здесь" + }, + "1": { + "then": "Здесь нельзя утилизировать отходы химических туалетов" + } + }, + "question": "Можно ли здесь утилизировать отходы химических туалетов?" + }, + "dumpstations-fee": { + "mappings": { + "0": { + "then": "За использование нужно платить" + }, + "1": { + "then": "Можно использовать бесплатно" + } + }, + "question": "Взимается ли в этом месте плата?" + }, + "dumpstations-grey-water": { + "mappings": { + "0": { + "then": "Вы можете утилизировать серую воду здесь" + }, + "1": { + "then": "Здесь нельзя утилизировать серую воду" + } + }, + "question": "Можно ли здесь утилизировать серую воду?" + }, + "dumpstations-network": { + "question": "К какой сети относится эта станция? (пропустите, если неприменимо)", + "render": "Эта станция - часть сети {network}" + }, + "dumpstations-waterpoint": { + "mappings": { + "0": { + "then": "В этом месте есть водоснабжение" + }, + "1": { + "then": "В этом месте нет водоснабжения" + } + }, + "question": "Есть ли в этом месте водоснабжение?" + } + }, + "title": { + "mappings": { "0": { - "tagRenderings": { - "facadegardens-description": { - "question": "Дополнительная информация о саде (если требуется или еще не указана выше)", - "render": "Подробнее: {description}" - }, - "facadegardens-plants": { - "question": "Какие виды растений обитают здесь?" - }, - "facadegardens-rainbarrel": { - "mappings": { - "0": { - "then": "Есть бочка с дождевой водой" - }, - "1": { - "then": "Нет бочки с дождевой водой" - } - } - }, - "facadegardens-start_date": { - "render": "Дата строительства сада: {start_date}" - }, - "facadegardens-sunshine": { - "question": "Сад расположен на солнечной стороне или в тени?" - } - } + "then": "Ассенизационная сливная станция" } + }, + "render": "Ассенизационная сливная станция {name}" } + } }, - "ghostbikes": { - "title": "Велосипед Ghost" + "shortDescription": "Найти места остановки, чтобы провести ночь в автофургоне", + "title": "Кемпинги" + }, + "charging_stations": { + "description": "На этой карте вы можно найти и отметить информацию о зарядных станциях" + }, + "climbing": { + "description": "На этой карте вы найдете различные возможности для скалолазания, такие как скалодромы, залы для боулдеринга и скалы на природе.", + "descriptionTail": "Создатель карты скалолазания — Christian Neumann. Пожалуйста, пишите если у вас есть отзыв или вопросы.

    Проект использует данные OpenStreetMap.

    ", + "layers": { + "0": { + "name": "Клуб скалолазания", + "presets": { + "0": { + "description": "Клуб скалолазания", + "title": "Клуб скалолазания" + } + }, + "tagRenderings": { + "climbing_club-name": { + "render": "{name}" + } + }, + "title": { + "render": "Клуб скалолазания" + } + }, + "1": { + "tagRenderings": { + "name": { + "render": "{name}" + } + } + }, + "2": { + "tagRenderings": { + "Name": { + "render": "{name}" + } + } + }, + "3": { + "tagRenderings": { + "name": { + "render": "{name}" + } + } + }, + "4": { + "tagRenderings": { + "climbing-opportunity-name": { + "render": "{name}" + } + } + } }, - "hailhydrant": { - "layers": { + "overrideAll": { + "tagRenderings+": { + "0": { + "question": "Есть ли (неофициальный) веб-сайт с более подробной информацией (напр., topos)?" + }, + "2": { + "mappings": { + "3": { + "then": "Только членам клуба" + } + } + }, + "9": { + "mappings": { "0": { - "description": "Слой карты, отображающий пожарные гидранты.", - "name": "Карта пожарных гидрантов", - "presets": { - "0": { - "title": "Пожарный гидрант" - } - }, - "tagRenderings": { - "hydrant-color": { - "mappings": { - "0": { - "then": "Цвет гидранта не определён." - }, - "1": { - "then": "Гидрант жёлтого цвета." - }, - "2": { - "then": "Гидрант красного цвета." - } - }, - "question": "Какого цвета гидрант?", - "render": "Цвет гидранта {colour}" - }, - "hydrant-state": { - "mappings": { - "0": { - "then": "Гидрант (полностью или частично) в рабочем состоянии." - }, - "2": { - "then": "Гидрант демонтирован." - } - } - }, - "hydrant-type": { - "mappings": { - "0": { - "then": "Тип гидранта не определён." - }, - "3": { - "then": " Тип стены." - } - }, - "question": "К какому типу относится этот гидрант?", - "render": " Тип гидранта: {fire_hydrant:type}" - } - }, - "title": { - "render": "Гидрант" - } + "then": "Здесь можно заняться спортивным скалолазанием" }, "1": { - "description": "Слой карты, отображающий огнетушители.", - "name": "Карта огнетушителей.", - "presets": { - "0": { - "description": "Огнетушитель - небольшое переносное устройство для тушения огня", - "title": "Огнетушитель" - } - }, - "tagRenderings": { - "extinguisher-location": { - "mappings": { - "0": { - "then": "Внутри." - }, - "1": { - "then": "Снаружи." - } - }, - "question": "Где это расположено?", - "render": "Местоположение: {location}" - } - }, - "title": { - "render": "Огнетушители" - } - }, - "2": { - "description": "Слой карты, отображающий пожарные части.", - "name": "Карта пожарных частей", - "presets": { - "0": { - "title": "Пожарная часть" - } - }, - "tagRenderings": { - "station-name": { - "question": "Как называется эта пожарная часть?", - "render": "Эта часть называется {name}." - }, - "station-place": { - "question": "Где расположена часть? (напр., название населённого пункта)", - "render": "Эта часть расположена в {addr:place}." - }, - "station-street": { - "question": " По какому адресу расположена эта часть?", - "render": "Часть расположена вдоль шоссе {addr:street}." - } - }, - "title": { - "render": "Пожарная часть" - } - }, - "3": { - "name": "Карта станций скорой помощи", - "presets": { - "0": { - "description": "Добавить станцию скорой помощи на карту", - "title": "Станция скорой помощи" - } - }, - "tagRenderings": { - "ambulance-name": { - "question": "Как называется эта станция скорой помощи?", - "render": "Эта станция называется {name}." - }, - "ambulance-place": { - "question": "Где расположена станция? (напр., название населённого пункта)" - }, - "ambulance-street": { - "question": " По какому адресу расположена эта станция?", - "render": "Эта станция расположена вдоль шоссе {addr:street}." - } - }, - "title": { - "render": "Станция скорой помощи" - } + "then": "Спортивное скалолазание здесь невозможно" } - }, - "shortDescription": "Карта пожарных гидрантов, огнетушителей, пожарных станций и станций скорой помощи.", - "title": "Пожарные гидранты, огнетушители, пожарные станции и станции скорой помощи." + } + } + } }, - "maps": { - "title": "Карта карт" - }, - "personal": { - "description": "Создать персональную тему на основе доступных слоёв тем" - }, - "playgrounds": { - "description": "На этой карте можно найти игровые площадки и добавить дополнительную информацию", - "shortDescription": "Карта игровых площадок", - "title": "Игровые площадки" - }, - "shops": { - "title": "Открыть карту магазинов" - }, - "sport_pitches": { - "shortDescription": "Карта, отображающая спортивные площадки", - "title": "Спортивные площадки" - }, - "toilets": { - "description": "Карта общественных туалетов", - "title": "Открытая карта туалетов" - }, - "trees": { - "description": "Нанесите все деревья на карту!", - "shortDescription": "Карта деревьев", - "title": "Деревья" + "title": "Открытая карта скалолазания" + }, + "cyclestreets": { + "layers": { + "2": { + "name": "Все улицы", + "title": { + "render": "Улица" + } + } } + }, + "cyclofix": { + "title": "Cyclofix - открытая карта для велосипедистов" + }, + "drinking_water": { + "description": "На этой карте показываются и могут быть легко добавлены общедоступные точки питьевой воды", + "title": "Питьевая вода" + }, + "facadegardens": { + "layers": { + "0": { + "tagRenderings": { + "facadegardens-description": { + "question": "Дополнительная информация о саде (если требуется или еще не указана выше)", + "render": "Подробнее: {description}" + }, + "facadegardens-plants": { + "question": "Какие виды растений обитают здесь?" + }, + "facadegardens-rainbarrel": { + "mappings": { + "0": { + "then": "Есть бочка с дождевой водой" + }, + "1": { + "then": "Нет бочки с дождевой водой" + } + } + }, + "facadegardens-start_date": { + "render": "Дата строительства сада: {start_date}" + }, + "facadegardens-sunshine": { + "question": "Сад расположен на солнечной стороне или в тени?" + } + } + } + } + }, + "ghostbikes": { + "title": "Велосипед Ghost" + }, + "hailhydrant": { + "layers": { + "0": { + "description": "Слой карты, отображающий пожарные гидранты.", + "name": "Карта пожарных гидрантов", + "presets": { + "0": { + "title": "Пожарный гидрант" + } + }, + "tagRenderings": { + "hydrant-color": { + "mappings": { + "0": { + "then": "Цвет гидранта не определён." + }, + "1": { + "then": "Гидрант жёлтого цвета." + }, + "2": { + "then": "Гидрант красного цвета." + } + }, + "question": "Какого цвета гидрант?", + "render": "Цвет гидранта {colour}" + }, + "hydrant-state": { + "mappings": { + "0": { + "then": "Гидрант (полностью или частично) в рабочем состоянии." + }, + "2": { + "then": "Гидрант демонтирован." + } + } + }, + "hydrant-type": { + "mappings": { + "0": { + "then": "Тип гидранта не определён." + }, + "3": { + "then": " Тип стены." + } + }, + "question": "К какому типу относится этот гидрант?", + "render": " Тип гидранта: {fire_hydrant:type}" + } + }, + "title": { + "render": "Гидрант" + } + }, + "1": { + "description": "Слой карты, отображающий огнетушители.", + "name": "Карта огнетушителей.", + "presets": { + "0": { + "description": "Огнетушитель - небольшое переносное устройство для тушения огня", + "title": "Огнетушитель" + } + }, + "tagRenderings": { + "extinguisher-location": { + "mappings": { + "0": { + "then": "Внутри." + }, + "1": { + "then": "Снаружи." + } + }, + "question": "Где это расположено?", + "render": "Местоположение: {location}" + } + }, + "title": { + "render": "Огнетушители" + } + }, + "2": { + "description": "Слой карты, отображающий пожарные части.", + "name": "Карта пожарных частей", + "presets": { + "0": { + "title": "Пожарная часть" + } + }, + "tagRenderings": { + "station-name": { + "question": "Как называется эта пожарная часть?", + "render": "Эта часть называется {name}." + }, + "station-place": { + "question": "Где расположена часть? (напр., название населённого пункта)", + "render": "Эта часть расположена в {addr:place}." + }, + "station-street": { + "question": " По какому адресу расположена эта часть?", + "render": "Часть расположена вдоль шоссе {addr:street}." + } + }, + "title": { + "render": "Пожарная часть" + } + }, + "3": { + "name": "Карта станций скорой помощи", + "presets": { + "0": { + "description": "Добавить станцию скорой помощи на карту", + "title": "Станция скорой помощи" + } + }, + "tagRenderings": { + "ambulance-name": { + "question": "Как называется эта станция скорой помощи?", + "render": "Эта станция называется {name}." + }, + "ambulance-place": { + "question": "Где расположена станция? (напр., название населённого пункта)" + }, + "ambulance-street": { + "question": " По какому адресу расположена эта станция?", + "render": "Эта станция расположена вдоль шоссе {addr:street}." + } + }, + "title": { + "render": "Станция скорой помощи" + } + } + }, + "shortDescription": "Карта пожарных гидрантов, огнетушителей, пожарных станций и станций скорой помощи.", + "title": "Пожарные гидранты, огнетушители, пожарные станции и станции скорой помощи." + }, + "maps": { + "title": "Карта карт" + }, + "personal": { + "description": "Создать персональную тему на основе доступных слоёв тем" + }, + "playgrounds": { + "description": "На этой карте можно найти игровые площадки и добавить дополнительную информацию", + "shortDescription": "Карта игровых площадок", + "title": "Игровые площадки" + }, + "shops": { + "title": "Открыть карту магазинов" + }, + "sport_pitches": { + "shortDescription": "Карта, отображающая спортивные площадки", + "title": "Спортивные площадки" + }, + "toilets": { + "description": "Карта общественных туалетов", + "title": "Открытая карта туалетов" + }, + "trees": { + "description": "Нанесите все деревья на карту!", + "shortDescription": "Карта деревьев", + "title": "Деревья" + } } \ No newline at end of file diff --git a/langs/themes/sv.json b/langs/themes/sv.json index 8c5ac8469c..d2d04c4c47 100644 --- a/langs/themes/sv.json +++ b/langs/themes/sv.json @@ -1,12 +1,12 @@ { - "aed": { - "description": "På denna karta kan man hitta och markera närliggande defibrillatorer", - "title": "Öppna AED-karta" - }, - "artwork": { - "title": "Öppen konstverkskarta" - }, - "ghostbikes": { - "title": "Spökcykel" - } + "aed": { + "description": "På denna karta kan man hitta och markera närliggande defibrillatorer", + "title": "Öppna AED-karta" + }, + "artwork": { + "title": "Öppen konstverkskarta" + }, + "ghostbikes": { + "title": "Spökcykel" + } } \ No newline at end of file diff --git a/langs/themes/zh_HANŨS.json b/langs/themes/zh_HANŨS.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/langs/themes/zh_HANŨS.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/langs/themes/zh_Hans.json b/langs/themes/zh_Hans.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/langs/themes/zh_Hans.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/langs/themes/zh_Hant.json b/langs/themes/zh_Hant.json index 9a25e50003..90cf2f4f74 100644 --- a/langs/themes/zh_Hant.json +++ b/langs/themes/zh_Hant.json @@ -28,7 +28,8 @@ "name": "露營地", "presets": { "0": { - "title": "露營地" + "title": "露營地", + "description": "新增正式露營地點,通常是設計給過夜的露營者的地點。看起來像是真的露營地或是一般的停車場,而且也許沒有任何指標,但在城鎮被定議地點。如果一般給露營者的停車場並不是用來過夜,則不是露營地點 " } }, "tagRenderings": { @@ -146,6 +147,46 @@ } }, "question": "你能在這裡丟棄廁所化學廢棄物嗎?" + }, + "dumpstations-access": { + "mappings": { + "0": { + "then": "你需要網路鑰匙/密碼來使用這個設施" + }, + "1": { + "then": "你需要是露營/露營地的客戶才能使用這一地方" + }, + "3": { + "then": "任何人都可以使用這個垃圾站" + }, + "2": { + "then": "任何人都可以使用這個衛生廢棄物站" + } + }, + "question": "誰可以使用這個垃圾站?" + }, + "dumpstations-fee": { + "mappings": { + "0": { + "then": "你需要付費才能使用" + }, + "1": { + "then": "這裡可以免費使用" + } + }, + "question": "這個地方需要付費嗎?" + }, + "dumpstations-charge": { + "render": "這個地方收費 {charge}", + "question": "這個地方收費多少?" + } + }, + "description": "垃圾處理站", + "name": "垃圾處理站", + "presets": { + "0": { + "title": "垃圾丟棄站", + "description": "新增垃圾站,這通常是提供露營駕駛丟棄廢水與化學性廁所廢水的地方,也會有飲用水與電力。" } } } @@ -270,5 +311,13 @@ "description": "繪製所有樹木!", "shortDescription": "所有樹木的地圖", "title": "樹木" + }, + "binoculars": { + "shortDescription": "固定望遠鏡的地圖", + "title": "望遠鏡", + "description": "固定一地的望遠鏡地圖,特別是能夠在旅遊景點、觀景點、城鎮環景點,或是自然保護區找到。" + }, + "cafes_and_pubs": { + "title": "咖啡廳與酒吧" } -} \ No newline at end of file +} diff --git a/langs/zh_Hant.json b/langs/zh_Hant.json index 8c72b001df..20603e2d1d 100644 --- a/langs/zh_Hant.json +++ b/langs/zh_Hant.json @@ -53,128 +53,128 @@ } }, "general": { - "opening_hours": { - "ph_closed": "無營業", - "ph_open": "有營業", - "ph_not_known": " ", - "open_24_7": "24小時營業", - "closed_permanently": "不清楚關閉多久了", - "closed_until": "{date} 起關閉", - "not_all_rules_parsed": "這間店的開放時間相當複雜,在輸入元素時忽略接下來的規則:", - "openTill": "結束時間", - "opensAt": "開始時間", - "open_during_ph": "國定假日的時候,這個場所是", - "error_loading": "錯誤:無法視覺化開放時間。" + "opening_hours": { + "ph_closed": "無營業", + "ph_open": "有營業", + "ph_not_known": " ", + "open_24_7": "24小時營業", + "closed_permanently": "不清楚關閉多久了", + "closed_until": "{date} 起關閉", + "not_all_rules_parsed": "這間店的開放時間相當複雜,在輸入元素時忽略接下來的規則:", + "openTill": "結束時間", + "opensAt": "開始時間", + "open_during_ph": "國定假日的時候,這個場所是", + "error_loading": "錯誤:無法視覺化開放時間。" + }, + "weekdays": { + "sunday": "星期日", + "saturday": "星期六", + "friday": "星期五", + "thursday": "星期四", + "wednesday": "星期三", + "tuesday": "星期二", + "monday": "星期一", + "abbreviations": { + "sunday": "星期日", + "saturday": "星期六", + "friday": "星期五", + "thursday": "星期四", + "wednesday": "星期三", + "tuesday": "星期二", + "monday": "星期一" + } + }, + "layerSelection": { + "title": "選擇圖層", + "zoomInToSeeThisLayer": "放大來看這個圖層" + }, + "backgroundMap": "背景地圖", + "aboutMapcomplete": "

    關於 MapComplete

    使用 MapComplete 你可以藉由單一主題豐富開放街圖的圖資。回答幾個問題,然後幾分鐘之內你的貢獻立刻就傳遍全球!主題維護者定議主題的元素、問題與語言。

    發現更多

    MapComplete 總是提供學習更多開放街圖下一步的知識

    • 當你內嵌網站,網頁內嵌會連結到全螢幕的 MapComplete
    • 全螢幕的版本提供關於開放街圖的資訊
    • 不登入檢視成果,但是要編輯則需登入 OSM。
    • 如果你沒有登入,你會被要求先登入
    • 當你回答單一問題時,你可以在地圖新增新的節點
    • 過了一陣子,實際的 OSM-標籤會顯示,之後會連結到 wiki


    你有注意到問題嗎?你想請求功能嗎?想要幫忙翻譯嗎?來到原始碼或是問題追蹤器。

    想要看到你的進度嗎?到OsmCha追蹤編輯數。

    ", + "customThemeIntro": "

    客製化主題

    觀看這些先前使用者創造的主題。", + "noTagsSelected": "沒有選取標籤", + "getStartedNewAccount": " 或是 註冊新帳號", + "getStartedLogin": "登入開放街圖帳號來開始", + "goToInbox": "開啟訊息框", + "fewChangesBefore": "請先回答有關既有節點的問題再來新增新節點。", + "readYourMessages": "請先閱讀開放街圖訊息之前再來新增新節點。", + "morescreen": { + "createYourOwnTheme": "從零開始建立你的 MapComplete 主題", + "streetcomplete": "行動裝置另有類似的應用程式 StreetComplete。", + "requestATheme": "如果你有客製化要求,請到問題追踪器那邊提出要求", + "intro": "

    看更多主題地圖?

    您喜歡蒐集地理資料嗎?
    還有更多主題。" + }, + "sharescreen": { + "fsIncludeCurrentLocation": "包含目前位置", + "fsIncludeCurrentLayers": "包含目前選擇圖層", + "fsIncludeCurrentBackgroundMap": "包含目前背景選擇{name}", + "fsGeolocation": "啟用'地理定位自身'按鈕 (只有行動版本)", + "fsAddNew": "啟用'新增新的興趣點'按鈕", + "fsLayerControlToggle": "開始時擴展圖層控制", + "fsLayers": "啟用圖層控制", + "fsWelcomeMessage": "顯示歡迎訊息以及相關頁籤", + "fsSearch": "啟用搜尋列", + "fsUserbadge": "啟用登入按鈕", + "editThemeDescription": "新增或改變這個地圖的問題", + "editThisTheme": "編輯這個主題", + "thanksForSharing": "感謝分享!", + "copiedToClipboard": "複製連結到簡貼簿", + "embedIntro": "

    嵌入到你的網站

    請考慮將這份地圖嵌入您的網站。
    地圖毋須額外授權,非常歡迎您多加利用。
    一切都是免費的,而且之後也是免費的,越有更多人使用,則越顯得它的價值。", + "addToHomeScreen": "

    新增到您的主畫面

    您可以輕易將這網站新增到您智慧型手機的主畫面,在網址列點選「新增到主畫面按鈕」來做這件事情。", + "intro": "

    分享這地圖

    複製下面的連結來向朋友與家人分享這份地圖:" + }, + "attribution": { + "codeContributionsBy": "MapComplete 是由 {contributors} 和其他 {hiddenCount} 位貢獻者構建而成", + "mapContributionsByAndHidden": "目前顯到的資料是由 {contributors} 和其他 {hiddenCount} 位貢獻者編輯貢獻", + "mapContributionsBy": "目前檢視的資料由 {contributors} 貢獻編輯", + "iconAttribution": { + "title": "使用的圖示" }, - "weekdays": { - "sunday": "星期日", - "saturday": "星期六", - "friday": "星期五", - "thursday": "星期四", - "wednesday": "星期三", - "tuesday": "星期二", - "monday": "星期一", - "abbreviations": { - "sunday": "星期日", - "saturday": "星期六", - "friday": "星期五", - "thursday": "星期四", - "wednesday": "星期三", - "tuesday": "星期二", - "monday": "星期一" - } - }, - "layerSelection": { - "title": "選擇圖層", - "zoomInToSeeThisLayer": "放大來看這個圖層" - }, - "backgroundMap": "背景地圖", - "aboutMapcomplete": "

    關於 MapComplete

    使用 MapComplete 你可以藉由單一主題豐富開放街圖的圖資。回答幾個問題,然後幾分鐘之內你的貢獻立刻就傳遍全球!主題維護者定議主題的元素、問題與語言。

    發現更多

    MapComplete 總是提供學習更多開放街圖下一步的知識

    • 當你內嵌網站,網頁內嵌會連結到全螢幕的 MapComplete
    • 全螢幕的版本提供關於開放街圖的資訊
    • 不登入檢視成果,但是要編輯則需登入 OSM。
    • 如果你沒有登入,你會被要求先登入
    • 當你回答單一問題時,你可以在地圖新增新的節點
    • 過了一陣子,實際的 OSM-標籤會顯示,之後會連結到 wiki


    你有注意到問題嗎?你想請求功能嗎?想要幫忙翻譯嗎?來到原始碼或是問題追蹤器。

    想要看到你的進度嗎?到OsmCha追蹤編輯數。

    ", - "customThemeIntro": "

    客製化主題

    觀看這些先前使用者創造的主題。", - "noTagsSelected": "沒有選取標籤", - "getStartedNewAccount": " 或是 註冊新帳號", - "getStartedLogin": "登入開放街圖帳號來開始", - "goToInbox": "開啟訊息框", - "fewChangesBefore": "請先回答有關既有節點的問題再來新增新節點。", - "readYourMessages": "請先閱讀開放街圖訊息之前再來新增新節點。", - "morescreen": { - "createYourOwnTheme": "從零開始建立你的 MapComplete 主題", - "streetcomplete": "行動裝置另有類似的應用程式 StreetComplete。", - "requestATheme": "如果你有客製化要求,請到問題追踪器那邊提出要求", - "intro": "

    看更多主題地圖?

    您喜歡蒐集地理資料嗎?
    還有更多主題。" - }, - "sharescreen": { - "fsIncludeCurrentLocation": "包含目前位置", - "fsIncludeCurrentLayers": "包含目前選擇圖層", - "fsIncludeCurrentBackgroundMap": "包含目前背景選擇{name}", - "fsGeolocation": "啟用'地理定位自身'按鈕 (只有行動版本)", - "fsAddNew": "啟用'新增新的興趣點'按鈕", - "fsLayerControlToggle": "開始時擴展圖層控制", - "fsLayers": "啟用圖層控制", - "fsWelcomeMessage": "顯示歡迎訊息以及相關頁籤", - "fsSearch": "啟用搜尋列", - "fsUserbadge": "啟用登入按鈕", - "editThemeDescription": "新增或改變這個地圖的問題", - "editThisTheme": "編輯這個主題", - "thanksForSharing": "感謝分享!", - "copiedToClipboard": "複製連結到簡貼簿", - "embedIntro": "

    嵌入到你的網站

    請考慮將這份地圖嵌入您的網站。
    地圖毋須額外授權,非常歡迎您多加利用。
    一切都是免費的,而且之後也是免費的,越有更多人使用,則越顯得它的價值。", - "addToHomeScreen": "

    新增到您的主畫面

    您可以輕易將這網站新增到您智慧型手機的主畫面,在網址列點選「新增到主畫面按鈕」來做這件事情。", - "intro": "

    分享這地圖

    複製下面的連結來向朋友與家人分享這份地圖:" - }, - "attribution": { - "codeContributionsBy": "MapComplete 是由 {contributors} 和其他 {hiddenCount} 位貢獻者構建而成", - "mapContributionsByAndHidden": "目前顯到的資料是由 {contributors} 和其他 {hiddenCount} 位貢獻者編輯貢獻", - "mapContributionsBy": "目前檢視的資料由 {contributors} 貢獻編輯", - "iconAttribution": { - "title": "使用的圖示" - }, - "themeBy": "由 {author} 維護主題", - "attributionContent": "

    所有資料由開放街圖提供,在開放資料庫授權條款之下自由再利用。

    ", - "attributionTitle": "署名通知" - }, - "openStreetMapIntro": "

    開放的地圖

    如果有一份地圖,任何人都能自由使用與編輯,單一的地圖能夠儲存所有地理相關資訊?這樣不就很酷嗎?接著,所有的網站使用不同的、範圍小的,不相容的地圖 (通常也都過時了),也就不再需要了。

    開放街圖就是這樣的地圖,人人都能免費這些圖資 (只要署名與公開變動這資料)。只要遵循這些,任何人都能自由新增新資料與修正錯誤,這些網站也都使用開放街圖,資料也都來自開放街圖,你的答案與修正也會加到開放街圖上面。

    許多人與應用程式已經採用開放街圖了:Organic MapsOsmAnd,還有 Facebook、Instagram,蘋果地圖、Bing 地圖(部分)採用開放街圖。如果你在開放街圖上變動資料,也會同時影響這些應用 - 在他們下次更新資料之後!

    ", - "questions": { - "emailIs": "{category} 的電子郵件地址是{email}", - "emailOf": "{category} 的電子郵件地址是?", - "websiteIs": "網站:{website}", - "websiteOf": "{category} 的網站網址是?", - "phoneNumberIs": "此 {category} 的電話號碼為 {phone}", - "phoneNumberOf": "{category} 的電話號碼是?" - }, - "noNameCategory": "{category} 沒有名稱", - "nameInlineQuestion": "這個 {category} 的名稱是 $$$", - "about": "相當容易編輯,而且能為開放街圖新增特定主題", - "pickLanguage": "選擇語言: ", - "add": { - "layerNotEnabled": "圖層 {layer} 目前無法使用,請先啟用這圖層再加新的節點", - "openLayerControl": "開啟圖層控制框", - "confirmButton": "在此新增 {category}。
    大家都可以看到您新增的內容
    ", - "confirmIntro": "

    在這裡新增 {title} ?

    你在這裡新增的節點所有人都看得到。請只有在確定有物件存在的情形下才新增上去,許多應用程式都使用這份資料。", - "stillLoading": "目前仍在載入資料,請稍後再來新增節點。", - "zoomInFurther": "放大來新增新的節點。", - "pleaseLogin": "請先登入來新增節點", - "intro": "您點擊處目前未有已知的資料。
    ", - "title": "新增新的節點?", - "addNew": "在這裡新增新的 {category}" - }, - "osmLinkTooltip": "在開放街圖歷史和更多編輯選項下面來檢視這物件", - "number": "號碼", - "skippedQuestions": "有些問題已經跳過了", - "oneSkippedQuestion": "跳過一個問題", - "skip": "跳過這問題", - "cancel": "取消", - "save": "儲存", - "returnToTheMap": "回到地圖", - "search": { - "error": "有狀況發生了…", - "nothing": "沒有找到…", - "searching": "搜尋中…", - "search": "搜尋地點" - }, - "loginToStart": "登入之後來回答這問題", - "welcomeBack": "你已經登入了,歡迎回來!", - "loginWithOpenStreetMap": "用開放街圖帳號登入" + "themeBy": "由 {author} 維護主題", + "attributionContent": "

    所有資料由開放街圖提供,在開放資料庫授權條款之下自由再利用。

    ", + "attributionTitle": "署名通知" + }, + "openStreetMapIntro": "

    開放的地圖

    如果有一份地圖,任何人都能自由使用與編輯,單一的地圖能夠儲存所有地理相關資訊?這樣不就很酷嗎?接著,所有的網站使用不同的、範圍小的,不相容的地圖 (通常也都過時了),也就不再需要了。

    開放街圖就是這樣的地圖,人人都能免費這些圖資 (只要署名與公開變動這資料)。只要遵循這些,任何人都能自由新增新資料與修正錯誤,這些網站也都使用開放街圖,資料也都來自開放街圖,你的答案與修正也會加到開放街圖上面。

    許多人與應用程式已經採用開放街圖了:Organic MapsOsmAnd,還有 Facebook、Instagram,蘋果地圖、Bing 地圖(部分)採用開放街圖。如果你在開放街圖上變動資料,也會同時影響這些應用 - 在他們下次更新資料之後!

    ", + "questions": { + "emailIs": "{category} 的電子郵件地址是{email}", + "emailOf": "{category} 的電子郵件地址是?", + "websiteIs": "網站:{website}", + "websiteOf": "{category} 的網站網址是?", + "phoneNumberIs": "此 {category} 的電話號碼為 {phone}", + "phoneNumberOf": "{category} 的電話號碼是?" + }, + "noNameCategory": "{category} 沒有名稱", + "nameInlineQuestion": "這個 {category} 的名稱是 $$$", + "about": "相當容易編輯,而且能為開放街圖新增特定主題", + "pickLanguage": "選擇語言: ", + "add": { + "layerNotEnabled": "圖層 {layer} 目前無法使用,請先啟用這圖層再加新的節點", + "openLayerControl": "開啟圖層控制框", + "confirmButton": "在此新增 {category}。
    大家都可以看到您新增的內容
    ", + "confirmIntro": "

    在這裡新增 {title} ?

    你在這裡新增的節點所有人都看得到。請只有在確定有物件存在的情形下才新增上去,許多應用程式都使用這份資料。", + "stillLoading": "目前仍在載入資料,請稍後再來新增節點。", + "zoomInFurther": "放大來新增新的節點。", + "pleaseLogin": "請先登入來新增節點", + "intro": "您點擊處目前未有已知的資料。
    ", + "title": "新增新的節點?", + "addNew": "在這裡新增新的 {category}" + }, + "osmLinkTooltip": "在開放街圖歷史和更多編輯選項下面來檢視這物件", + "number": "號碼", + "skippedQuestions": "有些問題已經跳過了", + "oneSkippedQuestion": "跳過一個問題", + "skip": "跳過這問題", + "cancel": "取消", + "save": "儲存", + "returnToTheMap": "回到地圖", + "search": { + "error": "有狀況發生了…", + "nothing": "沒有找到…", + "searching": "搜尋中…", + "search": "搜尋地點" + }, + "loginToStart": "登入之後來回答這問題", + "welcomeBack": "你已經登入了,歡迎回來!", + "loginWithOpenStreetMap": "用開放街圖帳號登入" }, "backgroundMap": "背景地圖", "aboutMapcomplete": "

    關於 MapComplete

    使用 MapComplete 你可以藉由單一主題豐富開放街圖的圖資。回答幾個問題,然後幾分鐘之內你的貢獻立刻就傳遍全球!主題維護者定議主題的元素、問題與語言。

    發現更多

    MapComplete 總是提供學習更多開放街圖下一步的知識

    • 當你內嵌網站,網頁內嵌會連結到全螢幕的 MapComplete
    • 全螢幕的版本提供關於開放街圖的資訊
    • 不登入檢視成果,但是要編輯則需登入 OSM。
    • 如果你沒有登入,你會被要求先登入
    • 當你回答單一問題時,你可以在地圖新增新的節點
    • 過了一陣子,實際的 OSM-標籤會顯示,之後會連結到 wiki


    你有注意到問題嗎?你想請求功能嗎?想要幫忙翻譯嗎?來到原始碼或是問題追蹤器。

    想要看到你的進度嗎?到OsmCha追蹤編輯數。

    ", diff --git a/package-lock.json b/package-lock.json index ca84f2e65b..11c576967e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "jspdf": "^2.3.1", "latlon2country": "^1.1.3", "leaflet": "^1.7.1", + "leaflet-polylineoffset": "^1.1.1", "leaflet-providers": "^1.13.0", "leaflet-simple-map-screenshoter": "^0.4.4", "leaflet.markercluster": "^1.4.1", @@ -45,6 +46,7 @@ "parcel": "^1.2.4", "prompt-sync": "^4.2.0", "tailwindcss": "^2.2.15", + "togpx": "^0.5.4", "tslint": "^6.1.3", "wikibase-sdk": "^7.14.0", "wikidata-sdk": "^7.14.0" @@ -61,6 +63,7 @@ "sharp": "^0.28.3", "ts-node": "^9.0.0", "ts-node-dev": "^1.0.0-pre.63", + "ts2json-schema": "^1.4.0", "tslint-no-circular-imports": "^0.7.0", "typescript": "^3.9.7", "write-file": "^1.0.0" @@ -2939,6 +2942,12 @@ "@types/sizzle": "*" } }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -3236,6 +3245,15 @@ "node": ">= 8" } }, + "node_modules/app-root-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", + "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -3739,6 +3757,23 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, + "node_modules/bops": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/bops/-/bops-0.0.6.tgz", + "integrity": "sha1-CC0dVfoB5g29wuvC26N/ZZVUzzo=", + "dependencies": { + "base64-js": "0.0.2", + "to-utf8": "0.0.1" + } + }, + "node_modules/bops/node_modules/base64-js": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz", + "integrity": "sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q=", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4222,6 +4257,61 @@ "node": ">= 10" } }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -6597,6 +6687,15 @@ "rbush": "^2.0.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-closest": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/get-closest/-/get-closest-0.0.4.tgz", @@ -8361,6 +8460,15 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "node_modules/json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "dependencies": { + "jsonify": "~0.0.0" + } + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -8388,6 +8496,15 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/jsonparse": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", @@ -8520,6 +8637,14 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/jxon": { + "version": "2.0.0-beta.5", + "resolved": "https://registry.npmjs.org/jxon/-/jxon-2.0.0-beta.5.tgz", + "integrity": "sha1-O2qUEE+YAe5oL9BWZF/1Rz2bND4=", + "dependencies": { + "xmldom": "^0.1.21" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -10034,6 +10159,11 @@ "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.7.1.tgz", "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==" }, + "node_modules/leaflet-polylineoffset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/leaflet-polylineoffset/-/leaflet-polylineoffset-1.1.1.tgz", + "integrity": "sha512-WcEjAROx9IhIVwSMoFy9p2QBCG9YeuGtJl4ZdunIgj4xbCdTrUkBj8JdonUeCyLPnD2/Vrem/raOPHm5LvebSw==" + }, "node_modules/leaflet-providers": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/leaflet-providers/-/leaflet-providers-1.13.0.tgz", @@ -14035,6 +14165,15 @@ "request": "^2.34" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -15817,6 +15956,36 @@ "node": ">=8.0" } }, + "node_modules/to-utf8": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", + "integrity": "sha1-0Xrqcv8vujm55DYBvns/9y4ImFI=" + }, + "node_modules/togpx": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/togpx/-/togpx-0.5.4.tgz", + "integrity": "sha1-sz27BUHfBL1rpPULhtqVNCS7d3M=", + "dependencies": { + "concat-stream": "~1.0.1", + "jxon": "~2.0.0-beta.5", + "optimist": "~0.3.5", + "xmldom": "~0.1.17" + }, + "bin": { + "togpx": "togpx" + } + }, + "node_modules/togpx/node_modules/concat-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.0.1.tgz", + "integrity": "sha1-AYsYvBx9BzotyCqkhEI0GixN158=", + "engines": [ + "node >= 0.8.0" + ], + "dependencies": { + "bops": "0.0.6" + } + }, "node_modules/toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -15922,6 +16091,64 @@ "node": ">=0.10.0" } }, + "node_modules/ts-json-schema-generator": { + "version": "0.95.0", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-0.95.0.tgz", + "integrity": "sha512-qyArLCOmy0UnnGeCewpZgaGglPMmawAhsuYDRDa1BeZiyE+M/I2dH+dSMtFj8kVbWSEayfVmQIF9UBINBfeKSg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "commander": "^8.0.0", + "fast-json-stable-stringify": "^2.1.0", + "glob": "^7.1.7", + "json-stable-stringify": "^1.0.1", + "json5": "^2.2.0", + "typescript": "~4.3.4" + }, + "bin": { + "ts-json-schema-generator": "bin/ts-json-schema-generator" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ts-json-schema-generator/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ts-json-schema-generator/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-json-schema-generator/node_modules/typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/ts-node": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", @@ -15994,6 +16221,33 @@ "node": ">=10" } }, + "node_modules/ts2json-schema": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts2json-schema/-/ts2json-schema-1.4.0.tgz", + "integrity": "sha512-UvKUBPU+GgQiPum5erEFBzfNN3fCFnl7FB0eWknbiDzJyaUFgOaWUb+9QHZpjPYbFvq0eVOl6s7Y9zVWDWnS0w==", + "dev": true, + "dependencies": { + "app-root-path": "^3.0.0", + "commander": "^8.0.0", + "ts-json-schema-generator": "^0.95.0", + "typescript-json-schema": "^0.50.1" + }, + "bin": { + "ts2json-schema": "bin/ts2json-schema.bin.js" + }, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ts2json-schema/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/tsconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", @@ -16750,6 +17004,43 @@ "node": ">=4.2.0" } }, + "node_modules/typescript-json-schema": { + "version": "0.50.1", + "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.50.1.tgz", + "integrity": "sha512-GCof/SDoiTDl0qzPonNEV4CHyCsZEIIf+mZtlrjoD8vURCcEzEfa2deRuxYid8Znp/e27eDR7Cjg8jgGrimBCA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@types/node": "^14.14.33", + "glob": "^7.1.6", + "json-stable-stringify": "^1.0.1", + "ts-node": "^9.1.1", + "typescript": "~4.2.3", + "yargs": "^16.2.0" + }, + "bin": { + "typescript-json-schema": "bin/typescript-json-schema" + } + }, + "node_modules/typescript-json-schema/node_modules/@types/node": { + "version": "14.17.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.32.tgz", + "integrity": "sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ==", + "dev": true + }, + "node_modules/typescript-json-schema/node_modules/typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/uglify-js": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", @@ -17446,6 +17737,15 @@ "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -17460,6 +17760,77 @@ "node": ">= 6" } }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -20058,6 +20429,12 @@ "@types/sizzle": "*" } }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -20303,6 +20680,12 @@ "picomatch": "^2.0.4" } }, + "app-root-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", + "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", + "dev": true + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -20702,6 +21085,22 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, + "bops": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/bops/-/bops-0.0.6.tgz", + "integrity": "sha1-CC0dVfoB5g29wuvC26N/ZZVUzzo=", + "requires": { + "base64-js": "0.0.2", + "to-utf8": "0.0.1" + }, + "dependencies": { + "base64-js": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz", + "integrity": "sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q=" + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -21102,6 +21501,51 @@ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -22992,6 +23436,12 @@ "rbush": "^2.0.0" } }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "get-closest": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/get-closest/-/get-closest-0.0.4.tgz", @@ -24296,6 +24746,15 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -24318,6 +24777,12 @@ "universalify": "^2.0.0" } }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, "jsonparse": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", @@ -24430,6 +24895,14 @@ "safe-buffer": "^5.0.1" } }, + "jxon": { + "version": "2.0.0-beta.5", + "resolved": "https://registry.npmjs.org/jxon/-/jxon-2.0.0-beta.5.tgz", + "integrity": "sha1-O2qUEE+YAe5oL9BWZF/1Rz2bND4=", + "requires": { + "xmldom": "^0.1.21" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -25964,6 +26437,11 @@ "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.7.1.tgz", "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==" }, + "leaflet-polylineoffset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/leaflet-polylineoffset/-/leaflet-polylineoffset-1.1.1.tgz", + "integrity": "sha512-WcEjAROx9IhIVwSMoFy9p2QBCG9YeuGtJl4ZdunIgj4xbCdTrUkBj8JdonUeCyLPnD2/Vrem/raOPHm5LvebSw==" + }, "leaflet-providers": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/leaflet-providers/-/leaflet-providers-1.13.0.tgz", @@ -29078,6 +29556,12 @@ "tough-cookie": "^2.3.3" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -30466,6 +30950,32 @@ "is-number": "^7.0.0" } }, + "to-utf8": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", + "integrity": "sha1-0Xrqcv8vujm55DYBvns/9y4ImFI=" + }, + "togpx": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/togpx/-/togpx-0.5.4.tgz", + "integrity": "sha1-sz27BUHfBL1rpPULhtqVNCS7d3M=", + "requires": { + "concat-stream": "~1.0.1", + "jxon": "~2.0.0-beta.5", + "optimist": "~0.3.5", + "xmldom": "~0.1.17" + }, + "dependencies": { + "concat-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.0.1.tgz", + "integrity": "sha1-AYsYvBx9BzotyCqkhEI0GixN158=", + "requires": { + "bops": "0.0.6" + } + } + } + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -30542,6 +31052,44 @@ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, + "ts-json-schema-generator": { + "version": "0.95.0", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-0.95.0.tgz", + "integrity": "sha512-qyArLCOmy0UnnGeCewpZgaGglPMmawAhsuYDRDa1BeZiyE+M/I2dH+dSMtFj8kVbWSEayfVmQIF9UBINBfeKSg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "commander": "^8.0.0", + "fast-json-stable-stringify": "^2.1.0", + "glob": "^7.1.7", + "json-stable-stringify": "^1.0.1", + "json5": "^2.2.0", + "typescript": "~4.3.4" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true + } + } + }, "ts-node": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", @@ -30582,6 +31130,26 @@ } } }, + "ts2json-schema": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts2json-schema/-/ts2json-schema-1.4.0.tgz", + "integrity": "sha512-UvKUBPU+GgQiPum5erEFBzfNN3fCFnl7FB0eWknbiDzJyaUFgOaWUb+9QHZpjPYbFvq0eVOl6s7Y9zVWDWnS0w==", + "dev": true, + "requires": { + "app-root-path": "^3.0.0", + "commander": "^8.0.0", + "ts-json-schema-generator": "^0.95.0", + "typescript-json-schema": "^0.50.1" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } + } + }, "tsconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", @@ -31228,6 +31796,35 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==" }, + "typescript-json-schema": { + "version": "0.50.1", + "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.50.1.tgz", + "integrity": "sha512-GCof/SDoiTDl0qzPonNEV4CHyCsZEIIf+mZtlrjoD8vURCcEzEfa2deRuxYid8Znp/e27eDR7Cjg8jgGrimBCA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@types/node": "^14.14.33", + "glob": "^7.1.6", + "json-stable-stringify": "^1.0.1", + "ts-node": "^9.1.1", + "typescript": "~4.2.3", + "yargs": "^16.2.0" + }, + "dependencies": { + "@types/node": { + "version": "14.17.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.32.tgz", + "integrity": "sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ==", + "dev": true + }, + "typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "dev": true + } + } + }, "uglify-js": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", @@ -31784,6 +32381,12 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -31795,6 +32398,61 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index ea7d04f0f6..eae06c77e8 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "start": "npm run start:prepare && npm-run-all --parallel start:parallel:*", "strt": "npm run start:prepare && npm run start:parallel:parcel", "start:prepare": "ts-node scripts/generateLayerOverview.ts --no-fail && npm run increase-memory", - "start:parallel:parcel": "node --max_old_space_size=8000 $(which parcel) serve *.html UI/** Logic/** assets/*.json assets/svg/* assets/generated/* assets/layers/*/*.svg assets/layers/*/*.jpg assets/layers/*/*.png assets/tagRenderings/*.json assets/themes/*/*.svg assets/themes/*/*.jpg assets/themes/*/*.png vendor/* vendor/*/*", + "start:parallel:parcel": "node --max_old_space_size=8000 $(which parcel) serve *.html UI/** Logic/** assets/*.json assets/svg/* assets/generated/* assets/layers/*/*.svg assets/layers/*/*.jpg assets/layers/*/*.png assets/layers/*/*.css assets/tagRenderings/*.json assets/themes/*/*.svg assets/themes/*/*.css assets/themes/*/*.jpg assets/themes/*/*.png vendor/* vendor/*/*", "start:parallel:tailwindcli": "tailwindcss -i index.css -o css/index-tailwind-output.css --watch", "generate:css": "tailwindcss -i index.css -o css/index-tailwind-output.css", "test": "ts-node test/TestAll.ts", @@ -35,12 +35,13 @@ "generate:contributor-list": "git log --pretty='%aN' | sort | uniq -c | sort -hr | sed 's/ *\\([0-9]*\\) \\(.*\\)$/{\"contributor\":\"\\2\", \"commits\":\\1}/' | tr '\\n' ',' | sed 's/^/{\"contributors\":[/' | sed 's/,$/]}/' | jq > assets/contributors.json", "validate:layeroverview": "ts-node scripts/generateLayerOverview.ts --report", "validate:licenses": "ts-node scripts/generateLicenseInfo.ts --report", + "generate:schemas": "ts2json-schema -p Models/ThemeConfig/Json/ -o Docs/Schemas/ -t tsconfig.json -R . -m \".*ConfigJson\" && ts-node scripts/fixSchemas.ts ", "optimize-images": "cd assets/generated/ && find -name '*.png' -exec optipng '{}' \\; && echo 'PNGs are optimized'", "reset:layeroverview": "echo {\\\"layers\\\":[], \\\"themes\\\":[]} > ./assets/generated/known_layers_and_themes.json", - "generate": "mkdir -p ./assets/generated && npm run reset:layeroverview && npm run generate:images && npm run generate:translations && npm run generate:licenses && npm run generate:layeroverview", + "generate": "mkdir -p ./assets/generated && npm run reset:layeroverview && npm run generate:images && npm run generate:charging-stations && npm run generate:translations && npm run generate:licenses && npm run validate:layeroverview", "build": "rm -rf dist/ && npm run generate && parcel build --public-url ./ *.html assets/** assets/**/** assets/**/**/** vendor/* vendor/*/*", "generate:charging-stations": "cd ./assets/layers/charging_station && ts-node csvToJson.ts && cd -", - "prepare-deploy": "npm run generate && npm run test && npm run generate:editor-layer-index && npm run generate:charging-stations && npm run generate:layeroverview && npm run generate:layouts && npm run build && rm -rf .cache", + "prepare-deploy": "npm run generate && npm run test && npm run generate:editor-layer-index && npm run generate:layouts && npm run build && rm -rf .cache", "deploy:staging": "npm run prepare-deploy && rm -rf ~/git/pietervdvn.github.io/Staging/* && cp -r dist/* ~/git/pietervdvn.github.io/Staging/ && cd ~/git/pietervdvn.github.io/ && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean", "deploy:pietervdvn": "cd ~/git/pietervdvn.github.io/ && git pull && cd - && npm run prepare-deploy && rm -rf ~/git/pietervdvn.github.io/MapComplete/* && cp -r dist/* ~/git/pietervdvn.github.io/MapComplete/ && cd ~/git/pietervdvn.github.io/ && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean", "deploy:production": "cd ~/git/mapcomplete.github.io/ && git pull && cd - && rm -rf ./assets/generated && npm run prepare-deploy && npm run optimize-images && rm -rf ~/git/mapcomplete.github.io/* && cp -r dist/* ~/git/mapcomplete.github.io/ && cd ~/git/mapcomplete.github.io/ && echo \"mapcomplete.osm.be\" > CNAME && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean && npm run gittag", @@ -77,6 +78,7 @@ "jspdf": "^2.3.1", "latlon2country": "^1.1.3", "leaflet": "^1.7.1", + "leaflet-polylineoffset": "^1.1.1", "leaflet-providers": "^1.13.0", "leaflet-simple-map-screenshoter": "^0.4.4", "leaflet.markercluster": "^1.4.1", @@ -92,6 +94,7 @@ "parcel": "^1.2.4", "prompt-sync": "^4.2.0", "tailwindcss": "^2.2.15", + "togpx": "^0.5.4", "tslint": "^6.1.3", "wikibase-sdk": "^7.14.0", "wikidata-sdk": "^7.14.0" @@ -108,6 +111,7 @@ "sharp": "^0.28.3", "ts-node": "^9.0.0", "ts-node-dev": "^1.0.0-pre.63", + "ts2json-schema": "^1.4.0", "tslint-no-circular-imports": "^0.7.0", "typescript": "^3.9.7", "write-file": "^1.0.0" diff --git a/preferences.ts b/preferences.ts index c96912b5d7..bef8b6d5de 100644 --- a/preferences.ts +++ b/preferences.ts @@ -3,7 +3,6 @@ import Combine from "./UI/Base/Combine"; import {Button} from "./UI/Base/Button"; import {TextField} from "./UI/Input/TextField"; import {FixedUiElement} from "./UI/Base/FixedUiElement"; -import {UIEventSource} from "./Logic/UIEventSource"; import {Utils} from "./Utils"; import {SubtleButton} from "./UI/Base/SubtleButton"; import LZString from "lz-string"; @@ -28,24 +27,27 @@ function salvageThemes(preferences: any) { const knownThemeNames = new Set(); const correctThemeNames = [] for (const key in preferences) { - try{ - if (!(typeof key === "string")) { - continue; - } - const prefix = "mapcomplete-installed-theme-"; - // mapcomplete-installed-theme-arbres_llefia-combined-11 - //mapcomplete-installed-theme-1roadAlllanes-combined-length - if (!key.startsWith(prefix)) { - continue; - } - const theme = key.substring(prefix.length, key.indexOf("-combined-")) + try { + if (!(typeof key === "string")) { + continue; + } + const prefix = "mapcomplete-installed-theme-"; + // mapcomplete-installed-theme-arbres_llefia-combined-11 + //mapcomplete-installed-theme-1roadAlllanes-combined-length + if (!key.startsWith(prefix)) { + continue; + } + const theme = key.substring(prefix.length, key.indexOf("-combined-")) - if (key.endsWith("-length")) { - correctThemeNames.push(theme) - } else { - knownThemeNames.add(theme); + if (key.endsWith("-length")) { + correctThemeNames.push(theme) + } else { + knownThemeNames.add(theme); + } + } catch (e) { + console.error(e) } - }catch(e){console.error(e)}} + } for (const correctThemeName of correctThemeNames) { knownThemeNames.delete(correctThemeName); @@ -74,12 +76,12 @@ function salvageThemes(preferences: any) { try { jsonObject = JSON.parse(atob(combined)); } catch (e) { - try{ - - // We try to decode with lz-string - jsonObject = JSON.parse(Utils.UnMinify(LZString.decompressFromBase64(combined))) as LayoutConfigJson; - }catch(e0){ - console.log("Could not salvage theme. Initial parsing failed due to:", e,"\nWith LZ failed due ", e0) + try { + + // We try to decode with lz-string + jsonObject = JSON.parse(Utils.UnMinify(LZString.decompressFromBase64(combined))) as LayoutConfigJson; + } catch (e0) { + console.log("Could not salvage theme. Initial parsing failed due to:", e, "\nWith LZ failed due ", e0) } } diff --git a/scripts/ScriptUtils.ts b/scripts/ScriptUtils.ts index 5469b56451..9ed725d969 100644 --- a/scripts/ScriptUtils.ts +++ b/scripts/ScriptUtils.ts @@ -53,7 +53,7 @@ export default class ScriptUtils { try { headers = headers ?? {} headers.accept = "application/json" - console.log("ScriptUtils.DownloadJson(", url.substring(0,40), url.length > 40 ? "...":"" ,")") + console.log("ScriptUtils.DownloadJson(", url.substring(0, 40), url.length > 40 ? "..." : "", ")") const urlObj = new URL(url) https.get({ host: urlObj.host, diff --git a/scripts/fixSchemas.ts b/scripts/fixSchemas.ts new file mode 100644 index 0000000000..7899ae0957 --- /dev/null +++ b/scripts/fixSchemas.ts @@ -0,0 +1,28 @@ +import ScriptUtils from "./ScriptUtils"; +import {readFileSync, writeFileSync} from "fs"; + + +function main() { + + const allSchemas = ScriptUtils.readDirRecSync("./Docs/Schemas").filter(pth => pth.endsWith("JSC.ts")) + for (const path of allSchemas) { + const dir = path.substring(0, path.lastIndexOf("/")) + const name = path.substring(path.lastIndexOf("/"), path.length - "JSC.ts".length) + let content = readFileSync(path, "UTF-8") + content = content.substring("export default ".length) + let parsed = JSON.parse(content) + parsed["additionalProperties"] = false + + for (const key in parsed.definitions) { + const def = parsed.definitions[key] + console.log("Patching ", key) + if (def.type === "object") { + def["additionalProperties"] = false + } + } + + writeFileSync(dir + "/" + name + ".schema.json", JSON.stringify(parsed, null, " "), "UTF8") + } +} + +main() diff --git a/scripts/fixTheme.ts b/scripts/fixTheme.ts index cf66d45d11..fa98e8b483 100644 --- a/scripts/fixTheme.ts +++ b/scripts/fixTheme.ts @@ -2,15 +2,14 @@ * This script attempt to automatically fix some basic issues when a theme from the custom generator is loaded */ import {Utils} from "../Utils" -Utils.runningFromConsole = true; import {readFileSync, writeFileSync} from "fs"; import SmallLicense from "../Models/smallLicense"; -import AllKnownLayers from "../Customizations/AllKnownLayers"; import ScriptUtils from "./ScriptUtils"; import AllImageProviders from "../Logic/ImageProviders/AllImageProviders"; import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; +Utils.runningFromConsole = true; ScriptUtils.fixUtils() diff --git a/scripts/generateCache.ts b/scripts/generateCache.ts index 9bf8790233..5731a9ac4d 100644 --- a/scripts/generateCache.ts +++ b/scripts/generateCache.ts @@ -86,9 +86,9 @@ async function downloadRaw(targetdir: string, r: TileRange, theme: LayoutConfig, } const runningSeconds = (new Date().getTime() - startTime) / 1000 const resting = failed + (r.total - downloaded) - const perTile= (runningSeconds / (downloaded - skipped)) - const estimated =Math.floor(resting * perTile) - console.log("total: ", downloaded, "/", r.total, "failed: ", failed, "skipped: ", skipped, "running time: ",Utils.toHumanTime(runningSeconds)+"s", "estimated left: ", Utils.toHumanTime(estimated), "("+Math.floor(perTile)+"s/tile)") + const perTile = (runningSeconds / (downloaded - skipped)) + const estimated = Math.floor(resting * perTile) + console.log("total: ", downloaded, "/", r.total, "failed: ", failed, "skipped: ", skipped, "running time: ", Utils.toHumanTime(runningSeconds) + "s", "estimated left: ", Utils.toHumanTime(estimated), "(" + Math.floor(perTile) + "s/tile)") const boundsArr = Tiles.tile_bounds(r.zoomlevel, x, y) const bounds = { @@ -106,13 +106,13 @@ async function downloadRaw(targetdir: string, r: TileRange, theme: LayoutConfig, if ((json.remark ?? "").startsWith("runtime error")) { console.error("Got a runtime error: ", json.remark) failed++; - }else if (json.elements.length === 0) { + } else if (json.elements.length === 0) { console.log("Got an empty response! Writing anyway") } - - console.log("Got the response - writing to ", filename) - writeFileSync(filename, JSON.stringify(json, null, " ")); + + console.log("Got the response - writing to ", filename) + writeFileSync(filename, JSON.stringify(json, null, " ")); } catch (err) { console.log(url) console.log("Could not download - probably hit the rate limit; waiting a bit. (" + err + ")") @@ -180,7 +180,7 @@ function sliceToTiles(allFeatures: FeatureSource, theme: LayoutConfig, relations function handleLayer(source: FeatureSourceForLayer) { const layer = source.layer.layerDef; const targetZoomLevel = layer.source.geojsonZoomLevel ?? 0 - + const layerId = layer.id if (layer.source.isOsmCacheLayer !== true) { return; @@ -245,11 +245,11 @@ function sliceToTiles(allFeatures: FeatureSource, theme: LayoutConfig, relations writeFileSync(path, JSON.stringify(perX)) // And, if needed, to create a points-only layer - if(pointsOnlyLayers.indexOf(layer.id) >= 0){ + if (pointsOnlyLayers.indexOf(layer.id) >= 0) { const features = source.features.data.map(f => f.feature) const points = features.map(feature => GeoOperations.centerpoint(feature)) console.log("Writing points overview for ", layerId) - const targetPath = targetdir+"_"+layerId+"_points.geojson" + const targetPath = targetdir + "_" + layerId + "_points.geojson" // This is the geojson file containing all features for this tile writeFileSync(targetPath, JSON.stringify({ type: "FeatureCollection", @@ -270,7 +270,6 @@ function sliceToTiles(allFeatures: FeatureSource, theme: LayoutConfig, relations } - async function main(args: string[]) { if (args.length == 0) { @@ -284,12 +283,12 @@ async function main(args: string[]) { const lon0 = Number(args[4]) const lat1 = Number(args[5]) const lon1 = Number(args[6]) - + let generatePointLayersFor = [] - if(args[7] == "--generate-point-overview"){ + if (args[7] == "--generate-point-overview") { generatePointLayersFor = args[8].split(",") } - + const tileRange = Tiles.TileRangeBetween(zoomlevel, lat0, lon0, lat1, lon1) diff --git a/scripts/generateDocs.ts b/scripts/generateDocs.ts index 65741b72f7..7061896beb 100644 --- a/scripts/generateDocs.ts +++ b/scripts/generateDocs.ts @@ -1,5 +1,4 @@ import {Utils} from "../Utils"; -Utils.runningFromConsole = true; import SpecialVisualizations from "../UI/SpecialVisualizations"; import SimpleMetaTagger from "../Logic/SimpleMetaTagger"; import Combine from "../UI/Base/Combine"; @@ -8,25 +7,34 @@ import ValidatedTextField from "../UI/Input/ValidatedTextField"; import BaseUIElement from "../UI/BaseUIElement"; import Translations from "../UI/i18n/Translations"; import {writeFileSync} from "fs"; -import State from "../State"; import {QueryParameters} from "../Logic/Web/QueryParameters"; import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; +import Minimap from "../UI/Base/Minimap"; +import FeatureSwitchState from "../Logic/State/FeatureSwitchState"; +import AllKnownLayers from "../Customizations/AllKnownLayers"; +import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; +Utils.runningFromConsole = true; function WriteFile(filename, html: string | BaseUIElement, autogenSource: string[]): void { writeFileSync(filename, new Combine([Translations.W(html), - "Generated from " + autogenSource.join(", ") + "\n\nThis document is autogenerated from " + autogenSource.join(", ") ]).AsMarkdown()); } -WriteFile("./Docs/SpecialRenderings.md", SpecialVisualizations.HelpMessage, ["UI/SpecialVisualisations.ts"]) +WriteFile("./Docs/SpecialRenderings.md", SpecialVisualizations.HelpMessage(), ["UI/SpecialVisualisations.ts"]) WriteFile("./Docs/CalculatedTags.md", new Combine([SimpleMetaTagger.HelpText(), ExtraFunction.HelpText()]).SetClass("flex-col"), ["SimpleMetaTagger", "ExtraFunction"]) WriteFile("./Docs/SpecialInputElements.md", ValidatedTextField.HelpText(), ["ValidatedTextField.ts"]); +WriteFile("./Docs/BuiltinLayers.md", AllKnownLayouts.GenLayerOverviewText(), ["AllKnownLayers.ts"]) +Minimap.createMiniMap = _ => { + console.log("Not creating a minimap, it is disabled"); + return undefined +} -new State(new LayoutConfig({ +const dummyLayout = new LayoutConfig({ language: ["en"], id: "", maintainer: "pietervdvn", @@ -43,11 +51,15 @@ new State(new LayoutConfig({ id: "", source: { osmTags: "id~*" - } + }, + mapRendering: [] } ] -})) +}) + +new FeatureSwitchState(dummyLayout) + QueryParameters.GetQueryParameter("layer-", "true", "Wether or not the layer with id is shown") WriteFile("./Docs/URL_Parameters.md", QueryParameters.GenerateQueryParameterDocs(), ["QueryParameters"]) diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index e4c981decf..fb41616016 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -12,8 +12,8 @@ import {Utils} from "../Utils"; // It spits out an overview of those to be used to load them interface LayersAndThemes { - themes: any[], - layers: { parsed: any, path: string }[] + themes: LayoutConfigJson[], + layers: { parsed: LayerConfigJson, path: string }[] } @@ -35,7 +35,6 @@ class LayerOverviewUtils { } } - writeFiles(lt: LayersAndThemes) { writeFileSync("./assets/generated/known_layers_and_themes.json", JSON.stringify({ "layers": lt.layers.map(l => l.parsed), @@ -43,12 +42,16 @@ class LayerOverviewUtils { })) } - validateLayer(layerJson: LayerConfigJson, path: string, knownPaths: Set, context?: string): string[] { let errorCount = []; if (layerJson["overpassTags"] !== undefined) { errorCount.push("Layer " + layerJson.id + "still uses the old 'overpassTags'-format. Please use \"source\": {\"osmTags\": }' instead of \"overpassTags\": (note: this isn't your fault, the custom theme generator still spits out the old format)") } + const forbiddenTopLevel = ["icon","wayHandling","roamingRenderings","roamingRendering","label","width","color","colour","iconOverlays"] + for (const forbiddenKey of forbiddenTopLevel) { + if(layerJson[forbiddenKey] !== undefined) + errorCount.push("Layer "+layerJson.id+" still has a forbidden key "+forbiddenKey) + } try { const layer = new LayerConfig(layerJson, "test", true) const images = Array.from(layer.ExtractImages()) @@ -109,6 +112,8 @@ class LayerOverviewUtils { } let themeErrorCount = [] + // used only for the reports + let themeConfigs: LayoutConfig[] = [] for (const themeInfo of themeFiles) { const themeFile = themeInfo.parsed const themePath = themeInfo.path @@ -119,7 +124,7 @@ class LayerOverviewUtils { themeErrorCount.push("The theme " + themeFile.id + " has units defined - these should be defined on the layer instead. (Hint: use overrideAll: { '+units': ... }) ") } if (themeFile["roamingRenderings"] !== undefined) { - themeErrorCount.push("Theme " + themeFile.id + " contains an old 'roamingRenderings'. Use an 'overrideAll' instead") + themeErrorCount.push("Theme " + themeFile.id + " contains an old 'roamingRenderings'. Use an 'overrideAll' instead") } for (const layer of themeFile.layers) { if (typeof layer === "string") { @@ -144,17 +149,17 @@ class LayerOverviewUtils { } } } - + const referencedLayers = Utils.NoNull([].concat(...themeFile.layers.map(layer => { - if(typeof layer === "string"){ + if (typeof layer === "string") { return layer } - if(layer["builtin"] !== undefined){ + if (layer["builtin"] !== undefined) { return layer["builtin"] } return undefined }).map(layerName => { - if(typeof layerName === "string"){ + if (typeof layerName === "string") { return [layerName] } return layerName @@ -176,22 +181,22 @@ class LayerOverviewUtils { } const neededLanguages = themeFile["mustHaveLanguage"] if (neededLanguages !== undefined) { - console.log("Checking language requerements for ", theme.id, "as it must have", neededLanguages.join(", ")) - const allTranslations = [].concat(Translation.ExtractAllTranslationsFrom(theme, theme.id), - ...referencedLayers.map(layerId => Translation.ExtractAllTranslationsFrom(knownLayerIds.get(layerId), theme.id+"->"+layerId))) + console.log("Checking language requirements for ", theme.id, "as it must have", neededLanguages.join(", ")) + const allTranslations = [].concat(Translation.ExtractAllTranslationsFrom(theme, theme.id), + ...referencedLayers.map(layerId => Translation.ExtractAllTranslationsFrom(knownLayerIds.get(layerId), theme.id + "->" + layerId))) for (const neededLanguage of neededLanguages) { allTranslations .filter(t => t.tr.translations[neededLanguage] === undefined && t.tr.translations["*"] === undefined) .forEach(missing => { - themeErrorCount.push("The theme " + theme.id + " should be translation-complete for " + neededLanguage + ", but it lacks a translation for " + missing.context) + themeErrorCount.push("The theme " + theme.id + " should be translation-complete for " + neededLanguage + ", but it lacks a translation for " + missing.context+".\n\tThe full translation is "+missing.tr.translations) }) } } - + themeConfigs.push(theme) } catch (e) { - themeErrorCount.push("Could not parse theme " + themeFile["id"] + "due to", e) + themeErrorCount.push("Could not parse theme " + themeFile["id"] + " due to", e) } } @@ -210,12 +215,11 @@ class LayerOverviewUtils { console.log(msg) console.log("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") - if (process.argv.indexOf("--report") >= 0) { + if (args.indexOf("--report") >= 0) { console.log("Writing report!") writeFileSync("layer_report.txt", errors) } - - if (process.argv.indexOf("--no-fail") < 0) { + if (args.indexOf("--no-fail") < 0) { throw msg; } } diff --git a/scripts/generateLayouts.ts b/scripts/generateLayouts.ts index 3b747a4a01..5335a7a39a 100644 --- a/scripts/generateLayouts.ts +++ b/scripts/generateLayouts.ts @@ -1,6 +1,4 @@ import {Utils} from "../Utils"; -// We HAVE to mark this while importing -Utils.runningFromConsole = true; import {existsSync, mkdirSync, readFileSync, writeFile, writeFileSync} from "fs"; import Locale from "../UI/i18n/Locale"; import Translations from "../UI/i18n/Translations"; @@ -9,6 +7,8 @@ import Constants from "../Models/Constants"; import * as all_known_layouts from "../assets/generated/known_layers_and_themes.json" import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; +// We HAVE to mark this while importing +Utils.runningFromConsole = true; const sharp = require('sharp'); diff --git a/scripts/generateLicenseInfo.ts b/scripts/generateLicenseInfo.ts index f9e6d485fc..e6c47b922e 100644 --- a/scripts/generateLicenseInfo.ts +++ b/scripts/generateLicenseInfo.ts @@ -76,7 +76,7 @@ knownLicenses.set("streetcomplete", { authors: ["Tobias Zwick (westnordost)"], path: undefined, license: "CC0", - sources: ["https://github.com/streetcomplete/StreetComplete/tree/master/res/graphics","https://f-droid.org/packages/de.westnordost.streetcomplete/"] + sources: ["https://github.com/streetcomplete/StreetComplete/tree/master/res/graphics", "https://f-droid.org/packages/de.westnordost.streetcomplete/"] }) @@ -162,6 +162,17 @@ function cleanLicenseInfo(allPaths: string[], allLicenseInfos: SmallLicense[]) { } perDirectory.forEach((licenses, dir) => { + + + for (let i = licenses.length - 1; i >= 0; i--) { + const license = licenses[i]; + const path = dir + "/" + license.path + if (!existsSync(path)) { + console.log("Found license for now missing file: ", path, " - removing this license") + licenses.splice(i, 1) + } + } + licenses.sort((a, b) => a.path < b.path ? -1 : 1) writeFileSync(dir + "/license_info.json", JSON.stringify(licenses, null, 2)) }) @@ -187,6 +198,26 @@ function queryMissingLicenses(missingLicenses: string[]) { console.log("You're through!") } + +/** + * Creates the humongous license_info in the generated assets, containing all licenses with a path relative to the root + * @param licensePaths + */ +function createFullLicenseOverview(licensePaths) { + + const allLicenses: SmallLicense[] = [] + for (const licensePath of licensePaths) { + const licenses = JSON.parse(readFileSync(licensePath, "UTF-8")) + for (const license of licenses) { + const dir = licensePath.substring(0, licensePath.length - "license_info.json".length) + license.path = dir + license.path + allLicenses.push(license) + } + } + + writeFileSync("./assets/generated/license_info.json", JSON.stringify(allLicenses, null, " ")) +} + console.log("Checking and compiling license info") const contents = ScriptUtils.readDirRecSync("./assets") .filter(entry => entry.indexOf("./assets/generated") != 0) @@ -197,7 +228,6 @@ if (!existsSync("./assets/generated")) { mkdirSync("./assets/generated") } -writeFileSync("./assets/generated/license_info.json", JSON.stringify(licenseInfos, null, " ")) const artwork = contents.filter(pth => pth.match(/(.svg|.png|.jpg)$/i) != null) const missingLicenses = missingLicenseInfos(licenseInfos, artwork) @@ -221,13 +251,10 @@ if (missingLicenses.length > 0) { const msg = `There are ${missingLicenses.length} licenses missing and ${invalidLicenses.length} invalid licenses.` console.log(missingLicenses.concat(invalidLicenses).join("\n")) console.error(msg) - if (process.argv.indexOf("--report") >= 0) { - console.log("Writing report!") - writeFileSync("missing_licenses.txt", missingLicenses.concat(invalidLicenses).join("\n")) - } if (process.argv.indexOf("--no-fail") < 0) { throw msg } } cleanLicenseInfo(licensePaths, licenseInfos) +createFullLicenseOverview(licensePaths) \ No newline at end of file diff --git a/scripts/generateTaginfoProjectFiles.ts b/scripts/generateTaginfoProjectFiles.ts index 7345e89180..58166a11c0 100644 --- a/scripts/generateTaginfoProjectFiles.ts +++ b/scripts/generateTaginfoProjectFiles.ts @@ -1,5 +1,4 @@ import {Utils} from "../Utils"; -Utils.runningFromConsole = true; import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; import Locale from "../UI/i18n/Locale"; import {Translation} from "../UI/i18n/Translation"; @@ -7,6 +6,8 @@ import {readFileSync, writeFileSync} from "fs"; import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; +Utils.runningFromConsole = true; + /** * Generates all the files in "Docs/TagInfo". These are picked up by the taginfo project, showing a link to the mapcomplete theme if the key is used diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index 7880605494..41d4f0ebee 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -31,6 +31,9 @@ class TranslationPart { if (!translations.hasOwnProperty(translationsKey)) { continue; } + if (translationsKey == "then") { + throw "Suspicious translation at " + context + } const v = translations[translationsKey] if (typeof (v) != "string") { console.error("Non-string object in translation while trying to add more translations to '", translationsKey, "': ", v) @@ -242,7 +245,7 @@ function generateTranslationsObjectFrom(objects: { path: string, parsed: { id: s let json = tr.toJson(lang) try { - json = JSON.stringify(JSON.parse(json), null, " "); + json = JSON.stringify(JSON.parse(json), null, " "); } catch (e) { console.error(e) } @@ -357,7 +360,7 @@ function mergeLayerTranslations() { const layerFiles = ScriptUtils.getLayerFiles(); for (const layerFile of layerFiles) { mergeLayerTranslation(layerFile.parsed, layerFile.path, loadTranslationFilesFrom("layers")) - writeFileSync(layerFile.path, JSON.stringify(layerFile.parsed, null, " ")) + writeFileSync(layerFile.path, JSON.stringify(layerFile.parsed, null, " ")) } } diff --git a/scripts/lint.ts b/scripts/lint.ts index fe79b61303..2d0498971d 100644 --- a/scripts/lint.ts +++ b/scripts/lint.ts @@ -1,56 +1,20 @@ +import ScriptUtils from "./ScriptUtils"; +import {writeFileSync} from "fs"; +import LegacyJsonConvert from "../Models/ThemeConfig/LegacyJsonConvert"; /* * This script reads all theme and layer files and reformats them inplace * Use with caution, make a commit beforehand! */ - -import ScriptUtils from "./ScriptUtils"; -import {readFileSync, writeFileSync} from "fs"; -import {tag} from "@turf/turf"; -import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; - -/** - * In place fix - */ -function fixLayerConfig(config: LayerConfigJson) : void{ - if(config.tagRenderings === undefined){ - return - } - - for (const tagRendering of config.tagRenderings) { - if(tagRendering["#"] !== undefined){ - tagRendering["id"] = tagRendering["#"] - delete tagRendering["#"] - } - if(tagRendering["id"] === undefined){ - if(tagRendering["freeform"]?.key !== undefined ) { - tagRendering["id"] = config.id+"-"+tagRendering["freeform"]["key"] - } - } - } -} - const layerFiles = ScriptUtils.getLayerFiles(); for (const layerFile of layerFiles) { - fixLayerConfig(layerFile.parsed) - writeFileSync(layerFile.path, JSON.stringify(layerFile.parsed, null, " ")) + LegacyJsonConvert.fixLayerConfig(layerFile.parsed) + writeFileSync(layerFile.path, JSON.stringify(layerFile.parsed, null, " ")) } const themeFiles = ScriptUtils.getThemeFiles() for (const themeFile of themeFiles) { - for (const layerConfig of themeFile.parsed.layers ?? []) { - if(typeof layerConfig === "string" || layerConfig["builtin"]!== undefined){ - continue - } - // @ts-ignore - fixLayerConfig(layerConfig) - } - - if(themeFile.parsed["roamingRenderings"] !== undefined && themeFile.parsed["roamingRenderings"].length == 0){ - delete themeFile.parsed["roamingRenderings"] - } - + LegacyJsonConvert.fixThemeConfig(themeFile.parsed) writeFileSync(themeFile.path, JSON.stringify(themeFile.parsed, null, " ")) } -//*/ diff --git a/scripts/slice.ts b/scripts/slice.ts index 74673035b5..342dc22f90 100644 --- a/scripts/slice.ts +++ b/scripts/slice.ts @@ -106,7 +106,7 @@ async function main(args: string[]) { console.log("Loaded all", allFeatures.length, "points") - const keysToRemove = ["ID", "STRAATNMID", "NISCODE", "GEMEENTE", "POSTCODE", "HERKOMST"] + const keysToRemove = ["STRAATNMID", "GEMEENTE", "POSTCODE"] for (const f of allFeatures) { for (const keyToRm of keysToRemove) { delete f.properties[keyToRm] diff --git a/tailwind.config.js b/tailwind.config.js index fe744d0b2c..5c38cadf29 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -21,9 +21,9 @@ module.exports = { } }, plugins: [ - plugin(function ({ addVariant, e }) { - addVariant('landscape', ({ modifySelectors, separator }) => { - modifySelectors(({ className }) => { + plugin(function ({addVariant, e}) { + addVariant('landscape', ({modifySelectors, separator}) => { + modifySelectors(({className}) => { return `.${e(`landscape${separator}${className}`)}:landscape` }) }) diff --git a/test.ts b/test.ts index a8cc94f929..7141bb366c 100644 --- a/test.ts +++ b/test.ts @@ -1,13 +1,150 @@ -import * as wd from "wikidata-sdk" -import * as wds from "wikibase-sdk" -import {Utils} from "./Utils"; +import ShowDataLayer from "./UI/ShowDataLayer/ShowDataLayer"; +import AllKnownLayers from "./Customizations/AllKnownLayers"; +import Minimap from "./UI/Base/Minimap"; +import StaticFeatureSource from "./Logic/FeatureSource/Sources/StaticFeatureSource"; +import MinimapImplementation from "./UI/Base/MinimapImplementation"; +import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers"; +import BaseLayer from "./Models/BaseLayer"; +import {UIEventSource} from "./Logic/UIEventSource"; +import AvailableBaseLayersImplementation from "./Logic/Actors/AvailableBaseLayersImplementation"; -const url = wd.getEntities(["Q42"]) -console.log(url) -Utils.downloadJson(url).then(async (entities) => { - //const parsed = wd.parse.wb.entities(entities)["Q42"] - console.log(entities) - console.log(wds.simplify.entity(entities.entities["Q42"], { - timeConverter: 'simple-day' - })) -}) \ No newline at end of file +MinimapImplementation.initialize() +AvailableBaseLayers.implement(new AvailableBaseLayersImplementation()) +const confirmationMap = Minimap.createMiniMap({ + background: new UIEventSource(AvailableBaseLayers.osmCarto) +}) +const features = [{ + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823483}, + "geometry": { + "type": "LineString", + "coordinates": [[3.216693, 51.2147409], [3.2166930000000225, 51.214740500000055]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823481}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2167247, 51.2146969], [3.21671060000004, 51.2147159000002]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823481}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2167247, 51.2146969], [3.2167241999999976, 51.214696799999714]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823549}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2168871, 51.2147399], [3.2168876999999547, 51.21474009999989]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289383}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2169973, 51.2147676], [3.2169969000000034, 51.21476780000005]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289388}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2169829, 51.2147884], [3.2169673999999895, 51.21481170000002]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289388}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2169829, 51.2147884], [3.216949899999979, 51.214808000000225]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289388}, + "geometry": {"type": "LineString", "coordinates": [[3.2169829, 51.2147884], [3.2169306, 51.21480400000028]]} + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289388}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2169829, 51.2147884], [3.2169465999999756, 51.214779199999825]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978288381}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2168856, 51.2147638], [3.216885599999961, 51.214763799999986]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289386}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2168815, 51.2147718], [3.216881100000038, 51.21477160000009]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289384}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2168674, 51.2147683], [3.216867399999983, 51.214768400000224]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823514}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2168551, 51.2147863], [3.2168551000000436, 51.21478629999984]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823483}, + "geometry": { + "type": "LineString", + "coordinates": [[3.216693, 51.2147409], [3.2166930000000225, 51.214740500000055]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}] +const changePreview = new StaticFeatureSource(features.map(f => f.feature), false) +console.log("ChangePreview", changePreview.features.data) +new ShowDataLayer({ + leafletMap: confirmationMap.leafletMap, + enablePopups: false, + zoomToFeatures: true, + features: changePreview, + layerToShow: AllKnownLayers.sharedLayers.get("conflation") +}) + +confirmationMap.SetStyle("height: 20rem").SetClass("w-full").AttachTo("maindiv") \ No newline at end of file diff --git a/test/Actors.spec.ts b/test/Actors.spec.ts index b53cfd5c7b..38c2a7c17a 100644 --- a/test/Actors.spec.ts +++ b/test/Actors.spec.ts @@ -1,10 +1,8 @@ import T from "./TestHelper"; -import State from "../State"; import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; import SelectedElementTagsUpdater from "../Logic/Actors/SelectedElementTagsUpdater"; import UserRelatedState from "../Logic/State/UserRelatedState"; import {Utils} from "../Utils"; -import ScriptUtils from "../scripts/ScriptUtils"; import SelectedFeatureHandler from "../Logic/Actors/SelectedFeatureHandler"; import {UIEventSource} from "../Logic/UIEventSource"; import {ElementStorage} from "../Logic/ElementStorage"; @@ -113,14 +111,14 @@ export default class ActorsSpec extends T { lon: 0, zoom: 0 }) - - + + loc.addCallback(_ => { T.equals("node/5568693115", selected.data.properties.id) T.equals(14, loc.data.zoom) - T.equals( 51.2179199, loc.data.lat) + T.equals(51.2179199, loc.data.lat) }) - + new SelectedFeatureHandler(hash, { selectedElement: selected, allElements: new ElementStorage(), @@ -128,9 +126,7 @@ export default class ActorsSpec extends T { locationControl: loc, layoutToUse: undefined }) - - - + }] diff --git a/test/GeoOperations.spec.ts b/test/GeoOperations.spec.ts index 56e07acaf1..a615efb0c8 100644 --- a/test/GeoOperations.spec.ts +++ b/test/GeoOperations.spec.ts @@ -1,8 +1,8 @@ import {Utils} from "../Utils"; import * as Assert from "assert"; +import {equal} from "assert"; import T from "./TestHelper"; import {GeoOperations} from "../Logic/GeoOperations"; -import {equal} from "assert"; import {BBox} from "../Logic/BBox"; Utils.runningFromConsole = true; diff --git a/test/ImageProvider.spec.ts b/test/ImageProvider.spec.ts index 898f05c7cd..e003119860 100644 --- a/test/ImageProvider.spec.ts +++ b/test/ImageProvider.spec.ts @@ -4,23 +4,24 @@ import {UIEventSource} from "../Logic/UIEventSource"; import {Utils} from "../Utils"; export default class ImageProviderSpec extends T { - + constructor() { super("ImageProvider", [ ["Search images", () => { - + let i = 0 + function expects(url, tags, providerName = undefined) { - tags.id = "test/"+i + tags.id = "test/" + i i++ AllImageProviders.LoadImagesFor(new UIEventSource(tags)).addCallbackD(images => { console.log("ImageProvider test", tags.id, "for", tags) const img = images[0] - if(img === undefined){ + if (img === undefined) { throw "No image found" } T.equals(url, img.url, tags.id) - if(providerName){ + if (providerName) { T.equals(img.provider.constructor.name, providerName) } console.log("OK") @@ -30,51 +31,53 @@ export default class ImageProviderSpec extends T { const muntpoort_expected = "https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABr%C3%BCgge-Muntpoort_6-29510-58192.jpg?width=500&height=400" expects( muntpoort_expected, - { "wikimedia_commons":"File:Brügge-Muntpoort_6-29510-58192.jpg" - } , "WikimediaImageProvider") - + { + "wikimedia_commons": "File:Brügge-Muntpoort_6-29510-58192.jpg" + }, "WikimediaImageProvider") expects(muntpoort_expected, - { "wikimedia_commons":"https://upload.wikimedia.org/wikipedia/commons/c/cd/Br%C3%BCgge-Muntpoort_6-29510-58192.jpg" - } , "WikimediaImageProvider") - - expects(muntpoort_expected , { - "image":"https://upload.wikimedia.org/wikipedia/commons/c/cd/Br%C3%BCgge-Muntpoort_6-29510-58192.jpg" - } , "WikimediaImageProvider") + { + "wikimedia_commons": "https://upload.wikimedia.org/wikipedia/commons/c/cd/Br%C3%BCgge-Muntpoort_6-29510-58192.jpg" + }, "WikimediaImageProvider") - - expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABelgium-5955_-_Simon_Stevin_(13746657193).jpg?width=500&height=400" , { - "image":"File:Belgium-5955_-_Simon_Stevin_(13746657193).jpg" - } , "WikimediaImageProvider") - - expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABelgium-5955_-_Simon_Stevin_(13746657193).jpg?width=500&height=400" , { - "wikimedia_commons":"File:Belgium-5955_-_Simon_Stevin_(13746657193).jpg" - } , "WikimediaImageProvider") - - - - - expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABrugge_Leeuwstraat_zonder_nummer_Leeuwbrug_-_119334_-_onroerenderfgoed.jpg?width=500&height=400",{ - image:"File:Brugge_Leeuwstraat_zonder_nummer_Leeuwbrug_-_119334_-_onroerenderfgoed.jpg" + expects(muntpoort_expected, { + "image": "https://upload.wikimedia.org/wikipedia/commons/c/cd/Br%C3%BCgge-Muntpoort_6-29510-58192.jpg" }, "WikimediaImageProvider") - expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3APapageno_Jef_Claerhout.jpg?width=500&height=400",{ - "wikimedia_commons": "File:Papageno_Jef_Claerhout.jpg" + + expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABelgium-5955_-_Simon_Stevin_(13746657193).jpg?width=500&height=400", { + "image": "File:Belgium-5955_-_Simon_Stevin_(13746657193).jpg" + }, "WikimediaImageProvider") + + expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABelgium-5955_-_Simon_Stevin_(13746657193).jpg?width=500&height=400", { + "wikimedia_commons": "File:Belgium-5955_-_Simon_Stevin_(13746657193).jpg" + }, "WikimediaImageProvider") + + + expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABrugge_Leeuwstraat_zonder_nummer_Leeuwbrug_-_119334_-_onroerenderfgoed.jpg?width=500&height=400", { + image: "File:Brugge_Leeuwstraat_zonder_nummer_Leeuwbrug_-_119334_-_onroerenderfgoed.jpg" + }, "WikimediaImageProvider") + + expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3APapageno_Jef_Claerhout.jpg?width=500&height=400", { + "wikimedia_commons": "File:Papageno_Jef_Claerhout.jpg" }, "WikimediaImageProvider") Utils.injectJsonDownloadForTests( - "https://graph.mapillary.com/196804715753265?fields=thumb_1024_url&&access_token=MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85" , - {"thumb_1024_url":"https://scontent-bru2-1.xx.fbcdn.net/m1/v/t6/An8HQ3DrfU76tWMC602spvM_e_rqOHyiUcYUTetXM7K52DDBEY5J4FWg4WKQqVUlMsWJn4nLXk0pxlBLx31146FqZ2Kg65z7lJUfR6wpW6WPSR5_y7RKdv4YEuzPjwIN0lagBnQONV3UjmXnEGpMouU?stp=s1024x768&ccb=10-5&oh=d460b401c505714ee1cb8bd6baf8ae5d&oe=61731FC3&_nc_sid=122ab1","id":"196804715753265"} + "https://graph.mapillary.com/196804715753265?fields=thumb_1024_url&&access_token=MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85", + { + "thumb_1024_url": "https://scontent-bru2-1.xx.fbcdn.net/m1/v/t6/An8HQ3DrfU76tWMC602spvM_e_rqOHyiUcYUTetXM7K52DDBEY5J4FWg4WKQqVUlMsWJn4nLXk0pxlBLx31146FqZ2Kg65z7lJUfR6wpW6WPSR5_y7RKdv4YEuzPjwIN0lagBnQONV3UjmXnEGpMouU?stp=s1024x768&ccb=10-5&oh=d460b401c505714ee1cb8bd6baf8ae5d&oe=61731FC3&_nc_sid=122ab1", + "id": "196804715753265" + } ) expects("https://scontent-bru2-1.xx.fbcdn.net/m1/v/t6/An8HQ3DrfU76tWMC602spvM_e_rqOHyiUcYUTetXM7K52DDBEY5J4FWg4WKQqVUlMsWJn4nLXk0pxlBLx31146FqZ2Kg65z7lJUfR6wpW6WPSR5_y7RKdv4YEuzPjwIN0lagBnQONV3UjmXnEGpMouU?stp=s1024x768&ccb=10-5&oh=d460b401c505714ee1cb8bd6baf8ae5d&oe=61731FC3&_nc_sid=122ab1", { - "mapillary":"https://www.mapillary.com/app/?pKey=196804715753265" + "mapillary": "https://www.mapillary.com/app/?pKey=196804715753265" }) - - + + }] ]); } - + } \ No newline at end of file diff --git a/test/OsmConnection.spec.ts b/test/OsmConnection.spec.ts index 9d7b114f50..3bd69ac9b4 100644 --- a/test/OsmConnection.spec.ts +++ b/test/OsmConnection.spec.ts @@ -2,7 +2,6 @@ import T from "./TestHelper"; import UserDetails, {OsmConnection} from "../Logic/Osm/OsmConnection"; import {UIEventSource} from "../Logic/UIEventSource"; import ScriptUtils from "../scripts/ScriptUtils"; -import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; import {ElementStorage} from "../Logic/ElementStorage"; import {Changes} from "../Logic/Osm/Changes"; diff --git a/test/OsmObject.spec.ts b/test/OsmObject.spec.ts index e26dae4d6d..9cf60e354c 100644 --- a/test/OsmObject.spec.ts +++ b/test/OsmObject.spec.ts @@ -1,26 +1,13 @@ import T from "./TestHelper"; import {OsmObject} from "../Logic/Osm/OsmObject"; -import ScriptUtils from "../scripts/ScriptUtils"; -import {UIEventSource} from "../Logic/UIEventSource"; export default class OsmObjectSpec extends T { - private static async runTest(){ - const ways = await OsmObject.DownloadReferencingWays("node/1124134958") - if(ways === undefined){ - throw "Did not get the ways" - } - if (ways.length !== 4) { - throw "Expected 4 ways but got "+ways.length - } - } - - constructor() { super("osmobject", [ [ "Download referencing ways", () => { - OsmObjectSpec.runTest().then(_ => console.log("Referencing ways test is done (async)")) + OsmObjectSpec.runTest().then(_ => console.log("Referencing ways test is done (async)")) } ] @@ -28,4 +15,14 @@ export default class OsmObjectSpec extends T { ]); } + + private static async runTest() { + const ways = await OsmObject.DownloadReferencingWays("node/1124134958") + if (ways === undefined) { + throw "Did not get the ways" + } + if (ways.length !== 4) { + throw "Expected 4 ways but got " + ways.length + } + } } \ No newline at end of file diff --git a/test/RelationSplitHandler.spec.ts b/test/RelationSplitHandler.spec.ts index 0d13e7dc59..76c605a782 100644 --- a/test/RelationSplitHandler.spec.ts +++ b/test/RelationSplitHandler.spec.ts @@ -266,13 +266,285 @@ export default class RelationSplitHandlerSpec extends T { } ) Utils.injectJsonDownloadForTests( - "https://www.openstreetmap.org/api/0.6/relation/4374576" , - {"version":"0.6","generator":"CGImap 0.8.5 (1266692 spike-06.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"relation","id":4374576,"timestamp":"2014-12-23T21:42:27Z","version":2,"changeset":27660623,"user":"escada","uid":436365,"members":[{"type":"way","ref":318616190,"role":"from"},{"type":"node","ref":1407529979,"role":"via"},{"type":"way","ref":143298912,"role":"to"}],"tags":{"restriction":"no_right_turn","type":"restriction"}}]} + "https://www.openstreetmap.org/api/0.6/relation/4374576", + { + "version": "0.6", + "generator": "CGImap 0.8.5 (1266692 spike-06.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [{ + "type": "relation", + "id": 4374576, + "timestamp": "2014-12-23T21:42:27Z", + "version": 2, + "changeset": 27660623, + "user": "escada", + "uid": 436365, + "members": [{"type": "way", "ref": 318616190, "role": "from"}, { + "type": "node", + "ref": 1407529979, + "role": "via" + }, {"type": "way", "ref": 143298912, "role": "to"}], + "tags": {"restriction": "no_right_turn", "type": "restriction"} + }] + } ) Utils.injectJsonDownloadForTests( - "https://www.openstreetmap.org/api/0.6/way/143298912/full" , - {"version":"0.6","generator":"CGImap 0.8.5 (4046166 spike-07.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"node","id":26343912,"lat":51.2146847,"lon":3.2397007,"timestamp":"2015-04-11T10:40:56Z","version":5,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":26343913,"lat":51.2161912,"lon":3.2386907,"timestamp":"2015-04-11T10:40:56Z","version":6,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":26343914,"lat":51.2193456,"lon":3.2360696,"timestamp":"2015-04-11T10:40:56Z","version":5,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":26343915,"lat":51.2202816,"lon":3.2352429,"timestamp":"2015-04-11T10:40:56Z","version":5,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":875668688,"lat":51.2131868,"lon":3.2406009,"timestamp":"2015-04-11T10:40:56Z","version":4,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1109632153,"lat":51.2207068,"lon":3.234882,"timestamp":"2015-04-11T10:40:55Z","version":3,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1109632154,"lat":51.220784,"lon":3.2348394,"timestamp":"2021-05-30T08:01:17Z","version":4,"changeset":105557550,"user":"albertino","uid":499281},{"type":"node","id":1109632177,"lat":51.2205082,"lon":3.2350441,"timestamp":"2015-04-11T10:40:55Z","version":3,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1407529961,"lat":51.2168476,"lon":3.2381772,"timestamp":"2015-04-11T10:40:55Z","version":2,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1407529969,"lat":51.2155155,"lon":3.23917,"timestamp":"2011-08-21T20:08:27Z","version":1,"changeset":9088257,"user":"toeklk","uid":219908},{"type":"node","id":1407529979,"lat":51.212694,"lon":3.2409595,"timestamp":"2015-04-11T10:40:55Z","version":6,"changeset":30139621,"user":"M!dgard","uid":763799,"tags":{"highway":"traffic_signals"}},{"type":"node","id":1634435395,"lat":51.2129189,"lon":3.2408257,"timestamp":"2012-02-15T19:37:51Z","version":1,"changeset":10695640,"user":"Eimai","uid":6072},{"type":"node","id":1634435396,"lat":51.2132508,"lon":3.2405417,"timestamp":"2012-02-15T19:37:51Z","version":1,"changeset":10695640,"user":"Eimai","uid":6072},{"type":"node","id":1634435397,"lat":51.2133918,"lon":3.2404416,"timestamp":"2015-04-11T10:40:55Z","version":2,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1974988033,"lat":51.2127459,"lon":3.240928,"timestamp":"2012-10-20T12:24:13Z","version":1,"changeset":13566903,"user":"skyman81","uid":955688},{"type":"node","id":3250129361,"lat":51.2127906,"lon":3.2409016,"timestamp":"2018-12-19T00:00:33Z","version":2,"changeset":65596519,"user":"beardhatcode","uid":5439560,"tags":{"crossing":"traffic_signals","highway":"crossing"}},{"type":"node","id":3250129363,"lat":51.2149189,"lon":3.2395571,"timestamp":"2015-04-11T10:40:56Z","version":2,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":3450326133,"lat":51.2139571,"lon":3.2401205,"timestamp":"2015-04-11T10:40:26Z","version":1,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":3450326135,"lat":51.2181385,"lon":3.2370893,"timestamp":"2015-04-11T10:40:26Z","version":1,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":4794847239,"lat":51.2191224,"lon":3.2362584,"timestamp":"2019-08-27T23:07:05Z","version":2,"changeset":73816461,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":8493044168,"lat":51.2130348,"lon":3.2407284,"timestamp":"2021-03-06T21:52:51Z","version":1,"changeset":100555232,"user":"kaart_fietser","uid":11022240,"tags":{"highway":"traffic_signals","traffic_signals":"traffic_lights"}},{"type":"node","id":8792687918,"lat":51.2207505,"lon":3.2348579,"timestamp":"2021-06-02T18:27:15Z","version":1,"changeset":105735092,"user":"albertino","uid":499281},{"type":"way","id":143298912,"timestamp":"2021-06-02T18:27:15Z","version":15,"changeset":105735092,"user":"albertino","uid":499281,"nodes":[1407529979,1974988033,3250129361,1634435395,8493044168,875668688,1634435396,1634435397,3450326133,26343912,3250129363,1407529969,26343913,1407529961,3450326135,4794847239,26343914,26343915,1109632177,1109632153,8792687918,1109632154],"tags":{"cycleway:right":"track","highway":"primary","lanes":"2","lit":"yes","maxspeed":"70","name":"Buiten Kruisvest","oneway":"yes","ref":"R30","surface":"asphalt","wikipedia":"nl:Buiten Kruisvest"}}]} + "https://www.openstreetmap.org/api/0.6/way/143298912/full", + { + "version": "0.6", + "generator": "CGImap 0.8.5 (4046166 spike-07.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [{ + "type": "node", + "id": 26343912, + "lat": 51.2146847, + "lon": 3.2397007, + "timestamp": "2015-04-11T10:40:56Z", + "version": 5, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 26343913, + "lat": 51.2161912, + "lon": 3.2386907, + "timestamp": "2015-04-11T10:40:56Z", + "version": 6, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 26343914, + "lat": 51.2193456, + "lon": 3.2360696, + "timestamp": "2015-04-11T10:40:56Z", + "version": 5, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 26343915, + "lat": 51.2202816, + "lon": 3.2352429, + "timestamp": "2015-04-11T10:40:56Z", + "version": 5, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 875668688, + "lat": 51.2131868, + "lon": 3.2406009, + "timestamp": "2015-04-11T10:40:56Z", + "version": 4, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 1109632153, + "lat": 51.2207068, + "lon": 3.234882, + "timestamp": "2015-04-11T10:40:55Z", + "version": 3, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 1109632154, + "lat": 51.220784, + "lon": 3.2348394, + "timestamp": "2021-05-30T08:01:17Z", + "version": 4, + "changeset": 105557550, + "user": "albertino", + "uid": 499281 + }, { + "type": "node", + "id": 1109632177, + "lat": 51.2205082, + "lon": 3.2350441, + "timestamp": "2015-04-11T10:40:55Z", + "version": 3, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 1407529961, + "lat": 51.2168476, + "lon": 3.2381772, + "timestamp": "2015-04-11T10:40:55Z", + "version": 2, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 1407529969, + "lat": 51.2155155, + "lon": 3.23917, + "timestamp": "2011-08-21T20:08:27Z", + "version": 1, + "changeset": 9088257, + "user": "toeklk", + "uid": 219908 + }, { + "type": "node", + "id": 1407529979, + "lat": 51.212694, + "lon": 3.2409595, + "timestamp": "2015-04-11T10:40:55Z", + "version": 6, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799, + "tags": {"highway": "traffic_signals"} + }, { + "type": "node", + "id": 1634435395, + "lat": 51.2129189, + "lon": 3.2408257, + "timestamp": "2012-02-15T19:37:51Z", + "version": 1, + "changeset": 10695640, + "user": "Eimai", + "uid": 6072 + }, { + "type": "node", + "id": 1634435396, + "lat": 51.2132508, + "lon": 3.2405417, + "timestamp": "2012-02-15T19:37:51Z", + "version": 1, + "changeset": 10695640, + "user": "Eimai", + "uid": 6072 + }, { + "type": "node", + "id": 1634435397, + "lat": 51.2133918, + "lon": 3.2404416, + "timestamp": "2015-04-11T10:40:55Z", + "version": 2, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 1974988033, + "lat": 51.2127459, + "lon": 3.240928, + "timestamp": "2012-10-20T12:24:13Z", + "version": 1, + "changeset": 13566903, + "user": "skyman81", + "uid": 955688 + }, { + "type": "node", + "id": 3250129361, + "lat": 51.2127906, + "lon": 3.2409016, + "timestamp": "2018-12-19T00:00:33Z", + "version": 2, + "changeset": 65596519, + "user": "beardhatcode", + "uid": 5439560, + "tags": {"crossing": "traffic_signals", "highway": "crossing"} + }, { + "type": "node", + "id": 3250129363, + "lat": 51.2149189, + "lon": 3.2395571, + "timestamp": "2015-04-11T10:40:56Z", + "version": 2, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 3450326133, + "lat": 51.2139571, + "lon": 3.2401205, + "timestamp": "2015-04-11T10:40:26Z", + "version": 1, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 3450326135, + "lat": 51.2181385, + "lon": 3.2370893, + "timestamp": "2015-04-11T10:40:26Z", + "version": 1, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 4794847239, + "lat": 51.2191224, + "lon": 3.2362584, + "timestamp": "2019-08-27T23:07:05Z", + "version": 2, + "changeset": 73816461, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 8493044168, + "lat": 51.2130348, + "lon": 3.2407284, + "timestamp": "2021-03-06T21:52:51Z", + "version": 1, + "changeset": 100555232, + "user": "kaart_fietser", + "uid": 11022240, + "tags": {"highway": "traffic_signals", "traffic_signals": "traffic_lights"} + }, { + "type": "node", + "id": 8792687918, + "lat": 51.2207505, + "lon": 3.2348579, + "timestamp": "2021-06-02T18:27:15Z", + "version": 1, + "changeset": 105735092, + "user": "albertino", + "uid": 499281 + }, { + "type": "way", + "id": 143298912, + "timestamp": "2021-06-02T18:27:15Z", + "version": 15, + "changeset": 105735092, + "user": "albertino", + "uid": 499281, + "nodes": [1407529979, 1974988033, 3250129361, 1634435395, 8493044168, 875668688, 1634435396, 1634435397, 3450326133, 26343912, 3250129363, 1407529969, 26343913, 1407529961, 3450326135, 4794847239, 26343914, 26343915, 1109632177, 1109632153, 8792687918, 1109632154], + "tags": { + "cycleway:right": "track", + "highway": "primary", + "lanes": "2", + "lit": "yes", + "maxspeed": "70", + "name": "Buiten Kruisvest", + "oneway": "yes", + "ref": "R30", + "surface": "asphalt", + "wikipedia": "nl:Buiten Kruisvest" + } + }] + } ) @@ -394,7 +666,7 @@ export default class RelationSplitHandlerSpec extends T { allWaysNodesInOrder: withSplit }, "no-theme") const changeDescription = await splitter.CreateChangeDescriptions(new Changes()) - const allIds = changeDescription[0].changes["members"].map(m => m.type+"/"+ m.ref+"-->"+m.role).join(",") + const allIds = changeDescription[0].changes["members"].map(m => m.type + "/" + m.ref + "-->" + m.role).join(",") const expected = "way/318616190-->from,node/1407529979-->via,way/-1-->to" T.equals(expected, allIds) diff --git a/test/ReplaceGeometry.spec.ts b/test/ReplaceGeometry.spec.ts new file mode 100644 index 0000000000..4919914cc7 --- /dev/null +++ b/test/ReplaceGeometry.spec.ts @@ -0,0 +1,182 @@ +import T from "./TestHelper"; +import {Utils} from "../Utils"; + +export default class ReplaceGeometrySpec extends T { + constructor() { + super("ReplaceGeometry", [ + ["Simple house replacement", async () => { + const coordinates = <[number, number][]>[[ + 3.216690793633461, + 51.21474084112525 + ], + [ + 3.2167256623506546, + 51.214696737309964 + ], + [ + 3.2169999182224274, + 51.214768983537674 + ], + [ + 3.2169650495052338, + 51.21480720678671 + ], + [ + 3.2169368863105774, + 51.21480090625335 + ], + [ + 3.2169489562511444, + 51.21478074454077 + ], + [ + 3.216886594891548, + 51.214765203214625 + ], + [ + 3.2168812304735184, + 51.21477192378873 + ], + [ + 3.2168644666671753, + 51.214768983537674 + ], + [ + 3.2168537378311157, + 51.21478746511261 + ], + [ + 3.216690793633461, + 51.21474084112525 + ] + ] + + Utils.injectJsonDownloadForTests( + "https://www.openstreetmap.org/api/0.6/way/160909312/full", + { + "version": "0.6", + "generator": "CGImap 0.8.5 (920083 spike-06.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [{ + "type": "node", + "id": 1728823481, + "lat": 51.2146969, + "lon": 3.2167247, + "timestamp": "2017-07-18T22:52:45Z", + "version": 2, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 1728823483, + "lat": 51.2147409, + "lon": 3.216693, + "timestamp": "2017-07-18T22:52:45Z", + "version": 2, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 1728823514, + "lat": 51.2147863, + "lon": 3.2168551, + "timestamp": "2017-07-18T22:52:45Z", + "version": 2, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 1728823549, + "lat": 51.2147399, + "lon": 3.2168871, + "timestamp": "2017-07-18T22:52:46Z", + "version": 2, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 4978288381, + "lat": 51.2147638, + "lon": 3.2168856, + "timestamp": "2017-07-18T22:52:21Z", + "version": 1, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 4978289383, + "lat": 51.2147676, + "lon": 3.2169973, + "timestamp": "2017-07-18T22:52:21Z", + "version": 1, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 4978289384, + "lat": 51.2147683, + "lon": 3.2168674, + "timestamp": "2017-07-18T22:52:21Z", + "version": 1, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 4978289386, + "lat": 51.2147718, + "lon": 3.2168815, + "timestamp": "2017-07-18T22:52:21Z", + "version": 1, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 4978289388, + "lat": 51.2147884, + "lon": 3.2169829, + "timestamp": "2017-07-18T22:52:21Z", + "version": 1, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "way", + "id": 160909312, + "timestamp": "2017-07-18T22:52:30Z", + "version": 2, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209, + "nodes": [1728823483, 1728823514, 4978289384, 4978289386, 4978288381, 4978289388, 4978289383, 1728823549, 1728823481, 1728823483], + "tags": { + "addr:city": "Brugge", + "addr:country": "BE", + "addr:housenumber": "108", + "addr:postcode": "8000", + "addr:street": "Ezelstraat", + "building": "yes" + } + }] + } + ) + + + const wayId = "way/160909312" + const url = `https://www.openstreetmap.org/api/0.6/${wayId}/full`; + const rawData = await Utils.downloadJsonCached(url, 1000) + + + }] + ]); + } +} \ No newline at end of file diff --git a/test/SplitAction.spec.ts b/test/SplitAction.spec.ts index d251c9b21f..c476207a43 100644 --- a/test/SplitAction.spec.ts +++ b/test/SplitAction.spec.ts @@ -7,6 +7,290 @@ import {Utils} from "../Utils"; export default class SplitActionSpec extends T { + constructor() { + super("splitaction", [ + ["split 295132739", + () => SplitActionSpec.split().then(_ => console.log("OK"))], + ["split 295132739 on already existing node", + () => SplitActionSpec.splitWithPointReuse().then(_ => console.log("OK"))], + ["split 61435323 on already existing node", + () => SplitActionSpec.SplitHoutkaai().then(_ => console.log("OK"))], + ["Split test line", + async () => { + + Utils.injectJsonDownloadForTests( + "https://www.openstreetmap.org/api/0.6/way/941079939/full", + { + "version": "0.6", + "generator": "CGImap 0.8.5 (957273 spike-08.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [{ + "type": "node", + "id": 6490126559, + "lat": 51.2332219, + "lon": 3.1429387, + "timestamp": "2021-05-09T19:04:53Z", + "version": 2, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"highway": "street_lamp", "power": "pole", "support": "pole"} + }, { + "type": "node", + "id": 8715440363, + "lat": 51.2324011, + "lon": 3.1367377, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"fixme": "continue"} + }, { + "type": "node", + "id": 8715440364, + "lat": 51.232455, + "lon": 3.1368759, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440365, + "lat": 51.2325883, + "lon": 3.1373986, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440366, + "lat": 51.232688, + "lon": 3.1379837, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440367, + "lat": 51.2327354, + "lon": 3.1385649, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440368, + "lat": 51.2327042, + "lon": 3.1392187, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"highway": "street_lamp", "power": "pole", "support": "pole"} + }, { + "type": "node", + "id": 8715440369, + "lat": 51.2323902, + "lon": 3.139353, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440370, + "lat": 51.2321027, + "lon": 3.139601, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"highway": "street_lamp", "power": "pole", "ref": "242", "support": "pole"} + }, { + "type": "node", + "id": 8715440371, + "lat": 51.2322614, + "lon": 3.1401564, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440372, + "lat": 51.232378, + "lon": 3.1407909, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440373, + "lat": 51.2325532, + "lon": 3.1413659, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440374, + "lat": 51.2327611, + "lon": 3.1418877, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440375, + "lat": 51.2330037, + "lon": 3.142418, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "way", + "id": 941079939, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "nodes": [6490126559, 8715440375, 8715440374, 8715440373, 8715440372, 8715440371, 8715440370, 8715440369, 8715440368, 8715440367, 8715440366, 8715440365, 8715440364, 8715440363], + "tags": {"power": "minor_line"} + }] + } + ) + + Utils.injectJsonDownloadForTests( + "https://www.openstreetmap.org/api/0.6/way/941079939/relations", + { + "version": "0.6", + "generator": "CGImap 0.8.5 (2419440 spike-07.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [] + } + ) + + // Split points are lon,lat + const splitPointAroundP3: [number, number] = [3.1392198801040645, 51.232701022376745] + const splitAction = new SplitAction("way/941079939", [splitPointAroundP3], {theme: "test"}) + const changes = await splitAction.Perform(new Changes()) + console.log(changes) + // 8715440368 is the expected point of the split + + /* Nodes are + 6490126559 (part of ways 941079941 and 941079940) + 8715440375 + 8715440374 + 8715440373 + 8715440372 + 8715440371 + 8715440370 + 8715440369 + 8715440368 <--- split here + 8715440367 + 8715440366 + 8715440365 + 8715440364 + 8715440363 + */ + + const nodeList0 = [6490126559, + 8715440375, + 8715440374, + 8715440373, + 8715440372, + 8715440371, + 8715440370, + 8715440369, + 8715440368] + + const nodeList1 = [ + 8715440368, + 8715440367, + 8715440366, + 8715440365, + 8715440364, + 8715440363 + ] + + T.listIdentical(nodeList0, changes[0].changes["nodes"]) + T.listIdentical(nodeList1, changes[1].changes["nodes"]) + } + ], + ["Split minor powerline halfway", async () => { + + + const splitPointHalfway: [number, number] = [3.1392842531204224, 51.23255322710106] + const splitAction = new SplitAction("way/941079939", [splitPointHalfway], {theme: "test"}, 1) + const changes = await splitAction.Perform(new Changes()) + + const nodeList0 = [6490126559, + 8715440375, + 8715440374, + 8715440373, + 8715440372, + 8715440371, + 8715440370, + 8715440369, + -1] + + const nodeList1 = [ + -1, + 8715440368, + 8715440367, + 8715440366, + 8715440365, + 8715440364, + 8715440363 + ] + // THe first change is the creation of the new node + T.equals("node", changes[0].type) + T.equals(-1, changes[0].id) + + T.listIdentical(nodeList0, changes[1].changes["nodes"]) + T.listIdentical(nodeList1, changes[2].changes["nodes"]) + + } + ] + ]); + } + private static async split(): Promise { Utils.injectJsonDownloadForTests( @@ -214,7 +498,6 @@ export default class SplitActionSpec extends T { equal(changeDescription[2].changes["coordinates"][0][1], splitPoint[1]) } - private static async SplitHoutkaai(): Promise { Utils.injectJsonDownloadForTests( @@ -1824,288 +2107,4 @@ export default class SplitActionSpec extends T { equal(nodes0[nodes0.length - 1], nodes1[0]) equal(1507524610, nodes1[0]) } - - constructor() { - super("splitaction", [ - ["split 295132739", - () => SplitActionSpec.split().then(_ => console.log("OK"))], - ["split 295132739 on already existing node", - () => SplitActionSpec.splitWithPointReuse().then(_ => console.log("OK"))], - ["split 61435323 on already existing node", - () => SplitActionSpec.SplitHoutkaai().then(_ => console.log("OK"))], - ["Split test line", - async () => { - - Utils.injectJsonDownloadForTests( - "https://www.openstreetmap.org/api/0.6/way/941079939/full", - { - "version": "0.6", - "generator": "CGImap 0.8.5 (957273 spike-08.openstreetmap.org)", - "copyright": "OpenStreetMap and contributors", - "attribution": "http://www.openstreetmap.org/copyright", - "license": "http://opendatacommons.org/licenses/odbl/1-0/", - "elements": [{ - "type": "node", - "id": 6490126559, - "lat": 51.2332219, - "lon": 3.1429387, - "timestamp": "2021-05-09T19:04:53Z", - "version": 2, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"highway": "street_lamp", "power": "pole", "support": "pole"} - }, { - "type": "node", - "id": 8715440363, - "lat": 51.2324011, - "lon": 3.1367377, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"fixme": "continue"} - }, { - "type": "node", - "id": 8715440364, - "lat": 51.232455, - "lon": 3.1368759, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440365, - "lat": 51.2325883, - "lon": 3.1373986, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440366, - "lat": 51.232688, - "lon": 3.1379837, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440367, - "lat": 51.2327354, - "lon": 3.1385649, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440368, - "lat": 51.2327042, - "lon": 3.1392187, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"highway": "street_lamp", "power": "pole", "support": "pole"} - }, { - "type": "node", - "id": 8715440369, - "lat": 51.2323902, - "lon": 3.139353, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440370, - "lat": 51.2321027, - "lon": 3.139601, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"highway": "street_lamp", "power": "pole", "ref": "242", "support": "pole"} - }, { - "type": "node", - "id": 8715440371, - "lat": 51.2322614, - "lon": 3.1401564, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440372, - "lat": 51.232378, - "lon": 3.1407909, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440373, - "lat": 51.2325532, - "lon": 3.1413659, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440374, - "lat": 51.2327611, - "lon": 3.1418877, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440375, - "lat": 51.2330037, - "lon": 3.142418, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "way", - "id": 941079939, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "nodes": [6490126559, 8715440375, 8715440374, 8715440373, 8715440372, 8715440371, 8715440370, 8715440369, 8715440368, 8715440367, 8715440366, 8715440365, 8715440364, 8715440363], - "tags": {"power": "minor_line"} - }] - } - ) - - Utils.injectJsonDownloadForTests( - "https://www.openstreetmap.org/api/0.6/way/941079939/relations", - { - "version": "0.6", - "generator": "CGImap 0.8.5 (2419440 spike-07.openstreetmap.org)", - "copyright": "OpenStreetMap and contributors", - "attribution": "http://www.openstreetmap.org/copyright", - "license": "http://opendatacommons.org/licenses/odbl/1-0/", - "elements": [] - } - ) - - // Split points are lon,lat - const splitPointAroundP3: [number, number] = [3.1392198801040645, 51.232701022376745] - const splitAction = new SplitAction("way/941079939", [splitPointAroundP3], {theme: "test"}) - const changes = await splitAction.Perform(new Changes()) - console.log(changes) - // 8715440368 is the expected point of the split - - /* Nodes are - 6490126559 (part of ways 941079941 and 941079940) - 8715440375 - 8715440374 - 8715440373 - 8715440372 - 8715440371 - 8715440370 - 8715440369 - 8715440368 <--- split here - 8715440367 - 8715440366 - 8715440365 - 8715440364 - 8715440363 - */ - - const nodeList0 = [6490126559, - 8715440375, - 8715440374, - 8715440373, - 8715440372, - 8715440371, - 8715440370, - 8715440369, - 8715440368] - - const nodeList1 = [ - 8715440368, - 8715440367, - 8715440366, - 8715440365, - 8715440364, - 8715440363 - ] - - T.listIdentical(nodeList0, changes[0].changes["nodes"]) - T.listIdentical(nodeList1, changes[1].changes["nodes"]) - } - ], - ["Split minor powerline halfway", async () => { - - - const splitPointHalfway: [number, number] = [3.1392842531204224, 51.23255322710106] - const splitAction = new SplitAction("way/941079939", [splitPointHalfway], {theme: "test"}, 1) - const changes = await splitAction.Perform(new Changes()) - - const nodeList0 = [6490126559, - 8715440375, - 8715440374, - 8715440373, - 8715440372, - 8715440371, - 8715440370, - 8715440369, - -1] - - const nodeList1 = [ - -1, - 8715440368, - 8715440367, - 8715440366, - 8715440365, - 8715440364, - 8715440363 - ] - // THe first change is the creation of the new node - T.equals("node", changes[0].type) - T.equals(-1, changes[0].id) - - T.listIdentical(nodeList0, changes[1].changes["nodes"]) - T.listIdentical(nodeList1, changes[2].changes["nodes"]) - - } - ] - ]); - } } \ No newline at end of file diff --git a/test/Tag.spec.ts b/test/Tag.spec.ts index 833a7afc50..0180a15120 100644 --- a/test/Tag.spec.ts +++ b/test/Tag.spec.ts @@ -9,7 +9,6 @@ import {Tag} from "../Logic/Tags/Tag"; import {And} from "../Logic/Tags/And"; import {TagUtils} from "../Logic/Tags/TagUtils"; import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig"; -import {RegexTag} from "../Logic/Tags/RegexTag"; Utils.runningFromConsole = true; @@ -166,7 +165,7 @@ export default class TagSpec extends T { } ], condition: "x=" - }, undefined, "Tests"); + }, "Tests"); equal(undefined, tr.GetRenderValue({"foo": "bar"})); equal("Has no name", tr.GetRenderValue({"noname": "yes"})?.txt); @@ -483,7 +482,7 @@ export default class TagSpec extends T { ] }; - const tagRendering = new TagRenderingConfig(config, null, "test"); + const tagRendering = new TagRenderingConfig(config, "test"); equal(true, tagRendering.IsKnown({bottle: "yes"})) equal(false, tagRendering.IsKnown({})) }], diff --git a/test/TestAll.ts b/test/TestAll.ts index 9b23957d10..e6dc4f9e7c 100644 --- a/test/TestAll.ts +++ b/test/TestAll.ts @@ -13,6 +13,7 @@ import TileFreshnessCalculatorSpec from "./TileFreshnessCalculator.spec"; import WikidataSpecTest from "./Wikidata.spec.test"; import ImageProviderSpec from "./ImageProvider.spec"; import ActorsSpec from "./Actors.spec"; +import ReplaceGeometrySpec from "./ReplaceGeometry.spec"; ScriptUtils.fixUtils() @@ -29,14 +30,15 @@ const allTests = [ new TileFreshnessCalculatorSpec(), new WikidataSpecTest(), new ImageProviderSpec(), - new ActorsSpec() + new ActorsSpec(), + new ReplaceGeometrySpec() ] Utils.externalDownloadFunction = async (url) => { console.error("Fetching ", url, "blocked in tests, use Utils.injectJsonDownloadForTests") const data = await ScriptUtils.DownloadJSON(url) console.log("\n\n ----------- \nBLOCKED DATA\n Utils.injectJsonDownloadForTests(\n" + - " ", JSON.stringify(url),", \n", + " ", JSON.stringify(url), ", \n", " ", JSON.stringify(data), "\n )\n------------------\n\n") throw "Detected internet access for URL " + url + ", please inject it with Utils.injectJsonDownloadForTests" } @@ -53,7 +55,7 @@ if (args.length > 0) { } if (testsToRun.length == 0) { - throw "No tests found. Try one of "+allTests.map(t => t.name).join(", ") + throw "No tests found. Try one of " + allTests.map(t => t.name).join(", ") } for (let i = 0; i < testsToRun.length; i++) { diff --git a/test/TestHelper.ts b/test/TestHelper.ts index ab7139160e..3e31130f29 100644 --- a/test/TestHelper.ts +++ b/test/TestHelper.ts @@ -8,28 +8,6 @@ export default class T { this._tests = tests; } - /** - * RUns the test, returns the error messages. - * Returns an empty list if successful - * @constructor - */ - public Run(): ({ testsuite: string, name: string, msg: string } []) { - const failures: { testsuite: string, name: string, msg: string } [] = [] - for (const [name, test] of this._tests) { - try { - test(); - } catch (e) { - console.log("ERROR: ", e, e.stack) - failures.push({testsuite: this.name, name: name, msg: "" + e}); - } - } - if (failures.length == 0) { - return undefined - } else { - return failures - } - } - static assertContains(needle: string, actual: string) { if (actual.indexOf(needle) < 0) { throw `The substring ${needle} was not found` @@ -57,10 +35,10 @@ export default class T { } static listIdentical(expected: T[], actual: T[]): void { - if(expected === undefined){ + if (expected === undefined) { throw "ListIdentical failed: expected list is undefined" } - if(actual === undefined){ + if (actual === undefined) { throw "ListIdentical failed: actual list is undefined" } if (expected.length !== actual.length) { @@ -68,8 +46,30 @@ export default class T { } for (let i = 0; i < expected.length; i++) { if (expected[i] !== actual[i]) { - throw `ListIdentical failed at index ${i}: expected ${expected[i]} but got ${actual[i]}` + throw `ListIdentical failed at index ${i}: expected ${expected[i]} but got ${actual[i]}` } } } + + /** + * RUns the test, returns the error messages. + * Returns an empty list if successful + * @constructor + */ + public Run(): ({ testsuite: string, name: string, msg: string } []) { + const failures: { testsuite: string, name: string, msg: string } [] = [] + for (const [name, test] of this._tests) { + try { + test(); + } catch (e) { + console.log("ERROR: ", e, e.stack) + failures.push({testsuite: this.name, name: name, msg: "" + e}); + } + } + if (failures.length == 0) { + return undefined + } else { + return failures + } + } } diff --git a/test/TileFreshnessCalculator.spec.ts b/test/TileFreshnessCalculator.spec.ts index 6305b9a5dc..7f5540d15a 100644 --- a/test/TileFreshnessCalculator.spec.ts +++ b/test/TileFreshnessCalculator.spec.ts @@ -19,9 +19,9 @@ export default class TileFreshnessCalculatorSpec extends T { equal(42, calc.freshnessFor(20, 266406 * 2, 175534 * 2 + 1).getTime()) equal(undefined, calc.freshnessFor(19, 266406, 175535)) equal(undefined, calc.freshnessFor(18, 266406 / 2, 175534 / 2)) - calc.addTileLoad(Tiles.tile_index(19, 266406, 175534+1), date) - calc.addTileLoad(Tiles.tile_index(19, 266406+1, 175534), date) - calc.addTileLoad(Tiles.tile_index(19, 266406+1, 175534+1), date) + calc.addTileLoad(Tiles.tile_index(19, 266406, 175534 + 1), date) + calc.addTileLoad(Tiles.tile_index(19, 266406 + 1, 175534), date) + calc.addTileLoad(Tiles.tile_index(19, 266406 + 1, 175534 + 1), date) equal(42, calc.freshnessFor(18, 266406 / 2, 175534 / 2).getTime()) } ] diff --git a/test/Utils.spec.ts b/test/Utils.spec.ts index fd630257d0..4a592bf3c2 100644 --- a/test/Utils.spec.ts +++ b/test/Utils.spec.ts @@ -43,7 +43,7 @@ export default class UtilsSpec extends T { ["Sort object keys", () => { const o = { x: 'x', - abc: {'x':'x','a':'a'}, + abc: {'x': 'x', 'a': 'a'}, def: 'def' } equal('{"x":"x","abc":{"x":"x","a":"a"},"def":"def"}', JSON.stringify(o)) diff --git a/test/Wikidata.spec.test.ts b/test/Wikidata.spec.test.ts index f2a7bb25a9..cf636ffc2f 100644 --- a/test/Wikidata.spec.test.ts +++ b/test/Wikidata.spec.test.ts @@ -1,17 +1,7266 @@ import Wikidata from "../Logic/Web/Wikidata"; -import * as assert from "assert"; import {equal} from "assert"; import T from "./TestHelper"; import {Utils} from "../Utils"; export default class WikidataSpecTest extends T { + private static Q140 = { + "entities": { + "Q140": { + "pageid": 275, + "ns": 0, + "title": "Q140", + "lastrevid": 1503881580, + "modified": "2021-09-26T19:53:55Z", + "type": "item", + "id": "Q140", + "labels": { + "fr": {"language": "fr", "value": "lion"}, + "it": {"language": "it", "value": "leone"}, + "nb": {"language": "nb", "value": "l\u00f8ve"}, + "ru": {"language": "ru", "value": "\u043b\u0435\u0432"}, + "de": {"language": "de", "value": "L\u00f6we"}, + "es": {"language": "es", "value": "le\u00f3n"}, + "nn": {"language": "nn", "value": "l\u00f8ve"}, + "da": {"language": "da", "value": "l\u00f8ve"}, + "af": {"language": "af", "value": "leeu"}, + "ar": {"language": "ar", "value": "\u0623\u0633\u062f"}, + "bg": {"language": "bg", "value": "\u043b\u044a\u0432"}, + "bn": {"language": "bn", "value": "\u09b8\u09bf\u0982\u09b9"}, + "br": {"language": "br", "value": "leon"}, + "bs": {"language": "bs", "value": "lav"}, + "ca": {"language": "ca", "value": "lle\u00f3"}, + "cs": {"language": "cs", "value": "lev"}, + "el": {"language": "el", "value": "\u03bb\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9"}, + "fi": {"language": "fi", "value": "leijona"}, + "ga": {"language": "ga", "value": "leon"}, + "gl": {"language": "gl", "value": "Le\u00f3n"}, + "gu": {"language": "gu", "value": "\u0ab8\u0abf\u0a82\u0ab9"}, + "he": {"language": "he", "value": "\u05d0\u05e8\u05d9\u05d4"}, + "hi": {"language": "hi", "value": "\u0938\u093f\u0902\u0939"}, + "hu": {"language": "hu", "value": "oroszl\u00e1n"}, + "id": {"language": "id", "value": "Singa"}, + "ja": {"language": "ja", "value": "\u30e9\u30a4\u30aa\u30f3"}, + "ko": {"language": "ko", "value": "\uc0ac\uc790"}, + "mk": {"language": "mk", "value": "\u043b\u0430\u0432"}, + "ml": {"language": "ml", "value": "\u0d38\u0d3f\u0d02\u0d39\u0d02"}, + "mr": {"language": "mr", "value": "\u0938\u093f\u0902\u0939"}, + "my": {"language": "my", "value": "\u1001\u103c\u1004\u103a\u1039\u101e\u1031\u1037"}, + "ne": {"language": "ne", "value": "\u0938\u093f\u0902\u0939"}, + "nl": {"language": "nl", "value": "leeuw"}, + "pl": {"language": "pl", "value": "lew afryka\u0144ski"}, + "pt": {"language": "pt", "value": "le\u00e3o"}, + "pt-br": {"language": "pt-br", "value": "le\u00e3o"}, + "scn": {"language": "scn", "value": "liuni"}, + "sq": {"language": "sq", "value": "Luani"}, + "sr": {"language": "sr", "value": "\u043b\u0430\u0432"}, + "sw": {"language": "sw", "value": "simba"}, + "ta": {"language": "ta", "value": "\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd"}, + "te": {"language": "te", "value": "\u0c38\u0c3f\u0c02\u0c39\u0c02"}, + "th": {"language": "th", "value": "\u0e2a\u0e34\u0e07\u0e42\u0e15"}, + "tr": {"language": "tr", "value": "aslan"}, + "uk": {"language": "uk", "value": "\u043b\u0435\u0432"}, + "vi": {"language": "vi", "value": "s\u01b0 t\u1eed"}, + "zh": {"language": "zh", "value": "\u7345\u5b50"}, + "sco": {"language": "sco", "value": "lion"}, + "zh-hant": {"language": "zh-hant", "value": "\u7345\u5b50"}, + "fa": {"language": "fa", "value": "\u0634\u06cc\u0631"}, + "zh-hans": {"language": "zh-hans", "value": "\u72ee\u5b50"}, + "ee": {"language": "ee", "value": "Dzata"}, + "ilo": {"language": "ilo", "value": "leon"}, + "ksh": {"language": "ksh", "value": "L\u00f6hv"}, + "zh-hk": {"language": "zh-hk", "value": "\u7345\u5b50"}, + "as": {"language": "as", "value": "\u09b8\u09bf\u0982\u09b9"}, + "zh-cn": {"language": "zh-cn", "value": "\u72ee\u5b50"}, + "zh-mo": {"language": "zh-mo", "value": "\u7345\u5b50"}, + "zh-my": {"language": "zh-my", "value": "\u72ee\u5b50"}, + "zh-sg": {"language": "zh-sg", "value": "\u72ee\u5b50"}, + "zh-tw": {"language": "zh-tw", "value": "\u7345\u5b50"}, + "ast": {"language": "ast", "value": "lle\u00f3n"}, + "sat": {"language": "sat", "value": "\u1c61\u1c5f\u1c74\u1c5f\u1c60\u1c69\u1c5e"}, + "bho": {"language": "bho", "value": "\u0938\u093f\u0902\u0939"}, + "en": {"language": "en", "value": "lion"}, + "ks": {"language": "ks", "value": "\u067e\u0627\u062f\u064e\u0631 \u0633\u0655\u06c1\u06c1"}, + "be-tarask": {"language": "be-tarask", "value": "\u043b\u0435\u045e"}, + "nan": {"language": "nan", "value": "Sai"}, + "la": {"language": "la", "value": "leo"}, + "en-ca": {"language": "en-ca", "value": "Lion"}, + "en-gb": {"language": "en-gb", "value": "lion"}, + "ab": {"language": "ab", "value": "\u0410\u043b\u044b\u043c"}, + "am": {"language": "am", "value": "\u12a0\u1295\u1260\u1233"}, + "an": {"language": "an", "value": "Panthera leo"}, + "ang": {"language": "ang", "value": "L\u0113o"}, + "arc": {"language": "arc", "value": "\u0710\u072a\u071d\u0710"}, + "arz": {"language": "arz", "value": "\u0633\u0628\u0639"}, + "av": {"language": "av", "value": "\u0413\u044a\u0430\u043b\u0431\u0430\u0446\u04c0"}, + "az": {"language": "az", "value": "\u015eir"}, + "ba": {"language": "ba", "value": "\u0410\u0440\u044b\u04ab\u043b\u0430\u043d"}, + "be": {"language": "be", "value": "\u043b\u0435\u045e"}, + "bo": {"language": "bo", "value": "\u0f66\u0f7a\u0f44\u0f0b\u0f42\u0f7a\u0f0d"}, + "bpy": {"language": "bpy", "value": "\u09a8\u0982\u09b8\u09be"}, + "bxr": {"language": "bxr", "value": "\u0410\u0440\u0441\u0430\u043b\u0430\u043d"}, + "ce": {"language": "ce", "value": "\u041b\u043e\u043c"}, + "chr": {"language": "chr", "value": "\u13e2\u13d3\u13e5 \u13a4\u13cd\u13c6\u13b4\u13c2"}, + "chy": {"language": "chy", "value": "P\u00e9hpe'\u00e9nan\u00f3se'hame"}, + "ckb": {"language": "ckb", "value": "\u0634\u06ce\u0631"}, + "co": {"language": "co", "value": "Lionu"}, + "csb": {"language": "csb", "value": "Lew"}, + "cu": {"language": "cu", "value": "\u041b\u044c\u0432\u044a"}, + "cv": {"language": "cv", "value": "\u0410\u0440\u0103\u0441\u043b\u0430\u043d"}, + "cy": {"language": "cy", "value": "Llew"}, + "dsb": {"language": "dsb", "value": "law"}, + "eo": {"language": "eo", "value": "leono"}, + "et": {"language": "et", "value": "l\u00f5vi"}, + "eu": {"language": "eu", "value": "lehoi"}, + "fo": {"language": "fo", "value": "leyvur"}, + "frr": {"language": "frr", "value": "l\u00f6\u00f6w"}, + "gag": {"language": "gag", "value": "aslan"}, + "gd": {"language": "gd", "value": "le\u00f2mhann"}, + "gn": {"language": "gn", "value": "Le\u00f5"}, + "got": {"language": "got", "value": "\ud800\udf3b\ud800\udf39\ud800\udf45\ud800\udf30/Liwa"}, + "ha": {"language": "ha", "value": "Zaki"}, + "hak": {"language": "hak", "value": "S\u1e73\u0302-\u00e9"}, + "haw": {"language": "haw", "value": "Liona"}, + "hif": {"language": "hif", "value": "Ser"}, + "hr": {"language": "hr", "value": "lav"}, + "hsb": {"language": "hsb", "value": "law"}, + "ht": {"language": "ht", "value": "Lyon"}, + "hy": {"language": "hy", "value": "\u0561\u057c\u0575\u0578\u0582\u056e"}, + "ia": {"language": "ia", "value": "Panthera leo"}, + "ig": {"language": "ig", "value": "Od\u00fam"}, + "io": {"language": "io", "value": "leono"}, + "is": {"language": "is", "value": "lj\u00f3n"}, + "jbo": {"language": "jbo", "value": "cinfo"}, + "jv": {"language": "jv", "value": "Singa"}, + "ka": {"language": "ka", "value": "\u10da\u10dd\u10db\u10d8"}, + "kab": {"language": "kab", "value": "Izem"}, + "kbd": {"language": "kbd", "value": "\u0425\u044c\u044d\u0449"}, + "kg": {"language": "kg", "value": "Nkosi"}, + "kk": {"language": "kk", "value": "\u0410\u0440\u044b\u0441\u0442\u0430\u043d"}, + "kn": {"language": "kn", "value": "\u0cb8\u0cbf\u0c82\u0cb9"}, + "ku": {"language": "ku", "value": "\u015e\u00ear"}, + "lb": {"language": "lb", "value": "L\u00e9iw"}, + "lbe": {"language": "lbe", "value": "\u0410\u0441\u043b\u0430\u043d"}, + "lez": {"language": "lez", "value": "\u0410\u0441\u043b\u0430\u043d"}, + "li": {"language": "li", "value": "Liew"}, + "lij": {"language": "lij", "value": "Lion"}, + "ln": {"language": "ln", "value": "Nk\u0254\u0301si"}, + "lt": {"language": "lt", "value": "li\u016btas"}, + "ltg": {"language": "ltg", "value": "\u013bovs"}, + "lv": {"language": "lv", "value": "lauva"}, + "mdf": {"language": "mdf", "value": "\u041e\u0440\u043a\u0441\u043e\u0444\u0442\u0430"}, + "mhr": {"language": "mhr", "value": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d"}, + "mn": {"language": "mn", "value": "\u0410\u0440\u0441\u043b\u0430\u043d"}, + "mrj": {"language": "mrj", "value": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d"}, + "ms": {"language": "ms", "value": "Singa"}, + "mt": {"language": "mt", "value": "iljun"}, + "nah": {"language": "nah", "value": "Cu\u0101miztli"}, + "nrm": {"language": "nrm", "value": "lion"}, + "su": {"language": "su", "value": "Singa"}, + "de-ch": {"language": "de-ch", "value": "L\u00f6we"}, + "ky": {"language": "ky", "value": "\u0410\u0440\u0441\u0442\u0430\u043d"}, + "lmo": {"language": "lmo", "value": "Panthera leo"}, + "ceb": {"language": "ceb", "value": "Panthera leo"}, + "diq": {"language": "diq", "value": "\u015e\u00ear"}, + "new": {"language": "new", "value": "\u0938\u093f\u0902\u0939"}, + "nds": {"language": "nds", "value": "L\u00f6\u00f6w"}, + "ak": {"language": "ak", "value": "Gyata"}, + "cdo": {"language": "cdo", "value": "S\u0103i"}, + "ady": {"language": "ady", "value": "\u0410\u0441\u043b\u044a\u0430\u043d"}, + "azb": {"language": "azb", "value": "\u0622\u0633\u0644\u0627\u0646"}, + "lfn": {"language": "lfn", "value": "Leon"}, + "kbp": {"language": "kbp", "value": "T\u0254\u0254y\u028b\u028b"}, + "gsw": {"language": "gsw", "value": "L\u00f6we"}, + "din": {"language": "din", "value": "K\u00f6r"}, + "inh": {"language": "inh", "value": "\u041b\u043e\u043c"}, + "bm": {"language": "bm", "value": "Waraba"}, + "hyw": {"language": "hyw", "value": "\u0531\u057c\u056b\u0582\u056e"}, + "nds-nl": {"language": "nds-nl", "value": "leeuw"}, + "kw": {"language": "kw", "value": "Lew"}, + "ext": {"language": "ext", "value": "Le\u00f3n"}, + "bcl": {"language": "bcl", "value": "Leon"}, + "mg": {"language": "mg", "value": "Liona"}, + "lld": {"language": "lld", "value": "Lion"}, + "lzh": {"language": "lzh", "value": "\u7345"}, + "ary": {"language": "ary", "value": "\u0633\u0628\u0639"}, + "sv": {"language": "sv", "value": "lejon"}, + "nso": {"language": "nso", "value": "Tau"}, + "nv": { + "language": "nv", + "value": "N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed" + }, + "oc": {"language": "oc", "value": "panthera leo"}, + "or": {"language": "or", "value": "\u0b38\u0b3f\u0b02\u0b39"}, + "os": {"language": "os", "value": "\u0426\u043e\u043c\u0430\u0445\u044a"}, + "pa": {"language": "pa", "value": "\u0a38\u0a3c\u0a47\u0a30"}, + "pam": {"language": "pam", "value": "Leon"}, + "pcd": {"language": "pcd", "value": "Lion"}, + "pms": {"language": "pms", "value": "Lion"}, + "pnb": {"language": "pnb", "value": "\u0628\u0628\u0631 \u0634\u06cc\u0631"}, + "ps": {"language": "ps", "value": "\u0632\u0645\u0631\u06cc"}, + "qu": {"language": "qu", "value": "Liyun"}, + "rn": {"language": "rn", "value": "Intare"}, + "ro": {"language": "ro", "value": "Leul"}, + "sl": {"language": "sl", "value": "lev"}, + "sn": {"language": "sn", "value": "Shumba"}, + "so": {"language": "so", "value": "Libaax"}, + "ss": {"language": "ss", "value": "Libubesi"}, + "st": {"language": "st", "value": "Tau"}, + "stq": {"language": "stq", "value": "Leeuwe"}, + "sr-ec": {"language": "sr-ec", "value": "\u043b\u0430\u0432"}, + "sr-el": {"language": "sr-el", "value": "lav"}, + "rm": {"language": "rm", "value": "Liun"}, + "sm": {"language": "sm", "value": "Leona"}, + "tcy": {"language": "tcy", "value": "\u0cb8\u0cbf\u0cae\u0ccd\u0cae"}, + "szl": {"language": "szl", "value": "Lew"}, + "rue": {"language": "rue", "value": "\u041b\u0435\u0432"}, + "rw": {"language": "rw", "value": "Intare"}, + "sah": {"language": "sah", "value": "\u0425\u0430\u0445\u0430\u0439"}, + "sh": {"language": "sh", "value": "Lav"}, + "sk": {"language": "sk", "value": "lev p\u00fa\u0161\u0165ov\u00fd"}, + "tg": {"language": "tg", "value": "\u0428\u0435\u0440"}, + "ti": {"language": "ti", "value": "\u12a3\u1295\u1260\u1233"}, + "tl": {"language": "tl", "value": "Leon"}, + "tum": {"language": "tum", "value": "Nkhalamu"}, + "udm": {"language": "udm", "value": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d"}, + "ug": {"language": "ug", "value": "\u0634\u0649\u0631"}, + "ur": {"language": "ur", "value": "\u0628\u0628\u0631"}, + "vec": {"language": "vec", "value": "Leon"}, + "vep": {"language": "vep", "value": "lev"}, + "vls": {"language": "vls", "value": "l\u00eaeuw"}, + "war": {"language": "war", "value": "leon"}, + "wo": {"language": "wo", "value": "gaynde"}, + "xal": {"language": "xal", "value": "\u0410\u0440\u0441\u043b\u04a3"}, + "xmf": {"language": "xmf", "value": "\u10dc\u10ef\u10d8\u10da\u10dd"}, + "yi": {"language": "yi", "value": "\u05dc\u05d9\u05d9\u05d1"}, + "yo": {"language": "yo", "value": "K\u00ecn\u00ec\u00fan"}, + "yue": {"language": "yue", "value": "\u7345\u5b50"}, + "zu": {"language": "zu", "value": "ibhubesi"}, + "tk": {"language": "tk", "value": "\u00ddolbars"}, + "tt": {"language": "tt", "value": "\u0430\u0440\u044b\u0441\u043b\u0430\u043d"}, + "uz": {"language": "uz", "value": "Arslon"}, + "se": {"language": "se", "value": "Ledjon"}, + "si": {"language": "si", "value": "\u0dc3\u0dd2\u0d82\u0dc4\u0dba\u0dcf"}, + "sgs": {"language": "sgs", "value": "Li\u016bts"}, + "vro": {"language": "vro", "value": "L\u00f5vi"}, + "xh": {"language": "xh", "value": "Ingonyama"}, + "sa": {"language": "sa", "value": "\u0938\u093f\u0902\u0939\u0903 \u092a\u0936\u0941\u0903"}, + "za": {"language": "za", "value": "Saeceij"}, + "sd": {"language": "sd", "value": "\u0628\u0628\u0631 \u0634\u064a\u0646\u0647\u0646"}, + "wuu": {"language": "wuu", "value": "\u72ee"}, + "shn": {"language": "shn", "value": "\u101e\u1062\u1004\u103a\u1087\u101e\u102e\u1088"}, + "alt": {"language": "alt", "value": "\u0410\u0440\u0441\u043b\u0430\u043d"}, + "avk": {"language": "avk", "value": "Krapol (Panthera leo)"}, + "dag": {"language": "dag", "value": "Gbu\u0263inli"}, + "shi": {"language": "shi", "value": "Agrzam"}, + "mni": {"language": "mni", "value": "\uabc5\uabe3\uabe1\uabc1\uabe5"} + }, + "descriptions": { + "fr": {"language": "fr", "value": "esp\u00e8ce de mammif\u00e8res carnivores"}, + "it": {"language": "it", "value": "mammifero carnivoro della famiglia dei Felidi"}, + "nb": {"language": "nb", "value": "kattedyr"}, + "ru": { + "language": "ru", + "value": "\u0432\u0438\u0434 \u0445\u0438\u0449\u043d\u044b\u0445 \u043c\u043b\u0435\u043a\u043e\u043f\u0438\u0442\u0430\u044e\u0449\u0438\u0445" + }, + "de": {"language": "de", "value": "Art der Gattung Eigentliche Gro\u00dfkatzen (Panthera)"}, + "es": {"language": "es", "value": "mam\u00edfero carn\u00edvoro de la familia de los f\u00e9lidos"}, + "en": {"language": "en", "value": "species of big cat"}, + "ko": { + "language": "ko", + "value": "\uace0\uc591\uc774\uacfc\uc5d0 \uc18d\ud558\ub294 \uc721\uc2dd\ub3d9\ubb3c" + }, + "ca": {"language": "ca", "value": "mam\u00edfer carn\u00edvor de la fam\u00edlia dels f\u00e8lids"}, + "fi": {"language": "fi", "value": "suuri kissael\u00e4in"}, + "pt-br": { + "language": "pt-br", + "value": "esp\u00e9cie de mam\u00edfero carn\u00edvoro do g\u00eanero Panthera e da fam\u00edlia Felidae" + }, + "ta": {"language": "ta", "value": "\u0bb5\u0bbf\u0bb2\u0b99\u0bcd\u0b95\u0bc1"}, + "nl": {"language": "nl", "value": "groot roofdier uit de familie der katachtigen"}, + "he": { + "language": "he", + "value": "\u05de\u05d9\u05df \u05d1\u05e1\u05d5\u05d2 \u05e4\u05e0\u05ea\u05e8, \u05d8\u05d5\u05e8\u05e3 \u05d2\u05d3\u05d5\u05dc \u05d1\u05de\u05e9\u05e4\u05d7\u05ea \u05d4\u05d7\u05ea\u05d5\u05dc\u05d9\u05d9\u05dd" + }, + "pt": {"language": "pt", "value": "esp\u00e9cie de felino"}, + "sco": {"language": "sco", "value": "species o big cat"}, + "zh-hans": {"language": "zh-hans", "value": "\u5927\u578b\u732b\u79d1\u52a8\u7269"}, + "uk": { + "language": "uk", + "value": "\u0432\u0438\u0434 \u043a\u043b\u0430\u0441\u0443 \u0441\u0441\u0430\u0432\u0446\u0456\u0432, \u0440\u044f\u0434\u0443 \u0445\u0438\u0436\u0438\u0445, \u0440\u043e\u0434\u0438\u043d\u0438 \u043a\u043e\u0442\u044f\u0447\u0438\u0445" + }, + "hu": { + "language": "hu", + "value": "macskaf\u00e9l\u00e9k csal\u00e1dj\u00e1ba tartoz\u00f3 eml\u0151sfaj" + }, + "bn": { + "language": "bn", + "value": "\u099c\u0999\u09cd\u0997\u09b2\u09c7\u09b0 \u09b0\u09be\u099c\u09be" + }, + "hi": {"language": "hi", "value": "\u091c\u0902\u0917\u0932 \u0915\u093e \u0930\u093e\u091c\u093e"}, + "ilo": {"language": "ilo", "value": "sebbangan ti dakkel a pusa"}, + "ksh": { + "language": "ksh", + "value": "et jr\u00fch\u00dfde Kazedier op der \u00c4hd, der K\u00fcnning vun de Diehre" + }, + "fa": { + "language": "fa", + "value": "\u06af\u0631\u0628\u0647\u200c \u0628\u0632\u0631\u06af \u0628\u0648\u0645\u06cc \u0622\u0641\u0631\u06cc\u0642\u0627 \u0648 \u0622\u0633\u06cc\u0627" + }, + "gl": { + "language": "gl", + "value": "\u00e9 un mam\u00edfero carn\u00edvoro da familia dos f\u00e9lidos e unha das 4 especies do x\u00e9nero Panthera" + }, + "sq": {"language": "sq", "value": "mace e madhe e familjes Felidae"}, + "el": { + "language": "el", + "value": "\u03b5\u03af\u03b4\u03bf\u03c2 \u03c3\u03b1\u03c1\u03ba\u03bf\u03c6\u03ac\u03b3\u03bf \u03b8\u03b7\u03bb\u03b1\u03c3\u03c4\u03b9\u03ba\u03cc" + }, + "scn": {"language": "scn", "value": "specia di mamm\u00ecfiru"}, + "bg": { + "language": "bg", + "value": "\u0432\u0438\u0434 \u0431\u043e\u0437\u0430\u0439\u043d\u0438\u043a" + }, + "ne": { + "language": "ne", + "value": "\u0920\u0942\u0932\u094b \u092c\u093f\u0930\u093e\u0932\u094b\u0915\u094b \u092a\u094d\u0930\u091c\u093e\u0924\u093f" + }, + "pl": {"language": "pl", "value": "gatunek ssaka z rodziny kotowatych"}, + "af": { + "language": "af", + "value": "Soogdier en roofdier van die familie Felidae, een van die \"groot katte\"" + }, + "mk": { + "language": "mk", + "value": "\u0432\u0438\u0434 \u0433\u043e\u043b\u0435\u043c\u0430 \u043c\u0430\u0447\u043a\u0430" + }, + "nn": {"language": "nn", "value": "kattedyr"}, + "zh-hant": {"language": "zh-hant", "value": "\u5927\u578b\u8c93\u79d1\u52d5\u7269"}, + "zh": { + "language": "zh", + "value": "\u4ea7\u81ea\u975e\u6d32\u548c\u4e9a\u6d32\u7684\u5927\u578b\u732b\u79d1\u52a8\u7269" + }, + "zh-cn": {"language": "zh-cn", "value": "\u5927\u578b\u732b\u79d1\u52a8\u7269"}, + "zh-hk": {"language": "zh-hk", "value": "\u5927\u578b\u8c93\u79d1\u52d5\u7269"}, + "zh-mo": {"language": "zh-mo", "value": "\u5927\u578b\u8c93\u79d1\u52d5\u7269"}, + "zh-my": {"language": "zh-my", "value": "\u5927\u578b\u732b\u79d1\u52a8\u7269"}, + "zh-sg": {"language": "zh-sg", "value": "\u5927\u578b\u732b\u79d1\u52a8\u7269"}, + "zh-tw": {"language": "zh-tw", "value": "\u5927\u578b\u8c93\u79d1\u52d5\u7269"}, + "sw": {"language": "sw", "value": "mnyama mla nyama kama paka mkubwa"}, + "th": { + "language": "th", + "value": "\u0e0a\u0e37\u0e48\u0e2d\u0e2a\u0e31\u0e15\u0e27\u0e4c\u0e1b\u0e48\u0e32\u0e0a\u0e19\u0e34\u0e14\u0e2b\u0e19\u0e36\u0e48\u0e07 \u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e2a\u0e32\u0e22\u0e1e\u0e31\u0e19\u0e18\u0e38\u0e4c\u0e02\u0e2d\u0e07\u0e41\u0e21\u0e27\u0e43\u0e2b\u0e0d\u0e48" + }, + "ar": { + "language": "ar", + "value": "\u062d\u064a\u0648\u0627\u0646 \u0645\u0646 \u0627\u0644\u062b\u062f\u064a\u064a\u0627\u062a \u0645\u0646 \u0641\u0635\u064a\u0644\u0629 \u0627\u0644\u0633\u0646\u0648\u0631\u064a\u0627\u062a \u0648\u0623\u062d\u062f \u0627\u0644\u0633\u0646\u0648\u0631\u064a\u0627\u062a \u0627\u0644\u0623\u0631\u0628\u0639\u0629 \u0627\u0644\u0643\u0628\u064a\u0631\u0629 \u0627\u0644\u0645\u0646\u062a\u0645\u064a\u0629 \u0644\u062c\u0646\u0633 \u0627\u0644\u0646\u0645\u0631" + }, + "ml": { + "language": "ml", + "value": "\u0d38\u0d38\u0d4d\u0d24\u0d28\u0d3f\u0d15\u0d33\u0d3f\u0d32\u0d46 \u0d2b\u0d46\u0d32\u0d3f\u0d21\u0d47 \u0d15\u0d41\u0d1f\u0d41\u0d02\u0d2c\u0d24\u0d4d\u0d24\u0d3f\u0d32\u0d46 \u0d2a\u0d3e\u0d28\u0d4d\u0d24\u0d31 \u0d1c\u0d28\u0d41\u0d38\u0d4d\u0d38\u0d3f\u0d7d \u0d09\u0d7e\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f \u0d12\u0d30\u0d41 \u0d35\u0d28\u0d4d\u0d2f\u0d1c\u0d40\u0d35\u0d3f\u0d2f\u0d3e\u0d23\u0d4d \u0d38\u0d3f\u0d02\u0d39\u0d02" + }, + "cs": {"language": "cs", "value": "ko\u010dkovit\u00e1 \u0161elma"}, + "gu": { + "language": "gu", + "value": "\u0aac\u0abf\u0ab2\u0abe\u0aa1\u0ac0 \u0ab5\u0a82\u0ab6\u0aa8\u0ac1\u0a82 \u0ab8\u0ab8\u0acd\u0aa4\u0aa8 \u0aaa\u0acd\u0ab0\u0abe\u0aa3\u0ac0" + }, + "mr": { + "language": "mr", + "value": "\u092e\u093e\u0902\u091c\u0930\u093e\u091a\u0940 \u092e\u094b\u0920\u0940 \u091c\u093e\u0924" + }, + "sr": { + "language": "sr", + "value": "\u0432\u0435\u043b\u0438\u043a\u0438 \u0441\u0438\u0441\u0430\u0440 \u0438\u0437 \u043f\u043e\u0440\u043e\u0434\u0438\u0446\u0435 \u043c\u0430\u0447\u0430\u043a\u0430" + }, + "ast": {"language": "ast", "value": "especie de mam\u00edferu carn\u00edvoru"}, + "te": { + "language": "te", + "value": "\u0c2a\u0c46\u0c26\u0c4d\u0c26 \u0c2a\u0c3f\u0c32\u0c4d\u0c32\u0c3f \u0c1c\u0c24\u0c3f" + }, + "bho": { + "language": "bho", + "value": "\u092c\u093f\u0932\u093e\u0930\u092c\u0902\u0938 \u0915\u0947 \u092c\u0921\u093c\u0939\u0928 \u091c\u093e\u0928\u0935\u0930" + }, + "da": {"language": "da", "value": "en af de fem store katte i sl\u00e6gten Panthera"}, + "vi": {"language": "vi", "value": "M\u1ed9t lo\u00e0i m\u00e8o l\u1edbn thu\u1ed9c chi Panthera"}, + "ja": {"language": "ja", "value": "\u98df\u8089\u76ee\u30cd\u30b3\u79d1\u306e\u52d5\u7269"}, + "ga": {"language": "ga", "value": "speiceas cat"}, + "bs": {"language": "bs", "value": "vrsta velike ma\u010dke"}, + "tr": {"language": "tr", "value": "Afrika ve Asya'ya \u00f6zg\u00fc b\u00fcy\u00fck bir kedi"}, + "as": { + "language": "as", + "value": "\u09b8\u09cd\u09a4\u09a8\u09cd\u09af\u09aa\u09be\u09af\u09bc\u09c0 \u09aa\u09cd\u09f0\u09be\u09a3\u09c0" + }, + "my": { + "language": "my", + "value": "\u1014\u102d\u102f\u1037\u1010\u102d\u102f\u1000\u103a\u101e\u1010\u1039\u1010\u101d\u102b \u1019\u103b\u102d\u102f\u1038\u1005\u102d\u1010\u103a (\u1000\u103c\u1031\u102c\u1004\u103a\u1019\u103b\u102d\u102f\u1038\u101b\u1004\u103a\u1038\u101d\u1004\u103a)" + }, + "id": {"language": "id", "value": "spesies hewan keluarga jenis kucing"}, + "ks": { + "language": "ks", + "value": "\u0628\u062c \u0628\u0631\u0627\u0631\u0646 \u06be\u0646\u062f \u06a9\u0633\u0645 \u06cc\u0633 \u0627\u0634\u06cc\u0627 \u062a\u06c1 \u0627\u0641\u0631\u06cc\u06a9\u0627 \u0645\u0646\u0632 \u0645\u0644\u0627\u0646 \u0686\u06be\u06c1" + }, + "br": {"language": "br", "value": "bronneg kigdebrer"}, + "sat": { + "language": "sat", + "value": "\u1c75\u1c64\u1c68 \u1c68\u1c6e\u1c71 \u1c68\u1c5f\u1c61\u1c5f" + }, + "mni": { + "language": "mni", + "value": "\uabc2\uabdd\uabc2\uabdb\uabc0\uabe4 \uabc1\uabe5\uabcd\uabe4\uabe1 \uabc6\uabe5\uabd5 \uabc1\uabe5 \uabd1\uabc6\uabe7\uabd5\uabc1\uabe4\uabe1\uabd2\uabe4 \uabc3\uabc5\uabe8\uabe1\uabd7 \uabd1\uabc3" + }, + "ro": {"language": "ro", "value": "mamifer carnivor"} + }, + "aliases": { + "es": [{"language": "es", "value": "Panthera leo"}, {"language": "es", "value": "leon"}], + "en": [{"language": "en", "value": "Asiatic Lion"}, { + "language": "en", + "value": "Panthera leo" + }, {"language": "en", "value": "African lion"}, { + "language": "en", + "value": "the lion" + }, {"language": "en", "value": "\ud83e\udd81"}], + "pt-br": [{"language": "pt-br", "value": "Panthera leo"}], + "fr": [{"language": "fr", "value": "lionne"}, {"language": "fr", "value": "lionceau"}], + "zh": [{"language": "zh", "value": "\u9b03\u6bdb"}, { + "language": "zh", + "value": "\u72ee\u5b50" + }, {"language": "zh", "value": "\u7345"}, { + "language": "zh", + "value": "\u525b\u679c\u7345" + }, {"language": "zh", "value": "\u975e\u6d32\u72ee"}], + "de": [{"language": "de", "value": "Panthera leo"}], + "ca": [{"language": "ca", "value": "Panthera leo"}], + "sco": [{"language": "sco", "value": "Panthera leo"}], + "hu": [{"language": "hu", "value": "P. leo"}, {"language": "hu", "value": "Panthera leo"}], + "ilo": [{"language": "ilo", "value": "Panthera leo"}, {"language": "ilo", "value": "Felis leo"}], + "ksh": [{"language": "ksh", "value": "L\u00f6hw"}, { + "language": "ksh", + "value": "L\u00f6hf" + }, {"language": "ksh", "value": "L\u00f6v"}], + "gl": [{"language": "gl", "value": "Panthera leo"}], + "ja": [{"language": "ja", "value": "\u767e\u7363\u306e\u738b"}, { + "language": "ja", + "value": "\u7345\u5b50" + }, {"language": "ja", "value": "\u30b7\u30b7"}], + "sq": [{"language": "sq", "value": "Mbreti i Kafsh\u00ebve"}], + "el": [{"language": "el", "value": "\u03c0\u03b1\u03bd\u03b8\u03ae\u03c1"}], + "pl": [{"language": "pl", "value": "Panthera leo"}, {"language": "pl", "value": "lew"}], + "zh-hk": [{"language": "zh-hk", "value": "\u7345"}], + "af": [{"language": "af", "value": "Panthera leo"}], + "mk": [{"language": "mk", "value": "Panthera leo"}], + "ar": [{"language": "ar", "value": "\u0644\u064a\u062b"}], + "zh-hant": [{"language": "zh-hant", "value": "\u7345"}], + "zh-cn": [{"language": "zh-cn", "value": "\u72ee"}], + "zh-hans": [{"language": "zh-hans", "value": "\u72ee"}], + "zh-mo": [{"language": "zh-mo", "value": "\u7345"}], + "zh-my": [{"language": "zh-my", "value": "\u72ee"}], + "zh-sg": [{"language": "zh-sg", "value": "\u72ee"}], + "zh-tw": [{"language": "zh-tw", "value": "\u7345"}], + "gu": [{"language": "gu", "value": "\u0ab5\u0aa8\u0ab0\u0abe\u0a9c"}, { + "language": "gu", + "value": "\u0ab8\u0abe\u0ab5\u0a9c" + }, {"language": "gu", "value": "\u0a95\u0ac7\u0ab8\u0ab0\u0ac0"}], + "ast": [{"language": "ast", "value": "Panthera leo"}, { + "language": "ast", + "value": "lle\u00f3n africanu" + }], + "hi": [{ + "language": "hi", + "value": "\u092a\u0947\u0902\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b" + }], + "te": [{ + "language": "te", + "value": "\u0c2a\u0c3e\u0c02\u0c25\u0c47\u0c30\u0c3e \u0c32\u0c3f\u0c2f\u0c4b" + }], + "nl": [{"language": "nl", "value": "Panthera leo"}], + "bho": [{ + "language": "bho", + "value": "\u092a\u0948\u0928\u094d\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b" + }, { + "language": "bho", + "value": "\u092a\u0948\u0902\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b" + }], + "ru": [{ + "language": "ru", + "value": "\u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0439 \u043b\u0435\u0432" + }, { + "language": "ru", + "value": "\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u0448\u043a\u0430" + }, { + "language": "ru", + "value": "\u0446\u0430\u0440\u044c \u0437\u0432\u0435\u0440\u0435\u0439" + }, { + "language": "ru", + "value": "\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0439 \u043b\u0435\u0432" + }], + "ga": [{"language": "ga", "value": "Panthera leo"}], + "bg": [{"language": "bg", "value": "Panthera leo"}, { + "language": "bg", + "value": "\u043b\u044a\u0432\u0438\u0446\u0430" + }], + "sat": [{"language": "sat", "value": "\u1c60\u1c69\u1c5e"}], + "nan": [{"language": "nan", "value": "Panthera leo"}], + "la": [{"language": "la", "value": "Panthera leo"}], + "nds-nl": [{"language": "nds-nl", "value": "leywe"}] + }, + "claims": { + "P225": [{ + "mainsnak": { + "snaktype": "value", + "property": "P225", + "hash": "e2be083a19a0c5e1a3f8341be88c5ec0e347580f", + "datavalue": {"value": "Panthera leo", "type": "string"}, + "datatype": "string" + }, + "type": "statement", + "qualifiers": { + "P405": [{ + "snaktype": "value", + "property": "P405", + "hash": "a817d3670bc2f9a3586b6377a65d54fff72ef888", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 1043, "id": "Q1043"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P574": [{ + "snaktype": "value", + "property": "P574", + "hash": "506af9838b7d37b45786395b95170263f1951a31", + "datavalue": { + "value": { + "time": "+1758-01-01T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 9, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }], + "P31": [{ + "snaktype": "value", + "property": "P31", + "hash": "60a983bb1006c765614eb370c3854e64ec50599f", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 14594740, + "id": "Q14594740" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P405", "P574", "P31"], + "id": "q140$8CCA0B07-C81F-4456-ABAA-A7348C86C9B4", + "rank": "normal", + "references": [{ + "hash": "89e96b63b05055cc80c950cf5fea109c7d453658", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c26dbcef1202a7d198982ed24f6ea69b704f95fe", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 82575, "id": "Q82575"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P577": [{ + "snaktype": "value", + "property": "P577", + "hash": "539fa499b6ea982e64006270bb26f52a57a8e32b", + "datavalue": { + "value": { + "time": "+1996-06-13T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "96dfb8481e184edb40553947f8fe08ce080f1553", + "datavalue": { + "value": { + "time": "+2013-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P577", "P813"] + }, { + "hash": "f2fcc71ba228fd0db2b328c938e601507006fa46", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "603c636b2210e4a74b7d40c9e969b7e503bbe252", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1538807, + "id": "Q1538807" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "6892402e621d2b47092e15284d64cdbb395e71f7", + "datavalue": { + "value": { + "time": "+2015-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P105": [{ + "mainsnak": { + "snaktype": "value", + "property": "P105", + "hash": "aebf3611b23ed90c7c0fc80f6cd1cb7be110ea59", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 7432, "id": "Q7432"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "q140$CD2903E5-743A-4B4F-AE9E-9C0C83426B11", + "rank": "normal", + "references": [{ + "hash": "89e96b63b05055cc80c950cf5fea109c7d453658", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c26dbcef1202a7d198982ed24f6ea69b704f95fe", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 82575, "id": "Q82575"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P577": [{ + "snaktype": "value", + "property": "P577", + "hash": "539fa499b6ea982e64006270bb26f52a57a8e32b", + "datavalue": { + "value": { + "time": "+1996-06-13T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "96dfb8481e184edb40553947f8fe08ce080f1553", + "datavalue": { + "value": { + "time": "+2013-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P577", "P813"] + }, { + "hash": "f2fcc71ba228fd0db2b328c938e601507006fa46", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "603c636b2210e4a74b7d40c9e969b7e503bbe252", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1538807, + "id": "Q1538807" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "6892402e621d2b47092e15284d64cdbb395e71f7", + "datavalue": { + "value": { + "time": "+2015-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P171": [{ + "mainsnak": { + "snaktype": "value", + "property": "P171", + "hash": "cbf0d3943e6cbac8afbec1ff11525c84ee04e442", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 127960, "id": "Q127960"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "q140$C1CA40D8-39C3-4DB4-B763-207A22796D85", + "rank": "normal", + "references": [{ + "hash": "89e96b63b05055cc80c950cf5fea109c7d453658", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c26dbcef1202a7d198982ed24f6ea69b704f95fe", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 82575, "id": "Q82575"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P577": [{ + "snaktype": "value", + "property": "P577", + "hash": "539fa499b6ea982e64006270bb26f52a57a8e32b", + "datavalue": { + "value": { + "time": "+1996-06-13T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "96dfb8481e184edb40553947f8fe08ce080f1553", + "datavalue": { + "value": { + "time": "+2013-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P577", "P813"] + }, { + "hash": "f2fcc71ba228fd0db2b328c938e601507006fa46", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "603c636b2210e4a74b7d40c9e969b7e503bbe252", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1538807, + "id": "Q1538807" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "6892402e621d2b47092e15284d64cdbb395e71f7", + "datavalue": { + "value": { + "time": "+2015-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P1403": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1403", + "hash": "baa11a4c668601014a48e2998ab76aa1ea7a5b99", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 15294488, "id": "Q15294488"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$816d2b99-4aa5-5eb9-784b-34e2704d2927", "rank": "normal" + }], + "P141": [{ + "mainsnak": { + "snaktype": "value", + "property": "P141", + "hash": "80026ea5b2066a2538fee5c0897b459bb6770689", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 278113, "id": "Q278113"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "q140$B12A2FD5-692F-4D9A-8FC7-144AA45A16F8", + "rank": "normal", + "references": [{ + "hash": "355df53bb7c6d100219cd2a331afd51719337d88", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "eb153b77c6029ffa1ca09f9128b8e47fe58fce5a", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 56011232, + "id": "Q56011232" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P627": [{ + "snaktype": "value", + "property": "P627", + "hash": "3642ac96e05180279c47a035c129d3af38d85027", + "datavalue": {"value": "15951", "type": "string"}, + "datatype": "string" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "76bc602d4f902d015c358223e7c0917bd65095e0", + "datavalue": { + "value": { + "time": "+2018-08-10T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P627", "P813"] + }] + }], + "P181": [{ + "mainsnak": { + "snaktype": "value", + "property": "P181", + "hash": "8467347aac1f01e518c1b94d5bb68c65f9efe84a", + "datavalue": {"value": "Lion distribution.png", "type": "string"}, + "datatype": "commonsMedia" + }, "type": "statement", "id": "q140$12F383DD-D831-4AE9-A0ED-98C27A8C5BA7", "rank": "normal" + }], + "P830": [{ + "mainsnak": { + "snaktype": "value", + "property": "P830", + "hash": "8cafbfe99d80fcfabbd236d4cc01d33cc8a8b41d", + "datavalue": {"value": "328672", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$486d7ab8-4af8-b6e1-85bb-e0749b02c2d9", + "rank": "normal", + "references": [{ + "hash": "7e71b7ede7931e7e2ee9ce54e832816fe948b402", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "6e81987ab11fb1740bd862639411d0700be3b22c", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 82486, "id": "Q82486"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "7c1a33cf9a0bf6cdd57b66f089065ba44b6a8953", + "datavalue": { + "value": { + "time": "+2014-10-30T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P815": [{ + "mainsnak": { + "snaktype": "value", + "property": "P815", + "hash": "27f6bd8fb4504eb79b92e6b63679b83af07d5fed", + "datavalue": {"value": "183803", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$71177A4F-4308-463D-B370-8B354EC2D2C3", + "rank": "normal", + "references": [{ + "hash": "ff0dd9eabf88b0dcefa74b223d065dd644e42050", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c26dbcef1202a7d198982ed24f6ea69b704f95fe", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 82575, "id": "Q82575"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "6b8fcfa6afb3911fecec93ae1dff2b6b6cde5659", + "datavalue": { + "value": { + "time": "+2013-12-07T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P685": [{ + "mainsnak": { + "snaktype": "value", + "property": "P685", + "hash": "c863e255c042b2b9b6a788ebd6e24f38a46dfa88", + "datavalue": {"value": "9689", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$A9F4ABE4-D079-4868-BC18-F685479BB244", + "rank": "normal", + "references": [{ + "hash": "5667273d9f2899620fec2016bb2afd29aa7080ce", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "1851bc60ddfbcf6f76bd45aa7124fc0d5857a379", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 13711410, + "id": "Q13711410" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "6b8fcfa6afb3911fecec93ae1dff2b6b6cde5659", + "datavalue": { + "value": { + "time": "+2013-12-07T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P959": [{ + "mainsnak": { + "snaktype": "value", + "property": "P959", + "hash": "55cab2a9d2af860a89a8d0e2eaefedb64202a3d8", + "datavalue": {"value": "14000228", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$A967D17D-485D-434F-BBF2-E6226E63BA42", + "rank": "normal", + "references": [{ + "hash": "3e398e6df20323ce88e644e5a1e4ec0bc77a5f41", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "603c636b2210e4a74b7d40c9e969b7e503bbe252", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1538807, + "id": "Q1538807" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "d2bace4e146678a5e5f761e9a441b53b95dc2e87", + "datavalue": { + "value": { + "time": "+2014-01-10T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P842": [{ + "mainsnak": { + "snaktype": "value", + "property": "P842", + "hash": "991987fc3fa4d1cfd3a601dcfc9dd1f802255de7", + "datavalue": {"value": "49734", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$3FF45860-DBC3-4629-AAF8-F2899B6C6876", + "rank": "normal", + "references": [{ + "hash": "1111bfc1dc63ee739fb9dd3f5534346c7fd478f0", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "00fe2206a3342fa25c0cfe1d08783c49a1986f12", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 796451, + "id": "Q796451" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "14c5b75e8d3f4c43cb5b570380dd98e421bb9751", + "datavalue": { + "value": { + "time": "+2014-01-30T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P227": [{ + "mainsnak": { + "snaktype": "value", + "property": "P227", + "hash": "3343c5fd594f8f0264332d87ce95e76ffeaebffd", + "datavalue": {"value": "4140572-9", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$0059e08d-4308-8401-58e8-2cb683c03837", "rank": "normal" + }], + "P349": [{ + "mainsnak": { + "snaktype": "value", + "property": "P349", + "hash": "08812c4ef85f397bf00b015d1baf3b00d81cb9bf", + "datavalue": {"value": "00616831", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$B7933772-D27D-49D4-B1BB-AA36ADCA81B0", "rank": "normal" + }], + "P1014": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1014", + "hash": "3d27204feb184f21c042777dc9674150cb07ee92", + "datavalue": {"value": "300310388", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$8e3c9dc3-442e-2e61-8617-f4a41b5be668", "rank": "normal" + }], + "P646": [{ + "mainsnak": { + "snaktype": "value", + "property": "P646", + "hash": "0c053bce57fe07b05c300a09b322d9f89236884b", + "datavalue": {"value": "/m/096mb", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$D94D8A4F-3414-4BE0-82C1-306BD136C017", + "rank": "normal", + "references": [{ + "hash": "2b00cb481cddcac7623114367489b5c194901c4a", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "a94b740202b097dd33355e0e6c00e54b9395e5e0", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 15241312, + "id": "Q15241312" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P577": [{ + "snaktype": "value", + "property": "P577", + "hash": "fde79ecb015112d2f29229ccc1ec514ed3e71fa2", + "datavalue": { + "value": { + "time": "+2013-10-28T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P577"] + }] + }], + "P1036": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1036", + "hash": "02435ba66ab8e5fb26652ae1a84695be24b3e22a", + "datavalue": {"value": "599.757", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$e75ed89a-408d-9bc1-8d99-41663921debd", "rank": "normal" + }], + "P1245": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1245", + "hash": "f3da4ca7d35fc3e02a9ea1662688d8f6c4658df0", + "datavalue": {"value": "5961", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$010e79a0-475e-fcf4-a554-375b64943783", "rank": "normal" + }], + "P910": [{ + "mainsnak": { + "snaktype": "value", + "property": "P910", + "hash": "056367b51cd51edd6c2840134fde01cf40469172", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 6987175, "id": "Q6987175"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$BC4DE2D4-BF45-49AF-A9A6-C0A976F60825", "rank": "normal" + }], + "P373": [{ + "mainsnak": { + "snaktype": "value", + "property": "P373", + "hash": "76c006bc5e2975bcda2e7d60ddcbaaa8c84f69e5", + "datavalue": {"value": "Panthera leo", "type": "string"}, + "datatype": "string" + }, "type": "statement", "id": "q140$939BA4B2-28D3-4C74-B143-A0EA6F423B43", "rank": "normal" + }], + "P846": [{ + "mainsnak": { + "snaktype": "value", + "property": "P846", + "hash": "d0428680cd2b36efde61dc69ccc5a8ff7a735cb5", + "datavalue": {"value": "5219404", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$4CE8E6D4-E9A1-46F1-8EEF-B469E8485F9E", + "rank": "normal", + "references": [{ + "hash": "5b8345ffc93a361b71f5d201a97f587e5e57efe5", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "dbb8dd1efbe0158a5227213bd628eeac27a1da65", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1531570, + "id": "Q1531570" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "3eb17b10ce02d44f47540a6fbdbb3cbb7e77d5f5", + "datavalue": { + "value": { + "time": "+2015-05-15T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P487": [{ + "mainsnak": { + "snaktype": "value", + "property": "P487", + "hash": "5f93415dd33bfde6a546fdd65e5a7013e012c336", + "datavalue": {"value": "\ud83e\udd81", "type": "string"}, + "datatype": "string" + }, "type": "statement", "id": "Q140$da5262fc-4ac5-390b-b424-4f296b2d711d", "rank": "normal" + }], + "P2040": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2040", + "hash": "5b13a3fa0fde6ba09d8e417738c05268bd065e32", + "datavalue": {"value": "6353", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$E97A1A2E-D146-4C62-AE92-5AF5F7E146EF", + "rank": "normal", + "references": [{ + "hash": "348b5187938d682071c94e22f1b30659af715dc7", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "213dc0d84ed983cbb28466ebb0c45bf8b0730ea2", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 20962955, + "id": "Q20962955" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "3d2c713dec9143721ae196af88fee0fde5ae20f2", + "datavalue": { + "value": { + "time": "+2015-09-10T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P935": [{ + "mainsnak": { + "snaktype": "value", + "property": "P935", + "hash": "c3518a9944958337bcce384587f3abc3de6ddf34", + "datavalue": {"value": "Panthera leo", "type": "string"}, + "datatype": "string" + }, "type": "statement", "id": "Q140$F7AAEE1F-4D18-4538-99F0-1A2B5AD7269F", "rank": "normal" + }], + "P1417": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1417", + "hash": "492d3483075b6915990940a4392f5ec035cbe05e", + "datavalue": {"value": "animal/lion", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$FE89C38F-6C79-4F06-8C15-81DCAC8D745F", "rank": "normal" + }], + "P244": [{ + "mainsnak": { + "snaktype": "value", + "property": "P244", + "hash": "2e41780263804dd45d7deaf7955a2d1d221f6096", + "datavalue": {"value": "sh85077276", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$634d86d1-45b1-920d-e9ef-78d5f4023288", + "rank": "normal", + "references": [{ + "hash": "88d810dd1ff791aeb0b5779876b0c9f19acb59b6", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c120f07504c77593a9d734f50361ea829f601960", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 620946, + "id": "Q620946" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "0980c2f2b51e6b2d4c1dd9a77b9fb95dc282bc79", + "datavalue": { + "value": { + "time": "+2016-06-01T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P1843": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "3b1cfb68cc46255ceba7ff7893ac1cabbb4ddd92", + "datavalue": {"value": {"text": "Lion", "language": "en"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "qualifiers": { + "P7018": [{ + "snaktype": "value", + "property": "P7018", + "hash": "40a60b39201df345ffbf5aa724269d5fd61ae028", + "datavalue": { + "value": {"entity-type": "sense", "id": "L17815-S1"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-sense" + }] + }, + "qualifiers-order": ["P7018"], + "id": "Q140$6E257597-55C7-4AF3-B3D6-0F2204FAD35C", + "rank": "normal", + "references": [{ + "hash": "eada84c58a38325085267509899037535799e978", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 32059, "id": "Q32059"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "3e51c3c32949f8a45f2c3331f55ea6ae68ecf3fe", + "datavalue": { + "value": { + "time": "+2016-10-21T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }, { + "hash": "cdc389b112247cb50b855fb86e98b7a7892e96f0", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "e17975e5c866df46673c91b2287a82cf23d14f5a", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 27310853, + "id": "Q27310853" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P304": [{ + "snaktype": "value", + "property": "P304", + "hash": "ff7ad3502ff7a4a9b0feeb4248a7bed9767a1ec6", + "datavalue": {"value": "166", "type": "string"}, + "datatype": "string" + }] + }, + "snaks-order": ["P248", "P304"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "38a9c57a5c62a707adc86decd2bd00be89eab6f3", + "datavalue": {"value": {"text": "Leeu", "language": "af"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$5E731B05-20D6-491B-97E7-94D90CBB70F0", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "a4455f1ef49d7d17896563760a420031c41d65c1", + "datavalue": {"value": {"text": "Gyata", "language": "ak"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$721B4D81-D948-4002-A13E-0B2567626FD6", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "b955c9239d6ced23c0db577e20219b0417a2dd9b", + "datavalue": {"value": {"text": "Ley\u00f3n", "language": "an"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$E2B52F3D-B12D-48B5-86EA-6A4DCBC091D3", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "e18a8ecb17321c203fcf8f402e82558ce0599b39", + "datavalue": {"value": {"text": "Li\u00f3n", "language": "an"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$339ADC90-41C6-4CDB-B6C3-DA9F952FCC15", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "297bf417fff1510d19b27c08fa9f34e2653b9510", + "datavalue": { + "value": {"text": "\u0623\u064e\u0633\u064e\u062f\u064c", "language": "ar"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$F1849268-0E70-4EC0-A630-EC0D2DCBB298", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "5577ef6920a3ade2365d878740d1d097fcdae399", + "datavalue": {"value": {"text": "L\u00e9we", "language": "bar"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$BDD65B40-7ECB-4725-B33F-417A83AF5102", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "de8fa35eca4e61dfb8fe2df360e734fb1cd37092", + "datavalue": {"value": {"text": "L\u00f6we", "language": "bar"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$486EE5F1-9AB5-4789-98AC-E435D81E784F", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "246c27f44da8bedd2e3313de393fe648b2b40ea9", + "datavalue": { + "value": {"text": "\u041b\u0435\u045e (Lew)", "language": "be"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$47AA6BD4-0B09-4B20-9092-0AEAD8056157", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "64c42db53ef288871161f0a656808f06daae817d", + "datavalue": { + "value": {"text": "\u041b\u044a\u0432 (L\u0103v)", "language": "bg"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$ADF0B08A-9626-4821-8118-0A875CBE5FB9", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "6041e2730af3095f4f0cbf331382e22b596d2305", + "datavalue": { + "value": {"text": "\u09b8\u09bf\u0982\u09b9", "language": "bn"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$8DF5BDCD-B470-46C3-A44A-7375B8A5DCDE", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "8499f437dc8678b0c4b740b40cab41031fce874d", + "datavalue": {"value": {"text": "Lle\u00f3", "language": "ca"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$F55C3E63-DB2C-4F6D-B10B-4C1BB70C06A0", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "b973abb618a6f17b8a9547b852e5817b5c4da00b", + "datavalue": { + "value": {"text": "\u041b\u043e\u044c\u043c", "language": "ce"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$F32B0BFA-3B85-4A26-A888-78FD8F09F943", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "62f53c7229efad1620a5cce4dc5a535d88c4989f", + "datavalue": {"value": {"text": "Lev", "language": "cs"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$1630DAB7-C4D0-4268-A598-8BBB9480221E", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "0df7e23666c947b42aea5572a9f5a987229718d3", + "datavalue": {"value": {"text": "Llew", "language": "cy"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$F33991E8-A532-47F5-B135-A13761DB2E95", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "14942ad0830a0eb7b06704234eea637f99b53a24", + "datavalue": {"value": {"text": "L\u00f8ve", "language": "da"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$478F0603-640A-44BE-9453-700FDD32100F", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "8af089542ef6207b918f656bcf9a96e745970915", + "datavalue": {"value": {"text": "L\u00f6we", "language": "de"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "qualifiers": { + "P7018": [{ + "snaktype": "value", + "property": "P7018", + "hash": "2da239e18a0208847a72fbeab011c8c2fb3b4d99", + "datavalue": { + "value": {"entity-type": "sense", "id": "L41680-S1"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-sense" + }] + }, + "qualifiers-order": ["P7018"], + "id": "Q140$11F5F498-3688-4F4B-B2FA-7121BE5AA701", + "rank": "normal", + "references": [{ + "hash": "cdc389b112247cb50b855fb86e98b7a7892e96f0", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "e17975e5c866df46673c91b2287a82cf23d14f5a", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 27310853, + "id": "Q27310853" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P304": [{ + "snaktype": "value", + "property": "P304", + "hash": "ff7ad3502ff7a4a9b0feeb4248a7bed9767a1ec6", + "datavalue": {"value": "166", "type": "string"}, + "datatype": "string" + }] + }, + "snaks-order": ["P248", "P304"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "c0c8b50001810c1ec643b88479df82ea85c819a2", + "datavalue": {"value": {"text": "Dzata", "language": "ee"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$8F6EC307-A293-4AFC-8154-E3FF187C0D7D", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "57a3384eeb13d1bcffeb3cf0efd0f3e3f511b35d", + "datavalue": { + "value": { + "text": "\u039b\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9 (Liond\u00e1ri)", + "language": "el" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$560B3341-3E06-4D09-8869-FC47C841D14C", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "ee7109a46f8259ae6f52791cfe599b7c4c272831", + "datavalue": {"value": {"text": "Leono", "language": "eo"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$67F2B7A6-1C81-407A-AA61-A1BFF148EC69", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "3b8f4f61c3a18792bfaff5d332f03c80932dce05", + "datavalue": {"value": {"text": "Le\u00f3n", "language": "es"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$DB29EAF7-4405-4030-8056-ED17089B3805", + "rank": "normal", + "references": [{ + "hash": "d3a8e536300044db1d823eae6891b2c7baa49f66", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 32059, "id": "Q32059"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "620d2e76d21bb1d326fc360db5bece2070115240", + "datavalue": { + "value": { + "time": "+2016-10-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "41fffb83f35736829d60f782bdce68463f0ab47c", + "datavalue": {"value": {"text": "L\u00f5vi", "language": "et"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$19B76CC4-AA11-443B-BC76-DB2D0DA5B9CB", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "b96549e5ae538fb7e0b48089508333b31aec8fe7", + "datavalue": {"value": {"text": "Lehoi", "language": "eu"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$88F712C1-4EEF-4E42-8C61-84E55CF2DCE0", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "b343c833d8de3dfd5c8b31336afd137380ab42dc", + "datavalue": { + "value": {"text": "\u0634\u06cc\u0631 (\u0160ayr)", "language": "fa"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$B72DB989-EF39-42F5-8FA8-5FC669079DB7", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "51aaf9a4a7c5e77ba931a5280d1fec984c91963b", + "datavalue": {"value": {"text": "Leijona", "language": "fi"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$6861CDE9-707D-43AD-B352-3BCD7B9D4267", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "038249fb112acc26895af45fab412395f999ae11", + "datavalue": {"value": {"text": "Leyva", "language": "fo"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$A044100A-C49F-4AA6-8861-F0300F28126E", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "92ec25b64605d026b07b0cda6e623fbbf2f3dfb4", + "datavalue": {"value": {"text": "Lion", "language": "fr"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$122623FD-3915-49E9-8890-0B6883317507", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "59be091f7839e7a6061c6d1690ed77f3b21b9ff4", + "datavalue": { + "value": {"text": "L\u00f6\u00f6w", "language": "frr"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$76B87E52-A02C-4E99-A4B3-D6105B642521", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "126b0f2c5ed11124233dfefff8bd132a1fe1218a", + "datavalue": { + "value": {"text": "Le\u00f3n-leoa", "language": "gl"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$A4864784-EED3-4898-83FE-A2FCC0C3982E", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "49e0d3858de566edce1a28b0e96f42b2d0df718f", + "datavalue": { + "value": {"text": "\u0ab8\u0abf\u0a82\u0ab9", "language": "gu"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$4EE122CE-7671-480E-86A4-4A4DDABC04BA", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "dff0c422f7403c50d28dd51ca2989d03108b7584", + "datavalue": {"value": {"text": "Liona", "language": "haw"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$FBB6AC65-A224-4C29-8024-079C0687E9FB", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "c174addd56c0f42f6ec3e87c72fb9651e4923a00", + "datavalue": { + "value": {"text": "\u05d0\u05e8\u05d9\u05d4", "language": "he"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$B72D9BDB-A2CC-471D-AF20-8F7FB677D533", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "c38a63a06b569fc8fee3e98c4cf8d5501990811e", + "datavalue": { + "value": {"text": "si\u1e45ha)", "language": "hi"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$9AA9171C-E912-41F2-AB26-643AA538E644", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "94f073519a5b64c48398c73a5f0f135a4f0f4306", + "datavalue": { + "value": {"text": "\u0936\u0947\u0930", "language": "hi"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$0714B97B-03E0-4ACC-80A0-6A17874DDBA8", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "1fbda5b1494db298c698fc28ed0fe68b1c137b2e", + "datavalue": { + "value": {"text": "\u0938\u093f\u0902\u0939", "language": "hi"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$3CE22F68-038C-4A94-9A1F-96B82760DEB9", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "fac41ebd8d1da777acd93720267c7a70016156e4", + "datavalue": {"value": {"text": "Lav", "language": "hr"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$C5351C11-E287-4D3B-A9B2-56716F0E69E5", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "71e0bda709fb17d58f4bd8e12fff7f937a61673c", + "datavalue": { + "value": {"text": "Oroszl\u00e1n", "language": "hu"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$AD06E7D2-3B1F-4D14-B2E9-DD2513BE8B4B", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "05e86680d70a2c0adf9a6e6eb51bbdf8c6ae44bc", + "datavalue": { + "value": {"text": "\u0531\u057c\u0575\u0578\u0582\u056e", "language": "hy"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$3E02B802-8F7B-4C48-A3F9-FBBFDB0D8DB3", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "979f25bee6af37e19471530c6344a0d22a0d594c", + "datavalue": {"value": {"text": "Lj\u00f3n", "language": "is"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$59788C31-A354-4229-AD89-361CB6076EF7", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "789e5f5a7ec6003076bc7fd2996faf8ca8468719", + "datavalue": {"value": {"text": "Leone", "language": "it"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$4901AE59-7749-43D1-BC65-DEEC0DFEB72F", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "4a5bdf9bb40f1cab9a92b7dba1d1d74a8440c7ed", + "datavalue": { + "value": {"text": "\u30e9\u30a4\u30aa\u30f3 (Raion)", "language": "ja"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$4CF2E0D9-5CF3-46A3-A197-938E94270CE2", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "ebba3893211c78dad7ae74a51448e8c7f6e73309", + "datavalue": { + "value": {"text": "\uc0ac\uc790 (saja)", "language": "ko"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$64B6CECD-5FFE-4612-819F-CAB2E726B228", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "ed1fe1812cee80102262dd3b7e170759fbeab86a", + "datavalue": { + "value": {"text": "\u0410\u0440\u0441\u0442\u0430\u043d", "language": "ky"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$3D9597D3-E35F-4EFF-9CAF-E013B45F283F", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "a0868f5f83bb886a408aa9b25b95dbfc59bde4dc", + "datavalue": {"value": {"text": "Leo", "language": "la"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$4D650414-6AFE-430F-892F-B7774AC7AF70", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "054af77b10151632045612df9b96313dfcc3550c", + "datavalue": {"value": {"text": "Liew", "language": "li"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$D5B466A8-AEFB-4083-BF3E-194C5CE45CD3", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "9193a46891a365ee1b0a17dd6e2591babc642811", + "datavalue": {"value": {"text": "Nkosi", "language": "ln"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$55F213DF-5AAB-4490-83CB-B9E5D2B894CD", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "c5952ec6b650f1c66f37194eb88c2889560740b2", + "datavalue": { + "value": {"text": "Li\u016btas", "language": "lt"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$8551F80C-A244-4351-A98A-8A9F37A736A2", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "e3541d0807682631f8fff2d224b2cb1b3d2a4c11", + "datavalue": {"value": {"text": "Lauva", "language": "lv"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$488A2D59-533A-4C02-8AC3-01241FE63D94", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "22e20da399aff10787267691b5211b6fc0bddf38", + "datavalue": { + "value": {"text": "\u041b\u0430\u0432 (lav)", "language": "mk"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$9E2377E9-1D37-4BBC-A409-1C40CDD99A86", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "fe4c9bc3b3cce21a779f72fae808f8ed213d226b", + "datavalue": { + "value": { + "text": "\u0d38\u0d3f\u0d02\u0d39\u0d02 (simham)", + "language": "ml" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$8BEA9E08-4687-434A-9FB4-4B23B2C40838", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "85aa09066722caf2181681a24575ad89ca76210e", + "datavalue": { + "value": {"text": "si\u1e45ha)", "language": "mr"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$46B51EF5-7ADB-4637-B744-89AD1E3B5D19", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "441f3832d6e3c4439c6986075096c7021a0939dd", + "datavalue": { + "value": {"text": "\u0936\u0947\u0930 (\u015a\u0113ra)", "language": "mr"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$12BBC825-32E3-4026-A5E5-0330DEB21D79", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "89b35a359c3891dce190d778e9ae0a9634cfd71f", + "datavalue": { + "value": {"text": "\u0938\u093f\u0902\u0939 (singh", "language": "mr"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$006148E2-658F-4C74-9C3E-26488B7AEB8D", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "5723b45deee51dfe5a2555f2db17bad14acb298a", + "datavalue": {"value": {"text": "Iljun", "language": "mt"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$13D221F5-9763-4550-9CC3-9A697286B785", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "d1ce3ab04f25af38248152eb8caa286b63366c2a", + "datavalue": {"value": {"text": "Leeuw", "language": "nl"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$65E80D17-6F20-4BAE-A2B4-DD934C0BE153", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "12f3384cc32e65dfb501e2fee19ccf709f9df757", + "datavalue": {"value": {"text": "L\u00f8ve", "language": "nn"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$78E95514-1969-4DA3-97CD-0DBADF1223E7", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "a3fedaf780a0d004ba318881f6adbe173750d09e", + "datavalue": {"value": {"text": "L\u00f8ve", "language": "nb"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$809DE1EA-861E-4813-BED7-D9C465341CB3", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "695d2ef10540ba13cf8b3541daa1d39fd720eea0", + "datavalue": { + "value": { + "text": "N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed", + "language": "nv" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$E9EDAF16-6650-40ED-B888-C524BD00DF40", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "3c143e8a8cebf92d76d3ae2d7e3bb3f87e963fb4", + "datavalue": { + "value": { + "text": "\u0a2c\u0a71\u0a2c\u0a30 \u0a38\u0a3c\u0a47\u0a30", + "language": "pa" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$13AE1DAB-4B29-49A5-9893-C0014C61D21E", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "195e48d11222aec830fb1d5c2de898c9528abc57", + "datavalue": { + "value": {"text": "lew afryka\u0144ski", "language": "pl"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$6966C1C3-9DD6-48BC-B511-B0827642E41D", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "8bd3ae632e7731ae9e72c50744383006ec6eb73e", + "datavalue": {"value": {"text": "Le\u00e3o", "language": "pt"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$BD454649-347E-4AE5-81B8-360C16C7CDA7", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "79d3336733b7bf4b7dadffd6d6ebabdb892074d1", + "datavalue": {"value": {"text": "Leu", "language": "ro"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$7323EF68-7AA0-4D38-82D8-0A94E61A26F0", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "376b852a92b6472e969ae7b995c4aacea23955eb", + "datavalue": { + "value": {"text": "\u041b\u0435\u0432 (Lev)", "language": "ru"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$A7C413B9-0916-4534-941D-C24BA0334816", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "aa323e0bea79d79900227699b3d42d689a772ca1", + "datavalue": {"value": {"text": "Lioni", "language": "sc"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$2EF83D2C-0DB9-4D3C-8FDD-86237E566260", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "a290fe08983742eac8b5bc479022564fb6b2ce81", + "datavalue": {"value": {"text": "Lev", "language": "sl"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$B276673A-08C1-47E2-99A9-D0861321E157", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "d3b070ff1452d47f87c109a9e0bfa52e61b24a4e", + "datavalue": {"value": {"text": "Libubesi", "language": "ss"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$86BFAB38-1DB8-4903-A17D-A6B8E81819CC", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "3adea59d97f3caf9bb6b1c3d7ae6365f7f656dca", + "datavalue": {"value": {"text": "Tau", "language": "st"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$2FA8893D-2401-42E9-8DC3-288CC1DEDB0C", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "0e73b32fe31a107a95de83706a12f2db419c6909", + "datavalue": {"value": {"text": "Lejon", "language": "sv"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$1A8E006E-CC7B-4066-9DE7-9B82D096779E", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "34550af2fdc48f77cf66cabc5c59d1acf1d8afd0", + "datavalue": {"value": {"text": "Simba", "language": "sw"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$B02CA616-44CF-4AA6-9734-2C05810131EB", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "701f87cf9926c9af2c41434ff130dcb234a6cd95", + "datavalue": { + "value": { + "text": "\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd", + "language": "ta" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$DA87A994-A002-45AD-A71F-99FB72F8B92F", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "856fd4809c90e3c34c6876e4410661dc04f5da8d", + "datavalue": { + "value": {"text": "\u0e2a\u0e34\u0e07\u0e42\u0e15", "language": "th"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$BDA8E989-3537-4662-8CC3-33534705A7F1", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "f8598a8369426da0c86bf8bab356a927487eae66", + "datavalue": {"value": {"text": "Aslan", "language": "tr"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$AAE5F227-C0DB-4DF3-B1F4-517699BBDDF1", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "f3c8320bd46913aee164999ab7f68388c1bd9920", + "datavalue": { + "value": {"text": "\u041b\u0435\u0432 (Lev)", "language": "uk"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$494C3503-6016-4539-83AF-6344173C2DCB", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "6cc2d534293320533e15dc713f1d2c07b3811b6a", + "datavalue": {"value": {"text": "Leon", "language": "vec"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$E6F1DA81-9F36-4CC8-B57E-95E3BDC2F5D0", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "32553481e45abf6f5e6292baea486e978c36f8fe", + "datavalue": { + "value": {"text": "S\u01b0 t\u1eed", "language": "vi"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$11D7996C-0492-41CC-AEE7-3C136172DFC7", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "69077fc29f9251d1de124cd3f3c45cd6f0bb6b65", + "datavalue": { + "value": {"text": "\u05dc\u05d9\u05d9\u05d1", "language": "yi"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$969FEF9A-C1C7-41FE-8181-07F6D87B0346", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "e3aaa8cde18be4ea6b4af6ca62b83e7dc23d76e1", + "datavalue": { + "value": {"text": "\u72ee\u5b50 (sh\u012bzi)", "language": "zh"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$3BC22F6C-F460-4354-9BA2-28CEDA9FF170", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "98f5efae94b2bb9f8ffee6c677ee71f836743ef6", + "datavalue": { + "value": {"text": "Lion d'Afrique", "language": "fr"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$62D09BBF-718A-4139-AF50-DA4185ED67F2", + "rank": "normal", + "references": [{ + "hash": "362e3c5d6de1d193ef97205ba38834ba075191fc", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 32059, "id": "Q32059"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "c7813bad20c2553e26e45c37e3502ce7252312df", + "datavalue": { + "value": { + "time": "+2016-10-20T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "c584bdbd3cdc1215292a4971b920c684d103ea06", + "datavalue": { + "value": {"text": "African Lion", "language": "en"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$C871BB58-C689-4DBA-A088-DAC205377979", + "rank": "normal", + "references": [{ + "hash": "eada84c58a38325085267509899037535799e978", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 32059, "id": "Q32059"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "3e51c3c32949f8a45f2c3331f55ea6ae68ecf3fe", + "datavalue": { + "value": { + "time": "+2016-10-21T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "1d03eace9366816c6fda340c0390caac2f3cea8e", + "datavalue": {"value": {"text": "L\u00e9iw", "language": "lb"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$c65c7614-4d6e-3a87-9771-4f8c13618249", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "925c7abced1e89fa7e8000dc9dc78627cdac9769", + "datavalue": { + "value": {"text": "Lle\u00f3n", "language": "ast"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$1024eadb-45dd-7d9a-15f6-8602946ba661", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "0bda7868c3f498ba6fde78d46d0fbcf286e42dd8", + "datavalue": { + "value": {"text": "\u0644\u064e\u064a\u0652\u062b\u064c", "language": "ar"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$c226ff70-48dd-7b4d-00ff-7a683fe510aa", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "28de99c4aa35cc049cf8c9dd18af1791944137d9", + "datavalue": { + "value": {"text": "\u10da\u10dd\u10db\u10d8", "language": "ka"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$8fe60d1a-465a-9614-cbe4-595e22429b0c", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "4550db0f44e21c5eadeaa5a1d8fc614c9eb05f52", + "datavalue": {"value": {"text": "leon", "language": "ga"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$4950cb9c-4f1e-ce27-0d8c-ba3f18096044", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "9d268eb76ed921352c205b3f890d1f9428f638f3", + "datavalue": {"value": {"text": "Singa", "language": "ms"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$67401360-49dd-b13c-8269-e703b30c9a53", "rank": "normal" + }], + "P627": [{ + "mainsnak": { + "snaktype": "value", + "property": "P627", + "hash": "3642ac96e05180279c47a035c129d3af38d85027", + "datavalue": {"value": "15951", "type": "string"}, + "datatype": "string" + }, + "type": "statement", + "id": "Q140$6BE03095-BC68-4CE5-BB99-9F3E33A6F31D", + "rank": "normal", + "references": [{ + "hash": "182efbdb9110d036ca433f3b49bd3a1ae312858b", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 32059, "id": "Q32059"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "8c1c5174f4811115ea8a0def725fdc074c2ef036", + "datavalue": { + "value": { + "time": "+2016-07-10T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P2833": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2833", + "hash": "519877b77b20416af2401e5c0645954c6700d6fd", + "datavalue": {"value": "panthera-leo", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$C0A723AE-ED2E-4FDC-827F-496E4CF29A52", "rank": "normal" + }], + "P3063": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3063", + "hash": "81cdb0273eaf0a0126b62e2ff43b8e09505eea54", + "datavalue": { + "value": { + "amount": "+108", + "unit": "http://www.wikidata.org/entity/Q573", + "upperBound": "+116", + "lowerBound": "+100" + }, "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "id": "Q140$878ff87d-40d0-bb2b-c83d-4cef682c2687", + "rank": "normal", + "references": [{ + "hash": "7d748004a43983fabae420123742fda0e9b52840", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "f618501ace3a6524b053661d067b775547f96f58", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 26706243, + "id": "Q26706243" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P478": [{ + "snaktype": "value", + "property": "P478", + "hash": "ca3c5e6054c169ee3d0dfaf660f3eecd77942070", + "datavalue": {"value": "4", "type": "string"}, + "datatype": "string" + }], + "P304": [{ + "snaktype": "value", + "property": "P304", + "hash": "dd1977567f22f4cf510adfaadf5e3574813b3521", + "datavalue": {"value": "46", "type": "string"}, + "datatype": "string" + }] + }, + "snaks-order": ["P248", "P478", "P304"] + }] + }], + "P3031": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3031", + "hash": "e6271e8d12b20c9735d2bbd80eed58581059bf3a", + "datavalue": {"value": "PNTHLE", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$65AD2857-AB65-4CC0-9AB9-9D6C924784FE", "rank": "normal" + }], + "P3151": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3151", + "hash": "e85e5599d303d9a6bb360f3133fb69a76d98d0e2", + "datavalue": {"value": "41964", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$15D7A4EB-F0A3-4C61-8D2B-E557D7BF5CF7", "rank": "normal" + }], + "P3186": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3186", + "hash": "85ec7843064210afdfef6ec565a47f229c6d15e5", + "datavalue": {"value": "644245", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$6903E136-2DB2-42C9-98CB-82F61208FDAD", + "rank": "normal", + "references": [{ + "hash": "5790a745e549ea7e4e6d7ca467148b544529ba96", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c897ca3efd1604ef7b80a14ac0d2b8d6849c0856", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 26936509, + "id": "Q26936509" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "555ca5385c445e4fd4762281d4873682eff2ce30", + "datavalue": { + "value": { + "time": "+2016-09-24T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }, { + "hash": "3edd37192f877cad0ff97acc3db56ef2cc83945b", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4f7c4fd187630ba8cbb174c2756113983df4ce82", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45029859, + "id": "Q45029859" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "56b6aa0388c9a2711946589902bc195718bb0675", + "datavalue": { + "value": { + "time": "+2017-12-26T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }, { + "hash": "1318ed8ea451b84fe98461305665d8688603bab3", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "0fbeeecce08896108ed797d8ec22c7c10a6015e2", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45029998, + "id": "Q45029998" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "4bac1c0d2ffc45d91b51fc0881eb6bcc7916e854", + "datavalue": { + "value": { + "time": "+2018-01-02T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }, { + "hash": "6f761664a6f331d95bbaa1434447d82afd597a93", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "6c09d1d89e83bd0dfa6c94e01d24a9a47489d83e", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 58035056, + "id": "Q58035056" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "03182012ca72fcd757b8a1fe05ba927cbe9ef374", + "datavalue": { + "value": { + "time": "+2018-11-02T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P3485": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3485", + "hash": "df4e58fc2a196833ab3e33483099e2481e61ba9e", + "datavalue": {"value": {"amount": "+112", "unit": "1"}, "type": "quantity"}, + "datatype": "quantity" + }, + "type": "statement", + "id": "Q140$4B70AA09-AE2F-4F4C-9BAF-09890CDA11B8", + "rank": "normal", + "references": [{ + "hash": "fa278ebfc458360e5aed63d5058cca83c46134f1", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "e4f6d9441d0600513c4533c672b5ab472dc73694", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 328, "id": "Q328"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }], + "P3827": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3827", + "hash": "6bb26d581721d7330c407259d46ab5e25cc4a6b1", + "datavalue": {"value": "lions", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$CCDE6F7D-B4EA-4875-A4D6-5649ACFA8E2F", "rank": "normal" + }], + "P268": [{ + "mainsnak": { + "snaktype": "value", + "property": "P268", + "hash": "a20cdf81e39cd47f4da30073671792380029924c", + "datavalue": {"value": "11932251d", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$000FDB77-C70C-4464-9F00-605787964BBA", + "rank": "normal", + "references": [{ + "hash": "d4bd87b862b12d99d26e86472d44f26858dee639", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "f30cbd35620c4ea6d0633aaf0210a8916130469b", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 8447, "id": "Q8447"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }], + "P3417": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3417", + "hash": "e3b5d21350aef37f27ad8b24142d6b83d9eec0a6", + "datavalue": {"value": "Lions", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$1f96d096-4e4b-06de-740f-7b7215e5ae3f", "rank": "normal" + }], + "P4024": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4024", + "hash": "a698e7dcd6f9b0b00ee8e02846c668db83064833", + "datavalue": {"value": "Panthera_leo", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$F5DC21E8-BF52-4A0D-9A15-63B89297BD70", + "rank": "normal", + "references": [{ + "hash": "d4bd87b862b12d99d26e86472d44f26858dee639", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "f30cbd35620c4ea6d0633aaf0210a8916130469b", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 8447, "id": "Q8447"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }], + "P1225": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1225", + "hash": "9af40267f10f15926877e9a3f78faeab7b0dda82", + "datavalue": {"value": "10665610", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$268074ED-3CD7-46C9-A8FF-8C3679C45547", "rank": "normal" + }], + "P4728": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4728", + "hash": "37eafa980604019b327b1a3552313fb7ae256697", + "datavalue": {"value": "105514", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$50C24ECC-C42C-4A58-8F34-6AF0AC6C4EFE", + "rank": "normal", + "references": [{ + "hash": "d4bd87b862b12d99d26e86472d44f26858dee639", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "f30cbd35620c4ea6d0633aaf0210a8916130469b", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 8447, "id": "Q8447"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }], + "P3219": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3219", + "hash": "dedb8825588940caff5a34d04a0e69af296f05dd", + "datavalue": {"value": "lion", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$2A5A2CA3-AB6E-4F68-927F-042D1BD22915", "rank": "normal" + }], + "P1343": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "5b0ef3d5413cd39d887fbe70d2d3b3f4a94ea9d8", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 1138524, "id": "Q1138524"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "f7bf629d348040dd1a59dc5a3199edb50279e8f5", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 19997008, + "id": "Q19997008" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$DFE4D4B0-0D84-41F2-B448-4A81AC982927", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "6bc15c6f82feca4f3b173c90209a416f99464cac", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 4086271, "id": "Q4086271"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "69ace59e966574e4ffb454d26940a58fb45ed7de", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 25295952, + "id": "Q25295952" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$b82b0461-4ff0-10ac-9825-d4b95fc7a85a", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "ecb04d74140f2ee856c06658b03ec90a21c2edf2", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 1970746, "id": "Q1970746"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "169607f1510535f3e1c5e7debce48d1903510f74", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 30202801, + "id": "Q30202801" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$bd49e319-477f-0cd2-a404-642156321081", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "88389772f86dcd7d415ddd029f601412e5cc894a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 602358, "id": "Q602358"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "67f2e59eb3f6480bdbaa3954055dfbf8fd045bc4", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 24451091, + "id": "Q24451091" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$906ae22e-4c63-d325-c91e-dc3ee6b7504d", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "42346dfe9209b7359c1f5db829a368b38d407797", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 19180675, "id": "Q19180675"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "195bd04166c04364a657fcd18abd1a082dad3cb0", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 24758519, + "id": "Q24758519" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$92e7eeb1-4a72-9abf-4260-a96abc32bc42", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "7d6f86cef085693a10b0e0663a0960f58d0e15e2", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 4173137, "id": "Q4173137"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "75e5bdfbbf8498b195840749ef3a9bd309b796f7", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 25054587, + "id": "Q25054587" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$6c9c319a-4e71-540e-8866-a6017f0e6bae", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "75dd89e79770a3e631dbba27144940f8f1bc1773", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 1768721, "id": "Q1768721"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "a1b448ff5f8818a2254835e0816a03a785bac665", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 96599885, + "id": "Q96599885" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$A0FD93F4-A401-47A1-BC8E-F0D35A8E8BAD", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "4cfd4eb1fe49d401455df557a7d9b1154f22a725", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 3181656, "id": "Q3181656"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P1932": [{ + "snaktype": "value", + "property": "P1932", + "hash": "a3f6e8ce10c4527693415dbc99b5ea285b2f411c", + "datavalue": {"value": "Lion, The", "type": "string"}, + "datatype": "string" + }] + }, + "qualifiers-order": ["P1932"], + "id": "Q140$100f480e-4ad9-b340-8251-4e875d00315d", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "d5011798f92464584d8ccfc5f19f18f3659668bb", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 106727050, "id": "Q106727050"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ + "snaktype": "value", + "property": "P1810", + "hash": "7d78547303d5e9e014a7c8cef6072faee91088ce", + "datavalue": {"value": "Lions", "type": "string"}, + "datatype": "string" + }], + "P585": [{ + "snaktype": "value", + "property": "P585", + "hash": "ffb837135313cad3b2545c4b9ce5ee416deda3e2", + "datavalue": { + "value": { + "time": "+2021-05-07T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "qualifiers-order": ["P1810", "P585"], + "id": "Q140$A4D208BD-6A69-4561-B402-2E17AAE6E028", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "d12a9ecb0df8fce076df898533fea0339e5881bd", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 10886720, "id": "Q10886720"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "52ddab8de77b01303d508a1de615ca13060ec188", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 107513600, + "id": "Q107513600" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$07daf548-4c8d-fa7c-16f4-4c7062f7e48a", + "rank": "normal" + }], + "P4733": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4733", + "hash": "fc789f67f6d4d9b5879a8631eefe61f51a60f979", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 3177438, "id": "Q3177438"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q140$3773ba15-4723-261a-f9a8-544496938efa", + "rank": "normal", + "references": [{ + "hash": "649ae5511d5389d870d19e83543fa435de796536", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "9931bb1a17358e94590f8fa0b9550de881616d97", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 784031, + "id": "Q784031" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }], + "P5019": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5019", + "hash": "44aac3d8a2bd240b4bc81741a0980dc48781181b", + "datavalue": {"value": "l\u00f6we", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$2be40b22-49f1-c9e7-1812-8e3fd69d662d", "rank": "normal" + }], + "P2924": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2924", + "hash": "710d75c07e28936461d03b20b2fc7455599301a1", + "datavalue": {"value": "2135124", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$6326B120-CE04-4F02-94CA-D7BBC2589A39", "rank": "normal" + }], + "P5055": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5055", + "hash": "c5264fc372b7e66566d54d73f86c8ab8c43fb033", + "datavalue": {"value": "10196306", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$F8D43B92-CC3A-4967-A28F-C3E6308946F6", + "rank": "normal", + "references": [{ + "hash": "7131076724beb97fed351cb7e7f6ac6d61dd05b9", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "1e3ad3cb9e0170e28b7c7c335fba55cafa6ef789", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 51885189, + "id": "Q51885189" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "2b1446fcfcd471ab6d36521b4ad2ac183ff8bc0d", + "datavalue": { + "value": { + "time": "+2018-06-07T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P5221": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5221", + "hash": "623ca9614dd0d8b8720bf35b4d57be91dcef5fe6", + "datavalue": {"value": "123566", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$472fe544-402d-2574-6b2e-98c5b01bb294", "rank": "normal" + }], + "P5698": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5698", + "hash": "e966694183143d709403fae7baabb5fdf98d219a", + "datavalue": {"value": "70719", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$EF3F712D-B0E5-4151-81E4-67804D6241E6", "rank": "normal" + }], + "P5397": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5397", + "hash": "49a827bc1853a3b5612b437dd61eb5c28dc0bab0", + "datavalue": {"value": "12799", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$DE37BF10-A59D-48F1-926A-7303EDEEDDD0", "rank": "normal" + }], + "P6033": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6033", + "hash": "766727ded3adbbfec0bed77affc89ea4e5214d65", + "datavalue": {"value": "panthera-leo", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$A27BADCC-0F72-45A5-814B-BDE62BD7A1B4", "rank": "normal" + }], + "P18": [{ + "mainsnak": { + "snaktype": "value", + "property": "P18", + "hash": "d3ceb5bb683335c91781e4d52906d2fb1cc0c35d", + "datavalue": {"value": "Lion waiting in Namibia.jpg", "type": "string"}, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P21": [{ + "snaktype": "value", + "property": "P21", + "hash": "0576a008261e5b2544d1ff3328c94bd529379536", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 44148, "id": "Q44148"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P2096": [{ + "snaktype": "value", + "property": "P2096", + "hash": "6923fafa02794ae7d0773e565de7dd49a2694b38", + "datavalue": { + "value": {"text": "Lle\u00f3", "language": "ca"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, { + "snaktype": "value", + "property": "P2096", + "hash": "563784f05211416fda8662a0773f52165ccf6c2a", + "datavalue": { + "value": {"text": "Machu de lle\u00f3n en Namibia", "language": "ast"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, { + "snaktype": "value", + "property": "P2096", + "hash": "52722803d98964d77b79d3ed62bd24b4f25e6993", + "datavalue": { + "value": {"text": "\u043b\u044a\u0432", "language": "bg"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }] + }, + "qualifiers-order": ["P21", "P2096"], + "id": "q140$5903FDF3-DBBD-4527-A738-450EAEAA45CB", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P18", + "hash": "6907d4c168377a18d6a5eb390ab32a7da42d8218", + "datavalue": {"value": "Okonjima Lioness.jpg", "type": "string"}, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P21": [{ + "snaktype": "value", + "property": "P21", + "hash": "a274865baccd3ff04c28d5ffdcc12e0079f5a201", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 43445, "id": "Q43445"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P2096": [{ + "snaktype": "value", + "property": "P2096", + "hash": "a9d1363e8fc83ba822c45a81de59fe5b8eb434cf", + "datavalue": { + "value": { + "text": "\u043b\u044a\u0432\u0438\u0446\u0430", + "language": "bg" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, { + "snaktype": "value", + "property": "P2096", + "hash": "b36ab7371664b7b62ee7be65db4e248074a5330c", + "datavalue": { + "value": {"text": "Lleona n'Okonjima Lodge, Namibia", "language": "ast"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, { + "snaktype": "value", + "property": "P2096", + "hash": "31c78a574eabc0426d7984aa4988752e35b71f0c", + "datavalue": {"value": {"text": "lwica", "language": "pl"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }] + }, + "qualifiers-order": ["P21", "P2096"], + "id": "Q140$4da15225-f7dc-4942-a685-0669e5d3af14", + "rank": "normal" + }], + "P6573": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6573", + "hash": "c27b457b12eeecb053d60af6ecf9b0baa133bef5", + "datavalue": {"value": "L\u00f6we", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$45B1C3EB-E335-4245-A193-8C48B4953E51", "rank": "normal" + }], + "P443": [{ + "mainsnak": { + "snaktype": "value", + "property": "P443", + "hash": "8a9afb9293804f976c415060900bf9afbc2cfdff", + "datavalue": {"value": "LL-Q188 (deu)-Sebastian Wallroth-L\u00f6we.wav", "type": "string"}, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P407": [{ + "snaktype": "value", + "property": "P407", + "hash": "46bfd327b830f66f7061ea92d1be430c135fa91f", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 188, "id": "Q188"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P407"], + "id": "Q140$5EC64299-429F-45E8-B18F-19325401189C", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P443", + "hash": "7d058dfd1e8a41f026974faec3dc0588e29c6854", + "datavalue": {"value": "LL-Q150 (fra)-Ash Crow-lion.wav", "type": "string"}, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P407": [{ + "snaktype": "value", + "property": "P407", + "hash": "d197d0a5efa4b4c23a302a829dd3ef43684fe002", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 150, "id": "Q150"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P407"], + "id": "Q140$A4575261-6577-4EF6-A0C9-DA5FA523D1C2", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P443", + "hash": "79b9f51c9b4eec305813d5bb697b403d798cf1c5", + "datavalue": { + "value": "LL-Q33965 (sat)-Joy sagar Murmu-\u1c60\u1c69\u1c5e.wav", + "type": "string" + }, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P407": [{ + "snaktype": "value", + "property": "P407", + "hash": "58ae6998321952889f733126c11c582eeef20e72", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 33965, "id": "Q33965"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P407"], + "id": "Q140$7eedc8fa-4d1c-7ee9-3c67-0c89ef464d9f", + "rank": "normal", + "references": [{ + "hash": "d0b5c88b6f49dda9160c706291a9b8645825d99c", + "snaks": { + "P854": [{ + "snaktype": "value", + "property": "P854", + "hash": "38c1012cea9eb73cf1bd11eba0c2f745d2463340", + "datavalue": {"value": "https://lingualibre.org/wiki/Q403065", "type": "string"}, + "datatype": "url" + }] + }, + "snaks-order": ["P854"] + }] + }], + "P1296": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1296", + "hash": "c1f872d4cd22219a7315c0198a83c1918ded97ee", + "datavalue": {"value": "0120024", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$6C51384B-2EBF-4E6B-9201-A44F0A145C04", "rank": "normal" + }], + "P486": [{ + "mainsnak": { + "snaktype": "value", + "property": "P486", + "hash": "b7003b0fb28287301200b6b3871a5437d877913b", + "datavalue": {"value": "D008045", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$B2F98DD2-B679-43DD-B731-FA33FB1EE4B9", "rank": "normal" + }], + "P989": [{ + "mainsnak": { + "snaktype": "value", + "property": "P989", + "hash": "132884b2a696a8b56c8b1460e126f745e2fa6d01", + "datavalue": {"value": "Ru-Lion (intro).ogg", "type": "string"}, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P407": [{ + "snaktype": "value", + "property": "P407", + "hash": "d291ddb7cd77c94a7bd709a8395934147e0864fc", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 7737, "id": "Q7737"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P407"], + "id": "Q140$857D8831-673B-427E-A182-6A9FFA980424", + "rank": "normal" + }], + "P51": [{ + "mainsnak": { + "snaktype": "value", + "property": "P51", + "hash": "73b0e8c8458ebc27374fd08d8ef5241f2f28e3e9", + "datavalue": {"value": "Lion raring-sound1TamilNadu178.ogg", "type": "string"}, + "datatype": "commonsMedia" + }, "type": "statement", "id": "Q140$1c254aff-48b1-d3c5-930c-b360ce6fe043", "rank": "normal" + }], + "P4212": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4212", + "hash": "e006ce3295d617a4818dc758c28f444446538019", + "datavalue": {"value": "pcrt5TAeZsO7W4", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$AD6CD534-1FD2-4AC7-9CF8-9D2B4C46927C", "rank": "normal" + }], + "P2067": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2067", + "hash": "97a863433c30b47a6175abb95941d185397ea14a", + "datavalue": { + "value": {"amount": "+1.65", "unit": "http://www.wikidata.org/entity/Q11570"}, + "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "qualifiers": { + "P642": [{ + "snaktype": "value", + "property": "P642", + "hash": "f5e24bc6ec443d6cb3678e4561bc298090b54f60", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 4128476, "id": "Q4128476"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P642"], + "id": "Q140$198da244-7e66-4258-9434-537e9ce0ffab", + "rank": "normal", + "references": [{ + "hash": "94a79329d5eac70f7ddb005e0d1dc78c53e77797", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4a7fef7ea264a7c71765ce60e3d42f4c043c9646", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45106562, + "id": "Q45106562" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2067", + "hash": "ba9933059ce368e3afde1e96d78b1217172c954e", + "datavalue": { + "value": {"amount": "+188", "unit": "http://www.wikidata.org/entity/Q11570"}, + "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "qualifiers": { + "P642": [{ + "snaktype": "value", + "property": "P642", + "hash": "b388540fc86300a506b3a753ec58dec445525ffa", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 78101716, + "id": "Q78101716" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P21": [{ + "snaktype": "value", + "property": "P21", + "hash": "0576a008261e5b2544d1ff3328c94bd529379536", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 44148, "id": "Q44148"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P642", "P21"], + "id": "Q140$a3092626-4295-efb8-bbb6-eed913d02fc7", + "rank": "normal", + "references": [{ + "hash": "94a79329d5eac70f7ddb005e0d1dc78c53e77797", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4a7fef7ea264a7c71765ce60e3d42f4c043c9646", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45106562, + "id": "Q45106562" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2067", + "hash": "6951281811b2a8a3a78044e2003d6c162d5ba1a3", + "datavalue": { + "value": {"amount": "+126", "unit": "http://www.wikidata.org/entity/Q11570"}, + "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "qualifiers": { + "P642": [{ + "snaktype": "value", + "property": "P642", + "hash": "b388540fc86300a506b3a753ec58dec445525ffa", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 78101716, + "id": "Q78101716" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P21": [{ + "snaktype": "value", + "property": "P21", + "hash": "a274865baccd3ff04c28d5ffdcc12e0079f5a201", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 43445, "id": "Q43445"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P642", "P21"], + "id": "Q140$20d80fe2-4796-23d1-42c2-c103546aa874", + "rank": "normal", + "references": [{ + "hash": "94a79329d5eac70f7ddb005e0d1dc78c53e77797", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4a7fef7ea264a7c71765ce60e3d42f4c043c9646", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45106562, + "id": "Q45106562" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }], + "P7725": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7725", + "hash": "e9338e052dfaa9267c2357bec2e167ca625af667", + "datavalue": { + "value": { + "amount": "+2.5", + "unit": "1", + "upperBound": "+4.0", + "lowerBound": "+1.0" + }, "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "id": "Q140$f1f04a23-0d34-484a-9419-78d12958170c", + "rank": "normal", + "references": [{ + "hash": "94a79329d5eac70f7ddb005e0d1dc78c53e77797", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4a7fef7ea264a7c71765ce60e3d42f4c043c9646", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45106562, + "id": "Q45106562" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }], + "P4214": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4214", + "hash": "5a112dbdaed17b1ee3fe7a63b1f978e5fd41008a", + "datavalue": { + "value": {"amount": "+27", "unit": "http://www.wikidata.org/entity/Q577"}, + "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "id": "Q140$ec1ccab2-f506-4c81-9179-4625bbbbbe27", + "rank": "normal", + "references": [{ + "hash": "a8ccf5105b0e2623ae145dd8a9b927c9bd957ddf", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "5b45c23ddb076fe9c5accfe4a4bbd1c24c4c87cb", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 83566668, + "id": "Q83566668" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }], + "P7862": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7862", + "hash": "6e74ddb544498b93407179cc9a7f9b8610762ff5", + "datavalue": { + "value": {"amount": "+8", "unit": "http://www.wikidata.org/entity/Q5151"}, + "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "id": "Q140$17b64a1e-4a13-9e2a-f8a2-a9317890aa53", + "rank": "normal", + "references": [{ + "hash": "94a79329d5eac70f7ddb005e0d1dc78c53e77797", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4a7fef7ea264a7c71765ce60e3d42f4c043c9646", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45106562, + "id": "Q45106562" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }], + "P7818": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7818", + "hash": "5c7bac858cf66d079e6c13c88f3f001eb446cdce", + "datavalue": {"value": "Lion", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$C2D3546E-C42A-404A-A288-580F9C705E12", "rank": "normal" + }], + "P7829": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7829", + "hash": "17fbb02db65a7e80691f58be750382d61148406e", + "datavalue": {"value": "Lion", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$74998F51-E783-40CB-A56A-3189647AB3D4", "rank": "normal" + }], + "P7827": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7827", + "hash": "f85db9fe2c187554aefc51e5529d75e0c5af4767", + "datavalue": {"value": "Le\u00f3n", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$5DA64E1B-F1F1-4254-8629-985DFE8672A2", "rank": "normal" + }], + "P7822": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7822", + "hash": "3cd23fddc416227c2ba85d91aa03dc80a8e95836", + "datavalue": {"value": "Leone", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$DF657EF2-67A8-4272-871D-E95B3719A8B6", "rank": "normal" + }], + "P6105": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6105", + "hash": "8bbda0afe53fc428d3a0d9528c97d2145ee41dce", + "datavalue": {"value": "79432", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$2AE92335-1BC6-4B92-BAF3-9AB41608E638", "rank": "normal" + }], + "P6864": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6864", + "hash": "6f87ce0800057dbe88f27748b3077938973eb5c8", + "datavalue": {"value": "85426", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$9089C4B9-59A8-45A6-821B-05C1BB4C107C", "rank": "normal" + }], + "P2347": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2347", + "hash": "41e41b306cdd5e55007ac02da022d9f4ce230b03", + "datavalue": {"value": "7345", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$3CEB44D7-6C0B-4E66-87ED-37D723A1CCC8", + "rank": "normal", + "references": [{ + "hash": "f9bf1a1f034ddd51bd9928ac535e0f57d748e2cf", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "7133f11674741f52cadaae6029068fad9cbb52e3", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 89345680, + "id": "Q89345680" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }], + "P7033": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7033", + "hash": "e31b2e07ae0ce3d3a087d3c818c7bf29c7b04b72", + "datavalue": {"value": "scot/9244", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$F8148EB5-7934-4491-9B40-3378B7D292A6", "rank": "normal" + }], + "P8408": [{ + "mainsnak": { + "snaktype": "value", + "property": "P8408", + "hash": "51c04ed4f03488e8f428256ee41eb20eabe3ff38", + "datavalue": {"value": "Lion", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$2855E519-BCD1-4AB3-B3E9-BB53C5CB2E22", + "rank": "normal", + "references": [{ + "hash": "9a681f9dd95c90224547c404e11295f4f7dcf54e", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "9d5780dddffa8746637a9929a936ab6b0f601e24", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 64139102, + "id": "Q64139102" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "622a5a27fa5b25e7e7984974e9db494cf8460990", + "datavalue": { + "value": { + "time": "+2020-07-09T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P8519": [{ + "mainsnak": { + "snaktype": "value", + "property": "P8519", + "hash": "ad8031a668b5310633a04a9223714b3482d388b2", + "datavalue": {"value": "64570", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$ba4fa085-0e54-4226-a46b-770f7d5a995f", "rank": "normal" + }], + "P279": [{ + "mainsnak": { + "snaktype": "value", + "property": "P279", + "hash": "761c3439637add8f8fe3a351d6231333693835f6", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 6667323, "id": "Q6667323"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$cb41b7d3-46f0-e6d9-ced6-c2803e0c06b7", "rank": "normal" + }], + "P2670": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2670", + "hash": "6563f1e596253f1574515891267de01c5c1e688e", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 17611534, "id": "Q17611534"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$24984be4-4813-b6ad-ec83-1a37b7332c8a", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2670", + "hash": "684855138cc32d11b487d0178c194f10c63f5f86", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 98520146, "id": "Q98520146"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$56e8c9b3-4892-e95d-f7c5-02b10ffe77e8", "rank": "normal" + }], + "P31": [{ + "mainsnak": { + "snaktype": "value", + "property": "P31", + "hash": "06629d890d7ab0ff85c403d8aadf57ce9809c01f", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 16521, "id": "Q16521"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "q140$8EE98E5B-4A9C-4BF5-B456-FB77E8EE4E69", "rank": "normal" + }], + "P2581": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2581", + "hash": "beca27cf7dd079eb27b7690e13a446d98448ae91", + "datavalue": {"value": "00049156n", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$90562c9a-4e9c-082d-d577-e0869524d9a1", "rank": "normal" + }], + "P7506": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7506", + "hash": "0562f57f9a54c65a2d45711f6dd5dd53ce37f6f8", + "datavalue": {"value": "1107856", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$00d453bf-4786-bde9-63f4-2db9f3610e88", "rank": "normal" + }], + "P5184": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5184", + "hash": "201d8de9b05ae85fe4f917c7e54c4a0218517888", + "datavalue": {"value": "b11s0701a", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$a2b832c9-4c5c-e402-e10d-cf2b08d35a56", "rank": "normal" + }], + "P6900": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6900", + "hash": "f7218c6984cd57078497a62ad595b089bdd97c49", + "datavalue": {"value": "\u30e9\u30a4\u30aa\u30f3", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$d15d143d-4826-4860-9aa3-6a350d6bc36f", "rank": "normal" + }], + "P3553": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3553", + "hash": "c82c6e1156e098d5ef396248c412371b90e0dc56", + "datavalue": {"value": "19563862", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$5edb95fa-4647-2e9a-9dbf-b68e1326eb79", "rank": "normal" + }], + "P5337": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5337", + "hash": "793cfa52df3c5a6747c0cb5db959db944b04dbed", + "datavalue": { + "value": "CAAqIQgKIhtDQkFTRGdvSUwyMHZNRGsyYldJU0FtcGhLQUFQAQ", + "type": "string" + }, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$6137dbc1-4c6a-af60-00ee-2a32c63bfdfa", "rank": "normal" + }], + "P6200": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6200", + "hash": "0ce08dd38017230d41f530f6e97baf484f607235", + "datavalue": {"value": "ce2gz91pyv2t", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$01ed0f16-4a4a-213d-e457-0d4d5d670d49", "rank": "normal" + }], + "P4527": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4527", + "hash": "b07d29aa5112080a9294a7421e46ed0b73ac96c7", + "datavalue": {"value": "430792", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ + "snaktype": "value", + "property": "P1810", + "hash": "7d78547303d5e9e014a7c8cef6072faee91088ce", + "datavalue": {"value": "Lions", "type": "string"}, + "datatype": "string" + }] + }, + "qualifiers-order": ["P1810"], + "id": "Q140$C37C600C-4929-4203-A06E-8D797BA9B22A", + "rank": "normal" + }], + "P8989": [{ + "mainsnak": { + "snaktype": "value", + "property": "P8989", + "hash": "37087c42c921d83773f62d77e7360dc44504c122", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 104595349, "id": "Q104595349"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$1ece61f5-c008-4750-8b67-e15337f28e86", "rank": "normal" + }], + "P1552": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1552", + "hash": "1aa7db66bfad11e427c40ec79f3295de877967f1", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 120446, "id": "Q120446"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$0bd4b0d9-49ff-b5b4-5c10-9500bc0ce19d", "rank": "normal" + }], + "P9198": [{ + "mainsnak": { + "snaktype": "value", + "property": "P9198", + "hash": "d3ab4ab9d788dc348d16e13fc77164ea71cef2ae", + "datavalue": {"value": "352", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$C5D80C89-2862-490F-AA85-C260F32BE30B", "rank": "normal" + }], + "P9566": [{ + "mainsnak": { + "snaktype": "value", + "property": "P9566", + "hash": "053e0b7c15c8e5a61a71077c4cffa73b9d03005b", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 3255068, "id": "Q3255068"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q140$C7DAEA4E-B613-48A6-BFCD-88B551D1EF7A", + "rank": "normal", + "references": [{ + "hash": "0eedf63ac49c9b21aa7ff0a5e70b71aa6069a8ed", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "abfcfc68aa085f872d633958be83cba2ab96ce4a", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1637051, + "id": "Q1637051" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }, { + "hash": "6db51e3163554f674ff270c93a2871c8d859a49e", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "abfcfc68aa085f872d633958be83cba2ab96ce4a", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1637051, + "id": "Q1637051" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P577": [{ + "snaktype": "value", + "property": "P577", + "hash": "ccd6ea06a2c9c0f54f5b1f45991a659225b5f4ef", + "datavalue": { + "value": { + "time": "+2013-01-01T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 9, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P577"] + }] + }], + "P508": [{ + "mainsnak": { + "snaktype": "value", + "property": "P508", + "hash": "e87c854abf600fb5de7b9b677d94a06e18851333", + "datavalue": {"value": "34922", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ + "snaktype": "value", + "property": "P1810", + "hash": "137692b9bcc178e7b7d232631cb607d45e2f543d", + "datavalue": {"value": "Leoni", "type": "string"}, + "datatype": "string" + }], + "P4970": [{ + "snaktype": "value", + "property": "P4970", + "hash": "271ec192bf14b9eb639120c60d5961ab8692444d", + "datavalue": {"value": "Panthera leo", "type": "string"}, + "datatype": "string" + }] + }, + "qualifiers-order": ["P1810", "P4970"], + "id": "Q140$52702f98-7843-4e0e-b646-76629e04e555", + "rank": "normal" + }], + "P950": [{ + "mainsnak": { + "snaktype": "value", + "property": "P950", + "hash": "f447323110fd744383394f91c2dfba2fc3187242", + "datavalue": {"value": "XX530613", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ + "snaktype": "value", + "property": "P1810", + "hash": "e2b2bda5457e0d5f7859e5c54996e1884062dfd1", + "datavalue": {"value": "Leones", "type": "string"}, + "datatype": "string" + }] + }, + "qualifiers-order": ["P1810"], + "id": "Q140$773f47cf-3133-4892-80eb-9d4dc5e97582", + "rank": "normal", + "references": [{ + "hash": "184729506e049d06de85686ede30c92b3e52451d", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "3b090a7bae73c288393b2c8b9846cc7ed9a58f91", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 16583225, + "id": "Q16583225" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P854": [{ + "snaktype": "value", + "property": "P854", + "hash": "b16c3ffac23bb97abe5d0c4d6ccffe4d010ab71a", + "datavalue": { + "value": "https://thes.bncf.firenze.sbn.it/termine.php?id=34922", + "type": "string" + }, + "datatype": "url" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "7721e97431215c374db84a9df785dc964a16bd17", + "datavalue": { + "value": { + "time": "+2021-06-15T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P854", "P813"] + }] + }], + "P7603": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7603", + "hash": "c86436e278d690f057cfecc86babf982948015f3", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 2851528, "id": "Q2851528"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P17": [{ + "snaktype": "value", + "property": "P17", + "hash": "18fb076bdc1c07e578546d1670ba193b768531ac", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 668, "id": "Q668"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P17"], + "id": "Q140$64262d09-4a19-3945-8a09-c2195b7614a7", + "rank": "normal" + }], + "P6800": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6800", + "hash": "1da99908e2ffdf6de901a1b8a2dbab0c62886565", + "datavalue": {"value": "http://www.ensembl.org/Panthera_leo", "type": "string"}, + "datatype": "url" + }, + "type": "statement", + "id": "Q140$87DC0D37-FC9E-4FFE-B92D-1A3A7C019A1D", + "rank": "normal", + "references": [{ + "hash": "53eb51e25c6356d2d4673dc249ea837dd14feca0", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4ec639fccc9ddb8e079f7d27ca43220e3c512c20", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1344256, + "id": "Q1344256" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }] + }, + "sitelinks": { + "abwiki": { + "site": "abwiki", + "title": "\u0410\u043b\u044b\u043c", + "badges": [], + "url": "https://ab.wikipedia.org/wiki/%D0%90%D0%BB%D1%8B%D0%BC" + }, + "adywiki": { + "site": "adywiki", + "title": "\u0410\u0441\u043b\u044a\u0430\u043d", + "badges": [], + "url": "https://ady.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D1%8A%D0%B0%D0%BD" + }, + "afwiki": { + "site": "afwiki", + "title": "Leeu", + "badges": ["Q17437796"], + "url": "https://af.wikipedia.org/wiki/Leeu" + }, + "alswiki": { + "site": "alswiki", + "title": "L\u00f6we", + "badges": [], + "url": "https://als.wikipedia.org/wiki/L%C3%B6we" + }, + "altwiki": { + "site": "altwiki", + "title": "\u0410\u0440\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://alt.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D0%B0%D0%BD" + }, + "amwiki": { + "site": "amwiki", + "title": "\u12a0\u1295\u1260\u1233", + "badges": [], + "url": "https://am.wikipedia.org/wiki/%E1%8A%A0%E1%8A%95%E1%89%A0%E1%88%B3" + }, + "angwiki": { + "site": "angwiki", + "title": "L\u0113o", + "badges": [], + "url": "https://ang.wikipedia.org/wiki/L%C4%93o" + }, + "anwiki": { + "site": "anwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://an.wikipedia.org/wiki/Panthera_leo" + }, + "arcwiki": { + "site": "arcwiki", + "title": "\u0710\u072a\u071d\u0710", + "badges": [], + "url": "https://arc.wikipedia.org/wiki/%DC%90%DC%AA%DC%9D%DC%90" + }, + "arwiki": { + "site": "arwiki", + "title": "\u0623\u0633\u062f", + "badges": ["Q17437796"], + "url": "https://ar.wikipedia.org/wiki/%D8%A3%D8%B3%D8%AF" + }, + "arywiki": { + "site": "arywiki", + "title": "\u0633\u0628\u0639", + "badges": [], + "url": "https://ary.wikipedia.org/wiki/%D8%B3%D8%A8%D8%B9" + }, + "arzwiki": { + "site": "arzwiki", + "title": "\u0633\u0628\u0639", + "badges": [], + "url": "https://arz.wikipedia.org/wiki/%D8%B3%D8%A8%D8%B9" + }, + "astwiki": { + "site": "astwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://ast.wikipedia.org/wiki/Panthera_leo" + }, + "aswiki": { + "site": "aswiki", + "title": "\u09b8\u09bf\u0982\u09b9", + "badges": [], + "url": "https://as.wikipedia.org/wiki/%E0%A6%B8%E0%A6%BF%E0%A6%82%E0%A6%B9" + }, + "avkwiki": { + "site": "avkwiki", + "title": "Krapol (Panthera leo)", + "badges": [], + "url": "https://avk.wikipedia.org/wiki/Krapol_(Panthera_leo)" + }, + "avwiki": { + "site": "avwiki", + "title": "\u0413\u044a\u0430\u043b\u0431\u0430\u0446\u04c0", + "badges": [], + "url": "https://av.wikipedia.org/wiki/%D0%93%D1%8A%D0%B0%D0%BB%D0%B1%D0%B0%D1%86%D3%80" + }, + "azbwiki": { + "site": "azbwiki", + "title": "\u0622\u0633\u0644\u0627\u0646", + "badges": [], + "url": "https://azb.wikipedia.org/wiki/%D8%A2%D8%B3%D9%84%D8%A7%D9%86" + }, + "azwiki": { + "site": "azwiki", + "title": "\u015eir", + "badges": [], + "url": "https://az.wikipedia.org/wiki/%C5%9Eir" + }, + "bat_smgwiki": { + "site": "bat_smgwiki", + "title": "Li\u016bts", + "badges": [], + "url": "https://bat-smg.wikipedia.org/wiki/Li%C5%ABts" + }, + "bawiki": { + "site": "bawiki", + "title": "\u0410\u0440\u044b\u04ab\u043b\u0430\u043d", + "badges": [], + "url": "https://ba.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D2%AB%D0%BB%D0%B0%D0%BD" + }, + "bclwiki": { + "site": "bclwiki", + "title": "Leon", + "badges": [], + "url": "https://bcl.wikipedia.org/wiki/Leon" + }, + "be_x_oldwiki": { + "site": "be_x_oldwiki", + "title": "\u041b\u0435\u045e", + "badges": [], + "url": "https://be-tarask.wikipedia.org/wiki/%D0%9B%D0%B5%D1%9E" + }, + "bewiki": { + "site": "bewiki", + "title": "\u041b\u0435\u045e", + "badges": [], + "url": "https://be.wikipedia.org/wiki/%D0%9B%D0%B5%D1%9E" + }, + "bgwiki": { + "site": "bgwiki", + "title": "\u041b\u044a\u0432", + "badges": [], + "url": "https://bg.wikipedia.org/wiki/%D0%9B%D1%8A%D0%B2" + }, + "bhwiki": { + "site": "bhwiki", + "title": "\u0938\u093f\u0902\u0939", + "badges": [], + "url": "https://bh.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9" + }, + "bmwiki": { + "site": "bmwiki", + "title": "Waraba", + "badges": [], + "url": "https://bm.wikipedia.org/wiki/Waraba" + }, + "bnwiki": { + "site": "bnwiki", + "title": "\u09b8\u09bf\u0982\u09b9", + "badges": [], + "url": "https://bn.wikipedia.org/wiki/%E0%A6%B8%E0%A6%BF%E0%A6%82%E0%A6%B9" + }, + "bowiki": { + "site": "bowiki", + "title": "\u0f66\u0f7a\u0f44\u0f0b\u0f42\u0f7a\u0f0d", + "badges": [], + "url": "https://bo.wikipedia.org/wiki/%E0%BD%A6%E0%BD%BA%E0%BD%84%E0%BC%8B%E0%BD%82%E0%BD%BA%E0%BC%8D" + }, + "bpywiki": { + "site": "bpywiki", + "title": "\u09a8\u0982\u09b8\u09be", + "badges": [], + "url": "https://bpy.wikipedia.org/wiki/%E0%A6%A8%E0%A6%82%E0%A6%B8%E0%A6%BE" + }, + "brwiki": { + "site": "brwiki", + "title": "Leon (loen)", + "badges": [], + "url": "https://br.wikipedia.org/wiki/Leon_(loen)" + }, + "bswiki": { + "site": "bswiki", + "title": "Lav", + "badges": [], + "url": "https://bs.wikipedia.org/wiki/Lav" + }, + "bswikiquote": { + "site": "bswikiquote", + "title": "Lav", + "badges": [], + "url": "https://bs.wikiquote.org/wiki/Lav" + }, + "bxrwiki": { + "site": "bxrwiki", + "title": "\u0410\u0440\u0441\u0430\u043b\u0430\u043d", + "badges": [], + "url": "https://bxr.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%B0%D0%BB%D0%B0%D0%BD" + }, + "cawiki": { + "site": "cawiki", + "title": "Lle\u00f3", + "badges": ["Q17437796"], + "url": "https://ca.wikipedia.org/wiki/Lle%C3%B3" + }, + "cawikiquote": { + "site": "cawikiquote", + "title": "Lle\u00f3", + "badges": [], + "url": "https://ca.wikiquote.org/wiki/Lle%C3%B3" + }, + "cdowiki": { + "site": "cdowiki", + "title": "S\u0103i (m\u00e0-ku\u014f d\u00f4ng-\u016dk)", + "badges": [], + "url": "https://cdo.wikipedia.org/wiki/S%C4%83i_(m%C3%A0-ku%C5%8F_d%C3%B4ng-%C5%ADk)" + }, + "cebwiki": { + "site": "cebwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://ceb.wikipedia.org/wiki/Panthera_leo" + }, + "cewiki": { + "site": "cewiki", + "title": "\u041b\u043e\u043c", + "badges": [], + "url": "https://ce.wikipedia.org/wiki/%D0%9B%D0%BE%D0%BC" + }, + "chrwiki": { + "site": "chrwiki", + "title": "\u13e2\u13d3\u13e5 \u13a4\u13c3\u13d5\u13be", + "badges": [], + "url": "https://chr.wikipedia.org/wiki/%E1%8F%A2%E1%8F%93%E1%8F%A5_%E1%8E%A4%E1%8F%83%E1%8F%95%E1%8E%BE" + }, + "chywiki": { + "site": "chywiki", + "title": "P\u00e9hpe'\u00e9nan\u00f3se'hame", + "badges": [], + "url": "https://chy.wikipedia.org/wiki/P%C3%A9hpe%27%C3%A9nan%C3%B3se%27hame" + }, + "ckbwiki": { + "site": "ckbwiki", + "title": "\u0634\u06ce\u0631", + "badges": [], + "url": "https://ckb.wikipedia.org/wiki/%D8%B4%DB%8E%D8%B1" + }, + "commonswiki": { + "site": "commonswiki", + "title": "Panthera leo", + "badges": [], + "url": "https://commons.wikimedia.org/wiki/Panthera_leo" + }, + "cowiki": { + "site": "cowiki", + "title": "Lionu", + "badges": [], + "url": "https://co.wikipedia.org/wiki/Lionu" + }, + "csbwiki": { + "site": "csbwiki", + "title": "Lew", + "badges": [], + "url": "https://csb.wikipedia.org/wiki/Lew" + }, + "cswiki": { + "site": "cswiki", + "title": "Lev", + "badges": [], + "url": "https://cs.wikipedia.org/wiki/Lev" + }, + "cswikiquote": { + "site": "cswikiquote", + "title": "Lev", + "badges": [], + "url": "https://cs.wikiquote.org/wiki/Lev" + }, + "cuwiki": { + "site": "cuwiki", + "title": "\u041b\u044c\u0432\u044a", + "badges": [], + "url": "https://cu.wikipedia.org/wiki/%D0%9B%D1%8C%D0%B2%D1%8A" + }, + "cvwiki": { + "site": "cvwiki", + "title": "\u0410\u0440\u0103\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://cv.wikipedia.org/wiki/%D0%90%D1%80%C4%83%D1%81%D0%BB%D0%B0%D0%BD" + }, + "cywiki": { + "site": "cywiki", + "title": "Llew", + "badges": [], + "url": "https://cy.wikipedia.org/wiki/Llew" + }, + "dagwiki": { + "site": "dagwiki", + "title": "Gbu\u0263inli", + "badges": [], + "url": "https://dag.wikipedia.org/wiki/Gbu%C9%A3inli" + }, + "dawiki": { + "site": "dawiki", + "title": "L\u00f8ve", + "badges": ["Q17559452"], + "url": "https://da.wikipedia.org/wiki/L%C3%B8ve" + }, + "dewiki": { + "site": "dewiki", + "title": "L\u00f6we", + "badges": ["Q17437796"], + "url": "https://de.wikipedia.org/wiki/L%C3%B6we" + }, + "dewikiquote": { + "site": "dewikiquote", + "title": "L\u00f6we", + "badges": [], + "url": "https://de.wikiquote.org/wiki/L%C3%B6we" + }, + "dinwiki": { + "site": "dinwiki", + "title": "K\u00f6r", + "badges": [], + "url": "https://din.wikipedia.org/wiki/K%C3%B6r" + }, + "diqwiki": { + "site": "diqwiki", + "title": "\u015e\u00ear", + "badges": [], + "url": "https://diq.wikipedia.org/wiki/%C5%9E%C3%AAr" + }, + "dsbwiki": { + "site": "dsbwiki", + "title": "Law", + "badges": [], + "url": "https://dsb.wikipedia.org/wiki/Law" + }, + "eewiki": { + "site": "eewiki", + "title": "Dzata", + "badges": [], + "url": "https://ee.wikipedia.org/wiki/Dzata" + }, + "elwiki": { + "site": "elwiki", + "title": "\u039b\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9", + "badges": [], + "url": "https://el.wikipedia.org/wiki/%CE%9B%CE%B9%CE%BF%CE%BD%CF%84%CE%AC%CF%81%CE%B9" + }, + "enwiki": { + "site": "enwiki", + "title": "Lion", + "badges": ["Q17437796"], + "url": "https://en.wikipedia.org/wiki/Lion" + }, + "enwikiquote": { + "site": "enwikiquote", + "title": "Lions", + "badges": [], + "url": "https://en.wikiquote.org/wiki/Lions" + }, + "eowiki": { + "site": "eowiki", + "title": "Leono", + "badges": [], + "url": "https://eo.wikipedia.org/wiki/Leono" + }, + "eowikiquote": { + "site": "eowikiquote", + "title": "Leono", + "badges": [], + "url": "https://eo.wikiquote.org/wiki/Leono" + }, + "eswiki": { + "site": "eswiki", + "title": "Panthera leo", + "badges": ["Q17437796"], + "url": "https://es.wikipedia.org/wiki/Panthera_leo" + }, + "eswikiquote": { + "site": "eswikiquote", + "title": "Le\u00f3n", + "badges": [], + "url": "https://es.wikiquote.org/wiki/Le%C3%B3n" + }, + "etwiki": { + "site": "etwiki", + "title": "L\u00f5vi", + "badges": [], + "url": "https://et.wikipedia.org/wiki/L%C3%B5vi" + }, + "etwikiquote": { + "site": "etwikiquote", + "title": "L\u00f5vi", + "badges": [], + "url": "https://et.wikiquote.org/wiki/L%C3%B5vi" + }, + "euwiki": { + "site": "euwiki", + "title": "Lehoi", + "badges": [], + "url": "https://eu.wikipedia.org/wiki/Lehoi" + }, + "extwiki": { + "site": "extwiki", + "title": "Li\u00f3n (animal)", + "badges": [], + "url": "https://ext.wikipedia.org/wiki/Li%C3%B3n_(animal)" + }, + "fawiki": { + "site": "fawiki", + "title": "\u0634\u06cc\u0631 (\u06af\u0631\u0628\u0647\u200c\u0633\u0627\u0646)", + "badges": ["Q17437796"], + "url": "https://fa.wikipedia.org/wiki/%D8%B4%DB%8C%D8%B1_(%DA%AF%D8%B1%D8%A8%D9%87%E2%80%8C%D8%B3%D8%A7%D9%86)" + }, + "fawikiquote": { + "site": "fawikiquote", + "title": "\u0634\u06cc\u0631", + "badges": [], + "url": "https://fa.wikiquote.org/wiki/%D8%B4%DB%8C%D8%B1" + }, + "fiu_vrowiki": { + "site": "fiu_vrowiki", + "title": "L\u00f5vi", + "badges": [], + "url": "https://fiu-vro.wikipedia.org/wiki/L%C3%B5vi" + }, + "fiwiki": { + "site": "fiwiki", + "title": "Leijona", + "badges": ["Q17437796"], + "url": "https://fi.wikipedia.org/wiki/Leijona" + }, + "fowiki": { + "site": "fowiki", + "title": "Leyva", + "badges": [], + "url": "https://fo.wikipedia.org/wiki/Leyva" + }, + "frrwiki": { + "site": "frrwiki", + "title": "L\u00f6\u00f6w", + "badges": [], + "url": "https://frr.wikipedia.org/wiki/L%C3%B6%C3%B6w" + }, + "frwiki": { + "site": "frwiki", + "title": "Lion", + "badges": ["Q17437796"], + "url": "https://fr.wikipedia.org/wiki/Lion" + }, + "frwikiquote": { + "site": "frwikiquote", + "title": "Lion", + "badges": [], + "url": "https://fr.wikiquote.org/wiki/Lion" + }, + "gagwiki": { + "site": "gagwiki", + "title": "Aslan", + "badges": [], + "url": "https://gag.wikipedia.org/wiki/Aslan" + }, + "gawiki": { + "site": "gawiki", + "title": "Leon", + "badges": [], + "url": "https://ga.wikipedia.org/wiki/Leon" + }, + "gdwiki": { + "site": "gdwiki", + "title": "Le\u00f2mhann", + "badges": [], + "url": "https://gd.wikipedia.org/wiki/Le%C3%B2mhann" + }, + "glwiki": { + "site": "glwiki", + "title": "Le\u00f3n", + "badges": [], + "url": "https://gl.wikipedia.org/wiki/Le%C3%B3n" + }, + "gnwiki": { + "site": "gnwiki", + "title": "Le\u00f5", + "badges": [], + "url": "https://gn.wikipedia.org/wiki/Le%C3%B5" + }, + "gotwiki": { + "site": "gotwiki", + "title": "\ud800\udf3b\ud800\udf39\ud800\udf45\ud800\udf30", + "badges": [], + "url": "https://got.wikipedia.org/wiki/%F0%90%8C%BB%F0%90%8C%B9%F0%90%8D%85%F0%90%8C%B0" + }, + "guwiki": { + "site": "guwiki", + "title": "\u0a8f\u0ab6\u0abf\u0aaf\u0abe\u0a87 \u0ab8\u0abf\u0a82\u0ab9", + "badges": [], + "url": "https://gu.wikipedia.org/wiki/%E0%AA%8F%E0%AA%B6%E0%AA%BF%E0%AA%AF%E0%AA%BE%E0%AA%87_%E0%AA%B8%E0%AA%BF%E0%AA%82%E0%AA%B9" + }, + "hakwiki": { + "site": "hakwiki", + "title": "S\u1e73\u0302-\u00e9", + "badges": [], + "url": "https://hak.wikipedia.org/wiki/S%E1%B9%B3%CC%82-%C3%A9" + }, + "hawiki": { + "site": "hawiki", + "title": "Zaki", + "badges": [], + "url": "https://ha.wikipedia.org/wiki/Zaki" + }, + "hawwiki": { + "site": "hawwiki", + "title": "Liona", + "badges": [], + "url": "https://haw.wikipedia.org/wiki/Liona" + }, + "hewiki": { + "site": "hewiki", + "title": "\u05d0\u05e8\u05d9\u05d4", + "badges": [], + "url": "https://he.wikipedia.org/wiki/%D7%90%D7%A8%D7%99%D7%94" + }, + "hewikiquote": { + "site": "hewikiquote", + "title": "\u05d0\u05e8\u05d9\u05d4", + "badges": [], + "url": "https://he.wikiquote.org/wiki/%D7%90%D7%A8%D7%99%D7%94" + }, + "hifwiki": { + "site": "hifwiki", + "title": "Ser", + "badges": [], + "url": "https://hif.wikipedia.org/wiki/Ser" + }, + "hiwiki": { + "site": "hiwiki", + "title": "\u0938\u093f\u0902\u0939 (\u092a\u0936\u0941)", + "badges": [], + "url": "https://hi.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9_(%E0%A4%AA%E0%A4%B6%E0%A5%81)" + }, + "hrwiki": { + "site": "hrwiki", + "title": "Lav", + "badges": [], + "url": "https://hr.wikipedia.org/wiki/Lav" + }, + "hrwikiquote": { + "site": "hrwikiquote", + "title": "Lav", + "badges": [], + "url": "https://hr.wikiquote.org/wiki/Lav" + }, + "hsbwiki": { + "site": "hsbwiki", + "title": "Law", + "badges": [], + "url": "https://hsb.wikipedia.org/wiki/Law" + }, + "htwiki": { + "site": "htwiki", + "title": "Lyon", + "badges": [], + "url": "https://ht.wikipedia.org/wiki/Lyon" + }, + "huwiki": { + "site": "huwiki", + "title": "Oroszl\u00e1n", + "badges": [], + "url": "https://hu.wikipedia.org/wiki/Oroszl%C3%A1n" + }, + "hywiki": { + "site": "hywiki", + "title": "\u0531\u057c\u0575\u0578\u0582\u056e", + "badges": [], + "url": "https://hy.wikipedia.org/wiki/%D4%B1%D5%BC%D5%B5%D5%B8%D6%82%D5%AE" + }, + "hywikiquote": { + "site": "hywikiquote", + "title": "\u0531\u057c\u0575\u0578\u0582\u056e", + "badges": [], + "url": "https://hy.wikiquote.org/wiki/%D4%B1%D5%BC%D5%B5%D5%B8%D6%82%D5%AE" + }, + "hywwiki": { + "site": "hywwiki", + "title": "\u0531\u057c\u056b\u0582\u056e", + "badges": [], + "url": "https://hyw.wikipedia.org/wiki/%D4%B1%D5%BC%D5%AB%D6%82%D5%AE" + }, + "iawiki": { + "site": "iawiki", + "title": "Leon", + "badges": [], + "url": "https://ia.wikipedia.org/wiki/Leon" + }, + "idwiki": { + "site": "idwiki", + "title": "Singa", + "badges": [], + "url": "https://id.wikipedia.org/wiki/Singa" + }, + "igwiki": { + "site": "igwiki", + "title": "Od\u00fam", + "badges": [], + "url": "https://ig.wikipedia.org/wiki/Od%C3%BAm" + }, + "ilowiki": { + "site": "ilowiki", + "title": "Leon", + "badges": [], + "url": "https://ilo.wikipedia.org/wiki/Leon" + }, + "inhwiki": { + "site": "inhwiki", + "title": "\u041b\u043e\u043c", + "badges": [], + "url": "https://inh.wikipedia.org/wiki/%D0%9B%D0%BE%D0%BC" + }, + "iowiki": { + "site": "iowiki", + "title": "Leono (mamifero)", + "badges": [], + "url": "https://io.wikipedia.org/wiki/Leono_(mamifero)" + }, + "iswiki": { + "site": "iswiki", + "title": "Lj\u00f3n", + "badges": [], + "url": "https://is.wikipedia.org/wiki/Lj%C3%B3n" + }, + "itwiki": { + "site": "itwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://it.wikipedia.org/wiki/Panthera_leo" + }, + "itwikiquote": { + "site": "itwikiquote", + "title": "Leone", + "badges": [], + "url": "https://it.wikiquote.org/wiki/Leone" + }, + "jawiki": { + "site": "jawiki", + "title": "\u30e9\u30a4\u30aa\u30f3", + "badges": [], + "url": "https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%82%AA%E3%83%B3" + }, + "jawikiquote": { + "site": "jawikiquote", + "title": "\u7345\u5b50", + "badges": [], + "url": "https://ja.wikiquote.org/wiki/%E7%8D%85%E5%AD%90" + }, + "jbowiki": { + "site": "jbowiki", + "title": "cinfo", + "badges": [], + "url": "https://jbo.wikipedia.org/wiki/cinfo" + }, + "jvwiki": { + "site": "jvwiki", + "title": "Singa", + "badges": [], + "url": "https://jv.wikipedia.org/wiki/Singa" + }, + "kabwiki": { + "site": "kabwiki", + "title": "Izem", + "badges": [], + "url": "https://kab.wikipedia.org/wiki/Izem" + }, + "kawiki": { + "site": "kawiki", + "title": "\u10da\u10dd\u10db\u10d8", + "badges": [], + "url": "https://ka.wikipedia.org/wiki/%E1%83%9A%E1%83%9D%E1%83%9B%E1%83%98" + }, + "kbdwiki": { + "site": "kbdwiki", + "title": "\u0425\u044c\u044d\u0449", + "badges": [], + "url": "https://kbd.wikipedia.org/wiki/%D0%A5%D1%8C%D1%8D%D1%89" + }, + "kbpwiki": { + "site": "kbpwiki", + "title": "T\u0254\u0254y\u028b\u028b", + "badges": [], + "url": "https://kbp.wikipedia.org/wiki/T%C9%94%C9%94y%CA%8B%CA%8B" + }, + "kgwiki": { + "site": "kgwiki", + "title": "Nkosi", + "badges": [], + "url": "https://kg.wikipedia.org/wiki/Nkosi" + }, + "kkwiki": { + "site": "kkwiki", + "title": "\u0410\u0440\u044b\u0441\u0442\u0430\u043d", + "badges": [], + "url": "https://kk.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D1%82%D0%B0%D0%BD" + }, + "knwiki": { + "site": "knwiki", + "title": "\u0cb8\u0cbf\u0c82\u0cb9", + "badges": [], + "url": "https://kn.wikipedia.org/wiki/%E0%B2%B8%E0%B2%BF%E0%B2%82%E0%B2%B9" + }, + "kowiki": { + "site": "kowiki", + "title": "\uc0ac\uc790", + "badges": [], + "url": "https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9E%90" + }, + "kowikiquote": { + "site": "kowikiquote", + "title": "\uc0ac\uc790", + "badges": [], + "url": "https://ko.wikiquote.org/wiki/%EC%82%AC%EC%9E%90" + }, + "kswiki": { + "site": "kswiki", + "title": "\u067e\u0627\u062f\u064e\u0631 \u0633\u0655\u06c1\u06c1", + "badges": [], + "url": "https://ks.wikipedia.org/wiki/%D9%BE%D8%A7%D8%AF%D9%8E%D8%B1_%D8%B3%D9%95%DB%81%DB%81" + }, + "kuwiki": { + "site": "kuwiki", + "title": "\u015e\u00ear", + "badges": [], + "url": "https://ku.wikipedia.org/wiki/%C5%9E%C3%AAr" + }, + "kwwiki": { + "site": "kwwiki", + "title": "Lew", + "badges": [], + "url": "https://kw.wikipedia.org/wiki/Lew" + }, + "kywiki": { + "site": "kywiki", + "title": "\u0410\u0440\u0441\u0442\u0430\u043d", + "badges": [], + "url": "https://ky.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D1%82%D0%B0%D0%BD" + }, + "lawiki": { + "site": "lawiki", + "title": "Leo", + "badges": [], + "url": "https://la.wikipedia.org/wiki/Leo" + }, + "lawikiquote": { + "site": "lawikiquote", + "title": "Leo", + "badges": [], + "url": "https://la.wikiquote.org/wiki/Leo" + }, + "lbewiki": { + "site": "lbewiki", + "title": "\u0410\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://lbe.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D0%B0%D0%BD" + }, + "lbwiki": { + "site": "lbwiki", + "title": "L\u00e9iw", + "badges": [], + "url": "https://lb.wikipedia.org/wiki/L%C3%A9iw" + }, + "lezwiki": { + "site": "lezwiki", + "title": "\u0410\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://lez.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D0%B0%D0%BD" + }, + "lfnwiki": { + "site": "lfnwiki", + "title": "Leon", + "badges": [], + "url": "https://lfn.wikipedia.org/wiki/Leon" + }, + "lijwiki": { + "site": "lijwiki", + "title": "Lion (bestia)", + "badges": [], + "url": "https://lij.wikipedia.org/wiki/Lion_(bestia)" + }, + "liwiki": { + "site": "liwiki", + "title": "Liew", + "badges": ["Q17437796"], + "url": "https://li.wikipedia.org/wiki/Liew" + }, + "lldwiki": { + "site": "lldwiki", + "title": "Lion", + "badges": [], + "url": "https://lld.wikipedia.org/wiki/Lion" + }, + "lmowiki": { + "site": "lmowiki", + "title": "Panthera leo", + "badges": [], + "url": "https://lmo.wikipedia.org/wiki/Panthera_leo" + }, + "lnwiki": { + "site": "lnwiki", + "title": "Nk\u0254\u0301si", + "badges": [], + "url": "https://ln.wikipedia.org/wiki/Nk%C9%94%CC%81si" + }, + "ltgwiki": { + "site": "ltgwiki", + "title": "\u013bovs", + "badges": [], + "url": "https://ltg.wikipedia.org/wiki/%C4%BBovs" + }, + "ltwiki": { + "site": "ltwiki", + "title": "Li\u016btas", + "badges": [], + "url": "https://lt.wikipedia.org/wiki/Li%C5%ABtas" + }, + "ltwikiquote": { + "site": "ltwikiquote", + "title": "Li\u016btas", + "badges": [], + "url": "https://lt.wikiquote.org/wiki/Li%C5%ABtas" + }, + "lvwiki": { + "site": "lvwiki", + "title": "Lauva", + "badges": ["Q17437796"], + "url": "https://lv.wikipedia.org/wiki/Lauva" + }, + "mdfwiki": { + "site": "mdfwiki", + "title": "\u041e\u0440\u043a\u0441\u043e\u0444\u0442\u0430", + "badges": ["Q17437796"], + "url": "https://mdf.wikipedia.org/wiki/%D0%9E%D1%80%D0%BA%D1%81%D0%BE%D1%84%D1%82%D0%B0" + }, + "mgwiki": { + "site": "mgwiki", + "title": "Liona", + "badges": [], + "url": "https://mg.wikipedia.org/wiki/Liona" + }, + "mhrwiki": { + "site": "mhrwiki", + "title": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://mhr.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD" + }, + "mkwiki": { + "site": "mkwiki", + "title": "\u041b\u0430\u0432", + "badges": [], + "url": "https://mk.wikipedia.org/wiki/%D0%9B%D0%B0%D0%B2" + }, + "mlwiki": { + "site": "mlwiki", + "title": "\u0d38\u0d3f\u0d02\u0d39\u0d02", + "badges": [], + "url": "https://ml.wikipedia.org/wiki/%E0%B4%B8%E0%B4%BF%E0%B4%82%E0%B4%B9%E0%B4%82" + }, + "mniwiki": { + "site": "mniwiki", + "title": "\uabc5\uabe3\uabe1\uabc1\uabe5", + "badges": [], + "url": "https://mni.wikipedia.org/wiki/%EA%AF%85%EA%AF%A3%EA%AF%A1%EA%AF%81%EA%AF%A5" + }, + "mnwiki": { + "site": "mnwiki", + "title": "\u0410\u0440\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://mn.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D0%B0%D0%BD" + }, + "mrjwiki": { + "site": "mrjwiki", + "title": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://mrj.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD" + }, + "mrwiki": { + "site": "mrwiki", + "title": "\u0938\u093f\u0902\u0939", + "badges": [], + "url": "https://mr.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9" + }, + "mswiki": { + "site": "mswiki", + "title": "Singa", + "badges": ["Q17437796"], + "url": "https://ms.wikipedia.org/wiki/Singa" + }, + "mtwiki": { + "site": "mtwiki", + "title": "Iljun", + "badges": [], + "url": "https://mt.wikipedia.org/wiki/Iljun" + }, + "mywiki": { + "site": "mywiki", + "title": "\u1001\u103c\u1004\u103a\u1039\u101e\u1031\u1037", + "badges": [], + "url": "https://my.wikipedia.org/wiki/%E1%80%81%E1%80%BC%E1%80%84%E1%80%BA%E1%80%B9%E1%80%9E%E1%80%B1%E1%80%B7" + }, + "newiki": { + "site": "newiki", + "title": "\u0938\u093f\u0902\u0939", + "badges": [], + "url": "https://ne.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9" + }, + "newwiki": { + "site": "newwiki", + "title": "\u0938\u093f\u0902\u0939", + "badges": [], + "url": "https://new.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9" + }, + "nlwiki": { + "site": "nlwiki", + "title": "Leeuw (dier)", + "badges": [], + "url": "https://nl.wikipedia.org/wiki/Leeuw_(dier)" + }, + "nnwiki": { + "site": "nnwiki", + "title": "L\u00f8ve", + "badges": [], + "url": "https://nn.wikipedia.org/wiki/L%C3%B8ve" + }, + "nowiki": { + "site": "nowiki", + "title": "L\u00f8ve", + "badges": [], + "url": "https://no.wikipedia.org/wiki/L%C3%B8ve" + }, + "nrmwiki": { + "site": "nrmwiki", + "title": "Lion", + "badges": [], + "url": "https://nrm.wikipedia.org/wiki/Lion" + }, + "nsowiki": { + "site": "nsowiki", + "title": "Tau", + "badges": [], + "url": "https://nso.wikipedia.org/wiki/Tau" + }, + "nvwiki": { + "site": "nvwiki", + "title": "N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed", + "badges": [], + "url": "https://nv.wikipedia.org/wiki/N%C3%A1shd%C3%B3%C3%ADtsoh_bitsiij%C4%AF%CA%BC_dadit%C5%82%CA%BCoo%C3%ADg%C3%AD%C3%AD" + }, + "ocwiki": { + "site": "ocwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://oc.wikipedia.org/wiki/Panthera_leo" + }, + "orwiki": { + "site": "orwiki", + "title": "\u0b38\u0b3f\u0b02\u0b39", + "badges": [], + "url": "https://or.wikipedia.org/wiki/%E0%AC%B8%E0%AC%BF%E0%AC%82%E0%AC%B9" + }, + "oswiki": { + "site": "oswiki", + "title": "\u0426\u043e\u043c\u0430\u0445\u044a", + "badges": [], + "url": "https://os.wikipedia.org/wiki/%D0%A6%D0%BE%D0%BC%D0%B0%D1%85%D1%8A" + }, + "pamwiki": { + "site": "pamwiki", + "title": "Leon (animal)", + "badges": ["Q17437796"], + "url": "https://pam.wikipedia.org/wiki/Leon_(animal)" + }, + "pawiki": { + "site": "pawiki", + "title": "\u0a2c\u0a71\u0a2c\u0a30 \u0a38\u0a3c\u0a47\u0a30", + "badges": [], + "url": "https://pa.wikipedia.org/wiki/%E0%A8%AC%E0%A9%B1%E0%A8%AC%E0%A8%B0_%E0%A8%B8%E0%A8%BC%E0%A9%87%E0%A8%B0" + }, + "pcdwiki": { + "site": "pcdwiki", + "title": "Lion", + "badges": [], + "url": "https://pcd.wikipedia.org/wiki/Lion" + }, + "plwiki": { + "site": "plwiki", + "title": "Lew afryka\u0144ski", + "badges": ["Q17437796"], + "url": "https://pl.wikipedia.org/wiki/Lew_afryka%C5%84ski" + }, + "plwikiquote": { + "site": "plwikiquote", + "title": "Lew", + "badges": [], + "url": "https://pl.wikiquote.org/wiki/Lew" + }, + "pmswiki": { + "site": "pmswiki", + "title": "Lion", + "badges": [], + "url": "https://pms.wikipedia.org/wiki/Lion" + }, + "pnbwiki": { + "site": "pnbwiki", + "title": "\u0628\u0628\u0631 \u0634\u06cc\u0631", + "badges": [], + "url": "https://pnb.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%DB%8C%D8%B1" + }, + "pswiki": { + "site": "pswiki", + "title": "\u0632\u0645\u0631\u06cc", + "badges": [], + "url": "https://ps.wikipedia.org/wiki/%D8%B2%D9%85%D8%B1%DB%8C" + }, + "ptwiki": { + "site": "ptwiki", + "title": "Le\u00e3o", + "badges": [], + "url": "https://pt.wikipedia.org/wiki/Le%C3%A3o" + }, + "ptwikiquote": { + "site": "ptwikiquote", + "title": "Le\u00e3o", + "badges": [], + "url": "https://pt.wikiquote.org/wiki/Le%C3%A3o" + }, + "quwiki": { + "site": "quwiki", + "title": "Liyun", + "badges": [], + "url": "https://qu.wikipedia.org/wiki/Liyun" + }, + "rmwiki": { + "site": "rmwiki", + "title": "Liun", + "badges": [], + "url": "https://rm.wikipedia.org/wiki/Liun" + }, + "rnwiki": { + "site": "rnwiki", + "title": "Intare", + "badges": [], + "url": "https://rn.wikipedia.org/wiki/Intare" + }, + "rowiki": { + "site": "rowiki", + "title": "Leu", + "badges": [], + "url": "https://ro.wikipedia.org/wiki/Leu" + }, + "ruewiki": { + "site": "ruewiki", + "title": "\u041b\u0435\u0432", + "badges": [], + "url": "https://rue.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2" + }, + "ruwiki": { + "site": "ruwiki", + "title": "\u041b\u0435\u0432", + "badges": ["Q17437798"], + "url": "https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2" + }, + "ruwikinews": { + "site": "ruwikinews", + "title": "\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f:\u041b\u044c\u0432\u044b", + "badges": [], + "url": "https://ru.wikinews.org/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9B%D1%8C%D0%B2%D1%8B" + }, + "rwwiki": { + "site": "rwwiki", + "title": "Intare", + "badges": [], + "url": "https://rw.wikipedia.org/wiki/Intare" + }, + "sahwiki": { + "site": "sahwiki", + "title": "\u0425\u0430\u0445\u0430\u0439", + "badges": [], + "url": "https://sah.wikipedia.org/wiki/%D0%A5%D0%B0%D1%85%D0%B0%D0%B9" + }, + "satwiki": { + "site": "satwiki", + "title": "\u1c61\u1c5f\u1c74\u1c5f\u1c60\u1c69\u1c5e", + "badges": [], + "url": "https://sat.wikipedia.org/wiki/%E1%B1%A1%E1%B1%9F%E1%B1%B4%E1%B1%9F%E1%B1%A0%E1%B1%A9%E1%B1%9E" + }, + "sawiki": { + "site": "sawiki", + "title": "\u0938\u093f\u0902\u0939\u0903 \u092a\u0936\u0941\u0903", + "badges": [], + "url": "https://sa.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9%E0%A4%83_%E0%A4%AA%E0%A4%B6%E0%A5%81%E0%A4%83" + }, + "scnwiki": { + "site": "scnwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://scn.wikipedia.org/wiki/Panthera_leo" + }, + "scowiki": { + "site": "scowiki", + "title": "Lion", + "badges": ["Q17437796"], + "url": "https://sco.wikipedia.org/wiki/Lion" + }, + "sdwiki": { + "site": "sdwiki", + "title": "\u0628\u0628\u0631 \u0634\u064a\u0646\u0647\u0646", + "badges": [], + "url": "https://sd.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%D9%8A%D9%86%D9%87%D9%86" + }, + "sewiki": { + "site": "sewiki", + "title": "Ledjon", + "badges": [], + "url": "https://se.wikipedia.org/wiki/Ledjon" + }, + "shiwiki": { + "site": "shiwiki", + "title": "Agrzam", + "badges": [], + "url": "https://shi.wikipedia.org/wiki/Agrzam" + }, + "shnwiki": { + "site": "shnwiki", + "title": "\u101e\u1062\u1004\u103a\u1087\u101e\u102e\u1088", + "badges": [], + "url": "https://shn.wikipedia.org/wiki/%E1%80%9E%E1%81%A2%E1%80%84%E1%80%BA%E1%82%87%E1%80%9E%E1%80%AE%E1%82%88" + }, + "shwiki": { + "site": "shwiki", + "title": "Lav", + "badges": [], + "url": "https://sh.wikipedia.org/wiki/Lav" + }, + "simplewiki": { + "site": "simplewiki", + "title": "Lion", + "badges": [], + "url": "https://simple.wikipedia.org/wiki/Lion" + }, + "siwiki": { + "site": "siwiki", + "title": "\u0dc3\u0dd2\u0d82\u0dc4\u0dba\u0dcf", + "badges": [], + "url": "https://si.wikipedia.org/wiki/%E0%B7%83%E0%B7%92%E0%B6%82%E0%B7%84%E0%B6%BA%E0%B7%8F" + }, + "skwiki": { + "site": "skwiki", + "title": "Lev p\u00fa\u0161\u0165ov\u00fd", + "badges": [], + "url": "https://sk.wikipedia.org/wiki/Lev_p%C3%BA%C5%A1%C5%A5ov%C3%BD" + }, + "skwikiquote": { + "site": "skwikiquote", + "title": "Lev", + "badges": [], + "url": "https://sk.wikiquote.org/wiki/Lev" + }, + "slwiki": { + "site": "slwiki", + "title": "Lev", + "badges": [], + "url": "https://sl.wikipedia.org/wiki/Lev" + }, + "smwiki": { + "site": "smwiki", + "title": "Leona", + "badges": [], + "url": "https://sm.wikipedia.org/wiki/Leona" + }, + "snwiki": { + "site": "snwiki", + "title": "Shumba", + "badges": [], + "url": "https://sn.wikipedia.org/wiki/Shumba" + }, + "sowiki": { + "site": "sowiki", + "title": "Libaax", + "badges": [], + "url": "https://so.wikipedia.org/wiki/Libaax" + }, + "specieswiki": { + "site": "specieswiki", + "title": "Panthera leo", + "badges": [], + "url": "https://species.wikimedia.org/wiki/Panthera_leo" + }, + "sqwiki": { + "site": "sqwiki", + "title": "Luani", + "badges": [], + "url": "https://sq.wikipedia.org/wiki/Luani" + }, + "srwiki": { + "site": "srwiki", + "title": "\u041b\u0430\u0432", + "badges": [], + "url": "https://sr.wikipedia.org/wiki/%D0%9B%D0%B0%D0%B2" + }, + "sswiki": { + "site": "sswiki", + "title": "Libhubesi", + "badges": [], + "url": "https://ss.wikipedia.org/wiki/Libhubesi" + }, + "stqwiki": { + "site": "stqwiki", + "title": "Leeuwe", + "badges": [], + "url": "https://stq.wikipedia.org/wiki/Leeuwe" + }, + "stwiki": { + "site": "stwiki", + "title": "Tau", + "badges": [], + "url": "https://st.wikipedia.org/wiki/Tau" + }, + "suwiki": { + "site": "suwiki", + "title": "Singa", + "badges": [], + "url": "https://su.wikipedia.org/wiki/Singa" + }, + "svwiki": { + "site": "svwiki", + "title": "Lejon", + "badges": [], + "url": "https://sv.wikipedia.org/wiki/Lejon" + }, + "swwiki": { + "site": "swwiki", + "title": "Simba", + "badges": [], + "url": "https://sw.wikipedia.org/wiki/Simba" + }, + "szlwiki": { + "site": "szlwiki", + "title": "Lew", + "badges": [], + "url": "https://szl.wikipedia.org/wiki/Lew" + }, + "tawiki": { + "site": "tawiki", + "title": "\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd", + "badges": [], + "url": "https://ta.wikipedia.org/wiki/%E0%AE%9A%E0%AE%BF%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%AE%E0%AF%8D" + }, + "tcywiki": { + "site": "tcywiki", + "title": "\u0cb8\u0cbf\u0c82\u0cb9", + "badges": [], + "url": "https://tcy.wikipedia.org/wiki/%E0%B2%B8%E0%B2%BF%E0%B2%82%E0%B2%B9" + }, + "tewiki": { + "site": "tewiki", + "title": "\u0c38\u0c3f\u0c02\u0c39\u0c02", + "badges": [], + "url": "https://te.wikipedia.org/wiki/%E0%B0%B8%E0%B0%BF%E0%B0%82%E0%B0%B9%E0%B0%82" + }, + "tgwiki": { + "site": "tgwiki", + "title": "\u0428\u0435\u0440", + "badges": [], + "url": "https://tg.wikipedia.org/wiki/%D0%A8%D0%B5%D1%80" + }, + "thwiki": { + "site": "thwiki", + "title": "\u0e2a\u0e34\u0e07\u0e42\u0e15", + "badges": [], + "url": "https://th.wikipedia.org/wiki/%E0%B8%AA%E0%B8%B4%E0%B8%87%E0%B9%82%E0%B8%95" + }, + "tiwiki": { + "site": "tiwiki", + "title": "\u12a3\u1295\u1260\u1233", + "badges": [], + "url": "https://ti.wikipedia.org/wiki/%E1%8A%A3%E1%8A%95%E1%89%A0%E1%88%B3" + }, + "tkwiki": { + "site": "tkwiki", + "title": "\u00ddolbars", + "badges": [], + "url": "https://tk.wikipedia.org/wiki/%C3%9Dolbars" + }, + "tlwiki": { + "site": "tlwiki", + "title": "Leon", + "badges": [], + "url": "https://tl.wikipedia.org/wiki/Leon" + }, + "trwiki": { + "site": "trwiki", + "title": "Aslan", + "badges": [], + "url": "https://tr.wikipedia.org/wiki/Aslan" + }, + "ttwiki": { + "site": "ttwiki", + "title": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://tt.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD" + }, + "tumwiki": { + "site": "tumwiki", + "title": "Nkhalamu", + "badges": [], + "url": "https://tum.wikipedia.org/wiki/Nkhalamu" + }, + "udmwiki": { + "site": "udmwiki", + "title": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://udm.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD" + }, + "ugwiki": { + "site": "ugwiki", + "title": "\u0634\u0649\u0631", + "badges": [], + "url": "https://ug.wikipedia.org/wiki/%D8%B4%D9%89%D8%B1" + }, + "ukwiki": { + "site": "ukwiki", + "title": "\u041b\u0435\u0432", + "badges": [], + "url": "https://uk.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2" + }, + "ukwikiquote": { + "site": "ukwikiquote", + "title": "\u041b\u0435\u0432", + "badges": [], + "url": "https://uk.wikiquote.org/wiki/%D0%9B%D0%B5%D0%B2" + }, + "urwiki": { + "site": "urwiki", + "title": "\u0628\u0628\u0631 \u0634\u06cc\u0631", + "badges": ["Q17437796"], + "url": "https://ur.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%DB%8C%D8%B1" + }, + "uzwiki": { + "site": "uzwiki", + "title": "Arslon", + "badges": [], + "url": "https://uz.wikipedia.org/wiki/Arslon" + }, + "vecwiki": { + "site": "vecwiki", + "title": "Leon", + "badges": [], + "url": "https://vec.wikipedia.org/wiki/Leon" + }, + "vepwiki": { + "site": "vepwiki", + "title": "Lev", + "badges": [], + "url": "https://vep.wikipedia.org/wiki/Lev" + }, + "viwiki": { + "site": "viwiki", + "title": "S\u01b0 t\u1eed", + "badges": [], + "url": "https://vi.wikipedia.org/wiki/S%C6%B0_t%E1%BB%AD" + }, + "vlswiki": { + "site": "vlswiki", + "title": "L\u00eaeuw (b\u00eaeste)", + "badges": [], + "url": "https://vls.wikipedia.org/wiki/L%C3%AAeuw_(b%C3%AAeste)" + }, + "warwiki": { + "site": "warwiki", + "title": "Leon", + "badges": [], + "url": "https://war.wikipedia.org/wiki/Leon" + }, + "wowiki": { + "site": "wowiki", + "title": "Gaynde", + "badges": [], + "url": "https://wo.wikipedia.org/wiki/Gaynde" + }, + "wuuwiki": { + "site": "wuuwiki", + "title": "\u72ee", + "badges": [], + "url": "https://wuu.wikipedia.org/wiki/%E7%8B%AE" + }, + "xalwiki": { + "site": "xalwiki", + "title": "\u0410\u0440\u0441\u043b\u04a3", + "badges": [], + "url": "https://xal.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D2%A3" + }, + "xhwiki": { + "site": "xhwiki", + "title": "Ingonyama", + "badges": [], + "url": "https://xh.wikipedia.org/wiki/Ingonyama" + }, + "xmfwiki": { + "site": "xmfwiki", + "title": "\u10dc\u10ef\u10d8\u10da\u10dd", + "badges": [], + "url": "https://xmf.wikipedia.org/wiki/%E1%83%9C%E1%83%AF%E1%83%98%E1%83%9A%E1%83%9D" + }, + "yiwiki": { + "site": "yiwiki", + "title": "\u05dc\u05d9\u05d9\u05d1", + "badges": [], + "url": "https://yi.wikipedia.org/wiki/%D7%9C%D7%99%D7%99%D7%91" + }, + "yowiki": { + "site": "yowiki", + "title": "K\u00ecn\u00ec\u00fan", + "badges": [], + "url": "https://yo.wikipedia.org/wiki/K%C3%ACn%C3%AC%C3%BAn" + }, + "zawiki": { + "site": "zawiki", + "title": "Saeceij", + "badges": [], + "url": "https://za.wikipedia.org/wiki/Saeceij" + }, + "zh_min_nanwiki": { + "site": "zh_min_nanwiki", + "title": "Sai", + "badges": [], + "url": "https://zh-min-nan.wikipedia.org/wiki/Sai" + }, + "zh_yuewiki": { + "site": "zh_yuewiki", + "title": "\u7345\u5b50", + "badges": ["Q17437796"], + "url": "https://zh-yue.wikipedia.org/wiki/%E7%8D%85%E5%AD%90" + }, + "zhwiki": { + "site": "zhwiki", + "title": "\u72ee", + "badges": [], + "url": "https://zh.wikipedia.org/wiki/%E7%8B%AE" + }, + "zuwiki": { + "site": "zuwiki", + "title": "Ibhubesi", + "badges": [], + "url": "https://zu.wikipedia.org/wiki/Ibhubesi" + } + } + } + } + } + constructor() { super("Wikidata", [ ["Download Lion", async () => { Utils.injectJsonDownloadForTests( - "https://www.wikidata.org/wiki/Special:EntityData/Q140.json" , + "https://www.wikidata.org/wiki/Special:EntityData/Q140.json", WikidataSpecTest.Q140 ) @@ -1884,7 +9133,7 @@ export default class WikidataSpecTest extends T { }], ["Extract key from a lexeme", () => { Utils.injectJsonDownloadForTests( - "https://www.wikidata.org/wiki/Special:EntityData/L614072.json" , + "https://www.wikidata.org/wiki/Special:EntityData/L614072.json", { "entities": { "L614072": { @@ -1920,7 +9169,7 @@ export default class WikidataSpecTest extends T { const key = Wikidata.ExtractKey("https://www.wikidata.org/wiki/Lexeme:L614072") T.equals("L614072", key) - + }], ["Download a lexeme", async () => { @@ -1928,10 +9177,7 @@ export default class WikidataSpecTest extends T { T.isTrue(response !== undefined, "Response is undefined") }] - + ]); } - - - private static Q140 = {"entities":{"Q140":{"pageid":275,"ns":0,"title":"Q140","lastrevid":1503881580,"modified":"2021-09-26T19:53:55Z","type":"item","id":"Q140","labels":{"fr":{"language":"fr","value":"lion"},"it":{"language":"it","value":"leone"},"nb":{"language":"nb","value":"l\u00f8ve"},"ru":{"language":"ru","value":"\u043b\u0435\u0432"},"de":{"language":"de","value":"L\u00f6we"},"es":{"language":"es","value":"le\u00f3n"},"nn":{"language":"nn","value":"l\u00f8ve"},"da":{"language":"da","value":"l\u00f8ve"},"af":{"language":"af","value":"leeu"},"ar":{"language":"ar","value":"\u0623\u0633\u062f"},"bg":{"language":"bg","value":"\u043b\u044a\u0432"},"bn":{"language":"bn","value":"\u09b8\u09bf\u0982\u09b9"},"br":{"language":"br","value":"leon"},"bs":{"language":"bs","value":"lav"},"ca":{"language":"ca","value":"lle\u00f3"},"cs":{"language":"cs","value":"lev"},"el":{"language":"el","value":"\u03bb\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9"},"fi":{"language":"fi","value":"leijona"},"ga":{"language":"ga","value":"leon"},"gl":{"language":"gl","value":"Le\u00f3n"},"gu":{"language":"gu","value":"\u0ab8\u0abf\u0a82\u0ab9"},"he":{"language":"he","value":"\u05d0\u05e8\u05d9\u05d4"},"hi":{"language":"hi","value":"\u0938\u093f\u0902\u0939"},"hu":{"language":"hu","value":"oroszl\u00e1n"},"id":{"language":"id","value":"Singa"},"ja":{"language":"ja","value":"\u30e9\u30a4\u30aa\u30f3"},"ko":{"language":"ko","value":"\uc0ac\uc790"},"mk":{"language":"mk","value":"\u043b\u0430\u0432"},"ml":{"language":"ml","value":"\u0d38\u0d3f\u0d02\u0d39\u0d02"},"mr":{"language":"mr","value":"\u0938\u093f\u0902\u0939"},"my":{"language":"my","value":"\u1001\u103c\u1004\u103a\u1039\u101e\u1031\u1037"},"ne":{"language":"ne","value":"\u0938\u093f\u0902\u0939"},"nl":{"language":"nl","value":"leeuw"},"pl":{"language":"pl","value":"lew afryka\u0144ski"},"pt":{"language":"pt","value":"le\u00e3o"},"pt-br":{"language":"pt-br","value":"le\u00e3o"},"scn":{"language":"scn","value":"liuni"},"sq":{"language":"sq","value":"Luani"},"sr":{"language":"sr","value":"\u043b\u0430\u0432"},"sw":{"language":"sw","value":"simba"},"ta":{"language":"ta","value":"\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd"},"te":{"language":"te","value":"\u0c38\u0c3f\u0c02\u0c39\u0c02"},"th":{"language":"th","value":"\u0e2a\u0e34\u0e07\u0e42\u0e15"},"tr":{"language":"tr","value":"aslan"},"uk":{"language":"uk","value":"\u043b\u0435\u0432"},"vi":{"language":"vi","value":"s\u01b0 t\u1eed"},"zh":{"language":"zh","value":"\u7345\u5b50"},"sco":{"language":"sco","value":"lion"},"zh-hant":{"language":"zh-hant","value":"\u7345\u5b50"},"fa":{"language":"fa","value":"\u0634\u06cc\u0631"},"zh-hans":{"language":"zh-hans","value":"\u72ee\u5b50"},"ee":{"language":"ee","value":"Dzata"},"ilo":{"language":"ilo","value":"leon"},"ksh":{"language":"ksh","value":"L\u00f6hv"},"zh-hk":{"language":"zh-hk","value":"\u7345\u5b50"},"as":{"language":"as","value":"\u09b8\u09bf\u0982\u09b9"},"zh-cn":{"language":"zh-cn","value":"\u72ee\u5b50"},"zh-mo":{"language":"zh-mo","value":"\u7345\u5b50"},"zh-my":{"language":"zh-my","value":"\u72ee\u5b50"},"zh-sg":{"language":"zh-sg","value":"\u72ee\u5b50"},"zh-tw":{"language":"zh-tw","value":"\u7345\u5b50"},"ast":{"language":"ast","value":"lle\u00f3n"},"sat":{"language":"sat","value":"\u1c61\u1c5f\u1c74\u1c5f\u1c60\u1c69\u1c5e"},"bho":{"language":"bho","value":"\u0938\u093f\u0902\u0939"},"en":{"language":"en","value":"lion"},"ks":{"language":"ks","value":"\u067e\u0627\u062f\u064e\u0631 \u0633\u0655\u06c1\u06c1"},"be-tarask":{"language":"be-tarask","value":"\u043b\u0435\u045e"},"nan":{"language":"nan","value":"Sai"},"la":{"language":"la","value":"leo"},"en-ca":{"language":"en-ca","value":"Lion"},"en-gb":{"language":"en-gb","value":"lion"},"ab":{"language":"ab","value":"\u0410\u043b\u044b\u043c"},"am":{"language":"am","value":"\u12a0\u1295\u1260\u1233"},"an":{"language":"an","value":"Panthera leo"},"ang":{"language":"ang","value":"L\u0113o"},"arc":{"language":"arc","value":"\u0710\u072a\u071d\u0710"},"arz":{"language":"arz","value":"\u0633\u0628\u0639"},"av":{"language":"av","value":"\u0413\u044a\u0430\u043b\u0431\u0430\u0446\u04c0"},"az":{"language":"az","value":"\u015eir"},"ba":{"language":"ba","value":"\u0410\u0440\u044b\u04ab\u043b\u0430\u043d"},"be":{"language":"be","value":"\u043b\u0435\u045e"},"bo":{"language":"bo","value":"\u0f66\u0f7a\u0f44\u0f0b\u0f42\u0f7a\u0f0d"},"bpy":{"language":"bpy","value":"\u09a8\u0982\u09b8\u09be"},"bxr":{"language":"bxr","value":"\u0410\u0440\u0441\u0430\u043b\u0430\u043d"},"ce":{"language":"ce","value":"\u041b\u043e\u043c"},"chr":{"language":"chr","value":"\u13e2\u13d3\u13e5 \u13a4\u13cd\u13c6\u13b4\u13c2"},"chy":{"language":"chy","value":"P\u00e9hpe'\u00e9nan\u00f3se'hame"},"ckb":{"language":"ckb","value":"\u0634\u06ce\u0631"},"co":{"language":"co","value":"Lionu"},"csb":{"language":"csb","value":"Lew"},"cu":{"language":"cu","value":"\u041b\u044c\u0432\u044a"},"cv":{"language":"cv","value":"\u0410\u0440\u0103\u0441\u043b\u0430\u043d"},"cy":{"language":"cy","value":"Llew"},"dsb":{"language":"dsb","value":"law"},"eo":{"language":"eo","value":"leono"},"et":{"language":"et","value":"l\u00f5vi"},"eu":{"language":"eu","value":"lehoi"},"fo":{"language":"fo","value":"leyvur"},"frr":{"language":"frr","value":"l\u00f6\u00f6w"},"gag":{"language":"gag","value":"aslan"},"gd":{"language":"gd","value":"le\u00f2mhann"},"gn":{"language":"gn","value":"Le\u00f5"},"got":{"language":"got","value":"\ud800\udf3b\ud800\udf39\ud800\udf45\ud800\udf30/Liwa"},"ha":{"language":"ha","value":"Zaki"},"hak":{"language":"hak","value":"S\u1e73\u0302-\u00e9"},"haw":{"language":"haw","value":"Liona"},"hif":{"language":"hif","value":"Ser"},"hr":{"language":"hr","value":"lav"},"hsb":{"language":"hsb","value":"law"},"ht":{"language":"ht","value":"Lyon"},"hy":{"language":"hy","value":"\u0561\u057c\u0575\u0578\u0582\u056e"},"ia":{"language":"ia","value":"Panthera leo"},"ig":{"language":"ig","value":"Od\u00fam"},"io":{"language":"io","value":"leono"},"is":{"language":"is","value":"lj\u00f3n"},"jbo":{"language":"jbo","value":"cinfo"},"jv":{"language":"jv","value":"Singa"},"ka":{"language":"ka","value":"\u10da\u10dd\u10db\u10d8"},"kab":{"language":"kab","value":"Izem"},"kbd":{"language":"kbd","value":"\u0425\u044c\u044d\u0449"},"kg":{"language":"kg","value":"Nkosi"},"kk":{"language":"kk","value":"\u0410\u0440\u044b\u0441\u0442\u0430\u043d"},"kn":{"language":"kn","value":"\u0cb8\u0cbf\u0c82\u0cb9"},"ku":{"language":"ku","value":"\u015e\u00ear"},"lb":{"language":"lb","value":"L\u00e9iw"},"lbe":{"language":"lbe","value":"\u0410\u0441\u043b\u0430\u043d"},"lez":{"language":"lez","value":"\u0410\u0441\u043b\u0430\u043d"},"li":{"language":"li","value":"Liew"},"lij":{"language":"lij","value":"Lion"},"ln":{"language":"ln","value":"Nk\u0254\u0301si"},"lt":{"language":"lt","value":"li\u016btas"},"ltg":{"language":"ltg","value":"\u013bovs"},"lv":{"language":"lv","value":"lauva"},"mdf":{"language":"mdf","value":"\u041e\u0440\u043a\u0441\u043e\u0444\u0442\u0430"},"mhr":{"language":"mhr","value":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d"},"mn":{"language":"mn","value":"\u0410\u0440\u0441\u043b\u0430\u043d"},"mrj":{"language":"mrj","value":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d"},"ms":{"language":"ms","value":"Singa"},"mt":{"language":"mt","value":"iljun"},"nah":{"language":"nah","value":"Cu\u0101miztli"},"nrm":{"language":"nrm","value":"lion"},"su":{"language":"su","value":"Singa"},"de-ch":{"language":"de-ch","value":"L\u00f6we"},"ky":{"language":"ky","value":"\u0410\u0440\u0441\u0442\u0430\u043d"},"lmo":{"language":"lmo","value":"Panthera leo"},"ceb":{"language":"ceb","value":"Panthera leo"},"diq":{"language":"diq","value":"\u015e\u00ear"},"new":{"language":"new","value":"\u0938\u093f\u0902\u0939"},"nds":{"language":"nds","value":"L\u00f6\u00f6w"},"ak":{"language":"ak","value":"Gyata"},"cdo":{"language":"cdo","value":"S\u0103i"},"ady":{"language":"ady","value":"\u0410\u0441\u043b\u044a\u0430\u043d"},"azb":{"language":"azb","value":"\u0622\u0633\u0644\u0627\u0646"},"lfn":{"language":"lfn","value":"Leon"},"kbp":{"language":"kbp","value":"T\u0254\u0254y\u028b\u028b"},"gsw":{"language":"gsw","value":"L\u00f6we"},"din":{"language":"din","value":"K\u00f6r"},"inh":{"language":"inh","value":"\u041b\u043e\u043c"},"bm":{"language":"bm","value":"Waraba"},"hyw":{"language":"hyw","value":"\u0531\u057c\u056b\u0582\u056e"},"nds-nl":{"language":"nds-nl","value":"leeuw"},"kw":{"language":"kw","value":"Lew"},"ext":{"language":"ext","value":"Le\u00f3n"},"bcl":{"language":"bcl","value":"Leon"},"mg":{"language":"mg","value":"Liona"},"lld":{"language":"lld","value":"Lion"},"lzh":{"language":"lzh","value":"\u7345"},"ary":{"language":"ary","value":"\u0633\u0628\u0639"},"sv":{"language":"sv","value":"lejon"},"nso":{"language":"nso","value":"Tau"},"nv":{"language":"nv","value":"N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed"},"oc":{"language":"oc","value":"panthera leo"},"or":{"language":"or","value":"\u0b38\u0b3f\u0b02\u0b39"},"os":{"language":"os","value":"\u0426\u043e\u043c\u0430\u0445\u044a"},"pa":{"language":"pa","value":"\u0a38\u0a3c\u0a47\u0a30"},"pam":{"language":"pam","value":"Leon"},"pcd":{"language":"pcd","value":"Lion"},"pms":{"language":"pms","value":"Lion"},"pnb":{"language":"pnb","value":"\u0628\u0628\u0631 \u0634\u06cc\u0631"},"ps":{"language":"ps","value":"\u0632\u0645\u0631\u06cc"},"qu":{"language":"qu","value":"Liyun"},"rn":{"language":"rn","value":"Intare"},"ro":{"language":"ro","value":"Leul"},"sl":{"language":"sl","value":"lev"},"sn":{"language":"sn","value":"Shumba"},"so":{"language":"so","value":"Libaax"},"ss":{"language":"ss","value":"Libubesi"},"st":{"language":"st","value":"Tau"},"stq":{"language":"stq","value":"Leeuwe"},"sr-ec":{"language":"sr-ec","value":"\u043b\u0430\u0432"},"sr-el":{"language":"sr-el","value":"lav"},"rm":{"language":"rm","value":"Liun"},"sm":{"language":"sm","value":"Leona"},"tcy":{"language":"tcy","value":"\u0cb8\u0cbf\u0cae\u0ccd\u0cae"},"szl":{"language":"szl","value":"Lew"},"rue":{"language":"rue","value":"\u041b\u0435\u0432"},"rw":{"language":"rw","value":"Intare"},"sah":{"language":"sah","value":"\u0425\u0430\u0445\u0430\u0439"},"sh":{"language":"sh","value":"Lav"},"sk":{"language":"sk","value":"lev p\u00fa\u0161\u0165ov\u00fd"},"tg":{"language":"tg","value":"\u0428\u0435\u0440"},"ti":{"language":"ti","value":"\u12a3\u1295\u1260\u1233"},"tl":{"language":"tl","value":"Leon"},"tum":{"language":"tum","value":"Nkhalamu"},"udm":{"language":"udm","value":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d"},"ug":{"language":"ug","value":"\u0634\u0649\u0631"},"ur":{"language":"ur","value":"\u0628\u0628\u0631"},"vec":{"language":"vec","value":"Leon"},"vep":{"language":"vep","value":"lev"},"vls":{"language":"vls","value":"l\u00eaeuw"},"war":{"language":"war","value":"leon"},"wo":{"language":"wo","value":"gaynde"},"xal":{"language":"xal","value":"\u0410\u0440\u0441\u043b\u04a3"},"xmf":{"language":"xmf","value":"\u10dc\u10ef\u10d8\u10da\u10dd"},"yi":{"language":"yi","value":"\u05dc\u05d9\u05d9\u05d1"},"yo":{"language":"yo","value":"K\u00ecn\u00ec\u00fan"},"yue":{"language":"yue","value":"\u7345\u5b50"},"zu":{"language":"zu","value":"ibhubesi"},"tk":{"language":"tk","value":"\u00ddolbars"},"tt":{"language":"tt","value":"\u0430\u0440\u044b\u0441\u043b\u0430\u043d"},"uz":{"language":"uz","value":"Arslon"},"se":{"language":"se","value":"Ledjon"},"si":{"language":"si","value":"\u0dc3\u0dd2\u0d82\u0dc4\u0dba\u0dcf"},"sgs":{"language":"sgs","value":"Li\u016bts"},"vro":{"language":"vro","value":"L\u00f5vi"},"xh":{"language":"xh","value":"Ingonyama"},"sa":{"language":"sa","value":"\u0938\u093f\u0902\u0939\u0903 \u092a\u0936\u0941\u0903"},"za":{"language":"za","value":"Saeceij"},"sd":{"language":"sd","value":"\u0628\u0628\u0631 \u0634\u064a\u0646\u0647\u0646"},"wuu":{"language":"wuu","value":"\u72ee"},"shn":{"language":"shn","value":"\u101e\u1062\u1004\u103a\u1087\u101e\u102e\u1088"},"alt":{"language":"alt","value":"\u0410\u0440\u0441\u043b\u0430\u043d"},"avk":{"language":"avk","value":"Krapol (Panthera leo)"},"dag":{"language":"dag","value":"Gbu\u0263inli"},"shi":{"language":"shi","value":"Agrzam"},"mni":{"language":"mni","value":"\uabc5\uabe3\uabe1\uabc1\uabe5"}},"descriptions":{"fr":{"language":"fr","value":"esp\u00e8ce de mammif\u00e8res carnivores"},"it":{"language":"it","value":"mammifero carnivoro della famiglia dei Felidi"},"nb":{"language":"nb","value":"kattedyr"},"ru":{"language":"ru","value":"\u0432\u0438\u0434 \u0445\u0438\u0449\u043d\u044b\u0445 \u043c\u043b\u0435\u043a\u043e\u043f\u0438\u0442\u0430\u044e\u0449\u0438\u0445"},"de":{"language":"de","value":"Art der Gattung Eigentliche Gro\u00dfkatzen (Panthera)"},"es":{"language":"es","value":"mam\u00edfero carn\u00edvoro de la familia de los f\u00e9lidos"},"en":{"language":"en","value":"species of big cat"},"ko":{"language":"ko","value":"\uace0\uc591\uc774\uacfc\uc5d0 \uc18d\ud558\ub294 \uc721\uc2dd\ub3d9\ubb3c"},"ca":{"language":"ca","value":"mam\u00edfer carn\u00edvor de la fam\u00edlia dels f\u00e8lids"},"fi":{"language":"fi","value":"suuri kissael\u00e4in"},"pt-br":{"language":"pt-br","value":"esp\u00e9cie de mam\u00edfero carn\u00edvoro do g\u00eanero Panthera e da fam\u00edlia Felidae"},"ta":{"language":"ta","value":"\u0bb5\u0bbf\u0bb2\u0b99\u0bcd\u0b95\u0bc1"},"nl":{"language":"nl","value":"groot roofdier uit de familie der katachtigen"},"he":{"language":"he","value":"\u05de\u05d9\u05df \u05d1\u05e1\u05d5\u05d2 \u05e4\u05e0\u05ea\u05e8, \u05d8\u05d5\u05e8\u05e3 \u05d2\u05d3\u05d5\u05dc \u05d1\u05de\u05e9\u05e4\u05d7\u05ea \u05d4\u05d7\u05ea\u05d5\u05dc\u05d9\u05d9\u05dd"},"pt":{"language":"pt","value":"esp\u00e9cie de felino"},"sco":{"language":"sco","value":"species o big cat"},"zh-hans":{"language":"zh-hans","value":"\u5927\u578b\u732b\u79d1\u52a8\u7269"},"uk":{"language":"uk","value":"\u0432\u0438\u0434 \u043a\u043b\u0430\u0441\u0443 \u0441\u0441\u0430\u0432\u0446\u0456\u0432, \u0440\u044f\u0434\u0443 \u0445\u0438\u0436\u0438\u0445, \u0440\u043e\u0434\u0438\u043d\u0438 \u043a\u043e\u0442\u044f\u0447\u0438\u0445"},"hu":{"language":"hu","value":"macskaf\u00e9l\u00e9k csal\u00e1dj\u00e1ba tartoz\u00f3 eml\u0151sfaj"},"bn":{"language":"bn","value":"\u099c\u0999\u09cd\u0997\u09b2\u09c7\u09b0 \u09b0\u09be\u099c\u09be"},"hi":{"language":"hi","value":"\u091c\u0902\u0917\u0932 \u0915\u093e \u0930\u093e\u091c\u093e"},"ilo":{"language":"ilo","value":"sebbangan ti dakkel a pusa"},"ksh":{"language":"ksh","value":"et jr\u00fch\u00dfde Kazedier op der \u00c4hd, der K\u00fcnning vun de Diehre"},"fa":{"language":"fa","value":"\u06af\u0631\u0628\u0647\u200c \u0628\u0632\u0631\u06af \u0628\u0648\u0645\u06cc \u0622\u0641\u0631\u06cc\u0642\u0627 \u0648 \u0622\u0633\u06cc\u0627"},"gl":{"language":"gl","value":"\u00e9 un mam\u00edfero carn\u00edvoro da familia dos f\u00e9lidos e unha das 4 especies do x\u00e9nero Panthera"},"sq":{"language":"sq","value":"mace e madhe e familjes Felidae"},"el":{"language":"el","value":"\u03b5\u03af\u03b4\u03bf\u03c2 \u03c3\u03b1\u03c1\u03ba\u03bf\u03c6\u03ac\u03b3\u03bf \u03b8\u03b7\u03bb\u03b1\u03c3\u03c4\u03b9\u03ba\u03cc"},"scn":{"language":"scn","value":"specia di mamm\u00ecfiru"},"bg":{"language":"bg","value":"\u0432\u0438\u0434 \u0431\u043e\u0437\u0430\u0439\u043d\u0438\u043a"},"ne":{"language":"ne","value":"\u0920\u0942\u0932\u094b \u092c\u093f\u0930\u093e\u0932\u094b\u0915\u094b \u092a\u094d\u0930\u091c\u093e\u0924\u093f"},"pl":{"language":"pl","value":"gatunek ssaka z rodziny kotowatych"},"af":{"language":"af","value":"Soogdier en roofdier van die familie Felidae, een van die \"groot katte\""},"mk":{"language":"mk","value":"\u0432\u0438\u0434 \u0433\u043e\u043b\u0435\u043c\u0430 \u043c\u0430\u0447\u043a\u0430"},"nn":{"language":"nn","value":"kattedyr"},"zh-hant":{"language":"zh-hant","value":"\u5927\u578b\u8c93\u79d1\u52d5\u7269"},"zh":{"language":"zh","value":"\u4ea7\u81ea\u975e\u6d32\u548c\u4e9a\u6d32\u7684\u5927\u578b\u732b\u79d1\u52a8\u7269"},"zh-cn":{"language":"zh-cn","value":"\u5927\u578b\u732b\u79d1\u52a8\u7269"},"zh-hk":{"language":"zh-hk","value":"\u5927\u578b\u8c93\u79d1\u52d5\u7269"},"zh-mo":{"language":"zh-mo","value":"\u5927\u578b\u8c93\u79d1\u52d5\u7269"},"zh-my":{"language":"zh-my","value":"\u5927\u578b\u732b\u79d1\u52a8\u7269"},"zh-sg":{"language":"zh-sg","value":"\u5927\u578b\u732b\u79d1\u52a8\u7269"},"zh-tw":{"language":"zh-tw","value":"\u5927\u578b\u8c93\u79d1\u52d5\u7269"},"sw":{"language":"sw","value":"mnyama mla nyama kama paka mkubwa"},"th":{"language":"th","value":"\u0e0a\u0e37\u0e48\u0e2d\u0e2a\u0e31\u0e15\u0e27\u0e4c\u0e1b\u0e48\u0e32\u0e0a\u0e19\u0e34\u0e14\u0e2b\u0e19\u0e36\u0e48\u0e07 \u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e2a\u0e32\u0e22\u0e1e\u0e31\u0e19\u0e18\u0e38\u0e4c\u0e02\u0e2d\u0e07\u0e41\u0e21\u0e27\u0e43\u0e2b\u0e0d\u0e48"},"ar":{"language":"ar","value":"\u062d\u064a\u0648\u0627\u0646 \u0645\u0646 \u0627\u0644\u062b\u062f\u064a\u064a\u0627\u062a \u0645\u0646 \u0641\u0635\u064a\u0644\u0629 \u0627\u0644\u0633\u0646\u0648\u0631\u064a\u0627\u062a \u0648\u0623\u062d\u062f \u0627\u0644\u0633\u0646\u0648\u0631\u064a\u0627\u062a \u0627\u0644\u0623\u0631\u0628\u0639\u0629 \u0627\u0644\u0643\u0628\u064a\u0631\u0629 \u0627\u0644\u0645\u0646\u062a\u0645\u064a\u0629 \u0644\u062c\u0646\u0633 \u0627\u0644\u0646\u0645\u0631"},"ml":{"language":"ml","value":"\u0d38\u0d38\u0d4d\u0d24\u0d28\u0d3f\u0d15\u0d33\u0d3f\u0d32\u0d46 \u0d2b\u0d46\u0d32\u0d3f\u0d21\u0d47 \u0d15\u0d41\u0d1f\u0d41\u0d02\u0d2c\u0d24\u0d4d\u0d24\u0d3f\u0d32\u0d46 \u0d2a\u0d3e\u0d28\u0d4d\u0d24\u0d31 \u0d1c\u0d28\u0d41\u0d38\u0d4d\u0d38\u0d3f\u0d7d \u0d09\u0d7e\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f \u0d12\u0d30\u0d41 \u0d35\u0d28\u0d4d\u0d2f\u0d1c\u0d40\u0d35\u0d3f\u0d2f\u0d3e\u0d23\u0d4d \u0d38\u0d3f\u0d02\u0d39\u0d02"},"cs":{"language":"cs","value":"ko\u010dkovit\u00e1 \u0161elma"},"gu":{"language":"gu","value":"\u0aac\u0abf\u0ab2\u0abe\u0aa1\u0ac0 \u0ab5\u0a82\u0ab6\u0aa8\u0ac1\u0a82 \u0ab8\u0ab8\u0acd\u0aa4\u0aa8 \u0aaa\u0acd\u0ab0\u0abe\u0aa3\u0ac0"},"mr":{"language":"mr","value":"\u092e\u093e\u0902\u091c\u0930\u093e\u091a\u0940 \u092e\u094b\u0920\u0940 \u091c\u093e\u0924"},"sr":{"language":"sr","value":"\u0432\u0435\u043b\u0438\u043a\u0438 \u0441\u0438\u0441\u0430\u0440 \u0438\u0437 \u043f\u043e\u0440\u043e\u0434\u0438\u0446\u0435 \u043c\u0430\u0447\u0430\u043a\u0430"},"ast":{"language":"ast","value":"especie de mam\u00edferu carn\u00edvoru"},"te":{"language":"te","value":"\u0c2a\u0c46\u0c26\u0c4d\u0c26 \u0c2a\u0c3f\u0c32\u0c4d\u0c32\u0c3f \u0c1c\u0c24\u0c3f"},"bho":{"language":"bho","value":"\u092c\u093f\u0932\u093e\u0930\u092c\u0902\u0938 \u0915\u0947 \u092c\u0921\u093c\u0939\u0928 \u091c\u093e\u0928\u0935\u0930"},"da":{"language":"da","value":"en af de fem store katte i sl\u00e6gten Panthera"},"vi":{"language":"vi","value":"M\u1ed9t lo\u00e0i m\u00e8o l\u1edbn thu\u1ed9c chi Panthera"},"ja":{"language":"ja","value":"\u98df\u8089\u76ee\u30cd\u30b3\u79d1\u306e\u52d5\u7269"},"ga":{"language":"ga","value":"speiceas cat"},"bs":{"language":"bs","value":"vrsta velike ma\u010dke"},"tr":{"language":"tr","value":"Afrika ve Asya'ya \u00f6zg\u00fc b\u00fcy\u00fck bir kedi"},"as":{"language":"as","value":"\u09b8\u09cd\u09a4\u09a8\u09cd\u09af\u09aa\u09be\u09af\u09bc\u09c0 \u09aa\u09cd\u09f0\u09be\u09a3\u09c0"},"my":{"language":"my","value":"\u1014\u102d\u102f\u1037\u1010\u102d\u102f\u1000\u103a\u101e\u1010\u1039\u1010\u101d\u102b \u1019\u103b\u102d\u102f\u1038\u1005\u102d\u1010\u103a (\u1000\u103c\u1031\u102c\u1004\u103a\u1019\u103b\u102d\u102f\u1038\u101b\u1004\u103a\u1038\u101d\u1004\u103a)"},"id":{"language":"id","value":"spesies hewan keluarga jenis kucing"},"ks":{"language":"ks","value":"\u0628\u062c \u0628\u0631\u0627\u0631\u0646 \u06be\u0646\u062f \u06a9\u0633\u0645 \u06cc\u0633 \u0627\u0634\u06cc\u0627 \u062a\u06c1 \u0627\u0641\u0631\u06cc\u06a9\u0627 \u0645\u0646\u0632 \u0645\u0644\u0627\u0646 \u0686\u06be\u06c1"},"br":{"language":"br","value":"bronneg kigdebrer"},"sat":{"language":"sat","value":"\u1c75\u1c64\u1c68 \u1c68\u1c6e\u1c71 \u1c68\u1c5f\u1c61\u1c5f"},"mni":{"language":"mni","value":"\uabc2\uabdd\uabc2\uabdb\uabc0\uabe4 \uabc1\uabe5\uabcd\uabe4\uabe1 \uabc6\uabe5\uabd5 \uabc1\uabe5 \uabd1\uabc6\uabe7\uabd5\uabc1\uabe4\uabe1\uabd2\uabe4 \uabc3\uabc5\uabe8\uabe1\uabd7 \uabd1\uabc3"},"ro":{"language":"ro","value":"mamifer carnivor"}},"aliases":{"es":[{"language":"es","value":"Panthera leo"},{"language":"es","value":"leon"}],"en":[{"language":"en","value":"Asiatic Lion"},{"language":"en","value":"Panthera leo"},{"language":"en","value":"African lion"},{"language":"en","value":"the lion"},{"language":"en","value":"\ud83e\udd81"}],"pt-br":[{"language":"pt-br","value":"Panthera leo"}],"fr":[{"language":"fr","value":"lionne"},{"language":"fr","value":"lionceau"}],"zh":[{"language":"zh","value":"\u9b03\u6bdb"},{"language":"zh","value":"\u72ee\u5b50"},{"language":"zh","value":"\u7345"},{"language":"zh","value":"\u525b\u679c\u7345"},{"language":"zh","value":"\u975e\u6d32\u72ee"}],"de":[{"language":"de","value":"Panthera leo"}],"ca":[{"language":"ca","value":"Panthera leo"}],"sco":[{"language":"sco","value":"Panthera leo"}],"hu":[{"language":"hu","value":"P. leo"},{"language":"hu","value":"Panthera leo"}],"ilo":[{"language":"ilo","value":"Panthera leo"},{"language":"ilo","value":"Felis leo"}],"ksh":[{"language":"ksh","value":"L\u00f6hw"},{"language":"ksh","value":"L\u00f6hf"},{"language":"ksh","value":"L\u00f6v"}],"gl":[{"language":"gl","value":"Panthera leo"}],"ja":[{"language":"ja","value":"\u767e\u7363\u306e\u738b"},{"language":"ja","value":"\u7345\u5b50"},{"language":"ja","value":"\u30b7\u30b7"}],"sq":[{"language":"sq","value":"Mbreti i Kafsh\u00ebve"}],"el":[{"language":"el","value":"\u03c0\u03b1\u03bd\u03b8\u03ae\u03c1"}],"pl":[{"language":"pl","value":"Panthera leo"},{"language":"pl","value":"lew"}],"zh-hk":[{"language":"zh-hk","value":"\u7345"}],"af":[{"language":"af","value":"Panthera leo"}],"mk":[{"language":"mk","value":"Panthera leo"}],"ar":[{"language":"ar","value":"\u0644\u064a\u062b"}],"zh-hant":[{"language":"zh-hant","value":"\u7345"}],"zh-cn":[{"language":"zh-cn","value":"\u72ee"}],"zh-hans":[{"language":"zh-hans","value":"\u72ee"}],"zh-mo":[{"language":"zh-mo","value":"\u7345"}],"zh-my":[{"language":"zh-my","value":"\u72ee"}],"zh-sg":[{"language":"zh-sg","value":"\u72ee"}],"zh-tw":[{"language":"zh-tw","value":"\u7345"}],"gu":[{"language":"gu","value":"\u0ab5\u0aa8\u0ab0\u0abe\u0a9c"},{"language":"gu","value":"\u0ab8\u0abe\u0ab5\u0a9c"},{"language":"gu","value":"\u0a95\u0ac7\u0ab8\u0ab0\u0ac0"}],"ast":[{"language":"ast","value":"Panthera leo"},{"language":"ast","value":"lle\u00f3n africanu"}],"hi":[{"language":"hi","value":"\u092a\u0947\u0902\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b"}],"te":[{"language":"te","value":"\u0c2a\u0c3e\u0c02\u0c25\u0c47\u0c30\u0c3e \u0c32\u0c3f\u0c2f\u0c4b"}],"nl":[{"language":"nl","value":"Panthera leo"}],"bho":[{"language":"bho","value":"\u092a\u0948\u0928\u094d\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b"},{"language":"bho","value":"\u092a\u0948\u0902\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b"}],"ru":[{"language":"ru","value":"\u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0439 \u043b\u0435\u0432"},{"language":"ru","value":"\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u0448\u043a\u0430"},{"language":"ru","value":"\u0446\u0430\u0440\u044c \u0437\u0432\u0435\u0440\u0435\u0439"},{"language":"ru","value":"\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0439 \u043b\u0435\u0432"}],"ga":[{"language":"ga","value":"Panthera leo"}],"bg":[{"language":"bg","value":"Panthera leo"},{"language":"bg","value":"\u043b\u044a\u0432\u0438\u0446\u0430"}],"sat":[{"language":"sat","value":"\u1c60\u1c69\u1c5e"}],"nan":[{"language":"nan","value":"Panthera leo"}],"la":[{"language":"la","value":"Panthera leo"}],"nds-nl":[{"language":"nds-nl","value":"leywe"}]},"claims":{"P225":[{"mainsnak":{"snaktype":"value","property":"P225","hash":"e2be083a19a0c5e1a3f8341be88c5ec0e347580f","datavalue":{"value":"Panthera leo","type":"string"},"datatype":"string"},"type":"statement","qualifiers":{"P405":[{"snaktype":"value","property":"P405","hash":"a817d3670bc2f9a3586b6377a65d54fff72ef888","datavalue":{"value":{"entity-type":"item","numeric-id":1043,"id":"Q1043"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P574":[{"snaktype":"value","property":"P574","hash":"506af9838b7d37b45786395b95170263f1951a31","datavalue":{"value":{"time":"+1758-01-01T00:00:00Z","timezone":0,"before":0,"after":0,"precision":9,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}],"P31":[{"snaktype":"value","property":"P31","hash":"60a983bb1006c765614eb370c3854e64ec50599f","datavalue":{"value":{"entity-type":"item","numeric-id":14594740,"id":"Q14594740"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P405","P574","P31"],"id":"q140$8CCA0B07-C81F-4456-ABAA-A7348C86C9B4","rank":"normal","references":[{"hash":"89e96b63b05055cc80c950cf5fea109c7d453658","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c26dbcef1202a7d198982ed24f6ea69b704f95fe","datavalue":{"value":{"entity-type":"item","numeric-id":82575,"id":"Q82575"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P577":[{"snaktype":"value","property":"P577","hash":"539fa499b6ea982e64006270bb26f52a57a8e32b","datavalue":{"value":{"time":"+1996-06-13T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}],"P813":[{"snaktype":"value","property":"P813","hash":"96dfb8481e184edb40553947f8fe08ce080f1553","datavalue":{"value":{"time":"+2013-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P577","P813"]},{"hash":"f2fcc71ba228fd0db2b328c938e601507006fa46","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"603c636b2210e4a74b7d40c9e969b7e503bbe252","datavalue":{"value":{"entity-type":"item","numeric-id":1538807,"id":"Q1538807"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"6892402e621d2b47092e15284d64cdbb395e71f7","datavalue":{"value":{"time":"+2015-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P105":[{"mainsnak":{"snaktype":"value","property":"P105","hash":"aebf3611b23ed90c7c0fc80f6cd1cb7be110ea59","datavalue":{"value":{"entity-type":"item","numeric-id":7432,"id":"Q7432"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"q140$CD2903E5-743A-4B4F-AE9E-9C0C83426B11","rank":"normal","references":[{"hash":"89e96b63b05055cc80c950cf5fea109c7d453658","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c26dbcef1202a7d198982ed24f6ea69b704f95fe","datavalue":{"value":{"entity-type":"item","numeric-id":82575,"id":"Q82575"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P577":[{"snaktype":"value","property":"P577","hash":"539fa499b6ea982e64006270bb26f52a57a8e32b","datavalue":{"value":{"time":"+1996-06-13T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}],"P813":[{"snaktype":"value","property":"P813","hash":"96dfb8481e184edb40553947f8fe08ce080f1553","datavalue":{"value":{"time":"+2013-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P577","P813"]},{"hash":"f2fcc71ba228fd0db2b328c938e601507006fa46","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"603c636b2210e4a74b7d40c9e969b7e503bbe252","datavalue":{"value":{"entity-type":"item","numeric-id":1538807,"id":"Q1538807"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"6892402e621d2b47092e15284d64cdbb395e71f7","datavalue":{"value":{"time":"+2015-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P171":[{"mainsnak":{"snaktype":"value","property":"P171","hash":"cbf0d3943e6cbac8afbec1ff11525c84ee04e442","datavalue":{"value":{"entity-type":"item","numeric-id":127960,"id":"Q127960"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"q140$C1CA40D8-39C3-4DB4-B763-207A22796D85","rank":"normal","references":[{"hash":"89e96b63b05055cc80c950cf5fea109c7d453658","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c26dbcef1202a7d198982ed24f6ea69b704f95fe","datavalue":{"value":{"entity-type":"item","numeric-id":82575,"id":"Q82575"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P577":[{"snaktype":"value","property":"P577","hash":"539fa499b6ea982e64006270bb26f52a57a8e32b","datavalue":{"value":{"time":"+1996-06-13T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}],"P813":[{"snaktype":"value","property":"P813","hash":"96dfb8481e184edb40553947f8fe08ce080f1553","datavalue":{"value":{"time":"+2013-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P577","P813"]},{"hash":"f2fcc71ba228fd0db2b328c938e601507006fa46","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"603c636b2210e4a74b7d40c9e969b7e503bbe252","datavalue":{"value":{"entity-type":"item","numeric-id":1538807,"id":"Q1538807"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"6892402e621d2b47092e15284d64cdbb395e71f7","datavalue":{"value":{"time":"+2015-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P1403":[{"mainsnak":{"snaktype":"value","property":"P1403","hash":"baa11a4c668601014a48e2998ab76aa1ea7a5b99","datavalue":{"value":{"entity-type":"item","numeric-id":15294488,"id":"Q15294488"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$816d2b99-4aa5-5eb9-784b-34e2704d2927","rank":"normal"}],"P141":[{"mainsnak":{"snaktype":"value","property":"P141","hash":"80026ea5b2066a2538fee5c0897b459bb6770689","datavalue":{"value":{"entity-type":"item","numeric-id":278113,"id":"Q278113"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"q140$B12A2FD5-692F-4D9A-8FC7-144AA45A16F8","rank":"normal","references":[{"hash":"355df53bb7c6d100219cd2a331afd51719337d88","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"eb153b77c6029ffa1ca09f9128b8e47fe58fce5a","datavalue":{"value":{"entity-type":"item","numeric-id":56011232,"id":"Q56011232"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P627":[{"snaktype":"value","property":"P627","hash":"3642ac96e05180279c47a035c129d3af38d85027","datavalue":{"value":"15951","type":"string"},"datatype":"string"}],"P813":[{"snaktype":"value","property":"P813","hash":"76bc602d4f902d015c358223e7c0917bd65095e0","datavalue":{"value":{"time":"+2018-08-10T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P627","P813"]}]}],"P181":[{"mainsnak":{"snaktype":"value","property":"P181","hash":"8467347aac1f01e518c1b94d5bb68c65f9efe84a","datavalue":{"value":"Lion distribution.png","type":"string"},"datatype":"commonsMedia"},"type":"statement","id":"q140$12F383DD-D831-4AE9-A0ED-98C27A8C5BA7","rank":"normal"}],"P830":[{"mainsnak":{"snaktype":"value","property":"P830","hash":"8cafbfe99d80fcfabbd236d4cc01d33cc8a8b41d","datavalue":{"value":"328672","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$486d7ab8-4af8-b6e1-85bb-e0749b02c2d9","rank":"normal","references":[{"hash":"7e71b7ede7931e7e2ee9ce54e832816fe948b402","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"6e81987ab11fb1740bd862639411d0700be3b22c","datavalue":{"value":{"entity-type":"item","numeric-id":82486,"id":"Q82486"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"7c1a33cf9a0bf6cdd57b66f089065ba44b6a8953","datavalue":{"value":{"time":"+2014-10-30T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P815":[{"mainsnak":{"snaktype":"value","property":"P815","hash":"27f6bd8fb4504eb79b92e6b63679b83af07d5fed","datavalue":{"value":"183803","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$71177A4F-4308-463D-B370-8B354EC2D2C3","rank":"normal","references":[{"hash":"ff0dd9eabf88b0dcefa74b223d065dd644e42050","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c26dbcef1202a7d198982ed24f6ea69b704f95fe","datavalue":{"value":{"entity-type":"item","numeric-id":82575,"id":"Q82575"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"6b8fcfa6afb3911fecec93ae1dff2b6b6cde5659","datavalue":{"value":{"time":"+2013-12-07T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P685":[{"mainsnak":{"snaktype":"value","property":"P685","hash":"c863e255c042b2b9b6a788ebd6e24f38a46dfa88","datavalue":{"value":"9689","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$A9F4ABE4-D079-4868-BC18-F685479BB244","rank":"normal","references":[{"hash":"5667273d9f2899620fec2016bb2afd29aa7080ce","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"1851bc60ddfbcf6f76bd45aa7124fc0d5857a379","datavalue":{"value":{"entity-type":"item","numeric-id":13711410,"id":"Q13711410"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"6b8fcfa6afb3911fecec93ae1dff2b6b6cde5659","datavalue":{"value":{"time":"+2013-12-07T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P959":[{"mainsnak":{"snaktype":"value","property":"P959","hash":"55cab2a9d2af860a89a8d0e2eaefedb64202a3d8","datavalue":{"value":"14000228","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$A967D17D-485D-434F-BBF2-E6226E63BA42","rank":"normal","references":[{"hash":"3e398e6df20323ce88e644e5a1e4ec0bc77a5f41","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"603c636b2210e4a74b7d40c9e969b7e503bbe252","datavalue":{"value":{"entity-type":"item","numeric-id":1538807,"id":"Q1538807"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"d2bace4e146678a5e5f761e9a441b53b95dc2e87","datavalue":{"value":{"time":"+2014-01-10T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P842":[{"mainsnak":{"snaktype":"value","property":"P842","hash":"991987fc3fa4d1cfd3a601dcfc9dd1f802255de7","datavalue":{"value":"49734","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$3FF45860-DBC3-4629-AAF8-F2899B6C6876","rank":"normal","references":[{"hash":"1111bfc1dc63ee739fb9dd3f5534346c7fd478f0","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"00fe2206a3342fa25c0cfe1d08783c49a1986f12","datavalue":{"value":{"entity-type":"item","numeric-id":796451,"id":"Q796451"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"14c5b75e8d3f4c43cb5b570380dd98e421bb9751","datavalue":{"value":{"time":"+2014-01-30T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P227":[{"mainsnak":{"snaktype":"value","property":"P227","hash":"3343c5fd594f8f0264332d87ce95e76ffeaebffd","datavalue":{"value":"4140572-9","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$0059e08d-4308-8401-58e8-2cb683c03837","rank":"normal"}],"P349":[{"mainsnak":{"snaktype":"value","property":"P349","hash":"08812c4ef85f397bf00b015d1baf3b00d81cb9bf","datavalue":{"value":"00616831","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$B7933772-D27D-49D4-B1BB-AA36ADCA81B0","rank":"normal"}],"P1014":[{"mainsnak":{"snaktype":"value","property":"P1014","hash":"3d27204feb184f21c042777dc9674150cb07ee92","datavalue":{"value":"300310388","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$8e3c9dc3-442e-2e61-8617-f4a41b5be668","rank":"normal"}],"P646":[{"mainsnak":{"snaktype":"value","property":"P646","hash":"0c053bce57fe07b05c300a09b322d9f89236884b","datavalue":{"value":"/m/096mb","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$D94D8A4F-3414-4BE0-82C1-306BD136C017","rank":"normal","references":[{"hash":"2b00cb481cddcac7623114367489b5c194901c4a","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"a94b740202b097dd33355e0e6c00e54b9395e5e0","datavalue":{"value":{"entity-type":"item","numeric-id":15241312,"id":"Q15241312"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P577":[{"snaktype":"value","property":"P577","hash":"fde79ecb015112d2f29229ccc1ec514ed3e71fa2","datavalue":{"value":{"time":"+2013-10-28T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P577"]}]}],"P1036":[{"mainsnak":{"snaktype":"value","property":"P1036","hash":"02435ba66ab8e5fb26652ae1a84695be24b3e22a","datavalue":{"value":"599.757","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$e75ed89a-408d-9bc1-8d99-41663921debd","rank":"normal"}],"P1245":[{"mainsnak":{"snaktype":"value","property":"P1245","hash":"f3da4ca7d35fc3e02a9ea1662688d8f6c4658df0","datavalue":{"value":"5961","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$010e79a0-475e-fcf4-a554-375b64943783","rank":"normal"}],"P910":[{"mainsnak":{"snaktype":"value","property":"P910","hash":"056367b51cd51edd6c2840134fde01cf40469172","datavalue":{"value":{"entity-type":"item","numeric-id":6987175,"id":"Q6987175"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$BC4DE2D4-BF45-49AF-A9A6-C0A976F60825","rank":"normal"}],"P373":[{"mainsnak":{"snaktype":"value","property":"P373","hash":"76c006bc5e2975bcda2e7d60ddcbaaa8c84f69e5","datavalue":{"value":"Panthera leo","type":"string"},"datatype":"string"},"type":"statement","id":"q140$939BA4B2-28D3-4C74-B143-A0EA6F423B43","rank":"normal"}],"P846":[{"mainsnak":{"snaktype":"value","property":"P846","hash":"d0428680cd2b36efde61dc69ccc5a8ff7a735cb5","datavalue":{"value":"5219404","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$4CE8E6D4-E9A1-46F1-8EEF-B469E8485F9E","rank":"normal","references":[{"hash":"5b8345ffc93a361b71f5d201a97f587e5e57efe5","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"dbb8dd1efbe0158a5227213bd628eeac27a1da65","datavalue":{"value":{"entity-type":"item","numeric-id":1531570,"id":"Q1531570"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"3eb17b10ce02d44f47540a6fbdbb3cbb7e77d5f5","datavalue":{"value":{"time":"+2015-05-15T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P487":[{"mainsnak":{"snaktype":"value","property":"P487","hash":"5f93415dd33bfde6a546fdd65e5a7013e012c336","datavalue":{"value":"\ud83e\udd81","type":"string"},"datatype":"string"},"type":"statement","id":"Q140$da5262fc-4ac5-390b-b424-4f296b2d711d","rank":"normal"}],"P2040":[{"mainsnak":{"snaktype":"value","property":"P2040","hash":"5b13a3fa0fde6ba09d8e417738c05268bd065e32","datavalue":{"value":"6353","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$E97A1A2E-D146-4C62-AE92-5AF5F7E146EF","rank":"normal","references":[{"hash":"348b5187938d682071c94e22f1b30659af715dc7","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"213dc0d84ed983cbb28466ebb0c45bf8b0730ea2","datavalue":{"value":{"entity-type":"item","numeric-id":20962955,"id":"Q20962955"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"3d2c713dec9143721ae196af88fee0fde5ae20f2","datavalue":{"value":{"time":"+2015-09-10T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P935":[{"mainsnak":{"snaktype":"value","property":"P935","hash":"c3518a9944958337bcce384587f3abc3de6ddf34","datavalue":{"value":"Panthera leo","type":"string"},"datatype":"string"},"type":"statement","id":"Q140$F7AAEE1F-4D18-4538-99F0-1A2B5AD7269F","rank":"normal"}],"P1417":[{"mainsnak":{"snaktype":"value","property":"P1417","hash":"492d3483075b6915990940a4392f5ec035cbe05e","datavalue":{"value":"animal/lion","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$FE89C38F-6C79-4F06-8C15-81DCAC8D745F","rank":"normal"}],"P244":[{"mainsnak":{"snaktype":"value","property":"P244","hash":"2e41780263804dd45d7deaf7955a2d1d221f6096","datavalue":{"value":"sh85077276","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$634d86d1-45b1-920d-e9ef-78d5f4023288","rank":"normal","references":[{"hash":"88d810dd1ff791aeb0b5779876b0c9f19acb59b6","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c120f07504c77593a9d734f50361ea829f601960","datavalue":{"value":{"entity-type":"item","numeric-id":620946,"id":"Q620946"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"0980c2f2b51e6b2d4c1dd9a77b9fb95dc282bc79","datavalue":{"value":{"time":"+2016-06-01T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P1843":[{"mainsnak":{"snaktype":"value","property":"P1843","hash":"3b1cfb68cc46255ceba7ff7893ac1cabbb4ddd92","datavalue":{"value":{"text":"Lion","language":"en"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","qualifiers":{"P7018":[{"snaktype":"value","property":"P7018","hash":"40a60b39201df345ffbf5aa724269d5fd61ae028","datavalue":{"value":{"entity-type":"sense","id":"L17815-S1"},"type":"wikibase-entityid"},"datatype":"wikibase-sense"}]},"qualifiers-order":["P7018"],"id":"Q140$6E257597-55C7-4AF3-B3D6-0F2204FAD35C","rank":"normal","references":[{"hash":"eada84c58a38325085267509899037535799e978","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a","datavalue":{"value":{"entity-type":"item","numeric-id":32059,"id":"Q32059"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"3e51c3c32949f8a45f2c3331f55ea6ae68ecf3fe","datavalue":{"value":{"time":"+2016-10-21T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]},{"hash":"cdc389b112247cb50b855fb86e98b7a7892e96f0","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"e17975e5c866df46673c91b2287a82cf23d14f5a","datavalue":{"value":{"entity-type":"item","numeric-id":27310853,"id":"Q27310853"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P304":[{"snaktype":"value","property":"P304","hash":"ff7ad3502ff7a4a9b0feeb4248a7bed9767a1ec6","datavalue":{"value":"166","type":"string"},"datatype":"string"}]},"snaks-order":["P248","P304"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"38a9c57a5c62a707adc86decd2bd00be89eab6f3","datavalue":{"value":{"text":"Leeu","language":"af"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$5E731B05-20D6-491B-97E7-94D90CBB70F0","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"a4455f1ef49d7d17896563760a420031c41d65c1","datavalue":{"value":{"text":"Gyata","language":"ak"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$721B4D81-D948-4002-A13E-0B2567626FD6","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"b955c9239d6ced23c0db577e20219b0417a2dd9b","datavalue":{"value":{"text":"Ley\u00f3n","language":"an"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$E2B52F3D-B12D-48B5-86EA-6A4DCBC091D3","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"e18a8ecb17321c203fcf8f402e82558ce0599b39","datavalue":{"value":{"text":"Li\u00f3n","language":"an"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$339ADC90-41C6-4CDB-B6C3-DA9F952FCC15","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"297bf417fff1510d19b27c08fa9f34e2653b9510","datavalue":{"value":{"text":"\u0623\u064e\u0633\u064e\u062f\u064c","language":"ar"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$F1849268-0E70-4EC0-A630-EC0D2DCBB298","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"5577ef6920a3ade2365d878740d1d097fcdae399","datavalue":{"value":{"text":"L\u00e9we","language":"bar"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$BDD65B40-7ECB-4725-B33F-417A83AF5102","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"de8fa35eca4e61dfb8fe2df360e734fb1cd37092","datavalue":{"value":{"text":"L\u00f6we","language":"bar"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$486EE5F1-9AB5-4789-98AC-E435D81E784F","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"246c27f44da8bedd2e3313de393fe648b2b40ea9","datavalue":{"value":{"text":"\u041b\u0435\u045e (Lew)","language":"be"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$47AA6BD4-0B09-4B20-9092-0AEAD8056157","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"64c42db53ef288871161f0a656808f06daae817d","datavalue":{"value":{"text":"\u041b\u044a\u0432 (L\u0103v)","language":"bg"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$ADF0B08A-9626-4821-8118-0A875CBE5FB9","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"6041e2730af3095f4f0cbf331382e22b596d2305","datavalue":{"value":{"text":"\u09b8\u09bf\u0982\u09b9","language":"bn"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$8DF5BDCD-B470-46C3-A44A-7375B8A5DCDE","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"8499f437dc8678b0c4b740b40cab41031fce874d","datavalue":{"value":{"text":"Lle\u00f3","language":"ca"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$F55C3E63-DB2C-4F6D-B10B-4C1BB70C06A0","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"b973abb618a6f17b8a9547b852e5817b5c4da00b","datavalue":{"value":{"text":"\u041b\u043e\u044c\u043c","language":"ce"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$F32B0BFA-3B85-4A26-A888-78FD8F09F943","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"62f53c7229efad1620a5cce4dc5a535d88c4989f","datavalue":{"value":{"text":"Lev","language":"cs"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$1630DAB7-C4D0-4268-A598-8BBB9480221E","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"0df7e23666c947b42aea5572a9f5a987229718d3","datavalue":{"value":{"text":"Llew","language":"cy"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$F33991E8-A532-47F5-B135-A13761DB2E95","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"14942ad0830a0eb7b06704234eea637f99b53a24","datavalue":{"value":{"text":"L\u00f8ve","language":"da"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$478F0603-640A-44BE-9453-700FDD32100F","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"8af089542ef6207b918f656bcf9a96e745970915","datavalue":{"value":{"text":"L\u00f6we","language":"de"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","qualifiers":{"P7018":[{"snaktype":"value","property":"P7018","hash":"2da239e18a0208847a72fbeab011c8c2fb3b4d99","datavalue":{"value":{"entity-type":"sense","id":"L41680-S1"},"type":"wikibase-entityid"},"datatype":"wikibase-sense"}]},"qualifiers-order":["P7018"],"id":"Q140$11F5F498-3688-4F4B-B2FA-7121BE5AA701","rank":"normal","references":[{"hash":"cdc389b112247cb50b855fb86e98b7a7892e96f0","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"e17975e5c866df46673c91b2287a82cf23d14f5a","datavalue":{"value":{"entity-type":"item","numeric-id":27310853,"id":"Q27310853"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P304":[{"snaktype":"value","property":"P304","hash":"ff7ad3502ff7a4a9b0feeb4248a7bed9767a1ec6","datavalue":{"value":"166","type":"string"},"datatype":"string"}]},"snaks-order":["P248","P304"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"c0c8b50001810c1ec643b88479df82ea85c819a2","datavalue":{"value":{"text":"Dzata","language":"ee"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$8F6EC307-A293-4AFC-8154-E3FF187C0D7D","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"57a3384eeb13d1bcffeb3cf0efd0f3e3f511b35d","datavalue":{"value":{"text":"\u039b\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9 (Liond\u00e1ri)","language":"el"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$560B3341-3E06-4D09-8869-FC47C841D14C","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"ee7109a46f8259ae6f52791cfe599b7c4c272831","datavalue":{"value":{"text":"Leono","language":"eo"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$67F2B7A6-1C81-407A-AA61-A1BFF148EC69","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"3b8f4f61c3a18792bfaff5d332f03c80932dce05","datavalue":{"value":{"text":"Le\u00f3n","language":"es"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$DB29EAF7-4405-4030-8056-ED17089B3805","rank":"normal","references":[{"hash":"d3a8e536300044db1d823eae6891b2c7baa49f66","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a","datavalue":{"value":{"entity-type":"item","numeric-id":32059,"id":"Q32059"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"620d2e76d21bb1d326fc360db5bece2070115240","datavalue":{"value":{"time":"+2016-10-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"41fffb83f35736829d60f782bdce68463f0ab47c","datavalue":{"value":{"text":"L\u00f5vi","language":"et"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$19B76CC4-AA11-443B-BC76-DB2D0DA5B9CB","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"b96549e5ae538fb7e0b48089508333b31aec8fe7","datavalue":{"value":{"text":"Lehoi","language":"eu"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$88F712C1-4EEF-4E42-8C61-84E55CF2DCE0","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"b343c833d8de3dfd5c8b31336afd137380ab42dc","datavalue":{"value":{"text":"\u0634\u06cc\u0631 (\u0160ayr)","language":"fa"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$B72DB989-EF39-42F5-8FA8-5FC669079DB7","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"51aaf9a4a7c5e77ba931a5280d1fec984c91963b","datavalue":{"value":{"text":"Leijona","language":"fi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$6861CDE9-707D-43AD-B352-3BCD7B9D4267","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"038249fb112acc26895af45fab412395f999ae11","datavalue":{"value":{"text":"Leyva","language":"fo"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$A044100A-C49F-4AA6-8861-F0300F28126E","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"92ec25b64605d026b07b0cda6e623fbbf2f3dfb4","datavalue":{"value":{"text":"Lion","language":"fr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$122623FD-3915-49E9-8890-0B6883317507","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"59be091f7839e7a6061c6d1690ed77f3b21b9ff4","datavalue":{"value":{"text":"L\u00f6\u00f6w","language":"frr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$76B87E52-A02C-4E99-A4B3-D6105B642521","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"126b0f2c5ed11124233dfefff8bd132a1fe1218a","datavalue":{"value":{"text":"Le\u00f3n-leoa","language":"gl"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$A4864784-EED3-4898-83FE-A2FCC0C3982E","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"49e0d3858de566edce1a28b0e96f42b2d0df718f","datavalue":{"value":{"text":"\u0ab8\u0abf\u0a82\u0ab9","language":"gu"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$4EE122CE-7671-480E-86A4-4A4DDABC04BA","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"dff0c422f7403c50d28dd51ca2989d03108b7584","datavalue":{"value":{"text":"Liona","language":"haw"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$FBB6AC65-A224-4C29-8024-079C0687E9FB","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"c174addd56c0f42f6ec3e87c72fb9651e4923a00","datavalue":{"value":{"text":"\u05d0\u05e8\u05d9\u05d4","language":"he"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$B72D9BDB-A2CC-471D-AF20-8F7FB677D533","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"c38a63a06b569fc8fee3e98c4cf8d5501990811e","datavalue":{"value":{"text":"si\u1e45ha)","language":"hi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$9AA9171C-E912-41F2-AB26-643AA538E644","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"94f073519a5b64c48398c73a5f0f135a4f0f4306","datavalue":{"value":{"text":"\u0936\u0947\u0930","language":"hi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$0714B97B-03E0-4ACC-80A0-6A17874DDBA8","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"1fbda5b1494db298c698fc28ed0fe68b1c137b2e","datavalue":{"value":{"text":"\u0938\u093f\u0902\u0939","language":"hi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$3CE22F68-038C-4A94-9A1F-96B82760DEB9","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"fac41ebd8d1da777acd93720267c7a70016156e4","datavalue":{"value":{"text":"Lav","language":"hr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$C5351C11-E287-4D3B-A9B2-56716F0E69E5","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"71e0bda709fb17d58f4bd8e12fff7f937a61673c","datavalue":{"value":{"text":"Oroszl\u00e1n","language":"hu"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$AD06E7D2-3B1F-4D14-B2E9-DD2513BE8B4B","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"05e86680d70a2c0adf9a6e6eb51bbdf8c6ae44bc","datavalue":{"value":{"text":"\u0531\u057c\u0575\u0578\u0582\u056e","language":"hy"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$3E02B802-8F7B-4C48-A3F9-FBBFDB0D8DB3","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"979f25bee6af37e19471530c6344a0d22a0d594c","datavalue":{"value":{"text":"Lj\u00f3n","language":"is"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$59788C31-A354-4229-AD89-361CB6076EF7","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"789e5f5a7ec6003076bc7fd2996faf8ca8468719","datavalue":{"value":{"text":"Leone","language":"it"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$4901AE59-7749-43D1-BC65-DEEC0DFEB72F","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"4a5bdf9bb40f1cab9a92b7dba1d1d74a8440c7ed","datavalue":{"value":{"text":"\u30e9\u30a4\u30aa\u30f3 (Raion)","language":"ja"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$4CF2E0D9-5CF3-46A3-A197-938E94270CE2","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"ebba3893211c78dad7ae74a51448e8c7f6e73309","datavalue":{"value":{"text":"\uc0ac\uc790 (saja)","language":"ko"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$64B6CECD-5FFE-4612-819F-CAB2E726B228","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"ed1fe1812cee80102262dd3b7e170759fbeab86a","datavalue":{"value":{"text":"\u0410\u0440\u0441\u0442\u0430\u043d","language":"ky"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$3D9597D3-E35F-4EFF-9CAF-E013B45F283F","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"a0868f5f83bb886a408aa9b25b95dbfc59bde4dc","datavalue":{"value":{"text":"Leo","language":"la"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$4D650414-6AFE-430F-892F-B7774AC7AF70","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"054af77b10151632045612df9b96313dfcc3550c","datavalue":{"value":{"text":"Liew","language":"li"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$D5B466A8-AEFB-4083-BF3E-194C5CE45CD3","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"9193a46891a365ee1b0a17dd6e2591babc642811","datavalue":{"value":{"text":"Nkosi","language":"ln"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$55F213DF-5AAB-4490-83CB-B9E5D2B894CD","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"c5952ec6b650f1c66f37194eb88c2889560740b2","datavalue":{"value":{"text":"Li\u016btas","language":"lt"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$8551F80C-A244-4351-A98A-8A9F37A736A2","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"e3541d0807682631f8fff2d224b2cb1b3d2a4c11","datavalue":{"value":{"text":"Lauva","language":"lv"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$488A2D59-533A-4C02-8AC3-01241FE63D94","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"22e20da399aff10787267691b5211b6fc0bddf38","datavalue":{"value":{"text":"\u041b\u0430\u0432 (lav)","language":"mk"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$9E2377E9-1D37-4BBC-A409-1C40CDD99A86","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"fe4c9bc3b3cce21a779f72fae808f8ed213d226b","datavalue":{"value":{"text":"\u0d38\u0d3f\u0d02\u0d39\u0d02 (simham)","language":"ml"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$8BEA9E08-4687-434A-9FB4-4B23B2C40838","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"85aa09066722caf2181681a24575ad89ca76210e","datavalue":{"value":{"text":"si\u1e45ha)","language":"mr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$46B51EF5-7ADB-4637-B744-89AD1E3B5D19","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"441f3832d6e3c4439c6986075096c7021a0939dd","datavalue":{"value":{"text":"\u0936\u0947\u0930 (\u015a\u0113ra)","language":"mr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$12BBC825-32E3-4026-A5E5-0330DEB21D79","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"89b35a359c3891dce190d778e9ae0a9634cfd71f","datavalue":{"value":{"text":"\u0938\u093f\u0902\u0939 (singh","language":"mr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$006148E2-658F-4C74-9C3E-26488B7AEB8D","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"5723b45deee51dfe5a2555f2db17bad14acb298a","datavalue":{"value":{"text":"Iljun","language":"mt"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$13D221F5-9763-4550-9CC3-9A697286B785","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"d1ce3ab04f25af38248152eb8caa286b63366c2a","datavalue":{"value":{"text":"Leeuw","language":"nl"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$65E80D17-6F20-4BAE-A2B4-DD934C0BE153","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"12f3384cc32e65dfb501e2fee19ccf709f9df757","datavalue":{"value":{"text":"L\u00f8ve","language":"nn"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$78E95514-1969-4DA3-97CD-0DBADF1223E7","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"a3fedaf780a0d004ba318881f6adbe173750d09e","datavalue":{"value":{"text":"L\u00f8ve","language":"nb"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$809DE1EA-861E-4813-BED7-D9C465341CB3","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"695d2ef10540ba13cf8b3541daa1d39fd720eea0","datavalue":{"value":{"text":"N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed","language":"nv"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$E9EDAF16-6650-40ED-B888-C524BD00DF40","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"3c143e8a8cebf92d76d3ae2d7e3bb3f87e963fb4","datavalue":{"value":{"text":"\u0a2c\u0a71\u0a2c\u0a30 \u0a38\u0a3c\u0a47\u0a30","language":"pa"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$13AE1DAB-4B29-49A5-9893-C0014C61D21E","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"195e48d11222aec830fb1d5c2de898c9528abc57","datavalue":{"value":{"text":"lew afryka\u0144ski","language":"pl"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$6966C1C3-9DD6-48BC-B511-B0827642E41D","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"8bd3ae632e7731ae9e72c50744383006ec6eb73e","datavalue":{"value":{"text":"Le\u00e3o","language":"pt"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$BD454649-347E-4AE5-81B8-360C16C7CDA7","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"79d3336733b7bf4b7dadffd6d6ebabdb892074d1","datavalue":{"value":{"text":"Leu","language":"ro"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$7323EF68-7AA0-4D38-82D8-0A94E61A26F0","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"376b852a92b6472e969ae7b995c4aacea23955eb","datavalue":{"value":{"text":"\u041b\u0435\u0432 (Lev)","language":"ru"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$A7C413B9-0916-4534-941D-C24BA0334816","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"aa323e0bea79d79900227699b3d42d689a772ca1","datavalue":{"value":{"text":"Lioni","language":"sc"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$2EF83D2C-0DB9-4D3C-8FDD-86237E566260","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"a290fe08983742eac8b5bc479022564fb6b2ce81","datavalue":{"value":{"text":"Lev","language":"sl"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$B276673A-08C1-47E2-99A9-D0861321E157","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"d3b070ff1452d47f87c109a9e0bfa52e61b24a4e","datavalue":{"value":{"text":"Libubesi","language":"ss"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$86BFAB38-1DB8-4903-A17D-A6B8E81819CC","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"3adea59d97f3caf9bb6b1c3d7ae6365f7f656dca","datavalue":{"value":{"text":"Tau","language":"st"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$2FA8893D-2401-42E9-8DC3-288CC1DEDB0C","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"0e73b32fe31a107a95de83706a12f2db419c6909","datavalue":{"value":{"text":"Lejon","language":"sv"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$1A8E006E-CC7B-4066-9DE7-9B82D096779E","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"34550af2fdc48f77cf66cabc5c59d1acf1d8afd0","datavalue":{"value":{"text":"Simba","language":"sw"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$B02CA616-44CF-4AA6-9734-2C05810131EB","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"701f87cf9926c9af2c41434ff130dcb234a6cd95","datavalue":{"value":{"text":"\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd","language":"ta"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$DA87A994-A002-45AD-A71F-99FB72F8B92F","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"856fd4809c90e3c34c6876e4410661dc04f5da8d","datavalue":{"value":{"text":"\u0e2a\u0e34\u0e07\u0e42\u0e15","language":"th"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$BDA8E989-3537-4662-8CC3-33534705A7F1","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"f8598a8369426da0c86bf8bab356a927487eae66","datavalue":{"value":{"text":"Aslan","language":"tr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$AAE5F227-C0DB-4DF3-B1F4-517699BBDDF1","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"f3c8320bd46913aee164999ab7f68388c1bd9920","datavalue":{"value":{"text":"\u041b\u0435\u0432 (Lev)","language":"uk"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$494C3503-6016-4539-83AF-6344173C2DCB","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"6cc2d534293320533e15dc713f1d2c07b3811b6a","datavalue":{"value":{"text":"Leon","language":"vec"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$E6F1DA81-9F36-4CC8-B57E-95E3BDC2F5D0","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"32553481e45abf6f5e6292baea486e978c36f8fe","datavalue":{"value":{"text":"S\u01b0 t\u1eed","language":"vi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$11D7996C-0492-41CC-AEE7-3C136172DFC7","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"69077fc29f9251d1de124cd3f3c45cd6f0bb6b65","datavalue":{"value":{"text":"\u05dc\u05d9\u05d9\u05d1","language":"yi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$969FEF9A-C1C7-41FE-8181-07F6D87B0346","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"e3aaa8cde18be4ea6b4af6ca62b83e7dc23d76e1","datavalue":{"value":{"text":"\u72ee\u5b50 (sh\u012bzi)","language":"zh"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$3BC22F6C-F460-4354-9BA2-28CEDA9FF170","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"98f5efae94b2bb9f8ffee6c677ee71f836743ef6","datavalue":{"value":{"text":"Lion d'Afrique","language":"fr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$62D09BBF-718A-4139-AF50-DA4185ED67F2","rank":"normal","references":[{"hash":"362e3c5d6de1d193ef97205ba38834ba075191fc","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a","datavalue":{"value":{"entity-type":"item","numeric-id":32059,"id":"Q32059"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"c7813bad20c2553e26e45c37e3502ce7252312df","datavalue":{"value":{"time":"+2016-10-20T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"c584bdbd3cdc1215292a4971b920c684d103ea06","datavalue":{"value":{"text":"African Lion","language":"en"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$C871BB58-C689-4DBA-A088-DAC205377979","rank":"normal","references":[{"hash":"eada84c58a38325085267509899037535799e978","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a","datavalue":{"value":{"entity-type":"item","numeric-id":32059,"id":"Q32059"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"3e51c3c32949f8a45f2c3331f55ea6ae68ecf3fe","datavalue":{"value":{"time":"+2016-10-21T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"1d03eace9366816c6fda340c0390caac2f3cea8e","datavalue":{"value":{"text":"L\u00e9iw","language":"lb"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$c65c7614-4d6e-3a87-9771-4f8c13618249","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"925c7abced1e89fa7e8000dc9dc78627cdac9769","datavalue":{"value":{"text":"Lle\u00f3n","language":"ast"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$1024eadb-45dd-7d9a-15f6-8602946ba661","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"0bda7868c3f498ba6fde78d46d0fbcf286e42dd8","datavalue":{"value":{"text":"\u0644\u064e\u064a\u0652\u062b\u064c","language":"ar"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$c226ff70-48dd-7b4d-00ff-7a683fe510aa","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"28de99c4aa35cc049cf8c9dd18af1791944137d9","datavalue":{"value":{"text":"\u10da\u10dd\u10db\u10d8","language":"ka"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$8fe60d1a-465a-9614-cbe4-595e22429b0c","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"4550db0f44e21c5eadeaa5a1d8fc614c9eb05f52","datavalue":{"value":{"text":"leon","language":"ga"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$4950cb9c-4f1e-ce27-0d8c-ba3f18096044","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"9d268eb76ed921352c205b3f890d1f9428f638f3","datavalue":{"value":{"text":"Singa","language":"ms"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$67401360-49dd-b13c-8269-e703b30c9a53","rank":"normal"}],"P627":[{"mainsnak":{"snaktype":"value","property":"P627","hash":"3642ac96e05180279c47a035c129d3af38d85027","datavalue":{"value":"15951","type":"string"},"datatype":"string"},"type":"statement","id":"Q140$6BE03095-BC68-4CE5-BB99-9F3E33A6F31D","rank":"normal","references":[{"hash":"182efbdb9110d036ca433f3b49bd3a1ae312858b","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a","datavalue":{"value":{"entity-type":"item","numeric-id":32059,"id":"Q32059"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"8c1c5174f4811115ea8a0def725fdc074c2ef036","datavalue":{"value":{"time":"+2016-07-10T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P2833":[{"mainsnak":{"snaktype":"value","property":"P2833","hash":"519877b77b20416af2401e5c0645954c6700d6fd","datavalue":{"value":"panthera-leo","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$C0A723AE-ED2E-4FDC-827F-496E4CF29A52","rank":"normal"}],"P3063":[{"mainsnak":{"snaktype":"value","property":"P3063","hash":"81cdb0273eaf0a0126b62e2ff43b8e09505eea54","datavalue":{"value":{"amount":"+108","unit":"http://www.wikidata.org/entity/Q573","upperBound":"+116","lowerBound":"+100"},"type":"quantity"},"datatype":"quantity"},"type":"statement","id":"Q140$878ff87d-40d0-bb2b-c83d-4cef682c2687","rank":"normal","references":[{"hash":"7d748004a43983fabae420123742fda0e9b52840","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"f618501ace3a6524b053661d067b775547f96f58","datavalue":{"value":{"entity-type":"item","numeric-id":26706243,"id":"Q26706243"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P478":[{"snaktype":"value","property":"P478","hash":"ca3c5e6054c169ee3d0dfaf660f3eecd77942070","datavalue":{"value":"4","type":"string"},"datatype":"string"}],"P304":[{"snaktype":"value","property":"P304","hash":"dd1977567f22f4cf510adfaadf5e3574813b3521","datavalue":{"value":"46","type":"string"},"datatype":"string"}]},"snaks-order":["P248","P478","P304"]}]}],"P3031":[{"mainsnak":{"snaktype":"value","property":"P3031","hash":"e6271e8d12b20c9735d2bbd80eed58581059bf3a","datavalue":{"value":"PNTHLE","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$65AD2857-AB65-4CC0-9AB9-9D6C924784FE","rank":"normal"}],"P3151":[{"mainsnak":{"snaktype":"value","property":"P3151","hash":"e85e5599d303d9a6bb360f3133fb69a76d98d0e2","datavalue":{"value":"41964","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$15D7A4EB-F0A3-4C61-8D2B-E557D7BF5CF7","rank":"normal"}],"P3186":[{"mainsnak":{"snaktype":"value","property":"P3186","hash":"85ec7843064210afdfef6ec565a47f229c6d15e5","datavalue":{"value":"644245","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$6903E136-2DB2-42C9-98CB-82F61208FDAD","rank":"normal","references":[{"hash":"5790a745e549ea7e4e6d7ca467148b544529ba96","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c897ca3efd1604ef7b80a14ac0d2b8d6849c0856","datavalue":{"value":{"entity-type":"item","numeric-id":26936509,"id":"Q26936509"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"555ca5385c445e4fd4762281d4873682eff2ce30","datavalue":{"value":{"time":"+2016-09-24T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]},{"hash":"3edd37192f877cad0ff97acc3db56ef2cc83945b","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4f7c4fd187630ba8cbb174c2756113983df4ce82","datavalue":{"value":{"entity-type":"item","numeric-id":45029859,"id":"Q45029859"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"56b6aa0388c9a2711946589902bc195718bb0675","datavalue":{"value":{"time":"+2017-12-26T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]},{"hash":"1318ed8ea451b84fe98461305665d8688603bab3","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"0fbeeecce08896108ed797d8ec22c7c10a6015e2","datavalue":{"value":{"entity-type":"item","numeric-id":45029998,"id":"Q45029998"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"4bac1c0d2ffc45d91b51fc0881eb6bcc7916e854","datavalue":{"value":{"time":"+2018-01-02T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]},{"hash":"6f761664a6f331d95bbaa1434447d82afd597a93","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"6c09d1d89e83bd0dfa6c94e01d24a9a47489d83e","datavalue":{"value":{"entity-type":"item","numeric-id":58035056,"id":"Q58035056"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"03182012ca72fcd757b8a1fe05ba927cbe9ef374","datavalue":{"value":{"time":"+2018-11-02T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P3485":[{"mainsnak":{"snaktype":"value","property":"P3485","hash":"df4e58fc2a196833ab3e33483099e2481e61ba9e","datavalue":{"value":{"amount":"+112","unit":"1"},"type":"quantity"},"datatype":"quantity"},"type":"statement","id":"Q140$4B70AA09-AE2F-4F4C-9BAF-09890CDA11B8","rank":"normal","references":[{"hash":"fa278ebfc458360e5aed63d5058cca83c46134f1","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"e4f6d9441d0600513c4533c672b5ab472dc73694","datavalue":{"value":{"entity-type":"item","numeric-id":328,"id":"Q328"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]}],"P3827":[{"mainsnak":{"snaktype":"value","property":"P3827","hash":"6bb26d581721d7330c407259d46ab5e25cc4a6b1","datavalue":{"value":"lions","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$CCDE6F7D-B4EA-4875-A4D6-5649ACFA8E2F","rank":"normal"}],"P268":[{"mainsnak":{"snaktype":"value","property":"P268","hash":"a20cdf81e39cd47f4da30073671792380029924c","datavalue":{"value":"11932251d","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$000FDB77-C70C-4464-9F00-605787964BBA","rank":"normal","references":[{"hash":"d4bd87b862b12d99d26e86472d44f26858dee639","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"f30cbd35620c4ea6d0633aaf0210a8916130469b","datavalue":{"value":{"entity-type":"item","numeric-id":8447,"id":"Q8447"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]}],"P3417":[{"mainsnak":{"snaktype":"value","property":"P3417","hash":"e3b5d21350aef37f27ad8b24142d6b83d9eec0a6","datavalue":{"value":"Lions","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$1f96d096-4e4b-06de-740f-7b7215e5ae3f","rank":"normal"}],"P4024":[{"mainsnak":{"snaktype":"value","property":"P4024","hash":"a698e7dcd6f9b0b00ee8e02846c668db83064833","datavalue":{"value":"Panthera_leo","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$F5DC21E8-BF52-4A0D-9A15-63B89297BD70","rank":"normal","references":[{"hash":"d4bd87b862b12d99d26e86472d44f26858dee639","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"f30cbd35620c4ea6d0633aaf0210a8916130469b","datavalue":{"value":{"entity-type":"item","numeric-id":8447,"id":"Q8447"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]}],"P1225":[{"mainsnak":{"snaktype":"value","property":"P1225","hash":"9af40267f10f15926877e9a3f78faeab7b0dda82","datavalue":{"value":"10665610","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$268074ED-3CD7-46C9-A8FF-8C3679C45547","rank":"normal"}],"P4728":[{"mainsnak":{"snaktype":"value","property":"P4728","hash":"37eafa980604019b327b1a3552313fb7ae256697","datavalue":{"value":"105514","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$50C24ECC-C42C-4A58-8F34-6AF0AC6C4EFE","rank":"normal","references":[{"hash":"d4bd87b862b12d99d26e86472d44f26858dee639","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"f30cbd35620c4ea6d0633aaf0210a8916130469b","datavalue":{"value":{"entity-type":"item","numeric-id":8447,"id":"Q8447"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]}],"P3219":[{"mainsnak":{"snaktype":"value","property":"P3219","hash":"dedb8825588940caff5a34d04a0e69af296f05dd","datavalue":{"value":"lion","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$2A5A2CA3-AB6E-4F68-927F-042D1BD22915","rank":"normal"}],"P1343":[{"mainsnak":{"snaktype":"value","property":"P1343","hash":"5b0ef3d5413cd39d887fbe70d2d3b3f4a94ea9d8","datavalue":{"value":{"entity-type":"item","numeric-id":1138524,"id":"Q1138524"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"f7bf629d348040dd1a59dc5a3199edb50279e8f5","datavalue":{"value":{"entity-type":"item","numeric-id":19997008,"id":"Q19997008"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$DFE4D4B0-0D84-41F2-B448-4A81AC982927","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"6bc15c6f82feca4f3b173c90209a416f99464cac","datavalue":{"value":{"entity-type":"item","numeric-id":4086271,"id":"Q4086271"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"69ace59e966574e4ffb454d26940a58fb45ed7de","datavalue":{"value":{"entity-type":"item","numeric-id":25295952,"id":"Q25295952"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$b82b0461-4ff0-10ac-9825-d4b95fc7a85a","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"ecb04d74140f2ee856c06658b03ec90a21c2edf2","datavalue":{"value":{"entity-type":"item","numeric-id":1970746,"id":"Q1970746"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"169607f1510535f3e1c5e7debce48d1903510f74","datavalue":{"value":{"entity-type":"item","numeric-id":30202801,"id":"Q30202801"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$bd49e319-477f-0cd2-a404-642156321081","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"88389772f86dcd7d415ddd029f601412e5cc894a","datavalue":{"value":{"entity-type":"item","numeric-id":602358,"id":"Q602358"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"67f2e59eb3f6480bdbaa3954055dfbf8fd045bc4","datavalue":{"value":{"entity-type":"item","numeric-id":24451091,"id":"Q24451091"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$906ae22e-4c63-d325-c91e-dc3ee6b7504d","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"42346dfe9209b7359c1f5db829a368b38d407797","datavalue":{"value":{"entity-type":"item","numeric-id":19180675,"id":"Q19180675"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"195bd04166c04364a657fcd18abd1a082dad3cb0","datavalue":{"value":{"entity-type":"item","numeric-id":24758519,"id":"Q24758519"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$92e7eeb1-4a72-9abf-4260-a96abc32bc42","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"7d6f86cef085693a10b0e0663a0960f58d0e15e2","datavalue":{"value":{"entity-type":"item","numeric-id":4173137,"id":"Q4173137"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"75e5bdfbbf8498b195840749ef3a9bd309b796f7","datavalue":{"value":{"entity-type":"item","numeric-id":25054587,"id":"Q25054587"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$6c9c319a-4e71-540e-8866-a6017f0e6bae","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"75dd89e79770a3e631dbba27144940f8f1bc1773","datavalue":{"value":{"entity-type":"item","numeric-id":1768721,"id":"Q1768721"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"a1b448ff5f8818a2254835e0816a03a785bac665","datavalue":{"value":{"entity-type":"item","numeric-id":96599885,"id":"Q96599885"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$A0FD93F4-A401-47A1-BC8E-F0D35A8E8BAD","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"4cfd4eb1fe49d401455df557a7d9b1154f22a725","datavalue":{"value":{"entity-type":"item","numeric-id":3181656,"id":"Q3181656"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P1932":[{"snaktype":"value","property":"P1932","hash":"a3f6e8ce10c4527693415dbc99b5ea285b2f411c","datavalue":{"value":"Lion, The","type":"string"},"datatype":"string"}]},"qualifiers-order":["P1932"],"id":"Q140$100f480e-4ad9-b340-8251-4e875d00315d","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"d5011798f92464584d8ccfc5f19f18f3659668bb","datavalue":{"value":{"entity-type":"item","numeric-id":106727050,"id":"Q106727050"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P1810":[{"snaktype":"value","property":"P1810","hash":"7d78547303d5e9e014a7c8cef6072faee91088ce","datavalue":{"value":"Lions","type":"string"},"datatype":"string"}],"P585":[{"snaktype":"value","property":"P585","hash":"ffb837135313cad3b2545c4b9ce5ee416deda3e2","datavalue":{"value":{"time":"+2021-05-07T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"qualifiers-order":["P1810","P585"],"id":"Q140$A4D208BD-6A69-4561-B402-2E17AAE6E028","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"d12a9ecb0df8fce076df898533fea0339e5881bd","datavalue":{"value":{"entity-type":"item","numeric-id":10886720,"id":"Q10886720"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"52ddab8de77b01303d508a1de615ca13060ec188","datavalue":{"value":{"entity-type":"item","numeric-id":107513600,"id":"Q107513600"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$07daf548-4c8d-fa7c-16f4-4c7062f7e48a","rank":"normal"}],"P4733":[{"mainsnak":{"snaktype":"value","property":"P4733","hash":"fc789f67f6d4d9b5879a8631eefe61f51a60f979","datavalue":{"value":{"entity-type":"item","numeric-id":3177438,"id":"Q3177438"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$3773ba15-4723-261a-f9a8-544496938efa","rank":"normal","references":[{"hash":"649ae5511d5389d870d19e83543fa435de796536","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"9931bb1a17358e94590f8fa0b9550de881616d97","datavalue":{"value":{"entity-type":"item","numeric-id":784031,"id":"Q784031"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]}],"P5019":[{"mainsnak":{"snaktype":"value","property":"P5019","hash":"44aac3d8a2bd240b4bc81741a0980dc48781181b","datavalue":{"value":"l\u00f6we","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$2be40b22-49f1-c9e7-1812-8e3fd69d662d","rank":"normal"}],"P2924":[{"mainsnak":{"snaktype":"value","property":"P2924","hash":"710d75c07e28936461d03b20b2fc7455599301a1","datavalue":{"value":"2135124","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$6326B120-CE04-4F02-94CA-D7BBC2589A39","rank":"normal"}],"P5055":[{"mainsnak":{"snaktype":"value","property":"P5055","hash":"c5264fc372b7e66566d54d73f86c8ab8c43fb033","datavalue":{"value":"10196306","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$F8D43B92-CC3A-4967-A28F-C3E6308946F6","rank":"normal","references":[{"hash":"7131076724beb97fed351cb7e7f6ac6d61dd05b9","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"1e3ad3cb9e0170e28b7c7c335fba55cafa6ef789","datavalue":{"value":{"entity-type":"item","numeric-id":51885189,"id":"Q51885189"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"2b1446fcfcd471ab6d36521b4ad2ac183ff8bc0d","datavalue":{"value":{"time":"+2018-06-07T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P5221":[{"mainsnak":{"snaktype":"value","property":"P5221","hash":"623ca9614dd0d8b8720bf35b4d57be91dcef5fe6","datavalue":{"value":"123566","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$472fe544-402d-2574-6b2e-98c5b01bb294","rank":"normal"}],"P5698":[{"mainsnak":{"snaktype":"value","property":"P5698","hash":"e966694183143d709403fae7baabb5fdf98d219a","datavalue":{"value":"70719","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$EF3F712D-B0E5-4151-81E4-67804D6241E6","rank":"normal"}],"P5397":[{"mainsnak":{"snaktype":"value","property":"P5397","hash":"49a827bc1853a3b5612b437dd61eb5c28dc0bab0","datavalue":{"value":"12799","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$DE37BF10-A59D-48F1-926A-7303EDEEDDD0","rank":"normal"}],"P6033":[{"mainsnak":{"snaktype":"value","property":"P6033","hash":"766727ded3adbbfec0bed77affc89ea4e5214d65","datavalue":{"value":"panthera-leo","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$A27BADCC-0F72-45A5-814B-BDE62BD7A1B4","rank":"normal"}],"P18":[{"mainsnak":{"snaktype":"value","property":"P18","hash":"d3ceb5bb683335c91781e4d52906d2fb1cc0c35d","datavalue":{"value":"Lion waiting in Namibia.jpg","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P21":[{"snaktype":"value","property":"P21","hash":"0576a008261e5b2544d1ff3328c94bd529379536","datavalue":{"value":{"entity-type":"item","numeric-id":44148,"id":"Q44148"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P2096":[{"snaktype":"value","property":"P2096","hash":"6923fafa02794ae7d0773e565de7dd49a2694b38","datavalue":{"value":{"text":"Lle\u00f3","language":"ca"},"type":"monolingualtext"},"datatype":"monolingualtext"},{"snaktype":"value","property":"P2096","hash":"563784f05211416fda8662a0773f52165ccf6c2a","datavalue":{"value":{"text":"Machu de lle\u00f3n en Namibia","language":"ast"},"type":"monolingualtext"},"datatype":"monolingualtext"},{"snaktype":"value","property":"P2096","hash":"52722803d98964d77b79d3ed62bd24b4f25e6993","datavalue":{"value":{"text":"\u043b\u044a\u0432","language":"bg"},"type":"monolingualtext"},"datatype":"monolingualtext"}]},"qualifiers-order":["P21","P2096"],"id":"q140$5903FDF3-DBBD-4527-A738-450EAEAA45CB","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P18","hash":"6907d4c168377a18d6a5eb390ab32a7da42d8218","datavalue":{"value":"Okonjima Lioness.jpg","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P21":[{"snaktype":"value","property":"P21","hash":"a274865baccd3ff04c28d5ffdcc12e0079f5a201","datavalue":{"value":{"entity-type":"item","numeric-id":43445,"id":"Q43445"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P2096":[{"snaktype":"value","property":"P2096","hash":"a9d1363e8fc83ba822c45a81de59fe5b8eb434cf","datavalue":{"value":{"text":"\u043b\u044a\u0432\u0438\u0446\u0430","language":"bg"},"type":"monolingualtext"},"datatype":"monolingualtext"},{"snaktype":"value","property":"P2096","hash":"b36ab7371664b7b62ee7be65db4e248074a5330c","datavalue":{"value":{"text":"Lleona n'Okonjima Lodge, Namibia","language":"ast"},"type":"monolingualtext"},"datatype":"monolingualtext"},{"snaktype":"value","property":"P2096","hash":"31c78a574eabc0426d7984aa4988752e35b71f0c","datavalue":{"value":{"text":"lwica","language":"pl"},"type":"monolingualtext"},"datatype":"monolingualtext"}]},"qualifiers-order":["P21","P2096"],"id":"Q140$4da15225-f7dc-4942-a685-0669e5d3af14","rank":"normal"}],"P6573":[{"mainsnak":{"snaktype":"value","property":"P6573","hash":"c27b457b12eeecb053d60af6ecf9b0baa133bef5","datavalue":{"value":"L\u00f6we","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$45B1C3EB-E335-4245-A193-8C48B4953E51","rank":"normal"}],"P443":[{"mainsnak":{"snaktype":"value","property":"P443","hash":"8a9afb9293804f976c415060900bf9afbc2cfdff","datavalue":{"value":"LL-Q188 (deu)-Sebastian Wallroth-L\u00f6we.wav","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P407":[{"snaktype":"value","property":"P407","hash":"46bfd327b830f66f7061ea92d1be430c135fa91f","datavalue":{"value":{"entity-type":"item","numeric-id":188,"id":"Q188"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P407"],"id":"Q140$5EC64299-429F-45E8-B18F-19325401189C","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P443","hash":"7d058dfd1e8a41f026974faec3dc0588e29c6854","datavalue":{"value":"LL-Q150 (fra)-Ash Crow-lion.wav","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P407":[{"snaktype":"value","property":"P407","hash":"d197d0a5efa4b4c23a302a829dd3ef43684fe002","datavalue":{"value":{"entity-type":"item","numeric-id":150,"id":"Q150"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P407"],"id":"Q140$A4575261-6577-4EF6-A0C9-DA5FA523D1C2","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P443","hash":"79b9f51c9b4eec305813d5bb697b403d798cf1c5","datavalue":{"value":"LL-Q33965 (sat)-Joy sagar Murmu-\u1c60\u1c69\u1c5e.wav","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P407":[{"snaktype":"value","property":"P407","hash":"58ae6998321952889f733126c11c582eeef20e72","datavalue":{"value":{"entity-type":"item","numeric-id":33965,"id":"Q33965"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P407"],"id":"Q140$7eedc8fa-4d1c-7ee9-3c67-0c89ef464d9f","rank":"normal","references":[{"hash":"d0b5c88b6f49dda9160c706291a9b8645825d99c","snaks":{"P854":[{"snaktype":"value","property":"P854","hash":"38c1012cea9eb73cf1bd11eba0c2f745d2463340","datavalue":{"value":"https://lingualibre.org/wiki/Q403065","type":"string"},"datatype":"url"}]},"snaks-order":["P854"]}]}],"P1296":[{"mainsnak":{"snaktype":"value","property":"P1296","hash":"c1f872d4cd22219a7315c0198a83c1918ded97ee","datavalue":{"value":"0120024","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$6C51384B-2EBF-4E6B-9201-A44F0A145C04","rank":"normal"}],"P486":[{"mainsnak":{"snaktype":"value","property":"P486","hash":"b7003b0fb28287301200b6b3871a5437d877913b","datavalue":{"value":"D008045","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$B2F98DD2-B679-43DD-B731-FA33FB1EE4B9","rank":"normal"}],"P989":[{"mainsnak":{"snaktype":"value","property":"P989","hash":"132884b2a696a8b56c8b1460e126f745e2fa6d01","datavalue":{"value":"Ru-Lion (intro).ogg","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P407":[{"snaktype":"value","property":"P407","hash":"d291ddb7cd77c94a7bd709a8395934147e0864fc","datavalue":{"value":{"entity-type":"item","numeric-id":7737,"id":"Q7737"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P407"],"id":"Q140$857D8831-673B-427E-A182-6A9FFA980424","rank":"normal"}],"P51":[{"mainsnak":{"snaktype":"value","property":"P51","hash":"73b0e8c8458ebc27374fd08d8ef5241f2f28e3e9","datavalue":{"value":"Lion raring-sound1TamilNadu178.ogg","type":"string"},"datatype":"commonsMedia"},"type":"statement","id":"Q140$1c254aff-48b1-d3c5-930c-b360ce6fe043","rank":"normal"}],"P4212":[{"mainsnak":{"snaktype":"value","property":"P4212","hash":"e006ce3295d617a4818dc758c28f444446538019","datavalue":{"value":"pcrt5TAeZsO7W4","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$AD6CD534-1FD2-4AC7-9CF8-9D2B4C46927C","rank":"normal"}],"P2067":[{"mainsnak":{"snaktype":"value","property":"P2067","hash":"97a863433c30b47a6175abb95941d185397ea14a","datavalue":{"value":{"amount":"+1.65","unit":"http://www.wikidata.org/entity/Q11570"},"type":"quantity"},"datatype":"quantity"},"type":"statement","qualifiers":{"P642":[{"snaktype":"value","property":"P642","hash":"f5e24bc6ec443d6cb3678e4561bc298090b54f60","datavalue":{"value":{"entity-type":"item","numeric-id":4128476,"id":"Q4128476"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P642"],"id":"Q140$198da244-7e66-4258-9434-537e9ce0ffab","rank":"normal","references":[{"hash":"94a79329d5eac70f7ddb005e0d1dc78c53e77797","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4a7fef7ea264a7c71765ce60e3d42f4c043c9646","datavalue":{"value":{"entity-type":"item","numeric-id":45106562,"id":"Q45106562"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]},{"mainsnak":{"snaktype":"value","property":"P2067","hash":"ba9933059ce368e3afde1e96d78b1217172c954e","datavalue":{"value":{"amount":"+188","unit":"http://www.wikidata.org/entity/Q11570"},"type":"quantity"},"datatype":"quantity"},"type":"statement","qualifiers":{"P642":[{"snaktype":"value","property":"P642","hash":"b388540fc86300a506b3a753ec58dec445525ffa","datavalue":{"value":{"entity-type":"item","numeric-id":78101716,"id":"Q78101716"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P21":[{"snaktype":"value","property":"P21","hash":"0576a008261e5b2544d1ff3328c94bd529379536","datavalue":{"value":{"entity-type":"item","numeric-id":44148,"id":"Q44148"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P642","P21"],"id":"Q140$a3092626-4295-efb8-bbb6-eed913d02fc7","rank":"normal","references":[{"hash":"94a79329d5eac70f7ddb005e0d1dc78c53e77797","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4a7fef7ea264a7c71765ce60e3d42f4c043c9646","datavalue":{"value":{"entity-type":"item","numeric-id":45106562,"id":"Q45106562"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]},{"mainsnak":{"snaktype":"value","property":"P2067","hash":"6951281811b2a8a3a78044e2003d6c162d5ba1a3","datavalue":{"value":{"amount":"+126","unit":"http://www.wikidata.org/entity/Q11570"},"type":"quantity"},"datatype":"quantity"},"type":"statement","qualifiers":{"P642":[{"snaktype":"value","property":"P642","hash":"b388540fc86300a506b3a753ec58dec445525ffa","datavalue":{"value":{"entity-type":"item","numeric-id":78101716,"id":"Q78101716"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P21":[{"snaktype":"value","property":"P21","hash":"a274865baccd3ff04c28d5ffdcc12e0079f5a201","datavalue":{"value":{"entity-type":"item","numeric-id":43445,"id":"Q43445"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P642","P21"],"id":"Q140$20d80fe2-4796-23d1-42c2-c103546aa874","rank":"normal","references":[{"hash":"94a79329d5eac70f7ddb005e0d1dc78c53e77797","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4a7fef7ea264a7c71765ce60e3d42f4c043c9646","datavalue":{"value":{"entity-type":"item","numeric-id":45106562,"id":"Q45106562"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}],"P7725":[{"mainsnak":{"snaktype":"value","property":"P7725","hash":"e9338e052dfaa9267c2357bec2e167ca625af667","datavalue":{"value":{"amount":"+2.5","unit":"1","upperBound":"+4.0","lowerBound":"+1.0"},"type":"quantity"},"datatype":"quantity"},"type":"statement","id":"Q140$f1f04a23-0d34-484a-9419-78d12958170c","rank":"normal","references":[{"hash":"94a79329d5eac70f7ddb005e0d1dc78c53e77797","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4a7fef7ea264a7c71765ce60e3d42f4c043c9646","datavalue":{"value":{"entity-type":"item","numeric-id":45106562,"id":"Q45106562"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}],"P4214":[{"mainsnak":{"snaktype":"value","property":"P4214","hash":"5a112dbdaed17b1ee3fe7a63b1f978e5fd41008a","datavalue":{"value":{"amount":"+27","unit":"http://www.wikidata.org/entity/Q577"},"type":"quantity"},"datatype":"quantity"},"type":"statement","id":"Q140$ec1ccab2-f506-4c81-9179-4625bbbbbe27","rank":"normal","references":[{"hash":"a8ccf5105b0e2623ae145dd8a9b927c9bd957ddf","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"5b45c23ddb076fe9c5accfe4a4bbd1c24c4c87cb","datavalue":{"value":{"entity-type":"item","numeric-id":83566668,"id":"Q83566668"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}],"P7862":[{"mainsnak":{"snaktype":"value","property":"P7862","hash":"6e74ddb544498b93407179cc9a7f9b8610762ff5","datavalue":{"value":{"amount":"+8","unit":"http://www.wikidata.org/entity/Q5151"},"type":"quantity"},"datatype":"quantity"},"type":"statement","id":"Q140$17b64a1e-4a13-9e2a-f8a2-a9317890aa53","rank":"normal","references":[{"hash":"94a79329d5eac70f7ddb005e0d1dc78c53e77797","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4a7fef7ea264a7c71765ce60e3d42f4c043c9646","datavalue":{"value":{"entity-type":"item","numeric-id":45106562,"id":"Q45106562"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}],"P7818":[{"mainsnak":{"snaktype":"value","property":"P7818","hash":"5c7bac858cf66d079e6c13c88f3f001eb446cdce","datavalue":{"value":"Lion","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$C2D3546E-C42A-404A-A288-580F9C705E12","rank":"normal"}],"P7829":[{"mainsnak":{"snaktype":"value","property":"P7829","hash":"17fbb02db65a7e80691f58be750382d61148406e","datavalue":{"value":"Lion","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$74998F51-E783-40CB-A56A-3189647AB3D4","rank":"normal"}],"P7827":[{"mainsnak":{"snaktype":"value","property":"P7827","hash":"f85db9fe2c187554aefc51e5529d75e0c5af4767","datavalue":{"value":"Le\u00f3n","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$5DA64E1B-F1F1-4254-8629-985DFE8672A2","rank":"normal"}],"P7822":[{"mainsnak":{"snaktype":"value","property":"P7822","hash":"3cd23fddc416227c2ba85d91aa03dc80a8e95836","datavalue":{"value":"Leone","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$DF657EF2-67A8-4272-871D-E95B3719A8B6","rank":"normal"}],"P6105":[{"mainsnak":{"snaktype":"value","property":"P6105","hash":"8bbda0afe53fc428d3a0d9528c97d2145ee41dce","datavalue":{"value":"79432","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$2AE92335-1BC6-4B92-BAF3-9AB41608E638","rank":"normal"}],"P6864":[{"mainsnak":{"snaktype":"value","property":"P6864","hash":"6f87ce0800057dbe88f27748b3077938973eb5c8","datavalue":{"value":"85426","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$9089C4B9-59A8-45A6-821B-05C1BB4C107C","rank":"normal"}],"P2347":[{"mainsnak":{"snaktype":"value","property":"P2347","hash":"41e41b306cdd5e55007ac02da022d9f4ce230b03","datavalue":{"value":"7345","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$3CEB44D7-6C0B-4E66-87ED-37D723A1CCC8","rank":"normal","references":[{"hash":"f9bf1a1f034ddd51bd9928ac535e0f57d748e2cf","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"7133f11674741f52cadaae6029068fad9cbb52e3","datavalue":{"value":{"entity-type":"item","numeric-id":89345680,"id":"Q89345680"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}],"P7033":[{"mainsnak":{"snaktype":"value","property":"P7033","hash":"e31b2e07ae0ce3d3a087d3c818c7bf29c7b04b72","datavalue":{"value":"scot/9244","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$F8148EB5-7934-4491-9B40-3378B7D292A6","rank":"normal"}],"P8408":[{"mainsnak":{"snaktype":"value","property":"P8408","hash":"51c04ed4f03488e8f428256ee41eb20eabe3ff38","datavalue":{"value":"Lion","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$2855E519-BCD1-4AB3-B3E9-BB53C5CB2E22","rank":"normal","references":[{"hash":"9a681f9dd95c90224547c404e11295f4f7dcf54e","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"9d5780dddffa8746637a9929a936ab6b0f601e24","datavalue":{"value":{"entity-type":"item","numeric-id":64139102,"id":"Q64139102"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"622a5a27fa5b25e7e7984974e9db494cf8460990","datavalue":{"value":{"time":"+2020-07-09T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P8519":[{"mainsnak":{"snaktype":"value","property":"P8519","hash":"ad8031a668b5310633a04a9223714b3482d388b2","datavalue":{"value":"64570","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$ba4fa085-0e54-4226-a46b-770f7d5a995f","rank":"normal"}],"P279":[{"mainsnak":{"snaktype":"value","property":"P279","hash":"761c3439637add8f8fe3a351d6231333693835f6","datavalue":{"value":{"entity-type":"item","numeric-id":6667323,"id":"Q6667323"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$cb41b7d3-46f0-e6d9-ced6-c2803e0c06b7","rank":"normal"}],"P2670":[{"mainsnak":{"snaktype":"value","property":"P2670","hash":"6563f1e596253f1574515891267de01c5c1e688e","datavalue":{"value":{"entity-type":"item","numeric-id":17611534,"id":"Q17611534"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$24984be4-4813-b6ad-ec83-1a37b7332c8a","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P2670","hash":"684855138cc32d11b487d0178c194f10c63f5f86","datavalue":{"value":{"entity-type":"item","numeric-id":98520146,"id":"Q98520146"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$56e8c9b3-4892-e95d-f7c5-02b10ffe77e8","rank":"normal"}],"P31":[{"mainsnak":{"snaktype":"value","property":"P31","hash":"06629d890d7ab0ff85c403d8aadf57ce9809c01f","datavalue":{"value":{"entity-type":"item","numeric-id":16521,"id":"Q16521"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"q140$8EE98E5B-4A9C-4BF5-B456-FB77E8EE4E69","rank":"normal"}],"P2581":[{"mainsnak":{"snaktype":"value","property":"P2581","hash":"beca27cf7dd079eb27b7690e13a446d98448ae91","datavalue":{"value":"00049156n","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$90562c9a-4e9c-082d-d577-e0869524d9a1","rank":"normal"}],"P7506":[{"mainsnak":{"snaktype":"value","property":"P7506","hash":"0562f57f9a54c65a2d45711f6dd5dd53ce37f6f8","datavalue":{"value":"1107856","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$00d453bf-4786-bde9-63f4-2db9f3610e88","rank":"normal"}],"P5184":[{"mainsnak":{"snaktype":"value","property":"P5184","hash":"201d8de9b05ae85fe4f917c7e54c4a0218517888","datavalue":{"value":"b11s0701a","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$a2b832c9-4c5c-e402-e10d-cf2b08d35a56","rank":"normal"}],"P6900":[{"mainsnak":{"snaktype":"value","property":"P6900","hash":"f7218c6984cd57078497a62ad595b089bdd97c49","datavalue":{"value":"\u30e9\u30a4\u30aa\u30f3","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$d15d143d-4826-4860-9aa3-6a350d6bc36f","rank":"normal"}],"P3553":[{"mainsnak":{"snaktype":"value","property":"P3553","hash":"c82c6e1156e098d5ef396248c412371b90e0dc56","datavalue":{"value":"19563862","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$5edb95fa-4647-2e9a-9dbf-b68e1326eb79","rank":"normal"}],"P5337":[{"mainsnak":{"snaktype":"value","property":"P5337","hash":"793cfa52df3c5a6747c0cb5db959db944b04dbed","datavalue":{"value":"CAAqIQgKIhtDQkFTRGdvSUwyMHZNRGsyYldJU0FtcGhLQUFQAQ","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$6137dbc1-4c6a-af60-00ee-2a32c63bfdfa","rank":"normal"}],"P6200":[{"mainsnak":{"snaktype":"value","property":"P6200","hash":"0ce08dd38017230d41f530f6e97baf484f607235","datavalue":{"value":"ce2gz91pyv2t","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$01ed0f16-4a4a-213d-e457-0d4d5d670d49","rank":"normal"}],"P4527":[{"mainsnak":{"snaktype":"value","property":"P4527","hash":"b07d29aa5112080a9294a7421e46ed0b73ac96c7","datavalue":{"value":"430792","type":"string"},"datatype":"external-id"},"type":"statement","qualifiers":{"P1810":[{"snaktype":"value","property":"P1810","hash":"7d78547303d5e9e014a7c8cef6072faee91088ce","datavalue":{"value":"Lions","type":"string"},"datatype":"string"}]},"qualifiers-order":["P1810"],"id":"Q140$C37C600C-4929-4203-A06E-8D797BA9B22A","rank":"normal"}],"P8989":[{"mainsnak":{"snaktype":"value","property":"P8989","hash":"37087c42c921d83773f62d77e7360dc44504c122","datavalue":{"value":{"entity-type":"item","numeric-id":104595349,"id":"Q104595349"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$1ece61f5-c008-4750-8b67-e15337f28e86","rank":"normal"}],"P1552":[{"mainsnak":{"snaktype":"value","property":"P1552","hash":"1aa7db66bfad11e427c40ec79f3295de877967f1","datavalue":{"value":{"entity-type":"item","numeric-id":120446,"id":"Q120446"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$0bd4b0d9-49ff-b5b4-5c10-9500bc0ce19d","rank":"normal"}],"P9198":[{"mainsnak":{"snaktype":"value","property":"P9198","hash":"d3ab4ab9d788dc348d16e13fc77164ea71cef2ae","datavalue":{"value":"352","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$C5D80C89-2862-490F-AA85-C260F32BE30B","rank":"normal"}],"P9566":[{"mainsnak":{"snaktype":"value","property":"P9566","hash":"053e0b7c15c8e5a61a71077c4cffa73b9d03005b","datavalue":{"value":{"entity-type":"item","numeric-id":3255068,"id":"Q3255068"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$C7DAEA4E-B613-48A6-BFCD-88B551D1EF7A","rank":"normal","references":[{"hash":"0eedf63ac49c9b21aa7ff0a5e70b71aa6069a8ed","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"abfcfc68aa085f872d633958be83cba2ab96ce4a","datavalue":{"value":{"entity-type":"item","numeric-id":1637051,"id":"Q1637051"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]},{"hash":"6db51e3163554f674ff270c93a2871c8d859a49e","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"abfcfc68aa085f872d633958be83cba2ab96ce4a","datavalue":{"value":{"entity-type":"item","numeric-id":1637051,"id":"Q1637051"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P577":[{"snaktype":"value","property":"P577","hash":"ccd6ea06a2c9c0f54f5b1f45991a659225b5f4ef","datavalue":{"value":{"time":"+2013-01-01T00:00:00Z","timezone":0,"before":0,"after":0,"precision":9,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P577"]}]}],"P508":[{"mainsnak":{"snaktype":"value","property":"P508","hash":"e87c854abf600fb5de7b9b677d94a06e18851333","datavalue":{"value":"34922","type":"string"},"datatype":"external-id"},"type":"statement","qualifiers":{"P1810":[{"snaktype":"value","property":"P1810","hash":"137692b9bcc178e7b7d232631cb607d45e2f543d","datavalue":{"value":"Leoni","type":"string"},"datatype":"string"}],"P4970":[{"snaktype":"value","property":"P4970","hash":"271ec192bf14b9eb639120c60d5961ab8692444d","datavalue":{"value":"Panthera leo","type":"string"},"datatype":"string"}]},"qualifiers-order":["P1810","P4970"],"id":"Q140$52702f98-7843-4e0e-b646-76629e04e555","rank":"normal"}],"P950":[{"mainsnak":{"snaktype":"value","property":"P950","hash":"f447323110fd744383394f91c2dfba2fc3187242","datavalue":{"value":"XX530613","type":"string"},"datatype":"external-id"},"type":"statement","qualifiers":{"P1810":[{"snaktype":"value","property":"P1810","hash":"e2b2bda5457e0d5f7859e5c54996e1884062dfd1","datavalue":{"value":"Leones","type":"string"},"datatype":"string"}]},"qualifiers-order":["P1810"],"id":"Q140$773f47cf-3133-4892-80eb-9d4dc5e97582","rank":"normal","references":[{"hash":"184729506e049d06de85686ede30c92b3e52451d","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"3b090a7bae73c288393b2c8b9846cc7ed9a58f91","datavalue":{"value":{"entity-type":"item","numeric-id":16583225,"id":"Q16583225"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P854":[{"snaktype":"value","property":"P854","hash":"b16c3ffac23bb97abe5d0c4d6ccffe4d010ab71a","datavalue":{"value":"https://thes.bncf.firenze.sbn.it/termine.php?id=34922","type":"string"},"datatype":"url"}],"P813":[{"snaktype":"value","property":"P813","hash":"7721e97431215c374db84a9df785dc964a16bd17","datavalue":{"value":{"time":"+2021-06-15T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P854","P813"]}]}],"P7603":[{"mainsnak":{"snaktype":"value","property":"P7603","hash":"c86436e278d690f057cfecc86babf982948015f3","datavalue":{"value":{"entity-type":"item","numeric-id":2851528,"id":"Q2851528"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P17":[{"snaktype":"value","property":"P17","hash":"18fb076bdc1c07e578546d1670ba193b768531ac","datavalue":{"value":{"entity-type":"item","numeric-id":668,"id":"Q668"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P17"],"id":"Q140$64262d09-4a19-3945-8a09-c2195b7614a7","rank":"normal"}],"P6800":[{"mainsnak":{"snaktype":"value","property":"P6800","hash":"1da99908e2ffdf6de901a1b8a2dbab0c62886565","datavalue":{"value":"http://www.ensembl.org/Panthera_leo","type":"string"},"datatype":"url"},"type":"statement","id":"Q140$87DC0D37-FC9E-4FFE-B92D-1A3A7C019A1D","rank":"normal","references":[{"hash":"53eb51e25c6356d2d4673dc249ea837dd14feca0","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4ec639fccc9ddb8e079f7d27ca43220e3c512c20","datavalue":{"value":{"entity-type":"item","numeric-id":1344256,"id":"Q1344256"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}]},"sitelinks":{"abwiki":{"site":"abwiki","title":"\u0410\u043b\u044b\u043c","badges":[],"url":"https://ab.wikipedia.org/wiki/%D0%90%D0%BB%D1%8B%D0%BC"},"adywiki":{"site":"adywiki","title":"\u0410\u0441\u043b\u044a\u0430\u043d","badges":[],"url":"https://ady.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D1%8A%D0%B0%D0%BD"},"afwiki":{"site":"afwiki","title":"Leeu","badges":["Q17437796"],"url":"https://af.wikipedia.org/wiki/Leeu"},"alswiki":{"site":"alswiki","title":"L\u00f6we","badges":[],"url":"https://als.wikipedia.org/wiki/L%C3%B6we"},"altwiki":{"site":"altwiki","title":"\u0410\u0440\u0441\u043b\u0430\u043d","badges":[],"url":"https://alt.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D0%B0%D0%BD"},"amwiki":{"site":"amwiki","title":"\u12a0\u1295\u1260\u1233","badges":[],"url":"https://am.wikipedia.org/wiki/%E1%8A%A0%E1%8A%95%E1%89%A0%E1%88%B3"},"angwiki":{"site":"angwiki","title":"L\u0113o","badges":[],"url":"https://ang.wikipedia.org/wiki/L%C4%93o"},"anwiki":{"site":"anwiki","title":"Panthera leo","badges":[],"url":"https://an.wikipedia.org/wiki/Panthera_leo"},"arcwiki":{"site":"arcwiki","title":"\u0710\u072a\u071d\u0710","badges":[],"url":"https://arc.wikipedia.org/wiki/%DC%90%DC%AA%DC%9D%DC%90"},"arwiki":{"site":"arwiki","title":"\u0623\u0633\u062f","badges":["Q17437796"],"url":"https://ar.wikipedia.org/wiki/%D8%A3%D8%B3%D8%AF"},"arywiki":{"site":"arywiki","title":"\u0633\u0628\u0639","badges":[],"url":"https://ary.wikipedia.org/wiki/%D8%B3%D8%A8%D8%B9"},"arzwiki":{"site":"arzwiki","title":"\u0633\u0628\u0639","badges":[],"url":"https://arz.wikipedia.org/wiki/%D8%B3%D8%A8%D8%B9"},"astwiki":{"site":"astwiki","title":"Panthera leo","badges":[],"url":"https://ast.wikipedia.org/wiki/Panthera_leo"},"aswiki":{"site":"aswiki","title":"\u09b8\u09bf\u0982\u09b9","badges":[],"url":"https://as.wikipedia.org/wiki/%E0%A6%B8%E0%A6%BF%E0%A6%82%E0%A6%B9"},"avkwiki":{"site":"avkwiki","title":"Krapol (Panthera leo)","badges":[],"url":"https://avk.wikipedia.org/wiki/Krapol_(Panthera_leo)"},"avwiki":{"site":"avwiki","title":"\u0413\u044a\u0430\u043b\u0431\u0430\u0446\u04c0","badges":[],"url":"https://av.wikipedia.org/wiki/%D0%93%D1%8A%D0%B0%D0%BB%D0%B1%D0%B0%D1%86%D3%80"},"azbwiki":{"site":"azbwiki","title":"\u0622\u0633\u0644\u0627\u0646","badges":[],"url":"https://azb.wikipedia.org/wiki/%D8%A2%D8%B3%D9%84%D8%A7%D9%86"},"azwiki":{"site":"azwiki","title":"\u015eir","badges":[],"url":"https://az.wikipedia.org/wiki/%C5%9Eir"},"bat_smgwiki":{"site":"bat_smgwiki","title":"Li\u016bts","badges":[],"url":"https://bat-smg.wikipedia.org/wiki/Li%C5%ABts"},"bawiki":{"site":"bawiki","title":"\u0410\u0440\u044b\u04ab\u043b\u0430\u043d","badges":[],"url":"https://ba.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D2%AB%D0%BB%D0%B0%D0%BD"},"bclwiki":{"site":"bclwiki","title":"Leon","badges":[],"url":"https://bcl.wikipedia.org/wiki/Leon"},"be_x_oldwiki":{"site":"be_x_oldwiki","title":"\u041b\u0435\u045e","badges":[],"url":"https://be-tarask.wikipedia.org/wiki/%D0%9B%D0%B5%D1%9E"},"bewiki":{"site":"bewiki","title":"\u041b\u0435\u045e","badges":[],"url":"https://be.wikipedia.org/wiki/%D0%9B%D0%B5%D1%9E"},"bgwiki":{"site":"bgwiki","title":"\u041b\u044a\u0432","badges":[],"url":"https://bg.wikipedia.org/wiki/%D0%9B%D1%8A%D0%B2"},"bhwiki":{"site":"bhwiki","title":"\u0938\u093f\u0902\u0939","badges":[],"url":"https://bh.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9"},"bmwiki":{"site":"bmwiki","title":"Waraba","badges":[],"url":"https://bm.wikipedia.org/wiki/Waraba"},"bnwiki":{"site":"bnwiki","title":"\u09b8\u09bf\u0982\u09b9","badges":[],"url":"https://bn.wikipedia.org/wiki/%E0%A6%B8%E0%A6%BF%E0%A6%82%E0%A6%B9"},"bowiki":{"site":"bowiki","title":"\u0f66\u0f7a\u0f44\u0f0b\u0f42\u0f7a\u0f0d","badges":[],"url":"https://bo.wikipedia.org/wiki/%E0%BD%A6%E0%BD%BA%E0%BD%84%E0%BC%8B%E0%BD%82%E0%BD%BA%E0%BC%8D"},"bpywiki":{"site":"bpywiki","title":"\u09a8\u0982\u09b8\u09be","badges":[],"url":"https://bpy.wikipedia.org/wiki/%E0%A6%A8%E0%A6%82%E0%A6%B8%E0%A6%BE"},"brwiki":{"site":"brwiki","title":"Leon (loen)","badges":[],"url":"https://br.wikipedia.org/wiki/Leon_(loen)"},"bswiki":{"site":"bswiki","title":"Lav","badges":[],"url":"https://bs.wikipedia.org/wiki/Lav"},"bswikiquote":{"site":"bswikiquote","title":"Lav","badges":[],"url":"https://bs.wikiquote.org/wiki/Lav"},"bxrwiki":{"site":"bxrwiki","title":"\u0410\u0440\u0441\u0430\u043b\u0430\u043d","badges":[],"url":"https://bxr.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%B0%D0%BB%D0%B0%D0%BD"},"cawiki":{"site":"cawiki","title":"Lle\u00f3","badges":["Q17437796"],"url":"https://ca.wikipedia.org/wiki/Lle%C3%B3"},"cawikiquote":{"site":"cawikiquote","title":"Lle\u00f3","badges":[],"url":"https://ca.wikiquote.org/wiki/Lle%C3%B3"},"cdowiki":{"site":"cdowiki","title":"S\u0103i (m\u00e0-ku\u014f d\u00f4ng-\u016dk)","badges":[],"url":"https://cdo.wikipedia.org/wiki/S%C4%83i_(m%C3%A0-ku%C5%8F_d%C3%B4ng-%C5%ADk)"},"cebwiki":{"site":"cebwiki","title":"Panthera leo","badges":[],"url":"https://ceb.wikipedia.org/wiki/Panthera_leo"},"cewiki":{"site":"cewiki","title":"\u041b\u043e\u043c","badges":[],"url":"https://ce.wikipedia.org/wiki/%D0%9B%D0%BE%D0%BC"},"chrwiki":{"site":"chrwiki","title":"\u13e2\u13d3\u13e5 \u13a4\u13c3\u13d5\u13be","badges":[],"url":"https://chr.wikipedia.org/wiki/%E1%8F%A2%E1%8F%93%E1%8F%A5_%E1%8E%A4%E1%8F%83%E1%8F%95%E1%8E%BE"},"chywiki":{"site":"chywiki","title":"P\u00e9hpe'\u00e9nan\u00f3se'hame","badges":[],"url":"https://chy.wikipedia.org/wiki/P%C3%A9hpe%27%C3%A9nan%C3%B3se%27hame"},"ckbwiki":{"site":"ckbwiki","title":"\u0634\u06ce\u0631","badges":[],"url":"https://ckb.wikipedia.org/wiki/%D8%B4%DB%8E%D8%B1"},"commonswiki":{"site":"commonswiki","title":"Panthera leo","badges":[],"url":"https://commons.wikimedia.org/wiki/Panthera_leo"},"cowiki":{"site":"cowiki","title":"Lionu","badges":[],"url":"https://co.wikipedia.org/wiki/Lionu"},"csbwiki":{"site":"csbwiki","title":"Lew","badges":[],"url":"https://csb.wikipedia.org/wiki/Lew"},"cswiki":{"site":"cswiki","title":"Lev","badges":[],"url":"https://cs.wikipedia.org/wiki/Lev"},"cswikiquote":{"site":"cswikiquote","title":"Lev","badges":[],"url":"https://cs.wikiquote.org/wiki/Lev"},"cuwiki":{"site":"cuwiki","title":"\u041b\u044c\u0432\u044a","badges":[],"url":"https://cu.wikipedia.org/wiki/%D0%9B%D1%8C%D0%B2%D1%8A"},"cvwiki":{"site":"cvwiki","title":"\u0410\u0440\u0103\u0441\u043b\u0430\u043d","badges":[],"url":"https://cv.wikipedia.org/wiki/%D0%90%D1%80%C4%83%D1%81%D0%BB%D0%B0%D0%BD"},"cywiki":{"site":"cywiki","title":"Llew","badges":[],"url":"https://cy.wikipedia.org/wiki/Llew"},"dagwiki":{"site":"dagwiki","title":"Gbu\u0263inli","badges":[],"url":"https://dag.wikipedia.org/wiki/Gbu%C9%A3inli"},"dawiki":{"site":"dawiki","title":"L\u00f8ve","badges":["Q17559452"],"url":"https://da.wikipedia.org/wiki/L%C3%B8ve"},"dewiki":{"site":"dewiki","title":"L\u00f6we","badges":["Q17437796"],"url":"https://de.wikipedia.org/wiki/L%C3%B6we"},"dewikiquote":{"site":"dewikiquote","title":"L\u00f6we","badges":[],"url":"https://de.wikiquote.org/wiki/L%C3%B6we"},"dinwiki":{"site":"dinwiki","title":"K\u00f6r","badges":[],"url":"https://din.wikipedia.org/wiki/K%C3%B6r"},"diqwiki":{"site":"diqwiki","title":"\u015e\u00ear","badges":[],"url":"https://diq.wikipedia.org/wiki/%C5%9E%C3%AAr"},"dsbwiki":{"site":"dsbwiki","title":"Law","badges":[],"url":"https://dsb.wikipedia.org/wiki/Law"},"eewiki":{"site":"eewiki","title":"Dzata","badges":[],"url":"https://ee.wikipedia.org/wiki/Dzata"},"elwiki":{"site":"elwiki","title":"\u039b\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9","badges":[],"url":"https://el.wikipedia.org/wiki/%CE%9B%CE%B9%CE%BF%CE%BD%CF%84%CE%AC%CF%81%CE%B9"},"enwiki":{"site":"enwiki","title":"Lion","badges":["Q17437796"],"url":"https://en.wikipedia.org/wiki/Lion"},"enwikiquote":{"site":"enwikiquote","title":"Lions","badges":[],"url":"https://en.wikiquote.org/wiki/Lions"},"eowiki":{"site":"eowiki","title":"Leono","badges":[],"url":"https://eo.wikipedia.org/wiki/Leono"},"eowikiquote":{"site":"eowikiquote","title":"Leono","badges":[],"url":"https://eo.wikiquote.org/wiki/Leono"},"eswiki":{"site":"eswiki","title":"Panthera leo","badges":["Q17437796"],"url":"https://es.wikipedia.org/wiki/Panthera_leo"},"eswikiquote":{"site":"eswikiquote","title":"Le\u00f3n","badges":[],"url":"https://es.wikiquote.org/wiki/Le%C3%B3n"},"etwiki":{"site":"etwiki","title":"L\u00f5vi","badges":[],"url":"https://et.wikipedia.org/wiki/L%C3%B5vi"},"etwikiquote":{"site":"etwikiquote","title":"L\u00f5vi","badges":[],"url":"https://et.wikiquote.org/wiki/L%C3%B5vi"},"euwiki":{"site":"euwiki","title":"Lehoi","badges":[],"url":"https://eu.wikipedia.org/wiki/Lehoi"},"extwiki":{"site":"extwiki","title":"Li\u00f3n (animal)","badges":[],"url":"https://ext.wikipedia.org/wiki/Li%C3%B3n_(animal)"},"fawiki":{"site":"fawiki","title":"\u0634\u06cc\u0631 (\u06af\u0631\u0628\u0647\u200c\u0633\u0627\u0646)","badges":["Q17437796"],"url":"https://fa.wikipedia.org/wiki/%D8%B4%DB%8C%D8%B1_(%DA%AF%D8%B1%D8%A8%D9%87%E2%80%8C%D8%B3%D8%A7%D9%86)"},"fawikiquote":{"site":"fawikiquote","title":"\u0634\u06cc\u0631","badges":[],"url":"https://fa.wikiquote.org/wiki/%D8%B4%DB%8C%D8%B1"},"fiu_vrowiki":{"site":"fiu_vrowiki","title":"L\u00f5vi","badges":[],"url":"https://fiu-vro.wikipedia.org/wiki/L%C3%B5vi"},"fiwiki":{"site":"fiwiki","title":"Leijona","badges":["Q17437796"],"url":"https://fi.wikipedia.org/wiki/Leijona"},"fowiki":{"site":"fowiki","title":"Leyva","badges":[],"url":"https://fo.wikipedia.org/wiki/Leyva"},"frrwiki":{"site":"frrwiki","title":"L\u00f6\u00f6w","badges":[],"url":"https://frr.wikipedia.org/wiki/L%C3%B6%C3%B6w"},"frwiki":{"site":"frwiki","title":"Lion","badges":["Q17437796"],"url":"https://fr.wikipedia.org/wiki/Lion"},"frwikiquote":{"site":"frwikiquote","title":"Lion","badges":[],"url":"https://fr.wikiquote.org/wiki/Lion"},"gagwiki":{"site":"gagwiki","title":"Aslan","badges":[],"url":"https://gag.wikipedia.org/wiki/Aslan"},"gawiki":{"site":"gawiki","title":"Leon","badges":[],"url":"https://ga.wikipedia.org/wiki/Leon"},"gdwiki":{"site":"gdwiki","title":"Le\u00f2mhann","badges":[],"url":"https://gd.wikipedia.org/wiki/Le%C3%B2mhann"},"glwiki":{"site":"glwiki","title":"Le\u00f3n","badges":[],"url":"https://gl.wikipedia.org/wiki/Le%C3%B3n"},"gnwiki":{"site":"gnwiki","title":"Le\u00f5","badges":[],"url":"https://gn.wikipedia.org/wiki/Le%C3%B5"},"gotwiki":{"site":"gotwiki","title":"\ud800\udf3b\ud800\udf39\ud800\udf45\ud800\udf30","badges":[],"url":"https://got.wikipedia.org/wiki/%F0%90%8C%BB%F0%90%8C%B9%F0%90%8D%85%F0%90%8C%B0"},"guwiki":{"site":"guwiki","title":"\u0a8f\u0ab6\u0abf\u0aaf\u0abe\u0a87 \u0ab8\u0abf\u0a82\u0ab9","badges":[],"url":"https://gu.wikipedia.org/wiki/%E0%AA%8F%E0%AA%B6%E0%AA%BF%E0%AA%AF%E0%AA%BE%E0%AA%87_%E0%AA%B8%E0%AA%BF%E0%AA%82%E0%AA%B9"},"hakwiki":{"site":"hakwiki","title":"S\u1e73\u0302-\u00e9","badges":[],"url":"https://hak.wikipedia.org/wiki/S%E1%B9%B3%CC%82-%C3%A9"},"hawiki":{"site":"hawiki","title":"Zaki","badges":[],"url":"https://ha.wikipedia.org/wiki/Zaki"},"hawwiki":{"site":"hawwiki","title":"Liona","badges":[],"url":"https://haw.wikipedia.org/wiki/Liona"},"hewiki":{"site":"hewiki","title":"\u05d0\u05e8\u05d9\u05d4","badges":[],"url":"https://he.wikipedia.org/wiki/%D7%90%D7%A8%D7%99%D7%94"},"hewikiquote":{"site":"hewikiquote","title":"\u05d0\u05e8\u05d9\u05d4","badges":[],"url":"https://he.wikiquote.org/wiki/%D7%90%D7%A8%D7%99%D7%94"},"hifwiki":{"site":"hifwiki","title":"Ser","badges":[],"url":"https://hif.wikipedia.org/wiki/Ser"},"hiwiki":{"site":"hiwiki","title":"\u0938\u093f\u0902\u0939 (\u092a\u0936\u0941)","badges":[],"url":"https://hi.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9_(%E0%A4%AA%E0%A4%B6%E0%A5%81)"},"hrwiki":{"site":"hrwiki","title":"Lav","badges":[],"url":"https://hr.wikipedia.org/wiki/Lav"},"hrwikiquote":{"site":"hrwikiquote","title":"Lav","badges":[],"url":"https://hr.wikiquote.org/wiki/Lav"},"hsbwiki":{"site":"hsbwiki","title":"Law","badges":[],"url":"https://hsb.wikipedia.org/wiki/Law"},"htwiki":{"site":"htwiki","title":"Lyon","badges":[],"url":"https://ht.wikipedia.org/wiki/Lyon"},"huwiki":{"site":"huwiki","title":"Oroszl\u00e1n","badges":[],"url":"https://hu.wikipedia.org/wiki/Oroszl%C3%A1n"},"hywiki":{"site":"hywiki","title":"\u0531\u057c\u0575\u0578\u0582\u056e","badges":[],"url":"https://hy.wikipedia.org/wiki/%D4%B1%D5%BC%D5%B5%D5%B8%D6%82%D5%AE"},"hywikiquote":{"site":"hywikiquote","title":"\u0531\u057c\u0575\u0578\u0582\u056e","badges":[],"url":"https://hy.wikiquote.org/wiki/%D4%B1%D5%BC%D5%B5%D5%B8%D6%82%D5%AE"},"hywwiki":{"site":"hywwiki","title":"\u0531\u057c\u056b\u0582\u056e","badges":[],"url":"https://hyw.wikipedia.org/wiki/%D4%B1%D5%BC%D5%AB%D6%82%D5%AE"},"iawiki":{"site":"iawiki","title":"Leon","badges":[],"url":"https://ia.wikipedia.org/wiki/Leon"},"idwiki":{"site":"idwiki","title":"Singa","badges":[],"url":"https://id.wikipedia.org/wiki/Singa"},"igwiki":{"site":"igwiki","title":"Od\u00fam","badges":[],"url":"https://ig.wikipedia.org/wiki/Od%C3%BAm"},"ilowiki":{"site":"ilowiki","title":"Leon","badges":[],"url":"https://ilo.wikipedia.org/wiki/Leon"},"inhwiki":{"site":"inhwiki","title":"\u041b\u043e\u043c","badges":[],"url":"https://inh.wikipedia.org/wiki/%D0%9B%D0%BE%D0%BC"},"iowiki":{"site":"iowiki","title":"Leono (mamifero)","badges":[],"url":"https://io.wikipedia.org/wiki/Leono_(mamifero)"},"iswiki":{"site":"iswiki","title":"Lj\u00f3n","badges":[],"url":"https://is.wikipedia.org/wiki/Lj%C3%B3n"},"itwiki":{"site":"itwiki","title":"Panthera leo","badges":[],"url":"https://it.wikipedia.org/wiki/Panthera_leo"},"itwikiquote":{"site":"itwikiquote","title":"Leone","badges":[],"url":"https://it.wikiquote.org/wiki/Leone"},"jawiki":{"site":"jawiki","title":"\u30e9\u30a4\u30aa\u30f3","badges":[],"url":"https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%82%AA%E3%83%B3"},"jawikiquote":{"site":"jawikiquote","title":"\u7345\u5b50","badges":[],"url":"https://ja.wikiquote.org/wiki/%E7%8D%85%E5%AD%90"},"jbowiki":{"site":"jbowiki","title":"cinfo","badges":[],"url":"https://jbo.wikipedia.org/wiki/cinfo"},"jvwiki":{"site":"jvwiki","title":"Singa","badges":[],"url":"https://jv.wikipedia.org/wiki/Singa"},"kabwiki":{"site":"kabwiki","title":"Izem","badges":[],"url":"https://kab.wikipedia.org/wiki/Izem"},"kawiki":{"site":"kawiki","title":"\u10da\u10dd\u10db\u10d8","badges":[],"url":"https://ka.wikipedia.org/wiki/%E1%83%9A%E1%83%9D%E1%83%9B%E1%83%98"},"kbdwiki":{"site":"kbdwiki","title":"\u0425\u044c\u044d\u0449","badges":[],"url":"https://kbd.wikipedia.org/wiki/%D0%A5%D1%8C%D1%8D%D1%89"},"kbpwiki":{"site":"kbpwiki","title":"T\u0254\u0254y\u028b\u028b","badges":[],"url":"https://kbp.wikipedia.org/wiki/T%C9%94%C9%94y%CA%8B%CA%8B"},"kgwiki":{"site":"kgwiki","title":"Nkosi","badges":[],"url":"https://kg.wikipedia.org/wiki/Nkosi"},"kkwiki":{"site":"kkwiki","title":"\u0410\u0440\u044b\u0441\u0442\u0430\u043d","badges":[],"url":"https://kk.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D1%82%D0%B0%D0%BD"},"knwiki":{"site":"knwiki","title":"\u0cb8\u0cbf\u0c82\u0cb9","badges":[],"url":"https://kn.wikipedia.org/wiki/%E0%B2%B8%E0%B2%BF%E0%B2%82%E0%B2%B9"},"kowiki":{"site":"kowiki","title":"\uc0ac\uc790","badges":[],"url":"https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9E%90"},"kowikiquote":{"site":"kowikiquote","title":"\uc0ac\uc790","badges":[],"url":"https://ko.wikiquote.org/wiki/%EC%82%AC%EC%9E%90"},"kswiki":{"site":"kswiki","title":"\u067e\u0627\u062f\u064e\u0631 \u0633\u0655\u06c1\u06c1","badges":[],"url":"https://ks.wikipedia.org/wiki/%D9%BE%D8%A7%D8%AF%D9%8E%D8%B1_%D8%B3%D9%95%DB%81%DB%81"},"kuwiki":{"site":"kuwiki","title":"\u015e\u00ear","badges":[],"url":"https://ku.wikipedia.org/wiki/%C5%9E%C3%AAr"},"kwwiki":{"site":"kwwiki","title":"Lew","badges":[],"url":"https://kw.wikipedia.org/wiki/Lew"},"kywiki":{"site":"kywiki","title":"\u0410\u0440\u0441\u0442\u0430\u043d","badges":[],"url":"https://ky.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D1%82%D0%B0%D0%BD"},"lawiki":{"site":"lawiki","title":"Leo","badges":[],"url":"https://la.wikipedia.org/wiki/Leo"},"lawikiquote":{"site":"lawikiquote","title":"Leo","badges":[],"url":"https://la.wikiquote.org/wiki/Leo"},"lbewiki":{"site":"lbewiki","title":"\u0410\u0441\u043b\u0430\u043d","badges":[],"url":"https://lbe.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D0%B0%D0%BD"},"lbwiki":{"site":"lbwiki","title":"L\u00e9iw","badges":[],"url":"https://lb.wikipedia.org/wiki/L%C3%A9iw"},"lezwiki":{"site":"lezwiki","title":"\u0410\u0441\u043b\u0430\u043d","badges":[],"url":"https://lez.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D0%B0%D0%BD"},"lfnwiki":{"site":"lfnwiki","title":"Leon","badges":[],"url":"https://lfn.wikipedia.org/wiki/Leon"},"lijwiki":{"site":"lijwiki","title":"Lion (bestia)","badges":[],"url":"https://lij.wikipedia.org/wiki/Lion_(bestia)"},"liwiki":{"site":"liwiki","title":"Liew","badges":["Q17437796"],"url":"https://li.wikipedia.org/wiki/Liew"},"lldwiki":{"site":"lldwiki","title":"Lion","badges":[],"url":"https://lld.wikipedia.org/wiki/Lion"},"lmowiki":{"site":"lmowiki","title":"Panthera leo","badges":[],"url":"https://lmo.wikipedia.org/wiki/Panthera_leo"},"lnwiki":{"site":"lnwiki","title":"Nk\u0254\u0301si","badges":[],"url":"https://ln.wikipedia.org/wiki/Nk%C9%94%CC%81si"},"ltgwiki":{"site":"ltgwiki","title":"\u013bovs","badges":[],"url":"https://ltg.wikipedia.org/wiki/%C4%BBovs"},"ltwiki":{"site":"ltwiki","title":"Li\u016btas","badges":[],"url":"https://lt.wikipedia.org/wiki/Li%C5%ABtas"},"ltwikiquote":{"site":"ltwikiquote","title":"Li\u016btas","badges":[],"url":"https://lt.wikiquote.org/wiki/Li%C5%ABtas"},"lvwiki":{"site":"lvwiki","title":"Lauva","badges":["Q17437796"],"url":"https://lv.wikipedia.org/wiki/Lauva"},"mdfwiki":{"site":"mdfwiki","title":"\u041e\u0440\u043a\u0441\u043e\u0444\u0442\u0430","badges":["Q17437796"],"url":"https://mdf.wikipedia.org/wiki/%D0%9E%D1%80%D0%BA%D1%81%D0%BE%D1%84%D1%82%D0%B0"},"mgwiki":{"site":"mgwiki","title":"Liona","badges":[],"url":"https://mg.wikipedia.org/wiki/Liona"},"mhrwiki":{"site":"mhrwiki","title":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d","badges":[],"url":"https://mhr.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD"},"mkwiki":{"site":"mkwiki","title":"\u041b\u0430\u0432","badges":[],"url":"https://mk.wikipedia.org/wiki/%D0%9B%D0%B0%D0%B2"},"mlwiki":{"site":"mlwiki","title":"\u0d38\u0d3f\u0d02\u0d39\u0d02","badges":[],"url":"https://ml.wikipedia.org/wiki/%E0%B4%B8%E0%B4%BF%E0%B4%82%E0%B4%B9%E0%B4%82"},"mniwiki":{"site":"mniwiki","title":"\uabc5\uabe3\uabe1\uabc1\uabe5","badges":[],"url":"https://mni.wikipedia.org/wiki/%EA%AF%85%EA%AF%A3%EA%AF%A1%EA%AF%81%EA%AF%A5"},"mnwiki":{"site":"mnwiki","title":"\u0410\u0440\u0441\u043b\u0430\u043d","badges":[],"url":"https://mn.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D0%B0%D0%BD"},"mrjwiki":{"site":"mrjwiki","title":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d","badges":[],"url":"https://mrj.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD"},"mrwiki":{"site":"mrwiki","title":"\u0938\u093f\u0902\u0939","badges":[],"url":"https://mr.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9"},"mswiki":{"site":"mswiki","title":"Singa","badges":["Q17437796"],"url":"https://ms.wikipedia.org/wiki/Singa"},"mtwiki":{"site":"mtwiki","title":"Iljun","badges":[],"url":"https://mt.wikipedia.org/wiki/Iljun"},"mywiki":{"site":"mywiki","title":"\u1001\u103c\u1004\u103a\u1039\u101e\u1031\u1037","badges":[],"url":"https://my.wikipedia.org/wiki/%E1%80%81%E1%80%BC%E1%80%84%E1%80%BA%E1%80%B9%E1%80%9E%E1%80%B1%E1%80%B7"},"newiki":{"site":"newiki","title":"\u0938\u093f\u0902\u0939","badges":[],"url":"https://ne.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9"},"newwiki":{"site":"newwiki","title":"\u0938\u093f\u0902\u0939","badges":[],"url":"https://new.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9"},"nlwiki":{"site":"nlwiki","title":"Leeuw (dier)","badges":[],"url":"https://nl.wikipedia.org/wiki/Leeuw_(dier)"},"nnwiki":{"site":"nnwiki","title":"L\u00f8ve","badges":[],"url":"https://nn.wikipedia.org/wiki/L%C3%B8ve"},"nowiki":{"site":"nowiki","title":"L\u00f8ve","badges":[],"url":"https://no.wikipedia.org/wiki/L%C3%B8ve"},"nrmwiki":{"site":"nrmwiki","title":"Lion","badges":[],"url":"https://nrm.wikipedia.org/wiki/Lion"},"nsowiki":{"site":"nsowiki","title":"Tau","badges":[],"url":"https://nso.wikipedia.org/wiki/Tau"},"nvwiki":{"site":"nvwiki","title":"N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed","badges":[],"url":"https://nv.wikipedia.org/wiki/N%C3%A1shd%C3%B3%C3%ADtsoh_bitsiij%C4%AF%CA%BC_dadit%C5%82%CA%BCoo%C3%ADg%C3%AD%C3%AD"},"ocwiki":{"site":"ocwiki","title":"Panthera leo","badges":[],"url":"https://oc.wikipedia.org/wiki/Panthera_leo"},"orwiki":{"site":"orwiki","title":"\u0b38\u0b3f\u0b02\u0b39","badges":[],"url":"https://or.wikipedia.org/wiki/%E0%AC%B8%E0%AC%BF%E0%AC%82%E0%AC%B9"},"oswiki":{"site":"oswiki","title":"\u0426\u043e\u043c\u0430\u0445\u044a","badges":[],"url":"https://os.wikipedia.org/wiki/%D0%A6%D0%BE%D0%BC%D0%B0%D1%85%D1%8A"},"pamwiki":{"site":"pamwiki","title":"Leon (animal)","badges":["Q17437796"],"url":"https://pam.wikipedia.org/wiki/Leon_(animal)"},"pawiki":{"site":"pawiki","title":"\u0a2c\u0a71\u0a2c\u0a30 \u0a38\u0a3c\u0a47\u0a30","badges":[],"url":"https://pa.wikipedia.org/wiki/%E0%A8%AC%E0%A9%B1%E0%A8%AC%E0%A8%B0_%E0%A8%B8%E0%A8%BC%E0%A9%87%E0%A8%B0"},"pcdwiki":{"site":"pcdwiki","title":"Lion","badges":[],"url":"https://pcd.wikipedia.org/wiki/Lion"},"plwiki":{"site":"plwiki","title":"Lew afryka\u0144ski","badges":["Q17437796"],"url":"https://pl.wikipedia.org/wiki/Lew_afryka%C5%84ski"},"plwikiquote":{"site":"plwikiquote","title":"Lew","badges":[],"url":"https://pl.wikiquote.org/wiki/Lew"},"pmswiki":{"site":"pmswiki","title":"Lion","badges":[],"url":"https://pms.wikipedia.org/wiki/Lion"},"pnbwiki":{"site":"pnbwiki","title":"\u0628\u0628\u0631 \u0634\u06cc\u0631","badges":[],"url":"https://pnb.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%DB%8C%D8%B1"},"pswiki":{"site":"pswiki","title":"\u0632\u0645\u0631\u06cc","badges":[],"url":"https://ps.wikipedia.org/wiki/%D8%B2%D9%85%D8%B1%DB%8C"},"ptwiki":{"site":"ptwiki","title":"Le\u00e3o","badges":[],"url":"https://pt.wikipedia.org/wiki/Le%C3%A3o"},"ptwikiquote":{"site":"ptwikiquote","title":"Le\u00e3o","badges":[],"url":"https://pt.wikiquote.org/wiki/Le%C3%A3o"},"quwiki":{"site":"quwiki","title":"Liyun","badges":[],"url":"https://qu.wikipedia.org/wiki/Liyun"},"rmwiki":{"site":"rmwiki","title":"Liun","badges":[],"url":"https://rm.wikipedia.org/wiki/Liun"},"rnwiki":{"site":"rnwiki","title":"Intare","badges":[],"url":"https://rn.wikipedia.org/wiki/Intare"},"rowiki":{"site":"rowiki","title":"Leu","badges":[],"url":"https://ro.wikipedia.org/wiki/Leu"},"ruewiki":{"site":"ruewiki","title":"\u041b\u0435\u0432","badges":[],"url":"https://rue.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2"},"ruwiki":{"site":"ruwiki","title":"\u041b\u0435\u0432","badges":["Q17437798"],"url":"https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2"},"ruwikinews":{"site":"ruwikinews","title":"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f:\u041b\u044c\u0432\u044b","badges":[],"url":"https://ru.wikinews.org/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9B%D1%8C%D0%B2%D1%8B"},"rwwiki":{"site":"rwwiki","title":"Intare","badges":[],"url":"https://rw.wikipedia.org/wiki/Intare"},"sahwiki":{"site":"sahwiki","title":"\u0425\u0430\u0445\u0430\u0439","badges":[],"url":"https://sah.wikipedia.org/wiki/%D0%A5%D0%B0%D1%85%D0%B0%D0%B9"},"satwiki":{"site":"satwiki","title":"\u1c61\u1c5f\u1c74\u1c5f\u1c60\u1c69\u1c5e","badges":[],"url":"https://sat.wikipedia.org/wiki/%E1%B1%A1%E1%B1%9F%E1%B1%B4%E1%B1%9F%E1%B1%A0%E1%B1%A9%E1%B1%9E"},"sawiki":{"site":"sawiki","title":"\u0938\u093f\u0902\u0939\u0903 \u092a\u0936\u0941\u0903","badges":[],"url":"https://sa.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9%E0%A4%83_%E0%A4%AA%E0%A4%B6%E0%A5%81%E0%A4%83"},"scnwiki":{"site":"scnwiki","title":"Panthera leo","badges":[],"url":"https://scn.wikipedia.org/wiki/Panthera_leo"},"scowiki":{"site":"scowiki","title":"Lion","badges":["Q17437796"],"url":"https://sco.wikipedia.org/wiki/Lion"},"sdwiki":{"site":"sdwiki","title":"\u0628\u0628\u0631 \u0634\u064a\u0646\u0647\u0646","badges":[],"url":"https://sd.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%D9%8A%D9%86%D9%87%D9%86"},"sewiki":{"site":"sewiki","title":"Ledjon","badges":[],"url":"https://se.wikipedia.org/wiki/Ledjon"},"shiwiki":{"site":"shiwiki","title":"Agrzam","badges":[],"url":"https://shi.wikipedia.org/wiki/Agrzam"},"shnwiki":{"site":"shnwiki","title":"\u101e\u1062\u1004\u103a\u1087\u101e\u102e\u1088","badges":[],"url":"https://shn.wikipedia.org/wiki/%E1%80%9E%E1%81%A2%E1%80%84%E1%80%BA%E1%82%87%E1%80%9E%E1%80%AE%E1%82%88"},"shwiki":{"site":"shwiki","title":"Lav","badges":[],"url":"https://sh.wikipedia.org/wiki/Lav"},"simplewiki":{"site":"simplewiki","title":"Lion","badges":[],"url":"https://simple.wikipedia.org/wiki/Lion"},"siwiki":{"site":"siwiki","title":"\u0dc3\u0dd2\u0d82\u0dc4\u0dba\u0dcf","badges":[],"url":"https://si.wikipedia.org/wiki/%E0%B7%83%E0%B7%92%E0%B6%82%E0%B7%84%E0%B6%BA%E0%B7%8F"},"skwiki":{"site":"skwiki","title":"Lev p\u00fa\u0161\u0165ov\u00fd","badges":[],"url":"https://sk.wikipedia.org/wiki/Lev_p%C3%BA%C5%A1%C5%A5ov%C3%BD"},"skwikiquote":{"site":"skwikiquote","title":"Lev","badges":[],"url":"https://sk.wikiquote.org/wiki/Lev"},"slwiki":{"site":"slwiki","title":"Lev","badges":[],"url":"https://sl.wikipedia.org/wiki/Lev"},"smwiki":{"site":"smwiki","title":"Leona","badges":[],"url":"https://sm.wikipedia.org/wiki/Leona"},"snwiki":{"site":"snwiki","title":"Shumba","badges":[],"url":"https://sn.wikipedia.org/wiki/Shumba"},"sowiki":{"site":"sowiki","title":"Libaax","badges":[],"url":"https://so.wikipedia.org/wiki/Libaax"},"specieswiki":{"site":"specieswiki","title":"Panthera leo","badges":[],"url":"https://species.wikimedia.org/wiki/Panthera_leo"},"sqwiki":{"site":"sqwiki","title":"Luani","badges":[],"url":"https://sq.wikipedia.org/wiki/Luani"},"srwiki":{"site":"srwiki","title":"\u041b\u0430\u0432","badges":[],"url":"https://sr.wikipedia.org/wiki/%D0%9B%D0%B0%D0%B2"},"sswiki":{"site":"sswiki","title":"Libhubesi","badges":[],"url":"https://ss.wikipedia.org/wiki/Libhubesi"},"stqwiki":{"site":"stqwiki","title":"Leeuwe","badges":[],"url":"https://stq.wikipedia.org/wiki/Leeuwe"},"stwiki":{"site":"stwiki","title":"Tau","badges":[],"url":"https://st.wikipedia.org/wiki/Tau"},"suwiki":{"site":"suwiki","title":"Singa","badges":[],"url":"https://su.wikipedia.org/wiki/Singa"},"svwiki":{"site":"svwiki","title":"Lejon","badges":[],"url":"https://sv.wikipedia.org/wiki/Lejon"},"swwiki":{"site":"swwiki","title":"Simba","badges":[],"url":"https://sw.wikipedia.org/wiki/Simba"},"szlwiki":{"site":"szlwiki","title":"Lew","badges":[],"url":"https://szl.wikipedia.org/wiki/Lew"},"tawiki":{"site":"tawiki","title":"\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd","badges":[],"url":"https://ta.wikipedia.org/wiki/%E0%AE%9A%E0%AE%BF%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%AE%E0%AF%8D"},"tcywiki":{"site":"tcywiki","title":"\u0cb8\u0cbf\u0c82\u0cb9","badges":[],"url":"https://tcy.wikipedia.org/wiki/%E0%B2%B8%E0%B2%BF%E0%B2%82%E0%B2%B9"},"tewiki":{"site":"tewiki","title":"\u0c38\u0c3f\u0c02\u0c39\u0c02","badges":[],"url":"https://te.wikipedia.org/wiki/%E0%B0%B8%E0%B0%BF%E0%B0%82%E0%B0%B9%E0%B0%82"},"tgwiki":{"site":"tgwiki","title":"\u0428\u0435\u0440","badges":[],"url":"https://tg.wikipedia.org/wiki/%D0%A8%D0%B5%D1%80"},"thwiki":{"site":"thwiki","title":"\u0e2a\u0e34\u0e07\u0e42\u0e15","badges":[],"url":"https://th.wikipedia.org/wiki/%E0%B8%AA%E0%B8%B4%E0%B8%87%E0%B9%82%E0%B8%95"},"tiwiki":{"site":"tiwiki","title":"\u12a3\u1295\u1260\u1233","badges":[],"url":"https://ti.wikipedia.org/wiki/%E1%8A%A3%E1%8A%95%E1%89%A0%E1%88%B3"},"tkwiki":{"site":"tkwiki","title":"\u00ddolbars","badges":[],"url":"https://tk.wikipedia.org/wiki/%C3%9Dolbars"},"tlwiki":{"site":"tlwiki","title":"Leon","badges":[],"url":"https://tl.wikipedia.org/wiki/Leon"},"trwiki":{"site":"trwiki","title":"Aslan","badges":[],"url":"https://tr.wikipedia.org/wiki/Aslan"},"ttwiki":{"site":"ttwiki","title":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d","badges":[],"url":"https://tt.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD"},"tumwiki":{"site":"tumwiki","title":"Nkhalamu","badges":[],"url":"https://tum.wikipedia.org/wiki/Nkhalamu"},"udmwiki":{"site":"udmwiki","title":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d","badges":[],"url":"https://udm.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD"},"ugwiki":{"site":"ugwiki","title":"\u0634\u0649\u0631","badges":[],"url":"https://ug.wikipedia.org/wiki/%D8%B4%D9%89%D8%B1"},"ukwiki":{"site":"ukwiki","title":"\u041b\u0435\u0432","badges":[],"url":"https://uk.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2"},"ukwikiquote":{"site":"ukwikiquote","title":"\u041b\u0435\u0432","badges":[],"url":"https://uk.wikiquote.org/wiki/%D0%9B%D0%B5%D0%B2"},"urwiki":{"site":"urwiki","title":"\u0628\u0628\u0631 \u0634\u06cc\u0631","badges":["Q17437796"],"url":"https://ur.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%DB%8C%D8%B1"},"uzwiki":{"site":"uzwiki","title":"Arslon","badges":[],"url":"https://uz.wikipedia.org/wiki/Arslon"},"vecwiki":{"site":"vecwiki","title":"Leon","badges":[],"url":"https://vec.wikipedia.org/wiki/Leon"},"vepwiki":{"site":"vepwiki","title":"Lev","badges":[],"url":"https://vep.wikipedia.org/wiki/Lev"},"viwiki":{"site":"viwiki","title":"S\u01b0 t\u1eed","badges":[],"url":"https://vi.wikipedia.org/wiki/S%C6%B0_t%E1%BB%AD"},"vlswiki":{"site":"vlswiki","title":"L\u00eaeuw (b\u00eaeste)","badges":[],"url":"https://vls.wikipedia.org/wiki/L%C3%AAeuw_(b%C3%AAeste)"},"warwiki":{"site":"warwiki","title":"Leon","badges":[],"url":"https://war.wikipedia.org/wiki/Leon"},"wowiki":{"site":"wowiki","title":"Gaynde","badges":[],"url":"https://wo.wikipedia.org/wiki/Gaynde"},"wuuwiki":{"site":"wuuwiki","title":"\u72ee","badges":[],"url":"https://wuu.wikipedia.org/wiki/%E7%8B%AE"},"xalwiki":{"site":"xalwiki","title":"\u0410\u0440\u0441\u043b\u04a3","badges":[],"url":"https://xal.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D2%A3"},"xhwiki":{"site":"xhwiki","title":"Ingonyama","badges":[],"url":"https://xh.wikipedia.org/wiki/Ingonyama"},"xmfwiki":{"site":"xmfwiki","title":"\u10dc\u10ef\u10d8\u10da\u10dd","badges":[],"url":"https://xmf.wikipedia.org/wiki/%E1%83%9C%E1%83%AF%E1%83%98%E1%83%9A%E1%83%9D"},"yiwiki":{"site":"yiwiki","title":"\u05dc\u05d9\u05d9\u05d1","badges":[],"url":"https://yi.wikipedia.org/wiki/%D7%9C%D7%99%D7%99%D7%91"},"yowiki":{"site":"yowiki","title":"K\u00ecn\u00ec\u00fan","badges":[],"url":"https://yo.wikipedia.org/wiki/K%C3%ACn%C3%AC%C3%BAn"},"zawiki":{"site":"zawiki","title":"Saeceij","badges":[],"url":"https://za.wikipedia.org/wiki/Saeceij"},"zh_min_nanwiki":{"site":"zh_min_nanwiki","title":"Sai","badges":[],"url":"https://zh-min-nan.wikipedia.org/wiki/Sai"},"zh_yuewiki":{"site":"zh_yuewiki","title":"\u7345\u5b50","badges":["Q17437796"],"url":"https://zh-yue.wikipedia.org/wiki/%E7%8D%85%E5%AD%90"},"zhwiki":{"site":"zhwiki","title":"\u72ee","badges":[],"url":"https://zh.wikipedia.org/wiki/%E7%8B%AE"},"zuwiki":{"site":"zuwiki","title":"Ibhubesi","badges":[],"url":"https://zu.wikipedia.org/wiki/Ibhubesi"}}}}} } \ No newline at end of file