forked from MapComplete/MapComplete
		
	Merge pull request #424 from pietervdvn/develop-extra-feature
Location following feature
This commit is contained in:
		
						commit
						7a06ec1bd5
					
				
					 12 changed files with 592 additions and 491 deletions
				
			
		|  | @ -1,244 +1,262 @@ | ||||||
| import * as L from "leaflet"; | import * as L from "leaflet"; | ||||||
| import {UIEventSource} from "../UIEventSource"; | import { UIEventSource } from "../UIEventSource"; | ||||||
| import {Utils} from "../../Utils"; | import { Utils } from "../../Utils"; | ||||||
| import Svg from "../../Svg"; | import Svg from "../../Svg"; | ||||||
| import Img from "../../UI/Base/Img"; | import Img from "../../UI/Base/Img"; | ||||||
| import {LocalStorageSource} from "../Web/LocalStorageSource"; | import { LocalStorageSource } from "../Web/LocalStorageSource"; | ||||||
| import LayoutConfig from "../../Customizations/JSON/LayoutConfig"; | import LayoutConfig from "../../Customizations/JSON/LayoutConfig"; | ||||||
| import {VariableUiElement} from "../../UI/Base/VariableUIElement"; | import { VariableUiElement } from "../../UI/Base/VariableUIElement"; | ||||||
| 
 | 
 | ||||||
