Merge develop

This commit is contained in:
pietervdvn 2021-10-26 01:27:35 +02:00
commit 07bc5d6a6d
88 changed files with 3284 additions and 2363 deletions

View file

@ -10,7 +10,7 @@ import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
* Makes sure the hash shows the selected element and vice-versa.
*/
export default class SelectedFeatureHandler {
private static readonly _no_trigger_on = new Set(["welcome", "copyright", "layers", "new", "", undefined])
private static readonly _no_trigger_on = new Set(["welcome", "copyright", "layers", "new", "filter","", undefined])
private readonly hash: UIEventSource<string>;
private readonly state: {
selectedElement: UIEventSource<any>,
@ -70,7 +70,7 @@ export default class SelectedFeatureHandler {
this.initialLoad()
}
/**
* On startup: check if the hash is loaded and eventually zoom to it
@ -85,6 +85,11 @@ export default class SelectedFeatureHandler {
return;
}
if (!(hash.startsWith("node") || hash.startsWith("way") || hash.startsWith("relation"))) {
return;
}
OsmObject.DownloadObjectAsync(hash).then(obj => {
try {
@ -129,26 +134,25 @@ export default class SelectedFeatureHandler {
// If a feature is selected via the hash, zoom there
private zoomToSelectedFeature() {
const selected = this.state.selectedElement.data
if(selected === undefined){
if (selected === undefined) {
return
}
const centerpoint= GeoOperations.centerpointCoordinates(selected)
const centerpoint = GeoOperations.centerpointCoordinates(selected)
const location = this.state.locationControl;
location.data.lon = centerpoint[0]
location.data.lat = centerpoint[1]
const minZoom = Math.max(14, ...(this.state.layoutToUse?.layers?.map(l => l.minzoomVisible) ?? []))
if(location.data.zoom < minZoom ){
if (location.data.zoom < minZoom) {
location.data.zoom = minZoom
}
location.ping();
}
}

View file

@ -4,13 +4,14 @@
* Technically, more an Actor then a featuresource, but it fits more neatly this ay
*/
import {FeatureSourceForLayer} from "../FeatureSource";
import {Tiles} from "../../../Models/TileRange";
export default class SaveTileToLocalStorageActor {
public static readonly storageKey: string = "cached-features";
public static readonly formatVersion: string = "2"
constructor(source: FeatureSourceForLayer, tileIndex: number) {
source.features.addCallbackAndRunD(features => {
const key = `${SaveTileToLocalStorageActor.storageKey}-${source.layer.layerDef.id}-${tileIndex}`
const now = new Date()
@ -28,13 +29,30 @@ export default class SaveTileToLocalStorageActor {
}
public static MarkVisited(layerId: string, tileId: number, freshness: Date){
public static MarkVisited(layerId: string, tileId: number, freshness: Date) {
const key = `${SaveTileToLocalStorageActor.storageKey}-${layerId}-${tileId}`
try{
try {
localStorage.setItem(key + "-time", JSON.stringify(freshness.getTime()))
localStorage.setItem(key + "-format", SaveTileToLocalStorageActor.formatVersion)
}catch(e){
} catch (e) {
console.error("Could not mark tile ", key, "as visited")
}
}
public static poison(layers: string[], lon: number, lat: number) {
for (let z = 0; z < 25; z++) {
const {x, y} = Tiles.embedded_tile(lat, lon, z)
const tileId = Tiles.tile_index(z, x, y)
for (const layerId of layers) {
const key = `${SaveTileToLocalStorageActor.storageKey}-${layerId}-${tileId}`
localStorage.removeItem(key + "-time");
localStorage.removeItem(key + "-format")
localStorage.removeItem(key)
}
}
}
}

View file

@ -30,14 +30,14 @@ import TileFreshnessCalculator from "./TileFreshnessCalculator";
/**
* The features pipeline ties together a myriad of various datasources:
*
*
* - The Overpass-API
* - The OSM-API
* - Third-party geojson files, either sliced or directly.
*
*
* In order to truly understand this class, please have a look at the following diagram: https://cdn-images-1.medium.com/fit/c/800/618/1*qTK1iCtyJUr4zOyw4IFD7A.jpeg
*
*
*
*
*/
export default class FeaturePipeline {
@ -68,7 +68,7 @@ export default class FeaturePipeline {
private readonly freshnesses = new Map<string, TileFreshnessCalculator>();
private readonly oldestAllowedDate: Date = new Date(new Date().getTime() - 60 * 60 * 24 * 30 * 1000);
private readonly oldestAllowedDate: Date;
private readonly osmSourceZoomLevel
constructor(
@ -90,10 +90,23 @@ export default class FeaturePipeline {
this.state = state;
const self = this
const expiryInSeconds = Math.min(...state.layoutToUse.layers.map(l => l.maxAgeOfCache))
for (const layer of state.layoutToUse.layers) {
TiledFromLocalStorageSource.cleanCacheForLayer(layer)
}
this.oldestAllowedDate = new Date(new Date().getTime() - expiryInSeconds);
this.osmSourceZoomLevel = state.osmApiTileSize.data;
// milliseconds
const useOsmApi = state.locationControl.map(l => l.zoom > (state.overpassMaxZoom.data ?? 12))
this.relationTracker = new RelationsTracker()
state.changes.allChanges.addCallbackAndRun(allChanges => {
allChanges.filter(ch => ch.id < 0 && ch.changes !== undefined)
.map(ch => ch.changes)
.filter(coor => coor["lat"] !== undefined && coor["lon"] !== undefined)
.forEach(coor => {
SaveTileToLocalStorageActor.poison(state.layoutToUse.layers.map(l => l.id), coor["lon"], coor["lat"])
})
})
this.sufficientlyZoomed = state.locationControl.map(location => {
@ -218,7 +231,7 @@ export default class FeaturePipeline {
maxZoomLevel: state.layoutToUse.clustering.maxZoom,
registerTile: (tile) => {
// We save the tile data for the given layer to local storage
if(source.layer.layerDef.source.geojsonSource === undefined || source.layer.layerDef.source.isOsmCacheLayer == true){
if (source.layer.layerDef.source.geojsonSource === undefined || source.layer.layerDef.source.isOsmCacheLayer == true) {
new SaveTileToLocalStorageActor(tile, tile.tileIndex)
}
perLayerHierarchy.get(source.layer.layerDef.id).registerTile(new RememberingSource(tile))
@ -255,7 +268,7 @@ export default class FeaturePipeline {
this.runningQuery = updater.runningQuery.map(
overpass => {
console.log("FeaturePipeline: runningQuery state changed. Overpass", overpass ? "is querying," : "is idle,",
"osmFeatureSource is", osmFeatureSource.isRunning ? "is running and needs "+neededTilesFromOsm.data?.length+" tiles (already got "+ osmFeatureSource.downloadedTiles.size +" tiles )" : "is idle")
"osmFeatureSource is", osmFeatureSource.isRunning ? "is running and needs " + neededTilesFromOsm.data?.length + " tiles (already got " + osmFeatureSource.downloadedTiles.size + " tiles )" : "is idle")
return overpass || osmFeatureSource.isRunning.data;
}, [osmFeatureSource.isRunning]
)
@ -351,7 +364,7 @@ export default class FeaturePipeline {
isActive: useOsmApi.map(b => !b && overpassIsActive.data, [overpassIsActive]),
onBboxLoaded: (bbox, date, downloadedLayers, paddedToZoomLevel) => {
Tiles.MapRange(bbox.containingTileRange(paddedToZoomLevel), (x, y) => {
const tileIndex = Tiles.tile_index(paddedToZoomLevel, x, y)
const tileIndex = Tiles.tile_index(paddedToZoomLevel, x, y)
downloadedLayers.forEach(layer => {
self.freshnesses.get(layer.id).addTileLoad(tileIndex, date)
SaveTileToLocalStorageActor.MarkVisited(layer.id, tileIndex, date)
@ -410,7 +423,7 @@ export default class FeaturePipeline {
}
public GetFeaturesWithin(layerId: string, bbox: BBox): any[][] {
if(layerId === "*"){
if (layerId === "*") {
return this.GetAllFeaturesWithin(bbox)
}
const requestedHierarchy = this.perLayerHierarchy.get(layerId)

View file

@ -5,6 +5,7 @@ import TileHierarchy from "./TileHierarchy";
import SaveTileToLocalStorageActor from "../Actors/SaveTileToLocalStorageActor";
import {Tiles} from "../../../Models/TileRange";
import {BBox} from "../../BBox";
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig";
export default class TiledFromLocalStorageSource implements TileHierarchy<FeatureSourceForLayer & Tiled> {
public readonly loadedTiles: Map<number, FeatureSourceForLayer & Tiled> = new Map<number, FeatureSourceForLayer & Tiled>();
@ -16,7 +17,7 @@ export default class TiledFromLocalStorageSource implements TileHierarchy<Featur
const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layerId + "-"
const freshnesses = new Map<number, Date>()
for (const key of Object.keys(localStorage)) {
if(!(key.startsWith(prefix) && key.endsWith("-time"))){
if (!(key.startsWith(prefix) && key.endsWith("-time"))) {
continue
}
const index = Number(key.substring(prefix.length, key.length - "-time".length))
@ -28,6 +29,28 @@ export default class TiledFromLocalStorageSource implements TileHierarchy<Featur
return freshnesses
}
static cleanCacheForLayer(layer: LayerConfig) {
const now = new Date()
const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layer.id + "-"
console.log("Cleaning tiles of ", prefix, "with max age",layer.maxAgeOfCache)
for (const key of Object.keys(localStorage)) {
if (!(key.startsWith(prefix) && key.endsWith("-time"))) {
continue
}
const index = Number(key.substring(prefix.length, key.length - "-time".length))
const time = Number(localStorage.getItem(key))
const timeDiff = (now.getTime() - time) / 1000
if(timeDiff >= layer.maxAgeOfCache){
const k = prefix+index;
localStorage.removeItem(k)
localStorage.removeItem(k+"-format")
localStorage.removeItem(k+"-time")
}
}
}
constructor(layer: FilteredLayer,
handleFeatureSource: (src: FeatureSourceForLayer & Tiled, index: number) => void,
state: {
@ -36,7 +59,7 @@ export default class TiledFromLocalStorageSource implements TileHierarchy<Featur
this.layer = layer;
this.handleFeatureSource = handleFeatureSource;
this.undefinedTiles = new Set<number>()
const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layer.layerDef.id + "-"
const knownTiles: number[] = Object.keys(localStorage)
@ -56,9 +79,9 @@ export default class TiledFromLocalStorageSource implements TileHierarchy<Featur
if (version === undefined || version !== SaveTileToLocalStorageActor.formatVersion) {
// Invalid version! Remove this tile from local storage
localStorage.removeItem(prefix)
localStorage.removeItem(prefix+"-time")
localStorage.removeItem(prefix+"-format")
this. undefinedTiles.add(index)
localStorage.removeItem(prefix + "-time")
localStorage.removeItem(prefix + "-format")
this.undefinedTiles.add(index)
console.log("Dropped old format tile", prefix)
}
}
@ -66,19 +89,19 @@ export default class TiledFromLocalStorageSource implements TileHierarchy<Featur
const self = this
state.currentBounds.map(bounds => {
if(bounds === undefined){
if (bounds === undefined) {
return;
}
for (const knownTile of knownTiles) {
if(this.loadedTiles.has(knownTile)){
if (this.loadedTiles.has(knownTile)) {
continue;
}
if(this.undefinedTiles.has(knownTile)){
if (this.undefinedTiles.has(knownTile)) {
continue;
}
if(!bounds.overlapsWith(BBox.fromTileIndex(knownTile))){
if (!bounds.overlapsWith(BBox.fromTileIndex(knownTile))) {
continue;
}
self.loadTile(knownTile)
@ -86,8 +109,8 @@ export default class TiledFromLocalStorageSource implements TileHierarchy<Featur
})
}
private loadTile( neededIndex: number){
private loadTile(neededIndex: number) {
try {
const key = SaveTileToLocalStorageActor.storageKey + "-" + this.layer.layerDef.id + "-" + neededIndex
const data = localStorage.getItem(key)

View file

@ -144,31 +144,20 @@ export default class FeatureSwitchState {
}
this.featureSwitchIsTesting = QueryParameters.GetQueryParameter(
this.featureSwitchIsTesting = QueryParameters.GetBooleanQueryParameter(
"test",
""+testingDefaultValue,
"If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org"
).map(
(str) => str === "true",
[],
(b) => "" + b
);
)
this.featureSwitchIsDebugging = QueryParameters.GetQueryParameter(
this.featureSwitchIsDebugging = QueryParameters.GetBooleanQueryParameter(
"debug",
"false",
"If true, shows some extra debugging help such as all the available tags on every object"
).map(
(str) => str === "true",
[],
(b) => "" + b
);
)
this.featureSwitchFakeUser = QueryParameters.GetQueryParameter("fake-user", "false",
this.featureSwitchFakeUser = QueryParameters.GetBooleanQueryParameter("fake-user", "false",
"If true, 'dryrun' mode is activated and a fake user account is loaded")
.map(str => str === "true", [], b => "" + b);
this.overpassUrl = QueryParameters.GetQueryParameter("overpassUrl",

View file

@ -119,7 +119,7 @@ export default class MapState extends UserRelatedState {
this.overlayToggles = this.layoutToUse.tileLayerSources.filter(c => c.name !== undefined).map(c => ({
config: c,
isDisplayed: QueryParameters.GetQueryParameter("overlay-" + c.id, "" + c.defaultState, "Wether or not the overlay " + c.id + " is shown").map(str => str === "true", [], b => "" + b)
isDisplayed: QueryParameters.GetBooleanQueryParameter("overlay-" + c.id, "" + c.defaultState, "Wether or not the overlay " + c.id + " is shown")
}))
this.filteredLayers = this.InitializeFilteredLayers()
@ -170,17 +170,12 @@ export default class MapState extends UserRelatedState {
.map(value => value === "yes", [], enabled => {
return enabled ? "yes" : "";
})
isDisplayed.addCallbackAndRun(d => console.log("IsDisplayed for layer", layer.id, "is currently", d))
} else {
isDisplayed = QueryParameters.GetQueryParameter(
isDisplayed = QueryParameters.GetBooleanQueryParameter(
"layer-" + layer.id,
"true",
"Wether or not layer " + layer.id + " is shown"
).map<boolean>(
(str) => str !== "false",
[],
(b) => b.toString()
);
)
}
const flayer = {
isDisplayed: isDisplayed,

View file

@ -55,6 +55,10 @@ export class QueryParameters {
return source;
}
public static GetBooleanQueryParameter(key: string, deflt: string, documentation?: string): UIEventSource<boolean>{
return QueryParameters.GetQueryParameter(key, deflt, documentation).map(str => str === "true", [], b => ""+b)
}
public static GenerateQueryParameterDocs(): string {
const docs = [QueryParameters.QueryParamDocsIntro];
for (const key in QueryParameters.documentation) {

View file

@ -2,7 +2,7 @@ import {Utils} from "../Utils";
export default class Constants {
public static vNumber = "0.11.0";
public static vNumber = "0.12.0-beta";
public static ImgurApiKey = '7070e7167f0a25a'
public static readonly mapillary_client_token_v3 = 'TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2'
public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"

View file

@ -62,8 +62,13 @@ export interface LayerConfigJson {
* NOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: "key=value"}
* While still supported, this is considered deprecated
*/
source: { osmTags: AndOrTagConfigJson | string, overpassScript?: string } |
{ osmTags: AndOrTagConfigJson | string, geoJson: string, geoJsonZoomLevel?: number, isOsmCache?: boolean }
source: ({ osmTags: AndOrTagConfigJson | string, overpassScript?: string } |
{ osmTags: AndOrTagConfigJson | string, geoJson: string, geoJsonZoomLevel?: number, isOsmCache?: boolean }) & ({
/**
* The maximum amount of seconds that a tile is allowed to linger in the cache
*/
maxCacheAge?: number
})
/**
*

View file

@ -162,26 +162,6 @@ export interface LayoutConfigJson {
*/
tileLayerSources?: TilesourceConfigJson[]
/**
* The number of seconds that a feature is allowed to stay in the cache.
* The caching flow is as following:
*
* 1. The application is opened the first time
* 2. An overpass query is run
* 3. The result is saved to local storage
*
* On the next opening:
*
* 1. The application is opened
* 2. Data is loaded from cache and displayed
* 3. An overpass query is run
* 4. All data (both from overpass ánd local storage) are saved again to local storage (except when to old)
*
* Default value: 60 days
*/
cacheTimout?: number;
/**
* The layers to display.
*

View file

@ -40,6 +40,10 @@ export default class LayerConfig extends WithContextLoader {
public readonly deletion: DeleteConfig | null;
public readonly allowMove: MoveConfig | null
public readonly allowSplit: boolean
/**
* In seconds
*/
public readonly maxAgeOfCache: number
presets: PresetConfig[];
@ -59,7 +63,9 @@ export default class LayerConfig extends WithContextLoader {
// @ts-ignore
legacy = TagUtils.Tag(json["overpassTags"], context + ".overpasstags");
}
if (json.source !== undefined) {
this.maxAgeOfCache = json.source.maxCacheAge ?? 24 * 60 * 60 * 30
if (legacy !== undefined) {
throw (
context +
@ -102,7 +108,6 @@ export default class LayerConfig extends WithContextLoader {
}
this.id = json.id;
this.allowSplit = json.allowSplit ?? false;
this.name = Translations.T(json.name, context + ".name");
this.units = (json.units ?? []).map(((unitJson, i) => Unit.fromJson(unitJson, `${context}.unit[${i}]`)))

View file

@ -48,10 +48,7 @@ export default class LayoutConfig {
public readonly enableIframePopout: boolean;
public readonly customCss?: string;
/*
How long is the cache valid, in seconds?
*/
public readonly cacheTimeout?: number;
public readonly overpassUrl: string[];
public readonly overpassTimeout: number;
public readonly overpassMaxZoom: number
@ -136,7 +133,6 @@ export default class LayoutConfig {
this.enablePdfDownload = json.enablePdfDownload ?? false;
this.enableIframePopout = json.enableIframePopout ?? true
this.customCss = json.customCss;
this.cacheTimeout = json.cacheTimout ?? (60 * 24 * 60 * 60)
this.overpassUrl = Constants.defaultOverpassUrls
if(json.overpassUrl !== undefined){
if(typeof json.overpassUrl === "string"){

View file

@ -1,11 +0,0 @@
import {FixedUiElement} from "./FixedUiElement";
export default class Ornament extends FixedUiElement {
constructor() {
super("");
this.SetClass("pt-3 pb-3 flex justify-center box-border")
}
}

View file

@ -1,11 +1,11 @@
import {UIElement} from "../UIElement";
import Svg from "../../Svg";
import Combine from "./Combine";
import Ornament from "./Ornament";
import {FixedUiElement} from "./FixedUiElement";
import {UIEventSource} from "../../Logic/UIEventSource";
import Hash from "../../Logic/Web/Hash";
import BaseUIElement from "../BaseUIElement";
import Img from "./Img";
/**
*
@ -18,34 +18,43 @@ import BaseUIElement from "../BaseUIElement";
*/
export default class ScrollableFullScreen extends UIElement {
private static readonly empty = new FixedUiElement("");
private static readonly _actor = ScrollableFullScreen.InitActor();
private static _currentlyOpen: ScrollableFullScreen;
public isShown: UIEventSource<boolean>;
private _component: BaseUIElement;
private _fullscreencomponent: BaseUIElement;
private _hashToSet: string;
constructor(title: ((mode: string) => BaseUIElement), content: ((mode: string) => BaseUIElement),
hashToSet: string,
hashToShow: string,
isShown: UIEventSource<boolean> = new UIEventSource<boolean>(false)
) {
super();
this.isShown = isShown;
this._hashToSet = hashToSet;
if (hashToShow === undefined) {
throw "HashToShow should be defined as it is vital for the 'back' key functionality"
}
this._component = this.BuildComponent(title("desktop"), content("desktop"), isShown)
.SetClass("hidden md:block");
this._fullscreencomponent = this.BuildComponent(title("mobile"), content("mobile"), isShown);
this._fullscreencomponent = this.BuildComponent(title("mobile"), content("mobile").SetClass("pb-20"), isShown);
const self = this;
isShown.addCallback(isShown => {
if (isShown) {
self.Activate();
Hash.hash.setData(hashToShow)
} else {
ScrollableFullScreen.clear();
}
})
Hash.hash.addCallback(hash => {
if (hash === hashToShow) {
return
}
isShown.setData(false)
})
}
private static clear() {
@ -56,15 +65,6 @@ export default class ScrollableFullScreen extends UIElement {
Hash.hash.setData(undefined);
}
private static InitActor() {
Hash.hash.addCallback(hash => {
if (hash === undefined || hash === "") {
ScrollableFullScreen.clear()
}
});
return true;
}
InnerRender(): BaseUIElement {
return this._component;
}
@ -72,9 +72,6 @@ export default class ScrollableFullScreen extends UIElement {
Activate(): void {
this.isShown.setData(true)
this._fullscreencomponent.AttachTo("fullscreen");
if (this._hashToSet != undefined) {
Hash.hash.setData(this._hashToSet)
}
const fs = document.getElementById("fullscreen");
ScrollableFullScreen._currentlyOpen = this;
fs.classList.remove("hidden")
@ -83,25 +80,26 @@ export default class ScrollableFullScreen extends UIElement {
private BuildComponent(title: BaseUIElement, content: BaseUIElement, isShown: UIEventSource<boolean>) {
const returnToTheMap =
new Combine([
Svg.back_svg().SetClass("block md:hidden"),
Svg.close_svg().SetClass("hidden md:block")
])
.onClick(() => {
isShown.setData(false)
}).SetClass("mb-2 bg-blue-50 rounded-full w-12 h-12 p-1.5 flex-shrink-0")
new Img(Svg.back.replace(/#000000/g, "#cccccc"), true)
.SetClass("block md:hidden w-12 h-12 p-2"),
new Img(Svg.close.replace(/#000000/g, "#cccccc"), true)
.SetClass("hidden md:block w-12 h-12 p-3")
]).SetClass("rounded-full p-0 flex-shrink-0 self-center")
title.SetClass("block text-l sm:text-xl md:text-2xl w-full font-bold p-2 pl-4 max-h-20vh overflow-y-auto")
const ornament = new Combine([new Ornament().SetStyle("height:5em;")])
.SetClass("md:hidden h-5")
returnToTheMap.onClick(() => {
isShown.setData(false)
})
title.SetClass("block text-l sm:text-xl md:text-2xl w-full font-bold p-0 max-h-20vh overflow-y-auto")
return new Combine([
new Combine([
new Combine([returnToTheMap, title])
.SetClass("border-b-2 border-black shadow md:shadow-none bg-white p-2 pb-0 md:p-0 flex flex-shrink-0"),
new Combine([content, ornament])
.SetClass("border-b-1 border-black shadow bg-white flex flex-shrink-0 pt-1 pb-1 md:pt-0 md:pb-0"),
new Combine([content])
.SetClass("block p-2 md:pt-4 w-full h-full overflow-y-auto md:max-h-65vh"),
// We add an ornament which takes around 5em. This is in order to make sure the Web UI doesn't hide
]).SetClass("flex flex-col h-full relative bg-white")
]).SetClass("fixed top-0 left-0 right-0 h-screen w-screen md:max-h-65vh md:w-auto md:relative z-above-controls");
]).SetClass("fixed top-0 left-0 right-0 h-screen w-screen md:max-h-65vh md:w-auto md:relative z-above-controls md:rounded-xl overflow-hidden");
}

View file

@ -9,12 +9,11 @@ import {DownloadPanel} from "./DownloadPanel";
import {SubtleButton} from "../Base/SubtleButton";
import Svg from "../../Svg";
import ExportPDF from "../ExportPDF";
import {FixedUiElement} from "../Base/FixedUiElement";
export default class AllDownloads extends ScrollableFullScreen {
constructor(isShown: UIEventSource<boolean>) {
super(AllDownloads.GenTitle, AllDownloads.GeneratePanel, "layers", isShown);
super(AllDownloads.GenTitle, AllDownloads.GeneratePanel, "downloads", isShown);
}
private static GenTitle(): BaseUIElement {

View file

@ -40,20 +40,16 @@ export default class FilterView extends VariableUiElement {
const iconUnselected = new Combine([Svg.checkbox_empty]).SetStyle(
iconStyle
);
const name: Translation = config.config.name.Clone();
const name: Translation = config.config.name;
const styledNameChecked = name
.Clone()
.SetStyle("font-size:large;padding-left:1.25rem");
const styledNameChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
const styledNameUnChecked = name
.Clone()
.SetStyle("font-size:large;padding-left:1.25rem");
const styledNameUnChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
const zoomStatus =
new Toggle(
undefined,
Translations.t.general.layerSelection.zoomInToSeeThisLayer.Clone()
Translations.t.general.layerSelection.zoomInToSeeThisLayer
.SetClass("alert")
.SetStyle("display: block ruby;width:min-content;"),
State.state.locationControl.map(location => location.zoom >= config.config.minzoom)
@ -97,20 +93,16 @@ export default class FilterView extends VariableUiElement {
const name: Translation = Translations.WT(
filteredLayer.layerDef.name
)?.Clone();
);
const styledNameChecked = name
.Clone()
.SetStyle("font-size:large;padding-left:1.25rem");
const styledNameChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
const styledNameUnChecked = name
.Clone()
.SetStyle("font-size:large;padding-left:1.25rem");
const styledNameUnChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
const zoomStatus =
new Toggle(
undefined,
Translations.t.general.layerSelection.zoomInToSeeThisLayer.Clone()
Translations.t.general.layerSelection.zoomInToSeeThisLayer
.SetClass("alert")
.SetStyle("display: block ruby;width:min-content;"),
State.state.locationControl.map(location => location.zoom >= filteredLayer.layerDef.minzoom)

View file

@ -30,7 +30,8 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
super(
() => layoutToUse.title.Clone(),
() => FullWelcomePaneWithTabs.GenerateContents(state, currentTab, isShown),
undefined, isShown
"welcome",
isShown
)
}
@ -49,7 +50,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
{header: `<img src='${state.layoutToUse.icon}'>`, content: welcome},
{
header: Svg.osm_logo_img,
content: Translations.t.general.openStreetMapIntro.Clone().SetClass("link-underline")
content: Translations.t.general.openStreetMapIntro.SetClass("link-underline")
},
]
@ -63,7 +64,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
header: Svg.add_img,
content:
new Combine([
Translations.t.general.morescreen.intro.Clone(),
Translations.t.general.morescreen.intro,
new MoreScreen(state)
]).SetClass("flex flex-col")
});
@ -85,7 +86,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
tabsWithAboutMc.push({
header: Svg.help,
content: new Combine([Translations.t.general.aboutMapcomplete.Clone()
content: new Combine([Translations.t.general.aboutMapcomplete
.Subs({"osmcha_link": Utils.OsmChaLinkFor(7)}), "<br/>Version " + Constants.vNumber])
.SetClass("link-underline")
}

View file

@ -26,12 +26,12 @@ export default class LeftControls extends Combine {
featureSwitchEnableExport: UIEventSource<boolean>,
featureSwitchExportAsPdf: UIEventSource<boolean>,
filteredLayers: UIEventSource<FilteredLayer[]>,
featureSwitchFilter: UIEventSource<boolean>,
selectedElement: UIEventSource<any>
featureSwitchFilter: UIEventSource<boolean>
},
guiState: {
downloadControlIsOpened: UIEventSource<boolean>,
filterViewIsOpened: UIEventSource<boolean>,
copyrightViewIsOpened: UIEventSource<boolean>
}) {
const toggledCopyright = new ScrollableFullScreen(
@ -41,7 +41,8 @@ export default class LeftControls extends Combine {
state.layoutToUse,
new ContributorCount(state).Contributors
),
undefined
"copyright",
guiState.copyrightViewIsOpened
);
const copyrightButton = new Toggle(
@ -49,8 +50,7 @@ export default class LeftControls extends Combine {
new MapControlButton(Svg.copyright_svg())
.onClick(() => toggledCopyright.isShown.setData(true)),
toggledCopyright.isShown
)
.SetClass("p-0.5");
).SetClass("p-0.5");
const toggledDownload = new Toggle(
new AllDownloads(
@ -73,11 +73,11 @@ export default class LeftControls extends Combine {
() => Translations.t.general.layerSelection.title.Clone(),
() =>
new FilterView(state.filteredLayers, state.overlayToggles).SetClass(
"block p-1 rounded-full"
"block p-1"
),
undefined,
"filters",
guiState.filterViewIsOpened
),
).SetClass("rounded-lg"),
new MapControlButton(Svg.filter_svg())
.onClick(() => guiState.filterViewIsOpened.setData(true)),
guiState.filterViewIsOpened
@ -90,18 +90,6 @@ export default class LeftControls extends Combine {
);
state.locationControl.addCallback(() => {
// Close the layer selection when the map is moved
toggledDownload.isEnabled.setData(false);
copyrightButton.isEnabled.setData(false);
toggledFilter.isEnabled.setData(false);
});
state.selectedElement.addCallbackAndRunD((_) => {
toggledDownload.isEnabled.setData(false);
copyrightButton.isEnabled.setData(false);
toggledFilter.isEnabled.setData(false);
});
super([filterButton,
downloadButtonn,
copyrightButton])

View file

@ -6,8 +6,6 @@ import {SubtleButton} from "../Base/SubtleButton";
import Translations from "../i18n/Translations";
import * as personal from "../../assets/themes/personal/personal.json"
import Constants from "../../Models/Constants";
import LanguagePicker from "../LanguagePicker";
import IndexText from "./IndexText";
import BaseUIElement from "../BaseUIElement";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import {UIEventSource} from "../../Logic/UIEventSource";
@ -201,14 +199,13 @@ export default class MoreScreen extends Combine {
}) ?? new UIEventSource<string>(`${linkPrefix}${linkSuffix}`)
let description = Translations.WT(layout.shortDescription).Clone();
return new SubtleButton(layout.icon,
new Combine([
`<dt class='text-lg leading-6 font-medium text-gray-900 group-hover:text-blue-800'>`,
Translations.WT(layout.title).Clone(),
Translations.WT(layout.title),
`</dt>`,
`<dd class='mt-1 text-base text-gray-500 group-hover:text-blue-900 overflow-ellipsis'>`,
description.Clone().SetClass("subtle") ?? "",
Translations.WT(layout.shortDescription)?.SetClass("subtle") ?? "",
`</dd>`,
]), {url: linkText, newTab: false});
}

View file

@ -26,44 +26,71 @@ import StrayClickHandler from "../Logic/Actors/StrayClickHandler";
import Lazy from "./Base/Lazy";
export class DefaultGuiState {
public readonly welcomeMessageIsOpened;
public readonly welcomeMessageIsOpened : UIEventSource<boolean>;
public readonly downloadControlIsOpened: UIEventSource<boolean>;
public readonly filterViewIsOpened: UIEventSource<boolean>;
public readonly welcomeMessageOpenedTab
public readonly copyrightViewIsOpened: UIEventSource<boolean>;
public readonly welcomeMessageOpenedTab: UIEventSource<number>
public readonly allFullScreenStates: UIEventSource<boolean>[] = []
constructor() {
this.filterViewIsOpened = QueryParameters.GetQueryParameter(
"filter-toggle",
"false",
"Whether or not the filter view is shown"
).map<boolean>(
(str) => str !== "false",
[],
(b) => "" + b
);
this.welcomeMessageIsOpened = new UIEventSource<boolean>(Hash.hash.data === undefined ||
Hash.hash.data === "" ||
Hash.hash.data == "welcome");
this.welcomeMessageOpenedTab = QueryParameters.GetQueryParameter(
this.welcomeMessageOpenedTab = UIEventSource.asFloat(QueryParameters.GetQueryParameter(
"tab",
"0",
`The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >${Constants.userJourney.mapCompleteHelpUnlock} changesets)`
).map<number>(
(str) => (isNaN(Number(str)) ? 0 : Number(str)),
[],
(n) => "" + n
);
this.downloadControlIsOpened =
QueryParameters.GetQueryParameter(
));
this.welcomeMessageIsOpened = QueryParameters.GetBooleanQueryParameter(
"welcome-control-toggle",
"false",
"Whether or not the welcome panel is shown"
)
this.downloadControlIsOpened = QueryParameters.GetBooleanQueryParameter(
"download-control-toggle",
"false",
"Whether or not the download panel is shown"
).map<boolean>(
(str) => str !== "false",
[],
(b) => "" + b
);
)
this.filterViewIsOpened = QueryParameters.GetBooleanQueryParameter(
"filter-toggle",
"false",
"Whether or not the filter view is shown"
)
this.copyrightViewIsOpened = QueryParameters.GetBooleanQueryParameter(
"copyright-toggle",
"false",
"Whether or not the copyright view is shown"
)
if(Hash.hash.data === "download"){
this.downloadControlIsOpened.setData(true)
}
if(Hash.hash.data === "filter"){
this.filterViewIsOpened.setData(true)
}
if(Hash.hash.data === "copyright"){
this.copyrightViewIsOpened.setData(true)
}
if(Hash.hash.data === "" || Hash.hash.data === undefined || Hash.hash.data === "welcome"){
this.welcomeMessageIsOpened.setData(true)
}
this.allFullScreenStates.push(this.downloadControlIsOpened, this.filterViewIsOpened, this.copyrightViewIsOpened, this.welcomeMessageIsOpened)
for (let i = 0; i < this.allFullScreenStates.length; i++){
const fullScreenState = this.allFullScreenStates[i];
for (let j = 0; j < this.allFullScreenStates.length; j++){
if(i == j){
continue
}
const otherState = this.allFullScreenStates[j];
fullScreenState.addCallbackAndRunD(isOpened => {
if(isOpened){
otherState.setData(false)
}
})
}
}
}
}
@ -154,6 +181,7 @@ export default class DefaultGUI {
Toggle.If(state.featureSwitchIframePopoutEnabled, iframePopout),
state.featureSwitchWelcomeMessage
).AttachTo("messagesbox");
new LeftControls(state, guiState).AttachTo("bottom-left");
new RightControls(state).AttachTo("bottom-right");
@ -162,6 +190,21 @@ export default class DefaultGUI {
document
.getElementById("centermessage")
.classList.add("pointer-events-none");
// We have to ping the welcomeMessageIsOpened and other isOpened-stuff to activate the FullScreenMessage if needed
for (const state of guiState.allFullScreenStates) {
if(state.data){
state.ping()
}
}
/**
* At last, if the map moves or an element is selected, we close all the panels just as well
*/
state.selectedElement.addCallbackAndRunD((_) => {
guiState.allFullScreenStates.forEach(s => s.setData(false))
});
}
private InitWelcomeMessage() : BaseUIElement{

View file

@ -26,7 +26,7 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
) {
super(() => FeatureInfoBox.GenerateTitleBar(tags, layerConfig),
() => FeatureInfoBox.GenerateContent(tags, layerConfig),
undefined);
tags.data.id);
if (layerConfig === undefined) {
throw "Undefined layerconfig";
@ -178,7 +178,6 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
allRenderings.push(editors)
return new Combine(allRenderings).SetClass("block")
}
/**

View file

@ -17,7 +17,6 @@ import ChangeLocationAction from "../../Logic/Osm/Actions/ChangeLocationAction";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import MoveConfig from "../../Models/ThemeConfig/MoveConfig";
import {ElementStorage} from "../../Logic/ElementStorage";
import ValidatedTextField from "../Input/ValidatedTextField";
import AvailableBaseLayers from "../../Logic/Actors/AvailableBaseLayers";
interface MoveReason {
@ -47,7 +46,7 @@ export default class MoveWizard extends Toggle {
const t = Translations.t.move
const loginButton = new Toggle(
t.loginToMove.Clone().SetClass("btn").onClick(() => state.osmConnection.AttemptLogin()),
t.loginToMove.SetClass("btn").onClick(() => state.osmConnection.AttemptLogin()),
undefined,
state.featureSwitchUserbadge
)
@ -55,8 +54,8 @@ export default class MoveWizard extends Toggle {
const reasons: MoveReason[] = []
if (options.enableRelocation) {
reasons.push({
text: t.reasons.reasonRelocation.Clone(),
invitingText: t.inviteToMove.reasonRelocation.Clone(),
text: t.reasons.reasonRelocation,
invitingText: t.inviteToMove.reasonRelocation,
icon: Svg.relocation_svg(),
changesetCommentValue: "relocated",
lockBounds: false,
@ -67,7 +66,7 @@ export default class MoveWizard extends Toggle {
}
if(options.enableImproveAccuracy){
reasons.push({
text: t.reasons.reasonInaccurate.Clone(),
text: t.reasons.reasonInaccurate,
invitingText: t.inviteToMove.reasonInaccurate,
icon: Svg.crosshair_svg(),
changesetCommentValue: "improve_accuracy",
@ -86,14 +85,14 @@ export default class MoveWizard extends Toggle {
moveReason.setData(reason)
moveButton = new SubtleButton(
reason.icon.SetStyle("height: 1.5rem; width: auto;"),
Translations.WT(reason.invitingText).Clone()
Translations.WT(reason.invitingText)
).onClick(() => {
currentStep.setData("pick_location")
})
}else{
moveButton = new SubtleButton(
Svg.move_ui().SetStyle("height: 1.5rem; width: auto"),
t.inviteToMove.generic.Clone()
t.inviteToMove.generic
).onClick(() => {
currentStep.setData("reason")
})
@ -102,7 +101,7 @@ export default class MoveWizard extends Toggle {
const moveAgainButton = new SubtleButton(
Svg.move_ui(),
t.inviteToMoveAgain.Clone()
t.inviteToMoveAgain
).onClick(() => {
currentStep.setData("reason")
})
@ -152,7 +151,7 @@ export default class MoveWizard extends Toggle {
confirmMove.onClick(() => {
const loc = locationInput.GetValue().data
state.changes.applyAction(new ChangeLocationAction(featureToMove.properties.id, [loc.lon, loc.lat], {
reason: Translations.WT(reason.text).textFor("en"),
reason: reason.changesetCommentValue,
theme: state.layoutToUse.id
}))
featureToMove.properties._lat = loc.lat
@ -160,7 +159,7 @@ export default class MoveWizard extends Toggle {
state.allElements.getEventSourceById(id).ping()
currentStep.setData("moved")
})
const zoomInFurhter = t.zoomInFurther.Clone().SetClass("alert block m-6")
const zoomInFurhter = t.zoomInFurther.SetClass("alert block m-6")
return new Combine([
locationInput,
new Toggle(confirmMove, zoomInFurhter, locationInput.GetValue().map(l => l.zoom >= 19))
@ -175,11 +174,11 @@ export default class MoveWizard extends Toggle {
case "start":
return moveButton;
case "reason":
return new Combine([t.whyMove.Clone().SetClass("text-lg font-bold"), selectReason, cancelButton]).SetClass(dialogClasses);
return new Combine([t.whyMove.SetClass("text-lg font-bold"), selectReason, cancelButton]).SetClass(dialogClasses);
case "pick_location":
return new Combine([t.moveTitle.Clone().SetClass("text-lg font-bold"), new VariableUiElement(locationInput), cancelButton]).SetClass(dialogClasses)
return new Combine([t.moveTitle.SetClass("text-lg font-bold"), new VariableUiElement(locationInput), cancelButton]).SetClass(dialogClasses)
case "moved":
return new Combine([t.pointIsMoved.Clone().SetClass("thanks"), moveAgainButton]).SetClass("flex flex-col");
return new Combine([t.pointIsMoved.SetClass("thanks"), moveAgainButton]).SetClass("flex flex-col");
}
@ -196,20 +195,20 @@ export default class MoveWizard extends Toggle {
const moveDisallowedReason = new UIEventSource<BaseUIElement>(undefined)
if (id.startsWith("way")) {
moveDisallowedReason.setData(t.isWay.Clone())
moveDisallowedReason.setData(t.isWay)
} else if (id.startsWith("relation")) {
moveDisallowedReason.setData(t.isRelation.Clone())
} else {
moveDisallowedReason.setData(t.isRelation)
} else if(id.indexOf("-") < 0) {
OsmObject.DownloadReferencingWays(id).then(referencing => {
if (referencing.length > 0) {
console.log("Got a referencing way, move not allowed")
moveDisallowedReason.setData(t.partOfAWay.Clone())
moveDisallowedReason.setData(t.partOfAWay)
}
})
OsmObject.DownloadReferencingRelations(id).then(partOf => {
if(partOf.length > 0){
moveDisallowedReason.setData(t.partOfRelation.Clone())
if(partOf.length > 0){
moveDisallowedReason.setData(t.partOfRelation)
}
})
}
@ -217,7 +216,7 @@ export default class MoveWizard extends Toggle {
moveFlow,
new Combine([
Svg.move_not_allowed_svg().SetStyle("height: 2rem").SetClass("m-2"),
new Combine([t.cannotBeMoved.Clone(),
new Combine([t.cannotBeMoved,
new VariableUiElement(moveDisallowedReason).SetClass("subtle")
]).SetClass("flex flex-col")
]).SetClass("flex m-2 p-2 rounded-lg bg-gray-200"),

View file

@ -26,6 +26,7 @@ import ChangeTagAction from "../../Logic/Osm/Actions/ChangeTagAction";
import TagRenderingConfig from "../../Models/ThemeConfig/TagRenderingConfig";
import {Unit} from "../../Models/Unit";
import VariableInputElement from "../Input/VariableInputElement";
import Toggle from "../Input/Toggle";
/**
* Shows the question element.
@ -75,7 +76,7 @@ export default class TagRenderingQuestion extends Combine {
const inputElement: InputElement<TagsFilter> =
new VariableInputElement(applicableMappingsSrc.map(applicableMappings =>
new VariableInputElement(applicableMappingsSrc.map(applicableMappings =>
TagRenderingQuestion.GenerateInputElement(configuration, applicableMappings, applicableUnit, tags)
))
@ -104,8 +105,11 @@ export default class TagRenderingQuestion extends Combine {
.onClick(save)
}
const saveButton = options.saveButtonConstr(inputElement.GetValue())
const saveButton = new Combine([
options.saveButtonConstr(inputElement.GetValue()),
new Toggle(Translations.t.general.testing, undefined, State.state.featureSwitchIsTesting).SetClass("alert")
])
let bottomTags: BaseUIElement;
if (options.bottomText !== undefined) {
bottomTags = options.bottomText(inputElement.GetValue())
@ -118,7 +122,7 @@ export default class TagRenderingQuestion extends Combine {
return "";
}
if (tagsFilter === undefined) {
return Translations.t.general.noTagsSelected.Clone().SetClass("subtle");
return Translations.t.general.noTagsSelected.SetClass("subtle");
}
if (csCount < Constants.userJourney.tagsVisibleAndWikiLinked) {
const tagsStr = tagsFilter.asHumanString(false, true, tags.data);
@ -135,6 +139,8 @@ export default class TagRenderingQuestion extends Combine {
options.cancelButton,
saveButton,
bottomTags])
this.SetClass("question disable-links")
}
@ -189,7 +195,7 @@ export default class TagRenderingQuestion extends Combine {
applicableMappings.map((mapping, i) => {
return {
value: new And([mapping.if, ...allIfNotsExcept(i)]),
shown: Translations.WT(mapping.then).Clone()
shown: Translations.WT(mapping.then)
}
})
)
@ -203,7 +209,7 @@ export default class TagRenderingQuestion extends Combine {
if (inputEls.length == 0) {
if(ff === undefined){
if (ff === undefined) {
throw "Error: could not generate a question: freeform and all mappings are undefined"
}
return ff;

View file

@ -122,13 +122,13 @@ export default class WikidataPreviewBox extends VariableUiElement {
const els : BaseUIElement[] = []
for (const extraProperty of WikidataPreviewBox.extraProperties) {
let hasAllRequirements =true
let hasAllRequirements = true
for (const requirement of extraProperty.requires) {
if(!wikidata.claims.has("P"+requirement.p)){
if(!wikidata.claims?.has("P"+requirement.p)){
hasAllRequirements = false;
break
}
if(!wikidata.claims.get("P"+requirement.p).has("Q"+requirement.q)){
if(!wikidata.claims?.get("P"+requirement.p).has("Q"+requirement.q)){
hasAllRequirements = false;
break
}

View file

@ -6,7 +6,6 @@ import BaseUIElement from "../BaseUIElement";
export default class Translations {
static t = AllTranslationAssets.t;
private static wtcache = {}
constructor() {
throw "Translations is static. If you want to intitialize a new translation, use the singular form"
@ -48,15 +47,10 @@ export default class Translations {
return undefined;
}
if (typeof (s) === "string") {
if (Translations.wtcache[s]) {
return Translations.wtcache[s];
}
const tr = new Translation({en: s});
Translations.wtcache[s] = tr;
return tr;
return new Translation({en: s});
}
if (s instanceof Translation) {
return s;
return s.Clone() /* MUST CLONE HERE! */;
}
console.error("Trying to Translation.WT, but got ", s)
throw "??? Not a valid translation"

View file

@ -129,8 +129,7 @@
"titleIcons": [
{
"render": "<a href='https://fietsambassade.gent.be/' target='_blank'><img src='./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg'/></a>",
"condition": "operator=De Fietsambassade Gent",
"roaming": true
"condition": "operator=De Fietsambassade Gent"
},
"defaults"
],
@ -616,16 +615,7 @@
"level"
],
"icon": {
"render": {
"en": "./assets/layers/bike_repair_station/repair_station.svg",
"ru": "./assets/layers/bike_repair_station/repair_station.svg",
"it": "./assets/layers/bike_repair_station/repair_station.svg",
"fi": "./assets/layers/bike_repair_station/repair_station.svg",
"fr": "./assets/layers/bike_repair_station/repair_station.svg",
"pt_BR": "./assets/layers/bike_repair_station/repair_station.svg",
"de": "./assets/layers/bike_repair_station/repair_station.svg",
"pt": "./assets/layers/bike_repair_station/repair_station.svg"
},
"render": "./assets/layers/bike_repair_station/repair_station.svg",
"mappings": [
{
"if": {
@ -673,7 +663,8 @@
"iconOverlays": [
{
"if": "operator=De Fietsambassade Gent",
"then": "./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg"
"then": "./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg",
"badge": true
}
],
"iconSize": {

View file

@ -7,7 +7,8 @@
"nb_NO": "Ladestasjoner",
"ru": "Зарядные станции",
"zh_Hant": "充電站",
"de": "Ladestationen"
"de": "Ladestationen",
"nl": "Oplaadpunten"
},
"minzoom": 10,
"source": {
@ -28,7 +29,8 @@
"nb_NO": "Ladestasjon",
"ru": "Зарядная станция",
"zh_Hant": "充電站",
"de": "Ladestation"
"de": "Ladestation",
"nl": "Oplaadpunten"
}
},
"description": {
@ -38,7 +40,8 @@
"nb_NO": "En ladestasjon",
"ru": "Зарядная станция",
"zh_Hant": "充電站",
"de": "Eine Ladestation"
"de": "Eine Ladestation",
"nl": "Oplaadpunten"
},
"tagRenderings": [
"images",
@ -293,7 +296,8 @@
},
"render": {
"en": "Using this charging station costs <b>{charge}</b>",
"nl": "Dit oplaadpunt gebruiken kost <b>{charge}</b>"
"nl": "Dit oplaadpunt gebruiken kost <b>{charge}</b>",
"de": "Die Nutzung dieser Ladestation kostet <b>{charge}</b>"
},
"mappings": [
{
@ -305,7 +309,8 @@
},
"then": {
"nl": "Gratis te gebruiken",
"en": "Free to use"
"en": "Free to use",
"de": "Nutzung kostenlos"
}
}
]
@ -351,7 +356,8 @@
},
"render": {
"en": "One can stay at most <b>{canonical(maxstay)}</b>",
"nl": "De maximale parkeertijd hier is <b>{canonical(maxstay)}</b>"
"nl": "De maximale parkeertijd hier is <b>{canonical(maxstay)}</b>",
"de": "Die maximale Parkzeit beträgt <b>{canonical(maxstay)}</b>"
},
"mappings": [
{
@ -469,7 +475,8 @@
"en": "What is the website of the operator?"
},
"render": {
"en": "More info on <a href='{website}'>{website}</a>"
"en": "More info on <a href='{website}'>{website}</a>",
"de": "Weitere Informationen auf <a href='{website}'>{website}</a>"
},
"freeform": {
"key": "website",
@ -483,7 +490,8 @@
"en": "What is the reference number of this charging station?"
},
"render": {
"en": "Reference number is <b>{ref}</b>"
"en": "Reference number is <b>{ref}</b>",
"de": "Die Kennziffer ist <b>{ref}</b>"
},
"freeform": {
"key": "ref"
@ -584,6 +592,51 @@
}
],
"presets": [
{
"tags": [
"amenity=charging_station",
"motorcar=no",
"bicycle=yes",
"socket:typee=1"
],
"title": {
"en": "Charging station",
"nl": "gewone stekker <img src='./assets/layers/charging_station/TypeE.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (bedoeld om electrische fietsen op te laden)",
"de": "Ladestation",
"ru": "Зарядная станция"
},
"preciseInput": {
"preferredBackground": "map"
}
},
{
"tags": [
"amenity=charging_station",
"motorcar=no",
"bicycle=yes"
],
"title": {
"en": "charging station for e-bikes",
"nl": "oplaadpunt voor elektrische fietsen"
},
"preciseInput": {
"preferredBackground": "map"
}
},
{
"tags": [
"amenity=charging_station",
"motorcar=yes",
"bicycle=no"
],
"title": {
"en": "charging station for cars",
"nl": "oplaadstation voor elektrische auto's"
},
"preciseInput": {
"preferredBackground": "map"
}
},
{
"tags": [
"amenity=charging_station"
@ -824,7 +877,8 @@
"humanSingular": {
"en": " hour",
"nl": " uur",
"ru": " час"
"ru": " час",
"de": " Stunde"
}
},
{
@ -844,7 +898,8 @@
"humanSingular": {
"en": " day",
"nl": " dag",
"ru": " день"
"ru": " день",
"de": " Tag"
}
}
]
@ -881,7 +936,8 @@
"human": {
"en": "Volts",
"nl": "volt",
"ru": "Вольт"
"ru": "Вольт",
"de": "Volt"
}
}
],
@ -951,7 +1007,8 @@
"human": {
"en": "kilowatt",
"nl": "kilowatt",
"ru": "киловатт"
"ru": "киловатт",
"de": "Kilowatt"
}
},
{
@ -962,7 +1019,8 @@
"human": {
"en": "megawatt",
"nl": "megawatt",
"ru": "мегаватт"
"ru": "мегаватт",
"de": "Megawatt"
}
}
],
@ -975,5 +1033,18 @@
"point"
]
}
]
],
"deletion": {
"softDeletionTags": {
"and": [
"amenity=",
"disused:amenity=charging_station"
]
},
"neededChangesets": 10
},
"allowMove": {
"enableRelocation": false,
"enableImproveAccuracy": true
}
}

View file

@ -2,11 +2,7 @@
"id": "charging_station",
"name": {
"en": "Charging stations",
"it": "Stazioni di ricarica",
"ja": "充電ステーション",
"nb_NO": "Ladestasjoner",
"ru": "Зарядные станции",
"zh_Hant": "充電站"
"nl": "Oplaadpunten"
},
"minzoom": 10,
"source": {
@ -22,27 +18,21 @@
"title": {
"render": {
"en": "Charging station",
"it": "Stazione di ricarica",
"ja": "充電ステーション",
"nb_NO": "Ladestasjon",
"ru": "Зарядная станция",
"zh_Hant": "充電站"
"nl": "Oplaadpunten"
}
},
"description": {
"en": "A charging station",
"it": "Una stazione di ricarica",
"ja": "充電ステーション",
"nb_NO": "En ladestasjon",
"ru": "Зарядная станция",
"zh_Hant": "充電站"
"nl": "Oplaadpunten"
},
"tagRenderings": [
"images",
{
"id": "Type",
"#": "Allowed vehicle types",
"question": {
"en": "Which vehicles are allowed to charge here?"
"en": "Which vehicles are allowed to charge here?",
"nl": "Welke voertuigen kunnen hier opgeladen worden?"
},
"multiAnswer": true,
"mappings": [
@ -50,35 +40,40 @@
"if": "bicycle=yes",
"ifnot": "bicycle=no",
"then": {
"en": "<b>bicycles</b> can be charged here"
"en": "<b>Bcycles</b> can be charged here",
"nl": "<b>Fietsen</b> kunnen hier opgeladen worden"
}
},
{
"if": "motorcar=yes",
"ifnot": "motorcar=no",
"then": {
"en": "<b>Cars</b> can be charged here"
"en": "<b>Cars</b> can be charged here",
"nl": "<b>Elektrische auto's</b> kunnen hier opgeladen worden"
}
},
{
"if": "scooter=yes",
"ifnot": "scooter=no",
"then": {
"en": "<b>Scooters</b> can be charged here"
"en": "<b>Scooters</b> can be charged here",
"nl": "<b>Electrische scooters</b> (snorfiets of bromfiets) kunnen hier opgeladen worden"
}
},
{
"if": "hgv=yes",
"ifnot": "hgv=no",
"then": {
"en": "<b>Heavy good vehicles</b> (such as trucks) can be charged here"
"en": "<b>Heavy good vehicles</b> (such as trucks) can be charged here",
"nl": "<b>Vrachtwagens</b> kunnen hier opgeladen worden"
}
},
{
"if": "bus=yes",
"ifnot": "bus=no",
"then": {
"en": "<b>Buses</b> can be charged here"
"en": "<b>Buses</b> can be charged here",
"nl": "<b>Bussen</b> kunnen hier opgeladen worden"
}
}
]
@ -86,10 +81,12 @@
{
"id": "access",
"question": {
"en": "Who is allowed to use this charging station?"
"en": "Who is allowed to use this charging station?",
"nl": "Wie mag er dit oplaadpunt gebruiken?"
},
"render": {
"en": "Access is {access}"
"en": "Access is {access}",
"nl": "Toegang voor {access}"
},
"freeform": {
"key": "access",
@ -100,7 +97,10 @@
"mappings": [
{
"if": "access=yes",
"then": "Anyone can use this charging station (payment might be needed)"
"then": {
"en": "Anyone can use this charging station (payment might be needed)",
"nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
}
},
{
"if": {
@ -109,16 +109,25 @@
"access=public"
]
},
"then": "Anyone can use this charging station (payment might be needed)",
"then": {
"en": "Anyone can use this charging station (payment might be needed)",
"nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
},
"hideInAnswer": true
},
{
"if": "access=customers",
"then": "Only customers of the place this station belongs to can use this charging station<br/><span class='subtle'>E.g. a charging station operated by hotel which is only usable by their guests</span> "
"then": {
"en": "Only customers of the place this station belongs to can use this charging station<br/><span class='subtle'>E.g. a charging station operated by hotel which is only usable by their guests</span>",
"nl": "Enkel <b>klanten van de bijhorende plaats</b> mogen dit oplaadpunt gebruiken<br/><span class='subtle'>Bv. op de parking van een hotel en enkel toegankelijk voor klanten van dit hotel</span>"
}
},
{
"if": "access=private",
"then": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)"
"then": {
"en": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)",
"nl": "Niet toegankelijk voor het publiek <br/><span class='subtle'>Bv. enkel toegankelijk voor de eigenaar, medewerkers ,...</span> "
}
}
]
},
@ -140,124 +149,6 @@
{
"id": "$$$"
},
{
"id": "Authentication",
"question": {
"en": "What kind of authentication is available at the charging station?",
"it": "Quali sono gli orari di apertura di questa stazione di ricarica?",
"ja": "この充電ステーションはいつオープンしますか?",
"nb_NO": "Når åpnet denne ladestasjonen?",
"ru": "В какое время работает эта зарядная станция?",
"zh_Hant": "何時是充電站開放使用的時間?"
},
"multiAnswer": true,
"mappings": [
{
"if": "authentication:membership_card=yes",
"ifnot": "authentication:membership_card=no",
"then": {
"en": "Authentication by a membership card"
}
},
{
"if": "authentication:app=yes",
"ifnot": "authentication:app=no",
"then": {
"en": "Authentication by an app"
}
},
{
"if": "authentication:phone_call=yes",
"ifnot": "authentication:phone_call=no",
"then": {
"en": "Authentication via phone call is available"
}
},
{
"if": "authentication:short_message=yes",
"ifnot": "authentication:short_message=no",
"then": {
"en": "Authentication via phone call is available"
}
},
{
"if": "authentication:nfc=yes",
"ifnot": "authentication:nfc=no",
"then": {
"en": "Authentication via NFC is available"
}
},
{
"if": "authentication:money_card=yes",
"ifnot": "authentication:money_card=no",
"then": {
"en": "Authentication via Money Card is available"
}
},
{
"if": "authentication:debit_card=yes",
"ifnot": "authentication:debit_card=no",
"then": {
"en": "Authentication via debit card is available"
}
},
{
"if": "authentication:none=yes",
"ifnot": "authentication:none=no",
"then": {
"en": "Charging here is (also) possible without authentication"
}
}
]
},
{
"id": "Auth phone",
"render": {
"en": "Authenticate by calling or SMS'ing to <a href='tel:{authentication:phone_call:number}'>{authentication:phone_call:number}</a>",
"it": "{network}",
"ja": "{network}",
"nb_NO": "{network}",
"ru": "{network}",
"zh_Hant": "{network}"
},
"question": {
"en": "What's the phone number for authentication call or SMS?",
"it": "A quale rete appartiene questa stazione di ricarica?",
"ja": "この充電ステーションの運営チェーンはどこですか?",
"ru": "К какой сети относится эта станция?",
"zh_Hant": "充電站所屬的網路是?"
},
"freeform": {
"key": "authentication:phone_call:number",
"type": "phone"
},
"condition": {
"or": [
"authentication:phone_call=yes",
"authentication:short_message=yes"
]
},
"it": {
"0": {
"then": "Non appartiene a una rete"
}
},
"ja": {
"0": {
"then": "大規模な運営チェーンの一部ではない"
}
},
"ru": {
"0": {
"then": "Не является частью более крупной сети"
}
},
"zh_Hant": {
"0": {
"then": "不屬於大型網路"
}
}
},
{
"id": "OH",
"render": "{opening_hours_table(opening_hours)}",
@ -266,48 +157,107 @@
"type": "opening_hours"
},
"question": {
"en": "When is this charging station opened?"
"en": "When is this charging station opened?",
"nl": "Wanneer is dit oplaadpunt beschikbaar??"
},
"mappings": [
{
"if": "opening_hours=24/7",
"then": {
"en": "24/7 opened (including holidays)"
"en": "24/7 opened (including holidays)",
"nl": "24/7 open - ook tijdens vakanties"
}
}
]
},
{
"id": "fee/charge",
"id": "fee",
"question": {
"en": "How much does one have to pay to use this charging station?",
"nl": "Hoeveel kost het gebruik van dit oplaadpunt?"
},
"freeform": {
"key": "charge",
"addExtraTags": [
"fee=yes"
]
},
"render": {
"en": "Using this charging station costs <b>{charge}</b>",
"nl": "Dit oplaadpunt gebruiken kost <b>{charge}</b>"
"en": "Does one have to pay to use this charging station?",
"nl": "Moet men betalen om dit oplaadpunt te gebruiken?"
},
"mappings": [
{
"if": {
"and": [
"fee=no",
"charge="
"fee=no"
]
},
"then": {
"nl": "Gratis te gebruiken",
"en": "Free to use"
},
"hideInAnswer": true
},
{
"if": {
"and": [
"fee=no",
"fee:conditional=",
"charge=",
"authentication:none=yes"
]
},
"then": {
"nl": "Gratis te gebruiken (zonder aan te melden)",
"en": "Free to use (without authenticating)"
}
},
{
"if": {
"and": [
"fee=no",
"fee:conditional=",
"charge=",
"authentication:none=no"
]
},
"then": {
"nl": "Gratis te gebruiken, maar aanmelden met een applicatie is verplicht",
"en": "Free to use, but one has to authenticate"
}
},
{
"if": {
"and": [
"fee=yes",
"fee:conditional=no @ customers"
]
},
"then": {
"nl": "Betalend te gebruiken, maar gratis voor klanten van het bijhorende hotel/café/ziekenhuis/...",
"en": "Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station"
}
},
{
"if": {
"and": [
"fee=yes",
"fee:conditional="
]
},
"then": {
"nl": "Betalend",
"en": "Paid use"
}
}
]
},
{
"id": "charge",
"question": {
"en": "How much does one have to pay to use this charging station?",
"nl": "Hoeveel moet men betalen om dit oplaadpunt te gebruiken?"
},
"render": {
"en": "Using this charging station costs <b>{charge}</b>",
"nl": "Dit oplaadpunt gebruiken kost <b>{charge}</b>"
},
"freeform": {
"key": "charge"
},
"condition": "fee=yes"
},
{
"id": "payment-options",
"builtin": "payment-options",
@ -338,6 +288,108 @@
]
}
},
{
"id": "Authentication",
"#": "In some cases, charging is free but one has to be authenticated. We only ask for authentication if fee is no (or unset). By default one sees the questions for either the payment options or the authentication options, but normally not both",
"question": {
"en": "What kind of authentication is available at the charging station?",
"nl": "Hoe kan men zich aanmelden aan dit oplaadstation?"
},
"multiAnswer": true,
"mappings": [
{
"if": "authentication:membership_card=yes",
"ifnot": "authentication:membership_card=no",
"then": {
"en": "Authentication by a membership card",
"nl": "Aanmelden met een lidkaart is mogelijk"
}
},
{
"if": "authentication:app=yes",
"ifnot": "authentication:app=no",
"then": {
"en": "Authentication by an app",
"nl": "Aanmelden via een applicatie is mogelijk"
}
},
{
"if": "authentication:phone_call=yes",
"ifnot": "authentication:phone_call=no",
"then": {
"en": "Authentication via phone call is available",
"nl": "Aanmelden door te bellen naar een telefoonnummer is mogelijk"
}
},
{
"if": "authentication:short_message=yes",
"ifnot": "authentication:short_message=no",
"then": {
"en": "Authentication via SMS is available",
"nl": "Aanmelden via SMS is mogelijk"
}
},
{
"if": "authentication:nfc=yes",
"ifnot": "authentication:nfc=no",
"then": {
"en": "Authentication via NFC is available",
"nl": "Aanmelden via NFC is mogelijk"
}
},
{
"if": "authentication:money_card=yes",
"ifnot": "authentication:money_card=no",
"then": {
"en": "Authentication via Money Card is available",
"nl": "Aanmelden met Money Card is mogelijk"
}
},
{
"if": "authentication:debit_card=yes",
"ifnot": "authentication:debit_card=no",
"then": {
"en": "Authentication via debit card is available",
"nl": "Aanmelden met een betaalkaart is mogelijk"
}
},
{
"if": "authentication:none=yes",
"ifnot": "authentication:none=no",
"then": {
"en": "Charging here is (also) possible without authentication",
"nl": "Hier opladen is (ook) mogelijk zonder aan te melden"
}
}
],
"condition": {
"or": [
"fee=no",
"fee="
]
}
},
{
"id": "Auth phone",
"render": {
"en": "Authenticate by calling or SMS'ing to <a href='tel:{authentication:phone_call:number}'>{authentication:phone_call:number}</a>",
"nl": "Aanmelden door te bellen of te SMS'en naar <a href='tel:{authentication:phone_call:number}'>{authentication:phone_call:number}</a>"
},
"question": {
"en": "What's the phone number for authentication call or SMS?",
"nl": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?"
},
"freeform": {
"key": "authentication:phone_call:number",
"type": "phone"
},
"condition": {
"or": [
"authentication:phone_call=yes",
"authentication:short_message=yes"
]
}
},
{
"id": "maxstay",
"question": {
@ -359,15 +411,20 @@
"nl": "Geen maximum parkeertijd"
}
}
]
],
"condition": {
"or": ["maxstay~*","motorcar=yes","hgv=yes","bus=yes"]
}
},
{
"id": "Network",
"render": {
"en": "Part of the network <b>{network}</b>"
"en": "Part of the network <b>{network}</b>",
"nl": "Maakt deel uit van het <b>{network}</b>-netwerk"
},
"question": {
"en": "Is this charging station part of a network?"
"en": "Is this charging station part of a network?",
"nl": "Is dit oplaadpunt deel van een groter netwerk?"
},
"freeform": {
"key": "network"
@ -376,13 +433,15 @@
{
"if": "no:network=yes",
"then": {
"en": "Not part of a bigger network"
"en": "Not part of a bigger network",
"nl": "Maakt geen deel uit van een groter netwerk"
}
},
{
"if": "network=none",
"then": {
"en": "Not part of a bigger network"
"en": "Not part of a bigger network",
"nl": "Maakt geen deel uit van een groter netwerk"
},
"hideInAnswer": true
},
@ -403,10 +462,12 @@
{
"id": "Operator",
"question": {
"en": "Who is the operator of this charging station?"
"en": "Who is the operator of this charging station?",
"nl": "Wie beheert dit oplaadpunt?"
},
"render": {
"en": "This charging station is operated by {operator}"
"en": "This charging station is operated by {operator}",
"nl": "Wordt beheerd door {operator}"
},
"freeform": {
"key": "operator"
@ -419,7 +480,8 @@
]
},
"then": {
"en": "Actually, {operator} is the network"
"en": "Actually, {operator} is the network",
"nl": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt"
},
"addExtraTags": [
"operator="
@ -431,10 +493,11 @@
{
"id": "phone",
"question": {
"en": "What number can one call if there is a problem with this charging station?"
"en": "What number can one call if there is a problem with this charging station?",
"nl": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?"
},
"render": {
"en": "In case of problems, call <a href='tel:{phone}'>{phone}</a>"
"en": "In case of problems, call <a href='tel:{phone}'>{phone}</a>", "nl": "Bij problemen, bel naar <a href='tel:{phone}'>{phone}</a>"
},
"freeform": {
"key": "phone",
@ -444,10 +507,12 @@
{
"id": "email",
"question": {
"en": "What is the email address of the operator?"
"en": "What is the email address of the operator?",
"nl": "Wat is het email-adres van de operator?"
},
"render": {
"en": "In case of problems, send an email to <a href='mailto:{email}'>{email}</a>"
"en": "In case of problems, send an email to <a href='mailto:{email}'>{email}</a>",
"nl": "Bij problemen, email naar <a href='mailto:{email}'>{email}</a>"
},
"freeform": {
"key": "email",
@ -457,10 +522,12 @@
{
"id": "website",
"question": {
"en": "What is the website of the operator?"
"en": "What is the website where one can find more information about this charging station?",
"nl": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?"
},
"render": {
"en": "More info on <a href='{website}'>{website}</a>"
"en": "More info on <a href='{website}'>{website}</a>",
"nl": "Meer informatie op <a href='{website}'>{website}</a>"
},
"freeform": {
"key": "website",
@ -471,14 +538,18 @@
{
"id": "ref",
"question": {
"en": "What is the reference number of this charging station?"
"en": "What is the reference number of this charging station?",
"nl": "Wat is het referentienummer van dit oplaadstation?"
},
"render": {
"en": "Reference number is <b>{ref}</b>"
"en": "Reference number is <b>{ref}</b>",
"nl": "Het referentienummer van dit oplaadpunt is <b>{ref}</b>"
},
"freeform": {
"key": "ref"
}
},
"#": "Only asked if part of a bigger network. Small operators typically don't have a reference number",
"condition":"network!="
},
{
"id": "Operational status",
@ -488,7 +559,30 @@
},
"mappings": [
{
"if": "operational_status=broken",
"if": {
"and": [
"planned:amenity=",
"construction:amenity=",
"disused:amenity=",
"operational_status=",
"amenity=charging_station"
]
},
"then": {
"en": "This charging station works",
"nl": "Dit oplaadpunt werkt"
}
},
{
"if": {
"and": [
"planned:amenity=",
"construction:amenity=",
"disused:amenity=",
"operational_status=broken",
"amenity=charging_station"
]
},
"then": {
"en": "This charging station is broken",
"nl": "Dit oplaadpunt is kapot"
@ -498,6 +592,9 @@
"if": {
"and": [
"planned:amenity=charging_station",
"construction:amenity=",
"disused:amenity=",
"operational_status=",
"amenity="
]
},
@ -507,9 +604,12 @@
}
},
{
"if": {
"if":{
"and": [
"planned:amenity=",
"construction:amenity=charging_station",
"disused:amenity=",
"operational_status=broken",
"amenity="
]
},
@ -521,7 +621,10 @@
{
"if": {
"and": [
"planned:amenity=",
"construction:amenity=",
"disused:amenity=charging_station",
"operational_status=broken",
"amenity="
]
},
@ -529,40 +632,40 @@
"en": "This charging station has beed permanently disabled and is not in use anymore but is still visible",
"nl": "Dit oplaadpunt is niet meer in gebruik maar is wel nog aanwezig"
}
},
{
"if": {
"and": [
"amenity=charging_station",
"operational_status="
]
},
"then": {
"en": "This charging station works",
"nl": "Dit oplaadpunt werkt"
}
}
]
},
{
"id": "Parking:fee",
"question": {
"en": "Does one have to pay a parking fee while charging?"
"en": "Does one have to pay a parking fee while charging?",
"nl": "Moet men parkeergeld betalen tijdens het opladen?"
},
"mappings": [
{
"if": "parking:fee=no",
"then": {
"en": "No additional parking cost while charging"
"en": "No additional parking cost while charging",
"nl": "Geen extra parkeerkost tijdens het opladen"
}
},
{
"if": "parking:fee=yes",
"then": {
"en": "An additional parking fee should be paid while charging"
"en": "An additional parking fee should be paid while charging",
"nl": "Tijdens het opladen moet er parkeergeld betaald worden"
}
}
]
],
"condition": {
"or": [
"motor_vehicle=yes",
"hgv=yes",
"bus=yes",
"bicycle=no",
"bicycle="
]
}
}
],
"mapRendering": [
@ -629,12 +732,56 @@
}
],
"presets": [
{
"tags": [
"amenity=charging_station",
"motorcar=no",
"bicycle=yes",
"socket:typee=1"
],
"title": {
"en": "electrical outlet to charge e-bikes",
"nl": "laadpunt met gewone stekker(s) <img src='./assets/layers/charging_station/TypeE.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (bedoeld om electrische fietsen op te laden)"
},
"preciseInput": {
"preferredBackground": "map"
}
},
{
"tags": [
"amenity=charging_station",
"motorcar=no",
"bicycle=yes"
],
"title": {
"en": "charging station for e-bikes",
"nl": "oplaadpunt voor elektrische fietsen"
},
"preciseInput": {
"preferredBackground": "map"
}
},
{
"tags": [
"amenity=charging_station",
"motorcar=yes",
"bicycle=no"
],
"title": {
"en": "charging station for cars",
"nl": "oplaadstation voor elektrische auto's"
},
"preciseInput": {
"preferredBackground": "map"
}
},
{
"tags": [
"amenity=charging_station"
],
"title": {
"en": "Charging station"
"en": "charging station",
"nl": "oplaadstation"
},
"preciseInput": {
"preferredBackground": "map"
@ -678,7 +825,8 @@
"options": [
{
"question": {
"en": "Only working charging stations"
"en": "Only working charging stations",
"nl": "Enkel werkende oplaadpunten"
},
"osmTags": {
"and": [
@ -754,5 +902,18 @@
}
]
}
]
],
"allowMove": {
"enableRelocation": false,
"enableImproveAccuracy": true
},
"deletion": {
"softDeletionTags": {
"and": [
"amenity=",
"disused:amenity=charging_station"
]
},
"neededChangesets": 10
}
}

View file

@ -56,6 +56,7 @@ function run(file, protojson) {
const overview_question_answers = []
const questions: (TagRenderingConfigJson & { "id": string })[] = []
const technicalQuestions: (TagRenderingConfigJson & { "id": string })[] = []
const filterOptions: { question: any, osmTags?: string } [] = [
{
question: {
@ -149,7 +150,7 @@ function run(file, protojson) {
}
})
questions.push({
technicalQuestions.push({
"id": "voltage-" + i,
question: {
en: `What voltage do the plugs with ${descrWithImage_en} offer?`,
@ -178,7 +179,7 @@ function run(file, protojson) {
})
questions.push({
technicalQuestions.push({
"id": "current-" + i,
question: {
en: `What current do the plugs with ${descrWithImage_en} offer?`,
@ -207,7 +208,7 @@ function run(file, protojson) {
})
questions.push({
technicalQuestions.push({
"id": "power-output-" + i,
question: {
en: `What power output does a single plug of type ${descrWithImage_en} offer?`,
@ -247,7 +248,8 @@ function run(file, protojson) {
const toggles = {
"id": "Available_charging_stations (generated)",
"question": {
"en": "Which charging stations are available here?"
"en": "Which charging connections are available here?",
"nl": "Welke aansluitingen zijn hier beschikbaar?"
},
"multiAnswer": true,
"mappings": overview_question_answers
@ -257,7 +259,7 @@ function run(file, protojson) {
const stringified = questions.map(q => JSON.stringify(q, null, " "))
let protoString = readFileSync(protojson, "utf8")
protoString = protoString.replace("{\"id\": \"$$$\"}", stringified.join(",\n"))
protoString = protoString.replace(/{[ \t\n]*"id"[ \t\n]*:[ \t\n]*"\$\$\$"[ \t\n]*}/, stringified.join(",\n"))
const proto = <LayerConfigJson>JSON.parse(protoString)
proto.tagRenderings.forEach(tr => {
if (typeof tr === "string") {

View file

@ -31,14 +31,16 @@
"then": {
"en": "Traffic signal",
"nl": "Verkeerslicht",
"ru": "Светофор"
"ru": "Светофор",
"de": "Ampel"
}
},
{
"if": "crossing=traffic_signals",
"then": {
"en": "Crossing with traffic signals",
"nl": "Oversteektplaats met verkeerslichten"
"nl": "Oversteektplaats met verkeerslichten",
"de": "Kreuzung mit Ampeln"
}
}
]
@ -62,14 +64,16 @@
{
"title": {
"en": "Crossing",
"nl": "Oversteekplaats"
"nl": "Oversteekplaats",
"de": "Kreuzung"
},
"tags": [
"highway=crossing"
],
"description": {
"en": "Crossing for pedestrians and/or cyclists",
"nl": "Oversteekplaats voor voetgangers en/of fietsers"
"nl": "Oversteekplaats voor voetgangers en/of fietsers",
"de": "Kreuzung für Fußgänger und/oder Radfahrer"
},
"preciseInput": {
"preferredBackground": [
@ -83,14 +87,16 @@
"title": {
"en": "Traffic signal",
"nl": "Verkeerslicht",
"ru": "Светофор"
"ru": "Светофор",
"de": "Ampel"
},
"tags": [
"highway=traffic_signals"
],
"description": {
"en": "Traffic signal on a road",
"nl": "Verkeerslicht op een weg"
"nl": "Verkeerslicht op een weg",
"de": "Ampel an einer Straße"
},
"preciseInput": {
"preferredBackground": [
@ -106,7 +112,8 @@
"id": "crossing-type",
"question": {
"en": "What kind of crossing is this?",
"nl": "Wat voor oversteekplaats is dit?"
"nl": "Wat voor oversteekplaats is dit?",
"de": "Was ist das für eine Kreuzung?"
},
"condition": "highway=crossing",
"mappings": [
@ -114,21 +121,24 @@
"if": "crossing=uncontrolled",
"then": {
"en": "Crossing, without traffic lights",
"nl": "Oversteekplaats, zonder verkeerslichten"
"nl": "Oversteekplaats, zonder verkeerslichten",
"de": "Kreuzungen ohne Ampeln"
}
},
{
"if": "crossing=traffic_signals",
"then": {
"en": "Crossing with traffic signals",
"nl": "Oversteekplaats met verkeerslichten"
"nl": "Oversteekplaats met verkeerslichten",
"de": "Kreuzungen mit Ampeln"
}
},
{
"if": "crossing=zebra",
"then": {
"en": "Zebra crossing",
"nl": "Zebrapad"
"nl": "Zebrapad",
"de": "Zebrastreifen"
},
"hideInAnswer": true
}
@ -138,7 +148,8 @@
"id": "crossing-is-zebra",
"question": {
"en": "Is this is a zebra crossing?",
"nl": "Is dit een zebrapad?"
"nl": "Is dit een zebrapad?",
"de": "Ist das ein Zebrastreifen?"
},
"condition": "crossing=uncontrolled",
"mappings": [
@ -146,14 +157,16 @@
"if": "crossing_ref=zebra",
"then": {
"en": "This is a zebra crossing",
"nl": "Dit is een zebrapad"
"nl": "Dit is een zebrapad",
"de": "Dies ist ein Zebrastreifen"
}
},
{
"if": "crossing_ref=",
"then": {
"en": "This is not a zebra crossing",
"nl": "Dit is geen zebrapad"
"nl": "Dit is geen zebrapad",
"de": "Dies ist kein Zebrastreifen"
}
}
]
@ -162,7 +175,8 @@
"id": "crossing-bicycle-allowed",
"question": {
"en": "Is this crossing also for bicycles?",
"nl": "Is deze oversteekplaats ook voor fietsers"
"nl": "Is deze oversteekplaats ook voor fietsers",
"de": "Können Radfahrer diese Kreuzung nutzen?"
},
"condition": "highway=crossing",
"mappings": [
@ -170,14 +184,16 @@
"if": "bicycle=yes",
"then": {
"en": "A cyclist can use this crossing",
"nl": "Een fietser kan deze oversteekplaats gebruiken"
"nl": "Een fietser kan deze oversteekplaats gebruiken",
"de": "Radfahrer können diese Kreuzung nutzen"
}
},
{
"if": "bicycle=no",
"then": {
"en": "A cyclist can not use this crossing",
"nl": "Een fietser kan deze oversteekplaats niet gebruiken"
"nl": "Een fietser kan deze oversteekplaats niet gebruiken",
"de": "Radfahrer können diese Kreuzung nicht nutzen"
}
}
]
@ -210,7 +226,8 @@
"id": "crossing-tactile",
"question": {
"en": "Does this crossing have tactile paving?",
"nl": "Heeft deze oversteekplaats een geleidelijn?"
"nl": "Heeft deze oversteekplaats een geleidelijn?",
"de": "Gibt es an dieser Kreuzung ein Blindenleitsystem?"
},
"condition": "highway=crossing",
"mappings": [
@ -218,14 +235,16 @@
"if": "tactile_paving=yes",
"then": {
"en": "This crossing has tactile paving",
"nl": "Deze oversteekplaats heeft een geleidelijn"
"nl": "Deze oversteekplaats heeft een geleidelijn",
"de": "An dieser Kreuzung gibt es ein Blindenleitsystem"
}
},
{
"if": "tactile_paving=no",
"then": {
"en": "This crossing does not have tactile paving",
"nl": "Deze oversteekplaats heeft geen geleidelijn"
"nl": "Deze oversteekplaats heeft geen geleidelijn",
"de": "Diese Kreuzung hat kein Blindenleitsystem"
}
},
{

View file

@ -61,14 +61,16 @@
"if": "cycleway=lane",
"then": {
"nl": "Fietsstrook",
"en": "Bike lane"
"en": "Bike lane",
"de": "Fahrradspur"
}
},
{
"if": "cycleway=track",
"then": {
"en": "Cycleway next to the road",
"nl": "Fietsweg naast de weg"
"nl": "Fietsweg naast de weg",
"de": "Radweg neben der Straße"
}
},
{
@ -86,7 +88,8 @@
{
"question": {
"en": "What kind of cycleway is here?",
"nl": "Wat voor fietspad is hier?"
"nl": "Wat voor fietspad is hier?",
"de": "Was für ein Radweg ist hier?"
},
"condition": {
"and": [
@ -120,14 +123,16 @@
"if": "cycleway=separate",
"then": {
"en": "There is a separately drawn cycleway",
"nl": "Er is een apart getekend fietspad."
"nl": "Er is een apart getekend fietspad.",
"de": "Hier ist ein getrennter Radweg vorhanden"
}
},
{
"if": "cycleway=no",
"then": {
"en": "There is no cycleway",
"nl": "Er is geen fietspad aanwezig"
"nl": "Er is geen fietspad aanwezig",
"de": "Es gibt keinen Radweg"
},
"hideInAnswer": "cycleway=opposite"
},
@ -135,7 +140,8 @@
"if": "cycleway=no",
"then": {
"en": "There is no cycleway",
"nl": "Er is geen fietspad aanwezig"
"nl": "Er is geen fietspad aanwezig",
"de": "Es gibt keinen Radweg"
},
"hideInAnswer": "cycleway!=opposite",
"addExtraTags": [
@ -149,7 +155,8 @@
{
"question": {
"en": "Is this street lit?",
"nl": "Is deze weg verlicht?"
"nl": "Is deze weg verlicht?",
"de": "Ist diese Straße beleuchtet?"
},
"mappings": [
{
@ -163,14 +170,16 @@
"if": "lit=no",
"then": {
"en": "This road is not lit",
"nl": "Deze weg is niet verlicht"
"nl": "Deze weg is niet verlicht",
"de": "Diese Straße ist nicht beleuchtet"
}
},
{
"if": "lit=sunset-sunrise",
"then": {
"en": "This road is lit at night",
"nl": "Deze weg is 's nachts verlicht"
"nl": "Deze weg is 's nachts verlicht",
"de": "Diese Straße ist nachts beleuchtet"
},
"hideInAnswer": true
},
@ -178,7 +187,8 @@
"if": "lit=24/7",
"then": {
"en": "This road is lit 24/7",
"nl": "Deze weg is 24/7 verlicht"
"nl": "Deze weg is 24/7 verlicht",
"de": "Diese Straße ist durchgehend beleuchtet"
}
}
],
@ -187,7 +197,8 @@
{
"question": {
"en": "Is this a cyclestreet?",
"nl": "Is dit een fietsstraat?"
"nl": "Is dit een fietsstraat?",
"de": "Ist das eine Fahrradstraße"
},
"condition": {
"and": [
@ -212,7 +223,8 @@
"if": "cyclestreet=yes",
"then": {
"en": "This is a cyclestreet",
"nl": "Dit is een fietsstraat"
"nl": "Dit is een fietsstraat",
"de": "Dies ist eine Fahrradstraße"
},
"hideInAnswer": "_country=be"
},
@ -220,7 +232,8 @@
"if": "cyclestreet=",
"then": {
"en": "This is not a cyclestreet.",
"nl": "Dit is geen fietsstraat"
"nl": "Dit is geen fietsstraat",
"de": "Dies ist keine Fahrradstraße."
},
"addExtraTags": [
"overtaking:motor_vehicle="
@ -249,35 +262,40 @@
"if": "maxspeed=20",
"then": {
"en": "The maximum speed is 20 km/h",
"nl": "De maximumsnelheid is 20 km/u"
"nl": "De maximumsnelheid is 20 km/u",
"de": "Die Höchstgeschwindigkeit ist 20 km/h"
}
},
{
"if": "maxspeed=30",
"then": {
"en": "The maximum speed is 30 km/h",
"nl": "De maximumsnelheid is 30 km/u"
"nl": "De maximumsnelheid is 30 km/u",
"de": "Die Höchstgeschwindigkeit ist 30 km/h"
}
},
{
"if": "maxspeed=50",
"then": {
"en": "The maximum speed is 50 km/h",
"nl": "De maximumsnelheid is 50 km/u"
"nl": "De maximumsnelheid is 50 km/u",
"de": "Die Höchstgeschwindigkeit ist 50 km/h"
}
},
{
"if": "maxspeed=70",
"then": {
"en": "The maximum speed is 70 km/h",
"nl": "De maximumsnelheid is 70 km/u"
"nl": "De maximumsnelheid is 70 km/u",
"de": "Die Höchstgeschwindigkeit ist 70 km/h"
}
},
{
"if": "maxspeed=90",
"then": {
"en": "The maximum speed is 90 km/h",
"nl": "De maximumsnelheid is 90 km/u"
"nl": "De maximumsnelheid is 90 km/u",
"de": "Die Höchstgeschwindigkeit ist 90 km/h"
}
}
],
@ -290,7 +308,8 @@
{
"render": {
"en": "This cyleway is made of {cycleway:surface}",
"nl": "Dit fietspad is gemaakt van {cycleway:surface}"
"nl": "Dit fietspad is gemaakt van {cycleway:surface}",
"de": "Der Radweg ist aus {cycleway:surface}"
},
"freeform": {
"key": "cycleway:surface"
@ -307,7 +326,8 @@
"if": "cycleway:surface=unpaved",
"then": {
"en": "This cycleway is unpaved",
"nl": "Dit fietspad is onverhard"
"nl": "Dit fietspad is onverhard",
"de": "Dieser Radweg hat keinen festen Belag"
},
"hideInAnswer": true
},
@ -315,7 +335,8 @@
"if": "cycleway:surface=paved",
"then": {
"en": "This cycleway is paved",
"nl": "Dit fietspad is geplaveid"
"nl": "Dit fietspad is geplaveid",
"de": "Dieser Radweg hat einen festen Belag"
},
"hideInAnswer": true
},
@ -323,7 +344,8 @@
"if": "cycleway:surface=asphalt",
"then": {
"en": "This cycleway is made of asphalt",
"nl": "Dit fietspad is gemaakt van asfalt"
"nl": "Dit fietspad is gemaakt van asfalt",
"de": "Der Radweg ist aus Asphalt"
}
},
{
@ -337,7 +359,8 @@
"if": "cycleway:surface=concrete",
"then": {
"en": "This cycleway is made of concrete",
"nl": "Dit fietspad is gemaakt van beton"
"nl": "Dit fietspad is gemaakt van beton",
"de": "Der Radweg ist aus Beton"
}
},
{
@ -366,35 +389,40 @@
"if": "cycleway:surface=wood",
"then": {
"en": "This cycleway is made of wood",
"nl": "Dit fietspad is gemaakt van hout"
"nl": "Dit fietspad is gemaakt van hout",
"de": "Der Radweg ist aus Holz"
}
},
{
"if": "cycleway:surface=gravel",
"then": {
"en": "This cycleway is made of gravel",
"nl": "Dit fietspad is gemaakt van grind"
"nl": "Dit fietspad is gemaakt van grind",
"de": "Der Radweg ist aus Schotter"
}
},
{
"if": "cycleway:surface=fine_gravel",
"then": {
"en": "This cycleway is made of fine gravel",
"nl": "Dit fietspad is gemaakt van fijn grind"
"nl": "Dit fietspad is gemaakt van fijn grind",
"de": "Dieser Radweg besteht aus feinem Schotter"
}
},
{
"if": "cycleway:surface=pebblestone",
"then": {
"en": "This cycleway is made of pebblestone",
"nl": "Dit fietspad is gemaakt van kiezelsteentjes"
"nl": "Dit fietspad is gemaakt van kiezelsteentjes",
"de": "Der Radweg ist aus Kies"
}
},
{
"if": "cycleway:surface=ground",
"then": {
"en": "This cycleway is made from raw ground",
"nl": "Dit fietspad is gemaakt van aarde"
"nl": "Dit fietspad is gemaakt van aarde",
"de": "Dieser Radweg besteht aus Rohboden"
}
}
],
@ -407,7 +435,8 @@
{
"question": {
"en": "What is the smoothness of this cycleway?",
"nl": "Wat is de kwaliteit van dit fietspad?"
"nl": "Wat is de kwaliteit van dit fietspad?",
"de": "Wie eben ist dieser Radweg?"
},
"condition": {
"or": [
@ -421,14 +450,16 @@
"if": "cycleway:smoothness=excellent",
"then": {
"en": "Usable for thin rollers: rollerblade, skateboard",
"nl": "Geschikt voor fijne rollers: rollerblade, skateboard"
"nl": "Geschikt voor fijne rollers: rollerblade, skateboard",
"de": "Geeignet für dünne Rollen: Rollerblades, Skateboard"
}
},
{
"if": "cycleway:smoothness=good",
"then": {
"en": "Usable for thin wheels: racing bike",
"nl": "Geschikt voor fijne wielen: racefiets"
"nl": "Geschikt voor fijne wielen: racefiets",
"de": "Geeignet für dünne Reifen: Rennrad"
}
},
{
@ -463,14 +494,16 @@
"if": "cycleway:smoothness=very_horrible",
"then": {
"en": "Usable for specialized off-road vehicles: tractor, ATV",
"nl": "Geschikt voor gespecialiseerde terreinwagens: tractor, alleterreinwagen"
"nl": "Geschikt voor gespecialiseerde terreinwagens: tractor, alleterreinwagen",
"de": "Geeignet für Geländefahrzeuge: Traktor, ATV"
}
},
{
"if": "cycleway:smoothness=impassable",
"then": {
"en": "Impassable / No wheeled vehicle",
"nl": "Niet geschikt voor voertuigen met wielen"
"nl": "Niet geschikt voor voertuigen met wielen",
"de": "Unpassierbar / Keine bereiften Fahrzeuge"
}
}
],
@ -479,7 +512,8 @@
{
"render": {
"en": "This road is made of {surface}",
"nl": "Deze weg is gemaakt van {surface}"
"nl": "Deze weg is gemaakt van {surface}",
"de": "Der Radweg ist aus {surface}"
},
"freeform": {
"key": "surface"
@ -497,7 +531,8 @@
"if": "surface=paved",
"then": {
"en": "This cycleway is paved",
"nl": "Dit fietspad is geplaveid"
"nl": "Dit fietspad is geplaveid",
"de": "Dieser Radweg hat einen festen Belag"
},
"hideInAnswer": true
},
@ -505,7 +540,8 @@
"if": "surface=asphalt",
"then": {
"en": "This cycleway is made of asphalt",
"nl": "Dit fietspad is gemaakt van asfalt"
"nl": "Dit fietspad is gemaakt van asfalt",
"de": "Der Radweg ist aus Asphalt"
}
},
{
@ -519,7 +555,8 @@
"if": "surface=concrete",
"then": {
"en": "This cycleway is made of concrete",
"nl": "Dit fietspad is gemaakt van beton"
"nl": "Dit fietspad is gemaakt van beton",
"de": "Der Radweg ist aus Beton"
}
},
{
@ -548,35 +585,40 @@
"if": "surface=wood",
"then": {
"en": "This cycleway is made of wood",
"nl": "Dit fietspad is gemaakt van hout"
"nl": "Dit fietspad is gemaakt van hout",
"de": "Der Radweg ist aus Holz"
}
},
{
"if": "surface=gravel",
"then": {
"en": "This cycleway is made of gravel",
"nl": "Dit fietspad is gemaakt van grind"
"nl": "Dit fietspad is gemaakt van grind",
"de": "Der Radweg ist aus Schotter"
}
},
{
"if": "surface=fine_gravel",
"then": {
"en": "This cycleway is made of fine gravel",
"nl": "Dit fietspad is gemaakt van fijn grind"
"nl": "Dit fietspad is gemaakt van fijn grind",
"de": "Dieser Radweg besteht aus feinem Schotter"
}
},
{
"if": "surface=pebblestone",
"then": {
"en": "This cycleway is made of pebblestone",
"nl": "Dit fietspad is gemaakt van kiezelsteentjes"
"nl": "Dit fietspad is gemaakt van kiezelsteentjes",
"de": "Der Radweg ist aus Kies"
}
},
{
"if": "surface=ground",
"then": {
"en": "This cycleway is made from raw ground",
"nl": "Dit fietspad is gemaakt van aarde"
"nl": "Dit fietspad is gemaakt van aarde",
"de": "Dieser Radweg besteht aus Rohboden"
}
}
],
@ -589,7 +631,8 @@
{
"question": {
"en": "What is the smoothness of this street?",
"nl": "Wat is de kwaliteit van deze straat?"
"nl": "Wat is de kwaliteit van deze straat?",
"de": "Wie eben ist diese Straße?"
},
"condition": {
"or": [
@ -601,13 +644,15 @@
{
"if": "smoothness=excellent",
"then": {
"en": "Usable for thin rollers: rollerblade, skateboard"
"en": "Usable for thin rollers: rollerblade, skateboard",
"de": "Geeignet für dünne Rollen: Rollerblades, Skateboard"
}
},
{
"if": "smoothness=good",
"then": {
"en": "Usable for thin wheels: racing bike"
"en": "Usable for thin wheels: racing bike",
"de": "Geeignet für dünne Reifen: Rennrad"
}
},
{
@ -637,13 +682,15 @@
{
"if": "smoothness=very_horrible",
"then": {
"en": "Usable for specialized off-road vehicles: tractor, ATV"
"en": "Usable for specialized off-road vehicles: tractor, ATV",
"de": "Geeignet für spezielle Geländewagen: Traktor, ATV"
}
},
{
"if": "smoothness=impassable",
"then": {
"en": "Impassable / No wheeled vehicle"
"en": "Impassable / No wheeled vehicle",
"de": "Unpassierbar / Keine bereiften Fahrzeuge"
}
}
],
@ -678,7 +725,8 @@
"id": "cycleway-lane-track-traffic-signs",
"question": {
"en": "What traffic sign does this cycleway have?",
"nl": "Welk verkeersbord heeft dit fietspad?"
"nl": "Welk verkeersbord heeft dit fietspad?",
"de": "Welches Verkehrszeichen hat dieser Radweg?"
},
"condition": {
"or": [
@ -691,7 +739,8 @@
"if": "cycleway:traffic_sign=BE:D7",
"then": {
"en": "Compulsory cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'>",
"nl": "Verplicht fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'>"
"nl": "Verplicht fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'>",
"de": "Vorgeschriebener Radweg <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'>"
},
"hideInAnswer": "_country!=be"
},
@ -707,7 +756,8 @@
"if": "cycleway:traffic_sign=BE:D9",
"then": {
"en": "Segregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='width: 3em'>",
"nl": "Afgescheiden voet-/fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='width: 3em'>"
"nl": "Afgescheiden voet-/fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='width: 3em'>",
"de": "Getrennter Fuß-/Radweg <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='width: 3em'>"
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@ -719,7 +769,8 @@
"if": "cycleway:traffic_sign=BE:D10",
"then": {
"en": "Unsegregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='width: 3em'>",
"nl": "Gedeeld voet-/fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='width: 3em'>"
"nl": "Gedeeld voet-/fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='width: 3em'>",
"de": "Gemeinsamer Fuß-/Radweg <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='width: 3em'>"
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@ -731,7 +782,8 @@
"if": "cycleway:traffic_sign=none",
"then": {
"en": "No traffic sign present",
"nl": "Geen verkeersbord aanwezig"
"nl": "Geen verkeersbord aanwezig",
"de": "Kein Verkehrsschild vorhanden"
}
}
]
@ -740,7 +792,8 @@
"id": "cycleway-traffic-signs",
"question": {
"en": "What traffic sign does this cycleway have?",
"nl": "Welk verkeersbord heeft dit fietspad?"
"nl": "Welk verkeersbord heeft dit fietspad?",
"de": "Welches Verkehrszeichen hat dieser Radweg?"
},
"condition": {
"or": [
@ -753,7 +806,8 @@
"if": "traffic_sign=BE:D7",
"then": {
"en": "Compulsory cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'>",
"nl": "Verplicht fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'>"
"nl": "Verplicht fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'>",
"de": "Vorgeschriebener Radweg <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'>"
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@ -775,7 +829,8 @@
"if": "traffic_sign=BE:D9",
"then": {
"en": "Segregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='width: 3em'>",
"nl": "Afgescheiden voet-/fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='width: 3em'>"
"nl": "Afgescheiden voet-/fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='width: 3em'>",
"de": "Getrennter Fuß-/Radweg <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='width: 3em'>"
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@ -791,7 +846,8 @@
"if": "traffic_sign=BE:D10",
"then": {
"en": "Unsegregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='width: 3em'>",
"nl": "Gedeeld voet-/fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='width: 3em'>"
"nl": "Gedeeld voet-/fietspad <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='width: 3em'>",
"de": "Gemeinsamer Fuß-/Radweg <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='width: 3em'>"
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@ -807,7 +863,8 @@
"if": "traffic_sign=none",
"then": {
"en": "No traffic sign present",
"nl": "Geen verkeersbord aanwezig"
"nl": "Geen verkeersbord aanwezig",
"de": "Kein Verkehrsschild vorhanden"
}
}
]
@ -897,7 +954,8 @@
"if": "cycleway:traffic_sign:supplementary=none",
"then": {
"en": "No supplementary traffic sign present",
"nl": "Geen onderbord aanwezig"
"nl": "Geen onderbord aanwezig",
"de": "Kein zusätzliches Verkehrszeichen vorhanden"
}
}
]
@ -930,7 +988,8 @@
"if": "traffic_sign=BE:D7;BE:M13",
"then": {
"en": "<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M13.svg' style='width: 3em'>",
"nl": "<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M13.svg' style='width: 3em'>"
"nl": "<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M13.svg' style='width: 3em'>",
"de": "<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M13.svg' style='width: 3em'>"
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@ -987,7 +1046,8 @@
"if": "traffic_sign:supplementary=none",
"then": {
"en": "No supplementary traffic sign present",
"nl": "Geen onderbord aanwezig"
"nl": "Geen onderbord aanwezig",
"de": "Kein zusätzliches Verkehrszeichen vorhanden"
}
}
]
@ -1055,7 +1115,8 @@
"if": "cycleway:separation=kerb",
"then": {
"en": "This cycleway is separated by a kerb",
"nl": "Dit fietspad is gescheiden van de weg met een stoeprand"
"nl": "Dit fietspad is gescheiden van de weg met een stoeprand",
"de": "Dieser Radweg ist getrennt durch einen Bordstein"
}
}
]
@ -1098,7 +1159,8 @@
"if": "separation=kerb",
"then": {
"en": "This cycleway is separated by a kerb",
"nl": "Dit fietspad is gescheiden van de weg met een stoeprand"
"nl": "Dit fietspad is gescheiden van de weg met een stoeprand",
"de": "Dieser Radweg ist getrennt durch einen Bordstein"
}
}
]

View file

@ -39,7 +39,8 @@
"en": "./assets/layers/defibrillator/aed_checked.svg",
"ru": "./assets/layers/defibrillator/aed_checked.svg",
"it": "./assets/layers/defibrillator/aed_checked.svg",
"fr": "./assets/layers/defibrillator/aed_checked.svg"
"fr": "./assets/layers/defibrillator/aed_checked.svg",
"de": "./assets/layers/defibrillator/aed_checked.svg"
}
}
]
@ -189,7 +190,8 @@
"en": "Not accessible, possibly only for professional use",
"nl": "Niet toegankelijk, mogelijk enkel voor professionals",
"fr": "Pas accessible, peut-être uniquement à usage professionnel",
"it": "Non accessibile, potrebbe essere solo per uso professionale"
"it": "Non accessibile, potrebbe essere solo per uso professionale",
"de": "Nicht zugänglich, möglicherweise nur für betriebliche Nutzung"
}
}
],
@ -235,7 +237,8 @@
"nl": "Dit is een gewone automatische defibrillator",
"fr": "C'est un défibrillateur automatique manuel",
"it": "È un normale defibrillatore automatico",
"ru": "Это обычный автоматический дефибриллятор"
"ru": "Это обычный автоматический дефибриллятор",
"de": "Dies ist ein normaler automatischer Defibrillator"
}
}
],

View file

@ -5,7 +5,7 @@
"nl": "Drinkbaar water",
"fr": "Eau potable",
"gl": "Auga potábel",
"de": "Trinkwasser",
"de": "Trinkwasserstelle",
"it": "Acqua potabile",
"ru": "Питьевая вода",
"id": "Air minum"
@ -16,7 +16,7 @@
"nl": "Drinkbaar water",
"fr": "Eau potable",
"gl": "Auga potábel",
"de": "Trinkwasser",
"de": "Trinkwasserstelle",
"it": "Acqua potabile",
"ru": "Питьевая вода",
"id": "Air minum"
@ -33,7 +33,8 @@
"operational_status=closed"
]
},
"then": "close:#c33"
"then": "close:#c33",
"badge": true
}
],
"iconSize": "40,40,bottom",
@ -107,7 +108,8 @@
"en": "This drinking water is broken",
"nl": "Deze drinkwaterfontein is kapot",
"it": "La fontanella è guasta",
"fr": "Cette fontaine est cassée"
"fr": "Cette fontaine est cassée",
"de": "Diese Trinkwasserstelle ist kaputt"
}
},
{
@ -116,7 +118,8 @@
"en": "This drinking water is closed",
"nl": "Deze drinkwaterfontein is afgesloten",
"it": "La fontanella è chiusa",
"fr": "Cette fontaine est fermée"
"fr": "Cette fontaine est fermée",
"de": "Diese Trinkwasserstelle wurde geschlossen"
}
}
],

View file

@ -2,7 +2,8 @@
"id": "food",
"name": {
"nl": "Eetgelegenheden",
"en": "Restaurants and fast food"
"en": "Restaurants and fast food",
"de": "Restaurants und Fast Food"
},
"source": {
"osmTags": {
@ -35,7 +36,8 @@
"iconOverlays": [
{
"if": "opening_hours~*",
"then": "isOpen"
"then": "isOpen",
"badge": true
},
{
"if": {
@ -46,7 +48,8 @@
},
"then": {
"render": "circle:white;./assets/themes/fritures/Vegetarian-mark.svg"
}
},
"badge": true
}
],
"label": {
@ -62,7 +65,8 @@
"title": {
"en": "restaurant",
"nl": "restaurant",
"ru": "ресторан"
"ru": "ресторан",
"de": "Restaurant"
},
"tags": [
"amenity=restaurant"
@ -79,7 +83,8 @@
"title": {
"en": "fastfood",
"nl": "fastfood-zaak",
"ru": "быстрое питание"
"ru": "быстрое питание",
"de": "Schnellimbiss"
},
"tags": [
"amenity=fast_food"
@ -95,7 +100,8 @@
{
"title": {
"en": "fries shop",
"nl": "frituur"
"nl": "frituur",
"de": "Pommesbude"
},
"tags": [
"amenity=fast_food",
@ -123,7 +129,8 @@
},
"then": {
"nl": "Restaurant <i>{name}</i>",
"en": "Restaurant <i>{name}</i>"
"en": "Restaurant <i>{name}</i>",
"de": "Restaurant <i>{name}</i>"
}
},
{
@ -135,7 +142,8 @@
},
"then": {
"nl": "Fastfood-zaak <i>{name}</i>",
"en": "Fastfood <i>{name}</i>"
"en": "Fastfood <i>{name}</i>",
"de": "Schnellrestaurant<i>{name}</i>"
}
}
]
@ -145,11 +153,13 @@
{
"question": {
"nl": "Wat is de naam van deze eetgelegenheid?",
"en": "What is the name of this restaurant?"
"en": "What is the name of this restaurant?",
"de": "Wie heißt dieses Restaurant?"
},
"render": {
"nl": "De naam van deze eetgelegeheid is {name}",
"en": "The name of this restaurant is {name}"
"en": "The name of this restaurant is {name}",
"de": "Das Restaurant heißt {name}"
},
"freeform": {
"key": "name"
@ -159,7 +169,8 @@
{
"question": {
"en": "What type of business is this?",
"nl": "Wat voor soort zaak is dit?"
"nl": "Wat voor soort zaak is dit?",
"de": "Um was für ein Geschäft handelt es sich?"
},
"mappings": [
{
@ -186,11 +197,13 @@
{
"question": {
"nl": "Welk soort gerechten worden hier geserveerd?",
"en": "Which food is served here?"
"en": "Which food is served here?",
"de": "Welches Essen gibt es hier?"
},
"render": {
"nl": "Deze plaats serveert vooral {cuisine}",
"en": "This place mostly serves {cuisine}"
"en": "This place mostly serves {cuisine}",
"de": "An diesem Ort gibt es hauptsächlich {cuisine}"
},
"freeform": {
"key": "cuisine",
@ -217,7 +230,8 @@
"if": "cuisine=pasta",
"then": {
"en": "Mainly serves pasta",
"nl": "Dit is een pastazaak"
"nl": "Dit is een pastazaak",
"de": "Bietet vorwiegend Pastagerichte an"
}
},
{
@ -298,28 +312,32 @@
{
"question": {
"nl": "Biedt deze zaak een afhaalmogelijkheid aan?",
"en": "Does this place offer takea-way?"
"en": "Does this place offer takea-way?",
"de": "Ist an diesem Ort Mitnahme möglich?"
},
"mappings": [
{
"if": "takeaway=only",
"then": {
"en": "This is a take-away only business",
"nl": "Hier is enkel afhaal mogelijk"
"nl": "Hier is enkel afhaal mogelijk",
"de": "Dieses Geschäft bietet nur Artikel zur Mitnahme an"
}
},
{
"if": "takeaway=yes",
"then": {
"en": "Take-away is possible here",
"nl": "Eten kan hier afgehaald worden"
"nl": "Eten kan hier afgehaald worden",
"de": "Mitnahme möglich"
}
},
{
"if": "takeaway=no",
"then": {
"en": "Take-away is not possible here",
"nl": "Hier is geen afhaalmogelijkheid"
"nl": "Hier is geen afhaalmogelijkheid",
"de": "Mitnahme nicht möglich"
}
}
],
@ -402,28 +420,32 @@
"if": "diet:halal=no",
"then": {
"en": "There are no halal options available",
"nl": "Er zijn geen halal opties aanwezig"
"nl": "Er zijn geen halal opties aanwezig",
"de": "Hier gibt es keine halal Speisen"
}
},
{
"if": "diet:halal=limited",
"then": {
"en": "There is a small halal menu",
"nl": "Er zijn een beperkt aantal halal opties"
"nl": "Er zijn een beperkt aantal halal opties",
"de": "Hier gibt es wenige halal Speisen"
}
},
{
"if": "diet:halal=yes",
"then": {
"nl": "Halal menu verkrijgbaar",
"en": "There is a halal menu"
"en": "There is a halal menu",
"de": "Es gibt halal Speisen"
}
},
{
"if": "diet:halal=only",
"then": {
"nl": "Enkel halal opties zijn beschikbaar",
"en": "Only halal options are available"
"en": "Only halal options are available",
"de": "Es gibt ausschließlich halal Speisen"
}
}
],
@ -565,7 +587,8 @@
{
"question": {
"en": "Opened now",
"nl": "Nu geopened"
"nl": "Nu geopened",
"de": "Aktuell geöffnet"
},
"osmTags": "_isOpen=yes"
}
@ -596,7 +619,8 @@
{
"question": {
"en": "Has a vegan menu",
"nl": "Heeft een veganistisch menu"
"nl": "Heeft een veganistisch menu",
"de": "Bietet vegan Speisen an"
},
"osmTags": {
"or": [

View file

@ -3,7 +3,7 @@
"name": {
"en": "Ghost bikes",
"nl": "Witte Fietsen",
"de": "Geisterrad",
"de": "Geisterräder",
"it": "Bici fantasma",
"fr": "Vélos fantômes",
"eo": "Fantombiciklo",
@ -174,7 +174,8 @@
"nl": "Wanneer werd deze witte fiets geplaatst?",
"en": "When was this Ghost bike installed?",
"it": "Quando è stata installata questa bici fantasma?",
"fr": "Quand ce vélo fantôme a-t-il été installée ?"
"fr": "Quand ce vélo fantôme a-t-il été installée ?",
"de": "Wann wurde dieses Geisterrad aufgestellt?"
},
"render": {
"nl": "Geplaatst op {start_date}",

View file

@ -4,7 +4,7 @@
"en": "Observation towers",
"nl": "Uitkijktorens",
"ru": "Смотровые башни",
"de": "Beobachtungstürme"
"de": "Aussichtstürme"
},
"minzoom": 8,
"title": {
@ -20,7 +20,8 @@
"then": {
"en": "<b>{name}</b>",
"nl": "<b>{name}</b>",
"ru": "<b>{name}</b>"
"ru": "<b>{name}</b>",
"de": "<b>{name}</b>"
}
}
]
@ -28,18 +29,20 @@
"description": {
"en": "Towers with a panoramic view",
"nl": "Torens om van het uitzicht te genieten",
"de": "Türme mit Panoramablick"
"de": "Türme zur Aussicht auf die umgebende Landschaft"
},
"tagRenderings": [
"images",
{
"question": {
"en": "What is the name of this tower?",
"nl": "Heeft deze toren een naam?"
"nl": "Heeft deze toren een naam?",
"de": "Wie heißt dieser Turm?"
},
"render": {
"en": "This tower is called <b>{name}</b>",
"nl": "Deze toren heet <b>{name}</b>"
"nl": "Deze toren heet <b>{name}</b>",
"de": "Der Name dieses Turms lautet <b>{name}</b>"
},
"freeform": {
"key": "name"
@ -49,7 +52,8 @@
"if": "noname=yes",
"then": {
"en": "This tower doesn't have a specific name",
"nl": "Deze toren heeft geen specifieke naam"
"nl": "Deze toren heeft geen specifieke naam",
"de": "Dieser Turm hat keinen eigenen Namen"
}
}
],
@ -58,11 +62,13 @@
{
"question": {
"en": "What is the height of this tower?",
"nl": "Hoe hoog is deze toren?"
"nl": "Hoe hoog is deze toren?",
"de": "Wie hoch ist dieser Turm?"
},
"render": {
"en": "This tower is {height} high",
"nl": "Deze toren is {height} hoog"
"nl": "Deze toren is {height} hoog",
"de": "Dieser Turm ist {height} hoch"
},
"freeform": {
"key": "height",
@ -73,11 +79,13 @@
{
"question": {
"en": "Who maintains this tower?",
"nl": "Wie onderhoudt deze toren?"
"nl": "Wie onderhoudt deze toren?",
"de": "Wer betreibt diesen Turm?"
},
"render": {
"nl": "Wordt onderhouden door <b>{operator}</b>",
"en": "Maintained by <b>{operator}</b>"
"en": "Maintained by <b>{operator}</b>",
"de": "Betrieben von <b>{operator}</b>"
},
"freeform": {
"key": "operator"
@ -92,7 +100,8 @@
},
"render": {
"en": "Visiting this tower costs <b>{charge}</b>",
"nl": "Deze toren bezoeken kost <b>{charge}</b>"
"nl": "Deze toren bezoeken kost <b>{charge}</b>",
"de": "Der Besuch des Turms kostet <b>{charge}</b>"
},
"freeform": {
"key": "charge",
@ -110,7 +119,8 @@
},
"then": {
"en": "Free to visit",
"nl": "Gratis te bezoeken"
"nl": "Gratis te bezoeken",
"de": "Eintritt kostenlos"
}
}
],
@ -153,7 +163,8 @@
"title": {
"en": "observation tower",
"nl": "Uitkijktoren",
"ru": "смотровая башня"
"ru": "смотровая башня",
"de": "Beobachtungsturm"
},
"description": {
"nl": "Een publiek toegankelijke uitkijktoren"
@ -182,7 +193,8 @@
"human": {
"nl": " meter",
"en": " meter",
"ru": " метр"
"ru": " метр",
"de": " Meter"
}
}
],

View file

@ -205,7 +205,8 @@
"en": "Accessible to kids older than {min_age} years",
"it": "Accessibile ai bambini di almeno {min_age} anni",
"ru": "Доступно для детей старше {min_age} лет",
"fr": "Accessible aux enfants de plus de {min_age} ans"
"fr": "Accessible aux enfants de plus de {min_age} ans",
"de": "Zugang nur für Kinder ab {min_age} Jahren"
},
"question": {
"nl": "Wat is de minimale leeftijd om op deze speeltuin te mogen?",
@ -226,7 +227,8 @@
"en": "Accessible to kids of at most {max_age}",
"it": "Accessibile ai bambini di età inferiore a {max_age}",
"fr": "Accessible aux enfants de {max_age} au maximum",
"ru": "Доступно детям до {max_age}"
"ru": "Доступно детям до {max_age}",
"de": "Zugang nur für Kinder bis maximal {max_age}"
},
"question": {
"nl": "Wat is de maximaal toegestane leeftijd voor deze speeltuin?",
@ -428,7 +430,8 @@
"en": "When is this playground accessible?",
"fr": "Quand ce terrain de jeux est-il accessible ?",
"it": "Quando si può accedere a questo campetto?",
"ru": "Когда открыта эта игровая площадка?"
"ru": "Когда открыта эта игровая площадка?",
"de": "Wann ist dieser Spielplatz zugänglich?"
},
"mappings": [
{
@ -438,7 +441,8 @@
"en": "Accessible from sunrise till sunset",
"fr": "Accessible du lever au coucher du soleil",
"it": "Si può accedere dall'alba al tramonto",
"ru": "Открыто от рассвета до заката"
"ru": "Открыто от рассвета до заката",
"de": "Zugänglich von Sonnenaufgang bis Sonnenuntergang"
}
},
{
@ -448,7 +452,8 @@
"en": "Always accessible",
"fr": "Toujours accessible",
"ru": "Всегда доступен",
"it": "Si può sempre accedere"
"it": "Si può sempre accedere",
"de": "Immer zugänglich"
}
},
{
@ -458,7 +463,8 @@
"en": "Always accessible",
"ru": "Всегда доступен",
"fr": "Toujours accessible",
"it": "Si può sempre accedere"
"it": "Si può sempre accedere",
"de": "Immer zugänglich"
},
"hideInAnswer": true
}
@ -482,7 +488,8 @@
"opening_hours~*"
]
},
"then": "isOpen"
"then": "isOpen",
"badge": true
}
],
"width": {
@ -522,7 +529,8 @@
"en": "Playground",
"ru": "Детская площадка",
"fr": "Terrain de jeux",
"it": "Campetto"
"it": "Campetto",
"de": "Spielplatz"
}
}
],

View file

@ -5,7 +5,8 @@
"fr": "Magasin",
"ru": "Магазин",
"ja": "店",
"nl": "Winkel"
"nl": "Winkel",
"de": "Geschäft"
},
"minzoom": 16,
"source": {
@ -35,7 +36,8 @@
"en": "{name}",
"fr": "{name}",
"ru": "{name}",
"ja": "{name}"
"ja": "{name}",
"de": "{name}"
}
},
{
@ -48,7 +50,8 @@
"en": "{shop}",
"fr": "{shop}",
"ru": "{shop}",
"ja": "{shop}"
"ja": "{shop}",
"de": "{shop}"
}
}
]
@ -58,7 +61,8 @@
"fr": "Un magasin",
"ja": "ショップ",
"nl": "Een winkel",
"ru": "Магазин"
"ru": "Магазин",
"de": "Ein Geschäft"
},
"tagRenderings": [
"images",
@ -80,13 +84,15 @@
"render": {
"en": "This shop sells {shop}",
"fr": "Ce magasin vends {shop}",
"ja": "こちらのお店では{shop}を販売しております"
"ja": "こちらのお店では{shop}を販売しております",
"de": "Dieses Geschäft verkauft {shop}"
},
"question": {
"en": "What does this shop sell?",
"fr": "Que vends ce magasin ?",
"ja": "このお店では何を売っていますか?",
"ru": "Что продаётся в этом магазине?"
"ru": "Что продаётся в этом магазине?",
"de": "Was wird in diesem Geschäft verkauft?"
},
"freeform": {
"key": "shop"
@ -101,7 +107,8 @@
"then": {
"en": "Convenience store",
"fr": "Épicerie/superette",
"ja": "コンビニエンスストア"
"ja": "コンビニエンスストア",
"de": "Lebensmittelladen"
}
},
{
@ -115,7 +122,8 @@
"fr": "Supermarché",
"ru": "Супермаркет",
"ja": "スーパーマーケット",
"nl": "Supermarkt"
"nl": "Supermarkt",
"de": "Supermarkt"
}
},
{
@ -128,7 +136,8 @@
"en": "Clothing store",
"fr": "Magasin de vêtements",
"ru": "Магазин одежды",
"ja": "衣料品店"
"ja": "衣料品店",
"de": "Bekleidungsgeschäft"
}
},
{
@ -142,7 +151,8 @@
"fr": "Coiffeur",
"ru": "Парикмахерская",
"ja": "理容師",
"nl": "Kapper"
"nl": "Kapper",
"de": "Friseur"
}
},
{
@ -155,7 +165,8 @@
"en": "Bakery",
"fr": "Boulangerie",
"ja": "ベーカリー",
"nl": "Bakkerij"
"nl": "Bakkerij",
"de": "Bäckerei"
}
},
{
@ -167,7 +178,8 @@
"then": {
"en": "Car repair (garage)",
"fr": "Garagiste",
"ja": "自動車修理(ガレージ)"
"ja": "自動車修理(ガレージ)",
"de": "Autoreparatur (Werkstatt)"
}
},
{
@ -180,7 +192,8 @@
"en": "Car dealer",
"fr": "Concessionnaire",
"ru": "Автосалон",
"ja": "自動車ディーラー"
"ja": "自動車ディーラー",
"de": "Autohändler"
}
}
],
@ -193,7 +206,8 @@
"ca": "<a href='tel:{phone}'>{phone}</a>",
"id": "<a href='tel:{phone}'>{phone}</a>",
"ru": "<a href='tel:{phone}'>{phone}</a>",
"ja": "<a href='tel:{phone}'>{phone}</a>"
"ja": "<a href='tel:{phone}'>{phone}</a>",
"de": "<a href='tel:{phone}'>{phone}</a>"
},
"question": {
"en": "What is the phone number?",
@ -215,14 +229,16 @@
"ca": "<a href='{website}'>{website}</a>",
"id": "<a href='{website}'>{website}</a>",
"ru": "<a href='{website}'>{website}</a>",
"ja": "<a href='{website}'>{website}</a>"
"ja": "<a href='{website}'>{website}</a>",
"de": "<a href='{website}'>{website}</a>"
},
"question": {
"en": "What is the website of this shop?",
"fr": "Quel est le site internet de ce magasin ?",
"ja": "このお店のホームページは何ですか?",
"nl": "Wat is de website van deze winkel?",
"ru": "Какой веб-сайт у этого магазина?"
"ru": "Какой веб-сайт у этого магазина?",
"de": "Wie lautet die Webseite dieses Geschäfts?"
},
"freeform": {
"key": "website",
@ -280,7 +296,8 @@
"iconOverlays": [
{
"if": "opening_hours~*",
"then": "isOpen"
"then": "isOpen",
"badge": true
}
],
"width": {
@ -309,7 +326,8 @@
"fr": "Ajouter un nouveau magasin",
"ru": "Добавить новый магазин",
"ja": "新しい店を追加する",
"nl": "Voeg een nieuwe winkel toe"
"nl": "Voeg een nieuwe winkel toe",
"de": "Ein neues Geschäft hinzufügen"
}
}
],

View file

@ -45,7 +45,8 @@
"nl": "Hier kan men {sport} beoefenen",
"fr": "Ici on joue au {sport}",
"en": "{sport} is played here",
"it": "Qui si gioca a {sport}"
"it": "Qui si gioca a {sport}",
"de": "Hier wird {sport} gespielt"
},
"freeform": {
"key": "sport"
@ -54,7 +55,8 @@
"nl": "Welke sporten kan men hier beoefenen?",
"fr": "À quel sport peut-on jouer ici ?",
"en": "Which sport can be played here?",
"it": "Quale sport si gioca qui?"
"it": "Quale sport si gioca qui?",
"de": "Welche Sportarten können hier gespielt werden?"
},
"multiAnswer": true,
"mappings": [
@ -69,7 +71,8 @@
"fr": "Ici, on joue au basketball",
"en": "Basketball is played here",
"it": "Qui si gioca a basket",
"ru": "Здесь можно играть в баскетбол"
"ru": "Здесь можно играть в баскетбол",
"de": "Hier wird Basketball gespielt"
}
},
{
@ -83,7 +86,8 @@
"fr": "Ici, on joue au football",
"en": "Soccer is played here",
"it": "Qui si gioca a calcio",
"ru": "Здесь можно играть в футбол"
"ru": "Здесь можно играть в футбол",
"de": "Hier wird Fußball gespielt"
}
},
{
@ -97,7 +101,8 @@
"fr": "C'est une table de ping-pong",
"en": "This is a pingpong table",
"ru": "Это стол для пинг-понга",
"it": "Questo è un tavolo da ping pong"
"it": "Questo è un tavolo da ping pong",
"de": "Dies ist eine Tischtennisplatte"
}
},
{
@ -111,7 +116,8 @@
"fr": "Ici, on joue au tennis",
"en": "Tennis is played here",
"it": "Qui si gioca a tennis",
"ru": "Здесь можно играть в теннис"
"ru": "Здесь можно играть в теннис",
"de": "Hier wird Tennis gespielt"
}
},
{
@ -125,7 +131,8 @@
"fr": "Ici, on joue au korfball",
"en": "Korfball is played here",
"it": "Qui si gioca a korfball",
"ru": "Здесь можно играть в корфбол"
"ru": "Здесь можно играть в корфбол",
"de": "Hier wird Kopfball gespielt"
}
},
{
@ -139,7 +146,8 @@
"fr": "Ici, on joue au basketball",
"en": "Basketball is played here",
"it": "Qui si gioca a basket",
"ru": "Здесь можно играть в баскетбол"
"ru": "Здесь можно играть в баскетбол",
"de": "Hier wird Basketball gespielt"
},
"hideInAnswer": true
}
@ -159,7 +167,8 @@
"fr": "La surface est <b>{surface}</b>",
"en": "The surface is <b>{surface}</b>",
"ru": "Поверхность - <b>{surface}</b>",
"it": "La superficie è <b>{surface}</b>"
"it": "La superficie è <b>{surface}</b>",
"de": "Die Oberfläche ist <b>{surface}</b>"
},
"freeform": {
"key": "surface"
@ -172,7 +181,8 @@
"fr": "La surface est de l'<b>herbe</b>",
"en": "The surface is <b>grass</b>",
"ru": "Поверхность - <b>трава</b>",
"it": "La superficie è <b>erba</b>"
"it": "La superficie è <b>erba</b>",
"de": "Die Oberfläche ist <b>Gras</b>"
}
},
{
@ -182,7 +192,8 @@
"fr": "La surface est du <b>sable</b>",
"en": "The surface is <b>sand</b>",
"ru": "Поверхность - <b>песок</b>",
"it": "La superficie è <b>sabbia</b>"
"it": "La superficie è <b>sabbia</b>",
"de": "Die Oberfläche ist <b>Sand</b>"
}
},
{
@ -192,7 +203,8 @@
"fr": "La surface est des <b>pavés</b>",
"en": "The surface is <b>paving stones</b>",
"ru": "Поверхность - <b>брусчатка</b>",
"it": "La superficie è <b>pietre irregolari</b>"
"it": "La superficie è <b>pietre irregolari</b>",
"de": "Die Oberfläche ist aus <b>Pflastersteinen</b>"
}
},
{
@ -202,7 +214,8 @@
"fr": "La surface est de l'<b>asphalte</b>",
"en": "The surface is <b>asphalt</b>",
"ru": "Поверхность - <b>асфальт</b>",
"it": "La superficie è <b>asfalto</b>"
"it": "La superficie è <b>asfalto</b>",
"de": "Die Oberfläche ist <b>Asphalt</b>"
}
},
{
@ -212,7 +225,8 @@
"fr": "La surface est du <b>béton</b>",
"en": "The surface is <b>concrete</b>",
"ru": "Поверхность - <b>бетон</b>",
"it": "La superficie è <b>calcestruzzo</b>"
"it": "La superficie è <b>calcestruzzo</b>",
"de": "Die Oberfläche ist <b>Beton</b>"
}
}
],
@ -225,7 +239,8 @@
"fr": "Est-ce que ce terrain de sport est accessible au public ?",
"en": "Is this sport pitch publicly accessible?",
"it": "Questo campo sportivo è aperto al pubblico?",
"ru": "Есть ли свободный доступ к этой спортивной площадке?"
"ru": "Есть ли свободный доступ к этой спортивной площадке?",
"de": "Ist dieser Sportplatz öffentlich zugänglich?"
},
"mappings": [
{
@ -235,7 +250,8 @@
"fr": "Accessible au public",
"en": "Public access",
"it": "Aperto al pubblico",
"ru": "Свободный доступ"
"ru": "Свободный доступ",
"de": "Öffentlicher Zugang"
}
},
{
@ -255,7 +271,8 @@
"fr": "Accessible uniquement aux membres du club",
"en": "Only accessible for members of the club",
"it": "Accesso limitato ai membri dell'associazione",
"ru": "Доступ только членам клуба"
"ru": "Доступ только членам клуба",
"de": "Zugang nur für Vereinsmitglieder"
}
},
{
@ -264,7 +281,8 @@
"nl": "Privaat en niet toegankelijk",
"fr": "Privé - Pas accessible au public",
"en": "Private - not accessible to the public",
"it": "Privato - non aperto al pubblico"
"it": "Privato - non aperto al pubblico",
"de": "Privat - kein öffentlicher Zugang"
}
}
]
@ -322,7 +340,8 @@
"fr": "On ne peut pas réserver",
"en": "Making an appointment is not possible",
"it": "Non è possibile prenotare",
"ru": "Невозможна предварительная запись"
"ru": "Невозможна предварительная запись",
"de": "Termine nach Vereinbarung nicht möglich"
}
}
]
@ -361,7 +380,8 @@
"fr": "Quand ce terrain est-il accessible ?",
"en": "When is this pitch accessible?",
"it": "Quando è aperto questo campo sportivo?",
"ru": "В какое время доступна эта площадка?"
"ru": "В какое время доступна эта площадка?",
"de": "Wann ist dieser Sportplatz zugänglich?"
},
"render": "Openingsuren: {opening_hours_table()}",
"freeform": {
@ -381,7 +401,8 @@
"fr": "Accessible en permanence",
"en": "Always accessible",
"ru": "Всегда доступен",
"it": "Sempre aperto"
"it": "Sempre aperto",
"de": "Immer zugänglich"
}
}
],
@ -423,7 +444,8 @@
"opening_hours~*"
]
},
"then": "isOpen"
"then": "isOpen",
"badge": true
},
{
"if": {
@ -433,7 +455,8 @@
"access=no"
]
},
"then": "circle:white;./assets/layers/sport_pitch/lock.svg"
"then": "circle:white;./assets/layers/sport_pitch/lock.svg",
"badge": true
}
],
"width": {
@ -471,7 +494,8 @@
"fr": "Table de ping-pong",
"en": "Tabletennis table",
"it": "Tavolo da tennistavolo",
"ru": "Стол для настольного тенниса"
"ru": "Стол для настольного тенниса",
"de": "Tischtennisplatte"
},
"tags": [
"leisure=pitch",
@ -484,7 +508,8 @@
"fr": "Terrain de sport",
"en": "Sport pitch",
"ru": "Спортивная площадка",
"it": "Campo sportivo"
"it": "Campo sportivo",
"de": "Sportplatz"
},
"tags": [
"leisure=pitch",

View file

@ -41,7 +41,8 @@
"nl": "Wat voor soort camera is dit?",
"fr": "Quel genre de caméra est-ce ?",
"it": "Di che tipo di videocamera si tratta?",
"ru": "Какая это камера?"
"ru": "Какая это камера?",
"de": "Um welche Kameratyp handelt se sich?"
},
"mappings": [
{
@ -54,7 +55,8 @@
"en": "A fixed (non-moving) camera",
"nl": "Een vaste camera",
"fr": "Une caméra fixe (non mobile)",
"it": "Una videocamera fissa (non semovente)"
"it": "Una videocamera fissa (non semovente)",
"de": "Eine fest montierte (nicht bewegliche) Kamera"
}
},
{
@ -68,7 +70,8 @@
"nl": "Een dome (bolvormige camera die kan draaien)",
"fr": "Une caméra dôme (qui peut tourner)",
"it": "Una videocamera a cupola (che può ruotare)",
"ru": "Камера с поворотным механизмом"
"ru": "Камера с поворотным механизмом",
"de": "Eine Kuppelkamera (drehbar)"
}
},
{
@ -82,7 +85,8 @@
"nl": "Een camera die (met een motor) van links naar rechts kan draaien",
"ru": "Панорамная камера",
"fr": "Une caméra panoramique",
"it": "Una videocamera panoramica"
"it": "Una videocamera panoramica",
"de": "Eine bewegliche Kamera"
}
}
],
@ -145,13 +149,15 @@
"en": "Who operates this CCTV?",
"nl": "Wie beheert deze bewakingscamera?",
"fr": "Qui exploite ce système de vidéosurveillance ?",
"it": "Chi gestisce questa videocamera a circuito chiuso?"
"it": "Chi gestisce questa videocamera a circuito chiuso?",
"de": "Wer betreibt diese CCTV Kamera?"
},
"render": {
"en": "Operated by {operator}",
"nl": "Beheer door {operator}",
"fr": "Exploité par {operator}",
"it": "È gestita da {operator}"
"it": "È gestita da {operator}",
"de": "Betrieben von {operator}"
},
"id": "Operator"
},
@ -224,7 +230,8 @@
"en": "This camera is located indoors",
"nl": "Deze camera bevindt zich binnen",
"fr": "Cette caméra est située à l'intérieur",
"it": "Questa videocamera si trova al chiuso"
"it": "Questa videocamera si trova al chiuso",
"de": "Diese Kamera befindet sich im Innenraum"
}
},
{
@ -234,7 +241,8 @@
"nl": "Deze camera bevindt zich buiten",
"fr": "Cette caméra est située à l'extérieur",
"it": "Questa videocamera si trova all'aperto",
"ru": "Эта камера расположена снаружи"
"ru": "Эта камера расположена снаружи",
"de": "Diese Kamera befindet sich im Freien"
}
},
{
@ -244,7 +252,8 @@
"nl": "Deze camera bevindt zich waarschijnlijk buiten",
"fr": "Cette caméra est probablement située à l'extérieur",
"it": "Questa videocamera si trova probabilmente all'esterno",
"ru": "Возможно, эта камера расположена снаружи"
"ru": "Возможно, эта камера расположена снаружи",
"de": "Diese Kamera ist möglicherweise im Freien"
},
"hideInAnswer": true
}
@ -256,13 +265,15 @@
"en": "On which level is this camera located?",
"nl": "Op welke verdieping bevindt deze camera zich?",
"fr": "À quel niveau se trouve cette caméra ?",
"it": "A che piano si trova questa videocamera?"
"it": "A che piano si trova questa videocamera?",
"de": "Auf welcher Ebene befindet sich diese Kamera?"
},
"render": {
"en": "Located on level {level}",
"nl": "Bevindt zich op verdieping {level}",
"fr": "Situé au niveau {level}",
"it": "Si trova al piano {level}"
"it": "Si trova al piano {level}",
"de": "Befindet sich auf Ebene {level}"
},
"freeform": {
"key": "level",
@ -281,7 +292,8 @@
"en": "What exactly is surveilled here?",
"nl": "Wat wordt hier precies bewaakt?",
"fr": "Qu'est-ce qui est surveillé ici ?",
"it": "Che cosa è sorvegliato qui?"
"it": "Che cosa è sorvegliato qui?",
"de": "Was genau wird hier überwacht?"
},
"freeform": {
"key": "surveillance:zone"
@ -290,7 +302,8 @@
"en": " Surveills a {surveillance:zone}",
"nl": "Bewaakt een {surveillance:zone}",
"fr": " Surveille un(e) {surveillance:zone}",
"it": " Sorveglia una {surveillance:zone}"
"it": " Sorveglia una {surveillance:zone}",
"de": " Überwacht ein/e {surveillance:zone}"
},
"mappings": [
{
@ -303,7 +316,8 @@
"en": "Surveills a parking",
"nl": "Bewaakt een parking",
"fr": "Surveille un parking",
"it": "Sorveglia un parcheggio"
"it": "Sorveglia un parcheggio",
"de": "Überwacht einen Parkplatz"
}
},
{
@ -316,7 +330,8 @@
"en": "Surveills the traffic",
"nl": "Bewaakt het verkeer",
"fr": "Surveille la circulation",
"it": "Sorveglia il traffico"
"it": "Sorveglia il traffico",
"de": "Überwacht den Verkehr"
}
},
{
@ -329,7 +344,8 @@
"en": "Surveills an entrance",
"nl": "Bewaakt een ingang",
"fr": "Surveille une entrée",
"it": "Sorveglia un ingresso"
"it": "Sorveglia un ingresso",
"de": "Überwacht einen Eingang"
}
},
{
@ -342,7 +358,8 @@
"en": "Surveills a corridor",
"nl": "Bewaakt een gang",
"fr": "Surveille un couloir",
"it": "Sorveglia un corridoio"
"it": "Sorveglia un corridoio",
"de": "Überwacht einen Gang"
}
},
{
@ -355,7 +372,8 @@
"en": "Surveills a public tranport platform",
"nl": "Bewaakt een perron of bushalte",
"fr": "Surveille un quai de transport public",
"it": "Sorveglia una pensilina del trasporto pubblico"
"it": "Sorveglia una pensilina del trasporto pubblico",
"de": "Überwacht eine Haltestelle"
}
},
{
@ -368,7 +386,8 @@
"en": "Surveills a shop",
"nl": "Bewaakt een winkel",
"fr": "Surveille un magasin",
"it": "Sorveglia un negozio"
"it": "Sorveglia un negozio",
"de": "Überwacht ein Geschäft"
}
}
],
@ -380,13 +399,15 @@
"nl": "Hoe is deze camera geplaatst?",
"fr": "Comment cette caméra est-elle placée ?",
"it": "Com'è posizionata questa telecamera?",
"ru": "Как расположена эта камера?"
"ru": "Как расположена эта камера?",
"de": "Wie ist diese Kamera montiert?"
},
"render": {
"en": "Mounting method: {mount}",
"nl": "Montage: {camera:mount}",
"fr": "Méthode de montage : {mount}",
"it": "Metodo di montaggio: {mount}"
"it": "Metodo di montaggio: {mount}",
"de": "Montageart: {mount}"
},
"freeform": {
"key": "camera:mount"

View file

@ -462,7 +462,8 @@
{
"question": {
"en": "Wheelchair accessible",
"nl": "Rolstoel toegankelijk"
"nl": "Rolstoel toegankelijk",
"de": "Rollstuhlgerecht"
},
"osmTags": "wheelchair=yes"
}
@ -474,7 +475,8 @@
{
"question": {
"en": "Has a changing table",
"nl": "Heeft een luiertafel"
"nl": "Heeft een luiertafel",
"de": "Hat einen Wickeltisch"
},
"osmTags": "changing_table=yes"
}
@ -486,7 +488,8 @@
{
"question": {
"en": "Free to use",
"nl": "Gratis toegankelijk"
"nl": "Gratis toegankelijk",
"de": "Nutzung kostenlos"
},
"osmTags": {
"or": [

View file

@ -50,7 +50,8 @@
"en": "Height: {height}",
"it": "Altezza: {height}",
"ru": "Высота: {height}",
"fr": "Hauteur : {height}"
"fr": "Hauteur : {height}",
"de": "Höhe: {height}"
},
"condition": {
"and": [
@ -69,7 +70,8 @@
"en": "Height: {height}&nbsp;m",
"it": "Altezza: {height}&nbsp;m",
"ru": "Высота: {height}&nbsp;м",
"fr": "Hauteur&nbsp;: {height}&nbsp;m"
"fr": "Hauteur&nbsp;: {height}&nbsp;m",
"de": "Höhe: {height}&nbsp;m"
}
}
]
@ -93,7 +95,8 @@
"nl": "<img src=\"./assets/themes/trees/broadleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Loofboom",
"en": "<img src=\"./assets/themes/trees/broadleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Broadleaved",
"it": "<img src=\"./assets/themes/trees/broadleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Latifoglia",
"fr": "<img src=\"./assets/themes/trees/broadleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Feuillu"
"fr": "<img src=\"./assets/themes/trees/broadleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Feuillu",
"de": "<img src=\"./assets/themes/trees/broadleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Laubbaum"
}
},
{
@ -106,7 +109,8 @@
"nl": "<img src=\"./assets/themes/trees/needleleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Naaldboom",
"en": "<img src=\"./assets/themes/trees/needleleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Needleleaved",
"it": "<img src=\"./assets/themes/trees/needleleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Aghifoglia",
"fr": "<img src=\"./assets/themes/trees/needleleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Résineux"
"fr": "<img src=\"./assets/themes/trees/needleleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Résineux",
"de": "<img src=\"./assets/themes/trees/needleleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Nadelbaum"
}
},
{
@ -119,7 +123,8 @@
"nl": "<img src=\"./assets/themes/trees/leafless.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Permanent bladloos",
"en": "<img src=\"./assets/themes/trees/leafless.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Permanently leafless",
"it": "<img src=\"./assets/themes/trees/leafless.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Privo di foglie (permanente)",
"fr": "<img src=\"./assets/themes/trees/leafless.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Sans feuilles (Permanent)"
"fr": "<img src=\"./assets/themes/trees/leafless.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Sans feuilles (Permanent)",
"de": "<img src=\"./assets/themes/trees/leafless.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Dauerhaft blattlos"
},
"hideInAnswer": true
}
@ -247,7 +252,8 @@
"en": "Is this tree evergreen or deciduous?",
"it": "È un sempreverde o caduco?",
"ru": "Это дерево вечнозелёное или листопадное?",
"fr": "Larbre est-il à feuillage persistant ou caduc ?"
"fr": "Larbre est-il à feuillage persistant ou caduc ?",
"de": "Ist dies ein Nadelbaum oder ein Laubbaum?"
},
"mappings": [
{
@ -275,7 +281,8 @@
"en": "Evergreen.",
"it": "Sempreverde.",
"fr": "À feuilles persistantes.",
"ru": "Вечнозелёное."
"ru": "Вечнозелёное.",
"de": "immergrüner Baum."
}
}
],
@ -292,14 +299,16 @@
"it": "Nome: {name}",
"ru": "Название: {name}",
"fr": "Nom : {name}",
"id": "Nama: {name}"
"id": "Nama: {name}",
"de": "Name: {name}"
},
"question": {
"nl": "Heeft de boom een naam?",
"en": "Does the tree have a name?",
"it": "Lalbero ha un nome?",
"fr": "L'arbre a-t-il un nom ?",
"ru": "Есть ли у этого дерева название?"
"ru": "Есть ли у этого дерева название?",
"de": "Hat der Baum einen Namen?"
},
"freeform": {
"key": "name",
@ -320,7 +329,8 @@
"en": "The tree does not have a name.",
"it": "Lalbero non ha un nome.",
"fr": "L'arbre n'a pas de nom.",
"ru": "У этого дерева нет названия."
"ru": "У этого дерева нет названия.",
"de": "Der Baum hat keinen Namen."
}
}
],
@ -339,7 +349,8 @@
"nl": "Is deze boom erkend als erfgoed?",
"en": "Is this tree registered heritage?",
"it": "Questalbero è registrato come patrimonio?",
"fr": "Cet arbre est-il inscrit au patrimoine ?"
"fr": "Cet arbre est-il inscrit au patrimoine ?",
"de": "Ist dieser Baum ein Naturdenkmal?"
},
"mappings": [
{
@ -395,7 +406,8 @@
"nl": "Niet erkend als erfgoed",
"en": "Not registered as heritage",
"it": "Non è registrato come patrimonio",
"fr": "Non enregistré comme patrimoine"
"fr": "Non enregistré comme patrimoine",
"de": "Nicht als Denkmal registriert"
}
},
{
@ -516,13 +528,15 @@
"en": "Broadleaved tree",
"it": "Albero latifoglia",
"fr": "Arbre feuillu",
"ru": "Лиственное дерево"
"ru": "Лиственное дерево",
"de": "Laubbaum"
},
"description": {
"nl": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.",
"en": "A tree of a species with leaves, such as oak or populus.",
"it": "Un albero di una specie con foglie larghe come la quercia o il pioppo.",
"fr": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier."
"fr": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier.",
"de": "Ein Baum mit Blättern, z. B. Eiche oder Buche."
},
"preciseInput": {
"preferredBackground": "photo"
@ -538,14 +552,16 @@
"en": "Needleleaved tree",
"it": "Albero aghifoglia",
"ru": "Хвойное дерево",
"fr": "Arbre résineux"
"fr": "Arbre résineux",
"de": "Nadelbaum"
},
"description": {
"nl": "Een boom van een soort met naalden, bijvoorbeeld den of spar.",
"en": "A tree of a species with needles, such as pine or spruce.",
"it": "Un albero di una specie con aghi come il pino o labete.",
"ru": "Дерево с хвоей (иглами), например, сосна или ель.",
"fr": "Une espèce darbre avec des épines comme le pin ou lépicéa."
"fr": "Une espèce darbre avec des épines comme le pin ou lépicéa.",
"de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte."
},
"preciseInput": {
"preferredBackground": "photo"
@ -569,7 +585,8 @@
"en": "If you're not sure whether it's a broadleaved or needleleaved tree.",
"it": "Qualora non si sia sicuri se si tratta di un albero latifoglia o aghifoglia.",
"fr": "Si vous n'êtes pas sûr(e) de savoir s'il s'agit d'un arbre à feuilles larges ou à aiguilles.",
"ru": "Если вы не уверены в том, лиственное это дерево или хвойное."
"ru": "Если вы не уверены в том, лиственное это дерево или хвойное.",
"de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt."
},
"preciseInput": {
"preferredBackground": "photo"

View file

@ -53,7 +53,8 @@
},
"description": {
"en": "A visitor center offers information about a specific attraction or place of interest where it is located.",
"nl": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd."
"nl": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd.",
"de": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet."
},
"tagRenderings": [],
"icon": {

View file

@ -40,7 +40,8 @@
"if": "waste=",
"then": {
"en": "A waste basket for general waste",
"nl": "Een vuilnisbak voor zwerfvuil"
"nl": "Een vuilnisbak voor zwerfvuil",
"de": "Ein Abfalleimer für allgemeinen Müll"
},
"hideInAnswer": true
},
@ -48,28 +49,32 @@
"if": "waste=trash",
"then": {
"en": "A waste basket for general waste",
"nl": "Een vuilnisbak voor zwerfvuil"
"nl": "Een vuilnisbak voor zwerfvuil",
"de": "Ein Abfalleimer für allgemeinen Müll"
}
},
{
"if": "waste=dog_excrement",
"then": {
"en": "A waste basket for dog excrements",
"nl": "Een vuilnisbak specifiek voor hondenuitwerpselen"
"nl": "Een vuilnisbak specifiek voor hondenuitwerpselen",
"de": "Ein Abfalleimer für Hundekot"
}
},
{
"if": "waste=cigarettes",
"then": {
"en": "A waste basket for cigarettes",
"nl": "Een vuilnisbak voor sigarettenpeuken"
"nl": "Een vuilnisbak voor sigarettenpeuken",
"de": "Mülleimer für Zigaretten"
}
},
{
"if": "waste=drugs",
"then": {
"en": "A waste basket for drugs",
"nl": "Een vuilnisbak voor (vervallen) medicatie en drugs"
"nl": "Een vuilnisbak voor (vervallen) medicatie en drugs",
"de": "Mülleimer für Drogen"
}
},
{
@ -144,7 +149,8 @@
"then": {
"en": "Waste Basket",
"nl": "Vuilnisbak",
"ru": "Контейнер для мусора"
"ru": "Контейнер для мусора",
"de": "Abfalleimer"
}
}
]
@ -160,7 +166,8 @@
"title": {
"en": "Waste Basket",
"nl": "Vuilnisbak",
"ru": "Контейнер для мусора"
"ru": "Контейнер для мусора",
"de": "Abfalleimer"
},
"presiceInput": {
"preferredBackground": "photo"

View file

@ -2,83 +2,80 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns="http://www.w3.org/2000/svg"
width="100"
height="100"
viewBox="0 0 26.458333 26.458334"
version="1.1"
id="svg8"
sodipodi:docname="close.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<defs
id="defs2"/>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="-12.514944"
inkscape:cy="118.94409"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1">
<sodipodi:guide
position="13.229167,23.859748"
orientation="1,0"
id="guide815"
inkscape:locked="false"/>
<sodipodi:guide
position="14.944824,13.229167"
orientation="0,1"
id="guide817"
inkscape:locked="false"/>
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-270.54165)">
<g
id="g836"
transform="matrix(1.7481308,0,0,1.7481308,-10.001295,-212.27744)">
<path
inkscape:connector-curvature="0"
id="path815"
d="M 18.972892,289.3838 7.7469352,278.15784 v 0"
style="fill:none;stroke:#000000;stroke-width:3.4395833;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
<path
inkscape:connector-curvature="0"
id="path815-3"
d="M 18.98982,278.10371 7.7638604,289.32967 v 0"
style="fill:none;stroke:#000000;stroke-width:3.4395833;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
</g>
</g>
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="100"
height="100"
viewBox="0 0 26.458333 26.458334"
version="1.1"
id="svg8"
sodipodi:docname="close.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="-14.459488"
inkscape:cy="118.94409"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1003"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1">
<sodipodi:guide
position="13.229167,23.859748"
orientation="1,0"
id="guide815"
inkscape:locked="false" />
<sodipodi:guide
position="14.944824,13.229167"
orientation="0,1"
id="guide817"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-270.54165)">
<path
style="fill:none;stroke:#000000;stroke-width:6.0128417;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 23.165802,293.60329 3.541361,273.97885 v 0"
id="path815"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:6.01292087;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 23.195394,273.88422 3.5709485,293.50867 v 0"
id="path815-3"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -6,14 +6,18 @@
"render": "{wikipedia():max-height:25rem}",
"question": {
"en": "What is the corresponding Wikidata entity?",
"nl": "Welk Wikidata-item komt overeen met dit object?"
"nl": "Welk Wikidata-item komt overeen met dit object?",
"de": "Was ist das entsprechende Wikidata Element?",
"pt": "Qual é a entidade Wikidata correspondente?"
},
"mappings": [
{
"if": "wikidata=",
"then": {
"en": "No Wikipedia page has been linked yet",
"nl": "Er werd nog geen Wikipedia-pagina gekoppeld"
"nl": "Er werd nog geen Wikipedia-pagina gekoppeld",
"de": "Es wurde noch keine Wikipedia-Seite verlinkt",
"pt": "Ainda não foi vinculada nenhuma página da Wikipédia"
},
"hideInAnswer": true
}
@ -64,14 +68,18 @@
"render": "<a href='https://wikipedia.org/wiki/{wikipedia}' target='_blank'><img src='./assets/wikipedia.svg' alt='WP'/></a>",
"question": {
"en": "What is the corresponding item on Wikipedia?",
"nl": "Welk Wikipedia-artikel beschrijft dit object?"
"nl": "Welk Wikipedia-artikel beschrijft dit object?",
"de": "Was ist der entsprechende Artikel auf Wikipedia?",
"pt": "Qual é o item correspondente na Wikipédia?"
},
"mappings": [
{
"if": "wikidata=",
"then": {
"en": "Not linked with Wikipedia",
"nl": "Nog geen Wikipedia-artikel bekend"
"nl": "Nog geen Wikipedia-artikel bekend",
"de": "Nicht mit Wikipedia verknüpft",
"pt": "Não vinculado à Wikipédia"
}
}
],

View file

@ -156,7 +156,8 @@
"iconOverlays": [
{
"if": "opening_hours~*",
"then": "isOpen"
"then": "isOpen",
"badge": true
}
],
"width": {
@ -214,26 +215,7 @@
}
}
],
"wayHandling": 1,
"mapRendering": [
{
"icon": {
"render": "./assets/themes/climbing/club.svg"
},
"iconBadges": [
{
"if": "opening_hours~*",
"then": "isOpen"
}
],
"iconSize": {
"render": "40,40,center"
},
"location": [
"point"
]
}
]
"wayHandling": 1
},
{
"id": "climbing_gym",
@ -323,33 +305,15 @@
"iconOverlays": [
{
"if": "opening_hours~*",
"then": "isOpen"
"then": "isOpen",
"badge": true
}
],
"width": "0",
"iconSize": {
"render": "40,40,center"
},
"wayHandling": 1,
"mapRendering": [
{
"icon": {
"render": "./assets/themes/climbing/climbing_gym.svg"
},
"iconBadges": [
{
"if": "opening_hours~*",
"then": "isOpen"
}
],
"iconSize": {
"render": "40,40,center"
},
"location": [
"point"
]
}
]
"wayHandling": 1
},
{
"id": "climbing_route",
@ -568,29 +532,7 @@
]
}
],
"wayHandling": 2,
"mapRendering": [
{
"icon": {
"render": "circle:white;./assets/themes/climbing/climbing_route.svg"
},
"iconSize": {
"render": "28,28,center"
},
"location": [
"point",
"centroid"
]
},
{
"color": {
"render": "#0f0"
},
"width": {
"render": "4"
}
}
]
"wayHandling": 2
},
{
"id": "climbing",
@ -859,28 +801,6 @@
"_difficulty_hist=JSON.parse(feat.properties._contained_climbing_routes_properties ?? '[]').map(p => p['climbing:grade:french'])",
"_length_hist=JSON.parse(feat.properties._contained_climbing_routes_properties ?? '[]').map(p => p['climbing:length'])",
"_contained_climbing_routes_count=JSON.parse(feat.properties._contained_climbing_routes_properties ?? '[]').length"
],
"mapRendering": [
{
"icon": {
"render": "./assets/themes/climbing/climbing_no_rope.svg"
},
"iconSize": {
"render": "40,40,center"
},
"location": [
"point",
"centroid"
]
},
{
"color": {
"render": "#d38d5fAA"
},
"width": {
"render": "8"
}
}
]
},
{
@ -1010,23 +930,7 @@
"color": {
"render": "#ddff55AA"
},
"wayHandling": 0,
"mapRendering": [
{
"icon": "./assets/themes/climbing/climbing_unknown.svg",
"location": [
"point"
]
},
{
"color": {
"render": "#ddff55AA"
},
"width": {
"render": "2"
}
}
]
"wayHandling": 0
}
],
"overrideAll": {

View file

@ -5,7 +5,7 @@
"nl": "Cyclofix - een open kaart voor fietsers",
"fr": "Cyclofix - Une carte ouverte pour les cyclistes",
"gl": "Cyclofix - Un mapa aberto para os ciclistas",
"de": "Cyclofix - eine offene Karte für Radfahrer",
"de": "Cyclofix - eine freie Karte für Radfahrer",
"ru": "Cyclofix - открытая карта для велосипедистов",
"ja": "Cyclofix - サイクリストのためのオープンマップ",
"zh_Hant": "單車修正 - 單車騎士的開放地圖",
@ -16,7 +16,7 @@
"nl": "Het doel van deze kaart is om fietsers een gebruiksvriendelijke oplossing te bieden voor het vinden van de juiste infrastructuur voor hun behoeften.<br><br>U kunt uw exacte locatie volgen (enkel mobiel) en in de linkerbenedenhoek categorieën selecteren die voor u relevant zijn. U kunt deze tool ook gebruiken om 'spelden' aan de kaart toe te voegen of te bewerken en meer gegevens te verstrekken door de vragen te beantwoorden.<br><br>Alle wijzigingen die u maakt worden automatisch opgeslagen in de wereldwijde database van OpenStreetMap en kunnen door anderen vrij worden hergebruikt.<br><br>Bekijk voor meer info over cyclofix ook <a href='https://cyclofix.osm.be/'>cyclofix.osm.be</a>.",
"fr": "Le but de cette carte est de présenter aux cyclistes une solution facile à utiliser pour trouver l'infrastructure appropriée à leurs besoins.<br><br>Vous pouvez suivre votre localisation précise (mobile uniquement) et sélectionner les couches qui vous concernent dans le coin inférieur gauche. Vous pouvez également utiliser cet outil pour ajouter ou modifier des épingles (points d'intérêt) sur la carte et fournir plus de données en répondant aux questions.<br><br>Toutes les modifications que vous apportez seront automatiquement enregistrées dans la base de données mondiale d'OpenStreetMap et peuvent être librement réutilisées par d'autres.<br><br>Pour plus d'informations sur le projet cyclofix, rendez-vous sur <a href='https://cyclofix.osm.be/'>cyclofix.osm.be</a>.",
"gl": "O obxectivo deste mapa é amosar ós ciclistas unha solución doada de empregar para atopar a infraestrutura axeitada para as súas necesidades.<br><br>Podes obter a túa localización precisa (só para dispositivos móbiles) e escoller as capas que sexan relevantes para ti na esquina inferior esquerda. Tamén podes empregar esta ferramenta para engadir ou editar puntos de interese ó mapa e fornecer máis datos respondendo as cuestións.<br><br>Todas as modificacións que fagas serán gardadas de xeito automático na base de datos global do OpenStreetMap e outros poderán reutilizalos libremente.<br><br>Para máis información sobre o proxecto cyclofix, vai a <a href='https://cyclofix.osm.be/'>cyclofix.osm.be</a>.",
"de": "Das Ziel dieser Karte ist es, den Radfahrern eine einfach zu benutzende Lösung zu präsentieren, um die geeignete Infrastruktur für ihre Bedürfnisse zu finden.<br><br>Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.<br><br>Alle Änderungen, die Sie vornehmen, werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei wiederverwendet werden.<br><br>Weitere Informationen über das Projekt Cyclofix finden Sie unter <a href='https://cyclofix.osm.be/'>cyclofix.osm.be</a>.",
"de": "Mit dieser Karte soll Radfahrern eine einfache Lösung bereitgestellt werden, um die passende Farradinfrastruktur zu finden.<br><br>Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.<br><br>Ihre Änderungen, werden automatisch in der Datenbank von OpenStreetMap gespeichert und können von anderen frei verwendet werden.<br><br>Weitere Informationen über Cyclofix finden Sie unter <a href='https://cyclofix.osm.be/'>cyclofix.osm.be</a>.",
"ja": "このマップの目的は、サイクリストのニーズに適した施設を見つけるための使いやすいソリューションを提供することです。<br><br>正確な位置を追跡し(モバイルのみ)、左下コーナーで関連するレイヤを選択できます。このツールを使用して、マップにピン(注目点)を追加または編集したり、質問に答えることでより多くのデータを提供することもできます。<br><br>変更内容はすべてOpenStreetMapのグローバルデータベースに自動的に保存され、他のユーザーが自由に再利用できます。<br><br>cyclofixプロジェクトの詳細については、 <a href='https://cyclofix.osm.be/'>cyclofix.osm.be</a> を参照してください。",
"zh_Hant": "這份地圖的目的是為單車騎士能夠輕易顯示滿足他們需求的相關設施。<br><br>你可以追蹤你確切位置 (只有行動版),以及在左下角選擇相關的圖層。你可以使用這工具在地圖新增或編輯釘子,以及透過回答問題來提供更多資訊。<br><br>所有你的變動都會自動存在開放街圖這全球資料圖,並且能被任何人自由取用。<br><br>你可以到 <a href='https://cyclofix.osm.be/'>cyclofix.osm.be</a> 閱讀更多資訊。",
"it": "Questa mappa offre a chi va in bici una soluzione semplice per trovare tutte le infrastrutture di cui ha bisogno.<br><br>Puoi tracciare la tua posizione esatta (solo su mobile) e selezionare i livelli che ti interessano nell'angolo in basso a sinistra. Puoi anche usare questo strumento per aggiungere o modificare punti di interesse alla mappa e aggiungere nuove informazioni rispendendo alle domande.<br><br>Tutte le modifiche che apporterai saranno automaticamente salvate nel database mondiale di OpenStreetMap e potranno essere liberamente riutilizzate da tutti e tutte.<br><br>Per maggiori informazioni sul progetto ciclofix, visita <a href='https://cyclofix.osm.be/'>cyclofix.osm.be</a>."

View file

@ -8,7 +8,7 @@
"ja": "飲料水",
"zh_Hant": "飲用水",
"it": "Acqua potabile",
"de": "Trinkwasser"
"de": "Trinkwasserstelle"
},
"description": {
"en": "On this map, publicly accessible drinking water spots are shown and can be easily added",
@ -18,7 +18,7 @@
"zh_Hant": "在這份地圖上,公共可及的飲水點可以顯示出來,也能輕易的增加",
"it": "Questa mappa mostra tutti i luoghi in cui è disponibile acqua potabile ed è possibile aggiungerne di nuovi",
"ru": "На этой карте показываются и могут быть легко добавлены общедоступные точки питьевой воды",
"de": "Auf dieser Karte sind öffentlich zugängliche Trinkwasserstellen eingezeichnet und können leicht hinzugefügt werden"
"de": "Eine Karte zum Anzeigen und Bearbeiten öffentlicher Trinkwasserstellen"
},
"language": [
"en",

View file

@ -13,7 +13,7 @@
"description": {
"en": "On this map, you can see what an object is named after. The streets, buildings, ... come from OpenStreetMap which got linked with Wikidata. In the popup, you'll see the Wikipedia article (if it exists) or a wikidata box of what the object is named after. If the object itself has a wikipedia page, that'll be shown too.<br/><br/><b>You can help contribute too!</b>Zoom in enough and <i>all</i> streets will show up. You can click one and a Wikidata-search box will popup. With a few clicks, you can add an etymology link. Note that you need a free OpenStreetMap account to do this.",
"nl": "Op deze kaart zie je waar een plaats naar is vernoemd. De straten, gebouwen, ... komen uit OpenStreetMap, waar een link naar Wikidata werd gelegd. In de popup zie je het Wikipedia-artikel van hetgeen naarwaar het vernoemd is of de Wikidata-box.<br/><br/><b>Je kan zelf ook meehelpen!</b>Als je ver inzoomt, krijg je alle straten te zien. Klik je een straat aan, dan krijg je een zoekfunctie waarmee je snel een nieuwe link kan leggen. Je hebt hiervoor een gratis OpenStreetMap account nodig.",
"de": "Auf dieser Karte können Sie sehen, nach was ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. Die Informationen stammen aus Wikipedia."
"de": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.<br/><br/><b>Sie können auch einen Beitrag leisten!</b>Zoomen Sie genug hinein und <i>alle</i> Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen."
},
"language": [
"en",
@ -28,6 +28,10 @@
"startZoom": 1,
"widenFactor": 2,
"socialImage": "",
"clustering": {
"maxZoom": 14,
"minNeededElements": 250
},
"layers": [
"etymology",
{
@ -36,7 +40,8 @@
"id": "streets_without_etymology",
"name": {
"en": "Streets without etymology information",
"nl": "Straten zonder etymologische informatie"
"nl": "Straten zonder etymologische informatie",
"de": "Straßen ohne Informationen zur Namensherkunft"
},
"minzoom": 18,
"source": {
@ -56,7 +61,8 @@
"id": "parks_and_forests_without_etymology",
"name": {
"en": "Parks and forests without etymology information",
"nl": "Parken en bossen zonder etymologische informatie"
"nl": "Parken en bossen zonder etymologische informatie",
"de": "Parks und Waldflächen ohne Informationen zur Namensherkunft"
},
"minzoom": 18,
"source": {
@ -75,5 +81,5 @@
}
}
],
"hideFromOverview": true
"hideFromOverview": false
}

View file

@ -24,7 +24,7 @@
"title": {
"en": "Ghost bikes",
"nl": "Witte Fietsen",
"de": "Geisterrad",
"de": "Geisterräder",
"ja": "ゴーストバイク",
"nb_NO": "Spøkelsessykler",
"zh_Hant": "幽靈單車",
@ -43,7 +43,7 @@
"description": {
"en": "A <b>ghost bike</b> is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location.<br/><br/>On this map, one can see all the ghost bikes which are known by OpenStreetMap. Is a ghost bike missing? Everyone can add or update information here - you only need to have a (free) OpenStreetMap account.",
"nl": "Een <b>Witte Fiets</b> of <b>Spookfiets</b> is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat om een fiets die volledig wit is geschilderd en in de buurt van het ongeval werd geinstalleerd.<br/><br/>Op deze kaart zie je alle witte fietsen die door OpenStreetMap gekend zijn. Ontbreekt er een Witte Fiets of wens je informatie aan te passen? Meld je dan aan met een (gratis) OpenStreetMap account.",
"de": "Ein <b>Geisterrad</b> ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.<br/><br/> Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap kennt. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
"de": "Ein <b>Geisterrad</b> ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.<br/><br/> Auf dieser Karte kann man alle Geisterräder sehen, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
"ja": "<b>ゴーストバイク</b>は、交通事故で死亡したサイクリストを記念するもので、事故現場の近くに恒久的に置かれた白い自転車の形をしています。<br/><br/>このマップには、OpenStreetMapで知られているゴーストバイクがすべて表示されます。ゴーストバイクは行方不明ですか?誰でもここで情報の追加や更新ができます。必要なのは(無料の)OpenStreetMapアカウントだけです。",
"zh_Hant": "<b>幽靈單車</b>是用來紀念死於交通事故的單車騎士,在事發地點附近放置白色單車。<br/><br/>在這份地圖上面,你可以看到所有在開放街圖已知的幽靈單車。有缺漏的幽靈單車嗎?所有人都可以在這邊新增或是更新資訊-只有你有(免費)開放街圖帳號。",
"fr": "Les <b>vélos fantômes</b> sont des mémoriaux pour les cyclistes tuées sur la route, prenant la forme de vélos blancs placés à proximité des faits.<br/><br/>Cette carte indique leur emplacement à partir dOpenStreetMap. Il est possible de contribuer aux informations ici, sous réserve davoir un compte OpenStreetMap (gratuit)."

View file

@ -19,7 +19,6 @@
"startLon": 3.231,
"startZoom": 14,
"widenFactor": 2,
"cacheTimeout": 3600,
"socialImage": "",
"layers": [
{
@ -197,34 +196,7 @@
"render": "#00f"
},
"wayHandling": 2,
"presets": [],
"mapRendering": [
{
"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"
},
"location": [
"point",
"centroid"
]
},
{
"color": {
"render": "#00f"
},
"width": {
"render": "2"
}
}
]
"presets": []
}
],
"hideFromOverview": true,

View file

@ -49,7 +49,8 @@
"zh_Hant": "消防栓地圖",
"nb_NO": "Kart over brannhydranter",
"ru": "Карта пожарных гидрантов",
"fr": "Carte des bornes incendie"
"fr": "Carte des bornes incendie",
"de": "Karte der Hydranten"
},
"minzoom": 14,
"source": {
@ -65,7 +66,8 @@
"ru": "Гидрант",
"ja": "消火栓",
"nb_NO": "Brannhydrant",
"fr": "Bornes incendie"
"fr": "Bornes incendie",
"de": "Hydrant"
}
},
"description": {
@ -74,7 +76,8 @@
"zh_Hant": "顯示消防栓的地圖圖層。",
"nb_NO": "Kartlag for å vise brannhydranter.",
"ru": "Слой карты, отображающий пожарные гидранты.",
"fr": "Couche des bornes incendie."
"fr": "Couche des bornes incendie.",
"de": "Kartenebene zur Anzeige von Hydranten."
},
"tagRenderings": [
{
@ -84,14 +87,16 @@
"ja": "消火栓の色は何色ですか?",
"nb_NO": "Hvilken farge har brannhydranten?",
"ru": "Какого цвета гидрант?",
"fr": "Quelle est la couleur de la borne ?"
"fr": "Quelle est la couleur de la borne ?",
"de": "Welche Farbe hat der Hydrant?"
},
"render": {
"en": "The hydrant color is {colour}",
"ja": "消火栓の色は{color}です",
"nb_NO": "Brannhydranter er {colour}",
"ru": "Цвет гидранта {colour}",
"fr": "La borne est {colour}"
"fr": "La borne est {colour}",
"de": "Der Hydrant hat die Farbe {colour}"
},
"freeform": {
"key": "colour"
@ -107,7 +112,8 @@
"en": "The hydrant color is unknown.",
"ja": "消火栓の色は不明です。",
"ru": "Цвет гидранта не определён.",
"fr": "La borne est de couleur inconnue."
"fr": "La borne est de couleur inconnue.",
"de": "Die Farbe des Hydranten ist unbekannt."
},
"hideInAnswer": true
},
@ -121,7 +127,8 @@
"en": "The hydrant color is yellow.",
"ja": "消火栓の色は黄色です。",
"ru": "Гидрант жёлтого цвета.",
"fr": "La borne est jaune."
"fr": "La borne est jaune.",
"de": "Die Farbe des Hydranten ist gelb."
}
},
{
@ -135,7 +142,8 @@
"ja": "消火栓の色は赤です。",
"it": "L'idrante è rosso.",
"ru": "Гидрант красного цвета.",
"fr": "La borne est rouge."
"fr": "La borne est rouge.",
"de": "Die Farbe des Hydranten ist rot."
}
}
]
@ -147,7 +155,8 @@
"ja": "どんな消火栓なんですか?",
"it": "Di che tipo è questo idrante?",
"ru": "К какому типу относится этот гидрант?",
"fr": "De quel type de borne sagit-il ?"
"fr": "De quel type de borne sagit-il ?",
"de": "Um welche Art von Hydrant handelt es sich?"
},
"freeform": {
"key": "fire_hydrant:type"
@ -157,7 +166,8 @@
"ru": " Тип гидранта: {fire_hydrant:type}",
"ja": " 消火栓のタイプ:{fire_hydrant:type}",
"it": " Tipo di idrante: {fire_hydrant:type}",
"fr": " Type de borne : {fire_hydrant:type}"
"fr": " Type de borne : {fire_hydrant:type}",
"de": " Hydranten-Typ: {fire_hydrant:type}"
},
"mappings": [
{
@ -171,7 +181,8 @@
"ja": "消火栓の種類は不明です。",
"it": "Il tipo di idrante è sconosciuto.",
"ru": "Тип гидранта не определён.",
"fr": "La borne est de type inconnu."
"fr": "La borne est de type inconnu.",
"de": "Der Typ des Hydranten ist unbekannt."
},
"hideInAnswer": true
},
@ -184,7 +195,8 @@
"then": {
"en": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_pillar.svg\" /> Pillar type.",
"ja": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_pillar.svg\" /> ピラー型。",
"fr": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_pillar.svg\" /> Pilier."
"fr": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_pillar.svg\" /> Pilier.",
"de": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_pillar.svg\" /> Säulenart."
}
},
{
@ -196,7 +208,8 @@
"then": {
"en": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Pipe type.",
"ja": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> パイプ型。",
"fr": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Tuyau."
"fr": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Tuyau.",
"de": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Rohrtyp."
}
},
{
@ -210,7 +223,8 @@
"id": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Jenis dinding.",
"ru": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Тип стены.",
"ja": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> 壁型。",
"fr": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Mural."
"fr": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Mural.",
"de": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Wandtyp."
}
},
{
@ -222,7 +236,8 @@
"then": {
"en": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_underground.svg\" /> Underground type.",
"ja": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_underground.svg\" />地下式。",
"fr": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_underground.svg\" /> Enterré."
"fr": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_underground.svg\" /> Enterré.",
"de": "<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_underground.svg\" /> Untergrundtyp."
}
}
]
@ -232,12 +247,14 @@
"question": {
"en": "Update the lifecycle status of the hydrant.",
"ja": "消火栓のライフサイクルステータスを更新します。",
"fr": "Mettre à jour létat de la borne."
"fr": "Mettre à jour létat de la borne.",
"de": "Aktualisieren Sie den Lebenszyklusstatus des Hydranten."
},
"render": {
"en": "Lifecycle status",
"ja": "ライフサイクルステータス",
"fr": "État"
"fr": "État",
"de": "Lebenszyklus-Status"
},
"freeform": {
"key": "disused:emergency"
@ -253,7 +270,8 @@
"en": "The hydrant is (fully or partially) working.",
"ja": "消火栓は(完全にまたは部分的に)機能しています。",
"ru": "Гидрант (полностью или частично) в рабочем состоянии.",
"fr": "La borne est en état, ou partiellement en état, de fonctionner."
"fr": "La borne est en état, ou partiellement en état, de fonctionner.",
"de": "Der Hydrant ist (ganz oder teilweise) in Betrieb."
}
},
{
@ -266,7 +284,8 @@
"then": {
"en": "The hydrant is unavailable.",
"ja": "消火栓は使用できません。",
"fr": "La borne est hors-service."
"fr": "La borne est hors-service.",
"de": "Der Hydrant ist nicht verfügbar."
}
},
{
@ -280,7 +299,8 @@
"en": "The hydrant has been removed.",
"ja": "消火栓が撤去されました。",
"ru": "Гидрант демонтирован.",
"fr": "La borne a été retirée."
"fr": "La borne a été retirée.",
"de": "Der Hydrant wurde entfernt."
}
}
]
@ -309,38 +329,18 @@
"ru": "Пожарный гидрант",
"ja": "消火栓",
"nb_NO": "Brannhydrant",
"fr": "Borne incendie"
"fr": "Borne incendie",
"de": "Löschwasser-Hydrant"
},
"description": {
"en": "A hydrant is a connection point where firefighters can tap water. It might be located underground.",
"ja": "消火栓は消防士が水を汲み上げることができる接続点です。地下にあるかもしれません。",
"fr": "Une borne incendie est un point où les pompiers peuvent salimenter en eau. Elle peut être enterrée."
"fr": "Une borne incendie est un point où les pompiers peuvent salimenter en eau. Elle peut être enterrée.",
"de": "Ein Hydrant ist ein Anschlusspunkt, an dem die Feuerwehr Wasser zapfen kann. Er kann sich unterirdisch befinden."
}
}
],
"wayHandling": 2,
"mapRendering": [
{
"icon": {
"render": "./assets/themes/hailhydrant/hydrant.svg"
},
"iconSize": {
"render": "20,20,center"
},
"location": [
"point",
"centroid"
]
},
{
"color": {
"render": "#00f"
},
"width": {
"render": "8"
}
}
]
"wayHandling": 2
},
{
"id": "extinguisher",
@ -349,7 +349,8 @@
"ja": "消火器の地図です。",
"nb_NO": "Kart over brannhydranter",
"ru": "Карта огнетушителей.",
"fr": "Couche des extincteurs."
"fr": "Couche des extincteurs.",
"de": "Karte mit Feuerlöschern."
},
"minzoom": 14,
"source": {
@ -365,7 +366,8 @@
"ru": "Огнетушители",
"ja": "消火器",
"nb_NO": "Brannslokkere",
"fr": "Exctincteurs"
"fr": "Exctincteurs",
"de": "Feuerlöscher"
}
},
"description": {
@ -374,7 +376,8 @@
"zh_Hant": "顯示消防栓的地圖圖層。",
"nb_NO": "Kartlag for å vise brannslokkere.",
"ru": "Слой карты, отображающий огнетушители.",
"fr": "Couche des lances à incendie."
"fr": "Couche des lances à incendie.",
"de": "Kartenebene zur Anzeige von Hydranten."
},
"tagRenderings": [
{
@ -383,13 +386,15 @@
"en": "Location: {location}",
"ja": "場所:{location}",
"ru": "Местоположение: {location}",
"fr": "Emplacement : {location}"
"fr": "Emplacement : {location}",
"de": "Standort: {location}"
},
"question": {
"en": "Where is it positioned?",
"ja": "どこにあるんですか?",
"ru": "Где это расположено?",
"fr": "Où est-elle positionnée ?"
"fr": "Où est-elle positionnée ?",
"de": "Wo befindet er sich?"
},
"mappings": [
{
@ -402,7 +407,8 @@
"en": "Found indoors.",
"ja": "屋内にある。",
"ru": "Внутри.",
"fr": "Intérieur."
"fr": "Intérieur.",
"de": "Im Innenraum vorhanden."
}
},
{
@ -415,7 +421,8 @@
"en": "Found outdoors.",
"ja": "屋外にある。",
"ru": "Снаружи.",
"fr": "Extérieur."
"fr": "Extérieur.",
"de": "Im Außenraum vorhanden."
}
}
],
@ -447,30 +454,19 @@
"ja": "消火器",
"nb_NO": "Brannslukker",
"ru": "Огнетушитель",
"fr": "Extincteur"
"fr": "Extincteur",
"de": "Feuerlöscher"
},
"description": {
"en": "A fire extinguisher is a small, portable device used to stop a fire",
"ja": "消火器は、火災を止めるために使用される小型で携帯可能な装置である",
"ru": "Огнетушитель - небольшое переносное устройство для тушения огня",
"fr": "Un extincteur est un appareil portatif servant à éteindre un feu"
"fr": "Un extincteur est un appareil portatif servant à éteindre un feu",
"de": "Ein Feuerlöscher ist ein kleines, tragbares Gerät, das dazu dient, ein Feuer zu löschen"
}
}
],
"wayHandling": 1,
"mapRendering": [
{
"icon": {
"render": "./assets/themes/hailhydrant/Twemoji12_1f9ef.svg"
},
"iconSize": {
"render": "20,20,center"
},
"location": [
"point"
]
}
]
"wayHandling": 1
},
{
"id": "fire_stations",
@ -480,7 +476,8 @@
"nb_NO": "Kart over brannstasjoner",
"it": "Mappa delle caserme dei vigili del fuoco",
"ru": "Карта пожарных частей",
"fr": "Couche des stations de pompiers"
"fr": "Couche des stations de pompiers",
"de": "Karte der Feuerwachen"
},
"minzoom": 12,
"source": {
@ -506,7 +503,8 @@
"ja": "消防署を表示するためのマップレイヤ。",
"it": "Livello che mostra le caserme dei vigili del fuoco.",
"ru": "Слой карты, отображающий пожарные части.",
"fr": "Couche des stations de pompiers."
"fr": "Couche des stations de pompiers.",
"de": "Kartenebene zur Darstellung von Feuerwachen."
},
"tagRenderings": [
{
@ -519,7 +517,8 @@
"ja": "この消防署の名前は何ですか?",
"ru": "Как называется эта пожарная часть?",
"it": "Come si chiama questa caserma dei vigili del fuoco?",
"fr": "Quel est le nom de la station ?"
"fr": "Quel est le nom de la station ?",
"de": "Wie lautet der Name dieser Feuerwache?"
},
"render": {
"en": "This station is called {name}.",
@ -686,34 +685,14 @@
"en": "Fire station",
"ja": "消防署",
"ru": "Пожарная часть",
"fr": "Caserne de pompiers"
"fr": "Caserne de pompiers",
"de": "Feuerwache"
},
"description": {
"en": "A fire station is a place where the fire trucks and firefighters are located when not in operation.",
"ja": "消防署は、運転していないときに消防車や消防士がいる場所です。",
"fr": "Une caserne de pompiers est un lieu où les pompiers et leur équipements sont situés en dehors des missions."
}
}
],
"mapRendering": [
{
"icon": {
"render": "./assets/themes/hailhydrant/Twemoji12_1f692.svg"
},
"iconSize": {
"render": "35,35,center"
},
"location": [
"point",
"centroid"
]
},
{
"color": {
"render": "#c22"
},
"width": {
"render": "1"
"fr": "Une caserne de pompiers est un lieu où les pompiers et leur équipements sont situés en dehors des missions.",
"de": "Eine Feuerwache ist ein Ort, an dem die Feuerwehrfahrzeuge und die Feuerwehrleute untergebracht sind, wenn sie nicht im Einsatz sind."
}
}
]
@ -913,33 +892,12 @@
"en": "Add an ambulance station to the map",
"ja": "救急ステーション(消防署)をマップに追加する",
"ru": "Добавить станцию скорой помощи на карту",
"fr": "Ajouter une station dambulances à la carte"
"fr": "Ajouter une station dambulances à la carte",
"de": "Eine Rettungsstation der Karte hinzufügen"
}
}
],
"wayHandling": 2,
"mapRendering": [
{
"icon": {
"render": "./assets/themes/hailhydrant/Twemoji_1f691.svg"
},
"iconSize": {
"render": "35,35,center"
},
"location": [
"point",
"centroid"
]
},
{
"color": {
"render": "#00f"
},
"width": {
"render": "1"
}
}
]
"wayHandling": 2
}
],
"defaultBackgroundId": "HDM_HOT"

View file

@ -6,7 +6,8 @@
"fr": "Carte des cartes",
"ja": "マップのマップ",
"zh_Hant": "地圖的地圖",
"ru": "Карта карт"
"ru": "Карта карт",
"de": "Eine Karte der Karten"
},
"shortDescription": {
"en": "This theme shows all (touristic) maps that OpenStreetMap knows of",
@ -28,7 +29,8 @@
"fr",
"ja",
"zh_Hant",
"ru"
"ru",
"de"
],
"maintainer": "MapComplete",
"icon": "./assets/themes/maps/logo.svg",

View file

@ -3,11 +3,13 @@
"customCss": "./assets/themes/natuurpunt/natuurpunt.css",
"title": {
"nl": "Natuurgebieden",
"en": "Nature Reserves"
"en": "Nature Reserves",
"de": "Naturschutzgebiete"
},
"shortDescription": {
"nl": "Deze kaart toont de natuurgebieden van Natuurpunt",
"en": "This map shows the nature reserves of Natuurpunt"
"en": "This map shows the nature reserves of Natuurpunt",
"de": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt"
},
"description": {
"nl": "Op deze kaart vind je alle natuurgebieden die Natuurpunt ter beschikking stelt",
@ -15,7 +17,8 @@
},
"language": [
"nl",
"en"
"en",
"de"
],
"mustHaveLanguage": [
"nl"
@ -33,8 +36,8 @@
"enableDownload": true,
"hideFromOverview": true,
"clustering": {
"#": "Disable clustering for this theme",
"maxZoom": 0
"maxZoom": 0,
"#": "Disable clustering for this theme"
},
"layers": [
{
@ -54,13 +57,9 @@
},
"minzoom": 13,
"minzoomVisible": 0,
"mapRendering": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg"
}
}
]
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg"
}
}
},
{
@ -78,13 +77,9 @@
"isOsmCache": "duplicate"
},
"minzoom": 1,
"mapRendering": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg"
}
}
],
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg"
},
"presets": []
}
},
@ -101,13 +96,9 @@
"isOsmCache": true
},
"minzoom": 1,
"mapRendering": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/information.svg"
}
}
]
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/information.svg"
}
}
},
{
@ -124,23 +115,19 @@
"isOsmCache": true
},
"minzoom": 10,
"mapRendering": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/trail.svg",
"mappings": [
{
"if": "wheelchair=yes",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/walk_wheelchair.svg"
},
{
"if": "pushchair=yes",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/pushchair.svg"
}
]
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/trail.svg",
"mappings": [
{
"if": "wheelchair=yes",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/walk_wheelchair.svg"
},
{
"if": "pushchair=yes",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/pushchair.svg"
}
}
]
]
}
}
},
{
@ -152,23 +139,19 @@
"geoJsonZoomLevel": 12,
"isOsmCache": true
},
"mapRendering": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/toilets.svg",
"mappings": [
{
"if": "wheelchair=yes",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/wheelchair.svg"
},
{
"if": "toilets:position=urinals",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/urinal.svg"
}
]
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/toilets.svg",
"mappings": [
{
"if": "wheelchair=yes",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/wheelchair.svg"
},
{
"if": "toilets:position=urinals",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/urinal.svg"
}
}
]
]
}
}
},
{
@ -180,14 +163,10 @@
"geoJsonZoomLevel": 12,
"isOsmCache": true
},
"mapRendering": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/birdhide.svg",
"mappings": null
}
}
]
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/birdhide.svg",
"mappings": null
}
}
},
{
@ -199,13 +178,9 @@
"geoJsonZoomLevel": 12,
"isOsmCache": true
},
"mapRendering": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/picnic_table.svg"
}
}
]
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/picnic_table.svg"
}
}
},
{
@ -217,42 +192,34 @@
"geoJsonZoomLevel": 12,
"isOsmCache": true
},
"mapRendering": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/drips.svg"
}
}
]
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/drips.svg"
}
}
},
{
"builtin": "parking",
"override": {
"minzoom": "16",
"mapRendering": [
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/parking.svg",
"mappings": [
{
"if": "amenity=bicycle_parking",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/parkingbike.svg"
}
]
},
"iconOverlays": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/parking.svg",
"mappings": [
{
"if": "amenity=bicycle_parking",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/parkingbike.svg"
}
]
},
"iconOverlays": [
{
"if": "amenity=motorcycle_parking",
"then": "circle:#335D9F;./assets/themes/natuurpunt/parkingmotor.svg",
"badge": true
},
{
"if": "capacity:disabled=yes",
"then": "circle:#335D9F;./assets/themes/natuurpunt/parkingwheels.svg",
"badge": true
}
]
"if": "amenity=motorcycle_parking",
"then": "circle:#335D9F;./assets/themes/natuurpunt/parkingmotor.svg",
"badge": true
},
{
"if": "capacity:disabled=yes",
"then": "circle:#335D9F;./assets/themes/natuurpunt/parkingwheels.svg",
"badge": true
}
]
}
@ -266,13 +233,9 @@
"geoJsonZoomLevel": 12,
"isOsmCache": true
},
"mapRendering": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/information_board.svg"
}
}
]
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/information_board.svg"
}
}
},
{
@ -284,13 +247,9 @@
"geoJsonZoomLevel": 12,
"isOsmCache": true
},
"mapRendering": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/bench.svg"
}
}
]
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/bench.svg"
}
}
},
{
@ -302,13 +261,9 @@
"geoJsonZoomLevel": 12,
"isOsmCache": true
},
"mapRendering": [
{
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/watermill.svg"
}
}
]
"icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/watermill.svg"
}
}
}
],

View file

@ -2,19 +2,23 @@
"id": "observation_towers",
"title": {
"en": "Observation towers",
"nl": "Uitkijktorens"
"nl": "Uitkijktorens",
"de": "Aussichtstürme"
},
"shortDescription": {
"en": "Publicly accessible towers to enjoy the view",
"nl": "Publieke uitkijktorens om van het panorama te genieten"
"nl": "Publieke uitkijktorens om van het panorama te genieten",
"de": "Öffentlich zugänglicher Aussichtsturm"
},
"description": {
"nl": "Publieke uitkijktorens om van het panorama te genieten",
"en": "Publicly accessible towers to enjoy the view"
"en": "Publicly accessible towers to enjoy the view",
"de": "Öffentlich zugänglicher Aussichtsturm"
},
"language": [
"en",
"nl"
"nl",
"de"
],
"maintainer": "",
"icon": "./assets/layers/observation_tower/Tower_observation.svg",

View file

@ -2,7 +2,8 @@
"id": "openwindpowermap",
"title": {
"en": "OpenWindPowerMap",
"fr": "OpenWindPowerMap"
"fr": "OpenWindPowerMap",
"de": "OpenWindPowerMap"
},
"maintainer": "Seppe Santens",
"icon": "./assets/themes/openwindpowermap/wind_turbine.svg",
@ -229,23 +230,6 @@
}
]
}
],
"mapRendering": [
{
"icon": "./assets/themes/openwindpowermap/wind_turbine.svg",
"label": {
"mappings": [
{
"if": "generator:output:electricity~^[0-9]+.*[W]$",
"then": "<div style='background-color: rgba(0,0,0,0.3); color: white; font-size: 8px; padding: 0.25em; border-radius:0.5em'>{generator:output:electricity}</div>"
}
]
},
"iconSize": "40, 40, bottom",
"location": [
"point"
]
}
]
}
],

View file

@ -2,19 +2,23 @@
"id": "parkings",
"title": {
"nl": "Parking",
"en": "Parking"
"en": "Parking",
"de": "Parken"
},
"shortDescription": {
"nl": "Deze kaart toont verschillende parkeerplekken",
"en": "This map shows different parking spots"
"en": "This map shows different parking spots",
"de": "Diese Karte zeigt Parkplätze"
},
"description": {
"nl": "Deze kaart toont verschillende parkeerplekken",
"en": "This map shows different parking spots"
"en": "This map shows different parking spots",
"de": "Diese Karte zeigt Parkplätze"
},
"language": [
"nl",
"en"
"en",
"de"
],
"maintainer": "",
"icon": "./assets/themes/parkings/parkings.svg",

View file

@ -6,7 +6,8 @@
"fr": "Aires de jeux",
"ja": "遊び場",
"zh_Hant": "遊樂場",
"ru": "Игровые площадки"
"ru": "Игровые площадки",
"de": "Spielpläzte"
},
"shortDescription": {
"nl": "Een kaart met speeltuinen",
@ -14,7 +15,8 @@
"fr": "Une carte des aires de jeux",
"ja": "遊び場のある地図",
"zh_Hant": "遊樂場的地圖",
"ru": "Карта игровых площадок"
"ru": "Карта игровых площадок",
"de": "Eine Karte mit Spielplätzen"
},
"description": {
"nl": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen",
@ -30,7 +32,8 @@
"fr",
"ja",
"zh_Hant",
"ru"
"ru",
"de"
],
"maintainer": "",
"icon": "./assets/themes/playgrounds/playground.svg",

