diff --git a/langs/layers/ca.json b/langs/layers/ca.json new file mode 100644 index 0000000000..98f450d27c --- /dev/null +++ b/langs/layers/ca.json @@ -0,0 +1,57 @@ +{ + "defibrillator": { + "name": "Desfibril·ladors", + "title": { + "render": "Desfibril·lador" + }, + "presets": { + "0": { + "title": "Desfibril·lador" + } + }, + "tagRenderings": { + "1": { + "question": "Està el desfibril·lador a l'interior?", + "mappings": { + "0": { + "then": "Aquest desfibril·lador està a l'interior" + }, + "1": { + "then": "Aquest desfibril·lador està a l'exterior" + } + } + }, + "2": { + "question": "Està el desfibril·lador accessible lliurement?", + "render": "L'accés és {access}", + "mappings": { + "0": { + "then": "Accés lliure" + }, + "1": { + "then": "Publicament accessible" + }, + "2": { + "then": "Només accessible a clients" + }, + "3": { + "then": "No accessible al públic en general (ex. només accesible a treballadors, propietaris, ...)" + } + } + }, + "4": { + "question": "A quina planta està el desfibril·lador localitzat?", + "render": "Aquest desfibril·lador és a la planta {level}" + }, + "5": { + "question": "Dóna detalls d'on es pot trobar el desfibril·lador" + }, + "6": { + "question": "Dóna detalls d'on es pot trobar el desfibril·lador" + }, + "7": { + "question": "Dóna detalls d'on es pot trobar el desfibril·lador" + } + } + } +} \ No newline at end of file diff --git a/langs/layers/de.json b/langs/layers/de.json new file mode 100644 index 0000000000..c4e267f777 --- /dev/null +++ b/langs/layers/de.json @@ -0,0 +1,824 @@ +{ + "bench": { + "name": "Sitzbänke", + "title": { + "render": "Sitzbank" + }, + "tagRenderings": { + "1": { + "render": "Rückenlehne", + "mappings": { + "0": { + "then": "Rückenlehne: Ja" + }, + "1": { + "then": "Rückenlehne: Nein" + } + }, + "question": "Hat diese Bank eine Rückenlehne?" + }, + "2": { + "render": "{seats} Sitzplätze", + "question": "Wie viele Sitzplätze hat diese Bank?" + }, + "3": { + "render": "Material: {material}", + "mappings": { + "0": { + "then": "Material: Holz" + }, + "1": { + "then": "Material: Metall" + }, + "2": { + "then": "Material: Stein" + }, + "3": { + "then": "Material: Beton" + }, + "4": { + "then": "Material: Kunststoff" + }, + "5": { + "then": "Material: Stahl" + } + }, + "question": "Aus welchem Material besteht die Sitzbank (Sitzfläche)?" + }, + "4": { + "question": "In welche Richtung schaut man, wenn man auf der Bank sitzt?", + "render": "Wenn man auf der Bank sitzt, schaut man in Richtung {direction}°." + }, + "5": { + "render": "Farbe: {colour}", + "question": "Welche Farbe hat diese Sitzbank?", + "mappings": { + "0": { + "then": "Farbe: braun" + }, + "1": { + "then": "Farbe: grün" + }, + "2": { + "then": "Farbe: grau" + }, + "3": { + "then": "Farbe: weiß" + }, + "4": { + "then": "Farbe: rot" + }, + "5": { + "then": "Farbe: schwarz" + }, + "6": { + "then": "Farbe: blau" + }, + "7": { + "then": "Farbe: gelb" + } + } + } + }, + "presets": { + "0": { + "title": "Sitzbank", + "description": "Neue Sitzbank eintragen" + } + } + }, + "bench_at_pt": { + "name": "Sitzbänke bei Haltestellen", + "title": { + "render": "Sitzbank", + "mappings": { + "0": { + "then": "Sitzbank bei Haltestelle" + }, + "1": { + "then": "Sitzbank in Unterstand" + } + } + }, + "tagRenderings": { + "1": { + "render": "{name}" + }, + "2": { + "render": "Stehbank" + } + } + }, + "bike_cafe": { + "name": "Fahrrad-Café", + "title": { + "render": "Fahrrad-Café", + "mappings": { + "0": { + "then": "Fahrrad-Café {name}" + } + } + }, + "tagRenderings": { + "1": { + "question": "Wie heißt dieses Fahrrad-Café?", + "render": "Dieses Fahrrad-Café heißt {name}" + }, + "2": { + "question": "Bietet dieses Fahrrad-Café eine Fahrradpumpe an, die von jedem benutzt werden kann?", + "mappings": { + "0": { + "then": "Dieses Fahrrad-Café bietet eine Fahrradpumpe an, die von jedem benutzt werden kann" + }, + "1": { + "then": "Dieses Fahrrad-Café bietet keine Fahrradpumpe an, die von jedem benutzt werden kann" + } + } + }, + "3": { + "question": "Gibt es hier Werkzeuge, um das eigene Fahrrad zu reparieren?", + "mappings": { + "0": { + "then": "Dieses Fahrrad-Café bietet Werkzeuge für die selbständige Reparatur an." + }, + "1": { + "then": "Dieses Fahrrad-Café bietet keine Werkzeuge für die selbständige Reparatur an." + } + } + }, + "4": { + "question": "Repariert dieses Fahrrad-Café Fahrräder?", + "mappings": { + "0": { + "then": "Dieses Fahrrad-Café repariert Fahrräder" + }, + "1": { + "then": "Dieses Fahrrad-Café repariert keine Fahrräder" + } + } + }, + "5": { + "question": "Was ist die Webseite von {name}?" + }, + "6": { + "question": "Wie lautet die Telefonnummer von {name}?" + }, + "7": { + "question": "Wie lautet die E-Mail-Adresse von {name}?" + } + }, + "presets": { + "0": { + "title": "Fahrrad-Café" + } + } + }, + "bike_parking": { + "name": "Fahrrad-Parkplätze", + "presets": { + "0": { + "title": "Fahrrad-Parkplätze" + } + }, + "title": { + "render": "Fahrrad-Parkplätze" + }, + "tagRenderings": { + "1": { + "question": "Was ist die Art dieses Fahrrad-Parkplatzes?", + "render": "Dies ist ein Fahrrad-Parkplatz der Art: {bicycle_parking}", + "mappings": { + "0": { + "then": "Fahrradbügel " + }, + "1": { + "then": "Metallgestänge " + }, + "2": { + "then": "Halter für Fahrradlenker " + }, + "3": { + "then": "Gestell " + }, + "4": { + "then": "Zweistufig " + }, + "5": { + "then": "Schuppen " + } + } + }, + "3": { + "question": "Ist dieser Parkplatz überdacht? Wählen Sie auch \"überdacht\" für Innenparkplätze.", + "mappings": { + "0": { + "then": "Dieser Parkplatz ist überdacht (er hat ein Dach)" + }, + "1": { + "then": "Dieser Parkplatz ist nicht überdacht." + } + } + }, + "4": { + "question": "Wie viele Fahrräder passen auf diesen Fahrrad-Parkplatz (einschließlich möglicher Lastenfahrräder)?", + "render": "Platz für {capacity} Fahrräder" + }, + "6": { + "question": "Gibt es auf diesem Fahrrad-Parkplatz Plätze für Lastenfahrräder?", + "mappings": { + "0": { + "then": "Dieser Parkplatz bietet Platz für Lastenfahrräder" + }, + "1": { + "then": "Dieser Parkplatz verfügt über ausgewiesene (offizielle) Plätze für Lastenfahrräder." + }, + "2": { + "then": "Es ist nicht erlaubt, Lastenfahrräder zu parken" + } + } + }, + "7": { + "question": "Wie viele Lastenfahrräder passen auf diesen Fahrrad-Parkplatz?", + "render": "Auf diesen Parkplatz passen {capacity:cargo_bike} Lastenfahrräder" + } + } + }, + "bike_repair_station": { + "name": "Fahrradstationen (Reparatur, Pumpe oder beides)", + "title": { + "render": "Fahrradstation (Pumpe & Reparatur)", + "mappings": { + "0": { + "then": "Fahrrad-Reparaturstation" + }, + "1": { + "then": "Fahrrad-Reparaturstation" + }, + "2": { + "then": "Kaputte Pumpe" + }, + "3": { + "then": "Fahrradpumpe {name}" + }, + "4": { + "then": "Fahrradpumpe" + } + } + }, + "tagRenderings": { + "1": { + "question": "Welche Einrichtungen stehen an dieser Fahrradstation zur Verfügung?", + "mappings": { + "0": { + "then": "Es ist nur eine Pumpe vorhanden" + }, + "1": { + "then": "Es sind nur Werkzeuge (Schraubenzieher, Zangen...) vorhanden" + }, + "2": { + "then": "Es sind sowohl Werkzeuge als auch eine Pumpe vorhanden" + } + } + }, + "4": { + "question": "Verfügt diese Fahrrad-Reparaturstation über Spezialwerkzeug zur Reparatur von Fahrradketten?", + "mappings": { + "0": { + "then": "Es gibt ein Kettenwerkzeug" + }, + "1": { + "then": "Es gibt kein Kettenwerkzeug" + } + } + }, + "5": { + "question": "Hat diese Fahrradstation einen Haken, an dem Sie Ihr Fahrrad aufhängen können, oder einen Ständer, um es anzuheben?", + "mappings": { + "0": { + "then": "Es gibt einen Haken oder Ständer" + }, + "1": { + "then": "Es gibt keinen Haken oder Ständer" + } + } + }, + "6": { + "question": "Ist die Fahrradpumpe noch funktionstüchtig?", + "mappings": { + "0": { + "then": "Die Fahrradpumpe ist kaputt" + }, + "1": { + "then": "Die Fahrradpumpe ist betriebsbereit" + } + } + }, + "7": { + "question": "Welche Ventile werden unterstützt?", + "render": "Diese Pumpe unterstützt die folgenden Ventile: {valves}", + "mappings": { + "0": { + "then": "Sklaverand (auch bekannt als Presta)" + }, + "1": { + "then": "Dunlop" + }, + "2": { + "then": "Schrader (Autos)" + } + } + }, + "8": { + "question": "Ist dies eine elektrische Fahrradpumpe?", + "mappings": { + "0": { + "then": "Manuelle Pumpe" + }, + "1": { + "then": "Elektrische Pumpe" + } + } + }, + "9": { + "question": "Verfügt die Pumpe über einen Druckanzeiger oder ein Manometer?", + "mappings": { + "0": { + "then": "Es gibt ein Manometer" + }, + "1": { + "then": "Es gibt kein Manometer" + }, + "2": { + "then": "Es gibt ein Manometer, aber es ist kaputt" + } + } + } + }, + "presets": { + "0": { + "title": "Fahrradpumpe" + }, + "1": { + "title": "Fahrrad-Reparaturstation und Pumpe" + }, + "2": { + "title": "Fahrrad-Reparaturstation ohne Pumpe" + } + } + }, + "bike_shop": { + "name": "Fahrradwerkstatt/geschäft", + "title": { + "render": "Fahrradwerkstatt/geschäft", + "mappings": { + "3": { + "then": "Fahrradwerkstatt {name}" + }, + "4": { + "then": "Fahrradgeschäft {name}" + }, + "5": { + "then": "Fahrradwerkstatt/geschäft {name}" + } + } + }, + "tagRenderings": { + "2": { + "question": "Wie heißt dieser Fahrradladen?", + "render": "Dieses Fahrradgeschäft heißt {name}" + }, + "9": { + "question": "Verkauft dieser Laden Fahrräder?", + "mappings": { + "0": { + "then": "Dieses Geschäft verkauft Fahrräder" + }, + "1": { + "then": "Dieses Geschäft verkauft keine Fahrräder" + } + } + }, + "10": { + "question": "Repariert dieses Geschäft Fahrräder?", + "mappings": { + "0": { + "then": "Dieses Geschäft repariert Fahrräder" + }, + "1": { + "then": "Dieses Geschäft repariert keine Fahrräder" + }, + "2": { + "then": "Dieses Geschäft repariert nur hier gekaufte Fahrräder" + }, + "3": { + "then": "Dieses Geschäft repariert nur Fahrräder einer bestimmten Marke" + } + } + }, + "11": { + "question": "Vermietet dieser Laden Fahrräder?", + "mappings": { + "0": { + "then": "Dieses Geschäft vermietet Fahrräder" + }, + "1": { + "then": "Dieses Geschäft vermietet keine Fahrräder" + } + } + }, + "12": { + "question": "Verkauft dieses Geschäft gebrauchte Fahrräder?", + "mappings": { + "0": { + "then": "Dieses Geschäft verkauft gebrauchte Fahrräder" + }, + "1": { + "then": "Dieses Geschäft verkauft keine gebrauchten Fahrräder" + }, + "2": { + "then": "Dieses Geschäft verkauft nur gebrauchte Fahrräder" + } + } + }, + "13": { + "question": "Bietet dieses Geschäft eine Fahrradpumpe zur Benutzung für alle an?", + "mappings": { + "0": { + "then": "Dieses Geschäft bietet eine Fahrradpumpe für alle an" + }, + "1": { + "then": "Dieses Geschäft bietet für niemanden eine Fahrradpumpe an" + } + } + }, + "14": { + "question": "Gibt es hier Werkzeuge, um das eigene Fahrrad zu reparieren?", + "mappings": { + "0": { + "then": "Dieses Geschäft bietet Werkzeuge für die Heimwerkerreparatur an" + }, + "1": { + "then": "Dieses Geschäft bietet keine Werkzeuge für Heimwerkerreparaturen an" + } + } + } + }, + "presets": { + "0": { + "title": "Fahrradwerkstatt/geschäft" + } + } + }, + "bike_themed_object": { + "name": "Mit Fahrrad zusammenhängendes Objekt", + "title": { + "render": "Mit Fahrrad zusammenhängendes Objekt" + } + }, + "defibrillator": { + "name": "Defibrillatoren", + "title": { + "render": "Defibrillator" + }, + "presets": { + "0": { + "title": "Defibrillator" + } + }, + "tagRenderings": { + "1": { + "question": "Befindet sich dieser Defibrillator im Gebäude?", + "mappings": { + "0": { + "then": "Dieser Defibrillator befindet sich im Gebäude" + }, + "1": { + "then": "Dieser Defibrillator befindet sich im Freien" + } + } + }, + "2": { + "question": "Ist dieser Defibrillator frei zugänglich?", + "render": "Zugang ist {access}", + "mappings": { + "0": { + "then": "Öffentlich zugänglich" + }, + "1": { + "then": "Öffentlich zugänglich" + }, + "2": { + "then": "Nur für Kunden zugänglich" + }, + "3": { + "then": "Nicht für die Öffentlichkeit zugänglich (z.B. nur für das Personal, die Eigentümer, ...)" + } + } + }, + "4": { + "question": "In welchem Stockwerk befindet sich dieser Defibrillator?", + "render": "Dieser Defibrallator befindet sich im {level}. Stockwerk" + }, + "5": { + "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (in der lokalen Sprache)" + }, + "6": { + "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Englisch)" + }, + "7": { + "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Französisch)" + } + } + }, + "drinking_water": { + "name": "Trinkwasser", + "title": { + "render": "Trinkwasser" + }, + "presets": { + "0": { + "title": "Trinkwasser" + } + }, + "tagRenderings": { + "2": { + "question": "Wie einfach ist es, Wasserflaschen zu füllen?", + "mappings": { + "0": { + "then": "Es ist einfach, Wasserflaschen nachzufüllen" + }, + "1": { + "then": "Wasserflaschen passen möglicherweise nicht" + } + } + } + } + }, + "ghost_bike": { + "name": "Geisterrad", + "title": { + "render": "Geisterrad", + "mappings": { + "0": { + "then": "Geisterrad im Gedenken an {name}" + } + } + }, + "presets": { + "0": { + "title": "Geisterrad" + } + }, + "tagRenderings": { + "0": { + "render": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt wird." + }, + "2": { + "question": "An wen erinnert dieses Geisterrad?
Bitte respektieren Sie die Privatsphäre - geben Sie den Namen nur an, wenn er weit verbreitet oder auf dem Fahrrad markiert ist. Den Familiennamen können Sie weglassen.
", + "render": "Im Gedenken an {name}", + "mappings": { + "0": { + "then": "Auf dem Fahrrad ist kein Name angegeben" + } + } + }, + "3": { + "question": "Auf welcher Webseite kann man mehr Informationen über das Geisterrad oder den Unfall finden?", + "render": "Mehr Informationen" + }, + "4": { + "question": "Wie lautet die Inschrift auf diesem Geisterrad?", + "render": "{inscription}" + } + } + }, + "public_bookcase": { + "name": "Bücherschränke", + "description": "Ein Bücherschrank am Straßenrand mit Büchern, für jedermann zugänglich", + "title": { + "render": "Bücherschrank", + "mappings": { + "0": { + "then": "Öffentlicher Bücherschrank {name}" + } + } + }, + "presets": { + "0": { + "title": "Bücherschrank" + } + }, + "tagRenderings": { + "1": { + "render": "Der Name dieses Bücherschrank lautet {name}", + "question": "Wie heißt dieser öffentliche Bücherschrank?", + "mappings": { + "0": { + "then": "Dieser Bücherschrank hat keinen Namen" + } + } + }, + "2": { + "render": "{capacity} Bücher passen in diesen Bücherschrank", + "question": "Wie viele Bücher passen in diesen öffentlichen Bücherschrank?" + }, + "3": { + "question": "Welche Art von Büchern sind in diesem öffentlichen Bücherschrank zu finden?", + "mappings": { + "0": { + "then": "Vorwiegend Kinderbücher" + }, + "1": { + "then": "Vorwiegend Bücher für Erwachsene" + }, + "2": { + "then": "Sowohl Bücher für Kinder als auch für Erwachsene" + } + } + }, + "4": { + "question": "Befindet sich dieser Bücherschrank im Freien?", + "mappings": { + "0": { + "then": "Dieser Bücherschrank befindet sich im Innenbereich" + }, + "1": { + "then": "Dieser Bücherschrank befindet sich im Freien" + }, + "2": { + "then": "Dieser Bücherschrank befindet sich im Freien" + } + } + }, + "5": { + "question": "Ist dieser öffentliche Bücherschrank frei zugänglich?", + "mappings": { + "0": { + "then": "Öffentlich zugänglich" + }, + "1": { + "then": "Nur für Kunden zugänglich" + } + } + }, + "6": { + "question": "Wer unterhält diesen öffentlichen Bücherschrank?", + "render": "Betrieben von {operator}" + }, + "7": { + "question": "Ist dieser öffentliche Bücherschrank Teil eines größeren Netzwerks?", + "render": "Dieser Bücherschrank ist Teil von {brand}", + "mappings": { + "0": { + "then": "Teil des Netzwerks 'Little Free Library'" + }, + "1": { + "then": "Dieser öffentliche Bücherschrank ist nicht Teil eines größeren Netzwerks" + } + } + }, + "8": { + "render": "Die Referenznummer dieses öffentlichen Bücherschranks innerhalb {brand} lautet {ref}", + "question": "Wie lautet die Referenznummer dieses öffentlichen Bücherschranks?", + "mappings": { + "0": { + "then": "Dieser Bücherschrank ist nicht Teil eines größeren Netzwerks" + } + } + }, + "9": { + "question": "Wann wurde dieser öffentliche Bücherschrank installiert?", + "render": "Installiert am {start_date}" + }, + "10": { + "render": "Weitere Informationen auf der Webseite", + "question": "Gibt es eine Webseite mit weiteren Informationen über diesen öffentlichen Bücherschrank?" + } + } + }, + "toilet": { + "name": "Toiletten", + "title": { + "render": "Toilette" + }, + "presets": { + "0": { + "title": "Toilette", + "description": "Eine öffentlich zugängliche Toilette" + }, + "1": { + "title": "Toiletten mit rollstuhlgerechter Toilette", + "description": "Eine Toilettenanlage mit mindestens einer rollstuhlgerechten Toilette" + } + }, + "tagRenderings": { + "1": { + "question": "Sind diese Toiletten öffentlich zugänglich?", + "render": "Zugang ist {access}", + "mappings": { + "0": { + "then": "Öffentlicher Zugang" + }, + "1": { + "then": "Nur Zugang für Kunden" + }, + "2": { + "then": "Nicht zugänglich" + }, + "3": { + "then": "Zugänglich, aber man muss einen Schlüssel für die Eingabe verlangen" + } + } + }, + "2": { + "question": "Können diese Toiletten kostenlos benutzt werden?", + "mappings": { + "0": { + "then": "Dies sind bezahlte Toiletten" + }, + "1": { + "then": "Kostenlose Nutzung" + } + } + }, + "3": { + "question": "Wie viel muss man für diese Toiletten bezahlen?", + "render": "Die Gebühr beträgt {charge}" + }, + "4": { + "question": "Gibt es eine Toilette für Rollstuhlfahrer?", + "mappings": { + "0": { + "then": "Es gibt eine Toilette für Rollstuhlfahrer" + }, + "1": { + "then": "Kein Zugang für Rollstuhlfahrer" + } + } + }, + "5": { + "question": "Welche Art von Toiletten sind das?", + "mappings": { + "0": { + "then": "Es gibt nur Sitztoiletten" + }, + "1": { + "then": "Hier gibt es nur Pissoirs" + }, + "2": { + "then": "Es gibt hier nur Hocktoiletten." + }, + "3": { + "then": "Sowohl Sitztoiletten als auch Pissoirs sind hier verfügbar" + } + } + }, + "6": { + "question": "Ist ein Wickeltisch (zum Wechseln der Windeln) vorhanden?", + "mappings": { + "0": { + "then": "Ein Wickeltisch ist verfügbar" + }, + "1": { + "then": "Es ist kein Wickeltisch verfügbar" + } + } + }, + "7": { + "question": "Wo befindet sich der Wickeltisch?", + "render": "Die Wickeltabelle befindet sich in {changing_table:location}", + "mappings": { + "0": { + "then": "Der Wickeltisch befindet sich in der Damentoilette. " + }, + "1": { + "then": "Der Wickeltisch befindet sich in der Herrentoilette. " + }, + "2": { + "then": "Der Wickeltisch befindet sich in der Toilette für Rollstuhlfahrer. " + }, + "3": { + "then": "Der Wickeltisch befindet sich in einem eigenen Raum. " + } + } + } + } + }, + "viewpoint": { + "name": "Aussichtspunkt", + "description": "Ein schöner Aussichtspunkt oder eine schöne Aussicht. Ideal zum Hinzufügen eines Bildes, wenn keine andere Kategorie passt", + "presets": { + "0": { + "title": "Aussichtspunkt" + } + }, + "title": { + "render": "Aussichtspunkt" + }, + "tagRenderings": { + "1": { + "question": "Möchten Sie eine Beschreibung hinzufügen?" + } + } + } +} \ No newline at end of file diff --git a/langs/layers/en.json b/langs/layers/en.json new file mode 100644 index 0000000000..96425af84a --- /dev/null +++ b/langs/layers/en.json @@ -0,0 +1,1785 @@ +{ + "bench": { + "name": "Benches", + "title": { + "render": "Bench" + }, + "tagRenderings": { + "1": { + "render": "Backrest", + "mappings": { + "0": { + "then": "Backrest: Yes" + }, + "1": { + "then": "Backrest: No" + } + }, + "question": "Does this bench have a backrest?" + }, + "2": { + "render": "{seats} seats", + "question": "How many seats does this bench have?" + }, + "3": { + "render": "Material: {material}", + "mappings": { + "0": { + "then": "Material: wood" + }, + "1": { + "then": "Material: metal" + }, + "2": { + "then": "Material: stone" + }, + "3": { + "then": "Material: concrete" + }, + "4": { + "then": "Material: plastic" + }, + "5": { + "then": "Material: steel" + } + }, + "question": "What is the bench (seating) made from?" + }, + "4": { + "question": "In which direction are you looking when sitting on the bench?", + "render": "When sitting on the bench, one looks towards {direction}°." + }, + "5": { + "render": "Colour: {colour}", + "question": "Which colour does this bench have?", + "mappings": { + "0": { + "then": "Colour: brown" + }, + "1": { + "then": "Colour: green" + }, + "2": { + "then": "Colour: gray" + }, + "3": { + "then": "Colour: white" + }, + "4": { + "then": "Colour: red" + }, + "5": { + "then": "Colour: black" + }, + "6": { + "then": "Colour: blue" + }, + "7": { + "then": "Colour: yellow" + } + } + }, + "6": { + "question": "When was this bench last surveyed?", + "render": "This bench was last surveyed on {survey:date}" + } + }, + "presets": { + "0": { + "title": "Bench", + "description": "Add a new bench" + } + } + }, + "bench_at_pt": { + "name": "Benches at public transport stops", + "title": { + "render": "Bench", + "mappings": { + "0": { + "then": "Bench at public transport stop" + }, + "1": { + "then": "Bench in shelter" + } + } + }, + "tagRenderings": { + "1": { + "render": "{name}" + }, + "2": { + "render": "Stand up bench" + } + } + }, + "bicycle_library": { + "name": "Bicycle library", + "title": { + "render": "Bicycle library" + }, + "description": "A facility where bicycles can be lent for longer period of times", + "tagRenderings": { + "1": { + "question": "What is the name of this bicycle library?", + "render": "This bicycle library is called {name}" + }, + "6": { + "question": "How much does lending a bicycle cost?", + "render": "Lending a bicycle costs {charge}", + "mappings": { + "0": { + "then": "Lending a bicycle is free" + }, + "1": { + "then": "Lending a bicycle costs €20/year and €20 warranty" + } + } + }, + "7": { + "question": "Who can lend bicycles here?", + "mappings": { + "0": { + "then": "Bikes for children available" + }, + "1": { + "then": "Bikes for adult available" + }, + "2": { + "then": "Bikes for disabled persons available" + } + } + } + }, + "presets": { + "0": { + "title": "Fietsbibliotheek", + "description": "A bicycle library has a collection of bikes which can be lent" + } + } + }, + "bicycle_tube_vending_machine": { + "name": "Bicycle tube vending machine", + "title": { + "render": "Bicycle tube vending machine" + }, + "presets": { + "0": { + "title": "Bicycle tube vending machine" + } + }, + "tagRenderings": { + "1": { + "question": "Is this vending machine still operational?", + "render": "The operational status is {operational_status", + "mappings": { + "0": { + "then": "This vending machine works" + }, + "1": { + "then": "This vending machine is broken" + }, + "2": { + "then": "This vending machine is closed" + } + } + } + } + }, + "bike_cafe": { + "name": "Bike cafe", + "title": { + "render": "Bike cafe", + "mappings": { + "0": { + "then": "Bike cafe {name}" + } + } + }, + "tagRenderings": { + "1": { + "question": "What is the name of this bike cafe?", + "render": "This bike cafe is called {name}" + }, + "2": { + "question": "Does this bike cafe offer a bike pump for use by anyone?", + "mappings": { + "0": { + "then": "This bike cafe offers a bike pump for anyone" + }, + "1": { + "then": "This bike cafe doesn't offer a bike pump for anyone" + } + } + }, + "3": { + "question": "Are there tools here to repair your own bike?", + "mappings": { + "0": { + "then": "This bike cafe offers tools for DIY repair" + }, + "1": { + "then": "This bike cafe doesn't offer tools for DIY repair" + } + } + }, + "4": { + "question": "Does this bike cafe repair bikes?", + "mappings": { + "0": { + "then": "This bike cafe repairs bikes" + }, + "1": { + "then": "This bike cafe doesn't repair bikes" + } + } + }, + "5": { + "question": "What is the website of {name}?" + }, + "6": { + "question": "What is the phone number of {name}?" + }, + "7": { + "question": "What is the email address of {name}?" + }, + "8": { + "question": "When it this bike café opened?" + } + }, + "presets": { + "0": { + "title": "Bike cafe" + } + } + }, + "bike_cleaning": { + "name": "Bike cleaning service", + "title": { + "render": "Bike cleaning service", + "mappings": { + "0": { + "then": "Bike cleaning service {name}" + } + } + }, + "presets": { + "0": { + "title": "Bike cleaning service" + } + } + }, + "bike_monitoring_station": { + "name": "Monitoring stations", + "title": { + "render": "Bicycle counting station", + "mappings": { + "0": { + "then": "Bicycle counting station {name}" + }, + "1": { + "then": "Bicycle counting station {ref}" + } + } + } + }, + "bike_parking": { + "name": "Bike parking", + "icon": { + "render": "./assets/layers/bike_parking/parking.svg" + }, + "presets": { + "0": { + "title": "Bike parking" + } + }, + "title": { + "render": "Bike parking" + }, + "tagRenderings": { + "1": { + "question": "What is the type of this bicycle parking?", + "render": "This is a bicycle parking of the type: {bicycle_parking}", + "mappings": { + "0": { + "then": "Staple racks " + }, + "1": { + "then": "Wheel rack/loops " + }, + "2": { + "then": "Handlebar holder " + }, + "3": { + "then": "Rack " + }, + "4": { + "then": "Two-tiered " + }, + "5": { + "then": "Shed " + }, + "6": { + "then": "Bollard " + }, + "7": { + "then": "An area on the floor which is marked for bicycle parking" + } + } + }, + "2": { + "question": "What is the relative location of this bicycle parking?", + "mappings": { + "0": { + "then": "Underground parking" + }, + "1": { + "then": "Underground parking" + }, + "2": { + "then": "Surface level parking" + }, + "3": { + "then": "Surface level parking" + }, + "4": { + "then": "Rooftop parking" + } + } + }, + "3": { + "question": "Is this parking covered? Also select \"covered\" for indoor parkings.", + "mappings": { + "0": { + "then": "This parking is covered (it has a roof)" + }, + "1": { + "then": "This parking is not covered" + } + } + }, + "4": { + "question": "How many bicycles fit in this bicycle parking (including possible cargo bicycles)?", + "render": "Place for {capacity} bikes" + }, + "5": { + "question": "Who can use this bicycle parking?", + "render": "{access}", + "mappings": { + "0": { + "then": "Publicly accessible" + }, + "1": { + "then": "Access is primarily for visitors to a business" + }, + "2": { + "then": "Access is limited to members of a school, company or organisation" + } + } + }, + "6": { + "question": "Does this bicycle parking have spots for cargo bikes?", + "mappings": { + "0": { + "then": "This parking has room for cargo bikes" + }, + "1": { + "then": "This parking has designated (official) spots for cargo bikes." + }, + "2": { + "then": "You're not allowed to park cargo bikes" + } + } + }, + "7": { + "question": "How many cargo bicycles fit in this bicycle parking?", + "render": "This parking fits {capacity:cargo_bike} cargo bikes" + } + } + }, + "bike_repair_station": { + "name": "Bike stations (repair, pump or both)", + "title": { + "render": "Bike station (pump & repair)", + "mappings": { + "0": { + "then": "Bike repair station" + }, + "1": { + "then": "Bike repair station" + }, + "2": { + "then": "Broken pump" + }, + "3": { + "then": "Bicycle pump {name}" + }, + "4": { + "then": "Bicycle pump" + } + } + }, + "tagRenderings": { + "1": { + "question": "Which services are available at this bike station?", + "mappings": { + "0": { + "then": "There is only a pump present" + }, + "1": { + "then": "There are only tools (screwdrivers, pliers...) present" + }, + "2": { + "then": "There are both tools and a pump present" + } + } + }, + "2": { + "question": "Who maintains this cycle pump?", + "render": "Maintained by {operator}" + }, + "3": { + "question": "When is this bicycle repair point open?", + "mappings": { + "0": { + "then": "Always open" + }, + "1": { + "then": "Always open" + } + } + }, + "4": { + "question": "Does this bike repair station have a special tool to repair your bike chain?", + "mappings": { + "0": { + "then": "There is a chain tool" + }, + "1": { + "then": "There is no chain tool" + } + } + }, + "5": { + "question": "Does this bike station have a hook to hang your bike on or a stand to raise it?", + "mappings": { + "0": { + "then": "There is a hook or stand" + }, + "1": { + "then": "There is no hook or stand" + } + } + }, + "6": { + "question": "Is the bike pump still operational?", + "mappings": { + "0": { + "then": "The bike pump is broken" + }, + "1": { + "then": "The bike pump is operational" + } + } + }, + "7": { + "question": "What valves are supported?", + "render": "This pump supports the following valves: {valves}", + "mappings": { + "0": { + "then": "Sclaverand (also known as Presta)" + }, + "1": { + "then": "Dunlop" + }, + "2": { + "then": "Schrader (cars)" + } + } + }, + "8": { + "question": "Is this an electric bike pump?", + "mappings": { + "0": { + "then": "Manual pump" + }, + "1": { + "then": "Electrical pump" + } + } + }, + "9": { + "question": "Does the pump have a pressure indicator or manometer?", + "mappings": { + "0": { + "then": "There is a manometer" + }, + "1": { + "then": "There is no manometer" + }, + "2": { + "then": "There is manometer but it is broken" + } + } + } + }, + "icon": { + "render": "./assets/layers/bike_repair_station/repair_station.svg" + }, + "iconSize": { + "render": "50,50,bottom" + }, + "color": { + "render": "#00f" + }, + "width": { + "render": "1" + }, + "presets": { + "0": { + "title": "Bike pump", + "description": "A device to inflate your tires on a fixed location in the public space.

Examples of bicycle pumps

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

Example

" + }, + "2": { + "title": "Bike repair station without pump" + } + } + }, + "bike_shop": { + "name": "Bike repair/shop", + "title": { + "render": "Bike repair/shop", + "mappings": { + "0": { + "then": "Sport gear shop {name}" + }, + "2": { + "then": "Bicycle rental {name}" + }, + "3": { + "then": "Bike repair {name}" + }, + "4": { + "then": "Bike shop {name}" + }, + "5": { + "then": "Bike repair/shop {name}" + } + } + }, + "description": "A shop specifically selling bicycles or related items", + "tagRenderings": { + "1": { + "render": "This shop is specialized in selling {shop} and does bicycle related activities" + }, + "2": { + "question": "What is the name of this bicycle shop?", + "render": "This bicycle shop is called {name}" + }, + "3": { + "question": "What is the website of {name}?" + }, + "4": { + "question": "What is the phone number of {name}?" + }, + "5": { + "question": "What is the email address of {name}?" + }, + "9": { + "question": "Does this shop sell bikes?", + "mappings": { + "0": { + "then": "This shop sells bikes" + }, + "1": { + "then": "This shop doesn't sell bikes" + } + } + }, + "10": { + "question": "Does this shop repair bikes?", + "mappings": { + "0": { + "then": "This shop repairs bikes" + }, + "1": { + "then": "This shop doesn't repair bikes" + }, + "2": { + "then": "This shop only repairs bikes bought here" + }, + "3": { + "then": "This shop only repairs bikes of a certain brand" + } + } + }, + "11": { + "question": "Does this shop rent out bikes?", + "mappings": { + "0": { + "then": "This shop rents out bikes" + }, + "1": { + "then": "This shop doesn't rent out bikes" + } + } + }, + "12": { + "question": "Does this shop sell second-hand bikes?", + "mappings": { + "0": { + "then": "This shop sells second-hand bikes" + }, + "1": { + "then": "This shop doesn't sell second-hand bikes" + }, + "2": { + "then": "This shop only sells second-hand bikes" + } + } + }, + "13": { + "question": "Does this shop offer a bike pump for use by anyone?", + "mappings": { + "0": { + "then": "This shop offers a bike pump for anyone" + }, + "1": { + "then": "This shop doesn't offer a bike pump for anyone" + }, + "2": { + "then": "There is bicycle pump, it is shown as a seperate point " + } + } + }, + "14": { + "question": "Are there tools here to repair your own bike?", + "mappings": { + "0": { + "then": "This shop offers tools for DIY repair" + }, + "1": { + "then": "This shop doesn't offer tools for DIY repair" + }, + "2": { + "then": "Tools for DIY repair are only available if you bought/hire the bike in the shop" + } + } + }, + "15": { + "question": "Are bicycles washed here?", + "mappings": { + "0": { + "then": "This shop cleans bicycles" + }, + "1": { + "then": "This shop has an installation where one can clean bicycles themselves" + }, + "2": { + "then": "This shop doesn't offer bicycle cleaning" + } + } + } + }, + "presets": { + "0": { + "title": "Bike repair/shop" + } + } + }, + "bike_themed_object": { + "name": "Bike related object", + "title": { + "render": "Bike related object", + "mappings": { + "1": { + "then": "Cycle track" + } + } + } + }, + "defibrillator": { + "name": "Defibrillators", + "title": { + "render": "Defibrillator" + }, + "icon": { + "mappings": { + "0": { + "then": "./assets/layers/defibrillator/aed_checked.svg" + } + } + }, + "presets": { + "0": { + "title": "Defibrillator" + } + }, + "tagRenderings": { + "1": { + "question": "Is this defibrillator located indoors?", + "mappings": { + "0": { + "then": "This defibrillator is located indoors" + }, + "1": { + "then": "This defibrillator is located outdoors" + } + } + }, + "2": { + "question": "Is this defibrillator freely accessible?", + "render": "Access is {access}", + "mappings": { + "0": { + "then": "Publicly accessible" + }, + "1": { + "then": "Publicly accessible" + }, + "2": { + "then": "Only accessible to customers" + }, + "3": { + "then": "Not accessible to the general public (e.g. only accesible to staff, the owners, ...)" + }, + "4": { + "then": "Not accessible, possibly only for professional use" + } + } + }, + "3": { + "render": "There is no info about the type of device", + "question": "Is this a a regular automatic defibrillator or a manual defibrillator for professionals only?", + "mappings": { + "0": { + "then": "This is a manual defibrillator for professionals" + }, + "1": { + "then": "This is a normal automatic defibrillator" + } + } + }, + "4": { + "question": "On which floor is this defibrillator located?", + "render": "This defibrillator is on floor {level}", + "mappings": { + "0": { + "then": "This defibrillator is on the ground floor" + }, + "1": { + "then": "This defibrillator is on the first floor" + } + } + }, + "5": { + "render": "Extra information about the location (in the local languagel):
{defibrillator:location}", + "question": "Please give some explanation on where the defibrillator can be found (in the local language)" + }, + "6": { + "render": "Extra information about the location (in English):
{defibrillator:location:en}", + "question": "Please give some explanation on where the defibrillator can be found (in English)" + }, + "7": { + "render": "Extra information about the location (in French):
{defibrillator:location:fr}", + "question": "Please give some explanation on where the defibrillator can be found (in French)" + }, + "8": { + "question": "Is this defibrillator accessible with a wheelchair?", + "mappings": { + "0": { + "then": "This defibrillator is specially adapated for wheelchair users" + }, + "1": { + "then": "This defibrillator is easily reachable with a wheelchair" + }, + "2": { + "then": "It is possible to reach the defibrillator in a wheelchair, but it is not easy" + }, + "3": { + "then": "This defibrillator is not reachable with a wheelchair" + } + } + }, + "9": { + "render": "Official identification number of the device: {ref}", + "question": "What is the official identification number of the device? (if visible on device)" + }, + "10": { + "render": "Email for questions about this defibrillator: {email}", + "question": "What is the email for questions about this defibrillator?" + }, + "11": { + "render": "Telephone for questions about this defibrillator: {phone}", + "question": "What is the phone number for questions about this defibrillator?" + }, + "12": { + "render": "{opening_hours_table(opening_hours)}", + "question": "At what times is this defibrillator available?", + "mappings": { + "0": { + "then": "24/7 opened (including holidays)" + } + } + }, + "13": { + "render": "Additional information: {description}", + "question": "Is there any useful information for users that you haven't been able to describe above? (leave blank if no)" + }, + "14": { + "question": "When was this defibrillator last surveyed?", + "render": "This defibrillator was last surveyed on {survey:date}", + "mappings": { + "0": { + "then": "Checked today!" + } + } + }, + "15": { + "render": "Extra information for OpenStreetMap experts: {fixme}", + "question": "Is there something wrong with how this is mapped, that you weren't able to fix here? (leave a note to OpenStreetMap experts)" + } + } + }, + "direction": { + "name": "Direction visualization", + "description": "This layer visualizes directions" + }, + "drinking_water": { + "name": "Drinking water", + "title": { + "render": "Drinking water" + }, + "presets": { + "0": { + "title": "Drinking water" + } + }, + "tagRenderings": { + "1": { + "question": "Is this drinking water spot still operational?", + "render": "The operational status is {operational_status", + "mappings": { + "0": { + "then": "This drinking water works" + }, + "1": { + "then": "This drinking water is broken" + }, + "2": { + "then": "This drinking water is closed" + } + } + }, + "2": { + "question": "How easy is it to fill water bottles?", + "mappings": { + "0": { + "then": "It is easy to refill water bottles" + }, + "1": { + "then": "Water bottles may not fit" + } + } + }, + "3": { + "render": "There is another drinking water fountain at {_closest_other_drinking_water_distance} meter" + } + } + }, + "ghost_bike": { + "name": "Ghost bikes", + "title": { + "render": "Ghost bike", + "mappings": { + "0": { + "then": "Ghost bike in the remembrance of {name}" + } + } + }, + "presets": { + "0": { + "title": "Ghost bike" + } + }, + "tagRenderings": { + "0": { + "render": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location." + }, + "2": { + "question": "Whom is remembered by this ghost bike?
Please respect privacy - only fill out the name if it is widely published or marked on the cycle. Opt to leave out the family name.
", + "render": "In remembrance of {name}", + "mappings": { + "0": { + "then": "No name is marked on the bike" + } + } + }, + "3": { + "question": "On what webpage can one find more information about the Ghost bike or the accident?", + "render": "More information is available" + }, + "4": { + "question": "What is the inscription on this Ghost bike?", + "render": "{inscription}" + }, + "5": { + "question": "When was this Ghost bike installed?", + "render": "Placed on {start_date}" + } + } + }, + "information_board": { + "name": "Information boards", + "title": { + "render": "Information board" + }, + "presets": { + "0": { + "title": "Information board" + } + } + }, + "map": { + "name": "Maps", + "title": { + "render": "Map" + }, + "description": "A map, meant for tourists which is permanently installed in the public space", + "tagRenderings": { + "1": { + "question": "On which data is this map based?", + "mappings": { + "0": { + "then": "This map is based on OpenStreetMap" + } + }, + "render": "This map is based on {map_source}" + }, + "2": { + "question": "Is the OpenStreetMap-attribution given?", + "mappings": { + "0": { + "then": "OpenStreetMap is clearly attributed, including the ODBL-license" + }, + "1": { + "then": "OpenStreetMap is clearly attributed, but the license is not mentioned" + }, + "2": { + "then": "OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it" + }, + "3": { + "then": "There is no attribution at all" + }, + "4": { + "then": "There is no attribution at all" + } + } + } + }, + "presets": { + "0": { + "title": "Map", + "description": "Add a missing map" + } + } + }, + "nature_reserve": { + "tagRenderings": { + "5": { + "question": "Are dogs allowed in this nature reserve?", + "mappings": { + "0": { + "then": "Dogs have to be leashed" + }, + "1": { + "then": "No dogs allowed" + }, + "2": { + "then": "Dogs are allowed to roam freely" + } + } + }, + "6": { + "question": "On which webpage can one find more information about this nature reserve?" + }, + "7": { + "question": "Whom is the curator of this nature reserve?
Respect privacy - only fill out a name if this is widely published", + "render": "{curator} is the curator of this nature reserve" + }, + "8": { + "question": "What email adress can one send to with questions and problems with this nature reserve?
Respect privacy - only fill out a personal email address if this is widely published", + "render": "{email}" + }, + "9": { + "question": "What phone number can one call to with questions and problems with this nature reserve?
Respect privacy - only fill out a personal phone number address if this is widely published", + "render": "{phone}" + }, + "12": { + "render": "Surface area: {_surface:ha}Ha" + } + } + }, + "picnic_table": { + "name": "Picnic tables", + "title": { + "render": "Picnic table" + }, + "description": "The layer showing picnic tables", + "tagRenderings": { + "0": { + "question": "What material is this picnic table made of?", + "render": "This picnic table is made of {material}", + "mappings": { + "0": { + "then": "This is a wooden picnic table" + }, + "1": { + "then": "This is a concrete picnic table" + } + } + } + }, + "presets": { + "0": { + "title": "Picnic table" + } + } + }, + "playground": { + "name": "Playgrounds", + "description": "Playgrounds", + "title": { + "render": "Playground", + "mappings": { + "0": { + "then": "Playground {name}" + } + } + }, + "tagRenderings": { + "1": { + "question": "Which is the surface of this playground?
If there are multiple, select the most occuring one", + "render": "The surface is {surface}", + "mappings": { + "0": { + "then": "The surface is grass" + }, + "1": { + "then": "The surface is sand" + }, + "2": { + "then": "The surface consist of woodchips" + }, + "3": { + "then": "The surface is paving stones" + }, + "4": { + "then": "The surface is asphalt" + }, + "5": { + "then": "The surface is concrete" + }, + "6": { + "then": "The surface is unpaved" + }, + "7": { + "then": "The surface is paved" + } + } + }, + "2": { + "question": "Is this playground lit at night?", + "mappings": { + "0": { + "then": "This playground is lit at night" + }, + "1": { + "then": "This playground is not lit at night" + } + } + }, + "3": { + "render": "Accessible to kids older then {min_age} years", + "question": "What is the minimum age required to access this playground?" + }, + "4": { + "render": "Accessible to kids of at most {max_age}", + "question": "What is the maximum age allowed to access this playground?" + }, + "5": { + "question": "Who operates this playground?", + "render": "Operated by {operator}" + }, + "6": { + "question": "Is this playground accessible to the general public?", + "mappings": { + "0": { + "then": "Accessible to the general public" + }, + "1": { + "then": "Accessible to the general public" + }, + "2": { + "then": "Only accessible for clients of the operating business" + }, + "3": { + "then": "Only accessible to studants of the school" + }, + "4": { + "then": "Not accessible" + } + } + }, + "7": { + "question": "What is the email address of the playground maintainer?", + "render": "{email}" + }, + "8": { + "question": "What is the phone number of the playground maintainer?", + "render": "{phone}" + }, + "9": { + "question": "Is this playground accessible to wheelchair users?", + "mappings": { + "0": { + "then": "Completely accessible for wheelchair users" + }, + "1": { + "then": "Limited accessibility for wheelchair users" + }, + "2": { + "then": "Not accessible for wheelchair users" + } + } + }, + "10": { + "question": "When is this playground accessible?", + "mappings": { + "0": { + "then": "Accessible from sunrise till sunset" + }, + "1": { + "then": "Always accessible" + }, + "2": { + "then": "Always accessible" + } + } + } + }, + "presets": { + "0": { + "title": "Playground" + } + } + }, + "public_bookcase": { + "name": "Bookcases", + "description": "A streetside cabinet with books, accessible to anyone", + "title": { + "render": "Bookcase", + "mappings": { + "0": { + "then": "Public bookcase {name}" + } + } + }, + "presets": { + "0": { + "title": "Bookcase" + } + }, + "tagRenderings": { + "1": { + "render": "The name of this bookcase is {name}", + "question": "What is the name of this public bookcase?", + "mappings": { + "0": { + "then": "This bookcase doesn't have a name" + } + } + }, + "2": { + "render": "{capacity} books fit in this bookcase", + "question": "How many books fit into this public bookcase?" + }, + "3": { + "question": "What kind of books can be found in this public bookcase?", + "mappings": { + "0": { + "then": "Mostly children books" + }, + "1": { + "then": "Mostly books for adults" + }, + "2": { + "then": "Both books for kids and adults" + } + } + }, + "4": { + "question": "Is this bookcase located outdoors?", + "mappings": { + "0": { + "then": "This bookcase is located indoors" + }, + "1": { + "then": "This bookcase is located outdoors" + }, + "2": { + "then": "This bookcase is located outdoors" + } + } + }, + "5": { + "question": "Is this public bookcase freely accessible?", + "mappings": { + "0": { + "then": "Publicly accessible" + }, + "1": { + "then": "Only accessible to customers" + } + } + }, + "6": { + "question": "Who maintains this public bookcase?", + "render": "Operated by {operator}" + }, + "7": { + "question": "Is this public bookcase part of a bigger network?", + "render": "This public bookcase is part of {brand}", + "mappings": { + "0": { + "then": "Part of the network 'Little Free Library'" + }, + "1": { + "then": "This public bookcase is not part of a bigger network" + } + } + }, + "8": { + "render": "The reference number of this public bookcase within {brand} is {ref}", + "question": "What is the reference number of this public bookcase?", + "mappings": { + "0": { + "then": "This bookcase is not part of a bigger network" + } + } + }, + "9": { + "question": "When was this public bookcase installed?", + "render": "Installed on {start_date}" + }, + "10": { + "render": "More info on the website", + "question": "Is there a website with more information about this public bookcase?" + } + } + }, + "slow_roads": { + "tagRenderings": { + "2": { + "render": "The surface is {surface}", + "mappings": { + "0": { + "then": "The surface is grass" + }, + "1": { + "then": "The surface is ground" + }, + "2": { + "then": "The surface is unpaved" + }, + "3": { + "then": "The surface is sand" + }, + "4": { + "then": "The surface is paving stones" + }, + "5": { + "then": "The surface is asphalt" + }, + "6": { + "then": "The surface is concrete" + }, + "7": { + "then": "The surface is paved" + } + } + } + } + }, + "sport_pitch": { + "name": "Sport pitches", + "title": { + "render": "Sport pitch" + }, + "description": "A sport pitch", + "tagRenderings": { + "1": { + "render": "{sport} is played here", + "question": "Which sport can be played here?", + "mappings": { + "0": { + "then": "Basketball is played here" + }, + "1": { + "then": "Soccer is played here" + }, + "2": { + "then": "This is a pingpong table" + }, + "3": { + "then": "Tennis is played here" + }, + "4": { + "then": "Korfball is played here" + }, + "5": { + "then": "Basketball is played here" + } + } + }, + "2": { + "question": "Which is the surface of this sport pitch?", + "render": "The surface is {surface}", + "mappings": { + "0": { + "then": "The surface is grass" + }, + "1": { + "then": "The surface is sand" + }, + "2": { + "then": "The surface is paving stones" + }, + "3": { + "then": "The surface is asphalt" + }, + "4": { + "then": "The surface is concrete" + } + } + }, + "3": { + "question": "Is this sport pitch publicly accessible?", + "mappings": { + "0": { + "then": "Public access" + }, + "1": { + "then": "Limited access (e.g. only with an appointment, during certain hours, ...)" + }, + "2": { + "then": "Only accessible for members of the club" + }, + "3": { + "then": "Private - not accessible to the public" + } + } + }, + "4": { + "question": "Does one have to make an appointment to use this sport pitch?", + "mappings": { + "0": { + "then": "Making an appointment is obligatory to use this sport pitch" + }, + "1": { + "then": "Making an appointment is recommended when using this sport pitch" + }, + "2": { + "then": "Making an appointment is possible, but not necessary to use this sport pitch" + }, + "3": { + "then": "Making an appointment is not possible" + } + } + }, + "5": { + "question": "What is the phone number of the operator?" + }, + "6": { + "question": "What is the email address of the operator?" + }, + "7": { + "question": "When is this pitch accessible?", + "mappings": { + "1": { + "then": "Always accessible" + } + } + } + }, + "presets": { + "0": { + "title": "Tabletennis table" + }, + "1": { + "title": "Sport pitch" + } + } + }, + "surveillance_camera": { + "name": "Surveillance camera's", + "title": { + "render": "Surveillance Camera" + }, + "tagRenderings": { + "1": { + "question": "What kind of camera is this?", + "mappings": { + "0": { + "then": "A fixed (non-moving) camera" + }, + "1": { + "then": "A dome camera (which can turn)" + }, + "2": { + "then": "A panning camera" + } + } + }, + "2": { + "question": "In which geographical direction does this camera film?", + "render": "Films to a compass heading of {camera:direction}", + "mappings": { + "0": { + "then": "Films to a compass heading of {direction}" + } + } + }, + "3": { + "question": "Who operates this CCTV?", + "render": "Operated by {operator}" + }, + "4": { + "question": "What kind of surveillance is this camera", + "mappings": { + "0": { + "then": "A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or tunnel,..." + }, + "1": { + "then": "An outdoor, yet private area is surveilled (e.g. a parking lot, a fuel station, courtyard, entrance, private driveway, ...)" + }, + "2": { + "then": "A private indoor area is surveilled, e.g. a shop, a private underground parking, ..." + } + } + }, + "5": { + "question": "Is the public space surveilled by this camera an indoor or outdoor space?", + "mappings": { + "0": { + "then": "This camera is located indoors" + }, + "1": { + "then": "This camera is located outdoors" + }, + "2": { + "then": "This camera is probably located outdoors" + } + } + }, + "6": { + "question": "On which level is this camera located?", + "render": "Located on level {level}" + }, + "7": { + "question": "What exactly is surveilled here?", + "render": " Surveills a {surveillance:zone}", + "mappings": { + "0": { + "then": "Surveills a parking" + }, + "1": { + "then": "Surveills the traffic" + }, + "2": { + "then": "Surveills an entrance" + }, + "3": { + "then": "Surveills a corridor" + }, + "4": { + "then": "Surveills a public tranport platform" + }, + "5": { + "then": "Surveills a shop" + } + } + }, + "8": { + "question": "How is this camera placed?", + "render": "Mounting method: {mount}", + "mappings": { + "0": { + "then": "This camera is placed against a wall" + }, + "1": { + "then": "This camera is placed one a pole" + }, + "2": { + "then": "This camera is placed on the ceiling" + } + } + } + } + }, + "toilet": { + "name": "Toilets", + "title": { + "render": "Toilet" + }, + "presets": { + "0": { + "title": "Toilet", + "description": "A publicly accessible toilet or restroom" + }, + "1": { + "title": "Toilets with wheelchair accessible toilet", + "description": "A restroom which has at least one wheelchair-accessible toilet" + } + }, + "tagRenderings": { + "1": { + "question": "Are these toilets publicly accessible?", + "render": "Access is {access}", + "mappings": { + "0": { + "then": "Public access" + }, + "1": { + "then": "Only access to customers" + }, + "2": { + "then": "Not accessible" + }, + "3": { + "then": "Accessible, but one has to ask a key to enter" + } + } + }, + "2": { + "question": "Are these toilets free to use?", + "mappings": { + "0": { + "then": "These are paid toilets" + }, + "1": { + "then": "Free to use" + } + } + }, + "3": { + "question": "How much does one have to pay for these toilets?", + "render": "The fee is {charge}" + }, + "4": { + "question": "Is there a dedicated toilet for wheelchair users", + "mappings": { + "0": { + "then": "There is a dedicated toilet for wheelchair users" + }, + "1": { + "then": "No wheelchair access" + } + } + }, + "5": { + "question": "Which kind of toilets are this?", + "mappings": { + "0": { + "then": "There are only seated toilets" + }, + "1": { + "then": "There are only urinals here" + }, + "2": { + "then": "There are only squat toilets here" + }, + "3": { + "then": "Both seated toilets and urinals are available here" + } + } + }, + "6": { + "question": "Is a changing table (to change diapers) available?", + "mappings": { + "0": { + "then": "A changing table is available" + }, + "1": { + "then": "No changing table is available" + } + } + }, + "7": { + "question": "Where is the changing table located?", + "render": "The changing table is located at {changing_table:location}", + "mappings": { + "0": { + "then": "The changing table is in the toilet for women. " + }, + "1": { + "then": "The changing table is in the toilet for men. " + }, + "2": { + "then": "The changing table is in the toilet for wheelchair users. " + }, + "3": { + "then": "The changing table is in a dedicated room. " + } + } + } + } + }, + "tree_node": { + "name": "Tree", + "title": { + "render": "Tree", + "mappings": { + "0": { + "then": "{name}" + } + } + }, + "tagRenderings": { + "1": { + "render": "Height: {height}", + "mappings": { + "0": { + "then": "Height: {height} m" + } + } + }, + "2": { + "question": "Is this a broadleaved or needleleaved tree?", + "mappings": { + "0": { + "then": "\"\"/ Broadleaved" + }, + "1": { + "then": "\"\"/ Needleleaved" + }, + "2": { + "then": "\"\"/ Permanently leafless" + } + } + }, + "3": { + "question": "How significant is this tree? Choose the first answer that applies.", + "mappings": { + "0": { + "then": "The tree is remarkable due to its size or prominent location. It is useful for navigation." + }, + "1": { + "then": "The tree is a natural monument, e.g. because it is especially old, or of a valuable species." + }, + "2": { + "then": "The tree is used for agricultural purposes, e.g. in an orchard." + }, + "3": { + "then": "The tree is in a park or similar (cemetery, school grounds, …)." + }, + "4": { + "then": "The tree is a residential garden." + }, + "5": { + "then": "This is a tree along an avenue." + }, + "6": { + "then": "The tree is an urban area." + }, + "7": { + "then": "The tree is outside of an urban area." + } + } + }, + "4": { + "question": "Is this tree evergreen or deciduous?", + "mappings": { + "0": { + "then": "Deciduous: the tree loses its leaves for some time of the year." + }, + "1": { + "then": "Evergreen." + } + } + }, + "5": { + "render": "Naam: {name}", + "question": "Does the tree have a name?", + "mappings": { + "0": { + "then": "The tree does not have a name." + } + } + }, + "6": { + "question": "Is this tree registered heritage?", + "mappings": { + "0": { + "then": "\"\"/ Registered as heritage by Onroerend Erfgoed Flanders" + }, + "1": { + "then": "Registered as heritage by Direction du Patrimoine culturel Brussels" + }, + "2": { + "then": "Registered as heritage by a different organisation" + }, + "3": { + "then": "Not registered as heritage" + }, + "4": { + "then": "Registered as heritage by a different organisation" + } + } + }, + "7": { + "render": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", + "question": "What is the ID issuesd by Onroerend Erfgoed Flanders?" + }, + "8": { + "render": "\"\"/ Wikidata: {wikidata}", + "question": "What is the Wikidata ID for this tree?" + } + }, + "presets": { + "0": { + "title": "Broadleaved tree", + "description": "A tree of a species with leaves, such as oak or populus." + }, + "1": { + "title": "Needleleaved tree", + "description": "A tree of a species with needles, such as pine or spruce." + }, + "2": { + "title": "Tree", + "description": "If you're not sure whether it's a broadleaved or needleleaved tree." + } + } + }, + "viewpoint": { + "name": "Viewpoint", + "description": "A nice viewpoint or nice view. Ideal to add an image if no other category fits", + "presets": { + "0": { + "title": "Viewpoint" + } + }, + "title": { + "render": "Viewpoint" + }, + "tagRenderings": { + "1": { + "question": "Do you want to add a description?" + } + } + } +} \ No newline at end of file diff --git a/langs/layers/es.json b/langs/layers/es.json new file mode 100644 index 0000000000..85c7ff5371 --- /dev/null +++ b/langs/layers/es.json @@ -0,0 +1,57 @@ +{ + "defibrillator": { + "name": "Desfibriladores", + "title": { + "render": "Desfibrilador" + }, + "presets": { + "0": { + "title": "Desfibrilador" + } + }, + "tagRenderings": { + "1": { + "question": "¿Esté el desfibrilador en interior?", + "mappings": { + "0": { + "then": "Este desfibrilador está en interior" + }, + "1": { + "then": "Este desfibrilador está en exterior" + } + } + }, + "2": { + "question": "¿Está el desfibrilador accesible libremente?", + "render": "El acceso es {access}", + "mappings": { + "0": { + "then": "Acceso libre" + }, + "1": { + "then": "Publicament accesible" + }, + "2": { + "then": "Sólo accesible a clientes" + }, + "3": { + "then": "No accesible al público en general (ex. sólo accesible a trabajadores, propietarios, ...)" + } + } + }, + "4": { + "question": "¿En qué planta se encuentra el defibrilador localizado?", + "render": "El desfibrilador se encuentra en la planta {level}" + }, + "5": { + "question": "Da detalles de dónde se puede encontrar el desfibrilador (en el idioma local)" + }, + "6": { + "question": "Da detalles de dónde se puede encontrar el desfibrilador (en ingles)" + }, + "7": { + "question": "Da detalles de dónde se puede encontrar el desfibrilador (en frances)" + } + } + } +} \ No newline at end of file diff --git a/langs/layers/fr.json b/langs/layers/fr.json new file mode 100644 index 0000000000..9c8b2653c5 --- /dev/null +++ b/langs/layers/fr.json @@ -0,0 +1,853 @@ +{ + "bench": { + "name": "Bancs", + "title": { + "render": "Banc" + }, + "tagRenderings": { + "1": { + "render": "Dossier", + "mappings": { + "0": { + "then": "Dossier: Oui" + }, + "1": { + "then": "Dossier: Non" + } + }, + "question": "Ce banc dispose-t-il d'un dossier ?" + }, + "2": { + "render": "{seats} places", + "question": "De combien de places dispose ce banc ?" + }, + "3": { + "render": "Matériau : {material}", + "mappings": { + "0": { + "then": "Matériau : bois" + }, + "1": { + "then": "Matériau : métal" + }, + "2": { + "then": "Matériau: pierre" + }, + "3": { + "then": "Matériau : béton" + }, + "4": { + "then": "Matériau : plastique" + }, + "5": { + "then": "Matériau : acier" + } + }, + "question": "De quel matériau ce banc est-il fait ?" + }, + "5": { + "render": "Couleur : {colour}", + "question": "Quelle est la couleur de ce banc ?", + "mappings": { + "0": { + "then": "Couleur : marron" + }, + "1": { + "then": "Couleur : verte" + }, + "2": { + "then": "Couleur : gris" + }, + "3": { + "then": "Couleur : blanc" + }, + "4": { + "then": "Couleur : rouge" + }, + "5": { + "then": "Couleur : noire" + }, + "6": { + "then": "Couleur : bleu" + }, + "7": { + "then": "Couleur : jaune" + } + } + } + }, + "presets": { + "0": { + "title": "Banc", + "description": "Ajouter un nouveau banc" + } + } + }, + "bench_at_pt": { + "name": "Bancs des arrêts de transport en commun", + "title": { + "render": "Banc", + "mappings": { + "0": { + "then": "Banc d'un arrêt de transport en commun" + }, + "1": { + "then": "Banc dans un abri" + } + } + }, + "tagRenderings": { + "1": { + "render": "{name}" + }, + "2": { + "render": "Banc assis debout" + } + } + }, + "bike_cafe": { + "name": "Café vélo", + "title": { + "render": "Café Vélo", + "mappings": { + "0": { + "then": "Café Vélo {name}" + } + } + }, + "tagRenderings": { + "1": { + "question": "Quel est le nom de ce Café vélo", + "render": "Ce Café vélo s'appelle {name}" + }, + "2": { + "question": "Est-ce que ce Café vélo propose une pompe en libre accès", + "mappings": { + "0": { + "then": "Ce Café vélo offre une pompe en libre accès" + }, + "1": { + "then": "Ce Café vélo n'offre pas de pompe en libre accès" + } + } + }, + "3": { + "question": "Est-ce qu'il y a des outils pour réparer soi-même son vélo?", + "mappings": { + "0": { + "then": "Ce Café vélo propose des outils pour réparer son vélo soi-même" + }, + "1": { + "then": "Ce Café vélo ne propose pas d'outils pour réparer son vélo soi-même" + } + } + }, + "4": { + "question": "Est-ce que ce Café vélo répare les vélos?", + "mappings": { + "0": { + "then": "Ce Café vélo répare les vélos" + }, + "1": { + "then": "Ce Café vélo ne répare pas les vélos" + } + } + }, + "5": { + "question": "Quel est le site internet de {name}?" + }, + "6": { + "question": "Quel est le nom de {name}?" + }, + "7": { + "question": "Quel est l'adresse email de {name}?" + } + }, + "presets": { + "0": { + "title": "Café Vélo" + } + } + }, + "bike_parking": { + "name": "Parking à vélo", + "presets": { + "0": { + "title": "Parking à vélo" + } + }, + "title": { + "render": "Parking à vélo" + }, + "tagRenderings": { + "1": { + "question": "Quelle type de parking s'agit il?", + "render": "Ceci est un parking à vélo de type {bicycle_parking}", + "mappings": { + "0": { + "then": "Arceaux " + }, + "1": { + "then": "Pinces-roues " + }, + "2": { + "then": "Support guidon " + }, + "3": { + "then": "Râtelier " + }, + "4": { + "then": "Superposé " + }, + "5": { + "then": "Abri " + } + } + }, + "4": { + "question": "Combien de vélos entrent dans ce parking à vélos (y compris les éventuels vélos de transport) ?", + "render": "Place pour {capacity} vélos" + }, + "7": { + "question": "Combien de vélos de transport entrent dans ce parking à vélos ?", + "render": "Ce parking a de la place pour {capacity:cargo_bike} vélos de transport." + } + } + }, + "bike_repair_station": { + "name": "Station velo (réparation, pompe à vélo)", + "title": { + "render": "Point station velo avec pompe", + "mappings": { + "0": { + "then": "Point de réparation velo" + }, + "1": { + "then": "Point de réparation" + }, + "2": { + "then": "Pompe cassée" + }, + "3": { + "then": "Pompe de vélo {name}" + }, + "4": { + "then": "Pompe de vélo" + } + } + }, + "tagRenderings": { + "1": { + "question": "Quels services sont valables à cette station vélo?", + "mappings": { + "0": { + "then": "Il y a seulement une pompe" + }, + "1": { + "then": "Il y a seulement des outils (tournevis, pinces...)" + }, + "2": { + "then": "Il y a des outils et une pompe" + } + } + }, + "4": { + "question": "Est-ce que cette station vélo a un outils specifique pour réparer la chaîne du velo?", + "mappings": { + "0": { + "then": "Il y a un outil pour réparer la chaine" + }, + "1": { + "then": "Il n'y a pas d'outil pour réparer la chaine" + } + } + }, + "5": { + "question": "Est-ce que cette station vélo à un crochet pour suspendre son velo ou une accroche pour l'élevé?", + "mappings": { + "0": { + "then": "Il y a un crochet ou une accroche" + }, + "1": { + "then": "Il n'y pas de crochet ou d'accroche" + } + } + }, + "6": { + "question": "Est-ce que cette pompe marche t'elle toujours?", + "mappings": { + "0": { + "then": "La pompe est cassé" + }, + "1": { + "then": "La pompe est opérationnelle" + } + } + }, + "7": { + "question": "Quelles valves sont compatibles?", + "render": "Cette pompe est compatible avec les valves suivantes: {valves}", + "mappings": { + "0": { + "then": "Sclaverand (aussi appelé Presta)" + }, + "1": { + "then": "Dunlop" + }, + "2": { + "then": "Schrader (les valves de voitures)" + } + } + }, + "8": { + "question": "Est-ce que cette pompe est électrique?", + "mappings": { + "0": { + "then": "Pompe manuelle" + }, + "1": { + "then": "Pompe électrique" + } + } + }, + "9": { + "question": "Est-ce que la pompe à un manomètre integré?", + "mappings": { + "0": { + "then": "Il y a un manomètre" + }, + "1": { + "then": "Il n'y a pas de manomètre" + }, + "2": { + "then": "Il y a un manomètre mais il est cassé" + } + } + } + }, + "presets": { + "0": { + "title": "Pompe à vélo" + }, + "1": { + "title": "Point de réparation vélo avec pompe" + }, + "2": { + "title": "Point de réparation vélo sans pompe" + } + } + }, + "bike_shop": { + "name": "Magasin ou réparateur de vélo", + "title": { + "render": "Magasin ou réparateur de vélo", + "mappings": { + "0": { + "then": "Magasin de sport {name}" + }, + "3": { + "then": "Réparateur de vélo {name}" + }, + "4": { + "then": "Magasin de vélo {name}" + }, + "5": { + "then": "Magasin ou réparateur de vélo {name}" + } + } + }, + "tagRenderings": { + "2": { + "question": "Quel est le nom du magasin de vélo?", + "render": "Ce magasin s'appelle {name}" + }, + "3": { + "question": "Quel est le site internet de {name}?" + }, + "4": { + "question": "Quel est le nom de {name}?" + }, + "5": { + "question": "Quel est l'adresse email de {name}?" + }, + "9": { + "question": "Est-ce que ce magasin vend des vélos?", + "mappings": { + "0": { + "then": "Ce magasin vend des vélos" + }, + "1": { + "then": "Ce magasin ne vend pas de vélo" + } + } + }, + "10": { + "question": "Est-ce que ce magasin répare des vélos?", + "mappings": { + "0": { + "then": "Ce magasin répare des vélos" + }, + "1": { + "then": "Ce magasin ne répare pas les vélos" + }, + "2": { + "then": "Ce magasin ne répare seulement les vélos achetés là-bas" + }, + "3": { + "then": "Ce magasin ne répare seulement des marques spécifiques" + } + } + }, + "11": { + "question": "Est-ce ce magasin loue des vélos?", + "mappings": { + "0": { + "then": "Ce magasin loue des vélos" + }, + "1": { + "then": "Ce magasin ne loue pas de vélos" + } + } + }, + "12": { + "question": "Est-ce ce magasin vend des vélos d'occasion", + "mappings": { + "0": { + "then": "Ce magasin vend des vélos d'occasion" + }, + "1": { + "then": "Ce magasin ne vend pas de vélos d'occasion" + }, + "2": { + "then": "Ce magasin vend seulement des vélos d'occasion" + } + } + }, + "13": { + "question": "Est-ce que ce magasin offre une pompe en accès libre?", + "mappings": { + "0": { + "then": "Ce magasin offre une pompe en acces libre" + }, + "1": { + "then": "Ce magasin n'offre pas de pompe en libre accès" + } + } + }, + "14": { + "question": "Est-ce qu'il y a des outils pour réparer son vélo dans ce magasin?", + "mappings": { + "0": { + "then": "Ce magasin offre des outils pour réparer son vélo soi-même" + }, + "1": { + "then": "Ce magasin n'offre pas des outils pour réparer son vélo soi-même" + } + } + } + }, + "presets": { + "0": { + "title": "Magasin et réparateur de vélo" + } + } + }, + "bike_themed_object": { + "name": "Objet cycliste", + "title": { + "render": "Objet cycliste" + } + }, + "defibrillator": { + "name": "Défibrillateurs", + "title": { + "render": "Défibrillateur" + }, + "presets": { + "0": { + "title": "Défibrillateur" + } + }, + "tagRenderings": { + "1": { + "question": "Ce défibrillateur est-il disposé en intérieur ?", + "mappings": { + "0": { + "then": "Ce défibrillateur est en intérieur (dans un batiment)" + }, + "1": { + "then": "Ce défibrillateur est situé en extérieur" + } + } + }, + "2": { + "question": "Ce défibrillateur est-il librement accessible ?", + "render": "{access} accessible", + "mappings": { + "0": { + "then": "Librement accessible" + }, + "1": { + "then": "Librement accessible" + }, + "2": { + "then": "Réservé aux clients du lieu" + }, + "3": { + "then": "Non accessible au public (par exemple réservé au personnel, au propriétaire, ...)" + } + } + }, + "4": { + "question": "À quel étage est situé ce défibrillateur ?", + "render": "Ce défibrillateur est à l'étage {level}" + }, + "5": { + "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (dans la langue local)" + }, + "6": { + "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (en englais)" + }, + "7": { + "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (en français)" + }, + "11": { + "render": "Numéro de téléphone pour questions sur le défibrillateur: {phone}", + "question": "Quel est le numéro de téléphone pour questions sur le défibrillateur?" + } + } + }, + "drinking_water": { + "name": "Eau potable", + "title": { + "render": "Eau potable" + }, + "presets": { + "0": { + "title": "Eau potable" + } + } + }, + "public_bookcase": { + "name": "Microbibliothèque", + "description": "Une armoire ou une boite contenant des livres en libre accès", + "title": { + "render": "Microbibliothèque", + "mappings": { + "0": { + "then": "Microbibliothèque {name}" + } + } + }, + "presets": { + "0": { + "title": "Microbibliothèque" + } + }, + "tagRenderings": { + "1": { + "render": "Le nom de cette microbibliothèque est {name}", + "question": "Quel est le nom de cette microbibliothèque ?", + "mappings": { + "0": { + "then": "Cette microbibliothèque n'a pas de nom" + } + } + }, + "2": { + "render": "{capacity} livres rentrent dans cette microbibliothèque", + "question": "Combien de livre rentrent dans cette microbibliothèque ?" + }, + "3": { + "question": "Quel type de livres peuvent être trouvés dans cette microbibliothèque ?", + "mappings": { + "0": { + "then": "Livres pour enfants" + }, + "1": { + "then": "Livres pour les adultes" + }, + "2": { + "then": "Livres pour enfants et adultes également" + } + } + }, + "4": { + "question": "Cette microbiliothèque est-elle en extérieur ?", + "mappings": { + "0": { + "then": "Cette microbibliothèque est en intérieur" + }, + "1": { + "then": "Cette microbibliothèque est en extérieur" + }, + "2": { + "then": "Cette microbibliothèque est en extérieur" + } + } + }, + "5": { + "question": "Cette microbibliothèque est-elle librement accèssible ?", + "mappings": { + "0": { + "then": "Accèssible au public" + }, + "1": { + "then": "Accèssible aux clients" + } + } + }, + "6": { + "question": "Qui entretien cette microbibliothèque", + "render": "Entretenue par {operator}" + }, + "7": { + "question": "Cette microbibliothèque fait-elle partie d'un réseau/groupe ?", + "render": "Cette microbibliothèque fait partie du groupe {brand}", + "mappings": { + "0": { + "then": "Fait partie du réseau 'Little Free Library'" + }, + "1": { + "then": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe" + } + } + }, + "8": { + "render": "Cette microbibliothèque du réseau {brand} possède le numéro {ref}", + "question": "Quelle est le numéro de référence de cette microbibliothèque ?", + "mappings": { + "0": { + "then": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe" + } + } + }, + "9": { + "question": "Quand a été installée cette microbibliothèque ?", + "render": "Installée le {start_date}" + }, + "10": { + "render": "Plus d'info sur le site web", + "question": "Existe-t-il un site web avec plus d'information sur cette microbibliothèque ?" + } + } + }, + "sport_pitch": { + "name": "Terrains de sport", + "title": { + "render": "Terrain de sport" + }, + "description": "Un terrain de sport", + "tagRenderings": { + "1": { + "render": "Ici on joue au {sport}", + "question": "À quel sport peut-on jouer ici ?", + "mappings": { + "0": { + "then": "Ici on peut jouer au basket" + }, + "1": { + "then": "Ici on joue au foot" + }, + "2": { + "then": "C'est une table de ping-pong" + }, + "3": { + "then": "Ici on peut jouer au tennis" + }, + "4": { + "then": "Ici on peut jouer au korfbal" + }, + "5": { + "then": "Ici on peut jouer au basket" + } + } + }, + "2": { + "question": "De quelle surface est fait ce terrain de sport ?", + "render": "La surface est {surface}", + "mappings": { + "0": { + "then": "La surface est de l'herbe" + }, + "1": { + "then": "La surface est du sable" + }, + "2": { + "then": "La surface est des pavés" + }, + "3": { + "then": "La surface est de l'asphalte" + }, + "4": { + "then": "La surface est du béton" + } + } + }, + "3": { + "question": "Est-ce que ce terrain de sport est accessible au public ?", + "mappings": { + "0": { + "then": "Accessible au public" + }, + "1": { + "then": "Accès limité (par exemple uniquement sur réservation, à certains horaires, ...)" + }, + "2": { + "then": "Accessible uniquement aux membres du club" + }, + "3": { + "then": "Privé - Pas accessible au public" + } + } + }, + "4": { + "question": "Doit-on réserver pour utiliser ce terrain de sport ?", + "mappings": { + "0": { + "then": "Il est obligatoire de réserver pour utiliser ce terrain de sport" + }, + "1": { + "then": "Il est recommendé de réserver pour utiliser ce terrain de sport" + }, + "2": { + "then": "Il est possible de réserver, mais ce n'est pas nécéssaire pour utiliser ce terrain de sport" + }, + "3": { + "then": "On ne peux pas réserver" + } + } + }, + "5": { + "question": "Quel est le numéro de téléphone du gérant ?" + }, + "6": { + "question": "Quel est l'adresse courriel du gérant ?" + }, + "7": { + "question": "Quand ce terrain est-il accessible ?", + "mappings": { + "1": { + "then": "Accessible en permanence" + } + } + } + }, + "presets": { + "0": { + "title": "Table de ping-pong" + }, + "1": { + "title": "Terrain de sport" + } + } + }, + "toilet": { + "name": "Toilettes", + "title": { + "render": "Toilettes" + }, + "presets": { + "0": { + "title": "Toilettes", + "description": "Des toilettes" + }, + "1": { + "title": "Toilettes accessible aux personnes à mobilité réduite", + "description": "Toilettes avec au moins un WC accessible aux personnes à mobilité réduite" + } + }, + "tagRenderings": { + "1": { + "question": "Ces toilettes sont-elles accessibles publiquement ?", + "render": "L'accès est {access}", + "mappings": { + "0": { + "then": "Accès publique" + }, + "1": { + "then": "Accès réservé aux clients" + }, + "2": { + "then": "WC privés" + }, + "3": { + "then": "Accessible, mais vous devez demander la clé" + } + } + }, + "2": { + "question": "Ces toilettes sont-elles payantes", + "mappings": { + "0": { + "then": "Toilettes payantes" + }, + "1": { + "then": "Toilettes gratuites" + } + } + }, + "3": { + "question": "Quel est le prix d'accès de ces toilettes ?", + "render": "Le prix est {charge}" + }, + "4": { + "question": "Un WC réservé aux personnes à mobilité réduite est-il présent ?", + "mappings": { + "0": { + "then": "Il y a un WC réservé pour les personnes à mobilité réduite" + }, + "1": { + "then": "Non accessible aux personnes à mobilité réduite" + } + } + }, + "5": { + "question": "De quel type sont ces toilettes ?", + "mappings": { + "0": { + "then": "Il y a uniquement des WC assis" + }, + "1": { + "then": "Il y a uniquement des urinoirs" + }, + "2": { + "then": "Il y a uniquement des WC turques" + }, + "3": { + "then": "Il y a des WC assis et des urinoirs" + } + } + }, + "6": { + "question": "Ces WC disposent-ils d'une table à langer ?", + "mappings": { + "0": { + "then": "Une table à langer est disponible" + }, + "1": { + "then": "Aucune table à langer" + } + } + }, + "7": { + "question": "Où se situe la table à langer ?", + "render": "Emplacement de la table à langer : {changing_table:location}", + "mappings": { + "0": { + "then": "La table à langer se situe dans les WC pour femmes. " + }, + "1": { + "then": "La table à langer se situe dans les WC pour hommes. " + }, + "2": { + "then": "La table à langer se situe dans les WC pour personnes à mobilité réduite. " + }, + "3": { + "then": "La table à langer se situe dans un espace dédié. " + } + } + } + } + } +} \ No newline at end of file diff --git a/langs/layers/gl.json b/langs/layers/gl.json new file mode 100644 index 0000000000..39c2861350 --- /dev/null +++ b/langs/layers/gl.json @@ -0,0 +1,382 @@ +{ + "bike_cafe": { + "name": "Café de ciclistas", + "title": { + "render": "Café de ciclistas", + "mappings": { + "0": { + "then": "Café de ciclistas {name}" + } + } + }, + "tagRenderings": { + "1": { + "question": "Cal é o nome deste café de ciclistas?", + "render": "Este café de ciclistas chámase {name}" + }, + "2": { + "question": "Este café de ciclistas ofrece unha bomba de ar para que calquera persoa poida usala?", + "mappings": { + "0": { + "then": "Este café de ciclistas ofrece unha bomba de ar" + }, + "1": { + "then": "Este café de ciclistas non ofrece unha bomba de ar" + } + } + }, + "3": { + "question": "Hai ferramentas aquí para arranxar a túa propia bicicleta?", + "mappings": { + "0": { + "then": "Hai ferramentas aquí para arranxar a túa propia bicicleta" + }, + "1": { + "then": "Non hai ferramentas aquí para arranxar a túa propia bicicleta" + } + } + }, + "4": { + "question": "Este café de ciclistas arranxa bicicletas?", + "mappings": { + "0": { + "then": "Este café de ciclistas arranxa bicicletas" + }, + "1": { + "then": "Este café de ciclistas non arranxa bicicletas" + } + } + }, + "5": { + "question": "Cal é a páxina web de {name}?" + }, + "6": { + "question": "Cal é o número de teléfono de {name}?" + }, + "7": { + "question": "Cal é o enderezo de correo electrónico de {name}?" + } + }, + "presets": { + "0": { + "title": "Café de ciclistas" + } + } + }, + "bike_parking": { + "name": "Aparcadoiro de bicicletas", + "presets": { + "0": { + "title": "Aparcadoiro de bicicletas" + } + }, + "title": { + "render": "Aparcadoiro de bicicletas" + }, + "tagRenderings": { + "1": { + "question": "Que tipo de aparcadoiro de bicicletas é?", + "render": "Este é un aparcadoiro de bicicletas do tipo: {bicycle_parking}", + "mappings": { + "0": { + "then": "De roda (Stands) " + }, + "1": { + "then": "Aros " + }, + "2": { + "then": "Cadeado para guiador " + }, + "3": { + "then": "Cremalleira " + }, + "4": { + "then": "Dobre cremalleira " + }, + "5": { + "then": "Abeiro " + } + } + }, + "3": { + "question": "Este aparcadoiro está cuberto? Tamén escolle \"cuberto\" para aparcadoiros interiores.", + "mappings": { + "0": { + "then": "Este aparcadoiro está cuberto (ten un teito)" + }, + "1": { + "then": "Este aparcadoiro non está cuberto" + } + } + }, + "4": { + "question": "Cantas bicicletas caben neste aparcadoiro de bicicletas (incluídas as posíbeis bicicletas de carga)?", + "render": "Lugar para {capacity} bicicletas" + }, + "6": { + "question": "Este aparcadoiro de bicicletas ten espazo para bicicletas de carga?", + "mappings": { + "0": { + "then": "Este aparcadoiro ten espazo para bicicletas de carga." + }, + "1": { + "then": "Este aparcadoiro ten espazos designados (oficiais) para bicicletas de carga." + }, + "2": { + "then": "Non está permitido aparcar bicicletas de carga" + } + } + }, + "7": { + "question": "Cantas bicicletas de carga caben neste aparcadoiro de bicicletas?", + "render": "Neste aparcadoiro caben {capacity:cargo_bike} bicicletas de carga" + } + } + }, + "bike_repair_station": { + "name": "Estación de bicicletas (arranxo, bomba de ar ou ambos)", + "title": { + "render": "Estación de bicicletas (arranxo e bomba de ar)", + "mappings": { + "0": { + "then": "Estación de arranxo de bicicletas" + }, + "1": { + "then": "Estación de arranxo de bicicletas" + }, + "2": { + "then": "Bomba de ar estragada" + }, + "3": { + "then": "Bomba de ar {name}" + }, + "4": { + "then": "Bomba de ar" + } + } + }, + "tagRenderings": { + "1": { + "question": "Que servizos están dispoñíbeis nesta estación de bicicletas?", + "mappings": { + "0": { + "then": "Só hai unha bomba de ar presente" + }, + "1": { + "then": "Só hai ferramentas (desaparafusadores, alicates...) presentes" + }, + "2": { + "then": "Hai ferramentas e unha bomba de ar presentes" + } + } + }, + "4": { + "question": "Esta estación de arranxo de bicicletas ten unha ferramenta especial para arranxar a cadea da túa bicicleta?", + "mappings": { + "0": { + "then": "Hai unha ferramenta para a cadea" + }, + "1": { + "then": "Non hai unha ferramenta para a cadea" + } + } + }, + "5": { + "question": "Esta estación de bicicletas ten un guindastre para pendurar a túa bicicleta ou un soporte para elevala?", + "mappings": { + "0": { + "then": "Hai un guindastre ou soporte" + }, + "1": { + "then": "Non hai un guindastre ou soporte" + } + } + }, + "6": { + "question": "Segue a funcionar a bomba de ar?", + "mappings": { + "0": { + "then": "A bomba de ar está estragada" + }, + "1": { + "then": "A bomba de ar está operativa" + } + } + }, + "7": { + "question": "Que válvulas son compatíbeis?", + "render": "Esta bomba de ar admite as seguintes válvulas: {valves}", + "mappings": { + "0": { + "then": "Sclaverand (tamén coñecido como Presta)" + }, + "1": { + "then": "Dunlop" + }, + "2": { + "then": "Schrader (para automóbiles)" + } + } + }, + "8": { + "question": "Esta é unha bomba de ar eléctrica?", + "mappings": { + "0": { + "then": "Bomba de ar manual" + }, + "1": { + "then": "Bomba de ar eléctrica" + } + } + }, + "9": { + "question": "Ten a bomba de ar un indicador de presión ou un manómetro?", + "mappings": { + "0": { + "then": "Hai manómetro" + }, + "1": { + "then": "Non hai manómetro" + }, + "2": { + "then": "Hai manómetro pero está estragado" + } + } + } + }, + "presets": { + "0": { + "title": "Bomba de ar" + }, + "1": { + "title": "Estación de arranxo de bicicletas con bomba de ar" + }, + "2": { + "title": "Estación de arranxo de bicicletas sin bomba de ar" + } + } + }, + "bike_shop": { + "name": "Tenda/arranxo de bicicletas", + "title": { + "render": "Tenda/arranxo de bicicletas", + "mappings": { + "3": { + "then": "Arranxo de bicicletas {name}" + }, + "4": { + "then": "Tenda de bicicletas {name}" + }, + "5": { + "then": "Tenda/arranxo de bicicletas {name}" + } + } + }, + "tagRenderings": { + "2": { + "question": "Cal é o nome desta tenda de bicicletas?", + "render": "Esta tenda de bicicletas chámase {name}" + }, + "3": { + "question": "Cal é a páxina web de {name}?" + }, + "4": { + "question": "Cal é o número de teléfono de {name}?" + }, + "5": { + "question": "Cal é o enderezo de correo electrónico de {name}?" + }, + "9": { + "question": "Esta tenda vende bicicletas?", + "mappings": { + "0": { + "then": "Esta tenda vende bicicletas" + }, + "1": { + "then": "Esta tenda non vende bicicletas" + } + } + }, + "10": { + "question": "Esta tenda arranxa bicicletas?", + "mappings": { + "0": { + "then": "Esta tenda arranxa bicicletas" + }, + "1": { + "then": "Esta tenda non arranxa bicicletas" + }, + "2": { + "then": "Esta tenda só arranxa bicicletas mercadas aquí" + }, + "3": { + "then": "Esta tenda só arranxa bicicletas dunha certa marca" + } + } + }, + "11": { + "question": "Esta tenda aluga bicicletas?", + "mappings": { + "0": { + "then": "Esta tenda aluga bicicletas" + }, + "1": { + "then": "Esta tenda non aluga bicicletas" + } + } + }, + "12": { + "question": "Esta tenda vende bicicletas de segunda man?", + "mappings": { + "0": { + "then": "Esta tenda vende bicicletas de segunda man" + }, + "1": { + "then": "Esta tenda non vende bicicletas de segunda man" + }, + "2": { + "then": "Esta tenda só vende bicicletas de segunda man" + } + } + }, + "13": { + "question": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa?", + "mappings": { + "0": { + "then": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa" + }, + "1": { + "then": "Esta tenda non ofrece unha bomba de ar para uso de calquera persoa" + } + } + }, + "14": { + "question": "Hai ferramentas aquí para arranxar a túa propia bicicleta?", + "mappings": { + "0": { + "then": "Hai ferramentas aquí para arranxar a túa propia bicicleta" + }, + "1": { + "then": "Non hai ferramentas aquí para arranxar a túa propia bicicleta" + } + } + } + }, + "presets": { + "0": { + "title": "Tenda/arranxo de bicicletas" + } + } + }, + "drinking_water": { + "name": "Auga potábel", + "title": { + "render": "Auga potábel" + }, + "presets": { + "0": { + "title": "Auga potábel" + } + } + } +} \ No newline at end of file diff --git a/langs/layers/nl.json b/langs/layers/nl.json new file mode 100644 index 0000000000..780fb9260e --- /dev/null +++ b/langs/layers/nl.json @@ -0,0 +1,1732 @@ +{ + "bicycle_library": { + "name": "Fietsbibliotheek", + "title": { + "render": "Fietsbibliotheek" + }, + "description": "Een plaats waar men voor langere tijd een fiets kan lenen", + "tagRenderings": { + "1": { + "question": "Wat is de naam van deze fietsbieb?", + "render": "Deze fietsbieb heet {name}" + }, + "6": { + "question": "Hoeveel kost het huren van een fiets?", + "render": "Een fiets huren kost {charge}", + "mappings": { + "0": { + "then": "Een fiets huren is gratis" + }, + "1": { + "then": "Een fiets huren kost €20/jaar en €20 waarborg" + } + } + }, + "7": { + "question": "Voor wie worden hier fietsen aangeboden?", + "mappings": { + "0": { + "then": "Aanbod voor kinderen" + }, + "1": { + "then": "Aanbod voor volwassenen" + }, + "2": { + "then": "Aanbod voor personen met een handicap" + } + } + } + }, + "presets": { + "0": { + "title": "Bicycle library", + "description": "Een fietsbieb heeft een collectie fietsen die leden mogen lenen" + } + } + }, + "bike_cafe": { + "name": "Fietscafé", + "title": { + "render": "Fietscafé", + "mappings": { + "0": { + "then": "Fietscafé {name}" + } + } + }, + "tagRenderings": { + "1": { + "question": "Wat is de naam van dit fietscafé?", + "render": "Dit fietscafé heet {name}" + }, + "2": { + "question": "Biedt dit fietscafé een fietspomp aan voor iedereen?", + "mappings": { + "0": { + "then": "Dit fietscafé biedt een fietspomp aan voor eender wie" + }, + "1": { + "then": "Dit fietscafé biedt geen fietspomp aan voor iedereen" + } + } + }, + "3": { + "question": "Biedt dit fietscafé gereedschap aan om je fiets zelf te herstellen?", + "mappings": { + "0": { + "then": "Dit fietscafé biedt gereedschap aan om je fiets zelf te herstellen" + }, + "1": { + "then": "Dit fietscafé biedt geen gereedschap aan om je fiets zelf te herstellen" + } + } + }, + "4": { + "question": "Herstelt dit fietscafé fietsen?", + "mappings": { + "0": { + "then": "Dit fietscafé herstelt fietsen" + }, + "1": { + "then": "Dit fietscafé herstelt geen fietsen" + } + } + }, + "5": { + "question": "Wat is de website van {name}?" + }, + "6": { + "question": "Wat is het telefoonnummer van {name}?" + }, + "7": { + "question": "Wat is het email-adres van {name}?" + }, + "8": { + "question": "Wanneer is dit fietscafé geopend?" + } + }, + "presets": { + "0": { + "title": "Fietscafé" + } + } + }, + "bike_cleaning": { + "name": "Fietsschoonmaakpunt", + "title": { + "render": "Fietsschoonmaakpunt", + "mappings": { + "0": { + "then": "Fietsschoonmaakpunt {name}" + } + } + }, + "presets": { + "0": { + "title": "Fietsschoonmaakpunt" + } + } + }, + "bike_monitoring_station": { + "title": { + "render": "Fietstelstation", + "mappings": { + "0": { + "then": "Fietstelstation {name}" + }, + "1": { + "then": "Fietstelstation {ref}" + } + } + } + }, + "bike_parking": { + "name": "Fietsparking", + "presets": { + "0": { + "title": "Fietsparking" + } + }, + "title": { + "render": "Fietsparking" + }, + "tagRenderings": { + "1": { + "question": "Van welk type is deze fietsparking?", + "render": "Dit is een fietsparking van het type: {bicycle_parking}", + "mappings": { + "0": { + "then": "Nietjes " + }, + "1": { + "then": "Wielrek/lussen " + }, + "2": { + "then": "Stuurhouder " + }, + "3": { + "then": "Rek " + }, + "4": { + "then": "Dubbel (twee verdiepingen) " + }, + "5": { + "then": "Schuur " + }, + "6": { + "then": "Paal met ring " + }, + "7": { + "then": "Een oppervlakte die gemarkeerd is om fietsen te parkeren" + } + } + }, + "2": { + "question": "Wat is de relatieve locatie van deze parking??", + "mappings": { + "0": { + "then": "Ondergrondse parking" + }, + "1": { + "then": "Ondergrondse parking" + }, + "2": { + "then": "Parking op de begane grond" + }, + "3": { + "then": "Parking op de begane grond" + }, + "4": { + "then": "Dakparking" + } + } + }, + "3": { + "question": "Is deze parking overdekt? Selecteer ook \"overdekt\" voor fietsparkings binnen een gebouw.", + "mappings": { + "0": { + "then": "Deze parking is overdekt (er is een afdak)" + }, + "1": { + "then": "Deze parking is niet overdekt" + } + } + }, + "4": { + "question": "Hoeveel fietsen kunnen in deze fietsparking (inclusief potentiëel bakfietsen)?", + "render": "Plaats voor {capacity} fietsen" + }, + "5": { + "question": "Wie mag er deze fietsenstalling gebruiken?", + "mappings": { + "0": { + "then": "Publiek toegankelijke fietsenstalling" + }, + "1": { + "then": "Klanten van de zaak of winkel" + }, + "2": { + "then": "Private fietsenstalling van een school, een bedrijf, ..." + } + } + }, + "6": { + "question": "Heeft deze fietsparking plaats voor bakfietsen?", + "mappings": { + "0": { + "then": "Deze parking heeft plaats voor bakfietsen" + }, + "1": { + "then": "Er zijn speciale plaatsen voorzien voor bakfietsen" + }, + "2": { + "then": "Je mag hier geen bakfietsen parkeren" + } + } + }, + "7": { + "question": "Voor hoeveel bakfietsen heeft deze fietsparking plaats?", + "render": "Deze parking heeft plaats voor {capacity:cargo_bike} fietsen" + } + } + }, + "bike_repair_station": { + "name": "Fietspunten (herstel, pomp of allebei)", + "title": { + "render": "Herstelpunt met pomp", + "mappings": { + "0": { + "then": "Herstelpunt" + }, + "1": { + "then": "Herstelpunt" + }, + "2": { + "then": "Kapotte fietspomp" + }, + "3": { + "then": "Fietspomp {name}" + }, + "4": { + "then": "Fietspomp" + } + } + }, + "tagRenderings": { + "1": { + "question": "Welke functies biedt dit fietspunt?", + "mappings": { + "0": { + "then": "Er is enkel een pomp aanwezig" + }, + "1": { + "then": "Er is enkel gereedschap aanwezig (schroevendraaier, tang...)" + }, + "2": { + "then": "Er is zowel een pomp als gereedschap aanwezig" + } + } + }, + "2": { + "question": "Wie beheert deze fietspomp?", + "render": "Beheer door {operator}" + }, + "3": { + "question": "Wanneer is dit fietsherstelpunt open?", + "mappings": { + "0": { + "then": "Dag en nacht open" + }, + "1": { + "then": "Dag en nacht open" + } + } + }, + "4": { + "question": "Heeft dit herstelpunt een speciale reparatieset voor je ketting?", + "mappings": { + "0": { + "then": "Er is een reparatieset voor je ketting" + }, + "1": { + "then": "Er is geen reparatieset voor je ketting" + } + } + }, + "5": { + "question": "Heeft dit herstelpunt een haak of standaard om je fiets op te hangen/zetten?", + "mappings": { + "0": { + "then": "Er is een haak of standaard" + }, + "1": { + "then": "Er is geen haak of standaard" + } + } + }, + "6": { + "question": "Werkt de fietspomp nog?", + "mappings": { + "0": { + "then": "De fietspomp is kapot" + }, + "1": { + "then": "De fietspomp werkt nog" + } + } + }, + "7": { + "question": "Welke ventielen werken er met de pomp?", + "render": "Deze pomp werkt met de volgende ventielen: {valves}", + "mappings": { + "0": { + "then": "Sclaverand (ook gekend als Presta)" + }, + "1": { + "then": "Dunlop" + }, + "2": { + "then": "Schrader (auto's)" + } + } + }, + "8": { + "question": "Is dit een electrische fietspomp?", + "mappings": { + "0": { + "then": "Manuele pomp" + }, + "1": { + "then": "Electrische pomp" + } + } + }, + "9": { + "question": "Heeft deze pomp een luchtdrukmeter?", + "mappings": { + "0": { + "then": "Er is een luchtdrukmeter" + }, + "1": { + "then": "Er is geen luchtdrukmeter" + }, + "2": { + "then": "Er is een luchtdrukmeter maar die is momenteel defect" + } + } + } + }, + "presets": { + "0": { + "title": "Fietspomp", + "description": "Een apparaat waar je je fietsbanden kan oppompen, beschikbaar in de publieke ruimte. De fietspomp in je kelder telt dus niet.

Voorbeelden

Examples of bicycle pumps

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

Voorbeeld

" + }, + "2": { + "title": "Herstelpunt zonder pomp" + } + } + }, + "bike_shop": { + "name": "Fietszaak", + "title": { + "render": "Fietszaak", + "mappings": { + "0": { + "then": "Sportwinkel {name}" + }, + "2": { + "then": "Fietsverhuur {name}" + }, + "3": { + "then": "Fietsenmaker {name}" + }, + "4": { + "then": "Fietswinkel {name}" + }, + "5": { + "then": "Fietszaak {name}" + } + } + }, + "description": "Een winkel die hoofdzakelijk fietsen en fietstoebehoren verkoopt", + "tagRenderings": { + "1": { + "render": "Deze winkel verkoopt {shop} en heeft fiets-gerelateerde activiteiten." + }, + "2": { + "question": "Wat is de naam van deze fietszaak?", + "render": "Deze fietszaak heet {name}" + }, + "3": { + "question": "Wat is de website van {name}?" + }, + "4": { + "question": "Wat is het telefoonnummer van {name}?" + }, + "5": { + "question": "Wat is het email-adres van {name}?" + }, + "9": { + "question": "Verkoopt deze fietszaak fietsen?", + "mappings": { + "0": { + "then": "Deze winkel verkoopt fietsen" + }, + "1": { + "then": "Deze winkel verkoopt geen fietsen" + } + } + }, + "10": { + "question": "Herstelt deze winkel fietsen?", + "mappings": { + "0": { + "then": "Deze winkel herstelt fietsen" + }, + "1": { + "then": "Deze winkel herstelt geen fietsen" + }, + "2": { + "then": "Deze winkel herstelt enkel fietsen die hier werden gekocht" + }, + "3": { + "then": "Deze winkel herstelt enkel fietsen van een bepaald merk" + } + } + }, + "11": { + "question": "Verhuurt deze winkel fietsen?", + "mappings": { + "0": { + "then": "Deze winkel verhuurt fietsen" + }, + "1": { + "then": "Deze winkel verhuurt geen fietsen" + } + } + }, + "12": { + "question": "Verkoopt deze winkel tweedehands fietsen?", + "mappings": { + "0": { + "then": "Deze winkel verkoopt tweedehands fietsen" + }, + "1": { + "then": "Deze winkel verkoopt geen tweedehands fietsen" + }, + "2": { + "then": "Deze winkel verkoopt enkel tweedehands fietsen" + } + } + }, + "13": { + "question": "Biedt deze winkel een fietspomp aan voor iedereen?", + "mappings": { + "0": { + "then": "Deze winkel biedt een fietspomp aan voor iedereen" + }, + "1": { + "then": "Deze winkel biedt geen fietspomp aan voor eender wie" + }, + "2": { + "then": "Er is een fietspomp, deze is apart aangeduid" + } + } + }, + "14": { + "question": "Biedt deze winkel gereedschap aan om je fiets zelf te herstellen?", + "mappings": { + "0": { + "then": "Deze winkel biedt gereedschap aan om je fiets zelf te herstellen" + }, + "1": { + "then": "Deze winkel biedt geen gereedschap aan om je fiets zelf te herstellen" + }, + "2": { + "then": "Het gereedschap aan om je fiets zelf te herstellen is enkel voor als je de fiets er kocht of huurt" + } + } + }, + "15": { + "question": "Biedt deze winkel een fietsschoonmaak aan?", + "mappings": { + "0": { + "then": "Deze winkel biedt fietsschoonmaak aan" + }, + "1": { + "then": "Deze winkel biedt een installatie aan om zelf je fiets schoon te maken" + }, + "2": { + "then": "Deze winkel biedt geen fietsschoonmaak aan" + } + } + } + }, + "presets": { + "0": { + "title": "Fietszaak" + } + } + }, + "bike_themed_object": { + "name": "Fietsgerelateerd object", + "title": { + "render": "Fietsgerelateerd object", + "mappings": { + "1": { + "then": "Wielerpiste" + } + } + } + }, + "birdhide": { + "name": "Vogelkijkhutten", + "title": { + "render": "Vogelkijkplaats", + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "Vogelkijkhut {name}" + }, + "2": { + "then": "Vogelkijkwand {name}" + } + } + }, + "description": "Een vogelkijkhut", + "tagRenderings": { + "1": { + "question": "Is dit een kijkwand of kijkhut?", + "mappings": { + "0": { + "then": "Vogelkijkwand" + }, + "1": { + "then": "Vogelkijkhut" + }, + "2": { + "then": "Vogelkijkhut" + } + } + }, + "2": { + "question": "Is deze vogelkijkplaats rolstoeltoegankelijk?", + "mappings": { + "0": { + "then": "Er zijn speciale voorzieningen voor rolstoelen" + }, + "1": { + "then": "Een rolstoel raakt er vlot" + }, + "2": { + "then": "Je kan er raken met een rolstoel, maar het is niet makkelijk" + }, + "3": { + "then": "Niet rolstoeltoegankelijk" + } + } + }, + "3": { + "render": "Beheer door {operator}", + "question": "Wie beheert deze vogelkijkplaats?", + "mappings": { + "0": { + "then": "Beheer door Natuurpunt" + }, + "1": { + "then": "Beheer door het Agentschap Natuur en Bos " + } + } + } + }, + "icon": { + "render": "./assets/layers/birdhide/birdhide.svg" + }, + "size": { + "render": "40,40,center" + }, + "color": { + "render": "#94bb28" + }, + "stroke": { + "render": "3" + }, + "presets": { + "0": { + "title": "Vogelkijkhut", + "description": "Een overdekte hut waarbinnen er warm en droog naar vogels gekeken kan worden" + }, + "1": { + "title": "Vogelkijkwand", + "description": "Een vogelkijkwand waarachter men kan staan om vogels te kijken" + } + } + }, + "defibrillator": { + "name": "Defibrillatoren", + "title": { + "render": "Defibrillator" + }, + "presets": { + "0": { + "title": "Defibrillator" + } + }, + "tagRenderings": { + "1": { + "question": "Hangt deze defibrillator binnen of buiten?", + "mappings": { + "0": { + "then": "Deze defibrillator bevindt zich in een gebouw" + }, + "1": { + "then": "Deze defibrillator hangt buiten" + } + } + }, + "2": { + "question": "Is deze defibrillator vrij toegankelijk?", + "render": "Toegankelijkheid is {access}", + "mappings": { + "0": { + "then": "Publiek toegankelijk" + }, + "1": { + "then": "Publiek toegankelijk" + }, + "2": { + "then": "Enkel toegankelijk voor klanten" + }, + "3": { + "then": "Niet toegankelijk voor het publiek (bv. enkel voor personneel, de eigenaar, ...)" + }, + "4": { + "then": "Niet toegankelijk, mogelijk enkel voor professionals" + } + } + }, + "3": { + "render": "Er is geen info over het soort toestel", + "question": "Is dit een gewone automatische defibrillator of een manueel toestel enkel voor professionals?", + "mappings": { + "0": { + "then": "Dit is een manueel toestel enkel voor professionals" + }, + "1": { + "then": "Dit is een gewone automatische defibrillator" + } + } + }, + "4": { + "question": "Op welke verdieping bevindt deze defibrillator zich?", + "render": "De defibrillator bevindt zicht op verdieping {level}", + "mappings": { + "0": { + "then": "Deze defibrillator bevindt zich gelijkvloers" + }, + "1": { + "then": "Deze defibrillator is op de eerste verdieping" + } + } + }, + "5": { + "render": "Meer informatie over de locatie (lokale taal):
{defibrillator:location}", + "question": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in de plaatselijke taal)" + }, + "6": { + "render": "Meer informatie over de locatie (in het Engels):
{defibrillator:location:en}", + "question": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in het Engels)" + }, + "7": { + "render": "Meer informatie over de locatie (in het Frans):
{defibrillator:location:fr}", + "question": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in het Frans)" + }, + "8": { + "question": "Is deze defibrillator rolstoeltoegankelijk?", + "mappings": { + "0": { + "then": "Deze defibrillator is speciaal aangepast voor gebruikers van een rolstoel" + }, + "1": { + "then": "Deze defibrillator is vlot bereikbaar met een rolstoel" + }, + "2": { + "then": "Je kan er raken met een rolstoel, maar het is niet makkelijk" + }, + "3": { + "then": "Niet rolstoeltoegankelijk" + } + } + }, + "9": { + "render": "Officieel identificatienummer van het toestel: {ref}", + "question": "Wat is het officieel identificatienummer van het toestel? (indien zichtbaar op toestel)" + }, + "10": { + "render": "Email voor vragen over deze defibrillator: {email}", + "question": "Wat is het email-adres voor vragen over deze defibrillator" + }, + "11": { + "render": "Telefoonnummer voor vragen over deze defibrillator: {phone}", + "question": "Wat is het telefoonnummer voor vragen over deze defibrillator" + }, + "12": { + "render": "{opening_hours_table(opening_hours)}", + "question": "Wanneer is deze defibrillator beschikbaar?", + "mappings": { + "0": { + "then": "24/7 open (inclusief feestdagen)" + } + } + }, + "13": { + "render": "Aanvullende info: {description}", + "question": "Is er nog iets bijzonder aan deze defibrillator dat je nog niet hebt kunnen meegeven? (laat leeg indien niet)" + }, + "14": { + "question": "Wanneer is deze defibrillator het laatst gecontroleerd in OpenStreetMap?", + "render": "Deze defibrillator is nagekeken in OSM op {survey:date}", + "mappings": { + "0": { + "then": "Vandaag nagekeken!" + } + } + }, + "15": { + "render": "Extra informatie voor OpenStreetMap experts: {fixme}", + "question": "Is er iets mis met de informatie over deze defibrillator dat je hier niet opgelost kreeg? (laat hier een berichtje achter voor OpenStreetMap experts)" + } + } + }, + "direction": { + "name": "Richtingsvisualisatie", + "description": "Deze laag toont de oriëntatie van een object" + }, + "drinking_water": { + "name": "Drinkbaar water", + "title": { + "render": "Drinkbaar water" + }, + "presets": { + "0": { + "title": "Drinkbaar water" + } + }, + "tagRenderings": { + "1": { + "question": "Is deze drinkwaterkraan nog steeds werkende?", + "render": "Deze waterkraan-status is {operational_status}", + "mappings": { + "0": { + "then": "Deze drinkwaterfontein werkt" + }, + "1": { + "then": "Deze drinkwaterfontein is kapot" + }, + "2": { + "then": "Deze drinkwaterfontein is afgesloten" + } + } + }, + "2": { + "question": "Hoe gemakkelijk is het om drinkbussen bij te vullen?", + "mappings": { + "0": { + "then": "Een drinkbus bijvullen gaat makkelijk" + }, + "1": { + "then": "Een drinkbus past moeilijk" + } + } + }, + "3": { + "render": "Er bevindt zich een ander drinkwaterpunt op {_closest_other_drinking_water_distance} meter" + } + } + }, + "ghost_bike": { + "name": "Witte Fietsen", + "title": { + "render": "Witte Fiets", + "mappings": { + "0": { + "then": "Witte fiets ter nagedachtenis van {name}" + } + } + }, + "presets": { + "0": { + "title": "Witte fiets" + } + }, + "tagRenderings": { + "0": { + "render": "Een Witte Fiets (of Spookfiets) is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat over een witgeschilderde fiets die geplaatst werd in de buurt van het ongeval." + }, + "2": { + "question": "Aan wie is deze witte fiets een eerbetoon?
Respecteer privacy - voeg enkel een naam toe indien die op de fiets staat of gepubliceerd is. Eventueel voeg je enkel de voornaam toe.
", + "render": "Ter nagedachtenis van {name}", + "mappings": { + "0": { + "then": "De naam is niet aangeduid op de fiets" + } + } + }, + "3": { + "question": "Op welke website kan men meer informatie vinden over de Witte fiets of over het ongeval?", + "render": "Meer informatie" + }, + "4": { + "question": "Wat is het opschrift op deze witte fiets?", + "render": "{inscription}" + }, + "5": { + "question": "Wanneer werd deze witte fiets geplaatst?", + "render": "Geplaatst op {start_date}" + } + } + }, + "grass_in_parks": { + "name": "Toegankelijke grasvelden in parken", + "title": { + "render": "Speelweide in een park", + "mappings": { + "0": { + "then": "{name}" + } + } + } + }, + "information_board": { + "name": "Informatieborden", + "title": { + "render": "Informatiebord" + }, + "presets": { + "0": { + "title": "Informatiebord" + } + } + }, + "map": { + "name": "Kaarten", + "title": { + "render": "Kaart" + }, + "description": "Een permantent geinstalleerde kaart", + "tagRenderings": { + "1": { + "question": "Op welke data is deze kaart gebaseerd?", + "mappings": { + "0": { + "then": "Deze kaart is gebaseerd op OpenStreetMap" + } + }, + "render": "Deze kaart is gebaseerd op {map_source}" + }, + "2": { + "question": "Is de attributie voor OpenStreetMap aanwezig?", + "mappings": { + "0": { + "then": "De OpenStreetMap-attributie is duidelijk aangegeven, zelf met vermelding van \"ODBL\" " + }, + "1": { + "then": "OpenStreetMap is duidelijk aangegeven, maar de licentievermelding ontbreekt" + }, + "2": { + "then": "OpenStreetMap was oorspronkelijk niet aangeduid, maar iemand plaatste er een sticker" + }, + "3": { + "then": "Er is geen attributie" + }, + "4": { + "then": "Er is geen attributie" + } + } + } + }, + "presets": { + "0": { + "title": "Kaart", + "description": "Voeg een ontbrekende kaart toe" + } + } + }, + "nature_reserve": { + "name": "Natuurgebied", + "title": { + "render": "Natuurgebied", + "mappings": { + "0": { + "then": "{name:nl}" + }, + "1": { + "then": "{name}" + } + } + }, + "description": "Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid.", + "tagRenderings": { + "1": { + "render": "De toegankelijkheid van dit gebied is: {access:description}", + "question": "Is dit gebied toegankelijk?", + "mappings": { + "0": { + "then": "Vrij toegankelijk" + }, + "1": { + "then": "Niet toegankelijk" + }, + "2": { + "then": "Niet toegankelijk, want privégebied" + }, + "3": { + "then": "Toegankelijk, ondanks dat het privegebied is" + }, + "4": { + "then": "Enkel toegankelijk met een gids of tijdens een activiteit" + }, + "5": { + "then": "Toegankelijk mits betaling" + } + } + }, + "2": { + "render": "Beheer door {operator}", + "question": "Wie beheert dit gebied?", + "mappings": { + "0": { + "then": "Dit gebied wordt beheerd door Natuurpunt" + }, + "1": { + "then": "Dit gebied wordt beheerd door {operator}" + }, + "2": { + "then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos" + } + } + }, + "3": { + "render": "Dit gebied heet {name:nl}", + "question": "Wat is de Nederlandstalige naam van dit gebied?" + }, + "4": { + "render": "Dit gebied heet {name}", + "question": "Wat is de naam van dit gebied?", + "mappings": { + "0": { + "then": "Dit gebied heeft geen naam" + } + } + }, + "5": { + "question": "Zijn honden toegelaten in dit gebied?", + "mappings": { + "0": { + "then": "Honden moeten aan de leiband" + }, + "1": { + "then": "Honden zijn niet toegestaan" + }, + "2": { + "then": "Honden zijn welkom en mogen vrij rondlopen" + } + } + }, + "6": { + "question": "Op welke webpagina kan men meer informatie vinden over dit natuurgebied?" + }, + "7": { + "question": "Wie is de conservator van dit gebied?
Respecteer privacy - geef deze naam enkel als die duidelijk is gepubliceerd", + "render": "{curator} is de beheerder van dit gebied" + }, + "8": { + "question": "Waar kan men naartoe emailen voor vragen en meldingen van dit natuurgebied?
Respecteer privacy - geef enkel persoonlijke emailadressen als deze elders zijn gepubliceerd", + "render": "{email}" + }, + "9": { + "question": "Waar kan men naartoe bellen voor vragen en meldingen van dit natuurgebied?
Respecteer privacy - geef enkel persoonlijke telefoonnummers als deze elders zijn gepubliceerd", + "render": "{phone}" + }, + "10": { + "render": "Extra info: {description}" + }, + "11": { + "render": "Extra info: {description:0}" + }, + "12": { + "render": "Totale oppervlakte: {_surface:ha}Ha" + } + }, + "presets": { + "0": { + "title": "Natuurreservaat", + "description": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt" + } + } + }, + "picnic_table": { + "name": "Picnictafels", + "title": { + "render": "Picnictafel" + }, + "description": "Deze laag toont picnictafels", + "tagRenderings": { + "0": { + "question": "Van welk materiaal is deze picnictafel gemaakt?", + "render": "Deze picnictafel is gemaakt van {material}", + "mappings": { + "0": { + "then": "Deze picnictafel is gemaakt uit hout" + }, + "1": { + "then": "Deze picnictafel is gemaakt uit beton" + } + } + } + }, + "presets": { + "0": { + "title": "Picnic-tafel" + } + } + }, + "play_forest": { + "name": "Speelbossen", + "title": { + "render": "Speelbos", + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "Speelbos {name}" + } + } + }, + "description": "Een speelbos is een vrij toegankelijke zone in een bos" + }, + "playground": { + "name": "Speeltuinen", + "description": "Speeltuinen", + "title": { + "render": "Speeltuin", + "mappings": { + "0": { + "then": "Speeltuin {name}" + } + } + }, + "tagRenderings": { + "1": { + "question": "Wat is de ondergrond van deze speeltuin?
Indien er verschillende ondergronden zijn, neem de meest voorkomende", + "render": "De ondergrond is {surface}", + "mappings": { + "0": { + "then": "De ondergrond is gras" + }, + "1": { + "then": "De ondergrond is zand" + }, + "2": { + "then": "De ondergrond bestaat uit houtsnippers" + }, + "3": { + "then": "De ondergrond bestaat uit stoeptegels" + }, + "4": { + "then": "De ondergrond is asfalt" + }, + "5": { + "then": "De ondergrond is beton" + }, + "6": { + "then": "De ondergrond is onverhard" + }, + "7": { + "then": "De ondergrond is verhard" + } + } + }, + "2": { + "question": "Is deze speeltuin 's nachts verlicht?", + "mappings": { + "0": { + "then": "Deze speeltuin is 's nachts verlicht" + }, + "1": { + "then": "Deze speeltuin is 's nachts niet verlicht" + } + } + }, + "3": { + "render": "Toegankelijk vanaf {min_age} jaar oud", + "question": "Wat is de minimale leeftijd om op deze speeltuin te mogen?" + }, + "4": { + "render": "Toegankelijk tot {max_age}", + "question": "Wat is de maximaal toegestane leeftijd voor deze speeltuin?" + }, + "5": { + "question": "Wie beheert deze speeltuin?", + "render": "Beheer door {operator}" + }, + "6": { + "question": "Is deze speeltuin vrij toegankelijk voor het publiek?", + "mappings": { + "0": { + "then": "Vrij toegankelijk voor het publiek" + }, + "1": { + "then": "Vrij toegankelijk voor het publiek" + }, + "2": { + "then": "Enkel toegankelijk voor klanten van de bijhorende zaak" + }, + "3": { + "then": "Vrij toegankelijk voor scholieren van de school" + }, + "4": { + "then": "Niet vrij toegankelijk" + } + } + }, + "7": { + "question": "Wie kan men emailen indien er problemen zijn met de speeltuin?", + "render": "De bevoegde dienst kan bereikt worden via {email}" + }, + "8": { + "question": "Wie kan men bellen indien er problemen zijn met de speeltuin?", + "render": "De bevoegde dienst kan getelefoneerd worden via {phone}" + }, + "9": { + "question": "Is deze speeltuin toegankelijk voor rolstoelgebruikers?", + "mappings": { + "0": { + "then": "Geheel toegankelijk voor rolstoelgebruikers" + }, + "1": { + "then": "Beperkt toegankelijk voor rolstoelgebruikers" + }, + "2": { + "then": "Niet toegankelijk voor rolstoelgebruikers" + } + } + }, + "10": { + "question": "Op welke uren is deze speeltuin toegankelijk?", + "mappings": { + "0": { + "then": "Van zonsopgang tot zonsondergang" + }, + "1": { + "then": "Dag en nacht toegankelijk" + }, + "2": { + "then": "Dag en nacht toegankelijk" + } + } + } + }, + "presets": { + "0": { + "title": "Speeltuin" + } + } + }, + "public_bookcase": { + "name": "Boekenruilkastjes", + "description": "Een straatkastje met boeken voor iedereen", + "title": { + "render": "Boekenruilkast", + "mappings": { + "0": { + "then": "Boekenruilkast {name}" + } + } + }, + "presets": { + "0": { + "title": "Boekenruilkast" + } + }, + "tagRenderings": { + "1": { + "render": "De naam van dit boekenruilkastje is {name}", + "question": "Wat is de naam van dit boekenuilkastje?", + "mappings": { + "0": { + "then": "Dit boekenruilkastje heeft geen naam" + } + } + }, + "2": { + "render": "Er passen {capacity} boeken", + "question": "Hoeveel boeken passen er in dit boekenruilkastje?" + }, + "3": { + "question": "Voor welke doelgroep zijn de meeste boeken in dit boekenruilkastje?", + "mappings": { + "0": { + "then": "Voornamelijk kinderboeken" + }, + "1": { + "then": "Voornamelijk boeken voor volwassenen" + }, + "2": { + "then": "Boeken voor zowel kinderen als volwassenen" + } + } + }, + "4": { + "question": "Staat dit boekenruilkastje binnen of buiten?", + "mappings": { + "0": { + "then": "Dit boekenruilkastje staat binnen" + }, + "1": { + "then": "Dit boekenruilkastje staat buiten" + }, + "2": { + "then": "Dit boekenruilkastje staat buiten" + } + } + }, + "5": { + "question": "Is dit boekenruilkastje publiek toegankelijk?", + "mappings": { + "0": { + "then": "Publiek toegankelijk" + }, + "1": { + "then": "Enkel toegankelijk voor klanten" + } + } + }, + "6": { + "question": "Wie is verantwoordelijk voor dit boekenruilkastje?", + "render": "Onderhouden door {operator}" + }, + "7": { + "question": "Is dit boekenruilkastje deel van een netwerk?", + "render": "Dit boekenruilkastje is deel van het netwerk {brand}", + "mappings": { + "0": { + "then": "Deel van het netwerk 'Little Free Library'" + }, + "1": { + "then": "Dit boekenruilkastje maakt geen deel uit van een netwerk" + } + } + }, + "8": { + "render": "Het referentienummer binnen {brand} is {ref}", + "question": "Wat is het referentienummer van dit boekenruilkastje?", + "mappings": { + "0": { + "then": "Dit boekenruilkastje maakt geen deel uit van een netwerk" + } + } + }, + "9": { + "question": "Op welke dag werd dit boekenruilkastje geinstalleerd?", + "render": "Geplaatst op {start_date}" + }, + "10": { + "render": "Meer info op de website", + "question": "Is er een website over dit boekenruilkastje?" + } + } + }, + "slow_roads": { + "name": "Paadjes, trage wegen en autoluwe straten", + "title": { + "render": "Trage weg", + "mappings": { + "0": { + "then": "{name}" + }, + "1": { + "then": "Voetpad" + }, + "2": { + "then": "Fietspad" + }, + "3": { + "then": "Voetgangersstraat" + }, + "4": { + "then": "Woonerf" + } + } + }, + "tagRenderings": { + "2": { + "question": "Wat is de wegverharding van dit pad?", + "render": "De ondergrond is {surface}", + "mappings": { + "0": { + "then": "De ondergrond is gras" + }, + "1": { + "then": "De ondergrond is aarde" + }, + "2": { + "then": "De ondergrond is onverhard" + }, + "3": { + "then": "De ondergrond is zand" + }, + "4": { + "then": "De ondergrond bestaat uit stoeptegels" + }, + "5": { + "then": "De ondergrond is asfalt" + }, + "6": { + "then": "De ondergrond is beton" + }, + "7": { + "then": "De ondergrond is verhard" + } + } + } + } + }, + "sport_pitch": { + "name": "Sportterrein", + "title": { + "render": "Sportterrein" + }, + "description": "Een sportterrein", + "tagRenderings": { + "1": { + "render": "Hier kan men {sport} beoefenen", + "question": "Welke sporten kan men hier beoefenen?", + "mappings": { + "0": { + "then": "Hier kan men basketbal spelen" + }, + "1": { + "then": "Hier kan men voetbal spelen" + }, + "2": { + "then": "Dit is een pingpongtafel" + }, + "3": { + "then": "Hier kan men tennis spelen" + }, + "4": { + "then": "Hier kan men korfbal spelen" + }, + "5": { + "then": "Hier kan men basketbal beoefenen" + } + } + }, + "2": { + "question": "Wat is de ondergrond van dit sportveld?", + "render": "De ondergrond is {surface}", + "mappings": { + "0": { + "then": "De ondergrond is gras" + }, + "1": { + "then": "De ondergrond is zand" + }, + "2": { + "then": "De ondergrond bestaat uit stoeptegels" + }, + "3": { + "then": "De ondergrond is asfalt" + }, + "4": { + "then": "De ondergrond is beton" + } + } + }, + "3": { + "question": "Is dit sportterrein publiek toegankelijk?", + "mappings": { + "0": { + "then": "Publiek toegankelijk" + }, + "1": { + "then": "Beperkt toegankelijk (enkel na reservatie, tijdens bepaalde uren, ...)" + }, + "2": { + "then": "Enkel toegankelijk voor leden van de bijhorende sportclub" + }, + "3": { + "then": "Privaat en niet toegankelijk" + } + } + }, + "4": { + "question": "Moet men reserveren om gebruik te maken van dit sportveld?", + "mappings": { + "0": { + "then": "Reserveren is verplicht om gebruik te maken van dit sportterrein" + }, + "1": { + "then": "Reserveren is sterk aangeraden om gebruik te maken van dit sportterrein" + }, + "2": { + "then": "Reserveren is mogelijk, maar geen voorwaarde" + }, + "3": { + "then": "Reserveren is niet mogelijk" + } + } + }, + "5": { + "question": "Wat is het telefoonnummer van de bevoegde dienst of uitbater?" + }, + "6": { + "question": "Wat is het email-adres van de bevoegde dienst of uitbater?" + }, + "7": { + "question": "Wanneer is dit sportveld toegankelijk?", + "mappings": { + "1": { + "then": "24/7 toegankelijk" + } + } + } + }, + "presets": { + "0": { + "title": "Ping-pong tafel" + }, + "1": { + "title": "Sportterrein" + } + } + }, + "surveillance_camera": { + "name": "Bewakingscamera's", + "title": { + "render": "Bewakingscamera" + }, + "tagRenderings": { + "1": { + "question": "Wat voor soort camera is dit?", + "mappings": { + "0": { + "then": "Een vaste camera" + }, + "1": { + "then": "Een dome (bolvormige camera die kan draaien)" + }, + "2": { + "then": "Een camera die (met een motor) van links naar rechts kan draaien" + } + } + }, + "2": { + "question": "In welke geografische richting filmt deze camera?", + "render": "Filmt in kompasrichting {camera:direction}", + "mappings": { + "0": { + "then": "Filmt in kompasrichting {direction}" + } + } + }, + "3": { + "question": "Wie beheert deze bewakingscamera?", + "render": "Beheer door {operator}" + }, + "4": { + "question": "Wat soort bewaking wordt hier uitgevoerd?", + "mappings": { + "0": { + "then": "Bewaking van de publieke ruilmte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel..." + }, + "1": { + "then": "Een buitenruimte met privaat karakter (zoals een privé-oprit, een parking, tankstation, ...)" + }, + "2": { + "then": "Een private binnenruimte wordt bewaakt, bv. een winkel, een parkeergarage, ..." + } + } + }, + "5": { + "question": "Bevindt de bewaakte publieke ruimte camera zich binnen of buiten?", + "mappings": { + "0": { + "then": "Deze camera bevindt zich binnen" + }, + "1": { + "then": "Deze camera bevindt zich buiten" + }, + "2": { + "then": "Deze camera bevindt zich waarschijnlijk buiten" + } + } + }, + "6": { + "question": "Op welke verdieping bevindt deze camera zich?", + "render": "Bevindt zich op verdieping {level}" + }, + "7": { + "question": "Wat wordt hier precies bewaakt?", + "render": "Bewaakt een {surveillance:zone}", + "mappings": { + "0": { + "then": "Bewaakt een parking" + }, + "1": { + "then": "Bewaakt het verkeer" + }, + "2": { + "then": "Bewaakt een ingang" + }, + "3": { + "then": "Bewaakt een gang" + }, + "4": { + "then": "Bewaakt een perron of bushalte" + }, + "5": { + "then": "Bewaakt een winkel" + } + } + }, + "8": { + "question": "Hoe is deze camera geplaatst?", + "render": "Montage: {camera:mount}", + "mappings": { + "0": { + "then": "Deze camera hangt aan een muur" + }, + "1": { + "then": "Deze camera staat op een paal" + }, + "2": { + "then": "Deze camera hangt aan het plafond" + } + } + } + } + }, + "tree_node": { + "name": "Boom", + "title": { + "render": "Boom", + "mappings": { + "0": { + "then": "{name}" + } + } + }, + "tagRenderings": { + "1": { + "render": "Hoogte: {height}", + "mappings": { + "0": { + "then": "Hoogte: {height} m" + } + } + }, + "2": { + "question": "Is dit een naald- of loofboom?", + "mappings": { + "0": { + "then": "\"\"/ Loofboom" + }, + "1": { + "then": "\"\"/ Naaldboom" + }, + "2": { + "then": "\"\"/ Permanent bladloos" + } + } + }, + "3": { + "question": "Hoe significant is deze boom? Kies het eerste antwoord dat van toepassing is.", + "mappings": { + "0": { + "then": "De boom valt op door zijn grootte of prominente locatie. Hij is nuttig voor navigatie." + }, + "1": { + "then": "De boom is een natuurlijk monument, bijvoorbeeld doordat hij bijzonder oud of van een waardevolle soort is." + }, + "2": { + "then": "De boom wordt voor landbouwdoeleinden gebruikt, bijvoorbeeld in een boomgaard." + }, + "3": { + "then": "De boom staat in een park of dergelijke (begraafplaats, schoolterrein, …)." + }, + "4": { + "then": "De boom staat in de tuin bij een woning/flatgebouw." + }, + "5": { + "then": "Dit is een laanboom." + }, + "6": { + "then": "De boom staat in een woonkern." + }, + "7": { + "then": "De boom staat buiten een woonkern." + } + } + }, + "4": { + "question": "Is deze boom groenblijvend of bladverliezend?", + "mappings": { + "0": { + "then": "Bladverliezend: de boom is een periode van het jaar kaal." + }, + "1": { + "then": "Groenblijvend." + } + } + }, + "5": { + "render": "Naam: {name}", + "question": "Heeft de boom een naam?", + "mappings": { + "0": { + "then": "De boom heeft geen naam." + } + } + }, + "6": { + "question": "Is deze boom erkend als erfgoed?", + "mappings": { + "0": { + "then": "\"\"/ Erkend als houtig erfgoed door Onroerend Erfgoed Vlaanderen" + }, + "1": { + "then": "Erkend als natuurlijk erfgoed door Directie Cultureel Erfgoed Brussel" + }, + "2": { + "then": "Erkend als erfgoed door een andere organisatie" + }, + "3": { + "then": "Niet erkend als erfgoed" + }, + "4": { + "then": "Erkend als erfgoed door een andere organisatie" + } + } + }, + "7": { + "render": "\"\"/ Onroerend Erfgoed-ID: {ref:OnroerendErfgoed}", + "question": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?" + }, + "8": { + "render": "\"\"/ Wikidata: {wikidata}", + "question": "Wat is het Wikidata-ID van deze boom?" + } + }, + "presets": { + "0": { + "title": "Loofboom", + "description": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier." + }, + "1": { + "title": "Naaldboom", + "description": "Een boom van een soort met naalden, bijvoorbeeld den of spar." + }, + "2": { + "title": "Boom", + "description": "Wanneer je niet zeker bent of het nu een loof- of naaldboom is." + } + } + }, + "viewpoint": { + "name": "Uitzicht", + "description": "Een mooi uitzicht - ideaal om een foto toe te voegen wanneer iets niet in een andere categorie past", + "presets": { + "0": { + "title": "Uitzicht" + } + }, + "title": { + "render": "Uitzicht" + }, + "tagRenderings": { + "1": { + "question": "Zijn er bijzonderheden die je wilt toevoegen?" + } + } + }, + "village_green": { + "name": "Speelweide", + "title": { + "render": "Speelweide", + "mappings": { + "0": { + "then": "{name}" + } + } + } + } +} \ No newline at end of file diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index f04d3cd73f..f73836f1ee 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -12,230 +12,248 @@ import {Translation} from "../UI/i18n/Translation"; // It spits out an overview of those to be used to load them interface LayersAndThemes { - themes: any[] , layers: {parsed: any, path: string}[] + themes: any[], + layers: { parsed: any, path: string }[] } -function loadThemesAndLayers():LayersAndThemes{ - -const layerFiles = ScriptUtils.readDirRecSync("./assets/layers") - .filter(path => path.indexOf(".json") > 0) - .filter(path => path.indexOf("license_info.json") < 0) - .map(path => { - try { - const parsed = JSON.parse(readFileSync(path, "UTF8")); - return {parsed: parsed, path: path} - } catch (e) { - console.error("Could not parse file ", "./assets/layers/" + path, "due to ", e) - } - }) -const themeFiles: any[] = ScriptUtils.readDirRecSync("./assets/themes") - .filter(path => path.endsWith(".json")) - .filter(path => path.indexOf("license_info.json") < 0) - .map(path => { - try{ - return JSON.parse(readFileSync(path, "UTF8")); - }catch(e){ - console.error("Could not read file ", path, "due to ", e) - throw e - } - }); -console.log("Discovered", layerFiles.length, "layers and", themeFiles.length, "themes\n") -return { - layers: layerFiles, - themes: themeFiles -} -} - -function writeFiles(lt: LayersAndThemes){ - writeFileSync("./assets/generated/known_layers_and_themes.json", JSON.stringify({ - "layers": lt.layers.map(l => l.parsed), - "themes": lt.themes - })) -} - -function validateLayer(layerJson: LayerConfigJson, path: string, knownPaths: Set, context?: string): string[] { - let errorCount = []; - if (layerJson["overpassTags"] !== undefined) { - errorCount.push("Layer " + layerJson.id + "still uses the old 'overpassTags'-format. Please use \"source\": {\"osmTags\": }' instead of \"overpassTags\": (note: this isn't your fault, the custom theme generator still spits out the old format)") - } - try { - const layer = new LayerConfig(layerJson, "test", true) - const images = Array.from(layer.ExtractImages()) - const remoteImages = images.filter(img => img.indexOf("http") == 0) - for (const remoteImage of remoteImages) { - errorCount.push("Found a remote image: " + remoteImage + " in layer " + layer.id + ", please download it. You can use the fixTheme script to automate this") - } - const expected: string = `assets/layers/${layer.id}/${layer.id}.json` - if (path != undefined && path.indexOf(expected) < 0) { - errorCount.push("Layer is in an incorrect place. The path is " + path + ", but expected " + expected) - } - - for (const image of images) { - if(image.indexOf("{") >= 0){ - console.warn("Ignoring image with { in the path: ", image) - continue - } - - if (!knownPaths.has(image)) { - const ctx = context === undefined ? "" : ` in a layer defined in the theme ${context}` - errorCount.push(`Image with path ${image} not found or not attributed; it is used in ${layer.id}${ctx}`) - } - } - - } catch (e) { - console.error(e) - return [`Layer ${layerJson.id}` ?? JSON.stringify(layerJson).substring(0, 50) + " is invalid: " + e] - } - return errorCount -} - -function validateTranslationCompletenessOfObject(object: any, expectedLanguages: string[], context: string) { - const missingTranlations = [] - const translations: {tr: Translation, context: string}[] = []; - const queue: {object: any, context: string}[] = [{object: object, context: context}] - - while (queue.length > 0) { - const item = queue.pop(); - const o = item.object - for (const key in o) { - const v = o[key]; - if (v === undefined) { - continue; - } - if (v instanceof Translation || v?.translations !== undefined) { - translations.push({tr: v, context: item.context}); - } else if ( - ["string", "function", "boolean", "number"].indexOf(typeof (v)) < 0) { - queue.push({object: v, context: item.context + "." + key}) - } - } - } - - const missing = {} - const present = {} - for (const ln of expectedLanguages) { - missing[ln] = 0; - present[ln] = 0; - for (const translation of translations) { - if (translation.tr.translations["*"] !== undefined) { - continue; - } - const txt = translation.tr.translations[ln]; - const isMissing = txt === undefined || txt === "" || txt.toLowerCase().indexOf("todo") >= 0; - if (isMissing) { - missingTranlations.push(`${translation.context},${ln},${translation.tr.txt}`) - missing[ln]++ - } else { - present[ln]++; - } - } - } - - let message = `Translation completeness for ${context}` - let isComplete = true; - for (const ln of expectedLanguages) { - const amiss = missing[ln]; - const ok = present[ln]; - const total = amiss + ok; - message += ` ${ln}: ${ok}/${total}` - if (ok !== total) { - isComplete = false; - } - } - return missingTranlations - -} - -function main(args: string[]) { - - const lt = loadThemesAndLayers(); - const layerFiles = lt.layers; - const themeFiles = lt.themes; - - console.log(" ---------- VALIDATING ---------") - const licensePaths = [] - for (const i in licenses) { - licensePaths.push(licenses[i].path) - } - const knownPaths = new Set(licensePaths) - - let layerErrorCount = [] - const knownLayerIds = new Map(); - for (const layerFile of layerFiles) { - - layerErrorCount.push(...validateLayer(layerFile.parsed, layerFile.path, knownPaths)) - knownLayerIds.set(layerFile.parsed.id, new LayerConfig(layerFile.parsed)) - } - - let themeErrorCount = [] - let missingTranslations = [] - for (const themeFile of themeFiles) { - if (typeof themeFile.language === "string") { - themeErrorCount.push("The theme " + themeFile.id + " has a string as language. Please use a list of strings") - } - for (const layer of themeFile.layers) { - if (typeof layer === "string") { - if (!knownLayerIds.has(layer)) { - themeErrorCount.push(`Unknown layer id: ${layer} in theme ${themeFile.id}`) - } else { - const layerConfig = knownLayerIds.get(layer); - missingTranslations.push(...validateTranslationCompletenessOfObject(layerConfig, themeFile.language, "Layer " + layer)) +export default class LayerOverviewUtils { + getLayerFiles(): {parsed: LayerConfigJson, path: string}[] { + return ScriptUtils.readDirRecSync("./assets/layers") + .filter(path => path.indexOf(".json") > 0) + .filter(path => path.indexOf("license_info.json") < 0) + .map(path => { + try { + const parsed = JSON.parse(readFileSync(path, "UTF8")); + return {parsed: parsed, path: path} + } catch (e) { + console.error("Could not parse file ", "./assets/layers/" + path, "due to ", e) } - } else { - if (layer.builtin !== undefined) { - if (!knownLayerIds.has(layer.builtin)) { - themeErrorCount.push("Unknown layer id: " + layer.builtin + "(which uses inheritance)") + }) + } + + + getThemeFiles() { + return ScriptUtils.readDirRecSync("./assets/themes") + .filter(path => path.endsWith(".json")) + .filter(path => path.indexOf("license_info.json") < 0) + .map(path => { + try { + return JSON.parse(readFileSync(path, "UTF8")); + } catch (e) { + console.error("Could not read file ", path, "due to ", e) + throw e + } + }); + } + + + loadThemesAndLayers(): LayersAndThemes { + + const layerFiles = this.getLayerFiles(); + + const themeFiles: any[] = this.getThemeFiles(); + + console.log("Discovered", layerFiles.length, "layers and", themeFiles.length, "themes\n") + return { + layers: layerFiles, + themes: themeFiles + } + } + + + writeFiles(lt: LayersAndThemes) { + writeFileSync("./assets/generated/known_layers_and_themes.json", JSON.stringify({ + "layers": lt.layers.map(l => l.parsed), + "themes": lt.themes + })) + } + + + validateLayer(layerJson: LayerConfigJson, path: string, knownPaths: Set, context?: string): string[] { + let errorCount = []; + if (layerJson["overpassTags"] !== undefined) { + errorCount.push("Layer " + layerJson.id + "still uses the old 'overpassTags'-format. Please use \"source\": {\"osmTags\": }' instead of \"overpassTags\": (note: this isn't your fault, the custom theme generator still spits out the old format)") + } + try { + const layer = new LayerConfig(layerJson, "test", true) + const images = Array.from(layer.ExtractImages()) + const remoteImages = images.filter(img => img.indexOf("http") == 0) + for (const remoteImage of remoteImages) { + errorCount.push("Found a remote image: " + remoteImage + " in layer " + layer.id + ", please download it. You can use the fixTheme script to automate this") + } + const expected: string = `assets/layers/${layer.id}/${layer.id}.json` + if (path != undefined && path.indexOf(expected) < 0) { + errorCount.push("Layer is in an incorrect place. The path is " + path + ", but expected " + expected) + } + + for (const image of images) { + if (image.indexOf("{") >= 0) { + console.warn("Ignoring image with { in the path: ", image) + continue + } + + if (!knownPaths.has(image)) { + const ctx = context === undefined ? "" : ` in a layer defined in the theme ${context}` + errorCount.push(`Image with path ${image} not found or not attributed; it is used in ${layer.id}${ctx}`) + } + } + + } catch (e) { + console.error(e) + return [`Layer ${layerJson.id}` ?? JSON.stringify(layerJson).substring(0, 50) + " is invalid: " + e] + } + return errorCount + } + + validateTranslationCompletenessOfObject(object: any, expectedLanguages: string[], context: string) { + const missingTranlations = [] + const translations: { tr: Translation, context: string }[] = []; + const queue: { object: any, context: string }[] = [{object: object, context: context}] + + while (queue.length > 0) { + const item = queue.pop(); + const o = item.object + for (const key in o) { + const v = o[key]; + if (v === undefined) { + continue; + } + if (v instanceof Translation || v?.translations !== undefined) { + translations.push({tr: v, context: item.context}); + } else if ( + ["string", "function", "boolean", "number"].indexOf(typeof (v)) < 0) { + queue.push({object: v, context: item.context + "." + key}) + } + } + } + + const missing = {} + const present = {} + for (const ln of expectedLanguages) { + missing[ln] = 0; + present[ln] = 0; + for (const translation of translations) { + if (translation.tr.translations["*"] !== undefined) { + continue; + } + const txt = translation.tr.translations[ln]; + const isMissing = txt === undefined || txt === "" || txt.toLowerCase().indexOf("todo") >= 0; + if (isMissing) { + missingTranlations.push(`${translation.context},${ln},${translation.tr.txt}`) + missing[ln]++ + } else { + present[ln]++; + } + } + } + + let message = `Translation completeness for ${context}` + let isComplete = true; + for (const ln of expectedLanguages) { + const amiss = missing[ln]; + const ok = present[ln]; + const total = amiss + ok; + message += ` ${ln}: ${ok}/${total}` + if (ok !== total) { + isComplete = false; + } + } + return missingTranlations + + } + + main(args: string[]) { + + const lt = this.loadThemesAndLayers(); + const layerFiles = lt.layers; + const themeFiles = lt.themes; + + console.log(" ---------- VALIDATING ---------") + const licensePaths = [] + for (const i in licenses) { + licensePaths.push(licenses[i].path) + } + const knownPaths = new Set(licensePaths) + + let layerErrorCount = [] + const knownLayerIds = new Map(); + for (const layerFile of layerFiles) { + + layerErrorCount.push(...this.validateLayer(layerFile.parsed, layerFile.path, knownPaths)) + knownLayerIds.set(layerFile.parsed.id, new LayerConfig(layerFile.parsed)) + } + + let themeErrorCount = [] + let missingTranslations = [] + for (const themeFile of themeFiles) { + if (typeof themeFile.language === "string") { + themeErrorCount.push("The theme " + themeFile.id + " has a string as language. Please use a list of strings") + } + for (const layer of themeFile.layers) { + if (typeof layer === "string") { + if (!knownLayerIds.has(layer)) { + themeErrorCount.push(`Unknown layer id: ${layer} in theme ${themeFile.id}`) + } else { + const layerConfig = knownLayerIds.get(layer); + missingTranslations.push(...this.validateTranslationCompletenessOfObject(layerConfig, themeFile.language, "Layer " + layer)) + } } else { - // layer.builtin contains layer overrides - we can skip those - layerErrorCount.push(...validateLayer(layer, undefined, knownPaths, themeFile.id)) + if (layer.builtin !== undefined) { + if (!knownLayerIds.has(layer.builtin)) { + themeErrorCount.push("Unknown layer id: " + layer.builtin + "(which uses inheritance)") + } + } else { + // layer.builtin contains layer overrides - we can skip those + layerErrorCount.push(...this.validateLayer(layer, undefined, knownPaths, themeFile.id)) + } } } - } - 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 - .filter(l => l.builtin === undefined) + 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 + .filter(l => l.builtin === undefined) - missingTranslations.push(...validateTranslationCompletenessOfObject(themeFile, themeFile.language, "Theme " + themeFile.id)) + missingTranslations.push(...this.validateTranslationCompletenessOfObject(themeFile, themeFile.language, "Theme " + themeFile.id)) - try { - const theme = new LayoutConfig(themeFile, true, "test") - if (theme.id !== theme.id.toLowerCase()) { - themeErrorCount.push("Theme ids should be in lowercase, but it is " + theme.id) + try { + const theme = new LayoutConfig(themeFile, true, "test") + if (theme.id !== theme.id.toLowerCase()) { + themeErrorCount.push("Theme ids should be in lowercase, but it is " + theme.id) + } + } catch (e) { + themeErrorCount.push("Could not parse theme " + themeFile["id"] + "due to", e) } - } catch (e) { - themeErrorCount.push("Could not parse theme " + themeFile["id"] + "due to", e) - } - } - - if(missingTranslations.length > 0){ - console.log(missingTranslations.length, "missing translations") - writeFileSync("missing_translations.txt", missingTranslations.join("\n")) - } - - if (layerErrorCount.length + themeErrorCount.length == 0) { - console.log("All good!") - - // We load again from disc, as modifications were made above - const lt = loadThemesAndLayers(); - writeFiles(lt); - } else { - const errors = layerErrorCount.concat(themeErrorCount).join("\n") - console.log(errors) - const msg = (`Found ${layerErrorCount.length} errors in the layers; ${themeErrorCount.length} errors in the themes`) - console.log(msg) - if (process.argv.indexOf("--report") >= 0) { - console.log("Writing report!") - writeFileSync("layer_report.txt", errors) } - if (process.argv.indexOf("--no-fail") < 0) { - throw msg; + if (missingTranslations.length > 0) { + console.log(missingTranslations.length, "missing translations") + writeFileSync("missing_translations.txt", missingTranslations.join("\n")) + } + + if (layerErrorCount.length + themeErrorCount.length == 0) { + console.log("All good!") + + // We load again from disc, as modifications were made above + const lt = this.loadThemesAndLayers(); + this.writeFiles(lt); + } else { + const errors = layerErrorCount.concat(themeErrorCount).join("\n") + console.log(errors) + const msg = (`Found ${layerErrorCount.length} errors in the layers; ${themeErrorCount.length} errors in the themes`) + console.log(msg) + if (process.argv.indexOf("--report") >= 0) { + console.log("Writing report!") + writeFileSync("layer_report.txt", errors) + } + + if (process.argv.indexOf("--no-fail") < 0) { + throw msg; + } } } } -main(process.argv) \ No newline at end of file +new LayerOverviewUtils().main(process.argv) \ No newline at end of file diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index 04b705fe72..3a3ac32461 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -2,40 +2,130 @@ import * as fs from "fs"; import {Utils} from "../Utils"; import ScriptUtils from "./ScriptUtils"; import {readFileSync, writeFileSync} from "fs"; +import LayerConfig from "../Customizations/JSON/LayerConfig"; +import {LayerConfigJson} from "../Customizations/JSON/LayerConfigJson"; +import * as bookcases from "../assets/layers/public_bookcase/public_bookcase.json" +import LayerOverviewUtils from "./generateLayerOverview"; + +const knownLanguages = ["en", "nl", "de", "fr", "es", "gl", "ca"]; class TranslationPart { contents: Map = new Map() - add(language: string, obj: any){ + add(language: string, obj: any) { for (const key in obj) { const v = obj[key] - if(!this.contents.has(key)){ + if (!this.contents.has(key)) { this.contents.set(key, new TranslationPart()) } const subpart = this.contents.get(key) as TranslationPart - if(typeof v === "string"){ + if (typeof v === "string") { subpart.contents.set(language, v) - }else{ + } else { subpart.add(language, v) } } } - toJson(): string{ - const parts = [] - for (let key of Array.from(this.contents.keys()) ){ - const value = this.contents.get(key); + addTranslationObject(translations: any, context?: string) { + for (const translationsKey in translations) { + if (!translations.hasOwnProperty(translationsKey)) { + continue; + } + const v = translations[translationsKey] + if (typeof (v) != "string") { + console.error("Non-string object in translation: ", translations[translationsKey]) + 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) + } + } - if(typeof value === "string"){ - parts.push(`\"${key}\": \"${value}\"`) - }else{ - parts.push(`\"${key}\": ${(value as TranslationPart).toJson()}`); + isLeaf() { + for (let key of Array.from(this.contents.keys())) { + const value = this.contents.get(key); + if (typeof value !== "string") { + return false; } } - return JSON.stringify(JSON.parse(`{${parts.join(",")}}`), null, " "); + return true; + } + + recursiveAdd(object: any) { + + + const isProbablyTranslationObject = knownLanguages.map(l => object.hasOwnProperty(l)).filter(x => x).length > 0; + if (isProbablyTranslationObject) { + this.addTranslationObject(object) + return; + } + + for (const key in object) { + if (!object.hasOwnProperty(key)) { + continue; + } + + const v = object[key] + if (v == null) { + console.warn("Got a null value for key ", key) + continue + } + + if (typeof v !== "object") { + continue; + } + + if (!this.contents.get(key)) { + this.contents.set(key, new TranslationPart()) + } + + (this.contents.get(key) as TranslationPart).recursiveAdd(v); + } + } + + knownLanguages(): string[] { + const languages = [] + for (let key of Array.from(this.contents.keys())) { + const value = this.contents.get(key); + + if (typeof value === "string") { + languages.push(key) + } else { + languages.push(...(value as TranslationPart).knownLanguages()) + } + } + return Utils.Dedup(languages); + } + + toJson(neededLanguage?: string): string { + const parts = [] + + for (let key of Array.from(this.contents.keys())) { + let value = this.contents.get(key); + + if (typeof value === "string") { + value = value.replace(/"/g, "\\\"") + if(neededLanguage === undefined){ + parts.push(`\"${key}\": \"${value}\"`) + }else if (key === neededLanguage){ + return `"${value}"` + } + + } else { + const sub = (value as TranslationPart).toJson(neededLanguage) + if (sub !== "") { + parts.push(`\"${key}\": ${sub}`); + } + + } + } + if (parts.length === 0) { + return ""; + } + return `{${parts.join(",")}}`; } } @@ -57,11 +147,11 @@ function transformTranslation(obj: any, depth = 1) { let values = "" for (const key in obj) { - if(key === "#"){ + if (key === "#") { continue; } - if(key.match("^[a-zA-Z0-9_]*$") === null){ - throw "Invalid character in key: "+key + 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" } @@ -83,7 +173,7 @@ function genTranslations() { } // Read 'lang/*.json', writes to 'assets/generated/translations.json' -function compileTranslationsFromWeblate(){ +function compileTranslationsFromWeblate() { const translations = ScriptUtils.readDirRecSync("./langs") .filter(path => path.indexOf(".json") > 0) @@ -92,13 +182,48 @@ function compileTranslationsFromWeblate(){ for (const translationFile of translations) { const contents = JSON.parse(readFileSync(translationFile, "utf-8")); let language = translationFile.substring(translationFile.lastIndexOf("/") + 1) - language = language.substring(0, language.length-5) + language = language.substring(0, language.length - 5) allTranslations.add(language, contents) } - writeFileSync("./assets/generated/translations.json", allTranslations.toJson()) + writeFileSync("./assets/generated/translations.json", JSON.stringify(JSON.parse(allTranslations.toJson()), null, " ")) } +function generateTranslationFromLayerConfig(layerConfig: LayerConfigJson): TranslationPart { + const tr = new TranslationPart(); + tr.recursiveAdd(layerConfig) + return tr; +} + +function generateLayerTranslationsObject() { + const layerFiles = new LayerOverviewUtils().getLayerFiles(); + + const tr = new TranslationPart(); + + for (const layerFile of layerFiles) { + const config: LayerConfigJson = layerFile.parsed; + const layerTr = generateTranslationFromLayerConfig(config) + tr.contents.set(config.id, layerTr) + } + + const langs = tr.knownLanguages(); + for (const lang of langs) { + console.log("Exporting ", lang) + + let json = tr.toJson(lang) + try{ + json = JSON.stringify(JSON.parse(json), null, " "); + }catch (e) { + console.error(e) + } + + writeFileSync("langs/layers/" + lang + ".json", json) + } +} + + +generateLayerTranslationsObject() + compileTranslationsFromWeblate(); genTranslations() \ No newline at end of file