| export default class GeoLocationHandler extends VariableUiElement { | export default class GeoLocationHandler extends VariableUiElement { | ||||||
|  |   /** | ||||||
|  |    * Wether or not the geolocation is active, aka the user requested the current location | ||||||
|  |    * @private | ||||||
|  |    */ | ||||||
|  |   private readonly _isActive: UIEventSource<boolean>; | ||||||
| 
 | 
 | ||||||
|     /** |   /** | ||||||
|      * Wether or not the geolocation is active, aka the user requested the current location |    * Wether or not the geolocation is locked, aka the user requested the current location and wants the crosshair to follow the user | ||||||
|      * @private |    * @private | ||||||
|      */ |    */ | ||||||
|     private readonly _isActive: UIEventSource<boolean>; |   private readonly _isLocked: UIEventSource<boolean>; | ||||||
| 
 | 
 | ||||||
|     /** |   /** | ||||||
|      * The callback over the permission API |    * The callback over the permission API | ||||||
|      * @private |    * @private | ||||||
|      */ |    */ | ||||||
|     private readonly _permission: UIEventSource<string>; |   private readonly _permission: UIEventSource<string>; | ||||||
|     /*** |   /*** | ||||||
|      * The marker on the map, in order to update it |    * The marker on the map, in order to update it | ||||||
|      * @private |    * @private | ||||||
|      */ |    */ | ||||||
|     private _marker: L.Marker; |   private _marker: L.Marker; | ||||||
|     /** |   /** | ||||||
|      * Literally: _currentGPSLocation.data != undefined |    * Literally: _currentGPSLocation.data != undefined | ||||||
|      * @private |    * @private | ||||||
|      */ |    */ | ||||||
|     private readonly _hasLocation: UIEventSource<boolean>; |   private readonly _hasLocation: UIEventSource<boolean>; | ||||||
|     private readonly _currentGPSLocation: UIEventSource<{ latlng: any; accuracy: number }>; |   private readonly _currentGPSLocation: UIEventSource<{ | ||||||
|     /** |     latlng: any; | ||||||
|      * Kept in order to update the marker |     accuracy: number; | ||||||
|      * @private |   }>; | ||||||
|      */ |   /** | ||||||
|     private readonly _leafletMap: UIEventSource<L.Map>; |    * Kept in order to update the marker | ||||||
|     /** |    * @private | ||||||
|      * The date when the user requested the geolocation. If we have a location, it'll autozoom to it the first 30 secs |    */ | ||||||
|      * @private |   private readonly _leafletMap: UIEventSource<L.Map>; | ||||||
|      */ |   /** | ||||||
|     private _lastUserRequest: Date; |    * The date when the user requested the geolocation. If we have a location, it'll autozoom to it the first 30 secs | ||||||
|     /** |    * @private | ||||||
|      * A small flag on localstorage. If the user previously granted the geolocation, it will be set. |    */ | ||||||
|      * On firefox, the permissions api is broken (probably fingerprint resistiance) and "granted + don't ask again" doesn't stick between sessions. |   private _lastUserRequest: Date; | ||||||
|      * |   /** | ||||||
|      * Instead, we set this flag. If this flag is set upon loading the page, we start geolocating immediately. |    * A small flag on localstorage. If the user previously granted the geolocation, it will be set. | ||||||
|      * If the user denies the geolocation this time, we unset this flag |    * On firefox, the permissions api is broken (probably fingerprint resistiance) and "granted + don't ask again" doesn't stick between sessions. | ||||||
|      * @private |    * | ||||||
|      */ |    * Instead, we set this flag. If this flag is set upon loading the page, we start geolocating immediately. | ||||||
|     private readonly _previousLocationGrant: UIEventSource<string>; |    * If the user denies the geolocation this time, we unset this flag | ||||||
|     private readonly _layoutToUse: UIEventSource<LayoutConfig>; |    * @private | ||||||
|  |    */ | ||||||
|  |   private readonly _previousLocationGrant: UIEventSource<string>; | ||||||
|  |   private readonly _layoutToUse: UIEventSource<LayoutConfig>; | ||||||
| 
 | 
 | ||||||
|  |   constructor( | ||||||
|  |     currentGPSLocation: UIEventSource<{ latlng: any; accuracy: number }>, | ||||||
|  |     leafletMap: UIEventSource<L.Map>, | ||||||
|  |     layoutToUse: UIEventSource<LayoutConfig> | ||||||
|  |   ) { | ||||||
|  |     const hasLocation = currentGPSLocation.map( | ||||||
|  |       (location) => location !== undefined | ||||||
|  |     ); | ||||||
|  |     const previousLocationGrant = LocalStorageSource.Get( | ||||||
|  |       "geolocation-permissions" | ||||||
|  |     ); | ||||||
|  |     const isActive = new UIEventSource<boolean>(false); | ||||||
|  |     const isLocked = new UIEventSource<boolean>(false); | ||||||
| 
 | 
 | ||||||
|     constructor(currentGPSLocation: UIEventSource<{ latlng: any; accuracy: number }>, |     super( | ||||||
|                 leafletMap: UIEventSource<L.Map>, |       hasLocation.map( | ||||||
|                 layoutToUse: UIEventSource<LayoutConfig>) { |         (hasLocationData) => { | ||||||
|  |           if (isLocked.data) { | ||||||
|  |             return Svg.up_ui(); | ||||||
|  |           } else if (hasLocationData) { | ||||||
|  |             return Svg.crosshair_blue_ui(); | ||||||
|  |           } else if (isActive.data) { | ||||||
|  |             return Svg.crosshair_blue_center_ui(); | ||||||
|  |           } else { | ||||||
|  |             return Svg.crosshair_ui(); | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         [isActive, isLocked] | ||||||
|  |       ) | ||||||
|  |     ); | ||||||
|  |     this._isActive = isActive; | ||||||
|  |     this._isLocked = isLocked; | ||||||
|  |     this._permission = new UIEventSource<string>(""); | ||||||
|  |     this._previousLocationGrant = previousLocationGrant; | ||||||
|  |     this._currentGPSLocation = currentGPSLocation; | ||||||
|  |     this._leafletMap = leafletMap; | ||||||
|  |     this._layoutToUse = layoutToUse; | ||||||
|  |     this._hasLocation = hasLocation; | ||||||
|  |     const self = this; | ||||||
| 
 | 
 | ||||||
|         const hasLocation = currentGPSLocation.map((location) => location !== undefined); |     const currentPointer = this._isActive.map( | ||||||
|         const previousLocationGrant = LocalStorageSource.Get("geolocation-permissions") |       (isActive) => { | ||||||
|         const isActive = new UIEventSource<boolean>(false); |         if (isActive && !self._hasLocation.data) { | ||||||
|  |           return "cursor-wait"; | ||||||
|  |         } | ||||||
|  |         return "cursor-pointer"; | ||||||
|  |       }, | ||||||
|  |       [this._hasLocation] | ||||||
|  |     ); | ||||||
|  |     currentPointer.addCallbackAndRun((pointerClass) => { | ||||||
|  |       self.SetClass(pointerClass); | ||||||
|  |     }); | ||||||
| 
 | 
 | ||||||
|         super( |     this.onClick(() => { | ||||||
|             hasLocation.map(hasLocation => { |       self.init(true); | ||||||
|  |       if (self._isActive.data) { | ||||||
|  |         self._isLocked.setData(!self._isLocked.data); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |     this.init(false); | ||||||
| 
 | 
 | ||||||
|                 if (hasLocation) { |     this._currentGPSLocation.addCallback((location) => { | ||||||
|                     return Svg.crosshair_blue_ui() |       self._previousLocationGrant.setData("granted"); | ||||||
|                 } | 
 | ||||||
|                 if (isActive.data) { |       const timeSinceRequest = | ||||||
|                     return Svg.crosshair_blue_center_ui(); |         (new Date().getTime() - (self._lastUserRequest?.getTime() ?? 0)) / 1000; | ||||||
|                 } |       if (timeSinceRequest < 30) { | ||||||
|                 return Svg.crosshair_ui(); |         self.MoveToCurrentLoction(16); | ||||||
|             }, [isActive]) |       } else if (self._isLocked.data) { | ||||||
|  |         self.MoveToCurrentLoction(); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       let color = "#1111cc"; | ||||||
|  |       try { | ||||||
|  |         color = getComputedStyle(document.body).getPropertyValue( | ||||||
|  |           "--catch-detail-color" | ||||||
|         ); |         ); | ||||||
|         this._isActive = isActive; |       } catch (e) { | ||||||
|         this._permission = new UIEventSource<string>("") |         console.error(e); | ||||||
|         this._previousLocationGrant = previousLocationGrant; |       } | ||||||
|         this._currentGPSLocation = currentGPSLocation; |       const icon = L.icon({ | ||||||
|         this._leafletMap = leafletMap; |         iconUrl: Img.AsData(Svg.crosshair.replace(/#000000/g, color)), | ||||||
|         this._layoutToUse = layoutToUse; |         iconSize: [40, 40], // size of the icon
 | ||||||
|         this._hasLocation = hasLocation; |         iconAnchor: [20, 20], // point of the icon which will correspond to marker's location
 | ||||||
|         const self = this; |       }); | ||||||
| 
 | 
 | ||||||
|         const currentPointer = this._isActive.map(isActive => { |       const map = self._leafletMap.data; | ||||||
|             if (isActive && !self._hasLocation.data) { |  | ||||||
|                 return "cursor-wait" |  | ||||||
|             } |  | ||||||
|             return "cursor-pointer" |  | ||||||
|         }, [this._hasLocation]) |  | ||||||
|         currentPointer.addCallbackAndRun(pointerClass => { |  | ||||||
|             self.SetClass(pointerClass); |  | ||||||
|         }) |  | ||||||
| 
 | 
 | ||||||
|  |       const newMarker = L.marker(location.latlng, { icon: icon }); | ||||||
|  |       newMarker.addTo(map); | ||||||
| 
 | 
 | ||||||
|         this.onClick(() => self.init(true)) |       if (self._marker !== undefined) { | ||||||
|         this.init(false) |         map.removeLayer(self._marker); | ||||||
|  |       } | ||||||
|  |       self._marker = newMarker; | ||||||
|  |     }); | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
|  |   private init(askPermission: boolean) { | ||||||
|  |     const self = this; | ||||||
|  | 
 | ||||||
|  |     if (self._isActive.data) { | ||||||
|  |       self.MoveToCurrentLoction(16); | ||||||
|  |       return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private init(askPermission: boolean) { |     try { | ||||||
| 
 |       navigator?.permissions | ||||||
|         const self = this; |         ?.query({ name: "geolocation" }) | ||||||
|         const map = this._leafletMap.data; |         ?.then(function (status) { | ||||||
| 
 |           console.log("Geolocation is already", status); | ||||||
|         this._currentGPSLocation.addCallback((location) => { |           if (status.state === "granted") { | ||||||
|             self._previousLocationGrant.setData("granted"); |  | ||||||
| 
 |  | ||||||
|             const timeSinceRequest = (new Date().getTime() - (self._lastUserRequest?.getTime() ?? 0)) / 1000; |  | ||||||
|             if (timeSinceRequest < 30) { |  | ||||||
|                 self.MoveToCurrentLoction(16) |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             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.crosshair.replace(/#000000/g, color)), |  | ||||||
|                     iconSize: [40, 40], // size of the icon
 |  | ||||||
|                     iconAnchor: [20, 20], // point of the icon which will correspond to marker's location
 |  | ||||||
|                 }) |  | ||||||
| 
 |  | ||||||
|             const newMarker = L.marker(location.latlng, {icon: icon}); |  | ||||||
|             newMarker.addTo(map); |  | ||||||
| 
 |  | ||||||
|             if (self._marker !== undefined) { |  | ||||||
|                 map.removeLayer(self._marker); |  | ||||||
|             } |  | ||||||
|             self._marker = newMarker; |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|         try { |  | ||||||
| 
 |  | ||||||
|             navigator?.permissions?.query({name: 'geolocation'}) |  | ||||||
|                 ?.then(function (status) { |  | ||||||
|                     console.log("Geolocation is already", status) |  | ||||||
|                     if (status.state === "granted") { |  | ||||||
|                         self.StartGeolocating(false); |  | ||||||
|                     } |  | ||||||
|                     self._permission.setData(status.state); |  | ||||||
|                     status.onchange = function () { |  | ||||||
|                         self._permission.setData(status.state); |  | ||||||
|                     } |  | ||||||
|                 }); |  | ||||||
| 
 |  | ||||||
|         } catch (e) { |  | ||||||
|             console.error(e) |  | ||||||
|         } |  | ||||||
|         if (askPermission) { |  | ||||||
|             self.StartGeolocating(true); |  | ||||||
|         } else if (this._previousLocationGrant.data === "granted") { |  | ||||||
|             this._previousLocationGrant.setData(""); |  | ||||||
|             self.StartGeolocating(false); |             self.StartGeolocating(false); | ||||||
|         } |           } | ||||||
| 
 |           self._permission.setData(status.state); | ||||||
|  |           status.onchange = function () { | ||||||
|  |             self._permission.setData(status.state); | ||||||
|  |           }; | ||||||
|  |         }); | ||||||
|  |     } catch (e) { | ||||||
|  |       console.error(e); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private locate() { |     if (askPermission) { | ||||||
|         const self = this; |       self.StartGeolocating(true); | ||||||
|         const map: any = this._leafletMap.data; |     } else if (this._previousLocationGrant.data === "granted") { | ||||||
|  |       this._previousLocationGrant.setData(""); | ||||||
|  |       self.StartGeolocating(false); | ||||||
|  |     } | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
|         if (navigator.geolocation) { |   private MoveToCurrentLoction(targetZoom?: number) { | ||||||
|             navigator.geolocation.getCurrentPosition(function (position) { |     const location = this._currentGPSLocation.data; | ||||||
|                 self._currentGPSLocation.setData({ |     this._lastUserRequest = undefined; | ||||||
|                     latlng: [position.coords.latitude, position.coords.longitude], | 
 | ||||||
|                     accuracy: position.coords.accuracy |     if ( | ||||||
|                 }); |       this._currentGPSLocation.data.latlng[0] === 0 && | ||||||
|             }, function () { |       this._currentGPSLocation.data.latlng[1] === 0 | ||||||
|                 console.warn("Could not get location with navigator.geolocation") |     ) { | ||||||
|             }); |       console.debug("Not moving to GPS-location: it is null island"); | ||||||
|             return; |       return; | ||||||
|         } else { |  | ||||||
|             map.findAccuratePosition({ |  | ||||||
|                 maxWait: 10000, // defaults to 10000
 |  | ||||||
|                 desiredAccuracy: 50 // defaults to 20
 |  | ||||||
|             }); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private MoveToCurrentLoction(targetZoom = 16) { |     // We check that the GPS location is not out of bounds
 | ||||||
|         const location = this._currentGPSLocation.data; |     const b = this._layoutToUse.data.lockLocation; | ||||||
|         this._lastUserRequest = undefined; |     let inRange = true; | ||||||
|  |     if (b) { | ||||||
|  |       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]; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (!inRange) { | ||||||
|  |       console.log( | ||||||
|  |         "Not zooming to GPS location: out of bounds", | ||||||
|  |         b, | ||||||
|  |         location.latlng | ||||||
|  |       ); | ||||||
|  |     } else { | ||||||
|  |       this._leafletMap.data.setView(location.latlng, targetZoom); | ||||||
|  |     } | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
|  |   private StartGeolocating(zoomToGPS = true) { | ||||||
|  |     const self = this; | ||||||
|  |     console.log("Starting geolocation"); | ||||||
| 
 | 
 | ||||||
|         if (this._currentGPSLocation.data.latlng[0] === 0 && this._currentGPSLocation.data.latlng[1] === 0) { |     this._lastUserRequest = zoomToGPS ? new Date() : new Date(0); | ||||||
|             console.debug("Not moving to GPS-location: it is null island") |     if (self._permission.data === "denied") { | ||||||
|             return; |       self._previousLocationGrant.setData(""); | ||||||
|         } |       return ""; | ||||||
| 
 |     } | ||||||
|         // We check that the GPS location is not out of bounds
 |     if (this._currentGPSLocation.data !== undefined) { | ||||||
|         const b = this._layoutToUse.data.lockLocation |       this.MoveToCurrentLoction(16); | ||||||
|         let inRange = true; |  | ||||||
|         if (b) { |  | ||||||
|             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]; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         if (!inRange) { |  | ||||||
|             console.log("Not zooming to GPS location: out of bounds", b, location.latlng) |  | ||||||
|         } else { |  | ||||||
|             this._leafletMap.data.setView( |  | ||||||
|                 location.latlng, targetZoom |  | ||||||
|             ); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private StartGeolocating(zoomToGPS = true) { |     console.log("Searching location using GPS"); | ||||||
|         const self = this; |  | ||||||
|         console.log("Starting geolocation") |  | ||||||
| 
 | 
 | ||||||
|         this._lastUserRequest = zoomToGPS ? new Date() : new Date(0); |     if (self._isActive.data) { | ||||||
|         if (self._permission.data === "denied") { |       return; | ||||||
|             self._previousLocationGrant.setData(""); |  | ||||||
|             return ""; |  | ||||||
|         } |  | ||||||
|         if (this._currentGPSLocation.data !== undefined) { |  | ||||||
|             this.MoveToCurrentLoction(16) |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         console.log("Searching location using GPS") |  | ||||||
|         this.locate(); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         if (!self._isActive.data) { |  | ||||||
|             self._isActive.setData(true); |  | ||||||
|             Utils.DoEvery(60000, () => { |  | ||||||
| 
 |  | ||||||
|                 if (document.visibilityState !== "visible") { |  | ||||||
|                     console.log("Not starting gps: document not visible") |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|                 this.locate(); |  | ||||||
|             }) |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |     self._isActive.setData(true); | ||||||
| 
 | 
 | ||||||
|  |     navigator.geolocation.watchPosition( | ||||||
|  |       function (position) { | ||||||
|  |         self._currentGPSLocation.setData({ | ||||||
|  |           latlng: [position.coords.latitude, position.coords.longitude], | ||||||
|  |           accuracy: position.coords.accuracy, | ||||||
|  |         }); | ||||||
|  |       }, | ||||||
|  |       function () { | ||||||
|  |         console.warn("Could not get location with navigator.geolocation"); | ||||||
|  |       } | ||||||
|  |     ); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  | @ -26,7 +26,8 @@ | ||||||
|     "en": "The layer showing picnic tables", |     "en": "The layer showing picnic tables", | ||||||
|     "nl": "Deze laag toont picnictafels", |     "nl": "Deze laag toont picnictafels", | ||||||
|     "it": "Il livello che mostra i tavoli da picnic", |     "it": "Il livello che mostra i tavoli da picnic", | ||||||
|     "fr": "La couche montrant les tables de pique-nique" |     "fr": "La couche montrant les tables de pique-nique", | ||||||
|  |     "ru": "Слой, отображающий столы для пикника" | ||||||
|   }, |   }, | ||||||
|   "tagRenderings": [ |   "tagRenderings": [ | ||||||
|     { |     { | ||||||
|  | @ -34,13 +35,15 @@ | ||||||
|         "en": "What material is this picnic table made of?", |         "en": "What material is this picnic table made of?", | ||||||
|         "nl": "Van welk materiaal is deze picnictafel gemaakt?", |         "nl": "Van welk materiaal is deze picnictafel gemaakt?", | ||||||
|         "it": "Di che materiale è fatto questo tavolo da picnic?", |         "it": "Di che materiale è fatto questo tavolo da picnic?", | ||||||
|         "de": "Aus welchem Material besteht dieser Picknicktisch?" |         "de": "Aus welchem Material besteht dieser Picknicktisch?", | ||||||
|  |         "ru": "Из чего изготовлен этот стол для пикника?" | ||||||
|       }, |       }, | ||||||
|       "render": { |       "render": { | ||||||
|         "en": "This picnic table is made of {material}", |         "en": "This picnic table is made of {material}", | ||||||
|         "nl": "Deze picnictafel is gemaakt van {material}", |         "nl": "Deze picnictafel is gemaakt van {material}", | ||||||
|         "it": "Questo tavolo da picnic è fatto di {material}", |         "it": "Questo tavolo da picnic è fatto di {material}", | ||||||
|         "de": "Dieser Picknicktisch besteht aus {material}" |         "de": "Dieser Picknicktisch besteht aus {material}", | ||||||
|  |         "ru": "Этот стол для пикника сделан из {material}" | ||||||
|       }, |       }, | ||||||
|       "freeform": { |       "freeform": { | ||||||
|         "key": "material" |         "key": "material" | ||||||
|  |  | ||||||
|  | @ -93,7 +93,8 @@ | ||||||
|             "nl": "De ondergrond bestaat uit <b>houtsnippers</b>", |             "nl": "De ondergrond bestaat uit <b>houtsnippers</b>", | ||||||
|             "en": "The surface consist of <b>woodchips</b>", |             "en": "The surface consist of <b>woodchips</b>", | ||||||
|             "it": "La superficie consiste di <b>trucioli di legno</b>", |             "it": "La superficie consiste di <b>trucioli di legno</b>", | ||||||
|             "de": "Die Oberfläche besteht aus <b>Holzschnitzeln</b>" |             "de": "Die Oberfläche besteht aus <b>Holzschnitzeln</b>", | ||||||
|  |             "ru": "Покрытие из <b>щепы</b>" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -154,7 +155,8 @@ | ||||||
|         "en": "Is this playground lit at night?", |         "en": "Is this playground lit at night?", | ||||||
|         "it": "È illuminato di notte questo parco giochi?", |         "it": "È illuminato di notte questo parco giochi?", | ||||||
|         "fr": "Ce terrain de jeux est-il éclairé la nuit ?", |         "fr": "Ce terrain de jeux est-il éclairé la nuit ?", | ||||||
|         "de": "Ist dieser Spielplatz nachts beleuchtet?" |         "de": "Ist dieser Spielplatz nachts beleuchtet?", | ||||||
|  |         "ru": "Эта игровая площадка освещается ночью?" | ||||||
|       }, |       }, | ||||||
|       "mappings": [ |       "mappings": [ | ||||||
|         { |         { | ||||||
|  | @ -163,7 +165,8 @@ | ||||||
|             "nl": "Deze speeltuin is 's nachts verlicht", |             "nl": "Deze speeltuin is 's nachts verlicht", | ||||||
|             "en": "This playground is lit at night", |             "en": "This playground is lit at night", | ||||||
|             "it": "Questo parco giochi è illuminato di notte", |             "it": "Questo parco giochi è illuminato di notte", | ||||||
|             "de": "Dieser Spielplatz ist nachts beleuchtet" |             "de": "Dieser Spielplatz ist nachts beleuchtet", | ||||||
|  |             "ru": "Эта детская площадка освещается ночью" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -172,7 +175,8 @@ | ||||||
|             "nl": "Deze speeltuin is 's nachts niet verlicht", |             "nl": "Deze speeltuin is 's nachts niet verlicht", | ||||||
|             "en": "This playground is not lit at night", |             "en": "This playground is not lit at night", | ||||||
|             "it": "Questo parco giochi non è illuminato di notte", |             "it": "Questo parco giochi non è illuminato di notte", | ||||||
|             "de": "Dieser Spielplatz ist nachts nicht beleuchtet" |             "de": "Dieser Spielplatz ist nachts nicht beleuchtet", | ||||||
|  |             "ru": "Эта детская площадка не освещается ночью" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       ] |       ] | ||||||
|  | @ -189,7 +193,8 @@ | ||||||
|         "nl": "Wat is de minimale leeftijd om op deze speeltuin te mogen?", |         "nl": "Wat is de minimale leeftijd om op deze speeltuin te mogen?", | ||||||
|         "en": "What is the minimum age required to access this playground?", |         "en": "What is the minimum age required to access this playground?", | ||||||
|         "it": "Qual è l’età minima per accedere a questo parco giochi?", |         "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 ?" |         "fr": "Quel est l'âge minimal requis pour accéder à ce terrain de jeux ?", | ||||||
|  |         "ru": "С какого возраста доступна эта детская площадка?" | ||||||
|       }, |       }, | ||||||
|       "freeform": { |       "freeform": { | ||||||
|         "key": "min_age", |         "key": "min_age", | ||||||
|  | @ -201,7 +206,8 @@ | ||||||
|         "nl": "Toegankelijk tot {max_age}", |         "nl": "Toegankelijk tot {max_age}", | ||||||
|         "en": "Accessible to kids of at most {max_age}", |         "en": "Accessible to kids of at most {max_age}", | ||||||
|         "it": "Accessibile ai bambini di età inferiore a {max_age}", |         "it": "Accessibile ai bambini di età inferiore a {max_age}", | ||||||
|         "fr": "Accessible aux enfants de {max_age} au maximum" |         "fr": "Accessible aux enfants de {max_age} au maximum", | ||||||
|  |         "ru": "Доступно детям до {max_age}" | ||||||
|       }, |       }, | ||||||
|       "question": { |       "question": { | ||||||
|         "nl": "Wat is de maximaal toegestane leeftijd voor deze speeltuin?", |         "nl": "Wat is de maximaal toegestane leeftijd voor deze speeltuin?", | ||||||
|  | @ -340,7 +346,8 @@ | ||||||
|         "en": "Is this playground accessible to wheelchair users?", |         "en": "Is this playground accessible to wheelchair users?", | ||||||
|         "fr": "Ce terrain de jeux est-il accessible aux personnes en fauteuil roulant ?", |         "fr": "Ce terrain de jeux est-il accessible aux personnes en fauteuil roulant ?", | ||||||
|         "de": "Ist dieser Spielplatz für Rollstuhlfahrer zugänglich?", |         "de": "Ist dieser Spielplatz für Rollstuhlfahrer zugänglich?", | ||||||
|         "it": "Il campetto è accessibile a persone in sedia a rotelle?" |         "it": "Il campetto è accessibile a persone in sedia a rotelle?", | ||||||
|  |         "ru": "Доступна ли детская площадка пользователям кресел-колясок?" | ||||||
|       }, |       }, | ||||||
|       "mappings": [ |       "mappings": [ | ||||||
|         { |         { | ||||||
|  | @ -350,7 +357,8 @@ | ||||||
|             "en": "Completely accessible for wheelchair users", |             "en": "Completely accessible for wheelchair users", | ||||||
|             "fr": "Entièrement accessible aux personnes en fauteuil roulant", |             "fr": "Entièrement accessible aux personnes en fauteuil roulant", | ||||||
|             "de": "Vollständig zugänglich für Rollstuhlfahrer", |             "de": "Vollständig zugänglich für Rollstuhlfahrer", | ||||||
|             "it": "Completamente accessibile in sedia a rotelle" |             "it": "Completamente accessibile in sedia a rotelle", | ||||||
|  |             "ru": "Полностью доступна пользователям кресел-колясок" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -360,7 +368,8 @@ | ||||||
|             "en": "Limited accessibility for wheelchair users", |             "en": "Limited accessibility for wheelchair users", | ||||||
|             "fr": "Accessibilité limitée pour les personnes en fauteuil roulant", |             "fr": "Accessibilité limitée pour les personnes en fauteuil roulant", | ||||||
|             "de": "Eingeschränkte Zugänglichkeit für Rollstuhlfahrer", |             "de": "Eingeschränkte Zugänglichkeit für Rollstuhlfahrer", | ||||||
|             "it": "Accesso limitato in sedia a rotelle" |             "it": "Accesso limitato in sedia a rotelle", | ||||||
|  |             "ru": "Частично доступна пользователям кресел-колясок" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -370,7 +379,8 @@ | ||||||
|             "en": "Not accessible for wheelchair users", |             "en": "Not accessible for wheelchair users", | ||||||
|             "fr": "Non accessible aux personnes en fauteuil roulant", |             "fr": "Non accessible aux personnes en fauteuil roulant", | ||||||
|             "de": "Nicht zugänglich für Rollstuhlfahrer", |             "de": "Nicht zugänglich für Rollstuhlfahrer", | ||||||
|             "it": "Non accessibile in sedia a rotelle" |             "it": "Non accessibile in sedia a rotelle", | ||||||
|  |             "ru": "Недоступна пользователям кресел-колясок" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       ] |       ] | ||||||
|  | @ -385,7 +395,8 @@ | ||||||
|         "nl": "Op welke uren is deze speeltuin toegankelijk?", |         "nl": "Op welke uren is deze speeltuin toegankelijk?", | ||||||
|         "en": "When is this playground accessible?", |         "en": "When is this playground accessible?", | ||||||
|         "fr": "Quand ce terrain de jeux est-il accessible ?", |         "fr": "Quand ce terrain de jeux est-il accessible ?", | ||||||
|         "it": "Quando si può accedere a questo campetto?" |         "it": "Quando si può accedere a questo campetto?", | ||||||
|  |         "ru": "Когда открыта эта игровая площадка?" | ||||||
|       }, |       }, | ||||||
|       "mappings": [ |       "mappings": [ | ||||||
|         { |         { | ||||||
|  | @ -394,7 +405,8 @@ | ||||||
|             "nl": "Van zonsopgang tot zonsondergang", |             "nl": "Van zonsopgang tot zonsondergang", | ||||||
|             "en": "Accessible from sunrise till sunset", |             "en": "Accessible from sunrise till sunset", | ||||||
|             "fr": "Accessible du lever au coucher du soleil", |             "fr": "Accessible du lever au coucher du soleil", | ||||||
|             "it": "Si può accedere dall'alba al tramonto" |             "it": "Si può accedere dall'alba al tramonto", | ||||||
|  |             "ru": "Открыто от рассвета до заката" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  | @ -13,7 +13,8 @@ | ||||||
|     "nl": "Een straatkastje met boeken voor iedereen", |     "nl": "Een straatkastje met boeken voor iedereen", | ||||||
|     "de": "Ein Bücherschrank am Straßenrand mit Büchern, für jedermann zugänglich", |     "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", |     "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" |     "it": "Una vetrinetta ai bordi della strada contenente libri, aperta al pubblico", | ||||||
|  |     "ru": "Уличный шкаф с книгами, доступными для всех" | ||||||
|   }, |   }, | ||||||
|   "source": { |   "source": { | ||||||
|     "osmTags": "amenity=public_bookcase" |     "osmTags": "amenity=public_bookcase" | ||||||
|  | @ -94,7 +95,7 @@ | ||||||
|         "nl": "Wat is de naam van dit boekenuilkastje?", |         "nl": "Wat is de naam van dit boekenuilkastje?", | ||||||
|         "de": "Wie heißt dieser öffentliche Bücherschrank?", |         "de": "Wie heißt dieser öffentliche Bücherschrank?", | ||||||
|         "fr": "Quel est le nom de cette microbibliothèque ?", |         "fr": "Quel est le nom de cette microbibliothèque ?", | ||||||
|         "ru": "Как называется общественный книжный шкаф?", |         "ru": "Как называется этот общественный книжный шкаф?", | ||||||
|         "it": "Come si chiama questa microbiblioteca pubblica?" |         "it": "Come si chiama questa microbiblioteca pubblica?" | ||||||
|       }, |       }, | ||||||
|       "freeform": { |       "freeform": { | ||||||
|  | @ -125,7 +126,8 @@ | ||||||
|         "nl": "Er passen {capacity} boeken", |         "nl": "Er passen {capacity} boeken", | ||||||
|         "de": "{capacity} Bücher passen in diesen Bücherschrank", |         "de": "{capacity} Bücher passen in diesen Bücherschrank", | ||||||
|         "fr": "{capacity} livres peuvent entrer dans cette microbibliothèque", |         "fr": "{capacity} livres peuvent entrer dans cette microbibliothèque", | ||||||
|         "it": "Questa microbiblioteca può contenere fino a {capacity} libri" |         "it": "Questa microbiblioteca può contenere fino a {capacity} libri", | ||||||
|  |         "ru": "{capacity} книг помещается в этот книжный шкаф" | ||||||
|       }, |       }, | ||||||
|       "question": { |       "question": { | ||||||
|         "en": "How many books fit into this public bookcase?", |         "en": "How many books fit into this public bookcase?", | ||||||
|  | @ -147,7 +149,8 @@ | ||||||
|         "nl": "Voor welke doelgroep zijn de meeste boeken in dit boekenruilkastje?", |         "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?", |         "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 ?", |         "fr": "Quel type de livres peut-on dans cette microbibliothèque ?", | ||||||
|         "it": "Che tipo di libri si possono trovare in questa microbiblioteca?" |         "it": "Che tipo di libri si possono trovare in questa microbiblioteca?", | ||||||
|  |         "ru": "Какие книги можно найти в этом общественном книжном шкафу?" | ||||||
|       }, |       }, | ||||||
|       "mappings": [ |       "mappings": [ | ||||||
|         { |         { | ||||||
|  | @ -179,7 +182,8 @@ | ||||||
|             "nl": "Boeken voor zowel kinderen als volwassenen", |             "nl": "Boeken voor zowel kinderen als volwassenen", | ||||||
|             "de": "Sowohl Bücher für Kinder als auch für Erwachsene", |             "de": "Sowohl Bücher für Kinder als auch für Erwachsene", | ||||||
|             "fr": "Livres pour enfants et adultes également", |             "fr": "Livres pour enfants et adultes également", | ||||||
|             "it": "Sia libri per l'infanzia, sia per l'età adulta" |             "it": "Sia libri per l'infanzia, sia per l'età adulta", | ||||||
|  |             "ru": "Книги и для детей, и для взрослых" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       ] |       ] | ||||||
|  | @ -232,7 +236,8 @@ | ||||||
|         "nl": "Is dit boekenruilkastje publiek toegankelijk?", |         "nl": "Is dit boekenruilkastje publiek toegankelijk?", | ||||||
|         "de": "Ist dieser öffentliche Bücherschrank frei zugänglich?", |         "de": "Ist dieser öffentliche Bücherschrank frei zugänglich?", | ||||||
|         "fr": "Cette microbibliothèque est-elle librement accèssible ?", |         "fr": "Cette microbibliothèque est-elle librement accèssible ?", | ||||||
|         "it": "Questa microbiblioteca è ad accesso libero?" |         "it": "Questa microbiblioteca è ad accesso libero?", | ||||||
|  |         "ru": "Имеется ли свободный доступ к этому общественному книжному шкафу?" | ||||||
|       }, |       }, | ||||||
|       "condition": "indoor=yes", |       "condition": "indoor=yes", | ||||||
|       "mappings": [ |       "mappings": [ | ||||||
|  | @ -242,7 +247,8 @@ | ||||||
|             "nl": "Publiek toegankelijk", |             "nl": "Publiek toegankelijk", | ||||||
|             "de": "Öffentlich zugänglich", |             "de": "Öffentlich zugänglich", | ||||||
|             "fr": "Accèssible au public", |             "fr": "Accèssible au public", | ||||||
|             "it": "È ad accesso libero" |             "it": "È ad accesso libero", | ||||||
|  |             "ru": "Свободный доступ" | ||||||
|           }, |           }, | ||||||
|           "if": "access=yes" |           "if": "access=yes" | ||||||
|         }, |         }, | ||||||
|  | @ -374,14 +380,16 @@ | ||||||
|         "nl": "Op welke dag werd dit boekenruilkastje geinstalleerd?", |         "nl": "Op welke dag werd dit boekenruilkastje geinstalleerd?", | ||||||
|         "de": "Wann wurde dieser öffentliche Bücherschrank installiert?", |         "de": "Wann wurde dieser öffentliche Bücherschrank installiert?", | ||||||
|         "fr": "Quand a été installée cette microbibliothèque ?", |         "fr": "Quand a été installée cette microbibliothèque ?", | ||||||
|         "it": "Quando è stata inaugurata questa microbiblioteca?" |         "it": "Quando è stata inaugurata questa microbiblioteca?", | ||||||
|  |         "ru": "Когда был установлен этот общественный книжный шкаф?" | ||||||
|       }, |       }, | ||||||
|       "render": { |       "render": { | ||||||
|         "en": "Installed on {start_date}", |         "en": "Installed on {start_date}", | ||||||
|         "nl": "Geplaatst op {start_date}", |         "nl": "Geplaatst op {start_date}", | ||||||
|         "de": "Installiert am {start_date}", |         "de": "Installiert am {start_date}", | ||||||
|         "fr": "Installée le {start_date}", |         "fr": "Installée le {start_date}", | ||||||
|         "it": "È stata inaugurata il {start_date}" |         "it": "È stata inaugurata il {start_date}", | ||||||
|  |         "ru": "Установлен {start_date}" | ||||||
|       }, |       }, | ||||||
|       "freeform": { |       "freeform": { | ||||||
|         "key": "start_date", |         "key": "start_date", | ||||||
|  | @ -402,7 +410,8 @@ | ||||||
|         "nl": "Is er een website over dit boekenruilkastje?", |         "nl": "Is er een website over dit boekenruilkastje?", | ||||||
|         "de": "Gibt es eine Website mit weiteren Informationen über diesen öffentlichen Bücherschrank?", |         "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 ?", |         "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?" |         "it": "C'è un sito web con maggiori informazioni su questa microbiblioteca?", | ||||||
|  |         "ru": "Есть ли веб-сайт с более подробной информацией об этом общественном книжном шкафе?" | ||||||
|       }, |       }, | ||||||
|       "freeform": { |       "freeform": { | ||||||
|         "key": "website", |         "key": "website", | ||||||
|  |  | ||||||
|  | @ -32,7 +32,8 @@ | ||||||
|     "nl": "Een sportterrein", |     "nl": "Een sportterrein", | ||||||
|     "fr": "Un terrain de sport", |     "fr": "Un terrain de sport", | ||||||
|     "en": "A sport pitch", |     "en": "A sport pitch", | ||||||
|     "it": "Un campo sportivo" |     "it": "Un campo sportivo", | ||||||
|  |     "ru": "Спортивная площадка" | ||||||
|   }, |   }, | ||||||
|   "tagRenderings": [ |   "tagRenderings": [ | ||||||
|     "images", |     "images", | ||||||
|  | @ -64,7 +65,8 @@ | ||||||
|             "nl": "Hier kan men basketbal spelen", |             "nl": "Hier kan men basketbal spelen", | ||||||
|             "fr": "Ici, on joue au basketball", |             "fr": "Ici, on joue au basketball", | ||||||
|             "en": "Basketball is played here", |             "en": "Basketball is played here", | ||||||
|             "it": "Qui si gioca a basket" |             "it": "Qui si gioca a basket", | ||||||
|  |             "ru": "Здесь можно играть в баскетбол" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -77,7 +79,8 @@ | ||||||
|             "nl": "Hier kan men voetbal spelen", |             "nl": "Hier kan men voetbal spelen", | ||||||
|             "fr": "Ici, on joue au football", |             "fr": "Ici, on joue au football", | ||||||
|             "en": "Soccer is played here", |             "en": "Soccer is played here", | ||||||
|             "it": "Qui si gioca a calcio" |             "it": "Qui si gioca a calcio", | ||||||
|  |             "ru": "Здесь можно играть в футбол" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -104,7 +107,8 @@ | ||||||
|             "nl": "Hier kan men tennis spelen", |             "nl": "Hier kan men tennis spelen", | ||||||
|             "fr": "Ici, on joue au tennis", |             "fr": "Ici, on joue au tennis", | ||||||
|             "en": "Tennis is played here", |             "en": "Tennis is played here", | ||||||
|             "it": "Qui si gioca a tennis" |             "it": "Qui si gioca a tennis", | ||||||
|  |             "ru": "Здесь можно играть в теннис" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -117,7 +121,8 @@ | ||||||
|             "nl": "Hier kan men korfbal spelen", |             "nl": "Hier kan men korfbal spelen", | ||||||
|             "fr": "Ici, on joue au korfball", |             "fr": "Ici, on joue au korfball", | ||||||
|             "en": "Korfball is played here", |             "en": "Korfball is played here", | ||||||
|             "it": "Qui si gioca a korfball" |             "it": "Qui si gioca a korfball", | ||||||
|  |             "ru": "Здесь можно играть в корфбол" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -130,7 +135,8 @@ | ||||||
|             "nl": "Hier kan men basketbal beoefenen", |             "nl": "Hier kan men basketbal beoefenen", | ||||||
|             "fr": "Ici, on joue au basketball", |             "fr": "Ici, on joue au basketball", | ||||||
|             "en": "Basketball is played here", |             "en": "Basketball is played here", | ||||||
|             "it": "Qui si gioca a basket" |             "it": "Qui si gioca a basket", | ||||||
|  |             "ru": "Здесь можно играть в баскетбол" | ||||||
|           }, |           }, | ||||||
|           "hideInAnswer": true |           "hideInAnswer": true | ||||||
|         } |         } | ||||||
|  | @ -141,7 +147,8 @@ | ||||||
|         "nl": "Wat is de ondergrond van dit sportveld?", |         "nl": "Wat is de ondergrond van dit sportveld?", | ||||||
|         "fr": "De quelle surface est fait ce terrain de sport ?", |         "fr": "De quelle surface est fait ce terrain de sport ?", | ||||||
|         "en": "Which is the surface of this sport pitch?", |         "en": "Which is the surface of this sport pitch?", | ||||||
|         "it": "Qual è la superficie di questo campo sportivo?" |         "it": "Qual è la superficie di questo campo sportivo?", | ||||||
|  |         "ru": "Какое покрытие на этой спортивной площадке?" | ||||||
|       }, |       }, | ||||||
|       "render": { |       "render": { | ||||||
|         "nl": "De ondergrond is <b>{surface}</b>", |         "nl": "De ondergrond is <b>{surface}</b>", | ||||||
|  | @ -211,7 +218,8 @@ | ||||||
|         "nl": "Is dit sportterrein publiek toegankelijk?", |         "nl": "Is dit sportterrein publiek toegankelijk?", | ||||||
|         "fr": "Est-ce que ce terrain de sport est accessible au public ?", |         "fr": "Est-ce que ce terrain de sport est accessible au public ?", | ||||||
|         "en": "Is this sport pitch publicly accessible?", |         "en": "Is this sport pitch publicly accessible?", | ||||||
|         "it": "Questo campo sportivo è aperto al pubblico?" |         "it": "Questo campo sportivo è aperto al pubblico?", | ||||||
|  |         "ru": "Есть ли свободный доступ к этой спортивной площадке?" | ||||||
|       }, |       }, | ||||||
|       "mappings": [ |       "mappings": [ | ||||||
|         { |         { | ||||||
|  | @ -220,7 +228,8 @@ | ||||||
|             "nl": "Publiek toegankelijk", |             "nl": "Publiek toegankelijk", | ||||||
|             "fr": "Accessible au public", |             "fr": "Accessible au public", | ||||||
|             "en": "Public access", |             "en": "Public access", | ||||||
|             "it": "Aperto al pubblico" |             "it": "Aperto al pubblico", | ||||||
|  |             "ru": "Свободный доступ" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -229,7 +238,8 @@ | ||||||
|             "nl": "Beperkt toegankelijk (enkel na reservatie, tijdens bepaalde uren, ...)", |             "nl": "Beperkt toegankelijk (enkel na reservatie, tijdens bepaalde uren, ...)", | ||||||
|             "fr": "Accès limité (par exemple uniquement sur réservation, à certains horaires…)", |             "fr": "Accès limité (par exemple uniquement sur réservation, à certains horaires…)", | ||||||
|             "en": "Limited access (e.g. only with an appointment, during certain hours, ...)", |             "en": "Limited access (e.g. only with an appointment, during certain hours, ...)", | ||||||
|             "it": "Accesso limitato (p.es. solo con prenotazione, in certi orari, ...)" |             "it": "Accesso limitato (p.es. solo con prenotazione, in certi orari, ...)", | ||||||
|  |             "ru": "Ограниченный доступ (напр., только по записи, в определённые часы, ...)" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -238,7 +248,8 @@ | ||||||
|             "nl": "Enkel toegankelijk voor leden van de bijhorende sportclub", |             "nl": "Enkel toegankelijk voor leden van de bijhorende sportclub", | ||||||
|             "fr": "Accessible uniquement aux membres du club", |             "fr": "Accessible uniquement aux membres du club", | ||||||
|             "en": "Only accessible for members of the club", |             "en": "Only accessible for members of the club", | ||||||
|             "it": "Accesso limitato ai membri dell'associazione" |             "it": "Accesso limitato ai membri dell'associazione", | ||||||
|  |             "ru": "Доступ только членам клуба" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -257,7 +268,8 @@ | ||||||
|         "nl": "Moet men reserveren om gebruik te maken van dit sportveld?", |         "nl": "Moet men reserveren om gebruik te maken van dit sportveld?", | ||||||
|         "fr": "Doit-on réserver pour utiliser ce terrain de sport ?", |         "fr": "Doit-on réserver pour utiliser ce terrain de sport ?", | ||||||
|         "en": "Does one have to make an appointment to use this sport pitch?", |         "en": "Does one have to make an appointment to use this sport pitch?", | ||||||
|         "it": "È necessario prenotarsi per usare questo campo sportivo?" |         "it": "È necessario prenotarsi per usare questo campo sportivo?", | ||||||
|  |         "ru": "Нужна ли предварительная запись для доступа на эту спортивную площадку?" | ||||||
|       }, |       }, | ||||||
|       "condition": { |       "condition": { | ||||||
|         "and": [ |         "and": [ | ||||||
|  | @ -282,7 +294,8 @@ | ||||||
|             "nl": "Reserveren is sterk aangeraden om gebruik te maken van dit sportterrein", |             "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", |             "fr": "Il est recommendé de réserver pour utiliser ce terrain de sport", | ||||||
|             "en": "Making an appointment is recommended when using this sport pitch", |             "en": "Making an appointment is recommended when using this sport pitch", | ||||||
|             "it": "La prenotazione è consigliata per usare questo campo sportivo" |             "it": "La prenotazione è consigliata per usare questo campo sportivo", | ||||||
|  |             "ru": "Желательна предварительная запись для доступа на эту спортивную площадку" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -291,7 +304,8 @@ | ||||||
|             "nl": "Reserveren is mogelijk, maar geen voorwaarde", |             "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", |             "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", |             "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" |             "it": "La prenotazione è consentita, ma non è obbligatoria per usare questo campo sportivo", | ||||||
|  |             "ru": "Предварительная запись для доступа на эту спортивную площадку возможна, но не обязательна" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -300,7 +314,8 @@ | ||||||
|             "nl": "Reserveren is niet mogelijk", |             "nl": "Reserveren is niet mogelijk", | ||||||
|             "fr": "On ne peut pas réserver", |             "fr": "On ne peut pas réserver", | ||||||
|             "en": "Making an appointment is not possible", |             "en": "Making an appointment is not possible", | ||||||
|             "it": "Non è possibile prenotare" |             "it": "Non è possibile prenotare", | ||||||
|  |             "ru": "Невозможна предварительная запись" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       ] |       ] | ||||||
|  | @ -336,7 +351,8 @@ | ||||||
|         "nl": "Wanneer is dit sportveld toegankelijk?", |         "nl": "Wanneer is dit sportveld toegankelijk?", | ||||||
|         "fr": "Quand ce terrain est-il accessible ?", |         "fr": "Quand ce terrain est-il accessible ?", | ||||||
|         "en": "When is this pitch accessible?", |         "en": "When is this pitch accessible?", | ||||||
|         "it": "Quando è aperto questo campo sportivo?" |         "it": "Quando è aperto questo campo sportivo?", | ||||||
|  |         "ru": "В какое время доступна эта площадка?" | ||||||
|       }, |       }, | ||||||
|       "render": "Openingsuren: {opening_hours_table()}", |       "render": "Openingsuren: {opening_hours_table()}", | ||||||
|       "freeform": { |       "freeform": { | ||||||
|  | @ -446,7 +462,8 @@ | ||||||
|         "nl": "Ping-pong tafel", |         "nl": "Ping-pong tafel", | ||||||
|         "fr": "Table de ping-pong", |         "fr": "Table de ping-pong", | ||||||
|         "en": "Tabletennis table", |         "en": "Tabletennis table", | ||||||
|         "it": "Tavolo da tennistavolo" |         "it": "Tavolo da tennistavolo", | ||||||
|  |         "ru": "Стол для настольного тенниса" | ||||||
|       }, |       }, | ||||||
|       "tags": [ |       "tags": [ | ||||||
|         "leisure=pitch", |         "leisure=pitch", | ||||||
|  |  | ||||||
|  | @ -39,7 +39,8 @@ | ||||||
|         "en": "What kind of camera is this?", |         "en": "What kind of camera is this?", | ||||||
|         "nl": "Wat voor soort camera is dit?", |         "nl": "Wat voor soort camera is dit?", | ||||||
|         "fr": "Quel genre de caméra est-ce ?", |         "fr": "Quel genre de caméra est-ce ?", | ||||||
|         "it": "Di che tipo di videocamera si tratta?" |         "it": "Di che tipo di videocamera si tratta?", | ||||||
|  |         "ru": "Какая это камера?" | ||||||
|       }, |       }, | ||||||
|       "mappings": [ |       "mappings": [ | ||||||
|         { |         { | ||||||
|  | @ -65,7 +66,8 @@ | ||||||
|             "en": "A dome camera (which can turn)", |             "en": "A dome camera (which can turn)", | ||||||
|             "nl": "Een dome (bolvormige camera die kan draaien)", |             "nl": "Een dome (bolvormige camera die kan draaien)", | ||||||
|             "fr": "Une caméra dôme (qui peut tourner)", |             "fr": "Une caméra dôme (qui peut tourner)", | ||||||
|             "it": "Una videocamera a cupola (che può ruotare)" |             "it": "Una videocamera a cupola (che può ruotare)", | ||||||
|  |             "ru": "Камера с поворотным механизмом" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -230,7 +232,8 @@ | ||||||
|             "en": "This camera is located outdoors", |             "en": "This camera is located outdoors", | ||||||
|             "nl": "Deze camera bevindt zich buiten", |             "nl": "Deze camera bevindt zich buiten", | ||||||
|             "fr": "Cette caméra est située à l'extérieur", |             "fr": "Cette caméra est située à l'extérieur", | ||||||
|             "it": "Questa videocamera si trova all'aperto" |             "it": "Questa videocamera si trova all'aperto", | ||||||
|  |             "ru": "Эта камера расположена снаружи" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -239,7 +242,8 @@ | ||||||
|             "en": "This camera is probably located outdoors", |             "en": "This camera is probably located outdoors", | ||||||
|             "nl": "Deze camera bevindt zich waarschijnlijk buiten", |             "nl": "Deze camera bevindt zich waarschijnlijk buiten", | ||||||
|             "fr": "Cette caméra est probablement située à l'extérieur", |             "fr": "Cette caméra est probablement située à l'extérieur", | ||||||
|             "it": "Questa videocamera si trova probabilmente all'esterno" |             "it": "Questa videocamera si trova probabilmente all'esterno", | ||||||
|  |             "ru": "Возможно, эта камера расположена снаружи" | ||||||
|           }, |           }, | ||||||
|           "hideInAnswer": true |           "hideInAnswer": true | ||||||
|         } |         } | ||||||
|  | @ -374,7 +378,8 @@ | ||||||
|         "en": "How is this camera placed?", |         "en": "How is this camera placed?", | ||||||
|         "nl": "Hoe is deze camera geplaatst?", |         "nl": "Hoe is deze camera geplaatst?", | ||||||
|         "fr": "Comment cette caméra est-elle placée ?", |         "fr": "Comment cette caméra est-elle placée ?", | ||||||
|         "it": "Com'è posizionata questa telecamera?" |         "it": "Com'è posizionata questa telecamera?", | ||||||
|  |         "ru": "Как расположена эта камера?" | ||||||
|       }, |       }, | ||||||
|       "render": { |       "render": { | ||||||
|         "en": "Mounting method: {mount}", |         "en": "Mounting method: {mount}", | ||||||
|  |  | ||||||
|  | @ -57,7 +57,8 @@ | ||||||
|         "de": "Eine öffentlich zugängliche Toilette", |         "de": "Eine öffentlich zugängliche Toilette", | ||||||
|         "fr": "Des toilettes", |         "fr": "Des toilettes", | ||||||
|         "nl": "Een publieke toilet", |         "nl": "Een publieke toilet", | ||||||
|         "it": "Servizi igienici aperti al pubblico" |         "it": "Servizi igienici aperti al pubblico", | ||||||
|  |         "ru": "Туалет или комната отдыха со свободным доступом" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|  | @ -66,7 +67,8 @@ | ||||||
|         "de": "Toiletten mit rollstuhlgerechter Toilette", |         "de": "Toiletten mit rollstuhlgerechter Toilette", | ||||||
|         "fr": "Toilettes accessible aux personnes à mobilité réduite", |         "fr": "Toilettes accessible aux personnes à mobilité réduite", | ||||||
|         "nl": "Een rolstoeltoegankelijke toilet", |         "nl": "Een rolstoeltoegankelijke toilet", | ||||||
|         "it": "Servizi igienici accessibili per persone in sedia a rotelle" |         "it": "Servizi igienici accessibili per persone in sedia a rotelle", | ||||||
|  |         "ru": "Туалет с доступом для пользователей кресел-колясок" | ||||||
|       }, |       }, | ||||||
|       "tags": [ |       "tags": [ | ||||||
|         "amenity=toilets", |         "amenity=toilets", | ||||||
|  | @ -89,7 +91,8 @@ | ||||||
|         "de": "Sind diese Toiletten öffentlich zugänglich?", |         "de": "Sind diese Toiletten öffentlich zugänglich?", | ||||||
|         "fr": "Ces toilettes sont-elles accessibles au public ?", |         "fr": "Ces toilettes sont-elles accessibles au public ?", | ||||||
|         "nl": "Zijn deze toiletten publiek toegankelijk?", |         "nl": "Zijn deze toiletten publiek toegankelijk?", | ||||||
|         "it": "Questi servizi igienici sono aperti al pubblico?" |         "it": "Questi servizi igienici sono aperti al pubblico?", | ||||||
|  |         "ru": "Есть ли свободный доступ к этим туалетам?" | ||||||
|       }, |       }, | ||||||
|       "render": { |       "render": { | ||||||
|         "en": "Access is {access}", |         "en": "Access is {access}", | ||||||
|  | @ -112,7 +115,8 @@ | ||||||
|             "de": "Öffentlicher Zugang", |             "de": "Öffentlicher Zugang", | ||||||
|             "fr": "Accès publique", |             "fr": "Accès publique", | ||||||
|             "nl": "Publiek toegankelijk", |             "nl": "Publiek toegankelijk", | ||||||
|             "it": "Accesso pubblico" |             "it": "Accesso pubblico", | ||||||
|  |             "ru": "Свободный доступ" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -186,14 +190,16 @@ | ||||||
|         "de": "Wie viel muss man für diese Toiletten bezahlen?", |         "de": "Wie viel muss man für diese Toiletten bezahlen?", | ||||||
|         "fr": "Quel est le prix d'accès de ces toilettes ?", |         "fr": "Quel est le prix d'accès de ces toilettes ?", | ||||||
|         "nl": "Hoeveel moet men betalen om deze toiletten te gebruiken?", |         "nl": "Hoeveel moet men betalen om deze toiletten te gebruiken?", | ||||||
|         "it": "Quanto costa l'accesso a questi servizi igienici?" |         "it": "Quanto costa l'accesso a questi servizi igienici?", | ||||||
|  |         "ru": "Сколько стоит посещение туалета?" | ||||||
|       }, |       }, | ||||||
|       "render": { |       "render": { | ||||||
|         "en": "The fee is {charge}", |         "en": "The fee is {charge}", | ||||||
|         "de": "Die Gebühr beträgt {charge}", |         "de": "Die Gebühr beträgt {charge}", | ||||||
|         "fr": "Le prix est {charge}", |         "fr": "Le prix est {charge}", | ||||||
|         "nl": "De toiletten gebruiken kost {charge}", |         "nl": "De toiletten gebruiken kost {charge}", | ||||||
|         "it": "La tariffa è {charge}" |         "it": "La tariffa è {charge}", | ||||||
|  |         "ru": "Стоимость {charge}" | ||||||
|       }, |       }, | ||||||
|       "condition": "fee=yes", |       "condition": "fee=yes", | ||||||
|       "freeform": { |       "freeform": { | ||||||
|  | @ -227,7 +233,8 @@ | ||||||
|             "de": "Kein Zugang für Rollstuhlfahrer", |             "de": "Kein Zugang für Rollstuhlfahrer", | ||||||
|             "fr": "Non accessible aux personnes à mobilité réduite", |             "fr": "Non accessible aux personnes à mobilité réduite", | ||||||
|             "nl": "Niet toegankelijk voor rolstoelgebruikers", |             "nl": "Niet toegankelijk voor rolstoelgebruikers", | ||||||
|             "it": "Non accessibile in sedia a rotelle" |             "it": "Non accessibile in sedia a rotelle", | ||||||
|  |             "ru": "Недоступно пользователям кресел-колясок" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       ] |       ] | ||||||
|  | @ -238,7 +245,8 @@ | ||||||
|         "de": "Welche Art von Toiletten sind das?", |         "de": "Welche Art von Toiletten sind das?", | ||||||
|         "fr": "De quel type sont ces toilettes ?", |         "fr": "De quel type sont ces toilettes ?", | ||||||
|         "nl": "Welke toiletten zijn dit?", |         "nl": "Welke toiletten zijn dit?", | ||||||
|         "it": "Di che tipo di servizi igienici si tratta?" |         "it": "Di che tipo di servizi igienici si tratta?", | ||||||
|  |         "ru": "Какие это туалеты?" | ||||||
|       }, |       }, | ||||||
|       "mappings": [ |       "mappings": [ | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  | @ -230,7 +230,8 @@ | ||||||
|       "question": { |       "question": { | ||||||
|         "nl": "Is deze boom groenblijvend of bladverliezend?", |         "nl": "Is deze boom groenblijvend of bladverliezend?", | ||||||
|         "en": "Is this tree evergreen or deciduous?", |         "en": "Is this tree evergreen or deciduous?", | ||||||
|         "it": "È un sempreverde o caduco?" |         "it": "È un sempreverde o caduco?", | ||||||
|  |         "ru": "Это дерево вечнозелёное или листопадное?" | ||||||
|       }, |       }, | ||||||
|       "mappings": [ |       "mappings": [ | ||||||
|         { |         { | ||||||
|  | @ -242,7 +243,8 @@ | ||||||
|           "then": { |           "then": { | ||||||
|             "nl": "Bladverliezend: de boom is een periode van het jaar kaal.", |             "nl": "Bladverliezend: de boom is een periode van het jaar kaal.", | ||||||
|             "en": "Deciduous: the tree loses its leaves for some time of the year.", |             "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." |             "it": "Caduco: l’albero perde le sue foglie per un periodo dell’anno.", | ||||||
|  |             "ru": "Листопадное: у дерева опадают листья в определённое время года." | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -255,7 +257,8 @@ | ||||||
|             "nl": "Groenblijvend.", |             "nl": "Groenblijvend.", | ||||||
|             "en": "Evergreen.", |             "en": "Evergreen.", | ||||||
|             "it": "Sempreverde.", |             "it": "Sempreverde.", | ||||||
|             "fr": "À feuilles persistantes." |             "fr": "À feuilles persistantes.", | ||||||
|  |             "ru": "Вечнозелёное." | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       ], |       ], | ||||||
|  | @ -278,7 +281,8 @@ | ||||||
|         "nl": "Heeft de boom een naam?", |         "nl": "Heeft de boom een naam?", | ||||||
|         "en": "Does the tree have a name?", |         "en": "Does the tree have a name?", | ||||||
|         "it": "L’albero ha un nome?", |         "it": "L’albero ha un nome?", | ||||||
|         "fr": "L'arbre a-t-il un nom ?" |         "fr": "L'arbre a-t-il un nom ?", | ||||||
|  |         "ru": "Есть ли у этого дерева название?" | ||||||
|       }, |       }, | ||||||
|       "freeform": { |       "freeform": { | ||||||
|         "key": "name", |         "key": "name", | ||||||
|  | @ -298,7 +302,8 @@ | ||||||
|             "nl": "De boom heeft geen naam.", |             "nl": "De boom heeft geen naam.", | ||||||
|             "en": "The tree does not have a name.", |             "en": "The tree does not have a name.", | ||||||
|             "it": "L’albero non ha un nome.", |             "it": "L’albero non ha un nome.", | ||||||
|             "fr": "L'arbre n'a pas de nom." |             "fr": "L'arbre n'a pas de nom.", | ||||||
|  |             "ru": "У этого дерева нет названия." | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       ], |       ], | ||||||
|  | @ -399,7 +404,8 @@ | ||||||
|       "render": { |       "render": { | ||||||
|         "nl": "<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed-ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>", |         "nl": "<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed-ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>", | ||||||
|         "en": "<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>", |         "en": "<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>", | ||||||
|         "it": "<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>" |         "it": "<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>", | ||||||
|  |         "ru": "<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>" | ||||||
|       }, |       }, | ||||||
|       "question": { |       "question": { | ||||||
|         "nl": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?", |         "nl": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?", | ||||||
|  | @ -421,7 +427,8 @@ | ||||||
|       "render": { |       "render": { | ||||||
|         "nl": "<img src=\"./assets/svg/wikidata.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>", |         "nl": "<img src=\"./assets/svg/wikidata.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>", | ||||||
|         "en": "<img src=\"./assets/svg/wikidata.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>", |         "en": "<img src=\"./assets/svg/wikidata.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>", | ||||||
|         "it": "<img src=\"./assets/svg/wikidata.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>" |         "it": "<img src=\"./assets/svg/wikidata.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>", | ||||||
|  |         "ru": "<img src=\"./assets/svg/wikidata.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>" | ||||||
|       }, |       }, | ||||||
|       "question": { |       "question": { | ||||||
|         "nl": "Wat is het Wikidata-ID van deze boom?", |         "nl": "Wat is het Wikidata-ID van deze boom?", | ||||||
|  | @ -484,7 +491,8 @@ | ||||||
|         "nl": "Loofboom", |         "nl": "Loofboom", | ||||||
|         "en": "Broadleaved tree", |         "en": "Broadleaved tree", | ||||||
|         "it": "Albero latifoglia", |         "it": "Albero latifoglia", | ||||||
|         "fr": "Arbre feuillu" |         "fr": "Arbre feuillu", | ||||||
|  |         "ru": "Лиственное дерево" | ||||||
|       }, |       }, | ||||||
|       "description": { |       "description": { | ||||||
|         "nl": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.", |         "nl": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.", | ||||||
|  | @ -501,12 +509,14 @@ | ||||||
|       "title": { |       "title": { | ||||||
|         "nl": "Naaldboom", |         "nl": "Naaldboom", | ||||||
|         "en": "Needleleaved tree", |         "en": "Needleleaved tree", | ||||||
|         "it": "Albero aghifoglia" |         "it": "Albero aghifoglia", | ||||||
|  |         "ru": "Хвойное дерево" | ||||||
|       }, |       }, | ||||||
|       "description": { |       "description": { | ||||||
|         "nl": "Een boom van een soort met naalden, bijvoorbeeld den of spar.", |         "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.", |         "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." |         "it": "Un albero di una specie con aghi come il pino o l’abete.", | ||||||
|  |         "ru": "Дерево с хвоей (иглами), например, сосна или ель." | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|  | @ -524,7 +534,8 @@ | ||||||
|         "nl": "Wanneer je niet zeker bent of het nu een loof- of naaldboom is.", |         "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.", |         "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.", |         "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." |         "fr": "Si vous n'êtes pas sûr(e) de savoir s'il s'agit d'un arbre à feuilles larges ou à aiguilles.", | ||||||
|  |         "ru": "Если вы не уверены в том, лиственное это дерево или хвойное." | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   ] |   ] | ||||||
|  |  | ||||||
|  | @ -6,7 +6,8 @@ | ||||||
|     "ru": "Зарядные станции", |     "ru": "Зарядные станции", | ||||||
|     "ja": "充電ステーション", |     "ja": "充電ステーション", | ||||||
|     "zh_Hant": "充電站", |     "zh_Hant": "充電站", | ||||||
|     "it": "Stazioni di ricarica" |     "it": "Stazioni di ricarica", | ||||||
|  |     "nl": "Oplaadpunten" | ||||||
|   }, |   }, | ||||||
|   "shortDescription": { |   "shortDescription": { | ||||||
|     "en": "A worldwide map of charging stations", |     "en": "A worldwide map of charging stations", | ||||||
|  | @ -29,6 +30,7 @@ | ||||||
|     "ja", |     "ja", | ||||||
|     "zh_Hant", |     "zh_Hant", | ||||||
|     "it", |     "it", | ||||||
|  |     "nl", | ||||||
|     "nb_NO" |     "nb_NO" | ||||||
|   ], |   ], | ||||||
|   "maintainer": "", |   "maintainer": "", | ||||||
|  | @ -48,7 +50,8 @@ | ||||||
|         "ja": "充電ステーション", |         "ja": "充電ステーション", | ||||||
|         "zh_Hant": "充電站", |         "zh_Hant": "充電站", | ||||||
|         "nb_NO": "Ladestasjoner", |         "nb_NO": "Ladestasjoner", | ||||||
|         "it": "Stazioni di ricarica" |         "it": "Stazioni di ricarica", | ||||||
|  |         "nl": "Oplaadpunten" | ||||||
|       }, |       }, | ||||||
|       "minzoom": 10, |       "minzoom": 10, | ||||||
|       "source": { |       "source": { | ||||||
|  | @ -65,7 +68,8 @@ | ||||||
|           "ja": "充電ステーション", |           "ja": "充電ステーション", | ||||||
|           "zh_Hant": "充電站", |           "zh_Hant": "充電站", | ||||||
|           "nb_NO": "Ladestasjon", |           "nb_NO": "Ladestasjon", | ||||||
|           "it": "Stazione di ricarica" |           "it": "Stazione di ricarica", | ||||||
|  |           "nl": "Oplaadpunt" | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
|       "description": { |       "description": { | ||||||
|  | @ -74,7 +78,8 @@ | ||||||
|         "ja": "充電ステーション", |         "ja": "充電ステーション", | ||||||
|         "zh_Hant": "充電站", |         "zh_Hant": "充電站", | ||||||
|         "nb_NO": "En ladestasjon", |         "nb_NO": "En ladestasjon", | ||||||
|         "it": "Una stazione di ricarica" |         "it": "Una stazione di ricarica", | ||||||
|  |         "nl": "Een oplaadpunt" | ||||||
|       }, |       }, | ||||||
|       "tagRenderings": [ |       "tagRenderings": [ | ||||||
|         "images", |         "images", | ||||||
|  |  | ||||||
|  | @ -23,6 +23,7 @@ | ||||||
|     "ja", |     "ja", | ||||||
|     "zh_Hant", |     "zh_Hant", | ||||||
|     "ru", |     "ru", | ||||||
|  |     "nl", | ||||||
|     "ca", |     "ca", | ||||||
|     "id" |     "id" | ||||||
|   ], |   ], | ||||||
|  | @ -41,7 +42,8 @@ | ||||||
|         "en": "Shop", |         "en": "Shop", | ||||||
|         "fr": "Magasin", |         "fr": "Magasin", | ||||||
|         "ru": "Магазин", |         "ru": "Магазин", | ||||||
|         "ja": "店" |         "ja": "店", | ||||||
|  |         "nl": "Winkel" | ||||||
|       }, |       }, | ||||||
|       "minzoom": 16, |       "minzoom": 16, | ||||||
|       "source": { |       "source": { | ||||||
|  | @ -56,7 +58,8 @@ | ||||||
|           "en": "Shop", |           "en": "Shop", | ||||||
|           "fr": "Magasin", |           "fr": "Magasin", | ||||||
|           "ru": "Магазин", |           "ru": "Магазин", | ||||||
|           "ja": "店" |           "ja": "店", | ||||||
|  |           "nl": "Winkel" | ||||||
|         }, |         }, | ||||||
|         "mappings": [ |         "mappings": [ | ||||||
|           { |           { | ||||||
|  | @ -90,7 +93,8 @@ | ||||||
|       "description": { |       "description": { | ||||||
|         "en": "A shop", |         "en": "A shop", | ||||||
|         "fr": "Un magasin", |         "fr": "Un magasin", | ||||||
|         "ja": "ショップ" |         "ja": "ショップ", | ||||||
|  |         "nl": "Een winkel" | ||||||
|       }, |       }, | ||||||
|       "tagRenderings": [ |       "tagRenderings": [ | ||||||
|         "images", |         "images", | ||||||
|  | @ -99,7 +103,8 @@ | ||||||
|             "en": "What is the name of this shop?", |             "en": "What is the name of this shop?", | ||||||
|             "fr": "Qu'est-ce que le nom de ce magasin?", |             "fr": "Qu'est-ce que le nom de ce magasin?", | ||||||
|             "ru": "Как называется магазин?", |             "ru": "Как называется магазин?", | ||||||
|             "ja": "このお店の名前は何ですか?" |             "ja": "このお店の名前は何ですか?", | ||||||
|  |             "nl": "Wat is de naam van deze winkel?" | ||||||
|           }, |           }, | ||||||
|           "render": "This shop is called <i>{name}</i>", |           "render": "This shop is called <i>{name}</i>", | ||||||
|           "freeform": { |           "freeform": { | ||||||
|  | @ -143,7 +148,8 @@ | ||||||
|                 "en": "Supermarket", |                 "en": "Supermarket", | ||||||
|                 "fr": "Supermarché", |                 "fr": "Supermarché", | ||||||
|                 "ru": "Супермаркет", |                 "ru": "Супермаркет", | ||||||
|                 "ja": "スーパーマーケット" |                 "ja": "スーパーマーケット", | ||||||
|  |                 "nl": "Supermarkt" | ||||||
|               } |               } | ||||||
|             }, |             }, | ||||||
|             { |             { | ||||||
|  | @ -169,7 +175,8 @@ | ||||||
|                 "en": "Hairdresser", |                 "en": "Hairdresser", | ||||||
|                 "fr": "Coiffeur", |                 "fr": "Coiffeur", | ||||||
|                 "ru": "Парикмахерская", |                 "ru": "Парикмахерская", | ||||||
|                 "ja": "理容師" |                 "ja": "理容師", | ||||||
|  |                 "nl": "Kapper" | ||||||
|               } |               } | ||||||
|             }, |             }, | ||||||
|             { |             { | ||||||
|  | @ -181,7 +188,8 @@ | ||||||
|               "then": { |               "then": { | ||||||
|                 "en": "Bakery", |                 "en": "Bakery", | ||||||
|                 "fr": "Boulangerie", |                 "fr": "Boulangerie", | ||||||
|                 "ja": "ベーカリー" |                 "ja": "ベーカリー", | ||||||
|  |                 "nl": "Bakkerij" | ||||||
|               } |               } | ||||||
|             }, |             }, | ||||||
|             { |             { | ||||||
|  | @ -223,7 +231,8 @@ | ||||||
|           "question": { |           "question": { | ||||||
|             "en": "What is the phone number?", |             "en": "What is the phone number?", | ||||||
|             "fr": "Quel est le numéro de téléphone ?", |             "fr": "Quel est le numéro de téléphone ?", | ||||||
|             "ja": "電話番号は何番ですか?" |             "ja": "電話番号は何番ですか?", | ||||||
|  |             "nl": "Wat is het telefoonnummer?" | ||||||
|           }, |           }, | ||||||
|           "freeform": { |           "freeform": { | ||||||
|             "key": "phone", |             "key": "phone", | ||||||
|  | @ -242,7 +251,8 @@ | ||||||
|           "question": { |           "question": { | ||||||
|             "en": "What is the website of this shop?", |             "en": "What is the website of this shop?", | ||||||
|             "fr": "Quel est le site internet de ce magasin ?", |             "fr": "Quel est le site internet de ce magasin ?", | ||||||
|             "ja": "このお店のホームページは何ですか?" |             "ja": "このお店のホームページは何ですか?", | ||||||
|  |             "nl": "Wat is de website van deze winkel?" | ||||||
|           }, |           }, | ||||||
|           "freeform": { |           "freeform": { | ||||||
|             "key": "website", |             "key": "website", | ||||||
|  | @ -277,7 +287,8 @@ | ||||||
|           "question": { |           "question": { | ||||||
|             "en": "What are the opening hours of this shop?", |             "en": "What are the opening hours of this shop?", | ||||||
|             "fr": "Quels sont les horaires d'ouverture de ce magasin ?", |             "fr": "Quels sont les horaires d'ouverture de ce magasin ?", | ||||||
|             "ja": "この店の営業時間は何時から何時までですか?" |             "ja": "この店の営業時間は何時から何時までですか?", | ||||||
|  |             "nl": "Wat zijn de openingsuren van deze winkel?" | ||||||
|           }, |           }, | ||||||
|           "freeform": { |           "freeform": { | ||||||
|             "key": "opening_hours", |             "key": "opening_hours", | ||||||
|  | @ -316,13 +327,15 @@ | ||||||
|             "en": "Shop", |             "en": "Shop", | ||||||
|             "fr": "Magasin", |             "fr": "Magasin", | ||||||
|             "ru": "Магазин", |             "ru": "Магазин", | ||||||
|             "ja": "店" |             "ja": "店", | ||||||
|  |             "nl": "Winkel" | ||||||
|           }, |           }, | ||||||
|           "description": { |           "description": { | ||||||
|             "en": "Add a new shop", |             "en": "Add a new shop", | ||||||
|             "fr": "Ajouter un nouveau magasin", |             "fr": "Ajouter un nouveau magasin", | ||||||
|             "ru": "Добавить новый магазин", |             "ru": "Добавить новый магазин", | ||||||
|             "ja": "新しい店を追加する" |             "ja": "新しい店を追加する", | ||||||
|  |             "nl": "Voeg een nieuwe winkel toe" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       ], |       ], | ||||||
|  |  | ||||||
|  | @ -603,8 +603,11 @@ | ||||||
|         "title": { |         "title": { | ||||||
|             "render": "Стол для пикника" |             "render": "Стол для пикника" | ||||||
|         }, |         }, | ||||||
|  |         "description": "Слой, отображающий столы для пикника", | ||||||
|         "tagRenderings": { |         "tagRenderings": { | ||||||
|             "0": { |             "0": { | ||||||
|  |                 "question": "Из чего изготовлен этот стол для пикника?", | ||||||
|  |                 "render": "Этот стол для пикника сделан из {material}", | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "0": { |                     "0": { | ||||||
|                         "then": "Это деревянный стол для пикника" |                         "then": "Это деревянный стол для пикника" | ||||||
|  | @ -612,17 +615,14 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Это бетонный стол для пикника" |                         "then": "Это бетонный стол для пикника" | ||||||
|                     } |                     } | ||||||
|                 }, |                 } | ||||||
|                 "render": "Этот стол для пикника сделан из {material}", |  | ||||||
|                 "question": "Из чего изготовлен этот стол для пикника?" |  | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "presets": { |         "presets": { | ||||||
|             "0": { |             "0": { | ||||||
|                 "title": "Стол для пикника" |                 "title": "Стол для пикника" | ||||||
|             } |             } | ||||||
|         }, |         } | ||||||
|         "description": "Слой, отображающий столы для пикника" |  | ||||||
|     }, |     }, | ||||||
|     "playground": { |     "playground": { | ||||||
|         "name": "Детские площадки", |         "name": "Детские площадки", | ||||||
|  | @ -645,6 +645,9 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Поверхность - <b>песок</b>" |                         "then": "Поверхность - <b>песок</b>" | ||||||
|                     }, |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "then": "Покрытие из <b>щепы</b>" | ||||||
|  |                     }, | ||||||
|                     "3": { |                     "3": { | ||||||
|                         "then": "Поверхность - <b>брусчатка</b>" |                         "then": "Поверхность - <b>брусчатка</b>" | ||||||
|                     }, |                     }, | ||||||
|  | @ -653,9 +656,17 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "5": { |                     "5": { | ||||||
|                         "then": "Поверхность - <b>бетон</b>" |                         "then": "Поверхность - <b>бетон</b>" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "2": { | ||||||
|  |                 "question": "Эта игровая площадка освещается ночью?", | ||||||
|  |                 "mappings": { | ||||||
|  |                     "0": { | ||||||
|  |                         "then": "Эта детская площадка освещается ночью" | ||||||
|                     }, |                     }, | ||||||
|                     "2": { |                     "1": { | ||||||
|                         "then": "Покрытие из <b>щепы</b>" |                         "then": "Эта детская площадка не освещается ночью" | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|  | @ -663,6 +674,9 @@ | ||||||
|                 "render": "Доступно для детей старше {min_age} лет", |                 "render": "Доступно для детей старше {min_age} лет", | ||||||
|                 "question": "С какого возраста доступна эта детская площадка?" |                 "question": "С какого возраста доступна эта детская площадка?" | ||||||
|             }, |             }, | ||||||
|  |             "4": { | ||||||
|  |                 "render": "Доступно детям до {max_age}" | ||||||
|  |             }, | ||||||
|             "6": { |             "6": { | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "4": { |                     "4": { | ||||||
|  | @ -676,47 +690,33 @@ | ||||||
|             "8": { |             "8": { | ||||||
|                 "render": "<a href='tel:{phone}'>{phone}</a>" |                 "render": "<a href='tel:{phone}'>{phone}</a>" | ||||||
|             }, |             }, | ||||||
|             "10": { |  | ||||||
|                 "mappings": { |  | ||||||
|                     "1": { |  | ||||||
|                         "then": "Всегда доступен" |  | ||||||
|                     }, |  | ||||||
|                     "2": { |  | ||||||
|                         "then": "Всегда доступен" |  | ||||||
|                     }, |  | ||||||
|                     "0": { |  | ||||||
|                         "then": "Открыто от рассвета до заката" |  | ||||||
|                     } |  | ||||||
|                 }, |  | ||||||
|                 "question": "Когда открыта эта игровая площадка?" |  | ||||||
|             }, |  | ||||||
|             "9": { |             "9": { | ||||||
|  |                 "question": "Доступна ли детская площадка пользователям кресел-колясок?", | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "2": { |                     "0": { | ||||||
|                         "then": "Недоступна пользователям кресел-колясок" |                         "then": "Полностью доступна пользователям кресел-колясок" | ||||||
|                     }, |                     }, | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Частично доступна пользователям кресел-колясок" |                         "then": "Частично доступна пользователям кресел-колясок" | ||||||
|                     }, |                     }, | ||||||
|                     "0": { |                     "2": { | ||||||
|                         "then": "Полностью доступна пользователям кресел-колясок" |                         "then": "Недоступна пользователям кресел-колясок" | ||||||
|                     } |                     } | ||||||
|                 }, |                 } | ||||||
|                 "question": "Доступна ли детская площадка пользователям кресел-колясок?" |  | ||||||
|             }, |             }, | ||||||
|             "4": { |             "10": { | ||||||
|                 "render": "Доступно детям до {max_age}" |                 "question": "Когда открыта эта игровая площадка?", | ||||||
|             }, |  | ||||||
|             "2": { |  | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "1": { |  | ||||||
|                         "then": "Эта детская площадка не освещается ночью" |  | ||||||
|                     }, |  | ||||||
|                     "0": { |                     "0": { | ||||||
|                         "then": "Эта детская площадка освещается ночью" |                         "then": "Открыто от рассвета до заката" | ||||||
|  |                     }, | ||||||
|  |                     "1": { | ||||||
|  |                         "then": "Всегда доступен" | ||||||
|  |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "then": "Всегда доступен" | ||||||
|                     } |                     } | ||||||
|                 }, |                 } | ||||||
|                 "question": "Эта игровая площадка освещается ночью?" |  | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "presets": { |         "presets": { | ||||||
|  | @ -727,6 +727,7 @@ | ||||||
|     }, |     }, | ||||||
|     "public_bookcase": { |     "public_bookcase": { | ||||||
|         "name": "Книжные шкафы", |         "name": "Книжные шкафы", | ||||||
|  |         "description": "Уличный шкаф с книгами, доступными для всех", | ||||||
|         "title": { |         "title": { | ||||||
|             "render": "Книжный шкаф", |             "render": "Книжный шкаф", | ||||||
|             "mappings": { |             "mappings": { | ||||||
|  | @ -751,10 +752,11 @@ | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|             "3": { |             "3": { | ||||||
|                 "question": "Сколько книг помещается в этом общественном книжном шкафу?", |                 "render": "{capacity} книг помещается в этот книжный шкаф", | ||||||
|                 "render": "{capacity} книг помещается в этот книжный шкаф" |                 "question": "Сколько книг помещается в этом общественном книжном шкафу?" | ||||||
|             }, |             }, | ||||||
|             "4": { |             "4": { | ||||||
|  |                 "question": "Какие книги можно найти в этом общественном книжном шкафу?", | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "0": { |                     "0": { | ||||||
|                         "then": "В основном детские книги" |                         "then": "В основном детские книги" | ||||||
|  | @ -765,27 +767,25 @@ | ||||||
|                     "2": { |                     "2": { | ||||||
|                         "then": "Книги и для детей, и для взрослых" |                         "then": "Книги и для детей, и для взрослых" | ||||||
|                     } |                     } | ||||||
|                 }, |                 } | ||||||
|                 "question": "Какие книги можно найти в этом общественном книжном шкафу?" |  | ||||||
|             }, |  | ||||||
|             "11": { |  | ||||||
|                 "render": "Более подробная информация <a href='{website}' target='_blank'>на сайте</a>", |  | ||||||
|                 "question": "Есть ли веб-сайт с более подробной информацией об этом общественном книжном шкафе?" |  | ||||||
|             }, |  | ||||||
|             "10": { |  | ||||||
|                 "render": "Установлен {start_date}", |  | ||||||
|                 "question": "Когда был установлен этот общественный книжный шкаф?" |  | ||||||
|             }, |             }, | ||||||
|             "6": { |             "6": { | ||||||
|  |                 "question": "Имеется ли свободный доступ к этому общественному книжному шкафу?", | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "0": { |                     "0": { | ||||||
|                         "then": "Свободный доступ" |                         "then": "Свободный доступ" | ||||||
|                     } |                     } | ||||||
|                 }, |                 } | ||||||
|                 "question": "Имеется ли свободный доступ к этому общественному книжному шкафу?" |             }, | ||||||
|  |             "10": { | ||||||
|  |                 "question": "Когда был установлен этот общественный книжный шкаф?", | ||||||
|  |                 "render": "Установлен {start_date}" | ||||||
|  |             }, | ||||||
|  |             "11": { | ||||||
|  |                 "render": "Более подробная информация <a href='{website}' target='_blank'>на сайте</a>", | ||||||
|  |                 "question": "Есть ли веб-сайт с более подробной информацией об этом общественном книжном шкафе?" | ||||||
|             } |             } | ||||||
|         }, |         } | ||||||
|         "description": "Уличный шкаф с книгами, доступными для всех" |  | ||||||
|     }, |     }, | ||||||
|     "slow_roads": { |     "slow_roads": { | ||||||
|         "tagRenderings": { |         "tagRenderings": { | ||||||
|  | @ -819,30 +819,32 @@ | ||||||
|         "title": { |         "title": { | ||||||
|             "render": "Спортивная площадка" |             "render": "Спортивная площадка" | ||||||
|         }, |         }, | ||||||
|  |         "description": "Спортивная площадка", | ||||||
|         "tagRenderings": { |         "tagRenderings": { | ||||||
|             "1": { |             "1": { | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "2": { |                     "0": { | ||||||
|                         "then": "Это стол для пинг-понга" |  | ||||||
|                     }, |  | ||||||
|                     "5": { |  | ||||||
|                         "then": "Здесь можно играть в баскетбол" |                         "then": "Здесь можно играть в баскетбол" | ||||||
|                     }, |                     }, | ||||||
|                     "4": { |  | ||||||
|                         "then": "Здесь можно играть в корфбол" |  | ||||||
|                     }, |  | ||||||
|                     "3": { |  | ||||||
|                         "then": "Здесь можно играть в теннис" |  | ||||||
|                     }, |  | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Здесь можно играть в футбол" |                         "then": "Здесь можно играть в футбол" | ||||||
|                     }, |                     }, | ||||||
|                     "0": { |                     "2": { | ||||||
|  |                         "then": "Это стол для пинг-понга" | ||||||
|  |                     }, | ||||||
|  |                     "3": { | ||||||
|  |                         "then": "Здесь можно играть в теннис" | ||||||
|  |                     }, | ||||||
|  |                     "4": { | ||||||
|  |                         "then": "Здесь можно играть в корфбол" | ||||||
|  |                     }, | ||||||
|  |                     "5": { | ||||||
|                         "then": "Здесь можно играть в баскетбол" |                         "then": "Здесь можно играть в баскетбол" | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|             "2": { |             "2": { | ||||||
|  |                 "question": "Какое покрытие на этой спортивной площадке?", | ||||||
|                 "render": "Поверхность - <b>{surface}</b>", |                 "render": "Поверхность - <b>{surface}</b>", | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "0": { |                     "0": { | ||||||
|  | @ -860,55 +862,53 @@ | ||||||
|                     "4": { |                     "4": { | ||||||
|                         "then": "Поверхность - <b>бетон</b>" |                         "then": "Поверхность - <b>бетон</b>" | ||||||
|                     } |                     } | ||||||
|                 }, |                 } | ||||||
|                 "question": "Какое покрытие на этой спортивной площадке?" |  | ||||||
|             }, |  | ||||||
|             "7": { |  | ||||||
|                 "mappings": { |  | ||||||
|                     "1": { |  | ||||||
|                         "then": "Всегда доступен" |  | ||||||
|                     } |  | ||||||
|                 }, |  | ||||||
|                 "question": "В какое время доступна эта площадка?" |  | ||||||
|             }, |  | ||||||
|             "4": { |  | ||||||
|                 "mappings": { |  | ||||||
|                     "1": { |  | ||||||
|                         "then": "Желательна предварительная запись для доступа на эту спортивную площадку" |  | ||||||
|                     }, |  | ||||||
|                     "3": { |  | ||||||
|                         "then": "Невозможна предварительная запись" |  | ||||||
|                     }, |  | ||||||
|                     "2": { |  | ||||||
|                         "then": "Предварительная запись для доступа на эту спортивную площадку возможна, но не обязательна" |  | ||||||
|                     } |  | ||||||
|                 }, |  | ||||||
|                 "question": "Нужна ли предварительная запись для доступа на эту спортивную площадку?" |  | ||||||
|             }, |             }, | ||||||
|             "3": { |             "3": { | ||||||
|  |                 "question": "Есть ли свободный доступ к этой спортивной площадке?", | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "2": { |                     "0": { | ||||||
|                         "then": "Доступ только членам клуба" |                         "then": "Свободный доступ" | ||||||
|                     }, |                     }, | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Ограниченный доступ (напр., только по записи, в определённые часы, ...)" |                         "then": "Ограниченный доступ (напр., только по записи, в определённые часы, ...)" | ||||||
|                     }, |                     }, | ||||||
|                     "0": { |                     "2": { | ||||||
|                         "then": "Свободный доступ" |                         "then": "Доступ только членам клуба" | ||||||
|                     } |                     } | ||||||
|                 }, |                 } | ||||||
|                 "question": "Есть ли свободный доступ к этой спортивной площадке?" |             }, | ||||||
|  |             "4": { | ||||||
|  |                 "question": "Нужна ли предварительная запись для доступа на эту спортивную площадку?", | ||||||
|  |                 "mappings": { | ||||||
|  |                     "1": { | ||||||
|  |                         "then": "Желательна предварительная запись для доступа на эту спортивную площадку" | ||||||
|  |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "then": "Предварительная запись для доступа на эту спортивную площадку возможна, но не обязательна" | ||||||
|  |                     }, | ||||||
|  |                     "3": { | ||||||
|  |                         "then": "Невозможна предварительная запись" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "7": { | ||||||
|  |                 "question": "В какое время доступна эта площадка?", | ||||||
|  |                 "mappings": { | ||||||
|  |                     "1": { | ||||||
|  |                         "then": "Всегда доступен" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "presets": { |         "presets": { | ||||||
|             "1": { |  | ||||||
|                 "title": "Спортивная площадка" |  | ||||||
|             }, |  | ||||||
|             "0": { |             "0": { | ||||||
|                 "title": "Стол для настольного тенниса" |                 "title": "Стол для настольного тенниса" | ||||||
|  |             }, | ||||||
|  |             "1": { | ||||||
|  |                 "title": "Спортивная площадка" | ||||||
|             } |             } | ||||||
|         }, |         } | ||||||
|         "description": "Спортивная площадка" |  | ||||||
|     }, |     }, | ||||||
|     "surveillance_camera": { |     "surveillance_camera": { | ||||||
|         "name": "Камеры наблюдения", |         "name": "Камеры наблюдения", | ||||||
|  | @ -917,28 +917,28 @@ | ||||||
|         }, |         }, | ||||||
|         "tagRenderings": { |         "tagRenderings": { | ||||||
|             "1": { |             "1": { | ||||||
|  |                 "question": "Какая это камера?", | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "2": { |  | ||||||
|                         "then": "Панорамная камера" |  | ||||||
|                     }, |  | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Камера с поворотным механизмом" |                         "then": "Камера с поворотным механизмом" | ||||||
|  |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "then": "Панорамная камера" | ||||||
|                     } |                     } | ||||||
|                 }, |                 } | ||||||
|                 "question": "Какая это камера?" |  | ||||||
|             }, |  | ||||||
|             "8": { |  | ||||||
|                 "question": "Как расположена эта камера?" |  | ||||||
|             }, |             }, | ||||||
|             "5": { |             "5": { | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "2": { |  | ||||||
|                         "then": "Возможно, эта камера расположена снаружи" |  | ||||||
|                     }, |  | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Эта камера расположена снаружи" |                         "then": "Эта камера расположена снаружи" | ||||||
|  |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "then": "Возможно, эта камера расположена снаружи" | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |             }, | ||||||
|  |             "8": { | ||||||
|  |                 "question": "Как расположена эта камера?" | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  | @ -958,15 +958,15 @@ | ||||||
|         }, |         }, | ||||||
|         "tagRenderings": { |         "tagRenderings": { | ||||||
|             "1": { |             "1": { | ||||||
|  |                 "question": "Есть ли свободный доступ к этим туалетам?", | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "2": { |  | ||||||
|                         "then": "Недоступно" |  | ||||||
|                     }, |  | ||||||
|                     "0": { |                     "0": { | ||||||
|                         "then": "Свободный доступ" |                         "then": "Свободный доступ" | ||||||
|  |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "then": "Недоступно" | ||||||
|                     } |                     } | ||||||
|                 }, |                 } | ||||||
|                 "question": "Есть ли свободный доступ к этим туалетам?" |  | ||||||
|             }, |             }, | ||||||
|             "2": { |             "2": { | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|  | @ -975,8 +975,9 @@ | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|             "5": { |             "3": { | ||||||
|                 "question": "Какие это туалеты?" |                 "question": "Сколько стоит посещение туалета?", | ||||||
|  |                 "render": "Стоимость {charge}" | ||||||
|             }, |             }, | ||||||
|             "4": { |             "4": { | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|  | @ -985,9 +986,8 @@ | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|             "3": { |             "5": { | ||||||
|                 "render": "Стоимость {charge}", |                 "question": "Какие это туалеты?" | ||||||
|                 "question": "Сколько стоит посещение туалета?" |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  | @ -1010,44 +1010,44 @@ | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|  |             "4": { | ||||||
|  |                 "question": "Это дерево вечнозелёное или листопадное?", | ||||||
|  |                 "mappings": { | ||||||
|  |                     "0": { | ||||||
|  |                         "then": "Листопадное: у дерева опадают листья в определённое время года." | ||||||
|  |                     }, | ||||||
|  |                     "1": { | ||||||
|  |                         "then": "Вечнозелёное." | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|             "5": { |             "5": { | ||||||
|                 "render": "Название: {name}", |                 "render": "Название: {name}", | ||||||
|  |                 "question": "Есть ли у этого дерева название?", | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "0": { |                     "0": { | ||||||
|                         "then": "У этого дерева нет названия." |                         "then": "У этого дерева нет названия." | ||||||
|                     } |                     } | ||||||
|                 }, |                 } | ||||||
|                 "question": "Есть ли у этого дерева название?" |  | ||||||
|             }, |  | ||||||
|             "8": { |  | ||||||
|                 "render": "<img src=\"./assets/svg/wikidata.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>" |  | ||||||
|             }, |             }, | ||||||
|             "7": { |             "7": { | ||||||
|                 "render": "<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>" |                 "render": "<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>" | ||||||
|             }, |             }, | ||||||
|             "4": { |             "8": { | ||||||
|                 "mappings": { |                 "render": "<img src=\"./assets/svg/wikidata.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>" | ||||||
|                     "1": { |  | ||||||
|                         "then": "Вечнозелёное." |  | ||||||
|                     }, |  | ||||||
|                     "0": { |  | ||||||
|                         "then": "Листопадное: у дерева опадают листья в определённое время года." |  | ||||||
|                     } |  | ||||||
|                 }, |  | ||||||
|                 "question": "Это дерево вечнозелёное или листопадное?" |  | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "presets": { |         "presets": { | ||||||
|  |             "0": { | ||||||
|  |                 "title": "Лиственное дерево" | ||||||
|  |             }, | ||||||
|  |             "1": { | ||||||
|  |                 "title": "Хвойное дерево", | ||||||
|  |                 "description": "Дерево с хвоей (иглами), например, сосна или ель." | ||||||
|  |             }, | ||||||
|             "2": { |             "2": { | ||||||
|                 "title": "Дерево", |                 "title": "Дерево", | ||||||
|                 "description": "Если вы не уверены в том, лиственное это дерево или хвойное." |                 "description": "Если вы не уверены в том, лиственное это дерево или хвойное." | ||||||
|             }, |  | ||||||
|             "1": { |  | ||||||
|                 "description": "Дерево с хвоей (иглами), например, сосна или ель.", |  | ||||||
|                 "title": "Хвойное дерево" |  | ||||||
|             }, |  | ||||||
|             "0": { |  | ||||||
|                 "title": "Лиственное дерево" |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  | @ -278,6 +278,18 @@ | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |     "charging_stations": { | ||||||
|  |         "title": "Oplaadpunten", | ||||||
|  |         "layers": { | ||||||
|  |             "0": { | ||||||
|  |                 "name": "Oplaadpunten", | ||||||
|  |                 "title": { | ||||||
|  |                     "render": "Oplaadpunt" | ||||||
|  |                 }, | ||||||
|  |                 "description": "Een oplaadpunt" | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|     "climbing": { |     "climbing": { | ||||||
|         "title": "Open Klimkaart", |         "title": "Open Klimkaart", | ||||||
|         "description": "Op deze kaart vind je verschillende klimgelegenheden, zoals klimzalen, bolderzalen en klimmen in de natuur", |         "description": "Op deze kaart vind je verschillende klimgelegenheden, zoals klimzalen, bolderzalen en klimmen in de natuur", | ||||||
|  | @ -924,6 +936,50 @@ | ||||||
|         "shortDescription": "Een kaart met speeltuinen", |         "shortDescription": "Een kaart met speeltuinen", | ||||||
|         "description": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen" |         "description": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen" | ||||||
|     }, |     }, | ||||||
|  |     "shops": { | ||||||
|  |         "layers": { | ||||||
|  |             "0": { | ||||||
|  |                 "name": "Winkel", | ||||||
|  |                 "title": { | ||||||
|  |                     "render": "Winkel" | ||||||
|  |                 }, | ||||||
|  |                 "description": "Een winkel", | ||||||
|  |                 "tagRenderings": { | ||||||
|  |                     "1": { | ||||||
|  |                         "question": "Wat is de naam van deze winkel?" | ||||||
|  |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "mappings": { | ||||||
|  |                             "1": { | ||||||
|  |                                 "then": "Supermarkt" | ||||||
|  |                             }, | ||||||
|  |                             "3": { | ||||||
|  |                                 "then": "Kapper" | ||||||
|  |                             }, | ||||||
|  |                             "4": { | ||||||
|  |                                 "then": "Bakkerij" | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     }, | ||||||
|  |                     "3": { | ||||||
|  |                         "question": "Wat is het telefoonnummer?" | ||||||
|  |                     }, | ||||||
|  |                     "4": { | ||||||
|  |                         "question": "Wat is de website van deze winkel?" | ||||||
|  |                     }, | ||||||
|  |                     "6": { | ||||||
|  |                         "question": "Wat zijn de openingsuren van deze winkel?" | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  |                 "presets": { | ||||||
|  |                     "0": { | ||||||
|  |                         "title": "Winkel", | ||||||
|  |                         "description": "Voeg een nieuwe winkel toe" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|     "speelplekken": { |     "speelplekken": { | ||||||
|         "title": "Welkom bij de groendoener!", |         "title": "Welkom bij de groendoener!", | ||||||
|         "shortDescription": "Speelplekken in de Antwerpse Zuidrand", |         "shortDescription": "Speelplekken in de Antwerpse Zuidrand", | ||||||
|  | @ -1042,61 +1098,5 @@ | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }, |  | ||||||
|     "charging_stations": { |  | ||||||
|         "layers": { |  | ||||||
|             "0": { |  | ||||||
|                 "description": "Een oplaadpunt", |  | ||||||
|                 "title": { |  | ||||||
|                     "render": "Oplaadpunt" |  | ||||||
|                 }, |  | ||||||
|                 "name": "Oplaadpunten" |  | ||||||
|             } |  | ||||||
|         }, |  | ||||||
|         "title": "Oplaadpunten" |  | ||||||
|     }, |  | ||||||
|     "shops": { |  | ||||||
|         "layers": { |  | ||||||
|             "0": { |  | ||||||
|                 "tagRenderings": { |  | ||||||
|                     "4": { |  | ||||||
|                         "question": "Wat is de website van deze winkel?" |  | ||||||
|                     }, |  | ||||||
|                     "3": { |  | ||||||
|                         "question": "Wat is het telefoonnummer?" |  | ||||||
|                     }, |  | ||||||
|                     "2": { |  | ||||||
|                         "mappings": { |  | ||||||
|                             "4": { |  | ||||||
|                                 "then": "Bakkerij" |  | ||||||
|                             }, |  | ||||||
|                             "3": { |  | ||||||
|                                 "then": "Kapper" |  | ||||||
|                             }, |  | ||||||
|                             "1": { |  | ||||||
|                                 "then": "Supermarkt" |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     }, |  | ||||||
|                     "1": { |  | ||||||
|                         "question": "Wat is de naam van deze winkel?" |  | ||||||
|                     }, |  | ||||||
|                     "6": { |  | ||||||
|                         "question": "Wat zijn de openingsuren van deze winkel?" |  | ||||||
|                     } |  | ||||||
|                 }, |  | ||||||
|                 "description": "Een winkel", |  | ||||||
|                 "title": { |  | ||||||
|                     "render": "Winkel" |  | ||||||
|                 }, |  | ||||||
|                 "name": "Winkel", |  | ||||||
|                 "presets": { |  | ||||||
|                     "0": { |  | ||||||
|                         "title": "Winkel", |  | ||||||
|                         "description": "Voeg een nieuwe winkel toe" |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue