Merge branch 'develop' into feature/professional
| 
		 Before Width: | Height: | Size: 136 KiB  | 
| 
						 | 
					@ -39,6 +39,15 @@ def createBar(options):
 | 
				
			||||||
    pyplot.legend()
 | 
					    pyplot.legend()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def createLine(options):
 | 
				
			||||||
 | 
					    data = options["plot"]["count"]
 | 
				
			||||||
 | 
					    keys = genKeys(data, options["interpetKeysAs"])
 | 
				
			||||||
 | 
					    values = list(map(lambda kv: kv["value"], data))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pyplot.plot(keys, values, label=options["name"])
 | 
				
			||||||
 | 
					    pyplot.legend()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pyplot_init()
 | 
					pyplot_init()
 | 
				
			||||||
title = sys.argv[1]
 | 
					title = sys.argv[1]
 | 
				
			||||||
pyplot.title = title
 | 
					pyplot.title = title
 | 
				
			||||||
| 
						 | 
					@ -59,5 +68,8 @@ while (True):
 | 
				
			||||||
        createPie(options)
 | 
					        createPie(options)
 | 
				
			||||||
    elif (options["plot"]["type"] == "bar"):
 | 
					    elif (options["plot"]["type"] == "bar"):
 | 
				
			||||||
        createBar(options)
 | 
					        createBar(options)
 | 
				
			||||||
 | 
					    elif (options["plot"]["type"] == "line"):
 | 
				
			||||||
 | 
					        createLine(options)
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        print("Unkown type: " + options.type)
 | 
					        print("Unkown type: " + options.type)
 | 
				
			||||||
 | 
					print("Plot generated")
 | 
				
			||||||