View file

@ -1,10 +1,12 @@
{
"id": "postboxes",
"title": {
"en": "Postbox and Post Office Map"
"en": "Postbox and Post Office Map",
"de": "Karte mit Briefkästen und Poststellen"
},
"shortDescription": {
"en": "A map showing postboxes and post offices"
"en": "A map showing postboxes and post offices",
"de": "Eine Karte die Briefkästen und Poststellen anzeigt"
},
"description": {
"en": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :)<br/>Spotted an error or is a post box missing? You can edit this map with a free OpenStreetMap account. "
@ -80,29 +82,7 @@
"razed:amenity=post_box"
]
}
},
"mapRendering": [
{
"icon": {
"render": "./assets/themes/postboxes/postbox.svg"
},
"iconSize": {
"render": "40,40,bottom"
},
"location": [
"point",
"centroid"
]
},
{
"color": {
"render": "#DADADA"
},
"width": {
"render": "1"
}
}
]
}
},
{
"id": "postoffices",
@ -119,7 +99,8 @@
}
},
"description": {
"en": "A layer showing post offices."
"en": "A layer showing post offices.",
"de": "Eine Ebene mit Postämtern."
},
"tagRenderings": [
"images",
@ -142,7 +123,8 @@
{
"if": "opening_hours=24/7",
"then": {
"en": "24/7 opened (including holidays)"
"en": "24/7 opened (including holidays)",
"de": "durchgehend geöffnet (auch an Feiertagen)"
}
}
],
@ -155,7 +137,8 @@
"iconOverlays": [
{
"if": "opening_hours~*",
"then": "isOpen"
"then": "isOpen",
"badge": true
}
],
"width": {
@ -190,34 +173,6 @@
}
]
}
],
"mapRendering": [
{
"icon": {
"render": "square:white;./assets/themes/postboxes/post_office.svg"
},
"iconBadges": [
{
"if": "opening_hours~*",
"then": "isOpen"
}
],
"iconSize": {
"render": "40,40,bottom"
},
"location": [
"point",
"centroid"
]
},
{
"color": {
"render": "#DADADA"
},
"width": {
"render": "1"
}
}
]
}
]

View file

@ -7,6 +7,9 @@
"en",
"nl"
],
"mustHaveLanguage": [
"nl"
],
"title": {
"nl": "Toeristisch relevante info"
},

View file

@ -2,7 +2,7 @@
"id": "toilets",
"title": {
"en": "Open Toilet Map",
"de": "Offene Toilette Karte",
"de": "Freie Toilettenkarte",
"fr": "Carte des WC et toilettes publiques",
"nl": "Open Toilettenkaart",
"ru": "Открытая карта туалетов",
@ -12,7 +12,7 @@
},
"description": {
"en": "A map of public toilets",
"de": "Eine Karte der öffentlichen Toiletten",
"de": "Eine Karte mit öffentlich zugänglichen Toiletten",
"fr": "Carte affichant les WC et toilettes publiques",
"nl": "Een kaart met openbare toiletten",
"ru": "Карта общественных туалетов",

View file

@ -112,35 +112,13 @@
}
]
}
],
"mapRendering": [
{
"icon": {
"render": "./assets/themes/uk_addresses/housenumber_unknown.svg",
"mappings": [
{
"if": "_embedding_object:id~*",
"then": "./assets/themes/uk_addresses/housenumber_unknown_small.svg"
},
{
"if": "_imported=yes",
"then": "./assets/themes/uk_addresses/housenumber_unknown_small.svg"
}
]
},
"iconSize": {
"render": "40,40,center"
},
"location": [
"point"
]
}
]
},
{
"id": "addresses",
"name": {
"en": "Known addresses in OSM"
"en": "Known addresses in OSM",
"de": "Bekannte Adressen in OSM"
},
"minzoom": 18,
"source": {
@ -160,28 +138,33 @@
],
"title": {
"render": {
"en": "Known address"
"en": "Known address",
"de": "Bekannte Adresse"
}
},
"description": {
"en": "Addresses",
"nl": "Adressen"
"nl": "Adressen",
"de": "Adressen"
},
"tagRenderings": [
{
"id": "uk_addresses_explanation_osm",
"render": {
"en": "This address is saved in OpenStreetMap"
"en": "This address is saved in OpenStreetMap",
"de": "Diese Adresse ist in OpenStreetMap gespeichert"
}
},
{
"id": "uk_addresses_housenumber",
"render": {
"en": "The housenumber is <b>{addr:housenumber}</b>",
"nl": "Het huisnummer is <b>{addr:housenumber}</b>"
"nl": "Het huisnummer is <b>{addr:housenumber}</b>",
"de": "Die Hausnummer ist <b>{addr:housenumber}</b>"
},
"question": {
"en": "What is the number of this house?"
"en": "What is the number of this house?",
"de": "Wie lautet die Nummer dieses Hauses?"
},
"freeform": {
"key": "addr:housenumber",
@ -198,7 +181,8 @@
},
"then": {
"en": "This building has no house number",
"nl": "Dit gebouw heeft geen huisnummer"
"nl": "Dit gebouw heeft geen huisnummer",
"de": "Dieses Gebäude hat keine Hausnummer"
}
}
]
@ -206,10 +190,12 @@
{
"id": "uk_addresses_street",
"render": {
"en": "This address is in street <b>{addr:street}</b>"
"en": "This address is in street <b>{addr:street}</b>",
"de": "Diese Adresse befindet sich in der Straße <b>{addr:street}</b>"
},
"question": {
"en": "What street is this address located in?"
"en": "What street is this address located in?",
"de": "In welcher Straße befindet sich diese Adresse?"
},
"freeform": {
"key": "addr:street"
@ -281,60 +267,7 @@
"then": "#ff0"
}
]
},
"mapRendering": [
{
"icon": {
"render": "./assets/themes/uk_addresses/housenumber_ok.svg",
"mappings": [
{
"if": {
"or": [
{
"and": [
"addr:housenumber=",
"nohousenumber!=yes"
]
},
"addr:street="
]
},
"then": "./assets/themes/uk_addresses/housenumber_unknown.svg"
}
]
},
"iconSize": {
"render": "40,40,center"
},
"location": [
"point"
]
},
{
"color": {
"render": "#00f",
"mappings": [
{
"if": {
"or": [
{
"and": [
"addr:housenumber=",
"nohousenumber!=yes"
]
},
"addr:street="
]
},
"then": "#ff0"
}
]
},
"width": {
"render": "8"
}
}
]
}
},
{
"id": "named_streets",
@ -352,22 +285,7 @@
},
"width": {
"render": "0"
},
"mapRendering": [
{
"location": [
"point"
]
},
{
"color": {
"render": "#ccc"
},
"width": {
"render": "0"
}
}
]
}
}
]
}

View file

@ -7,13 +7,13 @@
},
{
"start_date": "2022-04-11",
"end_date": "2022-04-17",
"end_date": "2022-04-18",
"message": "The 15th of april is <b><a href=https://en.wikipedia.org/wiki/World_Art_Day' target='_blank'>World Art Day</a></b> - the ideal moment to go out, enjoy some artwork and add missing artwork to the map. And of course, you can snap some pictures",
"featured_theme": "artwork"
},
{
"start_date": "2022-03-24",
"end_date": "2022-01-30",
"end_date": "2022-03-31",
"message": "The 22nd of March is <b><a href='https://www.un.org/en/observances/water-day' target='_blank'>World Water Day</a></b>. Time to go out and find all the public drinking water spots!",
"featured_theme": "drinking_water"
},
@ -40,13 +40,13 @@
},
{
"start_date": "2021-10-25",
"end_date": "2021-10-31",
"end_date": "2021-11-01",
"message": "Did you know you could link OpenStreetMap with Wikidata? With <i>name:etymology:wikidata</i>, it is even possible to link to whom or what a feature is <i>named after</i>. Quite some volunteers have done this - because it is interesting or for the <a href='https://equalstreetnames.org/' target='_blank'>Equal Street Names-project</a>. For this, a new theme has been created which shows the Wikipedia page and Wikimedia-images of this tag and which makes it easy to link them both with the search box. Give it a try!",
"featured_theme": "etymology"
},
{
"start_date": "2021-10-17",
"end_date": "2021-10-24",
"end_date": "2021-10-25",
"message": "<p>Hi all!</p><p>Thanks for using MapComplete. It has been quite a ride since it's inception, a bit over a year ago. MapComplete has grown significantly recently, which you can read more about on <a href='https://www.openstreetmap.org/user/Pieter%20Vander%20Vennet/diary/397796' target='_blank'>in my diary entry</a>.<p>Furthermore, <a target='_blank' href='https://www.openstreetmap.org/user/Nicolelaine'>NicoleLaine</a> made a really cool new theme about postboxes, so make sure to check it out!</p>",
"featured_theme": "postboxes"
}

View file

@ -864,10 +864,6 @@ video {
margin-top: 0.25rem;
}
.mb-2 {
margin-bottom: 0.5rem;
}
.mr-4 {
margin-right: 1rem;
}
@ -928,6 +924,10 @@ video {
margin-right: 0.75rem;
}
.mb-2 {
margin-bottom: 0.5rem;
}
.mb-0 {
margin-bottom: 0px;
}
@ -1000,10 +1000,6 @@ video {
height: 3rem;
}
.h-5 {
height: 1.25rem;
}
.h-screen {
height: 100vh;
}
@ -1291,10 +1287,6 @@ video {
border-width: 2px;
}
.border-b-2 {
border-bottom-width: 2px;
}
.border-b {
border-bottom-width: 1px;
}
@ -1328,11 +1320,6 @@ video {
background-color: rgba(255, 255, 255, var(--tw-bg-opacity));
}
.bg-blue-50 {
--tw-bg-opacity: 1;
background-color: rgba(239, 246, 255, var(--tw-bg-opacity));
}
.bg-blue-100 {
--tw-bg-opacity: 1;
background-color: rgba(219, 234, 254, var(--tw-bg-opacity));
@ -1398,32 +1385,28 @@ video {
padding: 0.5rem;
}
.p-0\.5 {
padding: 0.125rem;
}
.p-0 {
padding: 0px;
}
.p-0\.5 {
padding: 0.125rem;
}
.pl-2 {
padding-left: 0.5rem;
}
.pt-3 {
padding-top: 0.75rem;
.pb-20 {
padding-bottom: 5rem;
}
.pb-3 {
padding-bottom: 0.75rem;
.pt-1 {
padding-top: 0.25rem;
}
.pl-4 {
padding-left: 1rem;
}
.pb-0 {
padding-bottom: 0px;
.pb-1 {
padding-bottom: 0.25rem;
}
.pl-1 {
@ -1438,6 +1421,10 @@ video {
padding-top: 1.5rem;
}
.pb-3 {
padding-bottom: 0.75rem;
}
.pl-5 {
padding-left: 1.25rem;
}
@ -1446,6 +1433,10 @@ video {
padding-right: 0.75rem;
}
.pl-4 {
padding-left: 1rem;
}
.pr-4 {
padding-right: 1rem;
}
@ -1458,10 +1449,6 @@ video {
padding-right: 0px;
}
.pb-2 {
padding-bottom: 0.5rem;
}
.pt-0\.5 {
padding-top: 0.125rem;
}
@ -1470,6 +1457,10 @@ video {
padding-top: 0px;
}
.pb-2 {
padding-bottom: 0.5rem;
}
.pr-2 {
padding-right: 0.5rem;
}
@ -2208,6 +2199,7 @@ li::marker {
.leaflet-popup-content {
width: 45em !important;
margin: 0.25rem !important;
}
.leaflet-div-icon {
@ -2443,8 +2435,8 @@ li::marker {
flex-direction: row;
}
.md\:p-0 {
padding: 0px;
.md\:rounded-xl {
border-radius: 0.75rem;
}
.md\:p-1 {
@ -2463,6 +2455,14 @@ li::marker {
padding: 0.75rem;
}
.md\:pt-0 {
padding-top: 0px;
}
.md\:pb-0 {
padding-bottom: 0px;
}
.md\:pt-4 {
padding-top: 1rem;
}
@ -2482,11 +2482,6 @@ li::marker {
line-height: 1.75rem;
}
.md\:shadow-none {
--tw-shadow: 0 0 #0000;
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.md\:w-160 {
width: 40rem;
}

View file

@ -433,6 +433,7 @@ li::marker {
.leaflet-popup-content {
width: 45em !important;
margin: 0.25rem !important;
}
.leaflet-div-icon {

View file

@ -10,25 +10,25 @@
"ccb": "unter der 'CC-BY-Lizenz'",
"uploadFailed": "Wir konnten Ihr Bild nicht hochladen. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.",
"respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.",
"uploadDone": "<span class=\"thanks\">Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!</span>",
"uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!",
"dontDelete": "Abbrechen",
"doDelete": "Bild entfernen",
"isDeleted": "Gelöscht"
},
"centerMessage": {
"loadingData": "Daten werden geladen…",
"zoomIn": "Vergrößern, um die Daten anzuzeigen oder zu bearbeiten",
"zoomIn": "Ausschnitt vergrößern, um Daten anzuzeigen oder zu bearbeiten",
"ready": "Erledigt!",
"retrying": "Laden von Daten fehlgeschlagen. Erneuter Versuch in {count} Sekunden …"
},
"index": {
"#": "Dieser Text wird über die Thema-Auswahlschaltfläche gezeigt, wenn kein Thema geladen ist",
"title": "Willkommen bei MapComplete",
"intro": "MapComplete ist eine OpenStreetMap-Anwendung, mit der Informationen zu einem bestimmten Thema angezeigt und angepasst werden können.",
"intro": "MapComplete ist eine OpenStreetMap-Anwendung, mit der Informationen zu Objekten eines bestimmten Themas angezeigt und angepasst werden können.",
"pickTheme": "Wähle unten ein Thema, um zu starten."
},
"general": {
"loginWithOpenStreetMap": "Anmeldung mit OpenStreetMap",
"loginWithOpenStreetMap": "Bei OpenStreetMap anmelden",
"welcomeBack": "Sie sind eingeloggt, willkommen zurück!",
"loginToStart": "Anmelden, um diese Frage zu beantworten",
"search": {
@ -61,7 +61,7 @@
"disableFiltersExplanation": "Einige Elemente können durch einen Filter ausgeblendet sein",
"disableFilters": "Alle Filter deaktivieren"
},
"pickLanguage": "Wählen Sie eine Sprache: ",
"pickLanguage": "Sprache wählen: ",
"about": "OpenStreetMap für ein bestimmtes Thema einfach bearbeiten und hinzufügen",
"nameInlineQuestion": "Der Name dieser {category} ist $$$",
"noNameCategory": "{category} ohne Namen",
@ -73,10 +73,10 @@
"emailOf": "Wie lautet die E-Mail-Adresse der {category}?",
"emailIs": "Die E-Mail-Adresse dieser {category} lautet <a href=\"mailto:{email}\" target=\"_blank\">{email}</a>"
},
"openStreetMapIntro": "<h3>Eine offene Karte</h3><p>Wäre es nicht toll, wenn es eine offene Karte gäbe, die von jedem angepasst und benutzt werden könnte? Eine Karte, zu der jeder seine Interessen hinzufügen kann? Dann bräuchte man all diese Websites mit unterschiedlichen, kleinen und inkompatiblen Karten (die immer veraltet sind) nicht mehr.</p><p><b><a href='https://OpenStreetMap.org' target='_blank'>OpenStreetMap</a></b> ist diese offene Karte. Die Kartendaten können kostenlos verwendet werden (mit <a href='https://osm.org/copyright' target='_blank'>Attribution und Veröffentlichung von Änderungen an diesen Daten</a>). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Website basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.</p>Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: <a href='https://maps.me/' target='_blank'>Maps.me</a>, <a href='https://osmAnd.net' target='_blank'>OsmAnd</a>, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram,...<br/>Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!</p></p><p>Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.</p>",
"openStreetMapIntro": "<h3>Eine freie Karte</h3><p>Wäre es nicht toll, wenn es eine freie Karte gäbe, die von jedem angepasst und genutzt werden könnte? Eine Karte, zu der jeder Informationen hinzufügen kann? Dann bräuchte man all diese Webseiten mit unterschiedlichen, eingeschränkten und veralteten Karten nicht mehr.</p><p><b><a href=\"https://OpenStreetMap.org\" target=\"_blank\">OpenStreetMap</a></b> ist diese freie Karte. Alle Kartendaten können kostenlos verwendet werden (mit <a href=\"https://osm.org/copyright\" target=\"_blank\">Attribution und Veröffentlichung von Änderungen an diesen Daten</a>). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Webseite basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.</p>Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: <a href=\"https://maps.me/\" target=\"_blank\">Maps.me</a>, <a href=\"https://osmAnd.net\" target=\"_blank\">OsmAnd</a>, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram, ...&lt;br/&gt;Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!<p></p><p></p><p>Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.</p>",
"sharescreen": {
"intro": "<h3>Diese Karte teilen</h3> Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:",
"addToHomeScreen": "<h3>Zum Startbildschirm hinzufügen</h3> Sie können diese Website einfach zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der URL-Leiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.",
"addToHomeScreen": "<h3>Zum Startbildschirm hinzufügen</h3> Sie können diese Webseite zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der Adressleiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.",
"embedIntro": "<h3>Auf Ihrer Website einbetten</h3>Bitte betten Sie diese Karte in Ihre Webseite ein. <br>Wir ermutigen Sie, es zu tun - Sie müssen nicht einmal um Erlaubnis fragen. <br> Es ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie.",
"copiedToClipboard": "Link in die Zwischenablage kopiert",
"thanksForSharing": "Danke für das Teilen!",
@ -106,10 +106,10 @@
"getStartedNewAccount": " oder <a href='https://www.openstreetmap.org/user/new' target='_blank'>ein neues Konto anlegen</a>",
"noTagsSelected": "Keine Tags ausgewählt",
"customThemeIntro": "<h3>Benutzerdefinierte Themes</h3>Dies sind zuvor besuchte benutzergenerierte Themen.",
"aboutMapcomplete": "<h3>Über MapComplete</h3><p>MapComplete ist ein OpenStreetMap-Editor, der jedem helfen soll, auf einfache Weise Informationen zu einem <b>Einzelthema hinzuzufügen.</b></p><p>Nur Merkmale, die für ein einzelnes Thema relevant sind, werden mit einigen vordefinierten Fragen gezeigt, um die Dinge <b>einfach und extrem benutzerfreundlich</b> zu halten. Der Themen-Betreuer kann auch eine Sprache für die Schnittstelle wählen, Elemente deaktivieren oder sogar in eine andere Website ohne jegliches UI-Element einbetten.</p><p>Ein weiterer wichtiger Teil von MapComplete ist jedoch, immer <b>den nächsten Schritt anzubieten</b>um mehr über OpenStreetMap zu erfahren:<ul><li>Ein iframe ohne UI-Elemente verlinkt zu einer Vollbildversion</li><li>Die Vollbildversion bietet Informationen über OpenStreetMap</li><li>Wenn Sie nicht eingeloggt sind, werden Sie gebeten, sich einzuloggen</li><li>Wenn Sie eine einzige Frage beantwortet haben, dürfen Sie Punkte hinzufügen</li><li>An einem bestimmten Punkt erscheinen die tatsächlich hinzugefügten Tags, die später mit dem Wiki verlinkt werden...</li></ul></p><p>Fällt Ihnen ein Problem mit MapComplete auf? Haben Sie einen Feature-Wunsch? Wollen Sie beim Übersetzen helfen? Gehen Sie <a href='https://github.com/pietervdvn/MapComplete' target='_blank'>zum Quellcode</a> oder <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>zur Problemverfolgung</a>.</p>",
"aboutMapcomplete": "<h3>Über MapComplete</h3><p>Mit MapComplete können Sie OpenStreetMap mit Informationen zu einem <b>einzigen Thema</b> anreichern. Beantworten Sie ein paar Fragen, und innerhalb von Minuten werden Ihre Beiträge rund um den Globus verfügbar sein! Der <b>Themen-Maintainer</b> definiert Elemente, Fragen und Sprachen für das Thema.</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 Informationen über OpenStreetMap</li><li>Das Betrachten funktioniert ohne Login, aber das Bearbeiten erfordert ein OSM-Login.</li><li>Wenn Sie nicht eingeloggt sind, werden Sie aufgefordert, sich anzumelden</li><li>Nach der Beantwortung einer einzelnen Frage 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 sind</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>",
"backgroundMap": "Hintergrundkarte",
"layerSelection": {
"zoomInToSeeThisLayer": "Vergrößern, um diese Ebene zu sehen",
"zoomInToSeeThisLayer": "Ausschnitt vergrößern, um diese Ebene anzuzeigen",
"title": "Ebenen auswählen"
},
"weekdays": {
@ -164,12 +164,13 @@
"downloadAsPdf": "PDF der aktuellen Karte herunterladen",
"downloadGeojson": "Sichtbare Daten als geojson herunterladen",
"includeMetaData": "Metadaten übernehmen (letzter Bearbeiter, berechnete Werte, ...)",
"noDataLoaded": "Noch keine Daten geladen. Download ist in Kürze verfügbar"
"noDataLoaded": "Noch keine Daten geladen. Download ist in Kürze verfügbar",
"licenseInfo": "<h3>Copyright-Hinweis</h3>Die bereitgestellten Daten sind unter ODbL verfügbar. Die Wiederverwendung dieser Daten ist für jeden Zweck frei, aber <ul><li>die Namensnennung <b>© OpenStreetMap contributors</b> ist erforderlich</li><li>Jede Änderung dieser Daten muss unter der gleichen Lizenz veröffentlicht werden</li></ul> Bitte lesen Sie den vollständigen <a href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\">Copyright-Hinweis</a> für weitere Details"
},
"pdf": {
"versionInfo": "v{version} - erstellt am {date}"
},
"loginOnlyNeededToEdit": "wenn du die Karte bearbeiten willst"
"loginOnlyNeededToEdit": "zum Bearbeiten der Karte"
},
"favourite": {
"panelIntro": "<h3>Ihr persönliches Thema</h3>Aktivieren Sie Ihre Lieblingsebenen aus allen offiziellen Themen",

View file

@ -33,7 +33,7 @@
"split": {
"split": "Split",
"cancel": "Cancel",
"inviteToSplit": "Split this road",
"inviteToSplit": "Split this road in smaller segments. This allows to give different properties to parts of the road.",
"loginToSplit": "You must be logged in to split a road",
"splitTitle": "Choose on the map where to split this road",
"hasBeenSplit": "This way has been split"
@ -229,11 +229,11 @@
"wikipediaboxTitle": "Wikipedia",
"failed": "Loading the wikipedia entry failed",
"loading": "Loading Wikipedia...",
"noWikipediaPage": "This wikidata item has no corresponding wikipedia page yet.",
"searchWikidata": "Search on wikidata",
"noWikipediaPage": "This Wikidata item has no corresponding Wikipedia page yet.",
"searchWikidata": "Search on Wikidata",
"noResults": "Nothing found for <i>{search}</i>",
"doSearch": "Search above to see results",
"createNewWikidata": "Create a new wikidata item"
"createNewWikidata": "Create a new Wikidata item"
}
},
"favourite": {
@ -285,4 +285,4 @@
"partOfRelation": "This feature is part of a relation. Use another editor to move it",
"cancel": "Cancel move"
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -544,16 +544,6 @@
}
},
"bike_repair_station": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
},
"name": "Bike stations (repair, pump or both)",
"presets": {
"0": {
@ -700,6 +690,13 @@
}
},
"render": "Bike station (pump & repair)"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
}
},
"bike_shop": {
@ -1016,6 +1013,15 @@
"presets": {
"0": {
"title": "Charging station"
},
"1": {
"title": "charging station for e-bikes"
},
"2": {
"title": "charging station for cars"
},
"3": {
"title": "charging station"
}
},
"tagRenderings": {
@ -1134,7 +1140,21 @@
},
"access": {
"question": "Who is allowed to use this charging station?",
"render": "Access is {access}"
"render": "Access is {access}",
"mappings": {
"0": {
"then": "Anyone can use this charging station (payment might be needed)"
},
"1": {
"then": "Anyone can use this charging station (payment might be needed)"
},
"2": {
"then": "Only customers of the place this station belongs to can use this charging station<br/><span class='subtle'>E.g. a charging station operated by hotel which is only usable by their guests</span>"
},
"3": {
"then": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)"
}
}
},
"capacity": {
"question": "How much vehicles can be charged here at the same time?",
@ -1144,15 +1164,6 @@
"question": "What is the email address of the operator?",
"render": "In case of problems, send an email to <a href='mailto:{email}'>{email}</a>"
},
"fee/charge": {
"mappings": {
"0": {
"then": "Free to use"
}
},
"question": "How much does one have to pay to use this charging station?",
"render": "Using this charging station costs <b>{charge}</b>"
},
"maxstay": {
"mappings": {
"0": {
@ -1185,6 +1196,30 @@
"website": {
"question": "What is the website of the operator?",
"render": "More info on <a href='{website}'>{website}</a>"
},
"fee": {
"mappings": {
"0": {
"then": "Free to use"
},
"1": {
"then": "Free to use (without authenticating)"
},
"2": {
"then": "Free to use, but one has to authenticate"
},
"3": {
"then": "Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station"
},
"4": {
"then": "Paid use"
}
},
"question": "Does one have to pay to use this charging station?"
},
"charge": {
"question": "How much does one have to pay to use this charging station?",
"render": "Using this charging station costs <b>{charge}</b>"
}
},
"title": {
@ -1743,24 +1778,6 @@
}
},
"defibrillator": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
},
"mapRendering": {
"0": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
}
}
},
"name": "Defibrillators",
"presets": {
"0": {
@ -1877,6 +1894,17 @@
},
"title": {
"render": "Defibrillator"
},
"mapRendering": {
"0": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
}
}
}
},
"direction": {
@ -3200,17 +3228,6 @@
}
}
},
"mapRendering": {
"0": {
"iconSize": {
"mappings": {
"0": {
"then": "Waste Basket"
}
}
}
}
},
"name": "Waste Basket",
"presets": {
"0": {
@ -3258,6 +3275,17 @@
},
"title": {
"render": "Waste Basket"
},
"mapRendering": {
"0": {
"iconSize": {
"mappings": {
"0": {
"then": "Waste Basket"
}
}
}
}
}
},
"watermill": {

View file

@ -90,8 +90,10 @@
}
},
"bike_repair_station": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
"presets": {
"0": {
"title": "Pyöräpumppu"
}
},
"mapRendering": {
"0": {
@ -99,11 +101,6 @@
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
},
"presets": {
"0": {
"title": "Pyöräpumppu"
}
}
},
"ghost_bike": {

View file

@ -453,16 +453,6 @@
}
},
"bike_repair_station": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
},
"name": "Station velo (réparation, pompe à vélo)",
"presets": {
"0": {
@ -600,6 +590,13 @@
}
},
"render": "Point station velo avec pompe"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
}
},
"bike_shop": {
@ -756,24 +753,6 @@
}
},
"defibrillator": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
},
"mapRendering": {
"0": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
}
}
},
"name": "Défibrillateurs",
"presets": {
"0": {
@ -890,6 +869,17 @@
},
"title": {
"render": "Défibrillateur"
},
"mapRendering": {
"0": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
}
}
}
},
"direction": {

View file

@ -453,16 +453,6 @@
}
},
"bike_repair_station": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
},
"name": "Stazioni bici (riparazione, gonfiaggio o entrambi)",
"presets": {
"0": {
@ -600,6 +590,13 @@
}
},
"render": "Stazione bici (gonfiaggio & riparazione)"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
}
},
"bike_shop": {
@ -759,12 +756,12 @@
"description": "Una stazione di ricarica",
"name": "Stazioni di ricarica",
"tagRenderings": {
"Auth phone": {
"OH": {
"question": "Quali sono gli orari di apertura di questa stazione di ricarica?"
},
"Network": {
"question": "A quale rete appartiene questa stazione di ricarica?",
"render": "{network}"
},
"Authentication": {
"question": "Quali sono gli orari di apertura di questa stazione di ricarica?"
}
},
"title": {
@ -772,24 +769,6 @@
}
},
"defibrillator": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
},
"mapRendering": {
"0": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
}
}
},
"name": "Defibrillatori",
"presets": {
"0": {
@ -906,6 +885,17 @@
},
"title": {
"render": "Defibrillatore"
},
"mapRendering": {
"0": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
}
}
}
},
"direction": {

View file

@ -76,11 +76,11 @@
"description": "充電ステーション",
"name": "充電ステーション",
"tagRenderings": {
"Auth phone": {
"Network": {
"question": "この充電ステーションの運営チェーンはどこですか?",
"render": "{network}"
},
"Authentication": {
"OH": {
"question": "この充電ステーションはいつオープンしますか?"
}
},

View file

@ -1 +0,0 @@
{}

View file

@ -174,10 +174,10 @@
"description": "En ladestasjon",
"name": "Ladestasjoner",
"tagRenderings": {
"Auth phone": {
"Network": {
"render": "{network}"
},
"Authentication": {
"OH": {
"question": "Når åpnet denne ladestasjonen?"
}
},

View file

@ -896,13 +896,6 @@
"icon": {
"render": "./assets/layers/birdhide/birdhide.svg"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/birdhide/birdhide.svg"
}
}
},
"name": "Vogelkijkhutten",
"presets": {
"0": {
@ -981,6 +974,13 @@
}
},
"render": "Vogelkijkplaats"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/birdhide/birdhide.svg"
}
}
}
},
"cafe_pub": {
@ -1058,6 +1058,13 @@
}
}
},
"1": {
"options": {
"0": {
"question": "Enkel werkende oplaadpunten"
}
}
},
"2": {
"options": {
"0": {
@ -1139,15 +1146,6 @@
"question": "Hoeveel voertuigen kunnen hier opgeladen worden?",
"render": "{capacity} voertuigen kunnen hier op hetzelfde moment opgeladen worden"
},
"fee/charge": {
"mappings": {
"0": {
"then": "Gratis te gebruiken"
}
},
"question": "Hoeveel kost het gebruik van dit oplaadpunt?",
"render": "Dit oplaadpunt gebruiken kost <b>{charge}</b>"
},
"maxstay": {
"mappings": {
"0": {
@ -1168,6 +1166,157 @@
}
}
}
},
"website": {
"question": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?",
"render": "Meer informatie op <a href='{website}'>{website}</a>"
},
"ref": {
"question": "Wat is het referentienummer van dit oplaadstation?",
"render": "Het referentienummer van dit oplaadpunt is <b>{ref}</b>"
},
"phone": {
"question": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?",
"render": "Bij problemen, bel naar <a href='tel:{phone}'>{phone}</a>"
},
"fee": {
"mappings": {
"0": {
"then": "Gratis te gebruiken"
},
"1": {
"then": "Gratis te gebruiken (zonder aan te melden)"
},
"2": {
"then": "Gratis te gebruiken, maar aanmelden met een applicatie is verplicht"
},
"3": {
"then": "Betalend te gebruiken, maar gratis voor klanten van het bijhorende hotel/café/ziekenhuis/..."
},
"4": {
"then": "Betalend"
}
},
"question": "Moet men betalen om dit oplaadpunt te gebruiken?"
},
"email": {
"question": "Wat is het email-adres van de operator?",
"render": "Bij problemen, email naar <a href='mailto:{email}'>{email}</a>"
},
"charge": {
"question": "Hoeveel moet men betalen om dit oplaadpunt te gebruiken?",
"render": "Dit oplaadpunt gebruiken kost <b>{charge}</b>"
},
"access": {
"mappings": {
"0": {
"then": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
},
"1": {
"then": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
},
"2": {
"then": "Enkel <b>klanten van de bijhorende plaats</b> mogen dit oplaadpunt gebruiken<br/><span class='subtle'>Bijvoorbeeld een oplaadpunt op de parking van een restaurant dat enkel door klanten van het restaurant gebruikt mag worden</span>"
},
"3": {
"then": "Niet toegankelijk voor het publiek <span class='subtle'>Enkel toegankelijk voor de eigenaar, medewerkers ,...</span> "
}
},
"question": "Wie mag er dit oplaadpunt gebruiken?",
"render": "Toegang voor {access}"
},
"Type": {
"mappings": {
"0": {
"then": "<b>Fietsen</b> kunnen hier opgeladen worden"
},
"1": {
"then": "<b>Elektrische auto's</b> kunnen hier opgeladen worden"
},
"2": {
"then": "<b>Electrische scooters</b> (snorfiets of bromfiets) kunnen hier opgeladen worden"
},
"3": {
"then": "<b>Vrachtwagens</b> kunnen hier opgeladen worden"
},
"4": {
"then": "<b>Bussen</b> kunnen hier opgeladen worden"
}
},
"question": "Welke voertuigen kunnen hier opgeladen worden?"
},
"Parking:fee": {
"mappings": {
"0": {
"then": "Geen extra parkeerkost tijdens het opladen"
},
"1": {
"then": "Tijdens het opladen moet er parkeergeld betaald worden"
}
},
"question": "Moet men parkeergeld betalen tijdens het opladen?"
},
"Operator": {
"mappings": {
"0": {
"then": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt"
}
},
"question": "Wie beheert dit oplaadpunt?",
"render": "Wordt beheerd door {operator}"
},
"OH": {
"mappings": {
"0": {
"then": "24/7 open - ook tijdens vakanties"
}
},
"question": "Wanneer is dit oplaadpunt beschikbaar??"
},
"Network": {
"mappings": {
"0": {
"then": "Maakt geen deel uit van een groter netwerk"
},
"1": {
"then": "Maakt geen deel uit van een groter netwerk"
}
},
"question": "Is dit oplaadpunt deel van een groter netwerk?",
"render": "Maakt deel uit van het <b>{network}</b>-netwerk"
},
"Authentication": {
"mappings": {
"0": {
"then": "Aanmelden met een lidkaart is mogelijk"
},
"1": {
"then": "Aanmelden via een applicatie is mogelijk"
},
"2": {
"then": "Aanmelden door te bellen naar een telefoonnummer is mogelijk"
},
"3": {
"then": "Aanmelden via SMS is mogelijk"
},
"4": {
"then": "Aanmelden via NFC is mogelijk"
},
"5": {
"then": "Aanmelden met Money Card is mogelijk"
},
"6": {
"then": "Aanmelden met een betaalkaart is mogelijk"
},
"7": {
"then": "Hier opladen is (ook) mogelijk zonder aan te melden"
}
},
"question": "Hoe kan men zich aanmelden aan dit oplaadstation?"
},
"Auth phone": {
"question": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?",
"render": "Aanmelden door te bellen of te SMS'en naar <a href='tel:{authentication:phone_call:number}'>{authentication:phone_call:number}</a>"
}
},
"units": {
@ -1211,7 +1360,26 @@
}
}
}
}
},
"title": {
"render": "Oplaadpunten"
},
"presets": {
"0": {
"title": "gewone stekker <img src='./assets/layers/charging_station/TypeE.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (bedoeld om electrische fietsen op te laden)"
},
"1": {
"title": "oplaadpunt voor elektrische fietsen"
},
"2": {
"title": "oplaadstation voor elektrische auto's"
},
"3": {
"title": "oplaadstation"
}
},
"name": "Oplaadpunten",
"description": "Oplaadpunten"
},
"crossings": {
"description": "Oversteekplaatsen voor voetgangers en fietsers",
@ -3473,17 +3641,6 @@
}
}
},
"mapRendering": {
"0": {
"iconSize": {
"mappings": {
"0": {
"then": "Vuilnisbak"
}
}
}
}
},
"name": "Vuilnisbak",
"presets": {
"0": {
@ -3513,10 +3670,35 @@
}
},
"question": "Wat voor soort vuilnisbak is dit?"
},
"dispensing_dog_bags": {
"mappings": {
"0": {
"then": "Deze vuilnisbak heeft een verdeler voor hondenpoepzakjes"
},
"1": {
"then": "Deze vuilbak heeft <b>geen</b> verdeler voor hondenpoepzakjes"
},
"2": {
"then": "Deze vuilnisbak heeft <b>geen</b> verdeler voor hondenpoepzakjes"
}
},
"question": "Heeft deze vuilnisbak een verdeler voor hondenpoepzakjes?"
}
},
"title": {
"render": "Vuilnisbak"
},
"mapRendering": {
"0": {
"iconSize": {
"mappings": {
"0": {
"then": "Vuilnisbak"
}
}
}
}
}
},
"watermill": {

View file

@ -338,16 +338,6 @@
}
},
"bike_repair_station": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
},
"presets": {
"0": {
"description": "Um aparelho para encher os seus pneus num local fixa no espaço público<h3>Exemplos de bombas de bicicletas</h3><div style='width: 100%; display: flex; align-items: stretch;'><img src='./assets/layers/bike_repair_station/pump_example_manual.jpg' style='height: 200px; width: auto;'/><img src='./assets/layers/bike_repair_station/pump_example.png' style='height: 200px; width: auto;'/><img src='./assets/layers/bike_repair_station/pump_example_round.jpg' style='height: 200px; width: auto;'/></div>"
@ -435,6 +425,13 @@
"then": "Estação de reparo de bicicletas"
}
}
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
}
},
"bike_shop": {

View file

@ -338,16 +338,6 @@
}
},
"bike_repair_station": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
},
"name": "Estações de bicicletas (reparo, bomba ou ambos)",
"presets": {
"0": {
@ -447,6 +437,13 @@
}
},
"render": "Estação de bicicletas (bomba e reparo)"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
}
},
"bike_shop": {

View file

@ -400,16 +400,6 @@
}
},
"bike_repair_station": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
},
"presets": {
"0": {
"title": "Велосипедный насос"
@ -483,6 +473,13 @@
"then": "Велосипедный насос"
}
}
},
"mapRendering": {
"0": {
"icon": {
"render": "./assets/layers/bike_repair_station/repair_station.svg"
}
}
}
},
"bike_shop": {
@ -650,12 +647,12 @@
}
},
"tagRenderings": {
"Auth phone": {
"OH": {
"question": "В какое время работает эта зарядная станция?"
},
"Network": {
"question": "К какой сети относится эта станция?",
"render": "{network}"
},
"Authentication": {
"question": "В какое время работает эта зарядная станция?"
}
},
"title": {
@ -722,24 +719,6 @@
}
},
"defibrillator": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
},
"mapRendering": {
"0": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
}
}
},
"name": "Дефибрилляторы",
"presets": {
"0": {
@ -787,6 +766,17 @@
},
"title": {
"render": "Дефибриллятор"
},
"mapRendering": {
"0": {
"icon": {
"mappings": {
"0": {
"then": "./assets/layers/defibrillator/aed_checked.svg"
}
}
}
}
}
},
"direction": {
@ -1457,13 +1447,15 @@
}
},
"waste_basket": {
"iconSize": {
"mappings": {
"0": {
"then": "Контейнер для мусора"
}
"name": "Контейнер для мусора",
"presets": {
"0": {
"title": "Контейнер для мусора"
}
},
"title": {
"render": "Контейнер для мусора"
},
"mapRendering": {
"0": {
"iconSize": {
@ -1474,15 +1466,6 @@
}
}
}
},
"name": "Контейнер для мусора",
"presets": {
"0": {
"title": "Контейнер для мусора"
}
},
"title": {
"render": "Контейнер для мусора"
}
},
"watermill": {

View file

@ -449,11 +449,11 @@
"description": "充電站",
"name": "充電站",
"tagRenderings": {
"Auth phone": {
"Network": {
"question": "充電站所屬的網路是?",
"render": "{network}"
},
"Authentication": {
"OH": {
"question": "何時是充電站開放使用的時間?"
}
},

View file

@ -10,10 +10,12 @@
"ccb": "onder de CC-BY-licentie",
"uploadFailed": "Afbeelding uploaden mislukt. Heb je internet? Gebruik je Brave of UMatrix? Dan moet je derde partijen toelaten.",
"respectPrivacy": "Fotografeer geen mensen of nummerplaten. Voeg geen Google Maps, Google Streetview of foto's met auteursrechten toe.",
"uploadDone": "<span class='thanks'>Je afbeelding is toegevoegd. Bedankt om te helpen!</span>",
"uploadDone": "Je afbeelding is toegevoegd. Bedankt om te helpen!",
"dontDelete": "Terug",
"doDelete": "Verwijder afbeelding",
"isDeleted": "Verwijderd"
"isDeleted": "Verwijderd",
"uploadMultipleDone": "{count} afbeeldingen zijn toegevoegd. Bedankt voor je bijdrage!",
"toBig": "Je afbeelding is te groot, namelijk {actual_size}. Gelieve afbeeldingen van maximaal {max_size} te gebruiken"
},
"centerMessage": {
"loadingData": "Data wordt geladen...",
@ -24,8 +26,9 @@
"index": {
"#": "These texts are shown above the theme buttons when no theme is loaded",
"title": "Welkom bij MapComplete",
"intro": "MapComplete is een OpenStreetMap applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.",
"pickTheme": "Kies hieronder een thema om te beginnen."
"intro": "MapComplete is een OpenStreetMap-applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.",
"pickTheme": "Kies hieronder een thema om te beginnen.",
"featuredThemeTitle": "Thema van de week"
},
"general": {
"loginWithOpenStreetMap": "Aanmelden met OpenStreetMap",
@ -51,7 +54,10 @@
"layerNotEnabled": "De laag {layer} is gedeactiveerd. Activeer deze om een punt toe te voegen",
"presetInfo": "Het nieuwe punt krijgt de attributen {tags}",
"disableFiltersExplanation": "Interessepunten kunnen verborgen zijn door een filter",
"disableFilters": "Zet alle filters af"
"disableFilters": "Zet alle filters af",
"hasBeenImported": "Dit punt is reeds geimporteerd",
"warnVisibleForEveryone": "Je toevoeging is voor iedereen zichtbaar",
"zoomInMore": "Zoom meer in om dit punt te importeren"
},
"pickLanguage": "Kies je taal: ",
"about": "Bewerk en voeg data toe aan OpenStreetMap over een specifiek onderwerp op een gemakkelijke manier",
@ -128,7 +134,9 @@
"intro": "<h3>Meer thematische kaarten</h3>Vind je het leuk om geodata te verzamelen? <br/> Hier vind je meer kaartthemas.",
"requestATheme": "Wil je een eigen kaartthema, vraag dit in de issue tracker.",
"streetcomplete": "Een andere, gelijkaardige Android-applicatie is <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' class='underline hover:text-blue-800' target='_blank'>StreetComplete</a>.",
"createYourOwnTheme": "Maak je eigen MapComplete-kaart"
"createYourOwnTheme": "Maak je eigen MapComplete-kaart",
"previouslyHiddenTitle": "Eerder bezochte verborgen themas",
"hiddenExplanation": "Deze thema's zijn enkel zichtbaar indien je de link kent. Je hebt {hidden_discovered} van {total_hidden} verborgen thema's ontdekt"
},
"readYourMessages": "Gelieve eerst je berichten op OpenStreetMap te lezen alvorens nieuwe punten toe te voegen.",
"fewChangesBefore": "Gelieve eerst enkele vragen van bestaande punten te beantwoorden vooraleer zelf punten toe te voegen.",
@ -181,7 +189,10 @@
"save": "Opslaan",
"returnToTheMap": "Ga terug naar de kaart",
"pdf": {
"versionInfo": "v{version} - gemaakt op {date}"
"versionInfo": "v{version} - gemaakt op {date}",
"attr": "Kaartgegevens © OpenStreetMap-bijdragers, herbruikbaar volgens ODbL",
"generatedWith": "Gemaakt met MapComplete.osm.be",
"attrBackground": "Achtergrondlaag: {background}"
},
"osmLinkTooltip": "Bekijk dit object op OpenStreetMap om de geschiedenis te zien en meer te kunnen aanpassen",
"oneSkippedQuestion": "Een vraag werd overgeslaan",
@ -196,9 +207,27 @@
"downloadGeoJsonHelper": "Compatibel met QGIS, ArcGIS, ESRI, ...",
"downloadGeojson": "Download de zichtbare data als geojson",
"downloadAsPdfHelper": "Perfect om de huidige kaart af te printen",
"downloadAsPdf": "Download een PDF van de huidig zichtbare kaart"
"downloadAsPdf": "Download een PDF van de huidig zichtbare kaart",
"title": "Download de zichtbare data",
"exporting": "Aan het exporteren..."
},
"cancel": "Annuleren"
"cancel": "Annuleren",
"testing": "Testmode - wijzigingen worden niet opgeslaan",
"openTheMap": "Naar de kaart",
"wikipedia": {
"failed": "Het wikipedia-artikel inladen is mislukt",
"wikipediaboxTitle": "Wikipedia",
"loading": "Wikipedia aan het laden...",
"noWikipediaPage": "Dit Wikidata-item heeft nog geen overeenkomstig Wikipedia-artikel",
"createNewWikidata": "Maak een nieuw Wikidata-item",
"searchWikidata": "Zoek op Wikidata",
"noResults": "Niet gevonden voor <i>{search}</i>",
"doSearch": "Zoek hierboven om resultaten te zien"
},
"histogram": {
"error_loading": "Kan het histogram niet laden"
},
"loading": "Aan het laden..."
},
"reviews": {
"title": "{count} beoordelingen",
@ -231,7 +260,57 @@
"reasons": {
"notFound": "Het kon niet gevonden worden",
"disused": "Het wordt niet meer onderhouden of is verwijderd",
"test": "Dit punt was een test en was nooit echt aanwezig"
}
"test": "Dit punt was een test en was nooit echt aanwezig",
"duplicate": "Dit punt is een duplicaat van een ander punt"
},
"cancel": "Annuleer",
"isDeleted": "Dit object is verwijderd",
"delete": "Verwijder",
"partOfOthers": "Dit punt maakt deel uit van een lijn, oppervlakte of een relatie en kan niet verwijderd worden.",
"whyDelete": "Waarom moet dit punt van de kaart verwijderd worden?",
"loginToDelete": "Je moet aangemeld zijn om een object van de kaart te verwijderen",
"onlyEditedByLoggedInUser": "Dit punt is enkel door jezelf bewerkt, je kan dit veilig verwijderen.",
"cannotBeDeleted": "Dit object kan niet van de kaart verwijderd worden",
"safeDelete": "Dit punt kan veilig verwijderd worden van de kaart.",
"isntAPoint": "Enkel punten kunnen verwijderd worden, het geselecteerde object is een lijn, een oppervlakte of een relatie.",
"notEnoughExperience": "Dit punt is door iemand anders gemaakt.",
"useSomethingElse": "Gebruik een ander OpenStreetMap-editeerprogramma om dit object te verwijderen",
"loading": "Aan het bekijken of dit object veilig verwijderd kan worden."
},
"move": {
"cannotBeMoved": "Dit object kan niet verplaatst worden.",
"inviteToMove": {
"reasonRelocation": "Verplaats dit punt naar een andere locatie omdat het verhuisd is",
"reasonInaccurate": "Verbeter de precieze locatie van dit punt",
"generic": "Verplaats dit punt"
},
"pointIsMoved": "Dit punt is verplaatst",
"confirmMove": "Verplaats",
"reasons": {
"reasonRelocation": "Dit object is verhuisd naar een andere locatie",
"reasonInaccurate": "De locatie van dit object is niet accuraat en moet een paar meter verschoven worden"
},
"partOfAWay": "Dit punt is deel van een lijn of een oppervlakte. Gebruik een ander OpenStreetMap-bewerkprogramma om het te verplaatsen",
"partOfRelation": "Dit punt maakt deel uit van een relatie. Gebruik een ander OpenStreetMap-bewerkprogramma om het te verplaatsen",
"cancel": "Annuleer verplaatsing",
"loginToMove": "Je moet aangemeld zijn om een punt te verplaatsen",
"zoomInFurther": "Zoom verder in om de verplaatsing te bevestigen",
"isRelation": "Dit object is een relatie en kan niet verplaatst worden",
"inviteToMoveAgain": "Verplaats dit punt opnieuw",
"moveTitle": "Verplaats dit punt",
"whyMove": "Waarom verplaats je dit punt?",
"selectReason": "Waarom verplaats je dit object?",
"isWay": "Dit object is een lijn of een oppervlakte. Gebruik een ander OpenStreetMap-bewerkprogramma op het te verplaatsen."
},
"split": {
"cancel": "Annuleer knippen",
"split": "Knip weg",
"splitTitle": "Duid op de kaart aan waar de weg geknipt moet worden",
"inviteToSplit": "Knip deze weg in kleinere segmenten (om andere eigenschappen per segment toe te kennen)",
"loginToSplit": "Je moet aangemeld zijn om een weg te knippen",
"hasBeenSplit": "Deze weg is verknipt"
},
"multi_apply": {
"autoApply": "Wijzigingen aan eigenschappen {attr_names} zullen ook worden uitgevoerd op {count} andere objecten."
}
}

View file

@ -9,7 +9,7 @@
"isDeleted": "Eliminada",
"doDelete": "Remover imagem",
"dontDelete": "Cancelar",
"uploadDone": "<span class=\"thanks\">A sua imagem foi adicionada. Obrigado pela ajuda!</span>",
"uploadDone": "A sua imagem foi adicionada. Obrigado pela ajuda!",
"respectPrivacy": "Não fotografe pessoas nem placas de veículos. Não envie imagens do Google Maps, do Google Streetview ou outras fontes protegidas por direitos de autor.",
"uploadFailed": "Não foi possível enviar a sua imagem. Está conectado à Internet e permite APIs de terceiros? O navegador \"Brave\" ou o plugin \"uMatrix\" podem estar a bloqueá-los.",
"ccb": "sob a licença CC-BY",

View file

@ -78,6 +78,22 @@
}
},
"question": "Ist dieser Ort mit einem Rollstuhl zugänglich?"
},
"wikipedia": {
"mappings": {
"0": {
"then": "Es wurde noch keine Wikipedia-Seite verlinkt"
}
},
"question": "Was ist das entsprechende Wikidata Element?"
},
"wikipedialink": {
"mappings": {
"0": {
"then": "Nicht mit Wikipedia verknüpft"
}
},
"question": "Was ist der entsprechende Artikel auf Wikipedia?"
}
}
}

View file

@ -78,6 +78,22 @@
}
},
"question": "Este lugar é acessível a utilizadores de cadeiras de rodas?"
},
"wikipedia": {
"mappings": {
"0": {
"then": "Ainda não foi vinculada nenhuma página da Wikipédia"
}
},
"question": "Qual é a entidade Wikidata correspondente?"
},
"wikipedialink": {
"mappings": {
"0": {
"then": "Não vinculado à Wikipédia"
}
},
"question": "Qual é o item correspondente na Wikipédia?"
}
}
}

View file

@ -334,6 +334,18 @@
},
"question": "Wie heißt diese Kletterroute?",
"render": "<strong>{name}</strong>"
},
"Bolts": {
"mappings": {
"0": {
"then": "Auf dieser Kletterroute sind keine Haken vorhanden"
},
"1": {
"then": "Auf dieser Kletterroute sind keine Haken vorhanden"
}
},
"question": "Wie viele Haken gibt es auf dieser Kletterroute bevor der Umlenker bzw. Standhaken erreicht ist?",
"render": "Diese Kletterroute hat {climbing:bolts} Haken"
}
},
"title": {
@ -625,17 +637,29 @@
"title": "Fahrradstraßen"
},
"cyclofix": {
"description": "Das Ziel dieser Karte ist es, den Radfahrern eine einfach zu benutzende Lösung zu präsentieren, um die geeignete Infrastruktur für ihre Bedürfnisse zu finden.<br><br>Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.<br><br>Alle Änderungen, die Sie vornehmen, werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei wiederverwendet werden.<br><br>Weitere Informationen über das Projekt Cyclofix finden Sie unter <a href='https://cyclofix.osm.be/'>cyclofix.osm.be</a>.",
"title": "Cyclofix - eine offene Karte für Radfahrer"
"description": "Mit dieser Karte soll Radfahrern eine einfache Lösung bereitgestellt werden, um die passende Farradinfrastruktur zu finden.<br><br>Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.<br><br>Ihre Änderungen, werden automatisch in der Datenbank von OpenStreetMap gespeichert und können von anderen frei verwendet werden.<br><br>Weitere Informationen über Cyclofix finden Sie unter <a href='https://cyclofix.osm.be/'>cyclofix.osm.be</a>.",
"title": "Cyclofix - eine freie Karte für Radfahrer"
},
"drinking_water": {
"description": "Auf dieser Karte sind öffentlich zugängliche Trinkwasserstellen eingezeichnet und können leicht hinzugefügt werden",
"title": "Trinkwasser"
"description": "Eine Karte zum Anzeigen und Bearbeiten öffentlicher Trinkwasserstellen",
"title": "Trinkwasserstelle"
},
"etymology": {
"description": "Auf dieser Karte können Sie sehen, nach was ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. Die Informationen stammen aus Wikipedia.",
"description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.<br/><br/><b>Sie können auch einen Beitrag leisten!</b>Zoomen Sie genug hinein und <i>alle</i> Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.",
"shortDescription": "Was ist der Ursprung eines Ortsnamens?",
"title": "Open Etymology Map"
"title": "Open Etymology Map",
"layers": {
"1": {
"override": {
"name": "Straßen ohne Informationen zur Namensherkunft"
}
},
"2": {
"override": {
"name": "Parks und Waldflächen ohne Informationen zur Namensherkunft"
}
}
}
},
"facadegardens": {
"layers": {
@ -736,8 +760,8 @@
}
},
"ghostbikes": {
"description": "Ein <b>Geisterrad</b> ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.<br/><br/> Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap kennt. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
"title": "Geisterrad"
"description": "Ein <b>Geisterrad</b> ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.<br/><br/> Auf dieser Karte kann man alle Geisterräder sehen, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
"title": "Geisterräder"
},
"hackerspaces": {
"description": "Auf dieser Karte können Sie Hackerspaces sehen, einen neuen Hackerspace hinzufügen oder Daten direkt aktualisieren",
@ -827,89 +851,6 @@
"shortDescription": "Eine Karte von Hackerspaces",
"title": "Hackerspaces"
},
"personal": {
"description": "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen",
"title": "Persönliches Thema"
},
"toilets": {
"description": "Eine Karte der öffentlichen Toiletten",
"title": "Offene Toilette Karte"
},
"waste_basket": {
"title": "Abfalleimer",
"shortDescription": "Eine Karte mit Abfalleimern",
"description": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen"
},
"uk_addresses": {
"description": "Tragen Sie zu OpenStreetMap bei, indem Sie Adressinformationen ausfüllen",
"layers": {
"1": {
"description": "Adressen",
"name": "Bekannte Adressen in OSM",
"tagRenderings": {
"uk_addresses_explanation_osm": {
"render": "Diese Adresse ist in OpenStreetMap gespeichert"
},
"uk_addresses_housenumber": {
"mappings": {
"0": {
"then": "Dieses Gebäude hat keine Hausnummer"
}
},
"question": "Wie lautet die Nummer dieses Hauses?",
"render": "Die Hausnummer ist <b>{addr:housenumber}</b>"
},
"uk_addresses_street": {
"question": "In welcher Straße befindet sich diese Adresse?",
"render": "Diese Adresse befindet sich in der Straße <b>{addr:street}</b>"
}
},
"title": {
"render": "Bekannte Adresse"
}
}
},
"shortDescription": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen",
"title": "Adressen in Großbritannien"
},
"trees": {
"description": "Kartieren Sie alle Bäume!",
"shortDescription": "Kartieren Sie alle Bäume",
"title": "Bäume"
},
"surveillance": {
"description": "Auf dieser offenen Karte finden Sie Überwachungskameras.",
"shortDescription": "Überwachungskameras und andere Mittel zur Überwachung",
"title": "Überwachung unter Überwachung"
},
"sport_pitches": {
"description": "Ein Sportplatz ist eine Fläche, auf der Sportarten gespielt werden",
"shortDescription": "Eine Karte mit Sportplätzen",
"title": "Sportplätze"
},
"shops": {
"shortDescription": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen",
"title": "Freie Geschäftskarte"
},
"postboxes": {
"layers": {
"1": {
"description": "Eine Ebene mit Postämtern.",
"tagRenderings": {
"OH": {
"mappings": {
"0": {
"then": "durchgehend geöffnet (auch an Feiertagen)"
}
}
}
}
}
}
},
"openwindpowermap": {
"description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen."
},
"hailhydrant": {
"description": "Auf dieser Karte können Sie Hydranten, Feuerwachen, Krankenwagen und Feuerlöscher in Ihren bevorzugten Stadtvierteln finden und aktualisieren. \n\nSie können Ihren genauen Standort verfolgen (nur mobil) und in der unteren linken Ecke die für Sie relevanten Ebenen auswählen. Sie können mit diesem Tool auch Pins (Points of Interest) zur Karte hinzufügen oder bearbeiten und durch die Beantwortung verfügbarer Fragen zusätzliche Angaben machen. \n\nAlle von Ihnen vorgenommenen Änderungen werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei weiterverwendet werden.",
"layers": {
@ -1019,6 +960,9 @@
"station-name": {
"question": "Wie lautet der Name dieser Feuerwache?"
}
},
"title": {
"render": "Feuerwache"
}
},
"3": {
@ -1029,5 +973,185 @@
}
}
}
},
"openwindpowermap": {
"description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen.",
"title": "OpenWindPowerMap",
"layers": {
"0": {
"name": "Windrad",
"presets": {
"0": {
"title": "Windrad"
}
},
"title": {
"render": "Windrad"
},
"units": {
"0": {
"applicableUnits": {
"0": {
"human": " Megawatt"
},
"1": {
"human": " Kilowatt"
},
"2": {
"human": " Watt"
},
"3": {
"human": " Gigawatt"
}
}
},
"1": {
"applicableUnits": {
"0": {
"human": " Meter"
}
}
}
}
}
}
},
"personal": {
"description": "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen",
"title": "Persönliches Thema"
},
"postboxes": {
"layers": {
"0": {
"description": "Die Ebene zeigt Briefkästen.",
"name": "Brieflästen",
"presets": {
"0": {
"title": "Briefkasten"
}
},
"title": {
"render": "Briefkasten"
}
},
"1": {
"description": "Eine Ebene mit Postämtern.",
"tagRenderings": {
"OH": {
"mappings": {
"0": {
"then": "durchgehend geöffnet (auch an Feiertagen)"
}
}
}
},
"title": {
"render": "Poststelle"
},
"presets": {
"0": {
"title": "Poststelle"
}
},
"name": "Poststellen",
"filter": {
"0": {
"options": {
"0": {
"question": "Aktuell geöffnet"
}
}
}
}
}
},
"title": "Karte mit Briefkästen und Poststellen",
"shortDescription": "Eine Karte die Briefkästen und Poststellen anzeigt"
},
"shops": {
"shortDescription": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen",
"title": "Freie Geschäftskarte"
},
"sport_pitches": {
"description": "Ein Sportplatz ist eine Fläche, auf der Sportarten gespielt werden",
"shortDescription": "Eine Karte mit Sportplätzen",
"title": "Sportplätze"
},
"surveillance": {
"description": "Auf dieser offenen Karte finden Sie Überwachungskameras.",
"shortDescription": "Überwachungskameras und andere Mittel zur Überwachung",
"title": "Überwachung unter Überwachung"
},
"toilets": {
"description": "Eine Karte mit öffentlich zugänglichen Toiletten",
"title": "Freie Toilettenkarte"
},
"trees": {
"description": "Kartieren Sie alle Bäume!",
"shortDescription": "Kartieren Sie alle Bäume",
"title": "Bäume"
},
"uk_addresses": {
"description": "Tragen Sie zu OpenStreetMap bei, indem Sie Adressinformationen ausfüllen",
"layers": {
"1": {
"description": "Adressen",
"name": "Bekannte Adressen in OSM",
"tagRenderings": {
"uk_addresses_explanation_osm": {
"render": "Diese Adresse ist in OpenStreetMap gespeichert"
},
"uk_addresses_housenumber": {
"mappings": {
"0": {
"then": "Dieses Gebäude hat keine Hausnummer"
}
},
"question": "Wie lautet die Nummer dieses Hauses?",
"render": "Die Hausnummer ist <b>{addr:housenumber}</b>"
},
"uk_addresses_street": {
"question": "In welcher Straße befindet sich diese Adresse?",
"render": "Diese Adresse befindet sich in der Straße <b>{addr:street}</b>"
}
},
"title": {
"render": "Bekannte Adresse"
}
}
},
"shortDescription": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen",
"title": "Adressen in Großbritannien",
"tileLayerSources": {
"0": {
"name": "Grenzverläufe gemäß osmuk.org"
}
}
},
"waste_basket": {
"description": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen",
"shortDescription": "Eine Karte mit Abfalleimern",
"title": "Abfalleimer"
},
"playgrounds": {
"shortDescription": "Eine Karte mit Spielplätzen",
"title": "Spielpläzte"
},
"parkings": {
"description": "Diese Karte zeigt Parkplätze",
"shortDescription": "Diese Karte zeigt Parkplätze",
"title": "Parken"
},
"observation_towers": {
"description": "Öffentlich zugänglicher Aussichtsturm",
"shortDescription": "Öffentlich zugänglicher Aussichtsturm",
"title": "Aussichtstürme"
},
"natuurpunt": {
"shortDescription": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt",
"title": "Naturschutzgebiete"
},
"maps": {
"title": "Eine Karte der Karten"
}
}

View file

@ -145,7 +145,7 @@ class LayerOverviewUtils {
}
}
const referencedLayers = Utils.NoNull(themeFile.layers.map(layer => {
const referencedLayers = Utils.NoNull([].concat(...themeFile.layers.map(layer => {
if(typeof layer === "string"){
return layer
}
@ -153,7 +153,12 @@ class LayerOverviewUtils {
return layer["builtin"]
}
return undefined
}))
}).map(layerName => {
if(typeof layerName === "string"){
return [layerName]
}
return layerName
})))
themeFile.layers = themeFile.layers
.filter(l => typeof l != "string") // We remove all the builtin layer references as they don't work with ts-node for some weird reason
@ -172,7 +177,8 @@ class LayerOverviewUtils {
const neededLanguages = themeFile["mustHaveLanguage"]
if (neededLanguages !== undefined) {
console.log("Checking language requerements for ", theme.id, "as it must have", neededLanguages.join(", "))
const allTranslations = [].concat(Translation.ExtractAllTranslationsFrom(theme, theme.id), ...referencedLayers.map(layerId => Translation.ExtractAllTranslationsFrom(knownLayerIds.get(layerId), theme.id+"->"+layerId)))
const allTranslations = [].concat(Translation.ExtractAllTranslationsFrom(theme, theme.id),
...referencedLayers.map(layerId => Translation.ExtractAllTranslationsFrom(knownLayerIds.get(layerId), theme.id+"->"+layerId)))
for (const neededLanguage of neededLanguages) {
allTranslations
.filter(t => t.tr.translations[neededLanguage] === undefined && t.tr.translations["*"] === undefined)

View file

@ -33,7 +33,7 @@ class TranslationPart {
}
const v = translations[translationsKey]
if (typeof (v) != "string") {
console.error("Non-string object in translation while trying to add more translations to '", translationsKey ,"': ", v)
console.error("Non-string object in translation while trying to add more translations to '", translationsKey, "': ", v)
throw "Error in an object depicting a translation: a non-string object was found. (" + context + ")\n You probably put some other section accidentally in the translation"
}
this.contents.set(translationsKey, v)
@ -166,7 +166,13 @@ function transformTranslation(obj: any, depth = 1) {
if (key.match("^[a-zA-Z0-9_]*$") === null) {
throw "Invalid character in key: " + key
}
values += (Utils.Times((_) => " ", depth)) + key + ": " + transformTranslation(obj[key], depth + 1) + ",\n"
const value = obj[key]
if (isTranslation(value)) {
values += (Utils.Times((_) => " ", depth)) + "get " + key + "() { return new Translation(" + JSON.stringify(value) + ") }" + ",\n"
} else {
values += (Utils.Times((_) => " ", depth)) + key + ": " + transformTranslation(value, depth + 1) + ",\n"
}
}
return `{${values}}`;
@ -300,9 +306,9 @@ function MergeTranslation(source: any, target: any, language: string, context: s
}
if (typeof sourceV === "object") {
if (targetV === undefined) {
try{
target[language] = sourceV;
}catch(e){
try {
target[language] = sourceV;
} catch (e) {
throw `At context${context}: Could not add a translation in language ${language} due to ${e}`
}
} else {