| 
						 | 
					@ -179,7 +179,7 @@ interface PlotSpec {
 | 
				
			||||||
    name: string,
 | 
					    name: string,
 | 
				
			||||||
    interpetKeysAs: "date" | "number" | "string" | string
 | 
					    interpetKeysAs: "date" | "number" | "string" | string
 | 
				
			||||||
    plot: {
 | 
					    plot: {
 | 
				
			||||||
        type: "pie" | "bar"
 | 
					        type: "pie" | "bar" | "line"
 | 
				
			||||||
        count: { key: string, value: number }[]
 | 
					        count: { key: string, value: number }[]
 | 
				
			||||||
    } | {
 | 
					    } | {
 | 
				
			||||||
        type: "stacked-bar"
 | 
					        type: "stacked-bar"
 | 
				
			||||||
| 
						 | 
					@ -196,6 +196,7 @@ interface PlotSpec {
 | 
				
			||||||
function createGraph(
 | 
					function createGraph(
 | 
				
			||||||
    title: string,
 | 
					    title: string,
 | 
				
			||||||
    ...options: PlotSpec[]) {
 | 
					    ...options: PlotSpec[]) {
 | 
				
			||||||
 | 
					    console.log("Creating graph",title,"...")
 | 
				
			||||||
    const process = exec("python3 GenPlot.py \"graphs/" + title + "\"", ((error, stdout, stderr) => {
 | 
					    const process = exec("python3 GenPlot.py \"graphs/" + title + "\"", ((error, stdout, stderr) => {
 | 
				
			||||||
        console.log("Python: ", stdout)
 | 
					        console.log("Python: ", stdout)
 | 
				
			||||||
        if (error !== null) {
 | 
					        if (error !== null) {
 | 
				
			||||||
| 
						 | 
					@ -207,7 +208,8 @@ function createGraph(
 | 
				
			||||||
    }))
 | 
					    }))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (const option of options) {
 | 
					    for (const option of options) {
 | 
				
			||||||
        process.stdin._write(JSON.stringify(option) + "\n", "utf-8", undefined)
 | 
					        const d = JSON.stringify(option) + "\n"
 | 
				
			||||||
 | 
					        process.stdin._write(d, "utf-8", undefined)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    process.stdin._write("\n", "utf-8", undefined)
 | 
					    process.stdin._write("\n", "utf-8", undefined)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -229,6 +231,7 @@ class Histogram<K> {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public bump(key: K, increase = 1) {
 | 
					    public bump(key: K, increase = 1) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.counts.has(key)) {
 | 
					        if (this.counts.has(key)) {
 | 
				
			||||||
            this.counts.set(key, increase + this.counts.get(key))
 | 
					            this.counts.set(key, increase + this.counts.get(key))
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
| 
						 | 
					@ -324,6 +327,20 @@ class Histogram<K> {
 | 
				
			||||||
        return hist
 | 
					        return hist
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public asRunningAverages(convertToRange: ((key: K) => K[])) {
 | 
				
			||||||
 | 
					        const newCount = new Histogram<K>()
 | 
				
			||||||
 | 
					        const self = this
 | 
				
			||||||
 | 
					        this.counts.forEach((_, key) => {
 | 
				
			||||||
 | 
					            const keysToCheck = convertToRange(key)
 | 
				
			||||||
 | 
					            let sum = 0
 | 
				
			||||||
 | 
					            for (const k of keysToCheck) {
 | 
				
			||||||
 | 
					                sum += self.counts.get(k) ?? 0
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            newCount.bump(key, sum / keysToCheck.length)
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        return newCount
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Given a histogram:
 | 
					     * Given a histogram:
 | 
				
			||||||
     * 'a': 3
 | 
					     * 'a': 3
 | 
				
			||||||
| 
						 | 
					@ -402,6 +419,15 @@ class Histogram<K> {
 | 
				
			||||||
        return spec;
 | 
					        return spec;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public asLine(options: {
 | 
				
			||||||
 | 
					        name: string
 | 
				
			||||||
 | 
					        compare?: (a: K, b: K) => number
 | 
				
			||||||
 | 
					    }) {
 | 
				
			||||||
 | 
					        const spec = this.asPie(options)
 | 
				
			||||||
 | 
					        spec.plot.type = "line"
 | 
				
			||||||
 | 
					        return spec
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Group<K, V> {
 | 
					class Group<K, V> {
 | 
				
			||||||
| 
						 | 
					@ -506,7 +532,8 @@ function createGraphs(allFeatures: ChangeSetData[], appliedFilterDescription: st
 | 
				
			||||||
    hist
 | 
					    hist
 | 
				
			||||||
        .createOthersCategory("other", 20)
 | 
					        .createOthersCategory("other", 20)
 | 
				
			||||||
        .addCountToName()
 | 
					        .addCountToName()
 | 
				
			||||||
        .asBar({name: "Changesets per theme (bar)" + appliedFilterDescription}).render()
 | 
					        .asBar({name: "Changesets per theme (bar)" + appliedFilterDescription})
 | 
				
			||||||
 | 
					    .render()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    new Histogram<string>(allFeatures.map(f => f.properties.user))
 | 
					    new Histogram<string>(allFeatures.map(f => f.properties.user))
 | 
				
			||||||
| 
						 | 
					@ -516,7 +543,33 @@ function createGraphs(allFeatures: ChangeSetData[], appliedFilterDescription: st
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            compare: (a, b) => Number(a) - Number(b),
 | 
					            compare: (a, b) => Number(a) - Number(b),
 | 
				
			||||||
            name: "Contributors per changeset count" + appliedFilterDescription
 | 
					            name: "Contributors per changeset count" + appliedFilterDescription
 | 
				
			||||||
        }).render()
 | 
					        })
 | 
				
			||||||
 | 
					    .render()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const csPerDay = new Histogram<string>(allFeatures.map(f => f.properties.date.substr(0, 10)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const perDayLine = csPerDay
 | 
				
			||||||
 | 
					        .keyToDate()
 | 
				
			||||||
 | 
					        .asLine({
 | 
				
			||||||
 | 
					            compare: (a, b) => a.getTime() - b.getTime(),
 | 
				
			||||||
 | 
					            name: "Changesets per day" + appliedFilterDescription
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const perDayAvg = csPerDay.asRunningAverages(key => {
 | 
				
			||||||
 | 
					        const keys = []
 | 
				
			||||||
 | 
					        for (let i = 0; i < 7; i++) {
 | 
				
			||||||
 | 
					            const otherDay = new Date(new Date(key).getTime() - i * 1000 * 60 * 60 * 24)
 | 
				
			||||||
 | 
					            keys.push(otherDay.toISOString().substr(0, 10))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return keys
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					        .keyToDate()
 | 
				
			||||||
 | 
					        .asLine({
 | 
				
			||||||
 | 
					        compare: (a, b) => a.getTime() - b.getTime(),
 | 
				
			||||||
 | 
					        name: "Running weekly average" + appliedFilterDescription
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    createGraph("Changesets per day (line)" + appliedFilterDescription, perDayLine, perDayAvg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    new Histogram<string>(allFeatures.map(f => f.properties.metadata.host))
 | 
					    new Histogram<string>(allFeatures.map(f => f.properties.metadata.host))
 | 
				
			||||||
        .asPie({
 | 
					        .asPie({
 | 
				
			||||||
| 
						 | 
					@ -588,8 +641,25 @@ function createGraphs(allFeatures: ChangeSetData[], appliedFilterDescription: st
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function createMiscGraphs(allFeatures: ChangeSetData[], emptyCS: ChangeSetData[]) {
 | 
				
			||||||
 | 
					    new Histogram(emptyCS.map(f => f.properties.date)).keyToDate().asBar({
 | 
				
			||||||
 | 
					        name: "Empty changesets by date"
 | 
				
			||||||
 | 
					    }).render()
 | 
				
			||||||
 | 
					    const geojson = {
 | 
				
			||||||
 | 
					        type: "FeatureCollection",
 | 
				
			||||||
 | 
					        features: allFeatures.map(f => {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                return GeoOperations.centerpoint(f.geometry);
 | 
				
			||||||
 | 
					            } catch (e) {
 | 
				
			||||||
 | 
					                console.error("Could not create center point: ", e, f)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    writeFileSync("centerpoints.geojson", JSON.stringify(geojson, undefined, 2))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
new StatsDownloader("stats").DownloadStats()
 | 
					
 | 
				
			||||||
 | 
					// new StatsDownloader("stats").DownloadStats()
 | 
				
			||||||
const allPaths = readdirSync("stats")
 | 
					const allPaths = readdirSync("stats")
 | 
				
			||||||
    .filter(p => p.startsWith("stats.") && p.endsWith(".json"));
 | 
					    .filter(p => p.startsWith("stats.") && p.endsWith(".json"));
 | 
				
			||||||
let allFeatures: ChangeSetData[] = [].concat(...allPaths
 | 
					let allFeatures: ChangeSetData[] = [].concat(...allPaths
 | 
				
			||||||
| 
						 | 
					@ -599,25 +669,7 @@ let allFeatures: ChangeSetData[] = [].concat(...allPaths
 | 
				
			||||||
const emptyCS = allFeatures.filter(f => f.properties.metadata.theme === "EMPTY CS")
 | 
					const emptyCS = allFeatures.filter(f => f.properties.metadata.theme === "EMPTY CS")
 | 
				
			||||||
allFeatures = allFeatures.filter(f => f.properties.metadata.theme !== "EMPTY CS")
 | 
					allFeatures = allFeatures.filter(f => f.properties.metadata.theme !== "EMPTY CS")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
new Histogram(emptyCS.map(f => f.properties.date)).keyToDate().asBar({
 | 
					createMiscGraphs(allFeatures, emptyCS)
 | 
				
			||||||
    name: "Empty changesets by date"
 | 
					 | 
				
			||||||
}).render()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const geojson = {
 | 
					 | 
				
			||||||
    type: "FeatureCollection",
 | 
					 | 
				
			||||||
    features: allFeatures.map(f => {
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            return GeoOperations.centerpoint(f.geometry);
 | 
					 | 
				
			||||||
        } catch (e) {
 | 
					 | 
				
			||||||
            console.error("Could not create center point: ", e, f)
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
writeFileSync("centerpoints.geojson", JSON.stringify(geojson, undefined, 2))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
createGraphs(allFeatures, "")
 | 
					createGraphs(allFeatures, "")
 | 
				
			||||||
createGraphs(allFeatures.filter(f => f.properties.date.startsWith("2020")), " in 2020")
 | 
					createGraphs(allFeatures.filter(f => f.properties.date.startsWith("2020")), " in 2020")
 | 
				
			||||||
createGraphs(allFeatures.filter(f => f.properties.date.startsWith("2021")), " in 2021")
 | 
					createGraphs(allFeatures.filter(f => f.properties.date.startsWith("2021")), " in 2021")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								Docs/Tools/graphs/Changesets per day (line) in 2020.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 293 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Docs/Tools/graphs/Changesets per day (line) in 2021.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 650 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Docs/Tools/graphs/Changesets per day (line).png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 329 KiB  | 
| 
		 Before Width: | Height: | Size: 273 KiB After Width: | Height: | Size: 269 KiB  | 
| 
		 Before Width: | Height: | Size: 231 KiB After Width: | Height: | Size: 228 KiB  | 
| 
		 Before Width: | Height: | Size: 518 KiB After Width: | Height: | Size: 562 KiB  | 
| 
		 Before Width: | Height: | Size: 546 KiB After Width: | Height: | Size: 586 KiB  | 
| 
		 Before Width: | Height: | Size: 707 KiB After Width: | Height: | Size: 769 KiB  | 
| 
		 Before Width: | Height: | Size: 731 KiB After Width: | Height: | Size: 787 KiB  | 
| 
		 Before Width: | Height: | Size: 445 KiB After Width: | Height: | Size: 485 KiB  | 
| 
		 Before Width: | Height: | Size: 468 KiB After Width: | Height: | Size: 502 KiB  | 
| 
		 Before Width: | Height: | Size: 481 KiB After Width: | Height: | Size: 525 KiB  | 
| 
		 Before Width: | Height: | Size: 533 KiB After Width: | Height: | Size: 571 KiB  | 
| 
		 Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 144 KiB  | 
| 
		 Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 132 KiB  | 
| 
		 Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 149 KiB  | 
| 
		 Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 124 KiB  | 
| 
		 Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 116 KiB  | 
| 
		 Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 116 KiB  | 
| 
		 Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 100 KiB  | 
| 
						 | 
					@ -75,7 +75,7 @@ export default class FeaturePipeline {
 | 
				
			||||||
                .map(ch => ch.changes)
 | 
					                .map(ch => ch.changes)
 | 
				
			||||||
                .filter(coor => coor["lat"] !== undefined && coor["lon"] !== undefined)
 | 
					                .filter(coor => coor["lat"] !== undefined && coor["lon"] !== undefined)
 | 
				
			||||||
                .forEach(coor => {
 | 
					                .forEach(coor => {
 | 
				
			||||||
                    state.layoutToUse.layers.forEach(l => self.localStorageSavers.get(l.id).poison(coor["lon"], coor["lat"]))
 | 
					                    state.layoutToUse.layers.forEach(l => self.localStorageSavers.get(l.id)?.poison(coor["lon"], coor["lat"]))
 | 
				
			||||||
                })
 | 
					                })
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -210,7 +210,11 @@ export default class FeaturePipeline {
 | 
				
			||||||
            handleTile: tile => {
 | 
					            handleTile: tile => {
 | 
				
			||||||
                new RegisteringAllFromFeatureSourceActor(tile)
 | 
					                new RegisteringAllFromFeatureSourceActor(tile)
 | 
				
			||||||
                if (tile.layer.layerDef.maxAgeOfCache > 0) {
 | 
					                if (tile.layer.layerDef.maxAgeOfCache > 0) {
 | 
				
			||||||
                    self.localStorageSavers.get(tile.layer.layerDef.id).addTile(tile)
 | 
					                    const saver = self.localStorageSavers.get(tile.layer.layerDef.id)
 | 
				
			||||||
 | 
					                    if(saver === undefined){
 | 
				
			||||||
 | 
					                        console.error("No localStorageSaver found for layer ",tile.layer.layerDef.id)
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    saver?.addTile(tile)
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                perLayerHierarchy.get(tile.layer.layerDef.id).registerTile(tile)
 | 
					                perLayerHierarchy.get(tile.layer.layerDef.id).registerTile(tile)
 | 
				
			||||||
                tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile))
 | 
					                tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile))
 | 
				
			||||||
| 
						 | 
					@ -223,9 +227,8 @@ export default class FeaturePipeline {
 | 
				
			||||||
                    if (layer.maxAgeOfCache > 0) {
 | 
					                    if (layer.maxAgeOfCache > 0) {
 | 
				
			||||||
                       const saver = self.localStorageSavers.get(layer.id)
 | 
					                       const saver = self.localStorageSavers.get(layer.id)
 | 
				
			||||||
                           if(saver === undefined){
 | 
					                           if(saver === undefined){
 | 
				
			||||||
                               console.warn("No local storage saver found for ", layer.id)
 | 
					                               console.error("No local storage saver found for ", layer.id)
 | 
				
			||||||
                           }else{
 | 
					                           }else{
 | 
				
			||||||
                               
 | 
					 | 
				
			||||||
                                saver.MarkVisited(tileId, new Date())
 | 
					                                saver.MarkVisited(tileId, new Date())
 | 
				
			||||||
                           }
 | 
					                           }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
| 
						 | 
					@ -260,7 +263,7 @@ export default class FeaturePipeline {
 | 
				
			||||||
                maxZoomLevel: state.layoutToUse.clustering.maxZoom,
 | 
					                maxZoomLevel: state.layoutToUse.clustering.maxZoom,
 | 
				
			||||||
                registerTile: (tile) => {
 | 
					                registerTile: (tile) => {
 | 
				
			||||||
                    // We save the tile data for the given layer to local storage - data sourced from overpass
 | 
					                    // We save the tile data for the given layer to local storage - data sourced from overpass
 | 
				
			||||||
                    self.localStorageSavers.get(tile.layer.layerDef.id).addTile(tile)
 | 
					                    self.localStorageSavers.get(tile.layer.layerDef.id)?.addTile(tile)
 | 
				
			||||||
                    perLayerHierarchy.get(source.layer.layerDef.id).registerTile(new RememberingSource(tile))
 | 
					                    perLayerHierarchy.get(source.layer.layerDef.id).registerTile(new RememberingSource(tile))
 | 
				
			||||||
                    tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile))
 | 
					                    tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -422,7 +425,7 @@ export default class FeaturePipeline {
 | 
				
			||||||
                        const tileIndex = Tiles.tile_index(paddedToZoomLevel, x, y)
 | 
					                        const tileIndex = Tiles.tile_index(paddedToZoomLevel, x, y)
 | 
				
			||||||
                        downloadedLayers.forEach(layer => {
 | 
					                        downloadedLayers.forEach(layer => {
 | 
				
			||||||
                            self.freshnesses.get(layer.id).addTileLoad(tileIndex, date)
 | 
					                            self.freshnesses.get(layer.id).addTileLoad(tileIndex, date)
 | 
				
			||||||
                            self.localStorageSavers.get(layer.id).MarkVisited(tileIndex, date)
 | 
					                            self.localStorageSavers.get(layer.id)?.MarkVisited(tileIndex, date)
 | 
				
			||||||
                        })
 | 
					                        })
 | 
				
			||||||
                    })
 | 
					                    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@ import {Utils} from "../Utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class Constants {
 | 
					export default class Constants {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static vNumber = "0.12.10";
 | 
					    public static vNumber = "0.12.11";
 | 
				
			||||||
    public static ImgurApiKey = '7070e7167f0a25a'
 | 
					    public static ImgurApiKey = '7070e7167f0a25a'
 | 
				
			||||||
    public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"
 | 
					    public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,7 +47,7 @@ export default class PointRenderingConfig extends WithContextLoader {
 | 
				
			||||||
        if (this.location.size == 0) {
 | 
					        if (this.location.size == 0) {
 | 
				
			||||||
            throw "A pointRendering should have at least one 'location' to defined where it should be rendered. (At " + context + ".location)"
 | 
					            throw "A pointRendering should have at least one 'location' to defined where it should be rendered. (At " + context + ".location)"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        this.icon = this.tr("icon", "");
 | 
					        this.icon = this.tr("icon", undefined);
 | 
				
			||||||
        this.iconBadges = (json.iconBadges ?? []).map((overlay, i) => {
 | 
					        this.iconBadges = (json.iconBadges ?? []).map((overlay, i) => {
 | 
				
			||||||
            let tr: TagRenderingConfig;
 | 
					            let tr: TagRenderingConfig;
 | 
				
			||||||
            if (typeof overlay.then === "string" &&
 | 
					            if (typeof overlay.then === "string" &&
 | 
				
			||||||
| 
						 | 
					@ -65,8 +65,8 @@ export default class PointRenderingConfig extends WithContextLoader {
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const iconPath = this.icon.GetRenderValue({id: "node/-1"}).txt;
 | 
					        const iconPath = this.icon?.GetRenderValue({id: "node/-1"})?.txt;
 | 
				
			||||||
        if (iconPath.startsWith(Utils.assets_path)) {
 | 
					        if (iconPath !== undefined && iconPath.startsWith(Utils.assets_path)) {
 | 
				
			||||||
            const iconKey = iconPath.substr(Utils.assets_path.length);
 | 
					            const iconKey = iconPath.substr(Utils.assets_path.length);
 | 
				
			||||||
            if (Svg.All[iconKey] === undefined) {
 | 
					            if (Svg.All[iconKey] === undefined) {
 | 
				
			||||||
                throw "Builtin SVG asset not found: " + iconPath;
 | 
					                throw "Builtin SVG asset not found: " + iconPath;
 | 
				
			||||||
| 
						 | 
					@ -200,7 +200,8 @@ export default class PointRenderingConfig extends WithContextLoader {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const iconAndBadges = new Combine([this.GetSimpleIcon(tags), this.GetBadges(tags)])
 | 
					        const icon = this.GetSimpleIcon(tags)
 | 
				
			||||||
 | 
					        const iconAndBadges = new Combine([icon, this.GetBadges(tags)])
 | 
				
			||||||
            .SetClass("block relative")
 | 
					            .SetClass("block relative")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!options?.noSize) {
 | 
					        if (!options?.noSize) {
 | 
				
			||||||
| 
						 | 
					@ -209,8 +210,20 @@ export default class PointRenderingConfig extends WithContextLoader {
 | 
				
			||||||
            iconAndBadges.SetClass("w-full h-full")
 | 
					            iconAndBadges.SetClass("w-full h-full")
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        let label = this.GetLabel(tags)
 | 
				
			||||||
 | 
					        let htmlEl : BaseUIElement;
 | 
				
			||||||
 | 
					        if(icon === undefined && label === undefined){
 | 
				
			||||||
 | 
					            htmlEl = undefined
 | 
				
			||||||
 | 
					        }else if(icon === undefined){
 | 
				
			||||||
 | 
					            htmlEl = label
 | 
				
			||||||
 | 
					        }else if(label === undefined){
 | 
				
			||||||
 | 
					            htmlEl = iconAndBadges
 | 
				
			||||||
 | 
					        }else {
 | 
				
			||||||
 | 
					            htmlEl = new Combine([iconAndBadges, label]).SetStyle("flex flex-col")
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            html: new Combine([iconAndBadges, this.GetLabel(tags)]).SetStyle("flex flex-col"),
 | 
					            html: htmlEl,
 | 
				
			||||||
            iconSize: [iconW, iconH],
 | 
					            iconSize: [iconW, iconH],
 | 
				
			||||||
            iconAnchor: [anchorW, anchorH],
 | 
					            iconAnchor: [anchorW, anchorH],
 | 
				
			||||||
            popupAnchor: [0, 3 - anchorH],
 | 
					            popupAnchor: [0, 3 - anchorH],
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,6 +8,8 @@ import {Utils} from "../Utils";
 | 
				
			||||||
import LanguagePicker from "./LanguagePicker";
 | 
					import LanguagePicker from "./LanguagePicker";
 | 
				
			||||||
import IndexText from "./BigComponents/IndexText";
 | 
					import IndexText from "./BigComponents/IndexText";
 | 
				
			||||||
import FeaturedMessage from "./BigComponents/FeaturedMessage";
 | 
					import FeaturedMessage from "./BigComponents/FeaturedMessage";
 | 
				
			||||||
 | 
					import Toggle from "./Input/Toggle";
 | 
				
			||||||
 | 
					import {SubtleButton} from "./Base/SubtleButton";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class AllThemesGui {
 | 
					export default class AllThemesGui {
 | 
				
			||||||
    constructor() {
 | 
					    constructor() {
 | 
				
			||||||
| 
						 | 
					@ -15,16 +17,22 @@ export default class AllThemesGui {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            new FixedUiElement("").AttachTo("centermessage")
 | 
					            new FixedUiElement("").AttachTo("centermessage")
 | 
				
			||||||
            const state = new UserRelatedState(undefined, undefined);
 | 
					            const state = new UserRelatedState(undefined);
 | 
				
			||||||
            const intro = new Combine([
 | 
					            const intro = new Combine([
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                LanguagePicker.CreateLanguagePicker(Translations.t.index.title.SupportedLanguages())
 | 
					                LanguagePicker.CreateLanguagePicker(Translations.t.index.title.SupportedLanguages())
 | 
				
			||||||
                    .SetClass("absolute top-2 right-3"),
 | 
					
 | 
				
			||||||
 | 
					                    .SetClass("flex absolute top-2 right-3"),
 | 
				
			||||||
                new IndexText()
 | 
					                new IndexText()
 | 
				
			||||||
            ]);
 | 
					            ]);
 | 
				
			||||||
            new Combine([
 | 
					            new Combine([
 | 
				
			||||||
                intro,
 | 
					                intro,
 | 
				
			||||||
                new FeaturedMessage(),
 | 
					                new FeaturedMessage(),
 | 
				
			||||||
                new MoreScreen(state, true),
 | 
					                new MoreScreen(state, true),
 | 
				
			||||||
 | 
					                new Toggle(
 | 
				
			||||||
 | 
					                    undefined,
 | 
				
			||||||
 | 
					                    new SubtleButton(undefined, Translations.t.index.logIn).SetStyle("height:min-content").onClick(() => state.osmConnection.AttemptLogin()),
 | 
				
			||||||
 | 
					                    state.osmConnection.isLoggedIn),
 | 
				
			||||||
                Translations.t.general.aboutMapcomplete
 | 
					                Translations.t.general.aboutMapcomplete
 | 
				
			||||||
                    .Subs({"osmcha_link": Utils.OsmChaLinkFor(7)})
 | 
					                    .Subs({"osmcha_link": Utils.OsmChaLinkFor(7)})
 | 
				
			||||||
                    .SetClass("link-underline"),
 | 
					                    .SetClass("link-underline"),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,8 +85,15 @@ class SingleLayerSelectionButton extends Toggle {
 | 
				
			||||||
            options.currentBackground.setData(previousLayer.data)
 | 
					            options.currentBackground.setData(previousLayer.data)
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        options.currentBackground.addCallbackAndRunD(background => {
 | 
				
			||||||
 | 
					            if (background.category === options.preferredType) {
 | 
				
			||||||
 | 
					                previousLayer.setData(background)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        available.addCallbackAndRunD(availableLayer => {
 | 
					
 | 
				
			||||||
 | 
					        available.addCallbackD(availableLayer => {
 | 
				
			||||||
 | 
					            // Called whenever a better layer is available
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (previousLayer.data === undefined) {
 | 
					            if (previousLayer.data === undefined) {
 | 
				
			||||||
                // PreviousLayer is unset -> we definitively weren't using this category -> no need to switch
 | 
					                // PreviousLayer is unset -> we definitively weren't using this category -> no need to switch
 | 
				
			||||||
| 
						 | 
					@ -97,6 +104,11 @@ class SingleLayerSelectionButton extends Toggle {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
 | 
					            // Is the previous layer still valid? If so, we don't bother to switch
 | 
				
			||||||
 | 
					            if(previousLayer.data.feature === null || GeoOperations.inside(locationControl.data, previousLayer.data.feature)){
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (availableLayer.category === options.preferredType) {
 | 
					            if (availableLayer.category === options.preferredType) {
 | 
				
			||||||
                // Allright, we can set this different layer
 | 
					                // Allright, we can set this different layer
 | 
				
			||||||
                options.currentBackground.setData(availableLayer)
 | 
					                options.currentBackground.setData(availableLayer)
 | 
				
			||||||
| 
						 | 
					@ -112,12 +124,6 @@ class SingleLayerSelectionButton extends Toggle {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        options.currentBackground.addCallbackAndRunD(background => {
 | 
					 | 
				
			||||||
            if (background.category === options.preferredType) {
 | 
					 | 
				
			||||||
                previousLayer.setData(background)
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        this.activate = () => {
 | 
					        this.activate = () => {
 | 
				
			||||||
            checkPreviousLayer()
 | 
					            checkPreviousLayer()
 | 
				
			||||||
            if (available.data.category !== options.preferredType) {
 | 
					            if (available.data.category !== options.preferredType) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,16 +33,11 @@ export default class FeaturedMessage extends Combine {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static WelcomeMessages(): { start_date: Date, end_date: Date, message: string, featured_theme?: string }[] {
 | 
					    public static WelcomeMessages(): { start_date: Date, end_date: Date, message: string, featured_theme?: string }[] {
 | 
				
			||||||
        const all_messages: { start_date: Date, end_date: Date, message: string, featured_theme?: string }[] = []
 | 
					        const all_messages: { start_date: Date, end_date: Date, message: string, featured_theme?: string }[] = []
 | 
				
			||||||
        console.log("Constructing the list...", welcome_messages)
 | 
					 | 
				
			||||||
        for (const i in welcome_messages) {
 | 
					        for (const i in welcome_messages) {
 | 
				
			||||||
            console.log(i)
 | 
					 | 
				
			||||||
            if (isNaN(Number(i))) {
 | 
					            if (isNaN(Number(i))) {
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            console.log("> ", i)
 | 
					 | 
				
			||||||
            const wm = welcome_messages[i]
 | 
					            const wm = welcome_messages[i]
 | 
				
			||||||
            console.log(wm)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (wm === null) {
 | 
					            if (wm === null) {
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -302,11 +302,10 @@ export default class ImportButton extends Toggle {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let action: OsmChangeAction & { getPreview(): Promise<FeatureSource> }
 | 
					        let action: OsmChangeAction & { getPreview(): Promise<FeatureSource> }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const theme = o.state.layoutToUse.id
 | 
					 | 
				
			||||||
        const changes = o.state.changes
 | 
					        const changes = o.state.changes
 | 
				
			||||||
        let confirm: () => Promise<string>
 | 
					        let confirm: () => Promise<string>
 | 
				
			||||||
        if (o.conflationSettings !== undefined) {
 | 
					        if (o.conflationSettings !== undefined) {
 | 
				
			||||||
 | 
					            // Conflate the way
 | 
				
			||||||
            action = new ReplaceGeometryAction(
 | 
					            action = new ReplaceGeometryAction(
 | 
				
			||||||
                o.state,
 | 
					                o.state,
 | 
				
			||||||
                o.feature,
 | 
					                o.feature,
 | 
				
			||||||
| 
						 | 
					@ -323,6 +322,7 @@ export default class ImportButton extends Toggle {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
 | 
					            // Upload the way to OSM
 | 
				
			||||||
            const geom = o.feature.geometry
 | 
					            const geom = o.feature.geometry
 | 
				
			||||||
            let coordinates: [number, number][]
 | 
					            let coordinates: [number, number][]
 | 
				
			||||||
            if (geom.type === "LineString") {
 | 
					            if (geom.type === "LineString") {
 | 
				
			||||||
| 
						 | 
					@ -331,7 +331,6 @@ export default class ImportButton extends Toggle {
 | 
				
			||||||
                coordinates = geom.coordinates[0]
 | 
					                coordinates = geom.coordinates[0]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
            action = new CreateWayWithPointReuseAction(
 | 
					            action = new CreateWayWithPointReuseAction(
 | 
				
			||||||
                o.newTags.data,
 | 
					                o.newTags.data,
 | 
				
			||||||
                coordinates,
 | 
					                coordinates,
 | 
				
			||||||
| 
						 | 
					@ -341,7 +340,6 @@ export default class ImportButton extends Toggle {
 | 
				
			||||||
                    withinRangeOfM: 1,
 | 
					                    withinRangeOfM: 1,
 | 
				
			||||||
                    ifMatches: new Tag("_is_part_of_building", "true"),
 | 
					                    ifMatches: new Tag("_is_part_of_building", "true"),
 | 
				
			||||||
                    mode: "move_osm_point"
 | 
					                    mode: "move_osm_point"
 | 
				
			||||||
 | 
					 | 
				
			||||||
                }]
 | 
					                }]
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -364,7 +362,13 @@ export default class ImportButton extends Toggle {
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const confirmButton = new SubtleButton(o.image(), o.message)
 | 
					        const tagsExplanation = new VariableUiElement(o.newTags.map(tagsToApply => {
 | 
				
			||||||
 | 
					                const tagsStr = tagsToApply.map(t => t.asHumanString(false, true)).join("&");
 | 
				
			||||||
 | 
					                return Translations.t.general.add.importTags.Subs({tags: tagsStr});
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        )).SetClass("subtle")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const confirmButton = new SubtleButton(o.image(), new Combine([o.message, tagsExplanation]).SetClass("flex flex-col"))
 | 
				
			||||||
        confirmButton.onClick(async () => {
 | 
					        confirmButton.onClick(async () => {
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (isImported.data) {
 | 
					                if (isImported.data) {
 | 
				
			||||||
| 
						 | 
					@ -380,9 +384,7 @@ export default class ImportButton extends Toggle {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const cancel = new SubtleButton(Svg.close_ui(), Translations.t.general.cancel).onClick(() => {
 | 
					        const cancel = new SubtleButton(Svg.close_ui(), Translations.t.general.cancel).onClick(() => importClicked.setData(false))
 | 
				
			||||||
            importClicked.setData(false)
 | 
					 | 
				
			||||||
        })
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return new Combine([confirmationMap, confirmButton, cancel]).SetClass("flex flex-col")
 | 
					        return new Combine([confirmationMap, confirmButton, cancel]).SetClass("flex flex-col")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -197,6 +197,7 @@ export default class DefaultGUI {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            isOpened.setData(false);
 | 
					            isOpened.setData(false);
 | 
				
			||||||
 | 
					            return true; // Unregister this caller - we only autoclose once
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.state.selectedElement.addCallbackAndRunD((_) => {
 | 
					        this.state.selectedElement.addCallbackAndRunD((_) => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -437,9 +437,9 @@
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "render": {
 | 
					      "render": {
 | 
				
			||||||
        "en": "<a href='mailto:{email}?subject=Broken bicycle pump&body=Hello,\n\nWith this email, I'd like to inform you that the bicycle pump located at https://mapcomplete.osm.be/cyclofix?lat={_lat}&lon={_lon}&z=18#{id} is broken.'>Report this bicycle pump as broken</a>",
 | 
					        "en": "<a href='mailto:{email}?subject=Broken bicycle pump&body=Hello,%0D%0A%0D%0AWith this email, I'd like to inform you that the bicycle pump located at https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id} is broken.%0D%0A%0D%0A Kind regards'>Report this bicycle pump as broken</a>",
 | 
				
			||||||
        "nl": "<a href='mailto:{email}?subject=Kapotte fietspomp&body=Geachte,%0D%0A%0D%0AGraag had ik u gemeld dat een fietspomp defect is. De fietspomp bevindt zich hier: https://mapcomplete.osm.be/cyclofix#{id}.'>Rapporteer deze fietspomp als kapot</a>",
 | 
					        "nl": "<a href='mailto:{email}?subject=Kapotte fietspomp&body=Geachte,%0D%0A%0D%0AGraag had ik u gemeld dat een fietspomp defect is. De fietspomp bevindt zich hier: https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id}.%0D%0A%0D%0AMet vriendelijke groeten.'>Rapporteer deze fietspomp als kapot</a>",
 | 
				
			||||||
        "de": "<a href='mailto:{email}?subject=Fahrradpumpe kaputt&body=Hallo,\n\nMit dieser E-Mail möchte ich Ihnen mitteilen, dass die Fahrradpumpe, die sich unter https://mapcomplete.osm.be/cyclofix?lat={_lat}&lon={_lon}&z=18#{id} befindet, kaputt ist.'>Melde diese Fahrradpumpe als kaputt</a>"
 | 
					        "de": "<a href='mailto:{email}?subject=Fahrradpumpe kaputt&body=Hallo,%0D%0A%0D%0AMit dieser E-Mail möchte ich Ihnen mitteilen, dass die Fahrradpumpe, die sich unter https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id} befindet, kaputt ist.'>Melde diese Fahrradpumpe als kaputt</a>"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "id": "Email maintainer"
 | 
					      "id": "Email maintainer"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,8 @@
 | 
				
			||||||
  "description": "This is a priviliged meta_layer which exports _every_ point in OSM. This only works if zoomed below the point that the full tile is loaded (and not loaded via Overpass). Note that this point will also contain a property `parent_ways` which contains all the ways this node is part of as a list. This is mainly used for extremely specialized themes, which do advanced conflations. Expert use only.",
 | 
					  "description": "This is a priviliged meta_layer which exports _every_ point in OSM. This only works if zoomed below the point that the full tile is loaded (and not loaded via Overpass). Note that this point will also contain a property `parent_ways` which contains all the ways this node is part of as a list. This is mainly used for extremely specialized themes, which do advanced conflations. Expert use only.",
 | 
				
			||||||
  "minzoom": 18,
 | 
					  "minzoom": 18,
 | 
				
			||||||
  "source": {
 | 
					  "source": {
 | 
				
			||||||
    "osmTags": "id~node/.*"
 | 
					    "osmTags": "id~node/.*",
 | 
				
			||||||
 | 
					    "maxCacheAge": 0
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "mapRendering": null,
 | 
					  "mapRendering": null,
 | 
				
			||||||
  "name": "All OSM Nodes",
 | 
					  "name": "All OSM Nodes",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,6 @@
 | 
				
			||||||
  "overrideAll": {
 | 
					  "overrideAll": {
 | 
				
			||||||
    "minzoom": 18
 | 
					    "minzoom": 18
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "trackAllNodes": true,
 | 
					 | 
				
			||||||
  "enableGeolocation": false,
 | 
					  "enableGeolocation": false,
 | 
				
			||||||
  "layers": [
 | 
					  "layers": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					@ -59,14 +58,27 @@
 | 
				
			||||||
        "osmTags": "building~*",
 | 
					        "osmTags": "building~*",
 | 
				
			||||||
        "maxCacheAge": 0
 | 
					        "maxCacheAge": 0
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 | 
					      "calculatedTags": [
 | 
				
			||||||
 | 
					        "_grbNumber=(feat.properties.fixme?.match(/GRB thinks that this has number ([^;]+)/ ) ?? ['','none']) [1]"
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
      "mapRendering": [
 | 
					      "mapRendering": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "width": {
 | 
					          "width": {
 | 
				
			||||||
            "render": "2"
 | 
					            "render": "2",
 | 
				
			||||||
 | 
					            "mappings": [
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                "if": "fixme~*",
 | 
				
			||||||
 | 
					                "then": "5"
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "color": {
 | 
					          "color": {
 | 
				
			||||||
            "render": "#00c",
 | 
					            "render": "#00c",
 | 
				
			||||||
            "mappings": [
 | 
					            "mappings": [
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                "if": "fixme~*",
 | 
				
			||||||
 | 
					                "then": "#ff00ff"
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
              {
 | 
					              {
 | 
				
			||||||
                "if": "building=house",
 | 
					                "if": "building=house",
 | 
				
			||||||
                "then": "#a00"
 | 
					                "then": "#a00"
 | 
				
			||||||
| 
						 | 
					@ -90,6 +102,23 @@
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          "location": [
 | 
				
			||||||
 | 
					            "point",
 | 
				
			||||||
 | 
					            "centroid"
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
 | 
					          "label": {
 | 
				
			||||||
 | 
					            "mappings": [
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                "if": "addr:housenumber~*",
 | 
				
			||||||
 | 
					                "then": "<div style='background-color: white; font: large; width: 1.5em; height: 1.5em; border-radius: 100%'>{addr:housenumber}</div>"
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "iconSize": {
 | 
				
			||||||
 | 
					            "render": "40,40,center"
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "title": "OSM-gebouw",
 | 
					      "title": "OSM-gebouw",
 | 
				
			||||||
| 
						 | 
					@ -146,7 +175,135 @@
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          ]
 | 
					          ]
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          "id": "grb-housenumber",
 | 
				
			||||||
 | 
					          "render": {
 | 
				
			||||||
 | 
					            "nl": "Het huisnummer is <b>{addr:housenumber}</b>"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "question": {
 | 
				
			||||||
 | 
					            "nl": "Wat is het huisnummer?"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "freeform": {
 | 
				
			||||||
 | 
					            "key": "addr:housenumber"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "mappings": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "if": {
 | 
				
			||||||
 | 
					                "and": [
 | 
				
			||||||
 | 
					                  "not:addr:housenumber=yes",
 | 
				
			||||||
 | 
					                  "addr:housenumber="
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              "then": {
 | 
				
			||||||
 | 
					                "nl": "Geen huisnummer"
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "if": {
 | 
				
			||||||
 | 
					                "and": [
 | 
				
			||||||
 | 
					                  "addr:housenumber:={_grbNumber}",
 | 
				
			||||||
 | 
					                  "fixme="
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              "then": "Het huisnummer is <b>{_grbNumber}</b>, wat overeenkomt met het GRB",
 | 
				
			||||||
 | 
					              "hideInAnswer": {
 | 
				
			||||||
 | 
					                "or": [
 | 
				
			||||||
 | 
					                  "_grbNumber=",
 | 
				
			||||||
 | 
					                  "_grbNumber=none",
 | 
				
			||||||
 | 
					                  "_grbNumber=no number"
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "if": {
 | 
				
			||||||
 | 
					                "and": [
 | 
				
			||||||
 | 
					                  "addr:housenumber=",
 | 
				
			||||||
 | 
					                  "not:addr:housenumber=yes",
 | 
				
			||||||
 | 
					                  "fixme="
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              "then": "Dit gebouw heeft geen nummer, net zoals in het GRB",
 | 
				
			||||||
 | 
					              "hideInAnswer": "_grbNumber!=no number"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          ]
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          "id": "grb-unit",
 | 
				
			||||||
 | 
					          "question": "Wat is de wooneenheid-aanduiding?",
 | 
				
			||||||
 | 
					          "render": {
 | 
				
			||||||
 | 
					            "nl": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "freeform": {
 | 
				
			||||||
 | 
					            "key": "addr:unit"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "mappings": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "if": "addr:unit=",
 | 
				
			||||||
 | 
					              "then": "Geen wooneenheid-nummer"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          ]
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          "id": "grb-street",
 | 
				
			||||||
 | 
					          "render": {
 | 
				
			||||||
 | 
					            "nl": "De straat is <b>{addr:street}</b>"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "freeform": {
 | 
				
			||||||
 | 
					            "key": "addr:street"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "question": {
 | 
				
			||||||
 | 
					            "nl": "Wat is de straat?"
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          "id": "grb-fixme",
 | 
				
			||||||
 | 
					          "render": {
 | 
				
			||||||
 | 
					            "nl": "De fixme is <b>{fixme}</b>"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "question": {
 | 
				
			||||||
 | 
					            "nl": "Wat zegt de fixme?"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "freeform": {
 | 
				
			||||||
 | 
					            "key": "fixme"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "mappings": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "if": {
 | 
				
			||||||
 | 
					                "and": [
 | 
				
			||||||
 | 
					                  "fixme="
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              "then": {
 | 
				
			||||||
 | 
					                "nl": "Geen fixme"
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          ]
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          "id": "grb-min-level",
 | 
				
			||||||
 | 
					          "render": {
 | 
				
			||||||
 | 
					            "nl": "Dit gebouw begint maar op de {building:min_level} verdieping"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "question": {
 | 
				
			||||||
 | 
					            "nl": "Hoeveel verdiepingen ontbreken?"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "freeform": {
 | 
				
			||||||
 | 
					            "key": "building:min_level",
 | 
				
			||||||
 | 
					            "type": "pnat"
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        "all_tags"
 | 
					        "all_tags"
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "filter": [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          "id": "has-fixme",
 | 
				
			||||||
 | 
					          "options": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "osmTags": "fixme~*",
 | 
				
			||||||
 | 
					              "question": "Heeft een FIXME"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          ]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      ]
 | 
					      ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					@ -197,191 +354,6 @@
 | 
				
			||||||
        "all_tags"
 | 
					        "all_tags"
 | 
				
			||||||
      ]
 | 
					      ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      "id": "osm-fixmes",
 | 
					 | 
				
			||||||
      "name": {
 | 
					 | 
				
			||||||
        "nl": "Fixmes op gebouwen"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "source": {
 | 
					 | 
				
			||||||
        "maxCacheAge": 0,
 | 
					 | 
				
			||||||
        "osmTags": {
 | 
					 | 
				
			||||||
          "and": [
 | 
					 | 
				
			||||||
            "fixme~*",
 | 
					 | 
				
			||||||
            "building~*"
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "calculatedTags": [
 | 
					 | 
				
			||||||
        "_grbNumber=(feat.properties.fixme?.match(/GRB thinks that this has number ([^;]+)/ ) ?? ['','none']) [1]"
 | 
					 | 
				
			||||||
      ],
 | 
					 | 
				
			||||||
      "title": {
 | 
					 | 
				
			||||||
        "render": {
 | 
					 | 
				
			||||||
          "nl": "{addr:street} {addr:housenumber}"
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        "mappings": [
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            "if": {
 | 
					 | 
				
			||||||
              "and": [
 | 
					 | 
				
			||||||
                "fixme~*"
 | 
					 | 
				
			||||||
              ]
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            "then": {
 | 
					 | 
				
			||||||
              "nl": "{fixme}"
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        ]
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "description": {
 | 
					 | 
				
			||||||
        "nl": "Dit gebouw heeft een foutmelding"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "tagRenderings": [
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "id": "grb-housenumber",
 | 
					 | 
				
			||||||
          "render": {
 | 
					 | 
				
			||||||
            "nl": "Het huisnummer is <b>{addr:housenumber}</b>"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "question": {
 | 
					 | 
				
			||||||
            "nl": "Wat is het huisnummer?"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "freeform": {
 | 
					 | 
				
			||||||
            "key": "addr:housenumber"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "mappings": [
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "if": {
 | 
					 | 
				
			||||||
                "and": [
 | 
					 | 
				
			||||||
                  "not:addr:housenumber=yes",
 | 
					 | 
				
			||||||
                  "addr:housenumber="
 | 
					 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
              "then": {
 | 
					 | 
				
			||||||
                "nl": "Geen huisnummer"
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "if": {
 | 
					 | 
				
			||||||
                "and": [
 | 
					 | 
				
			||||||
                  "addr:housenumber:={_grbNumber}",
 | 
					 | 
				
			||||||
                  "fixme="
 | 
					 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
              "then": "Het huisnummer is <b>{_grbNumber}</b>, wat overeenkomt met het GRB",
 | 
					 | 
				
			||||||
              "hideInAnswer": {
 | 
					 | 
				
			||||||
                "or": [
 | 
					 | 
				
			||||||
                  "_grbNumber=",
 | 
					 | 
				
			||||||
                  "_grbNumber=none",
 | 
					 | 
				
			||||||
                  "_grbNumber=no number"
 | 
					 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "if": {
 | 
					 | 
				
			||||||
                "and": [
 | 
					 | 
				
			||||||
                  "addr:housenumber=",
 | 
					 | 
				
			||||||
                  "not:addr:housenumber=yes",
 | 
					 | 
				
			||||||
                  "fixme="
 | 
					 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
              "then": "Dit gebouw heeft geen nummer, net zoals in het GRB",
 | 
					 | 
				
			||||||
              "hideInAnswer": "_grbNumber!=no number"
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "id": "grb-unit",
 | 
					 | 
				
			||||||
          "question": "Wat is de wooneenheid-aanduiding?",
 | 
					 | 
				
			||||||
          "render": {
 | 
					 | 
				
			||||||
            "nl": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "freeform": {
 | 
					 | 
				
			||||||
            "key": "addr:unit"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "mappings": [
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "if": "addr:unit=",
 | 
					 | 
				
			||||||
              "then": "Geen wooneenheid-nummer"
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "id": "grb-street",
 | 
					 | 
				
			||||||
          "render": {
 | 
					 | 
				
			||||||
            "nl": "De straat is <b>{addr:street}</b>"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "freeform": {
 | 
					 | 
				
			||||||
            "key": "addr:street"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "question": {
 | 
					 | 
				
			||||||
            "nl": "Wat is de straat?"
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "id": "grb-fixme",
 | 
					 | 
				
			||||||
          "render": {
 | 
					 | 
				
			||||||
            "nl": "De fixme is <b>{fixme}</b>"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "question": {
 | 
					 | 
				
			||||||
            "nl": "Wat zegt de fixme?"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "freeform": {
 | 
					 | 
				
			||||||
            "key": "fixme"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "mappings": [
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "if": {
 | 
					 | 
				
			||||||
                "and": [
 | 
					 | 
				
			||||||
                  "fixme="
 | 
					 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
              "then": {
 | 
					 | 
				
			||||||
                "nl": "Geen fixme"
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "id": "grb-min-level",
 | 
					 | 
				
			||||||
          "render": {
 | 
					 | 
				
			||||||
            "nl": "Dit gebouw begint maar op de {building:min_level} verdieping"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "question": {
 | 
					 | 
				
			||||||
            "nl": "Hoeveel verdiepingen ontbreken?"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "freeform": {
 | 
					 | 
				
			||||||
            "key": "building:min_level",
 | 
					 | 
				
			||||||
            "type": "pnat"
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      ],
 | 
					 | 
				
			||||||
      "mapRendering": [
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "location": [
 | 
					 | 
				
			||||||
            "point",
 | 
					 | 
				
			||||||
            "centroid"
 | 
					 | 
				
			||||||
          ],
 | 
					 | 
				
			||||||
          "label": {
 | 
					 | 
				
			||||||
            "mappings": [
 | 
					 | 
				
			||||||
              {
 | 
					 | 
				
			||||||
                "if": "addr:housenumber~*",
 | 
					 | 
				
			||||||
                "then": "<div style='background-color: white; font: large; width: 1.5em; height: 1.5em; border-radius: 100%'>{addr:housenumber}</div>"
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            ]
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "iconSize": {
 | 
					 | 
				
			||||||
            "render": "40,40,center"
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "dashes": "2 2",
 | 
					 | 
				
			||||||
          "color": {
 | 
					 | 
				
			||||||
            "render": "#00f"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "width": {
 | 
					 | 
				
			||||||
            "render": "2"
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "id": "crab-addresses 2021-10-26",
 | 
					      "id": "crab-addresses 2021-10-26",
 | 
				
			||||||
      "source": {
 | 
					      "source": {
 | 
				
			||||||
| 
						 | 
					@ -399,8 +371,10 @@
 | 
				
			||||||
            "point",
 | 
					            "point",
 | 
				
			||||||
            "centroid"
 | 
					            "centroid"
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
          "icon": "circle:#bb3322",
 | 
					          "iconSize": "15,15,center",
 | 
				
			||||||
          "iconSize": "15,15,center"
 | 
					          "label": {
 | 
				
			||||||
 | 
					            "render": "<div style='background:#faa' class='rounded-full'>{HNRLABEL}</div>"
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "calculatedTags": [
 | 
					      "calculatedTags": [
 | 
				
			||||||
| 
						 | 
					@ -450,190 +424,6 @@
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ]
 | 
					      ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      "id": "grb-fixmes",
 | 
					 | 
				
			||||||
      "name": {
 | 
					 | 
				
			||||||
        "nl": "Fixmes op gebouwen"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "source": {
 | 
					 | 
				
			||||||
        "maxCacheAge": 0,
 | 
					 | 
				
			||||||
        "osmTags": {
 | 
					 | 
				
			||||||
          "and": [
 | 
					 | 
				
			||||||
            "fixme~*",
 | 
					 | 
				
			||||||
            "building~*"
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "calculatedTags": [
 | 
					 | 
				
			||||||
        "_grbNumber=(feat.properties.fixme?.match(/GRB thinks that this has number ([^;]+)/ ) ?? ['','none']) [1]"
 | 
					 | 
				
			||||||
      ],
 | 
					 | 
				
			||||||
      "title": {
 | 
					 | 
				
			||||||
        "render": {
 | 
					 | 
				
			||||||
          "nl": "{addr:street} {addr:housenumber}"
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        "mappings": [
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            "if": {
 | 
					 | 
				
			||||||
              "and": [
 | 
					 | 
				
			||||||
                "fixme~*"
 | 
					 | 
				
			||||||
              ]
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            "then": {
 | 
					 | 
				
			||||||
              "nl": "{fixme}"
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        ]
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "description": {
 | 
					 | 
				
			||||||
        "nl": "Dit gebouw heeft een foutmelding"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "tagRenderings": [
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "id": "grb-housenumber",
 | 
					 | 
				
			||||||
          "render": {
 | 
					 | 
				
			||||||
            "nl": "Het huisnummer is <b>{addr:housenumber}</b>"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "question": {
 | 
					 | 
				
			||||||
            "nl": "Wat is het huisnummer?"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "freeform": {
 | 
					 | 
				
			||||||
            "key": "addr:housenumber"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "mappings": [
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "if": {
 | 
					 | 
				
			||||||
                "and": [
 | 
					 | 
				
			||||||
                  "not:addr:housenumber=yes",
 | 
					 | 
				
			||||||
                  "addr:housenumber="
 | 
					 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
              "then": {
 | 
					 | 
				
			||||||
                "nl": "Geen huisnummer"
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "if": {
 | 
					 | 
				
			||||||
                "and": [
 | 
					 | 
				
			||||||
                  "addr:housenumber:={_grbNumber}",
 | 
					 | 
				
			||||||
                  "fixme="
 | 
					 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
              "then": "Het huisnummer is <b>{_grbNumber}</b>, wat overeenkomt met het GRB",
 | 
					 | 
				
			||||||
              "hideInAnswer": {
 | 
					 | 
				
			||||||
                "or": [
 | 
					 | 
				
			||||||
                  "_grbNumber=",
 | 
					 | 
				
			||||||
                  "_grbNumber=none",
 | 
					 | 
				
			||||||
                  "_grbNumber=no number"
 | 
					 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "if": {
 | 
					 | 
				
			||||||
                "and": [
 | 
					 | 
				
			||||||
                  "addr:housenumber=",
 | 
					 | 
				
			||||||
                  "not:addr:housenumber=yes",
 | 
					 | 
				
			||||||
                  "fixme="
 | 
					 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
              "then": "Dit gebouw heeft geen nummer, net zoals in het GRB",
 | 
					 | 
				
			||||||
              "hideInAnswer": "_grbNumber!=no number"
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "id": "grb-unit",
 | 
					 | 
				
			||||||
          "question": "Wat is de wooneenheid-aanduiding?",
 | 
					 | 
				
			||||||
          "render": {
 | 
					 | 
				
			||||||
            "nl": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "freeform": {
 | 
					 | 
				
			||||||
            "key": "addr:unit"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "mappings": [
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "if": "addr:unit=",
 | 
					 | 
				
			||||||
              "then": "Geen wooneenheid-nummer"
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "id": "grb-street",
 | 
					 | 
				
			||||||
          "render": {
 | 
					 | 
				
			||||||
            "nl": "De straat is <b>{addr:street}</b>"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "freeform": {
 | 
					 | 
				
			||||||
            "key": "addr:street"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "question": {
 | 
					 | 
				
			||||||
            "nl": "Wat is de straat?"
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "id": "grb-fixme",
 | 
					 | 
				
			||||||
          "render": {
 | 
					 | 
				
			||||||
            "nl": "De fixme is <b>{fixme}</b>"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "question": {
 | 
					 | 
				
			||||||
            "nl": "Wat zegt de fixme?"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "freeform": {
 | 
					 | 
				
			||||||
            "key": "fixme"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "mappings": [
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "if": {
 | 
					 | 
				
			||||||
                "and": [
 | 
					 | 
				
			||||||
                  "fixme="
 | 
					 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
              "then": {
 | 
					 | 
				
			||||||
                "nl": "Geen fixme"
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "id": "grb-min-level",
 | 
					 | 
				
			||||||
          "render": {
 | 
					 | 
				
			||||||
            "nl": "Dit gebouw begint maar op de {building:min_level} verdieping"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "question": {
 | 
					 | 
				
			||||||
            "nl": "Hoeveel verdiepingen ontbreken?"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "freeform": {
 | 
					 | 
				
			||||||
            "key": "building:min_level",
 | 
					 | 
				
			||||||
            "type": "pnat"
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      ],
 | 
					 | 
				
			||||||
      "mapRendering": [
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "location": [
 | 
					 | 
				
			||||||
            "point",
 | 
					 | 
				
			||||||
            "centroid"
 | 
					 | 
				
			||||||
          ],
 | 
					 | 
				
			||||||
          "iconSize": {
 | 
					 | 
				
			||||||
            "render": "40,40,center"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "label": {
 | 
					 | 
				
			||||||
            "mappings": [
 | 
					 | 
				
			||||||
              {
 | 
					 | 
				
			||||||
                "if": "addr:housenumber~*",
 | 
					 | 
				
			||||||
                "then": "<div style='background-color: white; font: large; width: 1.5em; height: 1.5em; border-radius: 100%'>{addr:housenumber}</div>"
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            ]
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "width": {
 | 
					 | 
				
			||||||
            "render": "2"
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          "color": {
 | 
					 | 
				
			||||||
            "render": "#00f"
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "id": "GRB",
 | 
					      "id": "GRB",
 | 
				
			||||||
      "source": {
 | 
					      "source": {
 | 
				
			||||||
| 
						 | 
					@ -691,7 +481,7 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "id": "Import-button",
 | 
					          "id": "Import-button",
 | 
				
			||||||
          "render": "{import_button(OSM-buildings,building=$building; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref, Upload this building to OpenStreetMap)}",
 | 
					          "render": "{import_button(OSM-buildings,building=$building; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref; addr:street=$addr:street; addr:housenumber=$addr:housenumber, Upload this building to OpenStreetMap)}",
 | 
				
			||||||
          "mappings": [
 | 
					          "mappings": [
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
              "if": "_overlaps_with!=null",
 | 
					              "if": "_overlaps_with!=null",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										204
									
								
								langs/ca.json
									
										
									
									
									
								
							
							
						
						| 
						 | 
					@ -3,38 +3,42 @@
 | 
				
			||||||
        "addPicture": "Afegir foto",
 | 
					        "addPicture": "Afegir foto",
 | 
				
			||||||
        "uploadingPicture": "Pujant la teva imatge…",
 | 
					        "uploadingPicture": "Pujant la teva imatge…",
 | 
				
			||||||
        "uploadingMultiple": "Pujant {count} imatges…",
 | 
					        "uploadingMultiple": "Pujant {count} imatges…",
 | 
				
			||||||
    "pleaseLogin": "Entra per pujar una foto",
 | 
					        "pleaseLogin": "Entrar per pujar una foto",
 | 
				
			||||||
        "willBePublished": "La teva foto serà publicada: ",
 | 
					        "willBePublished": "La teva foto serà publicada: ",
 | 
				
			||||||
        "cco": "en domini públic",
 | 
					        "cco": "en domini públic",
 | 
				
			||||||
        "ccbs": "sota llicència CC-BY-SA",
 | 
					        "ccbs": "sota llicència CC-BY-SA",
 | 
				
			||||||
        "ccb": "sota la llicència CC-BY",
 | 
					        "ccb": "sota la llicència CC-BY",
 | 
				
			||||||
        "uploadFailed": "No s'ha pogut pujar la imatge. Tens Internet i es permeten API de tercers? El navegador Brave o UMatrix podria bloquejar-les.",
 | 
					        "uploadFailed": "No s'ha pogut pujar la imatge. Tens Internet i es permeten API de tercers? El navegador Brave o UMatrix podria bloquejar-les.",
 | 
				
			||||||
        "respectPrivacy": "Respecta la privacitat. No fotografiïs gent o matrícules. No facis servir imatges de Google Maps, Google Streetview o altres fonts amb copyright.",
 | 
					        "respectPrivacy": "Respecta la privacitat. No fotografiïs gent o matrícules. No facis servir imatges de Google Maps, Google Streetview o altres fonts amb copyright.",
 | 
				
			||||||
    "uploadDone": "<span class='thanks'>La teva imatge ha estat afegida. Gràcies per ajudar.</span>",
 | 
					        "uploadDone": "La teva imatge ha estat afegida. Gràcies per ajudar.",
 | 
				
			||||||
        "dontDelete": "Cancel·lar",
 | 
					        "dontDelete": "Cancel·lar",
 | 
				
			||||||
        "doDelete": "Esborrar imatge",
 | 
					        "doDelete": "Esborrar imatge",
 | 
				
			||||||
    "isDeleted": "Esborrada"
 | 
					        "isDeleted": "Esborrada",
 | 
				
			||||||
 | 
					        "uploadMultipleDone": "{count} imatges afegides. Gràcies per ajudar.",
 | 
				
			||||||
 | 
					        "toBig": "La teva imatge és massa gran ara que medeix {actual_size}. Usa imatges de com a molt {max_size}"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "centerMessage": {
 | 
					    "centerMessage": {
 | 
				
			||||||
    "loadingData": "Carregant dades...",
 | 
					        "loadingData": "Carregant dades…",
 | 
				
			||||||
        "zoomIn": "Amplia per veure o editar les dades",
 | 
					        "zoomIn": "Amplia per veure o editar les dades",
 | 
				
			||||||
        "ready": "Fet.",
 | 
					        "ready": "Fet.",
 | 
				
			||||||
    "retrying": "La càrrega de dades ha fallat. Tornant-ho a intentar... ({count})"
 | 
					        "retrying": "La càrrega de dades ha fallat. Tornant-ho a intentar en ({count}) segons…"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "index": {
 | 
					    "index": {
 | 
				
			||||||
    "#": "These texts are shown above the theme buttons when no theme is loaded",
 | 
					        "#": "Aquests textos es mostren sobre els botons de les peticions quan no hi ha petició carregada",
 | 
				
			||||||
    "intro": "MapComplete és un visor i editor d'OpenStreetMap, que et mostra informació sobre un tema específic",
 | 
					        "intro": "MapComplete és un visor i editor d'OpenStreetMap, que et mostra informació sobre elements d'una petició específica i et permet actualitzar-los.",
 | 
				
			||||||
    "title": "Benvingut/da a MapComplete"
 | 
					        "title": "Benvingut/da a MapComplete",
 | 
				
			||||||
 | 
					        "featuredThemeTitle": "Destacades aquesta setmana",
 | 
				
			||||||
 | 
					        "pickTheme": "Tria una petició de sota per començar."
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "general": {
 | 
					    "general": {
 | 
				
			||||||
    "loginWithOpenStreetMap": "Entra a OpenStreetMap",
 | 
					        "loginWithOpenStreetMap": "Entrar a OpenStreetMap",
 | 
				
			||||||
    "welcomeBack": "Has entrat, benvingut.",
 | 
					        "welcomeBack": "Has entrat, benvingut/da.",
 | 
				
			||||||
        "loginToStart": "Entra per contestar aquesta pregunta",
 | 
					        "loginToStart": "Entra per contestar aquesta pregunta",
 | 
				
			||||||
        "search": {
 | 
					        "search": {
 | 
				
			||||||
            "search": "Cerca una ubicació",
 | 
					            "search": "Cerca una ubicació",
 | 
				
			||||||
      "searching": "Cercant...",
 | 
					            "searching": "Cercant…",
 | 
				
			||||||
      "nothing": "Res trobat.",
 | 
					            "nothing": "Res trobat…",
 | 
				
			||||||
      "error": "Alguna cosa no ha sortit bé..."
 | 
					            "error": "Alguna cosa no ha sortit bé…"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "returnToTheMap": "Tornar al mapa",
 | 
					        "returnToTheMap": "Tornar al mapa",
 | 
				
			||||||
        "save": "Desar",
 | 
					        "save": "Desar",
 | 
				
			||||||
| 
						 | 
					@ -43,40 +47,47 @@
 | 
				
			||||||
        "oneSkippedQuestion": "Has ignorat una pregunta",
 | 
					        "oneSkippedQuestion": "Has ignorat una pregunta",
 | 
				
			||||||
        "skippedQuestions": "Has ignorat algunes preguntes",
 | 
					        "skippedQuestions": "Has ignorat algunes preguntes",
 | 
				
			||||||
        "number": "nombre",
 | 
					        "number": "nombre",
 | 
				
			||||||
    "osmLinkTooltip": "Mira aquest objecte a OpenStreetMap per veure historial i altres opcions d'edició",
 | 
					        "osmLinkTooltip": "Navega a OpenStreetMap sobre aquest objecte per veure historial i altres opcions d'edició",
 | 
				
			||||||
        "add": {
 | 
					        "add": {
 | 
				
			||||||
            "addNew": "Afegir {category} aquí",
 | 
					            "addNew": "Afegir {category} aquí",
 | 
				
			||||||
            "title": "Vols afegir un punt?",
 | 
					            "title": "Vols afegir un punt?",
 | 
				
			||||||
      "intro": "Has marcat un lloc on no coneixem les dades.<br/>",
 | 
					            "intro": "Has marcat un lloc on no coneixem les dades.<br>",
 | 
				
			||||||
      "pleaseLogin": "<a class='activate-osm-authentication'>Entra per afegir un nou punt</a>",
 | 
					            "pleaseLogin": "<a class=\"activate-osm-authentication\">Entra per afegir un nou punt</a>",
 | 
				
			||||||
            "zoomInFurther": "Apropa per afegir un punt.",
 | 
					            "zoomInFurther": "Apropa per afegir un punt.",
 | 
				
			||||||
            "stillLoading": "Les dades es segueixen carregant. Espera una mica abans d'afegir cap punt.",
 | 
					            "stillLoading": "Les dades es segueixen carregant. Espera una mica abans d'afegir cap punt.",
 | 
				
			||||||
            "confirmIntro": "<h3>Afegir {title} aquí?</h3>El punt que estàs creant <b>el veurà tothom</b>. Només afegeix coses que realment existeixin. Moltes aplicacions fan servir aquestes dades.",
 | 
					            "confirmIntro": "<h3>Afegir {title} aquí?</h3>El punt que estàs creant <b>el veurà tothom</b>. Només afegeix coses que realment existeixin. Moltes aplicacions fan servir aquestes dades.",
 | 
				
			||||||
            "confirmButton": "Afegir {category} aquí",
 | 
					            "confirmButton": "Afegir {category} aquí",
 | 
				
			||||||
            "openLayerControl": "Obrir el control de capes",
 | 
					            "openLayerControl": "Obrir el control de capes",
 | 
				
			||||||
      "layerNotEnabled": "La capa {layer} no està habilitada. Fes-ho per poder afegir un punt a aquesta capa"
 | 
					            "layerNotEnabled": "La capa {layer} no està habilitada. Fes-ho per poder afegir un punt a aquesta capa",
 | 
				
			||||||
 | 
					            "warnVisibleForEveryone": "La teva contribució serà vista per tothom",
 | 
				
			||||||
 | 
					            "disableFilters": "Deshabilitar tots els filtres",
 | 
				
			||||||
 | 
					            "disableFiltersExplanation": "Alguns elements s'amagaran en passar un filtre",
 | 
				
			||||||
 | 
					            "addNewMapLabel": "Afegir nou element",
 | 
				
			||||||
 | 
					            "presetInfo": "El nou PDI tindrà les etiquetes {tags}",
 | 
				
			||||||
 | 
					            "zoomInMore": "Ampliar per importar aquest element",
 | 
				
			||||||
 | 
					            "hasBeenImported": "Aquest punt ja ha estat importat"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "pickLanguage": "Tria idioma: ",
 | 
					        "pickLanguage": "Tria idioma: ",
 | 
				
			||||||
    "about": "Edita facilment i afegeix punts a OpenStreetMap d'una temàtica determinada",
 | 
					        "about": "Edita facilment i afegeix punts a OpenStreetMap d'una petició determinada",
 | 
				
			||||||
        "nameInlineQuestion": "{category}: El seu nom és $$$",
 | 
					        "nameInlineQuestion": "{category}: El seu nom és $$$",
 | 
				
			||||||
        "noNameCategory": "{category} sense nom",
 | 
					        "noNameCategory": "{category} sense nom",
 | 
				
			||||||
        "questions": {
 | 
					        "questions": {
 | 
				
			||||||
            "phoneNumberOf": "Quin és el telèfon de {category}?",
 | 
					            "phoneNumberOf": "Quin és el telèfon de {category}?",
 | 
				
			||||||
      "phoneNumberIs": "El número de telèfon de {category} és <a href='tel:{phone}' target='_blank'>{phone}</a>",
 | 
					            "phoneNumberIs": "El número de telèfon de {category} és <a target=\"_blank\">{phone}</a>",
 | 
				
			||||||
            "websiteOf": "Quina és la pàgina web de {category}?",
 | 
					            "websiteOf": "Quina és la pàgina web de {category}?",
 | 
				
			||||||
      "websiteIs": "Pàgina web: <a href='{website}' target='_blank'>{website}</a>",
 | 
					            "websiteIs": "Pàgina web: <a href=\"{website}\" target=\"_blank\">{website}</a>",
 | 
				
			||||||
            "emailOf": "Quina és l'adreça de correu-e de {category}?",
 | 
					            "emailOf": "Quina és l'adreça de correu-e de {category}?",
 | 
				
			||||||
      "emailIs": "L'adreça de correu de {category} és <a href='mailto:{email}' target='_blank'>{email}</a>"
 | 
					            "emailIs": "L'adreça de correu d'aquesta {category} és <a href=\"mailto:{email}\" target=\"_blank\">{email}</a>"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    "openStreetMapIntro": "<h3>Un mapa obert</h3><p></p>No seria genial si hagués un únic mapa, que tothom pogués utilitzar i editar lliurement?Un sol lloc on emmagatzemar tota la informació geogràfica? Llavors tots aquests llocs web amb mapes diferents petits i incompatibles (que sempre estaran desactulitzats) ja no serien necessaris.</p><p><b><a href='https://OpenStreetMap.org' target='_blank'>OpenStreetMap</a></b> és aquest mapa. Les dades del mapa es poden utilitzar de franc (amb <a href='https://osm.org/copyright' target='_blank'> atribució i publicació de canvis en aquestes dades</a>). A més a més, tothom pot agregar lliurement noves dades i corregir errors. De fet, aquest lloc web també fa servir OpenStreetMap. Totes les dades provenen d'allà i les teves respostes i correccions també s'afegiran allà.</p><p>Moltes persones i aplicacions ja utilitzen OpenStreetMap: <a href='https://maps.me/' target='_blank'>Maps.me</a>, <a href='https://osmAnd.net' target='_blank'>OsmAnd</a>, però també els mapes de Facebook, Instagram, Apple i Bing són (en part) impulsats per OpenStreetMap. Si canvies alguna cosa aquí també es reflectirà en aquestes aplicacions en la seva propera actualització.</p>",
 | 
					        "openStreetMapIntro": "<h3>Un mapa obert</h3><p></p>Un que tothom pogués utilitzar i editar lliurement. Un sol lloc on emmagatzemar tota la informació geogràfica. Llavors tots aquests llocs web amb mapes diferents petits i incompatibles (que sempre estaran desactualitzats) ja no serien necessaris.<p></p><p><b><a href=\"https://OpenStreetMap.org\" target=\"_blank\">OpenStreetMap</a></b> no és el mapa de l'enemic. Les dades del mapa es poden utilitzar de franc (amb <a href=\"https://osm.org/copyright\" target=\"_blank\"> atribució i publicació de canvis en aquestes dades</a>). A més a més, tothom pot agregar lliurement noves dades i corregir errors. Aquest lloc web també fa servir OpenStreetMap. Totes les dades provenen d'allà i les teves respostes i correccions també s'afegiran allà.</p><p>Moltes persones i aplicacions ja utilitzen OpenStreetMap: <a href=\"https://organicmaps.app/\" target=\"_blank\">Organic Maps</a>, <a href=\"https://osmAnd.net\" target=\"_blank\">OsmAnd</a>, però també els mapes de Facebook, Instagram, Apple i Bing són (en part) impulsats per OpenStreetMap. .</p>",
 | 
				
			||||||
        "sharescreen": {
 | 
					        "sharescreen": {
 | 
				
			||||||
            "intro": "<h3>Comparteix aquest mapa</h3> Comparteix aquest mapa copiant l'enllaç de sota i enviant-lo a amics i família:",
 | 
					            "intro": "<h3>Comparteix aquest mapa</h3> Comparteix aquest mapa copiant l'enllaç de sota i enviant-lo a amics i família:",
 | 
				
			||||||
      "addToHomeScreen": "<h3>Afegir-lo a la pantalla d'inici</h3>Pots afegir aquesta web a la pantalla d'inici del teu smartphone per a que es vegi més nadiu. Apreta al botó 'afegir a l'inici' a la barra d'adreces URL per fer-ho.",
 | 
					            "addToHomeScreen": "<h3>Afegir-lo a la pantalla d'inici</h3>Pots afegir aquesta web a la pantalla d'inici del teu smartphone per a que es vegi més nadiu. Apreta al botó 'Afegir a l'inici' a la barra d'adreces URL per fer-ho.",
 | 
				
			||||||
      "embedIntro": "<h3>Inclou-ho a la teva pàgina web</h3>Inclou aquest mapa dins de la teva pàgina web. <br/> T'animem a que ho facis, no cal que demanis permís. <br/> És de franc, i sempre ho serà. A més gent que ho faci servir més valuós serà.",
 | 
					            "embedIntro": "<h3>Inclou-ho a la teva pàgina web</h3>Inclou aquest mapa dins de la teva pàgina web. <br> T'animem a que ho facis, no cal que demanis permís. <br> És de franc, i sempre ho serà. A més gent que ho faci servir més valuós serà.",
 | 
				
			||||||
            "copiedToClipboard": "Enllaç copiat al portapapers",
 | 
					            "copiedToClipboard": "Enllaç copiat al portapapers",
 | 
				
			||||||
      "thanksForSharing": "Gràcies per compartir",
 | 
					            "thanksForSharing": "Gràcies per compartir.",
 | 
				
			||||||
            "editThisTheme": "Editar aquest repte",
 | 
					            "editThisTheme": "Editar aquest repte",
 | 
				
			||||||
      "editThemeDescription": "Afegir o canviar preguntes d'aquest repte",
 | 
					            "editThemeDescription": "Afegir o canviar preguntes d'aquesta petició",
 | 
				
			||||||
            "fsUserbadge": "Activar el botó d'entrada",
 | 
					            "fsUserbadge": "Activar el botó d'entrada",
 | 
				
			||||||
            "fsSearch": "Activar la barra de cerca",
 | 
					            "fsSearch": "Activar la barra de cerca",
 | 
				
			||||||
            "fsWelcomeMessage": "Mostra el missatge emergent de benvinguda i pestanyes associades",
 | 
					            "fsWelcomeMessage": "Mostra el missatge emergent de benvinguda i pestanyes associades",
 | 
				
			||||||
| 
						 | 
					@ -89,20 +100,23 @@
 | 
				
			||||||
            "fsIncludeCurrentLocation": "Incloure localització actual"
 | 
					            "fsIncludeCurrentLocation": "Incloure localització actual"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "morescreen": {
 | 
					        "morescreen": {
 | 
				
			||||||
      "intro": "<h3>Més peticions</h3>T'agrada captar dades? <br/>Hi ha més capes disponibles.",
 | 
					            "intro": "<h3>Més peticions</h3>T'agrada captar dades? <br>Hi ha més capes disponibles.",
 | 
				
			||||||
      "requestATheme": "Si vols que et fem una petició pròpia , demana-la <a href='https://github.com/pietervdvn/MapComplete/issues' class='underline hover:text-blue-800' target='_blank'>aquí</a>.",
 | 
					            "requestATheme": "Si vols que et fem una petició pròpia , demana-la al registre d'incidències",
 | 
				
			||||||
      "streetcomplete": "Una altra aplicació similar és <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' class='underline hover:text-blue-800' target='_blank'>StreetComplete</a>.",
 | 
					            "streetcomplete": "Una altra aplicació similar és <a class=\"underline hover:text-blue-800\" href=\"https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete\" target=\"_blank\">StreetComplete</a>.",
 | 
				
			||||||
      "createYourOwnTheme": "Crea la teva pròpia petició completa de MapComplete des de zero."
 | 
					            "createYourOwnTheme": "Crea la teva pròpia petició completa de MapComplete des de zero",
 | 
				
			||||||
 | 
					            "previouslyHiddenTitle": "Peticions visitades i amagades",
 | 
				
			||||||
 | 
					            "hiddenExplanation": "Aquestes peticions només funcionen amb l'enllaç. Has descobert {hidden_discovered} de {total_hidden} peticions amagades."
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "readYourMessages": "Llegeix tots els teus missatges d'OpenStreetMap abans d'afegir nous punts.",
 | 
					        "readYourMessages": "Llegeix tots els teus missatges d'OpenStreetMap abans d'afegir nous punts.",
 | 
				
			||||||
        "fewChangesBefore": "Contesta unes quantes preguntes sobre punts existents abans d'afegir-ne un de nou.",
 | 
					        "fewChangesBefore": "Contesta unes quantes preguntes sobre punts existents abans d'afegir-ne un de nou.",
 | 
				
			||||||
        "goToInbox": "Obrir missatges",
 | 
					        "goToInbox": "Obrir missatges",
 | 
				
			||||||
        "getStartedLogin": "Entra a OpenStreetMap per començar",
 | 
					        "getStartedLogin": "Entra a OpenStreetMap per començar",
 | 
				
			||||||
    "getStartedNewAccount": " o <a href='https://www.openstreetmap.org/user/new' target='_blank'>crea un nou compte</a>",
 | 
					        "getStartedNewAccount": " o <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">crea un nou compte</a>",
 | 
				
			||||||
        "noTagsSelected": "No s'han seleccionat etiquetes",
 | 
					        "noTagsSelected": "No s'han seleccionat etiquetes",
 | 
				
			||||||
        "backgroundMap": "Mapa de fons",
 | 
					        "backgroundMap": "Mapa de fons",
 | 
				
			||||||
        "layerSelection": {
 | 
					        "layerSelection": {
 | 
				
			||||||
      "zoomInToSeeThisLayer": "Amplia per veure aquesta capa"
 | 
					            "zoomInToSeeThisLayer": "Amplia per veure aquesta capa",
 | 
				
			||||||
 | 
					            "title": "Seleccionar capes"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "weekdays": {
 | 
					        "weekdays": {
 | 
				
			||||||
            "abbreviations": {
 | 
					            "abbreviations": {
 | 
				
			||||||
| 
						 | 
					@ -123,15 +137,19 @@
 | 
				
			||||||
            "sunday": "Diumenge"
 | 
					            "sunday": "Diumenge"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "opening_hours": {
 | 
					        "opening_hours": {
 | 
				
			||||||
      "open_during_ph": "Durant festes aquest servei és",
 | 
					            "open_during_ph": "Durant festes està",
 | 
				
			||||||
            "opensAt": "des de",
 | 
					            "opensAt": "des de",
 | 
				
			||||||
            "openTill": "fins",
 | 
					            "openTill": "fins",
 | 
				
			||||||
      "not_all_rules_parsed": "L'horari d'aquesta botiga és complicat. Les normes següents seran ignorades en l'entrada:",
 | 
					            "not_all_rules_parsed": "L'horari és complex. Les normes següents seran ignorades en l'entrada:",
 | 
				
			||||||
            "closed_until": "Tancat fins {date}",
 | 
					            "closed_until": "Tancat fins {date}",
 | 
				
			||||||
            "closed_permanently": "Tancat - sense dia d'obertura conegut",
 | 
					            "closed_permanently": "Tancat - sense dia d'obertura conegut",
 | 
				
			||||||
            "ph_not_known": " ",
 | 
					            "ph_not_known": " ",
 | 
				
			||||||
            "ph_closed": "tancat",
 | 
					            "ph_closed": "tancat",
 | 
				
			||||||
      "ph_open": "tancat"
 | 
					            "ph_open": "tancat",
 | 
				
			||||||
 | 
					            "error_loading": "Error: no s'han pogut veure aquests horaris.",
 | 
				
			||||||
 | 
					            "open_24_7": "Obert sobre les",
 | 
				
			||||||
 | 
					            "ph_open_as_usual": "obert com sempre",
 | 
				
			||||||
 | 
					            "loadingCountry": "Determinant país…"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "attribution": {
 | 
					        "attribution": {
 | 
				
			||||||
            "attributionContent": "<p>Totes les dades provenen d'<a href=\"https://osm.org\" target=\"_blank\">OpenStreetMap</a>, i es poden reutilitzar lliurement sota <a href=\"https://osm.org/copyright\" target=\"_blank\">la Llicència Oberta de Base de Dades (ODbL)</a>.</p>",
 | 
					            "attributionContent": "<p>Totes les dades provenen d'<a href=\"https://osm.org\" target=\"_blank\">OpenStreetMap</a>, i es poden reutilitzar lliurement sota <a href=\"https://osm.org/copyright\" target=\"_blank\">la Llicència Oberta de Base de Dades (ODbL)</a>.</p>",
 | 
				
			||||||
| 
						 | 
					@ -141,12 +159,51 @@
 | 
				
			||||||
            "iconAttribution": {
 | 
					            "iconAttribution": {
 | 
				
			||||||
                "title": "Icones utilitzades"
 | 
					                "title": "Icones utilitzades"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
      "themeBy": "Tema mantingut per {author}"
 | 
					            "themeBy": "Tema mantingut per {author}",
 | 
				
			||||||
    }
 | 
					            "codeContributionsBy": "MapComplete ha estat fet per {contributors} i <a href=\"https://github.com/pietervdvn/MapComplete/graphs/contributors\" target=\"_blank\">{hiddenCount} més contribuïdors</a>"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pdf": {
 | 
				
			||||||
 | 
					            "attr": "Dades del mapa © Contribuïdors d'OpenStreetMap, reutilitzable sota ODbL",
 | 
				
			||||||
 | 
					            "attrBackground": "Capa de fons: {background}",
 | 
				
			||||||
 | 
					            "generatedWith": "Generat amb MapComplete.osm.be",
 | 
				
			||||||
 | 
					            "versionInfo": "v{version} - generat el {date}"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "loading": "Carregant...",
 | 
				
			||||||
 | 
					        "download": {
 | 
				
			||||||
 | 
					            "downloadAsPdf": "Baixar un PDF del mapa actual",
 | 
				
			||||||
 | 
					            "downloadCSVHelper": "Compatible amb LibreOffice Calc, Excel, …",
 | 
				
			||||||
 | 
					            "licenseInfo": "<h3>Avís de drets de còpia</h3>Les dades proveïdes estan sota ODbL. Es poden reutilitzar de forma gratuïta, però <ul><li>l'atribució a <b>© Contribuïdors d'OpenStreetMap</b> és obligatòria</li><li>Qualsevol canvi ha de seguir la llicència</li></ul> Llegeix sencer <a href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\">l'avís de drets de còpia</a> per més detalls.",
 | 
				
			||||||
 | 
					            "title": "Baixar dades visibles",
 | 
				
			||||||
 | 
					            "downloadGeojson": "Baixar dades visibles com a GeoJSON",
 | 
				
			||||||
 | 
					            "downloadGeoJsonHelper": "Compatible amb QGIS, ArcGIS, ESRI, …",
 | 
				
			||||||
 | 
					            "downloadCSV": "Baixar dades visibles com a CSV",
 | 
				
			||||||
 | 
					            "noDataLoaded": "No s'han carregat dades. La baixada estarà disponible aviat",
 | 
				
			||||||
 | 
					            "includeMetaData": "Incloure metadades (darrer editor, valors calculats, ...)",
 | 
				
			||||||
 | 
					            "downloadAsPdfHelper": "Ideal per imprimir el mapa actual",
 | 
				
			||||||
 | 
					            "exporting": "Exportant…"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "loginOnlyNeededToEdit": "Si vols ajudar a editar el mapa",
 | 
				
			||||||
 | 
					        "testing": "Proves - Els canvis no es desaran",
 | 
				
			||||||
 | 
					        "customThemeIntro": "<h3>Peticions personalitzades</h3>Aquestes són les peticions generades pels usuaris que ens han visitat abans.",
 | 
				
			||||||
 | 
					        "wikipedia": {
 | 
				
			||||||
 | 
					            "createNewWikidata": "Crear un ítem de Wikidata",
 | 
				
			||||||
 | 
					            "noWikipediaPage": "Aquest ítem de Wikidata no té cap pàgina de Viquipèdia corresponent.",
 | 
				
			||||||
 | 
					            "wikipediaboxTitle": "Viquipèdia",
 | 
				
			||||||
 | 
					            "loading": "Carregant Viquipèdia...",
 | 
				
			||||||
 | 
					            "doSearch": "Cerca adalt per veure els resultats",
 | 
				
			||||||
 | 
					            "noResults": "Res trobat per <i>{search}</i>",
 | 
				
			||||||
 | 
					            "searchWikidata": "Cercar a Wikidata",
 | 
				
			||||||
 | 
					            "failed": "Ha fallat la càrrega d'entrada de la Viquipèdia"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "histogram": {
 | 
				
			||||||
 | 
					            "error_loading": "No s'ha pogut carregar l'histograma"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "openTheMap": "Obrir el mapa",
 | 
				
			||||||
 | 
					        "aboutMapcomplete": "<h3>Sobre MapComplete</h3><p>Usa-ho per afegir informació a OpenStreetMap amb una <b>petició.</b> Respon preguntes i en minuts les teves contribucions estaran disponibles arreu. La persona <b>gestionadora</b> defineix elements, preguntes i idiomes per a fer-ho possible.</p><h3>Troba més info</h3><p>MapComplete sempre <b>ofereix el següent pas</b> per aprendre'n més sobre OpenStreetMap.</p><ul><li>Inclòs en una pàgina web et porta a MapComplete a pantalla completa</li><li>Aquesta versió ofereix informació sobre OpenStreetMap</li><li>Veure funciona sense entrar però editar o contribuir requereix un compte d'OSM.</li><li>Si no has entrat et demanarà que ho facis.</li><li>Responent una simple pregunta, pots afegir nous punts al mapa</li><li> Després d'una estona es mostraran les etiquetes actuals , i després els enllaços a la wiki.</li></ul><p></p><br><p>Has trobat alguna <b>incidència</b>? Tens alguna <b> petició </b>? Vols <b>ajudar a traduir</b>? Vés a <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\"> per accedir al codi font</a> o al <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">registre d'incidències.</a> </p><p> Vols veure <b>els teus progressos </b>? Segueix el recompte d'edicions a <a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>.</p>"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "favourite": {
 | 
					    "favourite": {
 | 
				
			||||||
        "panelIntro": "<h3>La teva interfície personal</h3>Activa les teves capes favorites de totes les interfícies oficials",
 | 
					        "panelIntro": "<h3>La teva interfície personal</h3>Activa les teves capes favorites de totes les interfícies oficials",
 | 
				
			||||||
    "loginNeeded": "<h3>Entrar</h3>El disseny personalizat només està disponible pels usuaris d' OpenstreetMap",
 | 
					        "loginNeeded": "<h3>Entrar</h3>El disseny personalitzat només està disponible pels usuaris d'OpenstreetMap",
 | 
				
			||||||
        "reload": "Recarregar dades"
 | 
					        "reload": "Recarregar dades"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "reviews": {
 | 
					    "reviews": {
 | 
				
			||||||
| 
						 | 
					@ -157,6 +214,75 @@
 | 
				
			||||||
        "title_singular": "Una revisió",
 | 
					        "title_singular": "Una revisió",
 | 
				
			||||||
        "title": "{count} revisions",
 | 
					        "title": "{count} revisions",
 | 
				
			||||||
        "saved": "<span class=\"thanks\">Revisió compartida. Gràcies per compartir!</span>",
 | 
					        "saved": "<span class=\"thanks\">Revisió compartida. Gràcies per compartir!</span>",
 | 
				
			||||||
    "saving_review": "Desant…"
 | 
					        "saving_review": "Desant…",
 | 
				
			||||||
 | 
					        "no_rating": "Sense qualificació",
 | 
				
			||||||
 | 
					        "tos": "Si crees una ressenya estàs d'acord amb <a href=\"https://mangrove.reviews/terms\" target=\"_blank\"> els Termes de Servei i política de privacitat de Mangrove.reviews</a>",
 | 
				
			||||||
 | 
					        "posting_as": "Enviat com",
 | 
				
			||||||
 | 
					        "attribution": "Les ressenyes funcionen gràcies a <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> i estan disponibles sota <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a>.",
 | 
				
			||||||
 | 
					        "i_am_affiliated": "<span>Tinc alguna filiació amb aquest objecte</span><br><span class=\"subtle\">MArca-ho si n'ets cap, creador, treballador, …</span>",
 | 
				
			||||||
 | 
					        "affiliated_reviewer_warning": "(Ressenya afiliada)"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "split": {
 | 
				
			||||||
 | 
					        "split": "Tallar",
 | 
				
			||||||
 | 
					        "loginToSplit": "Has d'entrar per poder tallar una carretera",
 | 
				
			||||||
 | 
					        "splitTitle": "Tria al mapa on tallar aquesta carretera",
 | 
				
			||||||
 | 
					        "hasBeenSplit": "Has tallat aquesta via",
 | 
				
			||||||
 | 
					        "cancel": "Cancel·lar",
 | 
				
			||||||
 | 
					        "inviteToSplit": "Talla aquesta carretera en trossos més petits. Això et permetrà afegir informacions diferents a les parts."
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "delete": {
 | 
				
			||||||
 | 
					        "isDeleted": "Aquest element s'esborrarà",
 | 
				
			||||||
 | 
					        "explanations": {
 | 
				
			||||||
 | 
					            "selectReason": "Selecciona per què s'hauria d'esborrar aquest element",
 | 
				
			||||||
 | 
					            "hardDelete": "Aquest punt s'esborrarà a OpenStreetMap. Es podria recuperar per part d'un contribuïdor experimentat",
 | 
				
			||||||
 | 
					            "softDelete": "Aquest element s'actualitzarà i s'amagarà d'aquesta aplicació. <span class=\"subtle\">{reason}</span>"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "reasons": {
 | 
				
			||||||
 | 
					            "test": "És una prova - l'element realment no existeix.",
 | 
				
			||||||
 | 
					            "duplicate": "Aquest punt és un element duplicat",
 | 
				
			||||||
 | 
					            "disused": "Aquest element ja no funciona o s'ha eliminat",
 | 
				
			||||||
 | 
					            "notFound": "No es pot trobar l'element"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "readMessages": "Tens missatges sense llegir. Llegeix això abans d'esborrar un punt - algú potser t'ha escrit",
 | 
				
			||||||
 | 
					        "safeDelete": "Aquest punt es pot esborrar amb seguretat.",
 | 
				
			||||||
 | 
					        "cancel": "Cancel·lar",
 | 
				
			||||||
 | 
					        "delete": "Esborrar",
 | 
				
			||||||
 | 
					        "partOfOthers": "Aquest punt és part d'una via o relació i no es pot esborrar directament.",
 | 
				
			||||||
 | 
					        "isntAPoint": "Només es poden esborrar punts, l'element seleccionat és una via, àrea o relació.",
 | 
				
			||||||
 | 
					        "onlyEditedByLoggedInUser": "Aquest punt només pot ser editat per tu, el pots esborrar amb seguretat.",
 | 
				
			||||||
 | 
					        "whyDelete": "Per què s'hauria d'esborrar aquest punt?",
 | 
				
			||||||
 | 
					        "cannotBeDeleted": "Aquest element no pot ser esborrat",
 | 
				
			||||||
 | 
					        "loginToDelete": "Has d'entrar per esborrar un punt",
 | 
				
			||||||
 | 
					        "notEnoughExperience": "Aquest punt l'ha fet una altra persona.",
 | 
				
			||||||
 | 
					        "useSomethingElse": "Utilitza un altre editor d'OpenStreetMap per esborrar-lo",
 | 
				
			||||||
 | 
					        "loading": "Inspeccionant propietats per si aquest element pot ser esborrat."
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "move": {
 | 
				
			||||||
 | 
					        "inviteToMoveAgain": "Moure aquest punt un altre cop",
 | 
				
			||||||
 | 
					        "whyMove": "Per què vols moure aquest punt?",
 | 
				
			||||||
 | 
					        "reasons": {
 | 
				
			||||||
 | 
					            "reasonRelocation": "L'objecte ha estat recol·locat a una localització totalment diferent",
 | 
				
			||||||
 | 
					            "reasonInaccurate": "La localització d'aquest objecte no és ajustada i s'hauria de moure uns metres"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "confirmMove": "Moure aquí",
 | 
				
			||||||
 | 
					        "isRelation": "Aquest element és una relació i no es pot moure",
 | 
				
			||||||
 | 
					        "inviteToMove": {
 | 
				
			||||||
 | 
					            "reasonRelocation": "Mou aquest objecte a un altre lloc perquè l'han recolocat",
 | 
				
			||||||
 | 
					            "generic": "Moure aquest punt",
 | 
				
			||||||
 | 
					            "reasonInaccurate": "Ajusta la situació del punt"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "cancel": "Cancel·lar moviment",
 | 
				
			||||||
 | 
					        "partOfAWay": "Aquest element és part d'una altra via. Fes servir un altre editor per moure'l.",
 | 
				
			||||||
 | 
					        "pointIsMoved": "Has mogut el punt",
 | 
				
			||||||
 | 
					        "loginToMove": "Has d'entrar per moure aquest punt",
 | 
				
			||||||
 | 
					        "moveTitle": "Moure aquest punt",
 | 
				
			||||||
 | 
					        "partOfRelation": "Aquest element és part d'una relació. Fes servir un altre editor per moure'l.",
 | 
				
			||||||
 | 
					        "isWay": "Aquest element és una via. Fes servir un altre editor d'OpenStreetMap per moure'l.",
 | 
				
			||||||
 | 
					        "zoomInFurther": "Amplia per confirmar aquest moviment",
 | 
				
			||||||
 | 
					        "cannotBeMoved": "Aquest element no es pot moure.",
 | 
				
			||||||
 | 
					        "selectReason": "Per què mous aquest objecte?"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "multi_apply": {
 | 
				
			||||||
 | 
					        "autoApply": "Quan canvies els atributs {attr_names}, aquests també es canviaran a d'altres {count} objectes"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,7 +102,7 @@
 | 
				
			||||||
        "morescreen": {
 | 
					        "morescreen": {
 | 
				
			||||||
            "intro": "<h3>Mehr thematische Karten?</h3>Sammeln Sie gerne Geodaten? <br>Es sind weitere Themen verfügbar.",
 | 
					            "intro": "<h3>Mehr thematische Karten?</h3>Sammeln Sie gerne Geodaten? <br>Es sind weitere Themen verfügbar.",
 | 
				
			||||||
            "requestATheme": "Wenn Sie ein benutzerdefiniertes Thema wünschen, fordern Sie es im Issue Tracker an",
 | 
					            "requestATheme": "Wenn Sie ein benutzerdefiniertes Thema wünschen, fordern Sie es im Issue Tracker an",
 | 
				
			||||||
      "streetcomplete": "Eine andere, ähnliche Anwendung ist <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' class='underline hover:text-blue-800' target='_blank'>StreetComplete</a>.",
 | 
					            "streetcomplete": "Eine ähnliche App ist <a class=\"underline hover:text-blue-800\" href=\"https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete\" target=\"_blank\">StreetComplete</a>.",
 | 
				
			||||||
            "createYourOwnTheme": "Erstellen Sie Ihr eigenes MapComplete-Thema von Grund auf neu",
 | 
					            "createYourOwnTheme": "Erstellen Sie Ihr eigenes MapComplete-Thema von Grund auf neu",
 | 
				
			||||||
            "previouslyHiddenTitle": "Zuvor besuchte versteckte Themen",
 | 
					            "previouslyHiddenTitle": "Zuvor besuchte versteckte Themen",
 | 
				
			||||||
            "hiddenExplanation": "Diese Themen sind nur für Personen zugänglich, die einen Link erhalten haben. Sie haben {hidden_discovered} von {total_hidden} versteckten Themen entdeckt."
 | 
					            "hiddenExplanation": "Diese Themen sind nur für Personen zugänglich, die einen Link erhalten haben. Sie haben {hidden_discovered} von {total_hidden} versteckten Themen entdeckt."
 | 
				
			||||||
| 
						 | 
					@ -111,7 +111,7 @@
 | 
				
			||||||
        "fewChangesBefore": "Bitte beantworten Sie ein paar Fragen zu bestehenden Punkten, bevor Sie einen neuen Punkt hinzufügen.",
 | 
					        "fewChangesBefore": "Bitte beantworten Sie ein paar Fragen zu bestehenden Punkten, bevor Sie einen neuen Punkt hinzufügen.",
 | 
				
			||||||
        "goToInbox": "Posteingang öffnen",
 | 
					        "goToInbox": "Posteingang öffnen",
 | 
				
			||||||
        "getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen",
 | 
					        "getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen",
 | 
				
			||||||
    "getStartedNewAccount": " oder <a href='https://www.openstreetmap.org/user/new' target='_blank'>ein neues Konto anlegen</a>",
 | 
					        "getStartedNewAccount": " oder <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">ein neues Konto anlegen</a>",
 | 
				
			||||||
        "noTagsSelected": "Keine Tags ausgewählt",
 | 
					        "noTagsSelected": "Keine Tags ausgewählt",
 | 
				
			||||||
        "customThemeIntro": "<h3>Benutzerdefinierte Themes</h3>Dies sind zuvor besuchte benutzergenerierte Themen.",
 | 
					        "customThemeIntro": "<h3>Benutzerdefinierte Themes</h3>Dies sind zuvor besuchte benutzergenerierte Themen.",
 | 
				
			||||||
        "aboutMapcomplete": "<h3>Über MapComplete</h3><p>Nutzen Sie es, um OpenStreetMap-Informationen zu einem <b>einzigen Thema</b> hinzuzufügen. Beantworten Sie Fragen, und innerhalb weniger Minuten sind Ihre Beiträge überall verfügbar. Der <b>Theme-Maintainer</b> definiert Elemente, Fragen und Sprachen dafür.</p><h3>Mehr erfahren</h3><p>MapComplete bietet immer <b>den nächsten Schritt</b>, um mehr über OpenStreetMap zu erfahren.</p><ul><li>Wenn es in eine Website eingebettet wird, verlinkt der iframe zu einer Vollbildversion von MapComplete</li><li>Die Vollbildversion bietet Infos über OpenStreetMap</li><li>Das Betrachten funktioniert ohne Anmeldung, aber das Bearbeiten erfordert ein OSM-Konto.</li><li>Wenn Sie nicht angemeldet sind, werden Sie dazu aufgefordert</li><li>Sobald Sie eine Frage beantwortet haben, können Sie der Karte neue Punkte hinzufügen</li><li>Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt werden</li></ul><p></p><br><p>Haben Sie <b>ein Problem</b> bemerkt? Haben Sie einen <b>Funktionswunsch</b>? Möchten Sie <b>bei der Übersetzung helfen</b>? Besuchen Sie den <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">Quellcode</a> oder den <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">Issue Tracker</a> </p><p>Möchten Sie <b>Ihren Fortschritt</b> sehen? Verfolgen Sie die Anzahl der Änderungen auf <a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>.</p>",
 | 
					        "aboutMapcomplete": "<h3>Über MapComplete</h3><p>Nutzen Sie es, um OpenStreetMap-Informationen zu einem <b>einzigen Thema</b> hinzuzufügen. Beantworten Sie Fragen, und innerhalb weniger Minuten sind Ihre Beiträge überall verfügbar. Der <b>Theme-Maintainer</b> definiert Elemente, Fragen und Sprachen dafür.</p><h3>Mehr erfahren</h3><p>MapComplete bietet immer <b>den nächsten Schritt</b>, um mehr über OpenStreetMap zu erfahren.</p><ul><li>Wenn es in eine Website eingebettet wird, verlinkt der iframe zu einer Vollbildversion von MapComplete</li><li>Die Vollbildversion bietet Infos über OpenStreetMap</li><li>Das Betrachten funktioniert ohne Anmeldung, aber das Bearbeiten erfordert ein OSM-Konto.</li><li>Wenn Sie nicht angemeldet sind, werden Sie dazu aufgefordert</li><li>Sobald Sie eine Frage beantwortet haben, können Sie der Karte neue Punkte hinzufügen</li><li>Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt werden</li></ul><p></p><br><p>Haben Sie <b>ein Problem</b> bemerkt? Haben Sie einen <b>Funktionswunsch</b>? Möchten Sie <b>bei der Übersetzung helfen</b>? Besuchen Sie den <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">Quellcode</a> oder den <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">Issue Tracker</a> </p><p>Möchten Sie <b>Ihren Fortschritt</b> sehen? Verfolgen Sie die Anzahl der Änderungen auf <a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>.</p>",
 | 
				
			||||||
| 
						 | 
					@ -140,10 +140,10 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "opening_hours": {
 | 
					        "opening_hours": {
 | 
				
			||||||
            "error_loading": "Fehler: Diese Öffnungszeiten können nicht angezeigt werden.",
 | 
					            "error_loading": "Fehler: Diese Öffnungszeiten können nicht angezeigt werden.",
 | 
				
			||||||
      "open_during_ph": "An Feiertagen ist diese Einrichtung",
 | 
					            "open_during_ph": "An Feiertagen ist hier",
 | 
				
			||||||
            "opensAt": "von",
 | 
					            "opensAt": "von",
 | 
				
			||||||
            "openTill": "bis",
 | 
					            "openTill": "bis",
 | 
				
			||||||
      "not_all_rules_parsed": "Die Öffnungszeiten dieses Geschäfts sind abweichend. Die folgenden Regeln werden im Eingabeelement ignoriert:",
 | 
					            "not_all_rules_parsed": "Die Öffnungszeiten sind kompliziert. Die folgenden Regeln werden im Eingabeelement ignoriert:",
 | 
				
			||||||
            "closed_until": "Geschlossen bis {date}",
 | 
					            "closed_until": "Geschlossen bis {date}",
 | 
				
			||||||
            "closed_permanently": "Geschlossen auf unbestimmte Zeit",
 | 
					            "closed_permanently": "Geschlossen auf unbestimmte Zeit",
 | 
				
			||||||
            "open_24_7": "Durchgehend geöffnet",
 | 
					            "open_24_7": "Durchgehend geöffnet",
 | 
				
			||||||
| 
						 | 
					@ -217,7 +217,7 @@
 | 
				
			||||||
        "i_am_affiliated": "<span>Ich bin angehörig</span><br/><span class='subtle'>Überprüfe, ob du Eigentümer, Ersteller, Angestellter etc. bist</span>",
 | 
					        "i_am_affiliated": "<span>Ich bin angehörig</span><br/><span class='subtle'>Überprüfe, ob du Eigentümer, Ersteller, Angestellter etc. bist</span>",
 | 
				
			||||||
        "saving_review": "Speichern…",
 | 
					        "saving_review": "Speichern…",
 | 
				
			||||||
        "saved": "<span class=\"thanks\">Bewertung gespeichert. Danke fürs Teilen!</span>",
 | 
					        "saved": "<span class=\"thanks\">Bewertung gespeichert. Danke fürs Teilen!</span>",
 | 
				
			||||||
    "tos": "Mit deiner Rezension stimmst du den <a href='https://mangrove.reviews/terms' target='_blank'>AGB und den Datenschutzrichtlinien von Mangrove.reviews zu</a>",
 | 
					        "tos": "Mit deiner Bewertung stimmst du den <a href=\"https://mangrove.reviews/terms\" target=\"_blank\">AGB und den Datenschutzrichtlinien von Mangrove.reviews zu</a>",
 | 
				
			||||||
        "plz_login": "Anmelden, um eine Bewertung abzugeben",
 | 
					        "plz_login": "Anmelden, um eine Bewertung abzugeben",
 | 
				
			||||||
        "affiliated_reviewer_warning": "(Partner-Rezension)",
 | 
					        "affiliated_reviewer_warning": "(Partner-Rezension)",
 | 
				
			||||||
        "attribution": "Rezensionen werden bereitgestellt von <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> und sind unter <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a> verfügbar."
 | 
					        "attribution": "Rezensionen werden bereitgestellt von <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> und sind unter <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a> verfügbar."
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,8 @@
 | 
				
			||||||
    "title": "Welcome to MapComplete",
 | 
					    "title": "Welcome to MapComplete",
 | 
				
			||||||
    "featuredThemeTitle": "Featured this week",
 | 
					    "featuredThemeTitle": "Featured this week",
 | 
				
			||||||
    "intro": "MapComplete is an OpenStreetMap-viewer and editor, which shows you information about features of a specific theme and allows to update it.",
 | 
					    "intro": "MapComplete is an OpenStreetMap-viewer and editor, which shows you information about features of a specific theme and allows to update it.",
 | 
				
			||||||
    "pickTheme": "Pick a theme below to get started."
 | 
					    "pickTheme": "Pick a theme below to get started.",
 | 
				
			||||||
 | 
					    "logIn": "Log in to see other themes you previously visited"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "split": {
 | 
					  "split": {
 | 
				
			||||||
    "split": "Split",
 | 
					    "split": "Split",
 | 
				
			||||||
| 
						 | 
					@ -108,6 +109,7 @@
 | 
				
			||||||
      "openLayerControl": "Open the layer control box",
 | 
					      "openLayerControl": "Open the layer control box",
 | 
				
			||||||
      "layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point",
 | 
					      "layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point",
 | 
				
			||||||
      "hasBeenImported": "This point has already been imported",
 | 
					      "hasBeenImported": "This point has already been imported",
 | 
				
			||||||
 | 
					      "importTags": "The element will receive {tags}",
 | 
				
			||||||
      "zoomInMore": "Zoom in more to import this feature",
 | 
					      "zoomInMore": "Zoom in more to import this feature",
 | 
				
			||||||
      "wrongType": "This element is not a point or a way and can not be imported"
 | 
					      "wrongType": "This element is not a point or a way and can not be imported"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -260,8 +260,15 @@
 | 
				
			||||||
                "mappings": {
 | 
					                "mappings": {
 | 
				
			||||||
                    "1": {
 | 
					                    "1": {
 | 
				
			||||||
                        "then": "Stehbank"
 | 
					                        "then": "Stehbank"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "then": "Hier gibt es eine normale Sitzbank"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "2": {
 | 
				
			||||||
 | 
					                        "then": "Hier gibt es keine Bank"
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                },
 | 
				
			||||||
 | 
					                "question": "Was ist das für eine Bank?"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "bench_at_pt-name": {
 | 
					            "bench_at_pt-name": {
 | 
				
			||||||
                "render": "{name}"
 | 
					                "render": "{name}"
 | 
				
			||||||
| 
						 | 
					@ -433,6 +440,38 @@
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "render": "Fahrrad-Reinigungsdienst"
 | 
					            "render": "Fahrrad-Reinigungsdienst"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "tagRenderings": {
 | 
				
			||||||
 | 
					            "bike_cleaning-charge": {
 | 
				
			||||||
 | 
					                "mappings": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "then": "Kostenloser Reinigungsservice"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "2": {
 | 
				
			||||||
 | 
					                        "then": "Der Reinigungsservice ist kostenpflichtig"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "1": {
 | 
				
			||||||
 | 
					                        "then": "Kostenlose Nutzung"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "question": "Wie viel kostet die Nutzung des Reinigungsdienstes?",
 | 
				
			||||||
 | 
					                "render": "Die Nutzung des Reinigungsdienstes kostet {charge}"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "bike_cleaning-service:bicycle:cleaning:charge": {
 | 
				
			||||||
 | 
					                "mappings": {
 | 
				
			||||||
 | 
					                    "1": {
 | 
				
			||||||
 | 
					                        "then": "Kostenlose Nutzung"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "then": "Der Reinigungsservice ist kostenlos"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "2": {
 | 
				
			||||||
 | 
					                        "then": "Der Reinigungsdienst ist kostenpflichtig, aber der Betrag ist nicht bekannt"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "question": "Wie viel kostet die Nutzung des Reinigungsdienstes?",
 | 
				
			||||||
 | 
					                "render": "Nutzung des Reinigungsservice kostet {service:bicycle:cleaning:charge}"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "bike_parking": {
 | 
					    "bike_parking": {
 | 
				
			||||||
| 
						 | 
					@ -563,7 +602,7 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "tagRenderings": {
 | 
					        "tagRenderings": {
 | 
				
			||||||
            "Email maintainer": {
 | 
					            "Email maintainer": {
 | 
				
			||||||
                "render": "<a href='mailto:{email}?subject=Fahrradpumpe kaputt&body=Hallo,\n\nMit dieser E-Mail möchte ich Ihnen mitteilen, dass die Fahrradpumpe, die sich unter https://mapcomplete.osm.be/cyclofix?lat={_lat}&lon={_lon}&z=18#{id} befindet, kaputt ist.'>Melde diese Fahrradpumpe als kaputt</a>"
 | 
					                "render": "<a href='mailto:{email}?subject=Fahrradpumpe kaputt&body=Hallo,%0D%0A%0D%0AMit dieser E-Mail möchte ich Ihnen mitteilen, dass die Fahrradpumpe, die sich unter https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id} befindet, kaputt ist.'>Melde diese Fahrradpumpe als kaputt</a>"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "Operational status": {
 | 
					            "Operational status": {
 | 
				
			||||||
                "mappings": {
 | 
					                "mappings": {
 | 
				
			||||||
| 
						 | 
					@ -2872,5 +2911,37 @@
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "watermill": {
 | 
					    "watermill": {
 | 
				
			||||||
        "name": "Wassermühle"
 | 
					        "name": "Wassermühle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "charging_station": {
 | 
				
			||||||
 | 
					        "filter": {
 | 
				
			||||||
 | 
					            "0": {
 | 
				
			||||||
 | 
					                "options": {
 | 
				
			||||||
 | 
					                    "2": {
 | 
				
			||||||
 | 
					                        "question": "Ladestation für Autos"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "question": "Alle Fahrzeugtypen"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "1": {
 | 
				
			||||||
 | 
					                        "question": "Ladestation für Fahrräder"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "1": {
 | 
				
			||||||
 | 
					                "options": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "question": "Nur funktionierende Ladestationen"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "2": {
 | 
				
			||||||
 | 
					                "options": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "question": "Alle Anschlüsse"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "description": "Eine Ladestation"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -602,7 +602,7 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "tagRenderings": {
 | 
					        "tagRenderings": {
 | 
				
			||||||
            "Email maintainer": {
 | 
					            "Email maintainer": {
 | 
				
			||||||
                "render": "<a href='mailto:{email}?subject=Broken bicycle pump&body=Hello,\n\nWith this email, I'd like to inform you that the bicycle pump located at https://mapcomplete.osm.be/cyclofix?lat={_lat}&lon={_lon}&z=18#{id} is broken.'>Report this bicycle pump as broken</a>"
 | 
					                "render": "<a href='mailto:{email}?subject=Broken bicycle pump&body=Hello,%0D%0A%0D%0AWith this email, I'd like to inform you that the bicycle pump located at https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id} is broken.%0D%0A%0D%0A Kind regards'>Report this bicycle pump as broken</a>"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "Operational status": {
 | 
					            "Operational status": {
 | 
				
			||||||
                "mappings": {
 | 
					                "mappings": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -563,7 +563,7 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "tagRenderings": {
 | 
					        "tagRenderings": {
 | 
				
			||||||
            "Email maintainer": {
 | 
					            "Email maintainer": {
 | 
				
			||||||
                "render": "<a href='mailto:{email}?subject=Kapotte fietspomp&body=Geachte,%0D%0A%0D%0AGraag had ik u gemeld dat een fietspomp defect is. De fietspomp bevindt zich hier: https://mapcomplete.osm.be/cyclofix#{id}.'>Rapporteer deze fietspomp als kapot</a>"
 | 
					                "render": "<a href='mailto:{email}?subject=Kapotte fietspomp&body=Geachte,%0D%0A%0D%0AGraag had ik u gemeld dat een fietspomp defect is. De fietspomp bevindt zich hier: https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id}.%0D%0A%0D%0AMet vriendelijke groeten.'>Rapporteer deze fietspomp als kapot</a>"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "Operational status": {
 | 
					            "Operational status": {
 | 
				
			||||||
                "mappings": {
 | 
					                "mappings": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,6 +12,64 @@
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "render": "Obra de arte"
 | 
					            "render": "Obra de arte"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "description": "Diversas obras de arte",
 | 
				
			||||||
 | 
					        "name": "Obras de arte",
 | 
				
			||||||
 | 
					        "tagRenderings": {
 | 
				
			||||||
 | 
					            "artwork-artist_name": {
 | 
				
			||||||
 | 
					                "question": "Que artista criou isto?",
 | 
				
			||||||
 | 
					                "render": "Criado por {artist_name}"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "artwork-artwork_type": {
 | 
				
			||||||
 | 
					                "mappings": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "then": "Arquitetura"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "1": {
 | 
				
			||||||
 | 
					                        "then": "Mural"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "2": {
 | 
				
			||||||
 | 
					                        "then": "Pintura"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "3": {
 | 
				
			||||||
 | 
					                        "then": "Escultura"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "4": {
 | 
				
			||||||
 | 
					                        "then": "Estátua"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "5": {
 | 
				
			||||||
 | 
					                        "then": "Busto"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "6": {
 | 
				
			||||||
 | 
					                        "then": "Pedra"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "7": {
 | 
				
			||||||
 | 
					                        "then": "Instalação"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "8": {
 | 
				
			||||||
 | 
					                        "then": "Graffiti"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "9": {
 | 
				
			||||||
 | 
					                        "then": "Relevo"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "10": {
 | 
				
			||||||
 | 
					                        "then": "Azulejo (azulejo decorativo espanhol e português)"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "11": {
 | 
				
			||||||
 | 
					                        "then": "Ladrilhos"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "question": "Qual é o tipo desta obra de arte?",
 | 
				
			||||||
 | 
					                "render": "Isto é um(a) {artwork_type}"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "artwork-website": {
 | 
				
			||||||
 | 
					                "question": "Existe um site com mais informações sobre esta obra de arte?",
 | 
				
			||||||
 | 
					                "render": "Mais informações <a href='{website}' target='_blank'>neste site</a>"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "artwork-wikidata": {
 | 
				
			||||||
 | 
					                "question": "Que entrada no Wikidata corresponde a <b>esta obra de arte</b>?",
 | 
				
			||||||
 | 
					                "render": "Corresponde a <a href='https://www.wikidata.org/wiki/{wikidata}' target='_blank'>{wikidata}</a>"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "bench": {
 | 
					    "bench": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1410,5 +1410,42 @@
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "watermill": {
 | 
					    "watermill": {
 | 
				
			||||||
        "name": "Водяная мельница"
 | 
					        "name": "Водяная мельница"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "charging_station": {
 | 
				
			||||||
 | 
					        "units": {
 | 
				
			||||||
 | 
					            "0": {
 | 
				
			||||||
 | 
					                "applicableUnits": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "humanSingular": " минута",
 | 
				
			||||||
 | 
					                        "human": " минут"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "1": {
 | 
				
			||||||
 | 
					                        "human": " часов",
 | 
				
			||||||
 | 
					                        "humanSingular": " час"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "2": {
 | 
				
			||||||
 | 
					                        "human": " дней",
 | 
				
			||||||
 | 
					                        "humanSingular": " день"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "1": {
 | 
				
			||||||
 | 
					                "applicableUnits": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "human": "Вольт"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "3": {
 | 
				
			||||||
 | 
					                "applicableUnits": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "human": "киловатт"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "1": {
 | 
				
			||||||
 | 
					                        "human": "мегаватт"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -139,7 +139,7 @@
 | 
				
			||||||
        "isDeleted": "Удалено",
 | 
					        "isDeleted": "Удалено",
 | 
				
			||||||
        "doDelete": "Удалить изображение",
 | 
					        "doDelete": "Удалить изображение",
 | 
				
			||||||
        "dontDelete": "Отмена",
 | 
					        "dontDelete": "Отмена",
 | 
				
			||||||
    "uploadDone": "<span class=\"thanks\">Ваше изображение добавлено. Спасибо за помощь!</span>",
 | 
					        "uploadDone": "Ваше изображение добавлено. Спасибо за помощь!",
 | 
				
			||||||
        "respectPrivacy": "Не фотографируйте людей и номерные знаки. Не загружайте снимки Google Maps, Google Street View и иные источники с закрытой лицензией.",
 | 
					        "respectPrivacy": "Не фотографируйте людей и номерные знаки. Не загружайте снимки Google Maps, Google Street View и иные источники с закрытой лицензией.",
 | 
				
			||||||
        "uploadFailed": "Не удалось загрузить изображение. Проверьте, есть ли у вас доступ в Интернет и разрешены ли сторонние API? Браузеры Brave и UMatrix могут блокировать их.",
 | 
					        "uploadFailed": "Не удалось загрузить изображение. Проверьте, есть ли у вас доступ в Интернет и разрешены ли сторонние API? Браузеры Brave и UMatrix могут блокировать их.",
 | 
				
			||||||
        "ccb": "под лицензией CC-BY",
 | 
					        "ccb": "под лицензией CC-BY",
 | 
				
			||||||
| 
						 | 
					@ -171,5 +171,12 @@
 | 
				
			||||||
        "reload": "Обновить данные",
 | 
					        "reload": "Обновить данные",
 | 
				
			||||||
        "loginNeeded": "<h3>Вход</h3>Личная раскладка доступна только пользователям OpenStreetMap",
 | 
					        "loginNeeded": "<h3>Вход</h3>Личная раскладка доступна только пользователям OpenStreetMap",
 | 
				
			||||||
        "panelIntro": "<h3>Ваша личная тема</h3>Активируйте свои любимые слои из официальных тем"
 | 
					        "panelIntro": "<h3>Ваша личная тема</h3>Активируйте свои любимые слои из официальных тем"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "delete": {
 | 
				
			||||||
 | 
					        "delete": "Удалить",
 | 
				
			||||||
 | 
					        "cancel": "Отмена"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "split": {
 | 
				
			||||||
 | 
					        "cancel": "Отмена"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1,116 @@
 | 
				
			||||||
{}
 | 
					{
 | 
				
			||||||
 | 
					    "undefined": {
 | 
				
			||||||
 | 
					        "level": {
 | 
				
			||||||
 | 
					            "question": "A quina planta està situat aquest element?",
 | 
				
			||||||
 | 
					            "mappings": {
 | 
				
			||||||
 | 
					                "3": {
 | 
				
			||||||
 | 
					                    "then": "Situat a primera planta"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "2": {
 | 
				
			||||||
 | 
					                    "then": "Situat a planta zero"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "1": {
 | 
				
			||||||
 | 
					                    "then": "Situat a planta zero"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "0": {
 | 
				
			||||||
 | 
					                    "then": "Situat a planta subterrani"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "render": "Situat a la planta {level}"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "email": {
 | 
				
			||||||
 | 
					            "question": "Quina és l'adreça de correu electrònic de {name}?"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "dog-access": {
 | 
				
			||||||
 | 
					            "question": "S'accepten gossos en aquest negoci?",
 | 
				
			||||||
 | 
					            "mappings": {
 | 
				
			||||||
 | 
					                "3": {
 | 
				
			||||||
 | 
					                    "then": "S'accepten gossos lliures"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "2": {
 | 
				
			||||||
 | 
					                    "then": "S'accepten gossos però lligats"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "1": {
 | 
				
			||||||
 | 
					                    "then": "<b>No</b> s'accepten gossos"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "0": {
 | 
				
			||||||
 | 
					                    "then": "S'accepten gossos"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "description": {
 | 
				
			||||||
 | 
					            "question": "Hi ha quelcom rellevant que no t'hem preguntat? Afegeix-ho aquí. <br/><span style='font-size: small'>No repeteixis informació que ja hi és</span>"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "phone": {
 | 
				
			||||||
 | 
					            "question": "Quin és el telèfon de {name}?"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "payment-options": {
 | 
				
			||||||
 | 
					            "question": "Quins mètodes de pagament s'accepten aquí?",
 | 
				
			||||||
 | 
					            "mappings": {
 | 
				
			||||||
 | 
					                "1": {
 | 
				
			||||||
 | 
					                    "then": "S'accepten targetes de crèdit"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "0": {
 | 
				
			||||||
 | 
					                    "then": "S'accepten diners"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "opening_hours": {
 | 
				
			||||||
 | 
					            "render": "<h3>Horari d'obertura</h3>{opening_hours_table(opening_hours)}",
 | 
				
			||||||
 | 
					            "question": "Quin és l'horari d'obertura de {name}?"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "service:electricity": {
 | 
				
			||||||
 | 
					            "mappings": {
 | 
				
			||||||
 | 
					                "2": {
 | 
				
			||||||
 | 
					                    "then": "No hi ha endolls disponibles per als clients però es pot carregar si es demana als responsables"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "1": {
 | 
				
			||||||
 | 
					                    "then": "Hi ha aslguns endolls disponibles per als clients de dins, on es poden carregar els aparells electrònics"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "0": {
 | 
				
			||||||
 | 
					                    "then": "Està ple d'endolls pels clients de dins, on es poden carregar els aparells electrònics"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "3": {
 | 
				
			||||||
 | 
					                    "then": "No hi ha endolls disponibles per als clients"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "question": "Aquest servei té endolls elèctrics, disponibles pels clients quan hi són dins?"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "wheelchair-access": {
 | 
				
			||||||
 | 
					            "mappings": {
 | 
				
			||||||
 | 
					                "1": {
 | 
				
			||||||
 | 
					                    "then": "És facilment arribable amb cadira de rodes"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "0": {
 | 
				
			||||||
 | 
					                    "then": "Aquest lloc està especialment adaptat per a les cadires de rodes"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "3": {
 | 
				
			||||||
 | 
					                    "then": "Aquest lloc no és accessible amb cadira de rodes"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "2": {
 | 
				
			||||||
 | 
					                    "then": "És possible fer servir cadira de rodes a aquest lloc però no és fàcil"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "question": "Aquest lloc és accessible amb cadira de rodes?"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "website": {
 | 
				
			||||||
 | 
					            "question": "Quina és la web de {name}?"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "wikipedialink": {
 | 
				
			||||||
 | 
					            "mappings": {
 | 
				
			||||||
 | 
					                "0": {
 | 
				
			||||||
 | 
					                    "then": "No enllaçat amb Viquipèdia"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "question": "Quin és l'ítem a Viquipèdia?"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "wikipedia": {
 | 
				
			||||||
 | 
					            "question": "Quina és la correspondent entitat a Wikidata?",
 | 
				
			||||||
 | 
					            "mappings": {
 | 
				
			||||||
 | 
					                "0": {
 | 
				
			||||||
 | 
					                    "then": "No hi ha cap enllaça a Viquipèdia encara"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,6 +94,23 @@
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "question": "Was ist der entsprechende Artikel auf Wikipedia?"
 | 
					            "question": "Was ist der entsprechende Artikel auf Wikipedia?"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "service:electricity": {
 | 
				
			||||||
 | 
					            "mappings": {
 | 
				
			||||||
 | 
					                "0": {
 | 
				
			||||||
 | 
					                    "then": "Für Kunden stehen im Innenraum viele Steckdosen zur Verfügung, an denen sie ihre Geräte laden können"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "1": {
 | 
				
			||||||
 | 
					                    "then": "Für Kunden stehen im Innenraum wenig Steckdosen zur Verfügung, an denen sie ihre Geräte laden können"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "2": {
 | 
				
			||||||
 | 
					                    "then": "Für Kunden stehen im Innenraum keine Steckdosen zur Verfügung, aber Laden von Geräte könnte möglich sein, wenn das Personal gefragt wird"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "3": {
 | 
				
			||||||
 | 
					                    "then": "Für Kunden stehen im Innenraum keine Steckdosen zur Verfügung"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "question": "Gibt es an dieser Einrichtung Steckdosen, an denen Kunden ihre Geräte laden können?"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,13 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "website": {
 | 
					        "website": {
 | 
				
			||||||
            "question": "Какой сайт у {name}?"
 | 
					            "question": "Какой сайт у {name}?"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "dog-access": {
 | 
				
			||||||
 | 
					            "mappings": {
 | 
				
			||||||
 | 
					                "0": {
 | 
				
			||||||
 | 
					                    "then": "Собаки разрешены"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -581,6 +581,25 @@
 | 
				
			||||||
        "shortDescription": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur.",
 | 
					        "shortDescription": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur.",
 | 
				
			||||||
        "title": "Fahrradinfrastruktur"
 | 
					        "title": "Fahrradinfrastruktur"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "cyclenodes": {
 | 
				
			||||||
 | 
					        "description": "Diese Karte zeigt Knotenpunktnetzwerke für Radfahrer und erlaubt auch neue Knoten zu mappen",
 | 
				
			||||||
 | 
					        "layers": {
 | 
				
			||||||
 | 
					            "1": {
 | 
				
			||||||
 | 
					                "presets": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "title": "Knotenpunkt"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "1": {
 | 
				
			||||||
 | 
					                        "title": "Knotenpunkt im Netzwerk Spree-Neiße"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "title": {
 | 
				
			||||||
 | 
					                    "render": "Knotenpunkt"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "title": "Fahrrad-Knotenpunktnetzwerke"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "cyclestreets": {
 | 
					    "cyclestreets": {
 | 
				
			||||||
        "description": "Eine Fahrradstraße ist eine Straße, auf der <b>motorisierter Verkehr Radfahrer nicht überholen darf</b>. Sie sind durch ein spezielles Verkehrsschild gekennzeichnet. Fahrradstraßen gibt es in den Niederlanden und Belgien, aber auch in Deutschland und Frankreich. ",
 | 
					        "description": "Eine Fahrradstraße ist eine Straße, auf der <b>motorisierter Verkehr Radfahrer nicht überholen darf</b>. Sie sind durch ein spezielles Verkehrsschild gekennzeichnet. Fahrradstraßen gibt es in den Niederlanden und Belgien, aber auch in Deutschland und Frankreich. ",
 | 
				
			||||||
        "layers": {
 | 
					        "layers": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -609,6 +609,45 @@
 | 
				
			||||||
        "shortDescription": "A map where you can view and edit things related to the bicycle infrastructure.",
 | 
					        "shortDescription": "A map where you can view and edit things related to the bicycle infrastructure.",
 | 
				
			||||||
        "title": "Bicycle infrastructure"
 | 
					        "title": "Bicycle infrastructure"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "cyclenodes": {
 | 
				
			||||||
 | 
					        "description": "This map shows cycle node networks and allows you to add new nodes easily",
 | 
				
			||||||
 | 
					        "layers": {
 | 
				
			||||||
 | 
					            "0": {
 | 
				
			||||||
 | 
					                "name": "node to node links",
 | 
				
			||||||
 | 
					                "tagRenderings": {
 | 
				
			||||||
 | 
					                    "node2node-survey:date": {
 | 
				
			||||||
 | 
					                        "question": "When was this node to node link last surveyed?",
 | 
				
			||||||
 | 
					                        "render": "This node to node link was last surveyed on {survey:date}"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "title": {
 | 
				
			||||||
 | 
					                    "mappings": {
 | 
				
			||||||
 | 
					                        "0": {
 | 
				
			||||||
 | 
					                            "then": "node to node link <strong>{ref}</strong>"
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "render": "node to node link"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "1": {
 | 
				
			||||||
 | 
					                "name": "nodes",
 | 
				
			||||||
 | 
					                "tagRenderings": {
 | 
				
			||||||
 | 
					                    "node-expected_rcn_route_relations": {
 | 
				
			||||||
 | 
					                        "question": "How many other cycle nodes does this node link to?",
 | 
				
			||||||
 | 
					                        "render": "This node links to {expected_rcn_route_relations} other cycle nodes."
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "node-survey:date": {
 | 
				
			||||||
 | 
					                        "question": "When was this cycle node last surveyed?",
 | 
				
			||||||
 | 
					                        "render": "This cycle node was last surveyed on {survey:date}"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "title": {
 | 
				
			||||||
 | 
					                    "render": "cycle node <strong>{rcn_ref}</strong>"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "title": "Cycle Node Networks"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "cyclestreets": {
 | 
					    "cyclestreets": {
 | 
				
			||||||
        "description": "A cyclestreet is is a street where <b>motorized traffic is not allowed to overtake cyclists</b>. They are signposted by a special traffic sign. Cyclestreets can be found in the Netherlands and Belgium, but also in Germany and France. ",
 | 
					        "description": "A cyclestreet is is a street where <b>motorized traffic is not allowed to overtake cyclists</b>. They are signposted by a special traffic sign. Cyclestreets can be found in the Netherlands and Belgium, but also in Germany and France. ",
 | 
				
			||||||
        "layers": {
 | 
					        "layers": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -753,9 +753,7 @@
 | 
				
			||||||
    "grb": {
 | 
					    "grb": {
 | 
				
			||||||
        "description": "GRB Fixup",
 | 
					        "description": "GRB Fixup",
 | 
				
			||||||
        "layers": {
 | 
					        "layers": {
 | 
				
			||||||
            "3": {
 | 
					            "1": {
 | 
				
			||||||
                "description": "Dit gebouw heeft een foutmelding",
 | 
					 | 
				
			||||||
                "name": "Fixmes op gebouwen",
 | 
					 | 
				
			||||||
                "tagRenderings": {
 | 
					                "tagRenderings": {
 | 
				
			||||||
                    "grb-fixme": {
 | 
					                    "grb-fixme": {
 | 
				
			||||||
                        "mappings": {
 | 
					                        "mappings": {
 | 
				
			||||||
| 
						 | 
					@ -786,57 +784,6 @@
 | 
				
			||||||
                    "grb-unit": {
 | 
					                    "grb-unit": {
 | 
				
			||||||
                        "render": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
 | 
					                        "render": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                "title": {
 | 
					 | 
				
			||||||
                    "mappings": {
 | 
					 | 
				
			||||||
                        "0": {
 | 
					 | 
				
			||||||
                            "then": "{fixme}"
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    "render": "{addr:street} {addr:housenumber}"
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            "5": {
 | 
					 | 
				
			||||||
                "description": "Dit gebouw heeft een foutmelding",
 | 
					 | 
				
			||||||
                "name": "Fixmes op gebouwen",
 | 
					 | 
				
			||||||
                "tagRenderings": {
 | 
					 | 
				
			||||||
                    "grb-fixme": {
 | 
					 | 
				
			||||||
                        "mappings": {
 | 
					 | 
				
			||||||
                            "0": {
 | 
					 | 
				
			||||||
                                "then": "Geen fixme"
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                        "question": "Wat zegt de fixme?",
 | 
					 | 
				
			||||||
                        "render": "De fixme is <b>{fixme}</b>"
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    "grb-housenumber": {
 | 
					 | 
				
			||||||
                        "mappings": {
 | 
					 | 
				
			||||||
                            "0": {
 | 
					 | 
				
			||||||
                                "then": "Geen huisnummer"
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                        "question": "Wat is het huisnummer?",
 | 
					 | 
				
			||||||
                        "render": "Het huisnummer is <b>{addr:housenumber}</b>"
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    "grb-min-level": {
 | 
					 | 
				
			||||||
                        "question": "Hoeveel verdiepingen ontbreken?",
 | 
					 | 
				
			||||||
                        "render": "Dit gebouw begint maar op de {building:min_level} verdieping"
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    "grb-street": {
 | 
					 | 
				
			||||||
                        "question": "Wat is de straat?",
 | 
					 | 
				
			||||||
                        "render": "De straat is <b>{addr:street}</b>"
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    "grb-unit": {
 | 
					 | 
				
			||||||
                        "render": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                "title": {
 | 
					 | 
				
			||||||
                    "mappings": {
 | 
					 | 
				
			||||||
                        "0": {
 | 
					 | 
				
			||||||
                            "then": "{fixme}"
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    "render": "{addr:street} {addr:housenumber}"
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@
 | 
				
			||||||
        "title": "Открытая карта АВД (Автоматизированных внешних дефибрилляторов)"
 | 
					        "title": "Открытая карта АВД (Автоматизированных внешних дефибрилляторов)"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "artwork": {
 | 
					    "artwork": {
 | 
				
			||||||
        "description": "Добро пожаловать на Open Artwork Map, карту статуй, бюстов, граффити и других произведений искусства по всему миру",
 | 
					        "description": "Добро пожаловать на открытую карта произведений искусства - карту статуй, бюстов, граффити и других произведений искусства по всему миру",
 | 
				
			||||||
        "title": "Открытая карта произведений искусства"
 | 
					        "title": "Открытая карта произведений искусства"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "benches": {
 | 
					    "benches": {
 | 
				
			||||||
| 
						 | 
					@ -217,7 +217,9 @@
 | 
				
			||||||
        "title": "Кемпинги"
 | 
					        "title": "Кемпинги"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "charging_stations": {
 | 
					    "charging_stations": {
 | 
				
			||||||
        "description": "На этой карте вы можно найти и отметить информацию о зарядных станциях"
 | 
					        "description": "На этой карте вы можно найти и отметить информацию о зарядных станциях",
 | 
				
			||||||
 | 
					        "title": "Зарядные станции",
 | 
				
			||||||
 | 
					        "shortDescription": "Карта зарядных станций по всему миру"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "climbing": {
 | 
					    "climbing": {
 | 
				
			||||||
        "description": "На этой карте вы найдете различные возможности для скалолазания, такие как скалодромы, залы для боулдеринга и скалы на природе.",
 | 
					        "description": "На этой карте вы найдете различные возможности для скалолазания, такие как скалодромы, залы для боулдеринга и скалы на природе.",
 | 
				
			||||||
| 
						 | 
					@ -291,6 +293,15 @@
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "units+": {
 | 
				
			||||||
 | 
					                "0": {
 | 
				
			||||||
 | 
					                    "applicableUnits": {
 | 
				
			||||||
 | 
					                        "0": {
 | 
				
			||||||
 | 
					                            "human": " метр"
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "title": "Открытая карта скалолазания"
 | 
					        "title": "Открытая карта скалолазания"
 | 
				
			||||||
| 
						 | 
					@ -302,6 +313,9 @@
 | 
				
			||||||
                "title": {
 | 
					                "title": {
 | 
				
			||||||
                    "render": "Улица"
 | 
					                    "render": "Улица"
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "0": {
 | 
				
			||||||
 | 
					                "name": "Cyclestreets"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
| 
						 | 
					@ -375,10 +389,10 @@
 | 
				
			||||||
                    "hydrant-state": {
 | 
					                    "hydrant-state": {
 | 
				
			||||||
                        "mappings": {
 | 
					                        "mappings": {
 | 
				
			||||||
                            "0": {
 | 
					                            "0": {
 | 
				
			||||||
                                "then": "Гидрант (полностью или частично) в рабочем состоянии."
 | 
					                                "then": "Гидрант (полностью или частично) в рабочем состоянии"
 | 
				
			||||||
                            },
 | 
					                            },
 | 
				
			||||||
                            "2": {
 | 
					                            "2": {
 | 
				
			||||||
                                "then": "Гидрант демонтирован."
 | 
					                                "then": "Гидрант демонтирован"
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
| 
						 | 
					@ -485,7 +499,7 @@
 | 
				
			||||||
        "title": "Карта карт"
 | 
					        "title": "Карта карт"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "personal": {
 | 
					    "personal": {
 | 
				
			||||||
        "description": "Создать персональную тему на основе доступных слоёв тем"
 | 
					        "description": "Создать персональную тему на основе доступных слоёв тем. Чтобы отобразить некоторые данные, откройте <a href='#filter'>выбор слоя</a>"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "playgrounds": {
 | 
					    "playgrounds": {
 | 
				
			||||||
        "description": "На этой карте можно найти игровые площадки и добавить дополнительную информацию",
 | 
					        "description": "На этой карте можно найти игровые площадки и добавить дополнительную информацию",
 | 
				
			||||||
| 
						 | 
					@ -507,5 +521,152 @@
 | 
				
			||||||
        "description": "Нанесите все деревья на карту!",
 | 
					        "description": "Нанесите все деревья на карту!",
 | 
				
			||||||
        "shortDescription": "Карта деревьев",
 | 
					        "shortDescription": "Карта деревьев",
 | 
				
			||||||
        "title": "Деревья"
 | 
					        "title": "Деревья"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "hackerspaces": {
 | 
				
			||||||
 | 
					        "layers": {
 | 
				
			||||||
 | 
					            "0": {
 | 
				
			||||||
 | 
					                "name": "Хакерспейс",
 | 
				
			||||||
 | 
					                "tagRenderings": {
 | 
				
			||||||
 | 
					                    "hackerspaces-opening_hours": {
 | 
				
			||||||
 | 
					                        "mappings": {
 | 
				
			||||||
 | 
					                            "0": {
 | 
				
			||||||
 | 
					                                "then": "Открыто 24/7"
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        "render": "{opening_hours_table()}"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "presets": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "title": "Хакерспейс"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "title": {
 | 
				
			||||||
 | 
					                    "mappings": {
 | 
				
			||||||
 | 
					                        "0": {
 | 
				
			||||||
 | 
					                            "then": " {name}"
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "render": "Хакерспейс"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "description": "Хакерспейс"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "title": "Хакерспейсы"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "openwindpowermap": {
 | 
				
			||||||
 | 
					        "layers": {
 | 
				
			||||||
 | 
					            "0": {
 | 
				
			||||||
 | 
					                "title": {
 | 
				
			||||||
 | 
					                    "mappings": {
 | 
				
			||||||
 | 
					                        "0": {
 | 
				
			||||||
 | 
					                            "then": "{name}"
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "units": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "applicableUnits": {
 | 
				
			||||||
 | 
					                            "0": {
 | 
				
			||||||
 | 
					                                "human": " мегаватт"
 | 
				
			||||||
 | 
					                            },
 | 
				
			||||||
 | 
					                            "1": {
 | 
				
			||||||
 | 
					                                "human": " киловатт"
 | 
				
			||||||
 | 
					                            },
 | 
				
			||||||
 | 
					                            "2": {
 | 
				
			||||||
 | 
					                                "human": " ватт"
 | 
				
			||||||
 | 
					                            },
 | 
				
			||||||
 | 
					                            "3": {
 | 
				
			||||||
 | 
					                                "human": " гигаватт"
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "1": {
 | 
				
			||||||
 | 
					                        "applicableUnits": {
 | 
				
			||||||
 | 
					                            "0": {
 | 
				
			||||||
 | 
					                                "human": " метр"
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "title": "Открытая карта ветроэнергетики"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "postboxes": {
 | 
				
			||||||
 | 
					        "layers": {
 | 
				
			||||||
 | 
					            "1": {
 | 
				
			||||||
 | 
					                "name": "Почтовые отделения",
 | 
				
			||||||
 | 
					                "tagRenderings": {
 | 
				
			||||||
 | 
					                    "OH": {
 | 
				
			||||||
 | 
					                        "render": "Часы работы: {opening_hours_table()}"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "title": {
 | 
				
			||||||
 | 
					                    "render": "Почтовое отделение"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "presets": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "title": "Почтовое отделение"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "0": {
 | 
				
			||||||
 | 
					                "presets": {
 | 
				
			||||||
 | 
					                    "0": {
 | 
				
			||||||
 | 
					                        "title": "почтовый ящик"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "name": "Почтовые ящики",
 | 
				
			||||||
 | 
					                "title": {
 | 
				
			||||||
 | 
					                    "render": "Почтовый ящик"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "cafes_and_pubs": {
 | 
				
			||||||
 | 
					        "title": "Кафе и пабы"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "cycle_infra": {
 | 
				
			||||||
 | 
					        "title": "Велосипедная дорожка"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "parkings": {
 | 
				
			||||||
 | 
					        "title": "Парковка"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "sidewalks": {
 | 
				
			||||||
 | 
					        "layers": {
 | 
				
			||||||
 | 
					            "0": {
 | 
				
			||||||
 | 
					                "title": {
 | 
				
			||||||
 | 
					                    "render": "{name}"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "name": "Тротуары"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "title": "Тротуары",
 | 
				
			||||||
 | 
					        "description": "Экспериментальная тема"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "street_lighting": {
 | 
				
			||||||
 | 
					        "layers": {
 | 
				
			||||||
 | 
					            "2": {
 | 
				
			||||||
 | 
					                "name": "Все улицы",
 | 
				
			||||||
 | 
					                "title": {
 | 
				
			||||||
 | 
					                    "render": "Улица"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "title": "Уличное освещение"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "uk_addresses": {
 | 
				
			||||||
 | 
					        "layers": {
 | 
				
			||||||
 | 
					            "2": {
 | 
				
			||||||
 | 
					                "description": "Адреса"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "etymology": {
 | 
				
			||||||
 | 
					        "title": "Открытая этимологическая карта"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "observation_towers": {
 | 
				
			||||||
 | 
					        "title": "Смотровые башни"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||