diff --git a/langs/themes/ca.json b/langs/themes/ca.json
new file mode 100644
index 000000000..dfffc61f3
--- /dev/null
+++ b/langs/themes/ca.json
@@ -0,0 +1,10 @@
+{
+ "aed": {
+ "title": "Mapa obert de desfibril·ladors (DEA)",
+ "description": "En aquest mapa , qualsevol pot trobar i marcar els desfibril·ladors externs automàtics més propers"
+ },
+ "personal": {
+ "title": "Interfície personal",
+ "description": "Crea una interfície basada en totes les capes disponibles de totes les interfícies"
+ }
+}
\ No newline at end of file
diff --git a/langs/themes/de.json b/langs/themes/de.json
new file mode 100644
index 000000000..1d1381e2d
--- /dev/null
+++ b/langs/themes/de.json
@@ -0,0 +1,325 @@
+{
+ "aed": {
+ "title": "AED-Karte öffnen",
+ "description": "Auf dieser Karte kann man nahe gelegene Defibrillatoren finden und markieren"
+ },
+ "artworks": {
+ "title": "Freie Kunstwerk-Karte",
+ "description": "Willkommen bei der Freien Kunstwerk-Karte, einer Karte von Statuen, Büsten, Grafitti, ... auf der ganzen Welt",
+ "layers": {
+ "0": {
+ "name": "Kunstwerke",
+ "title": {
+ "render": "Kunstwerk",
+ "mappings": {
+ "0": {
+ "then": "Kunstwerk {name}"
+ }
+ }
+ },
+ "description": "Verschiedene Kunstwerke",
+ "presets": {
+ "0": {
+ "title": "Kunstwerk"
+ }
+ },
+ "tagRenderings": {
+ "1": {
+ "render": "Dies ist ein {artwork_type}",
+ "question": "Was ist die Art dieses Kunstwerks?",
+ "mappings": {
+ "0": {
+ "then": "Architektur"
+ },
+ "1": {
+ "then": "Wandbild"
+ },
+ "2": {
+ "then": "Malerei"
+ },
+ "3": {
+ "then": "Skulptur"
+ },
+ "4": {
+ "then": "Statue"
+ },
+ "5": {
+ "then": "Büste"
+ },
+ "6": {
+ "then": "Stein"
+ },
+ "7": {
+ "then": "Installation"
+ },
+ "8": {
+ "then": "Graffiti"
+ },
+ "9": {
+ "then": "Relief"
+ },
+ "10": {
+ "then": "Azulejo (spanische dekorative Fliesenarbeit)"
+ },
+ "11": {
+ "then": "Fliesenarbeit"
+ }
+ }
+ },
+ "2": {
+ "question": "Welcher Künstler hat das geschaffen?",
+ "render": "Erstellt von {artist_name}"
+ },
+ "3": {
+ "question": "Auf welcher Website gibt es mehr Informationen über dieses Kunstwerk?",
+ "render": "Weitere Informationen auf dieser Webseite"
+ },
+ "4": {
+ "question": "Welcher Wikidata-Eintrag entspricht diesem Kunstwerk?",
+ "render": "Entspricht {wikidata}"
+ }
+ }
+ }
+ }
+ },
+ "benches": {
+ "title": "Sitzbänke",
+ "shortDescription": "Eine Karte aller Sitzbänke",
+ "description": "Diese Karte zeigt alle Sitzbänke, die in OpenStreetMap eingetragen sind: Einzeln stehende Bänke und Bänke, die zu Haltestellen oder Unterständen gehören. Mit einem OpenStreetMap-Account können Sie neue Bänke eintragen oder Detailinformationen existierender Bänke bearbeiten."
+ },
+ "bookcases": {
+ "title": "Öffentliche Bücherschränke Karte",
+ "description": "Ein öffentlicher Bücherschrank ist ein kleiner Bücherschrank am Straßenrand, ein Kasten, eine alte Telefonzelle oder andere Gegenstände, in denen Bücher aufbewahrt werden. Jeder kann ein Buch hinstellen oder mitnehmen. Diese Karte zielt darauf ab, all diese Bücherschränke zu sammeln. Sie können neue Bücherschränke in der Nähe entdecken und mit einem kostenlosen OpenStreetMap-Account schnell Ihre Lieblingsbücherschränke hinzufügen."
+ },
+ "climbing": {
+ "title": "Offene Kletterkarte",
+ "description": "Auf dieser Karte finden Sie verschiedene Klettermöglichkeiten wie Kletterhallen, Boulderhallen und Felsen in der Natur.",
+ "descriptionTail": "
kletterspots.de wird betrieben von Christian Neumann. Bitte melden Sie sich, wenn Sie Feedback oder Fragen haben.
Das Projekt nutzt Daten des OpenStreetMap Projekts und basiert auf der freien Software MapComplete.
",
+ "layers": {
+ "0": {
+ "name": "Kletterverein",
+ "title": {
+ "render": "Kletterverein",
+ "mappings": {
+ "0": {
+ "then": "Kletter-Organisation"
+ }
+ }
+ },
+ "description": "Ein Kletterverein oder eine Organisation",
+ "tagRenderings": {
+ "0": {
+ "render": "{name}",
+ "question": "Wie lautet der Name dieses Vereins oder Organisation?"
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Kletterverein",
+ "description": "Ein Kletterverein"
+ },
+ "1": {
+ "title": "Eine Kletter-Organisation",
+ "description": "Eine Organisation, welche sich mit dem Klettern beschäftigt"
+ }
+ }
+ },
+ "1": {
+ "name": "Kletterhallen",
+ "title": {
+ "render": "Kletterhalle",
+ "mappings": {
+ "0": {
+ "then": "Kletterhalle {name}"
+ }
+ }
+ },
+ "description": "Eine Kletterhalle",
+ "tagRenderings": {
+ "2": {
+ "render": "{name}",
+ "question": "Wie heißt diese Kletterhalle?"
+ }
+ }
+ },
+ "2": {
+ "name": "Kletterrouten",
+ "title": {
+ "render": "Kleterroute",
+ "mappings": {
+ "0": {
+ "then": "Kleterroute {name}"
+ }
+ }
+ },
+ "tagRenderings": {
+ "2": {
+ "render": "{name}",
+ "question": "Wie heißt diese Kletterroute?",
+ "mappings": {
+ "0": {
+ "then": "Diese Kletterroute hat keinen Namen"
+ }
+ }
+ },
+ "3": {
+ "render": "Diese Route ist {climbing:length} Meter lang"
+ }
+ }
+ },
+ "3": {
+ "name": "Klettermöglichkeiten",
+ "title": {
+ "render": "Klettermöglichkeit"
+ },
+ "description": "Eine Klettergelegenheit",
+ "tagRenderings": {
+ "2": {
+ "render": "{name}",
+ "question": "Wie heißt diese Klettergelegenheit?",
+ "mappings": {
+ "0": {
+ "then": "Diese Klettergelegenheit hat keinen Namen"
+ }
+ }
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Klettermöglichkeit",
+ "description": "Eine Klettergelegenheit"
+ }
+ }
+ },
+ "4": {
+ "name": "Klettermöglichkeiten?",
+ "title": {
+ "render": "Klettermöglichkeit?"
+ },
+ "description": "Eine Klettergelegenheit?",
+ "tagRenderings": {
+ "0": {
+ "render": "{name}"
+ },
+ "1": {
+ "question": "Kann hier geklettert werden?",
+ "mappings": {
+ "0": {
+ "then": "Hier kann nicht geklettert werden"
+ },
+ "1": {
+ "then": "Hier kann geklettert werden"
+ }
+ }
+ }
+ }
+ }
+ },
+ "roamingRenderings": {
+ "0": {
+ "question": "Gibt es eine (inoffizielle) Website mit mehr Informationen (z.B. Topos)?"
+ },
+ "1": {
+ "render": "Die Routen sind durchschnittlich {climbing:length}m lang",
+ "question": "Wie lang sind die Routen (durchschnittlich) in Metern?"
+ },
+ "2": {
+ "question": "Welche Schwierigkeit hat hier die leichteste Route (französisch/belgisches System)?",
+ "render": "Die leichteste Route hat hier die Schwierigkeit {climbing:grade:french} (französisch/belgisches System)"
+ },
+ "3": {
+ "question": "Welche Schwierigkeit hat hier die schwerste Route (französisch/belgisches System)?",
+ "render": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french} (französisch/belgisches System)"
+ },
+ "4": {
+ "question": "Kann hier gebouldert werden?",
+ "mappings": {
+ "0": {
+ "then": "Hier kann gebouldert werden"
+ },
+ "1": {
+ "then": "Hier kann nicht gebouldert werden"
+ },
+ "2": {
+ "then": "Bouldern ist hier nur an wenigen Routen möglich"
+ },
+ "3": {
+ "then": "Hier gibt es {climbing:boulder} Boulder-Routen"
+ }
+ }
+ },
+ "5": {
+ "question": "Ist Toprope-Klettern hier möglich?",
+ "mappings": {
+ "0": {
+ "then": "Toprope-Klettern ist hier möglich"
+ },
+ "1": {
+ "then": "Toprope-Climbing ist hier nicht möglich"
+ },
+ "2": {
+ "then": "Hier gibt es {climbing:toprope} Toprope-Routen"
+ }
+ }
+ },
+ "6": {
+ "question": "Ist hier Sportklettern möglich (feste Ankerpunkte)?",
+ "mappings": {
+ "0": {
+ "then": "Sportklettern ist hier möglich"
+ },
+ "1": {
+ "then": "Sportklettern ist hier nicht möglich"
+ },
+ "2": {
+ "then": "Hier gibt es {climbing:sport} Sportkletter-Routen"
+ }
+ }
+ },
+ "7": {
+ "question": "Ist hier traditionelles Klettern möglich (eigene Sicherung z.B. mit Klemmkleilen)?",
+ "mappings": {
+ "0": {
+ "then": "Traditionelles Klettern ist hier möglich"
+ },
+ "1": {
+ "then": "Traditionelles Klettern ist hier nicht möglich"
+ },
+ "2": {
+ "then": "Hier gibt es {climbing:traditional} Routen für traditionelles Klettern"
+ }
+ }
+ },
+ "8": {
+ "question": "Gibt es hier eine Speedkletter-Wand?",
+ "mappings": {
+ "0": {
+ "then": "Hier gibt es eine Speedkletter-Wand"
+ },
+ "1": {
+ "then": "Hier gibt es keine Speedkletter-Wand"
+ },
+ "2": {
+ "then": "Hier gibt es {climbing:speed} Speedkletter-Routen"
+ }
+ }
+ }
+ }
+ },
+ "cyclofix": {
+ "title": "Cyclofix - eine offene Karte für Radfahrer",
+ "description": "Das Ziel dieser Karte ist es, den Radfahrern eine einfach zu benutzende Lösung zu präsentieren, um die geeignete Infrastruktur für ihre Bedürfnisse zu finden.
Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.
Alle Änderungen, die Sie vornehmen, werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei wiederverwendet werden.
Weitere Informationen über das Projekt Cyclofix finden Sie unter cyclofix.osm.be."
+ },
+ "ghostbikes": {
+ "title": "Geisterrad",
+ "description": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap kennt. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account."
+ },
+ "personal": {
+ "title": "Persönliches Thema",
+ "description": "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen"
+ },
+ "toilets": {
+ "title": "Offene Toilette Karte",
+ "description": "Eine Karte der öffentlichen Toiletten"
+ }
+}
\ No newline at end of file
diff --git a/langs/themes/en.json b/langs/themes/en.json
new file mode 100644
index 000000000..4373fd6e9
--- /dev/null
+++ b/langs/themes/en.json
@@ -0,0 +1,1026 @@
+{
+ "aed": {
+ "title": "Open AED Map",
+ "description": "On this map, one can find and mark nearby defibrillators"
+ },
+ "artworks": {
+ "title": "Open Artwork Map",
+ "description": "Welcome to Open Artwork Map, a map of statues, busts, grafittis and other artwork all over the world",
+ "layers": {
+ "0": {
+ "name": "Artworks",
+ "title": {
+ "render": "Artwork",
+ "mappings": {
+ "0": {
+ "then": "Artwork {name}"
+ }
+ }
+ },
+ "description": "Diverse pieces of artwork",
+ "presets": {
+ "0": {
+ "title": "Artwork"
+ }
+ },
+ "tagRenderings": {
+ "1": {
+ "render": "This is a {artwork_type}",
+ "question": "What is the type of this artwork?",
+ "mappings": {
+ "0": {
+ "then": "Architecture"
+ },
+ "1": {
+ "then": "Mural"
+ },
+ "2": {
+ "then": "Painting"
+ },
+ "3": {
+ "then": "Sculpture"
+ },
+ "4": {
+ "then": "Statue"
+ },
+ "5": {
+ "then": "Bust"
+ },
+ "6": {
+ "then": "Stone"
+ },
+ "7": {
+ "then": "Installation"
+ },
+ "8": {
+ "then": "Graffiti"
+ },
+ "9": {
+ "then": "Relief"
+ },
+ "10": {
+ "then": "Azulejo (Spanish decorative tilework)"
+ },
+ "11": {
+ "then": "Tilework"
+ }
+ }
+ },
+ "2": {
+ "question": "Which artist created this?",
+ "render": "Created by {artist_name}"
+ },
+ "3": {
+ "question": "On which website is more information about this artwork?",
+ "render": "More information on this website"
+ },
+ "4": {
+ "question": "Which wikidata-entry corresponds with this artwork?",
+ "render": "Corresponds with {wikidata}"
+ }
+ }
+ }
+ }
+ },
+ "benches": {
+ "title": "Benches",
+ "shortDescription": "A map of benches",
+ "description": "This map shows all benches that are recorded in OpenStreetMap: Individual benches, and benches belonging to public transport stops or shelters. With an OpenStreetMap account, you can map new benches or edit details of existing benches."
+ },
+ "bicyclelib": {
+ "title": "Bicycle libraries",
+ "description": "A bicycle library is a place where bicycles can be lent, often for a small yearly fee. A notable use case are bicycle libraries for kids, which allows them to change for a bigger bike when they've outgrown their current bike"
+ },
+ "bike_monitoring_stations": {
+ "title": "Bike Monitoring stations",
+ "shortDescription": "Bike monitoring stations with live data from Brussels Mobility",
+ "description": "This theme shows bike monitoring stations with live data"
+ },
+ "bookcases": {
+ "title": "Open Bookcase Map",
+ "description": "A public bookcase is a small streetside cabinet, box, old phone boot or some other objects where books are stored. Everyone can place or take a book. This map aims to collect all these bookcases. You can discover new bookcases nearby and, with a free OpenStreetMap account, quickly add your favourite bookcases."
+ },
+ "campersite": {
+ "title": "Campersites",
+ "shortDescription": "Find sites to spend the night with your camper",
+ "description": "This site collects all official camper stopover places and places where you can dump grey and black water. You can add details about the services provided and the cost. Add pictures and reviews. This is a website and a webapp. The data is stored in OpenStreetMap, so it will be free forever and can be re-used by any app.",
+ "layers": {
+ "0": {
+ "name": "Camper sites",
+ "title": {
+ "render": "Camper site {name}",
+ "mappings": {
+ "0": {
+ "then": "Unnamed camper site"
+ }
+ }
+ },
+ "description": "camper sites",
+ "tagRenderings": {
+ "1": {
+ "render": "This place is called {name}",
+ "question": "What is this place called?"
+ },
+ "2": {
+ "question": "Does this place charge a fee?",
+ "mappings": {
+ "0": {
+ "then": "You need to pay for use"
+ },
+ "1": {
+ "then": "Can be used for free"
+ }
+ }
+ },
+ "3": {
+ "render": "This place charges {charge}",
+ "question": "How much does this place charge?"
+ },
+ "4": {
+ "question": "Does this place have a sanitary dump station?",
+ "mappings": {
+ "0": {
+ "then": "This place has a sanitary dump station"
+ },
+ "1": {
+ "then": "This place does not have a sanitary dump station"
+ }
+ }
+ },
+ "5": {
+ "render": "{capacity} campers can use this place at the same time",
+ "question": "How many campers can stay here? (skip if there is no obvious number of spaces or allowed vehicles)"
+ },
+ "6": {
+ "question": "Does this place provide internet access?",
+ "mappings": {
+ "0": {
+ "then": "There is internet access"
+ },
+ "1": {
+ "then": "There is internet access"
+ },
+ "2": {
+ "then": "There is no internet access"
+ }
+ }
+ },
+ "7": {
+ "question": "Do you have to pay for the internet access?",
+ "mappings": {
+ "0": {
+ "then": "You need to pay extra for internet access"
+ },
+ "1": {
+ "then": "You do not need to pay extra for internet access"
+ }
+ }
+ },
+ "8": {
+ "question": "Does this place have toilets?",
+ "mappings": {
+ "0": {
+ "then": "This place has toilets"
+ },
+ "1": {
+ "then": "This place does not have toilets"
+ }
+ }
+ },
+ "9": {
+ "render": "Official website: {website}",
+ "question": "Does this place have a website?"
+ },
+ "10": {
+ "question": "Does this place offer spots for long term rental?",
+ "mappings": {
+ "0": {
+ "then": "Yes, there are some spots for long term rental, but you can also stay on a daily basis"
+ },
+ "1": {
+ "then": "No, there are no permanent guests here"
+ },
+ "2": {
+ "then": "It is only possible to stay here if you have a long term contract(this place will disappear from this map if you choose this)"
+ }
+ }
+ },
+ "11": {
+ "render": "More details about this place: {description}",
+ "question": "Would you like to add a general description of this place? (Do not repeat information previously asked or shown above. Please keep it objective - opinions go into the reviews)"
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "camper site",
+ "description": "Add a new official camper site. These are designated places to stay overnight with your camper. They might look like a real camping or just look like a parking. They might not be signposted at all, but just be defined in a municipal decision. A regular parking intended for campers where it is not expected to spend the night, is -not- a camper site "
+ }
+ }
+ },
+ "1": {
+ "name": "Sanitary dump stations",
+ "title": {
+ "render": "Dump station {name}",
+ "mappings": {
+ "0": {
+ "then": "Dump station"
+ }
+ }
+ },
+ "description": "Sanitary dump stations",
+ "tagRenderings": {
+ "1": {
+ "question": "Does this place charge a fee?",
+ "mappings": {
+ "0": {
+ "then": "You need to pay for use"
+ },
+ "1": {
+ "then": "Can be used for free"
+ }
+ }
+ },
+ "2": {
+ "render": "This place charges {charge}",
+ "question": "How much does this place charge?"
+ },
+ "3": {
+ "question": "Does this place have a water point?",
+ "mappings": {
+ "0": {
+ "then": "This place has a water point"
+ },
+ "1": {
+ "then": "This place does not have a water point"
+ }
+ }
+ },
+ "4": {
+ "question": "Can you dispose of grey water here?",
+ "mappings": {
+ "0": {
+ "then": "You can dispose of grey water here"
+ },
+ "1": {
+ "then": "You cannot dispose of gray water here"
+ }
+ }
+ },
+ "5": {
+ "question": "Can you dispose of chemical toilet waste here?",
+ "mappings": {
+ "0": {
+ "then": "You can dispose of chemical toilet waste here"
+ },
+ "1": {
+ "then": "You cannot dispose of chemical toilet waste here"
+ }
+ }
+ },
+ "6": {
+ "question": "Who can use this dump station?",
+ "mappings": {
+ "0": {
+ "then": "You need a network key/code to use this"
+ },
+ "1": {
+ "then": "You need to be a customer of camping/campersite to use this place"
+ },
+ "2": {
+ "then": "Anyone can use this dump station"
+ },
+ "3": {
+ "then": "Anyone can use this dump station"
+ }
+ }
+ },
+ "7": {
+ "render": "This station is part of network {network}",
+ "question": "What network is this place a part of? (skip if none)"
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "sanitary dump station",
+ "description": "Add a new sanitary dump station. This is a place where camper drivers can dump waste water or chemical toilet waste. Often there's also drinking water and electricity."
+ }
+ }
+ }
+ },
+ "roamingRenderings": {
+ "0": {
+ "render": "This place is operated by {operator}",
+ "question": "Who operates this place?"
+ },
+ "1": {
+ "question": "Does this place have a power supply?",
+ "mappings": {
+ "0": {
+ "then": "This place has a power supply"
+ },
+ "1": {
+ "then": "This place does not have power supply"
+ }
+ }
+ }
+ }
+ },
+ "charging_stations": {
+ "title": "Charging stations",
+ "shortDescription": "A worldwide map of charging stations",
+ "description": "On this open map, one can find and mark information about charging stations",
+ "layers": {
+ "0": {
+ "name": "Charging stations",
+ "title": {
+ "render": "Charging station"
+ },
+ "description": "A charging station",
+ "tagRenderings": {
+ "5": {
+ "question": "When is this charging station opened?"
+ },
+ "6": {
+ "render": "{network}",
+ "question": "Which is the network of this charging stationg?",
+ "mappings": {
+ "0": {
+ "then": "Not part of a bigger network"
+ },
+ "1": {
+ "then": "AeroVironment"
+ },
+ "2": {
+ "then": "Blink"
+ },
+ "3": {
+ "then": "eVgo"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "climbing": {
+ "title": "Open Climbing Map",
+ "description": "On this map you will find various climbing opportunities such as climbing gyms, bouldering halls and rocks in nature.",
+ "descriptionTail": "The climbing map was originally made by Christian Neumann. Please get in touch if you have feedback or questions.The project uses data of the OpenStreetMap project.
",
+ "layers": {
+ "0": {
+ "name": "Climbing club",
+ "title": {
+ "render": "Climbing club",
+ "mappings": {
+ "0": {
+ "then": "Climbing NGO"
+ }
+ }
+ },
+ "description": "A climbing club or organisations",
+ "tagRenderings": {
+ "0": {
+ "render": "{name}",
+ "question": "What is the name of this climbing club or NGO?"
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Climbing club",
+ "description": "A climbing club"
+ },
+ "1": {
+ "title": "Climbing NGO",
+ "description": "A NGO working around climbing"
+ }
+ }
+ },
+ "1": {
+ "name": "Climbing gyms",
+ "title": {
+ "render": "Climbing gym",
+ "mappings": {
+ "0": {
+ "then": "Climbing gym {name}"
+ }
+ }
+ },
+ "description": "A climbing gym",
+ "tagRenderings": {
+ "2": {
+ "render": "{name}",
+ "question": "What is the name of this climbing gym?"
+ }
+ }
+ },
+ "2": {
+ "name": "Climbing routes",
+ "title": {
+ "render": "Climbing route",
+ "mappings": {
+ "0": {
+ "then": "Climbing route {name}"
+ }
+ }
+ },
+ "tagRenderings": {
+ "2": {
+ "render": "{name}",
+ "question": "What is the name of this climbing route?",
+ "mappings": {
+ "0": {
+ "then": "This climbing route doesn't have a name"
+ }
+ }
+ },
+ "3": {
+ "render": "This route is {climbing:length} meter long"
+ },
+ "4": {
+ "render": "The difficulty is {climbing:grade:french} according to the french/belgian system"
+ }
+ }
+ },
+ "3": {
+ "name": "Climbing opportunities",
+ "title": {
+ "render": "Climbing opportunity"
+ },
+ "description": "A climbing opportunity",
+ "tagRenderings": {
+ "2": {
+ "render": "{name}",
+ "question": "What is the name of this climbing opportunity?",
+ "mappings": {
+ "0": {
+ "then": "This climbing opportunity doesn't have a name"
+ }
+ }
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Climbing opportunity",
+ "description": "A climbing opportunity"
+ }
+ }
+ },
+ "4": {
+ "name": "Climbing opportunities?",
+ "title": {
+ "render": "Climbing opportunity?"
+ },
+ "description": "A climbing opportunity?",
+ "tagRenderings": {
+ "0": {
+ "render": "{name}"
+ },
+ "1": {
+ "question": "Is climbing possible here?",
+ "mappings": {
+ "0": {
+ "then": "Climbing is not possible here"
+ },
+ "1": {
+ "then": "Climbing is possible here"
+ }
+ }
+ }
+ }
+ }
+ },
+ "roamingRenderings": {
+ "0": {
+ "question": "Is there a (unofficial) website with more informations (e.g. topos)?"
+ },
+ "1": {
+ "render": "The routes are {climbing:length}m long on average",
+ "question": "What is the (average) length of the routes in meters?"
+ },
+ "2": {
+ "question": "What is the level of the easiest route here, accoring to the french classification system?",
+ "render": "The minimal difficulty is {climbing:grade:french} according to the french/belgian system"
+ },
+ "3": {
+ "question": "What is the level of the most difficult route here, accoring to the french classification system?",
+ "render": "The maximal difficulty is {climbing:grade:french} according to the french/belgian system"
+ },
+ "4": {
+ "question": "Is bouldering possible here?",
+ "mappings": {
+ "0": {
+ "then": "Bouldering is possible here"
+ },
+ "1": {
+ "then": "Bouldering is not possible here"
+ },
+ "2": {
+ "then": "Bouldering is possible, allthough there are only a few routes"
+ },
+ "3": {
+ "then": "There are {climbing:boulder} boulder routes"
+ }
+ }
+ },
+ "5": {
+ "question": "Is toprope climbing possible here?",
+ "mappings": {
+ "0": {
+ "then": "Toprope climbing is possible here"
+ },
+ "1": {
+ "then": "Toprope climbing is not possible here"
+ },
+ "2": {
+ "then": "There are {climbing:toprope} toprope routes"
+ }
+ }
+ },
+ "6": {
+ "question": "Is sport climbing possible here on fixed anchors?",
+ "mappings": {
+ "0": {
+ "then": "Sport climbing is possible here"
+ },
+ "1": {
+ "then": "Sport climbing is not possible here"
+ },
+ "2": {
+ "then": "There are {climbing:sport} sport climbing routes"
+ }
+ }
+ },
+ "7": {
+ "question": "Is traditional climbing possible here (using own gear e.g. chocks)?",
+ "mappings": {
+ "0": {
+ "then": "Traditional climbing is possible here"
+ },
+ "1": {
+ "then": "Traditional climbing is not possible here"
+ },
+ "2": {
+ "then": "There are {climbing:traditional} traditional climbing routes"
+ }
+ }
+ },
+ "8": {
+ "question": "Is there a speed climbing wall?",
+ "mappings": {
+ "0": {
+ "then": "There is a speed climbing wall"
+ },
+ "1": {
+ "then": "There is no speed climbing wall"
+ },
+ "2": {
+ "then": "There are {climbing:speed} speed climbing walls"
+ }
+ }
+ }
+ }
+ },
+ "cyclofix": {
+ "title": "Cyclofix - an open map for cyclists",
+ "description": "The goal of this map is to present cyclists with an easy-to-use solution to find the appropriate infrastructure for their needs.
You can track your precise location (mobile only) and select layers that are relevant for you in the bottom left corner. You can also use this tool to add or edit pins (points of interest) to the map and provide more data by answering the questions.
All changes you make will automatically be saved in the global database of OpenStreetMap and can be freely re-used by others.
For more information about the cyclofix project, go to cyclofix.osm.be."
+ },
+ "drinking_water": {
+ "title": "Drinking Water",
+ "description": "On this map, publicly accessible drinking water spots are shown and can be easily added"
+ },
+ "facadegardens": {
+ "title": "Facade gardens",
+ "shortDescription": "This map shows facade gardens with pictures and useful info about orientation, sunshine and plant types.",
+ "description": "Facade gardens, green facades and trees in the city not only bring peace and quiet, but also a more beautiful city, greater biodiversity, a cooling effect and better air quality.
Klimaan VZW and Mechelen Klimaatneutraal want to map existing and new facade gardens as an example for people who want to build their own garden or for city walkers who love nature.
More info about the project at klimaan.be.",
+ "layers": {
+ "0": {
+ "name": "Facade gardens",
+ "title": {
+ "render": "Facade garden"
+ },
+ "description": "Facade gardens",
+ "tagRenderings": {
+ "1": {
+ "render": "Orientation: {direction} (where 0=N and 90=O)",
+ "question": "What is the orientation of the garden?"
+ },
+ "2": {
+ "mappings": {
+ "0": {
+ "then": "The garden is in full sun"
+ },
+ "1": {
+ "then": "The garden is in partial shade"
+ },
+ "2": {
+ "then": "The sun is in the shade"
+ }
+ },
+ "question": "Is the garden shaded or sunny?"
+ },
+ "3": {
+ "question": "Is there a water barrel installed for the garden?",
+ "mappings": {
+ "0": {
+ "then": "There is a rain barrel"
+ },
+ "1": {
+ "then": "There is no rain barrel"
+ }
+ }
+ },
+ "4": {
+ "render": "Construction date of the garden: {start_date}",
+ "question": "When was the garden constructed? (a year is sufficient)"
+ },
+ "5": {
+ "mappings": {
+ "0": {
+ "then": "There are edible plants"
+ },
+ "1": {
+ "then": "There are no edible plants"
+ }
+ },
+ "question": "Are there any edible plants?"
+ },
+ "6": {
+ "question": "What kinds of plants grow here?",
+ "mappings": {
+ "0": {
+ "then": "There are vines"
+ },
+ "1": {
+ "then": "There are flowering plants"
+ },
+ "2": {
+ "then": "There are shrubs"
+ },
+ "3": {
+ "then": "There are groundcovering plants"
+ }
+ }
+ },
+ "7": {
+ "render": "More details: {description}",
+ "question": "Extra describing info about the garden (if needed and not yet described above)"
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "facade garden",
+ "description": "Add a facade garden"
+ }
+ }
+ }
+ }
+ },
+ "fritures": {
+ "layers": {
+ "0": {
+ "tagRenderings": {
+ "1": {
+ "question": "What is the name of this friture?"
+ },
+ "3": {
+ "render": "{website}",
+ "question": "What is the website of this shop?"
+ },
+ "4": {
+ "question": "What is the phone number?"
+ },
+ "8": {
+ "question": "If you bring your own container (such as a cooking pot and small pots), is it used to package your order?
",
+ "mappings": {
+ "0": {
+ "then": "You can bring your own containers to get your order, saving on single-use packaging material and thus waste"
+ },
+ "1": {
+ "then": "Bringing your own container is not allowed"
+ },
+ "2": {
+ "then": "You must bring your own container to order here."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "ghostbikes": {
+ "title": "Ghost bikes",
+ "description": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location.
On this map, one can see all the ghost bikes which are known by OpenStreetMap. Is a ghost bike missing? Everyone can add or update information here - you only need to have a (free) OpenStreetMap account."
+ },
+ "hailhydrant": {
+ "title": "Hydrants, Extinguishers, Fire stations, and Ambulance stations.",
+ "shortDescription": "Map to show hydrants, extinguishers, fire stations, and ambulance stations.",
+ "description": "On this map you can find and update hydrants, fire stations, ambulance stations, and extinguishers in your favorite neighborhoods. \n\nYou can track your precise location (mobile only) and select layers that are relevant for you in the bottom left corner. You can also use this tool to add or edit pins (points of interest) to the map and provide additional details by answering available questions. \n\nAll changes you make will automatically be saved in the global database of OpenStreetMap and can be freely re-used by others.",
+ "layers": {
+ "0": {
+ "name": "Map of hydrants",
+ "title": {
+ "render": "Hydrant"
+ },
+ "description": "Map layer to show fire hydrants.",
+ "tagRenderings": {
+ "0": {
+ "question": "What color is the hydrant?",
+ "render": "The hydrant color is {colour}",
+ "mappings": {
+ "0": {
+ "then": "The hydrant color is unknown."
+ },
+ "1": {
+ "then": "The hydrant color is yellow."
+ },
+ "2": {
+ "then": "The hydrant color is red."
+ }
+ }
+ },
+ "1": {
+ "question": "What type of hydrant is it?",
+ "render": " Hydrant type: {fire_hydrant:type}",
+ "mappings": {
+ "0": {
+ "then": "The hydrant type is unknown."
+ },
+ "1": {
+ "then": "
Pillar type."
+ },
+ "2": {
+ "then": "
Pipe type."
+ },
+ "3": {
+ "then": "
Wall type."
+ },
+ "4": {
+ "then": "
Underground type."
+ }
+ }
+ },
+ "2": {
+ "question": "Update the lifecycle status of the hydrant.",
+ "render": "Lifecycle status",
+ "mappings": {
+ "0": {
+ "then": "The hydrant is (fully or partially) working."
+ },
+ "1": {
+ "then": "The hydrant is unavailable."
+ },
+ "2": {
+ "then": "The hydrant has been removed."
+ }
+ }
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Fire hydrant",
+ "description": "A hydrant is a connection point where firefighters can tap water. It might be located underground."
+ }
+ }
+ },
+ "1": {
+ "name": "Map of fire extinguishers.",
+ "title": {
+ "render": "Extinguishers"
+ },
+ "description": "Map layer to show fire hydrants.",
+ "tagRenderings": {
+ "0": {
+ "render": "Location: {location}",
+ "question": "Where is it positioned?",
+ "mappings": {
+ "0": {
+ "then": "Found indoors."
+ },
+ "1": {
+ "then": "Found outdoors."
+ }
+ }
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Fire extinguisher",
+ "description": "A fire extinguisher is a small, portable device used to stop a fire"
+ }
+ }
+ },
+ "2": {
+ "name": "Map of fire stations",
+ "title": {
+ "render": "Fire Station"
+ },
+ "description": "Map layer to show fire stations.",
+ "tagRenderings": {
+ "0": {
+ "question": "What is the name of this fire station?",
+ "render": "This station is called {name}."
+ },
+ "1": {
+ "question": " What is the street name where the station located?",
+ "render": "This station is along a highway called {addr:street}."
+ },
+ "2": {
+ "question": "Where is the station located? (e.g. name of neighborhood, villlage, or town)",
+ "render": "This station is found within {addr:place}."
+ },
+ "3": {
+ "question": "What agency operates this station?",
+ "render": "This station is operated by {operator}.",
+ "mappings": {
+ "0": {
+ "then": "Bureau of Fire Protection"
+ }
+ }
+ },
+ "4": {
+ "question": "How is the station operator classified?",
+ "render": "The operator is a(n) {operator:type} entity.",
+ "mappings": {
+ "0": {
+ "then": "The station is operated by the government."
+ },
+ "1": {
+ "then": "The station is operated by a community-based, or informal organization."
+ },
+ "2": {
+ "then": "The station is operated by a formal group of volunteers."
+ },
+ "3": {
+ "then": "The station is privately operated."
+ }
+ }
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Fire station",
+ "description": "A fire station is a place where the fire trucks and firefighters are located when not in operation."
+ }
+ }
+ },
+ "3": {
+ "name": "Map of ambulance stations",
+ "title": {
+ "render": "Ambulance Station"
+ },
+ "description": "An ambulance station is an area for storage of ambulance vehicles, medical equipment, personal protective equipment, and other medical supplies.",
+ "tagRenderings": {
+ "0": {
+ "question": "What is the name of this ambulance station?",
+ "render": "This station is called {name}."
+ },
+ "1": {
+ "question": " What is the street name where the station located?",
+ "render": "This station is along a highway called {addr:street}."
+ },
+ "2": {
+ "question": "Where is the station located? (e.g. name of neighborhood, villlage, or town)",
+ "render": "This station is found within {addr:place}."
+ },
+ "3": {
+ "question": "What agency operates this station?",
+ "render": "This station is operated by {operator}."
+ },
+ "4": {
+ "question": "How is the station operator classified?",
+ "render": "The operator is a(n) {operator:type} entity.",
+ "mappings": {
+ "0": {
+ "then": "The station is operated by the government."
+ },
+ "1": {
+ "then": "The station is operated by a community-based, or informal organization."
+ },
+ "2": {
+ "then": "The station is operated by a formal group of volunteers."
+ },
+ "3": {
+ "then": "The station is privately operated."
+ }
+ }
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Ambulance station",
+ "description": "Add an ambulance station to the map"
+ }
+ }
+ }
+ }
+ },
+ "maps": {
+ "title": "A map of maps",
+ "shortDescription": "This theme shows all (touristic) maps that OpenStreetMap knows of",
+ "description": "On this map you can find all maps OpenStreetMap knows - typically a big map on an information board showing the area, city or region, e.g. a tourist map on the back of a billboard, a map of a nature reserve, a map of cycling networks in the region, ...)
If a map is missing, you can easily map this map on OpenStreetMap."
+ },
+ "personal": {
+ "title": "Personal theme",
+ "description": "Create a personal theme based on all the available layers of all themes"
+ },
+ "playgrounds": {
+ "title": "Playgrounds",
+ "shortDescription": "A map with playgrounds",
+ "description": "On this map, you find playgrounds and can add more information"
+ },
+ "shops": {
+ "title": "Open Shop Map",
+ "shortDescription": "An editable map with basic shop information",
+ "description": "On this map, one can mark basic information about shops, add opening hours and phone numbers",
+ "layers": {
+ "0": {
+ "name": "Shop",
+ "title": {
+ "render": "Shop",
+ "mappings": {
+ "0": {
+ "then": "{name}"
+ },
+ "1": {
+ "then": "{shop}"
+ }
+ }
+ },
+ "description": "A shop",
+ "tagRenderings": {
+ "1": {
+ "question": "What is the name of this shop?"
+ },
+ "2": {
+ "render": "This shop sells {shop}",
+ "question": "What does this shop sell?",
+ "mappings": {
+ "0": {
+ "then": "Convenience store"
+ },
+ "1": {
+ "then": "Supermarket"
+ },
+ "2": {
+ "then": "Clothing store"
+ },
+ "3": {
+ "then": "Hairdresser"
+ },
+ "4": {
+ "then": "Bakery"
+ },
+ "5": {
+ "then": "Car repair (garage)"
+ },
+ "6": {
+ "then": "Car dealer"
+ }
+ }
+ },
+ "3": {
+ "render": "{phone}",
+ "question": "What is the phone number?"
+ },
+ "4": {
+ "render": "{website}",
+ "question": "What is the website of this shop?"
+ },
+ "5": {
+ "render": "{email}",
+ "question": "What is the email address of this shop?"
+ },
+ "6": {
+ "render": "{opening_hours_table(opening_hours)}",
+ "question": "What are the opening hours of this shop?"
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Shop",
+ "description": "Add a new shop"
+ }
+ }
+ }
+ }
+ },
+ "sport_pitches": {
+ "title": "Sport pitches",
+ "shortDescription": "A map showing sport pitches",
+ "description": "A sport pitch is an area where sports are played"
+ },
+ "surveillance": {
+ "title": "Surveillance under Surveillance",
+ "shortDescription": "Surveillance cameras and other means of surveillance",
+ "description": "On this open map, you can find surveillance cameras."
+ },
+ "toilets": {
+ "title": "Open Toilet Map",
+ "description": "A map of public toilets"
+ },
+ "trees": {
+ "title": "Trees",
+ "shortDescription": "Map all the trees",
+ "description": "Map all the trees!"
+ }
+}
\ No newline at end of file
diff --git a/langs/themes/es.json b/langs/themes/es.json
new file mode 100644
index 000000000..898cfa5a6
--- /dev/null
+++ b/langs/themes/es.json
@@ -0,0 +1,10 @@
+{
+ "aed": {
+ "title": "Mapa abierto de desfibriladores (DEA)",
+ "description": "En este mapa , cualquiera puede encontrar y marcar los desfibriladores externos automáticos más cercanos"
+ },
+ "personal": {
+ "title": "Interficie personal",
+ "description": "Crea una interficie basada en todas las capas disponibles de todas las interficies"
+ }
+}
\ No newline at end of file
diff --git a/langs/themes/fr.json b/langs/themes/fr.json
new file mode 100644
index 000000000..f3a55d50d
--- /dev/null
+++ b/langs/themes/fr.json
@@ -0,0 +1,269 @@
+{
+ "aed": {
+ "title": "Carte des défibrillateurs (DAE)",
+ "description": "Sur cette carte, vous pouvez trouver et améliorer les informations sur les défibrillateurs"
+ },
+ "artworks": {
+ "title": "Carte ouverte des œuvres d'art",
+ "description": "Bienvenue sur la carte ouverte des œuvres d'art, une carte des statues, fresques, ... du monde entier",
+ "layers": {
+ "0": {
+ "name": "Œuvres d'art",
+ "title": {
+ "render": "Œuvre d'art",
+ "mappings": {
+ "0": {
+ "then": "Œuvre d'art {name}"
+ }
+ }
+ },
+ "description": "Diverses œuvres d'art",
+ "presets": {
+ "0": {
+ "title": "Œuvre d'art"
+ }
+ },
+ "tagRenderings": {
+ "1": {
+ "render": "Type d'œuvre : {artwork_type}",
+ "question": "Quel est le type de cette œuvre d'art?",
+ "mappings": {
+ "0": {
+ "then": "Architecture"
+ },
+ "1": {
+ "then": "Peinture murale"
+ },
+ "2": {
+ "then": "Peinture"
+ },
+ "3": {
+ "then": "Sculpture"
+ },
+ "4": {
+ "then": "Statue"
+ },
+ "5": {
+ "then": "Buste"
+ },
+ "6": {
+ "then": "Rocher"
+ },
+ "7": {
+ "then": "Installation"
+ },
+ "8": {
+ "then": "Graffiti"
+ },
+ "9": {
+ "then": "Relief"
+ },
+ "10": {
+ "then": "Azulejo (faïence latine)"
+ },
+ "11": {
+ "then": "Carrelage"
+ }
+ }
+ },
+ "2": {
+ "question": "Quel artiste a créé cette œuvre ?",
+ "render": "Créé par {artist_name}"
+ },
+ "3": {
+ "question": "Sur quel site web pouvons-nous trouver plus d'informations sur cette œuvre d'art?",
+ "render": "Plus d'info sûr ce site web"
+ },
+ "4": {
+ "question": "Quelle entrée wikidata correspond à cette œuvre d'art ?",
+ "render": "Correspond à {wikidata}"
+ }
+ }
+ }
+ }
+ },
+ "benches": {
+ "title": "Bancs",
+ "shortDescription": "Carte des bancs",
+ "description": "Cette carte affiche les bancs mappés dans OpenStreetMap, entre autres : bancs des transports en commun, bancs publics, etc. À l'aide de votre compte OpenStretMap, vous pourrez ajouter de nouveaux bancs ou modifier les bancs existants."
+ },
+ "bookcases": {
+ "title": "Carte des microbibliothèques",
+ "description": "Une microbibliothèques, également appelée boite à livre, est un élément de mobilier urbain (étagère, armoire, etc) dans lequel sont stockés des livres et autres objets en accès libre. Découvrez les boites à livres prêt de chez vous, ou ajouter en une nouvelle à l'aide de votre compte OpenStreetMap."
+ },
+ "cyclofix": {
+ "title": "Cyclofix - Une carte ouverte pour les cyclistes",
+ "description": "Le but de cette carte est de présenter aux cyclistes une solution facile à utiliser pour trouver l'infrastructure appropriée à leurs besoins.
Vous pouvez suivre votre localisation précise (mobile uniquement) et sélectionner les couches qui vous concernent dans le coin inférieur gauche. Vous pouvez également utiliser cet outil pour ajouter ou modifier des épingles (points d'intérêt) sur la carte et fournir plus de données en répondant aux questions.
Toutes les modifications que vous apportez seront automatiquement enregistrées dans la base de données mondiale d'OpenStreetMap et peuvent être librement réutilisées par d'autres.
Pour plus d'informations sur le projet cyclofix, rendez-vous sur cyclofix.osm.be."
+ },
+ "fritures": {
+ "title": "Carte des friteries",
+ "layers": {
+ "0": {
+ "name": "Friteries",
+ "title": {
+ "render": "Friterie",
+ "mappings": {
+ "0": {
+ "then": " {name}"
+ }
+ }
+ },
+ "tagRenderings": {
+ "1": {
+ "render": "{name}",
+ "question": "Quel est le nom de cette friterie?"
+ },
+ "2": {
+ "render": "Horaires
{opening_hours_table(opening_hours)}",
+ "question": "Quand est ce-que ce friterie ouvert?"
+ },
+ "3": {
+ "question": "Quel est le site web de cette friterie?"
+ },
+ "4": {
+ "render": "{phone}",
+ "question": "Quel est le numéro de téléphone de cette friterie?"
+ },
+ "5": {
+ "question": "Cette friterie est-elle équipée de snacks végétariens ?",
+ "mappings": {
+ "0": {
+ "then": "Des collations végétariennes sont disponibles"
+ },
+ "1": {
+ "then": "Quelques snacks végétariens seulement"
+ },
+ "2": {
+ "then": "Pas d'en-cas végétariens disponibles"
+ }
+ }
+ },
+ "6": {
+ "question": "Cette friterie est-elle équipée de snacks végétaliens ?",
+ "mappings": {
+ "0": {
+ "then": "Des collations végétaliens sont disponibles"
+ },
+ "1": {
+ "then": "Quelques snacks végétaliens seulement"
+ },
+ "2": {
+ "then": "Pas d'en-cas végétaliens disponibles"
+ }
+ }
+ },
+ "7": {
+ "question": "Cette friteuse fonctionne-t-elle avec de la graisse animale ou végétale ?",
+ "mappings": {
+ "0": {
+ "then": "Huile végétale"
+ },
+ "1": {
+ "then": "Graisse animale"
+ }
+ }
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Friturie"
+ }
+ }
+ }
+ }
+ },
+ "maps": {
+ "title": "Carte des cartes",
+ "shortDescription": "Cette carte affiche toutes les cartes (plans) mappés dans OpenStreetMap",
+ "description": "Sur cette carte sont affichées les cartes (plans) mappées dans OpenStreetMap.
Si une carte est manquante, vous pouvez l'ajouer facilement avec un compte OpenStreetMap."
+ },
+ "personal": {
+ "title": "Thème personnalisé",
+ "description": "Crée un thème personnalisé basé sur toutes les couches disponibles de tous les thèmes"
+ },
+ "shops": {
+ "title": "Carte des magasins",
+ "shortDescription": "Carte modifiable affichant les informations de base des magasins",
+ "description": "Sur cette carte, vous pouvez ajouter des informations sur les magasins, horaires d'ouverture et numéro de téléphone",
+ "layers": {
+ "0": {
+ "name": "Magasin",
+ "title": {
+ "render": "Magasin",
+ "mappings": {
+ "0": {
+ "then": "{name}"
+ },
+ "1": {
+ "then": "{shop}"
+ }
+ }
+ },
+ "description": "Un magasin",
+ "tagRenderings": {
+ "1": {
+ "question": "Qu'est-ce que le nom de ce magasin?"
+ },
+ "2": {
+ "render": "Ce magasin vends {shop}",
+ "question": "Que vends ce magasin ?",
+ "mappings": {
+ "0": {
+ "then": "Épicerie/superette"
+ },
+ "1": {
+ "then": "Supermarché"
+ },
+ "2": {
+ "then": "Magasin de vêtements"
+ },
+ "3": {
+ "then": "Coiffeur"
+ },
+ "4": {
+ "then": "Boulangerie"
+ },
+ "5": {
+ "then": "Garagiste"
+ },
+ "6": {
+ "then": "Concessionnaire"
+ }
+ }
+ },
+ "3": {
+ "render": "{phone}",
+ "question": "Quel est le numéro de téléphone ?"
+ },
+ "4": {
+ "render": "{website}",
+ "question": "Quel est le site internet de ce magasin ?"
+ },
+ "5": {
+ "render": "{email}",
+ "question": "Quel est l'adresse mail de ce magasin ?"
+ },
+ "6": {
+ "render": "{opening_hours_table(opening_hours)}",
+ "question": "Quels sont les horaires d'ouverture de ce magasin ?"
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Magasin",
+ "description": "Ajouter un nouveau magasin"
+ }
+ }
+ }
+ }
+ },
+ "sport_pitches": {
+ "title": "Terrains de sport",
+ "shortDescription": "Une carte montrant les terrains de sport",
+ "description": "Un terrain de sport est une zone faite pour pratiquer un sport"
+ },
+ "toilets": {
+ "title": "Carte des WC et toilettes publiques",
+ "description": "Carte affichant les WC et toilettes publiques"
+ }
+}
\ No newline at end of file
diff --git a/langs/themes/gl.json b/langs/themes/gl.json
new file mode 100644
index 000000000..8a8cbe3d3
--- /dev/null
+++ b/langs/themes/gl.json
@@ -0,0 +1,10 @@
+{
+ "cyclofix": {
+ "title": "Cyclofix - Un mapa aberto para os ciclistas",
+ "description": "O obxectivo deste mapa é amosar ós ciclistas unha solución doada de empregar para atopar a infraestrutura axeitada para as súas necesidades.
Podes obter a túa localización precisa (só para dispositivos móbiles) e escoller as capas que sexan relevantes para ti na esquina inferior esquerda. Tamén podes empregar esta ferramenta para engadir ou editar puntos de interese ó mapa e fornecer máis datos respondendo as cuestións.
Todas as modificacións que fagas serán gardadas de xeito automático na base de datos global do OpenStreetMap e outros poderán reutilizalos libremente.
Para máis información sobre o proxecto cyclofix, vai a cyclofix.osm.be."
+ },
+ "personal": {
+ "title": "Tema personalizado",
+ "description": "Crea un tema baseado en todas as capas dispoñíbeis de todos os temas"
+ }
+}
\ No newline at end of file
diff --git a/langs/themes/nl.json b/langs/themes/nl.json
new file mode 100644
index 000000000..65fc4924a
--- /dev/null
+++ b/langs/themes/nl.json
@@ -0,0 +1,912 @@
+{
+ "aed": {
+ "title": "Open AED-kaart",
+ "description": "Op deze kaart kan je informatie over AEDs vinden en verbeteren"
+ },
+ "aed_brugge": {
+ "title": "Open AED-kaart - Brugge edition",
+ "description": "Op deze kaart kan je informatie over AEDs vinden en verbeteren + een export van de brugse defibrillatoren"
+ },
+ "artworks": {
+ "title": "Kunstwerkenkaart",
+ "description": "Welkom op de Open Kunstwerken Kaart",
+ "layers": {
+ "0": {
+ "name": "Kunstwerken",
+ "title": {
+ "render": "Kunstwerk",
+ "mappings": {
+ "0": {
+ "then": "Kunstwerk {name}"
+ }
+ }
+ },
+ "description": "Verschillende soorten kunstwerken",
+ "presets": {
+ "0": {
+ "title": "Kunstwerk"
+ }
+ },
+ "tagRenderings": {
+ "1": {
+ "render": "Dit is een {artwork_type}",
+ "question": "Wat voor soort kunstwerk is dit?",
+ "mappings": {
+ "0": {
+ "then": "Architectuur"
+ },
+ "1": {
+ "then": "Muurschildering"
+ },
+ "2": {
+ "then": "Schilderij"
+ },
+ "3": {
+ "then": "Beeldhouwwerk"
+ },
+ "4": {
+ "then": "Standbeeld"
+ },
+ "5": {
+ "then": "Buste"
+ },
+ "6": {
+ "then": "Steen"
+ },
+ "7": {
+ "then": "Installatie"
+ },
+ "8": {
+ "then": "Graffiti"
+ },
+ "9": {
+ "then": "Reliëf"
+ },
+ "10": {
+ "then": "Azulejo (Spaanse siertegels)"
+ },
+ "11": {
+ "then": "Tegelwerk"
+ }
+ }
+ },
+ "2": {
+ "question": "Welke artist creëerde dit kunstwerk?",
+ "render": "Gecreëerd door {artist_name}"
+ },
+ "3": {
+ "question": "Op welke website kan men meer informatie vinden over dit kunstwerk?",
+ "render": "Meer informatie op deze website"
+ },
+ "4": {
+ "question": "Welk wikidata-item beschrijft dit kunstwerk?",
+ "render": "Komt overeen met {wikidata}"
+ }
+ }
+ }
+ }
+ },
+ "bicyclelib": {
+ "title": "Fietsbibliotheken",
+ "description": "Een fietsbibliotheek is een plaats waar men een fiets kan lenen, vaak voor een klein bedrag per jaar. Een typisch voorbeeld zijn kinderfietsbibliotheken, waar men een fiets op maat van het kind kan lenen. Is het kind de fiets ontgroeid, dan kan het te kleine fietsje omgeruild worden voor een grotere."
+ },
+ "bookcases": {
+ "title": "Open Boekenruilkastenkaart",
+ "description": "Een boekenruilkast is een kastje waar iedereen een boek kan nemen of achterlaten. Op deze kaart kan je deze boekenruilkasten terugvinden en met een gratis OpenStreetMap-account, ook boekenruilkasten toevoegen of informatie verbeteren"
+ },
+ "buurtnatuur": {
+ "title": "Breng jouw buurtnatuur in kaart",
+ "shortDescription": "Met deze tool kan je natuur in je buurt in kaart brengen en meer informatie geven over je favoriete plekje",
+ "description": "
meld je aan voor e-mailupdates.",
+ "descriptionTail": "Tips
- Over groen ingekleurde gebieden weten we alles wat we willen weten.
- Bij rood ingekleurde gebieden ontbreekt nog heel wat info: klik een gebied aan en beantwoord de vragen.
- Je kan altijd een vraag overslaan als je het antwoord niet weet of niet zeker bent
- Je kan altijd een foto toevoegen
- Je kan ook zelf een gebied toevoegen door op de kaart te klikken
- Open buurtnatuur.be op je smartphone om al wandelend foto's te maken en vragen te beantwoorden
De oorspronkelijke data komt van OpenStreetMap en je antwoorden worden daar bewaard.
Omdat iedereen vrij kan meewerken aan dit project, kunnen we niet garanderen dat er geen fouten opduiken.Kan je hier niet aanpassen wat je wilt, dan kan je dat zelf via OpenStreetMap.org doen. Groen kan geen enkele verantwoordelijkheid nemen over de kaart.
Je privacy is belangrijk. We tellen wel hoeveel gebruikers deze website bezoeken. We plaatsen een cookie waar geen persoonlijke informatie in bewaard wordt. Als je inlogt, komt er een tweede cookie bij met je inloggegevens.",
+ "layers": {
+ "0": {
+ "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.",
+ "presets": {
+ "0": {
+ "title": "Natuurreservaat",
+ "description": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt"
+ }
+ }
+ },
+ "1": {
+ "name": "Park",
+ "title": {
+ "render": "Park",
+ "mappings": {
+ "0": {
+ "then": "{name:nl}"
+ },
+ "1": {
+ "then": "{name}"
+ }
+ }
+ },
+ "description": "Een park is een publiek toegankelijke, groene ruimte binnen de stad. Ze is typisch ingericht voor recreatief gebruik, met (verharde) wandelpaden, zitbanken, vuilnisbakken, een gezellig vijvertje, ...",
+ "presets": {
+ "0": {
+ "title": "Park",
+ "description": "Voeg een ontbrekend park toe"
+ }
+ }
+ },
+ "2": {
+ "name": "Bos",
+ "title": {
+ "render": "Bos",
+ "mappings": {
+ "0": {
+ "then": "{name:nl}"
+ },
+ "1": {
+ "then": "{name}"
+ }
+ }
+ },
+ "description": "Een bos is een verzameling bomen, al dan niet als productiehout.",
+ "presets": {
+ "0": {
+ "title": "Bos",
+ "description": "Voeg een ontbrekend bos toe aan de kaart"
+ }
+ }
+ }
+ },
+ "roamingRenderings": {
+ "0": {
+ "render": "De toegankelijkheid van dit gebied is: {access:description}",
+ "question": "Is dit gebied toegankelijk?",
+ "mappings": {
+ "0": {
+ "then": "Dit gebied is vrij toegankelijk"
+ },
+ "1": {
+ "then": "Vrij toegankelijk"
+ },
+ "2": {
+ "then": "Niet toegankelijk"
+ },
+ "3": {
+ "then": "Niet toegankelijk, want privégebied"
+ },
+ "4": {
+ "then": "Toegankelijk, ondanks dat het privegebied is"
+ },
+ "5": {
+ "then": "Enkel toegankelijk met een gids of tijdens een activiteit"
+ },
+ "6": {
+ "then": "Toegankelijk mits betaling"
+ }
+ }
+ },
+ "1": {
+ "render": "Beheer door {operator}",
+ "question": "Wie beheert dit gebied?",
+ "mappings": {
+ "1": {
+ "then": "
Dit gebied wordt beheerd door Natuurpunt"
+ },
+ "2": {
+ "then": "
Dit gebied wordt beheerd door {operator}"
+ },
+ "3": {
+ "then": "
Dit gebied wordt beheerd door het Agentschap Natuur en Bos"
+ }
+ }
+ },
+ "2": {
+ "render": "Extra info: {description}"
+ },
+ "3": {
+ "render": "Extra info via buurtnatuur.be: {description:0}"
+ },
+ "4": {
+ "render": "Dit gebied heet {name:nl}",
+ "question": "Wat is de Nederlandstalige naam van dit gebied?"
+ },
+ "5": {
+ "render": "Dit gebied heet {name}",
+ "question": "Wat is de naam van dit gebied?",
+ "mappings": {
+ "0": {
+ "then": "Dit gebied heeft geen naam"
+ }
+ }
+ }
+ }
+ },
+ "climbing": {
+ "title": "Open Klimkaart",
+ "description": "Op deze kaart vind je verschillende klimgelegenheden, zoals klimzalen, bolderzalen en klimmen in de natuur",
+ "descriptionTail": "De Open Klimkaart is oorspronkelijk gemaakt door Christian Neumann op kletterspots.de.",
+ "layers": {
+ "0": {
+ "name": "Klimclub",
+ "title": {
+ "render": "Klimclub",
+ "mappings": {
+ "0": {
+ "then": "Klimorganisatie"
+ }
+ }
+ },
+ "description": "Een klimclub of organisatie",
+ "tagRenderings": {
+ "0": {
+ "render": "{name}",
+ "question": "Wat is de naam van deze klimclub?"
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Klimclub",
+ "description": "Een klimclub"
+ },
+ "1": {
+ "title": "Een klimorganisatie",
+ "description": "Een VZW die werkt rond klimmen"
+ }
+ }
+ },
+ "1": {
+ "name": "Klimzalen",
+ "title": {
+ "render": "Klimzaal",
+ "mappings": {
+ "0": {
+ "then": "Klimzaal {name}"
+ }
+ }
+ },
+ "tagRenderings": {
+ "2": {
+ "render": "{name}",
+ "question": "Wat is de naam van dit Klimzaal?"
+ }
+ }
+ },
+ "2": {
+ "name": "Klimroute",
+ "title": {
+ "render": "Klimroute",
+ "mappings": {
+ "0": {
+ "then": "Klimroute {name}"
+ }
+ }
+ },
+ "tagRenderings": {
+ "2": {
+ "render": "{name}",
+ "question": "Hoe heet deze klimroute?",
+ "mappings": {
+ "0": {
+ "then": "Deze klimroute heeft geen naam"
+ }
+ }
+ },
+ "3": {
+ "render": "Deze klimroute is {climbing:length} meter lang"
+ },
+ "4": {
+ "render": "De klimmoeilijkheid is {climbing:grade:french} volgens het Franse/Belgische systeem"
+ }
+ }
+ },
+ "3": {
+ "name": "Klimgelegenheden",
+ "title": {
+ "render": "Klimgelegenheid"
+ },
+ "description": "Een klimgelegenheid",
+ "tagRenderings": {
+ "2": {
+ "render": "{name}",
+ "question": "Wat is de naam van dit Klimgelegenheid?",
+ "mappings": {
+ "0": {
+ "then": "Dit Klimgelegenheid heeft geen naam"
+ }
+ }
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Klimgelegenheid",
+ "description": "Een klimgelegenheid"
+ }
+ }
+ },
+ "4": {
+ "name": "Klimgelegenheiden?",
+ "title": {
+ "render": "Klimgelegenheid?"
+ },
+ "description": "Een klimgelegenheid?"
+ }
+ },
+ "roamingRenderings": {
+ "1": {
+ "render": "De klimroutes zijn gemiddeld {climbing:length}m lang",
+ "question": "Wat is de (gemiddelde) lengte van de klimroutes, in meter?"
+ },
+ "2": {
+ "question": "Wat is het niveau van de makkelijkste route, volgens het Franse classificatiesysteem?",
+ "render": "De minimale klimmoeilijkheid is {climbing:grade:french} volgens het Franse/Belgische systeem"
+ },
+ "3": {
+ "question": "Wat is het niveau van de moeilijkste route, volgens het Franse classificatiesysteem?",
+ "render": "De maximale klimmoeilijkheid is {climbing:grade:french} volgens het Franse/Belgische systeem"
+ },
+ "4": {
+ "question": "Is het mogelijk om hier te bolderen?",
+ "mappings": {
+ "0": {
+ "then": "Bolderen kan hier"
+ },
+ "1": {
+ "then": "Bolderen kan hier niet"
+ },
+ "2": {
+ "then": "Bolderen kan hier, maar er zijn niet zoveel routes"
+ },
+ "3": {
+ "then": "Er zijn hier {climbing:boulder} bolderroutes"
+ }
+ }
+ },
+ "5": {
+ "question": "Is het mogelijk om hier te toprope-klimmen?",
+ "mappings": {
+ "0": {
+ "then": "Toprope-klimmen kan hier"
+ },
+ "1": {
+ "then": "Toprope-klimmen kan hier niet"
+ },
+ "2": {
+ "then": "Er zijn hier {climbing:toprope} toprope routes"
+ }
+ }
+ },
+ "6": {
+ "question": "Is het mogelijk om hier te sportklimmen/voorklimmen op reeds aangebrachte haken?",
+ "mappings": {
+ "0": {
+ "then": "Sportklimmen/voorklimmen kan hier"
+ },
+ "1": {
+ "then": "Sportklimmen/voorklimmen kan hier niet"
+ },
+ "2": {
+ "then": "Er zijn hier {climbing:sport} sportklimroutes/voorklimroutes"
+ }
+ }
+ },
+ "7": {
+ "question": "Is het mogelijk om hier traditioneel te klimmen?
(Dit is klimmen met klemblokjes en friends)",
+ "mappings": {
+ "0": {
+ "then": "Traditioneel klimmen kan hier"
+ },
+ "1": {
+ "then": "Traditioneel klimmen kan hier niet"
+ },
+ "2": {
+ "then": "Er zijn hier {climbing:traditional} traditionele klimroutes"
+ }
+ }
+ },
+ "8": {
+ "question": "Is er een snelklimmuur (speed climbing)?",
+ "mappings": {
+ "0": {
+ "then": "Er is een snelklimmuur voor speed climbing"
+ },
+ "1": {
+ "then": "Er is geen snelklimmuur voor speed climbing"
+ },
+ "2": {
+ "then": "Er zijn hier {climbing:speed} snelklimmuren"
+ }
+ }
+ }
+ }
+ },
+ "fietsstraten": {
+ "title": "Fietsstraten",
+ "shortDescription": "Een kaart met alle gekende fietsstraten",
+ "description": "Een fietsstraat is een straat waar - automobilisten geen fietsers mogen inhalen
- Er een maximumsnelheid van 30km/u geldt
- Fietsers gemotoriseerde voortuigen links mogen inhalen
- Fietsers nog steeds voorrang aan rechts moeten verlenen - ook aan auto's en voetgangers op het zebrapad
Op deze open kaart kan je alle gekende fietsstraten zien en kan je ontbrekende fietsstraten aanduiden. Om de kaart aan te passen, moet je je aanmelden met OpenStreetMap en helemaal inzoomen tot straatniveau.",
+ "roamingRenderings": {
+ "0": {
+ "question": "Is deze straat een fietsstraat?",
+ "mappings": {
+ "0": {
+ "then": "Deze straat is een fietsstraat (en dus zone 30)"
+ },
+ "1": {
+ "then": "Deze straat is een fietsstraat"
+ },
+ "2": {
+ "then": "Deze straat wordt binnenkort een fietsstraat"
+ },
+ "3": {
+ "then": "Deze straat is geen fietsstraat"
+ }
+ }
+ },
+ "1": {
+ "question": "Wanneer wordt deze straat een fietsstraat?",
+ "render": "Deze straat wordt fietsstraat op {cyclestreet:start_date}"
+ }
+ },
+ "layers": {
+ "0": {
+ "name": "Fietsstraten",
+ "description": "Een fietsstraat is een straat waar gemotoriseerd verkeer een fietser niet mag inhalen."
+ },
+ "1": {
+ "name": "Toekomstige fietsstraat",
+ "description": "Deze straat wordt binnenkort een fietsstraat",
+ "title": {
+ "render": "Toekomstige fietsstraat",
+ "mappings": {
+ "0": {
+ "then": "{name} wordt fietsstraat"
+ }
+ }
+ }
+ },
+ "2": {
+ "name": "Alle straten",
+ "description": "Laag waar je een straat als fietsstraat kan markeren",
+ "title": {
+ "render": "Straat"
+ }
+ }
+ }
+ },
+ "cyclofix": {
+ "title": "Cyclofix - een open kaart voor fietsers",
+ "description": "Het doel van deze kaart is om fietsers een gebruiksvriendelijke oplossing te bieden voor het vinden van de juiste infrastructuur voor hun behoeften.
U kunt uw exacte locatie volgen (enkel mobiel) en in de linkerbenedenhoek categorieën selecteren die voor u relevant zijn. U kunt deze tool ook gebruiken om 'spelden' aan de kaart toe te voegen of te bewerken en meer gegevens te verstrekken door de vragen te beantwoorden.
Alle wijzigingen die u maakt worden automatisch opgeslagen in de wereldwijde database van OpenStreetMap en kunnen door anderen vrij worden hergebruikt.
Bekijk voor meer info over cyclofix ook cyclofix.osm.be."
+ },
+ "drinking_water": {
+ "title": "Drinkwaterpunten",
+ "description": "Op deze kaart staan publiek toegankelijke drinkwaterpunten en kan je makkelijk een nieuw drinkwaterpunt toevoegen"
+ },
+ "facadegardens": {
+ "title": "Straatgeveltuintjes",
+ "shortDescription": "Deze kaart toont geveltuintjes met foto's en bruikbare info over oriëntatie, zonlicht en planttypes.",
+ "description": "Ontharde voortuintjes, groene gevels en bomen ín de stad brengen naast rust ook een mooiere stad, een grotere biodiversiteit, een verkoelend effect en een betere luchtkwaliteit.
Klimaan VZW en 'Mechelen Klimaatneutraal' willen met het project Klim(t)aan je Gevel bestaande en nieuwe geveltuintjes in kaart brengen als voorbeeld voor mensen zelf een tuintje willen aanleggen of voor stadwandelaars die houden van de natuur.
Meer info over het project op klimaan.be.",
+ "layers": {
+ "0": {
+ "name": "Geveltuintjes",
+ "title": {
+ "render": "Geveltuintje"
+ },
+ "description": "Geveltuintjes",
+ "tagRenderings": {
+ "1": {
+ "render": "Oriëntatie: {direction} (waarbij 0=N en 90=O)",
+ "question": "Hoe is de tuin georiënteerd?"
+ },
+ "2": {
+ "mappings": {
+ "0": {
+ "then": "Het is een volle zon tuintje"
+ },
+ "1": {
+ "then": "Het is een halfschaduw tuintje"
+ },
+ "2": {
+ "then": "Het is een schaduw tuintje"
+ }
+ },
+ "question": "Ligt de tuin in zon/half schaduw of schaduw?"
+ },
+ "3": {
+ "question": "Is er een regenton voorzien bij het tuintje?",
+ "mappings": {
+ "0": {
+ "then": "Er is een regenton"
+ },
+ "1": {
+ "then": "Er is geen regenton"
+ }
+ }
+ },
+ "4": {
+ "render": "Aanlegdatum van de tuin: {start_date}",
+ "question": "Wanneer werd de tuin aangelegd? (vul gewoon een jaartal in)"
+ },
+ "5": {
+ "mappings": {
+ "0": {
+ "then": "Er staan eetbare planten"
+ },
+ "1": {
+ "then": "Er staan geen eetbare planten"
+ }
+ },
+ "question": "Staan er eetbare planten?"
+ },
+ "6": {
+ "question": "Wat voor planten staan hier?",
+ "mappings": {
+ "0": {
+ "then": "Er staat een klimplant"
+ },
+ "1": {
+ "then": "Er staan bloeiende planten"
+ },
+ "2": {
+ "then": "Er staan struiken"
+ },
+ "3": {
+ "then": "Er staan bodembedekkers"
+ }
+ }
+ },
+ "7": {
+ "render": "Meer details: {description}",
+ "question": "Aanvullende omschrijving van de tuin (indien nodig, en voor zover nog niet omschreven hierboven)"
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "geveltuintje",
+ "description": "Voeg geveltuintje toe"
+ }
+ }
+ }
+ }
+ },
+ "fritures": {
+ "title": "Friturenkaart",
+ "description": "Op deze kaart vind je je favoriete frituur!",
+ "layers": {
+ "0": {
+ "name": "Frituren",
+ "title": {
+ "render": "Frituur",
+ "mappings": {
+ "0": {
+ "then": " {name}"
+ }
+ }
+ },
+ "tagRenderings": {
+ "1": {
+ "render": "{name}",
+ "question": "Wat is de naam van deze frituur?"
+ },
+ "2": {
+ "render": "Openingsuren
{opening_hours_table(opening_hours)}",
+ "question": "Wat zijn de openinguren van deze frituur?"
+ },
+ "3": {
+ "question": "Wat is de website van deze frituur?"
+ },
+ "4": {
+ "render": "{phone}",
+ "question": "Wat is het telefoonnummer van deze frituur?"
+ },
+ "5": {
+ "question": "Heeft deze frituur vegetarische snacks?",
+ "mappings": {
+ "0": {
+ "then": "Er zijn vegetarische snacks aanwezig"
+ },
+ "1": {
+ "then": "Slechts enkele vegetarische snacks"
+ },
+ "2": {
+ "then": "Geen vegetarische snacks beschikbaar"
+ }
+ }
+ },
+ "6": {
+ "question": "Heeft deze frituur veganistische snacks?",
+ "mappings": {
+ "0": {
+ "then": "Er zijn veganistische snacks aanwezig"
+ },
+ "1": {
+ "then": "Slechts enkele veganistische snacks"
+ },
+ "2": {
+ "then": "Geen veganistische snacks beschikbaar"
+ }
+ }
+ },
+ "7": {
+ "question": "Bakt deze frituur in dierlijk vetof plantaardig olie?",
+ "mappings": {
+ "0": {
+ "then": "Plantaardige olie"
+ },
+ "1": {
+ "then": "Dierlijk vet"
+ }
+ }
+ },
+ "8": {
+ "question": "Als je je eigen container (bv. kookpot of kleine potjes voor saus) meeneemt, gebruikt de frituur deze dan om je bestelling in te doen?",
+ "mappings": {
+ "0": {
+ "then": "Je mag je eigen containers meenemen om je bestelling in mee te nemen en zo minder afval te maken"
+ },
+ "1": {
+ "then": "Je mag geen eigen containers meenemen om je bestelling in mee te nemen"
+ },
+ "2": {
+ "then": "Je moet je eigen containers meenemen om je bestelling in mee te nemen."
+ }
+ }
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Frituur"
+ }
+ }
+ }
+ }
+ },
+ "boomgaarden": {
+ "title": "Open Boomgaardenkaart",
+ "shortDescription": "Boomgaarden en fruitbomen",
+ "description": "Op deze kaart vindt je boomgaarden en fruitbomen",
+ "layers": {
+ "0": {
+ "name": "Boomgaarden",
+ "title": {
+ "render": "Boomgaard"
+ },
+ "presets": {
+ "0": {
+ "title": "Boomgaard",
+ "description": "Voeg een boomgaard toe (als punt - omtrek nog te tekenen)"
+ }
+ }
+ },
+ "1": {
+ "name": "Boom",
+ "title": {
+ "render": "Boom"
+ },
+ "description": "Een boom",
+ "tagRenderings": {
+ "0": {
+ "render": "De soort is {species:nl}",
+ "question": "Wat is de soort van deze boom (in het Nederlands)?"
+ },
+ "1": {
+ "render": "Het ras (taxon) van deze boom is {taxon}",
+ "question": "Wat is het taxon (ras) van deze boom?"
+ },
+ "2": {
+ "render": "Beschrijving: {description}",
+ "question": "Welke beschrijving past bij deze boom?"
+ },
+ "3": {
+ "render": "Referentienummer: {ref}",
+ "question": "Is er een refernetienummer?"
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Boom",
+ "description": "Voeg hier een boom toe"
+ }
+ }
+ }
+ }
+ },
+ "ghostbikes": {
+ "title": "Witte Fietsen",
+ "description": "Een Witte Fiets of Spookfiets is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat om een fiets die volledig wit is geschilderd en in de buurt van het ongeval werd geinstalleerd.
Op deze kaart zie je alle witte fietsen die door OpenStreetMap gekend zijn. Ontbreekt er een Witte Fiets of wens je informatie aan te passen? Meld je dan aan met een (gratis) OpenStreetMap account."
+ },
+ "grb": {
+ "title": "GRB Fixup",
+ "shortDescription": "Grb Fixup",
+ "description": "GRB Fixup",
+ "layers": {
+ "0": {
+ "name": "Fixmes op gebouwen",
+ "title": {
+ "render": "{addr:street} {addr:housenumber}",
+ "mappings": {
+ "0": {
+ "then": "{fixme}"
+ }
+ }
+ },
+ "description": "Dit gebouw heeft een foutmelding",
+ "tagRenderings": {
+ "0": {
+ "render": "Het huisnummer is {addr:housenumber}",
+ "question": "Wat is het huisnummer?",
+ "mappings": {
+ "0": {
+ "then": "Geen huisnummer"
+ }
+ }
+ },
+ "1": {
+ "render": "De wooneenheid-aanduiding is {addr:unit} "
+ },
+ "2": {
+ "render": "De straat is {addr:street}",
+ "question": "Wat is de straat?"
+ },
+ "3": {
+ "render": "De fixme is {fixme}",
+ "question": "Wat zegt de fixme?",
+ "mappings": {
+ "0": {
+ "then": "Geen fixme"
+ }
+ }
+ },
+ "4": {
+ "render": "Dit gebouw begint maar op de {building:min_level} verdieping",
+ "question": "Hoeveel verdiepingen ontbreken?"
+ }
+ }
+ }
+ }
+ },
+ "maps": {
+ "title": "Een kaart met Kaarten",
+ "shortDescription": "Een kaart met alle kaarten die OpenStreetMap kent",
+ "description": "Op deze kaart kan je alle kaarten zien die OpenStreetMap kent.
Ontbreekt er een kaart, dan kan je die kaart hier ook gemakelijk aan deze kaart toevoegen."
+ },
+ "nature": {
+ "title": "De Natuur in",
+ "shortDescription": "Deze kaart bevat informatie voor natuurliefhebbers",
+ "description": "Op deze kaart vind je informatie voor natuurliefhebbers, zoals info over het natuurgebied waar je inzit, vogelkijkhutten, informatieborden, ..."
+ },
+ "personal": {
+ "title": "Persoonlijk thema",
+ "description": "Stel je eigen thema samen door lagen te combineren van alle andere themas"
+ },
+ "play_forests": {
+ "title": "Speelbossen",
+ "shortDescription": "Deze kaart toont speelbossen",
+ "description": "Een speelbos is een zone in een bos die vrij toegankelijk is voor spelende kinderen. Deze wordt in bossen van het Agentschap Natuur en bos altijd aangeduid met het overeenkomstige bord."
+ },
+ "playgrounds": {
+ "title": "Speelplekken",
+ "shortDescription": "Een kaart met speeltuinen",
+ "description": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen"
+ },
+ "speelplekken": {
+ "title": "Speelplekken in de Antwerpse Zuidrand",
+ "shortDescription": "Speelplekken in de Antwerpse Zuidrand",
+ "description": "Speelplekken in de Antwerpse Zuidrand. Een project van Provincie Antwerpen, in samenwerking met Createlli, Sportpret en OpenStreetMap België",
+ "layers": {
+ "7": {
+ "name": "Wandelroutes van provincie Antwerpen",
+ "tagRenderings": {
+ "0": {
+ "render": "Deze wandeling is {_length:km}km lang"
+ },
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "Dit is een internationale wandelroute"
+ },
+ "1": {
+ "then": "Dit is een nationale wandelroute"
+ },
+ "2": {
+ "then": "Dit is een regionale wandelroute"
+ },
+ "3": {
+ "then": "Dit is een lokale wandelroute"
+ }
+ }
+ },
+ "2": {
+ "render": "Korte beschrijving:
{description}"
+ },
+ "3": {
+ "question": "Wie beheert deze wandeling en plaatst dus de signalisatiebordjes?"
+ },
+ "4": {
+ "question": "Naar wie kan men emailen bij problemen rond signalisatie?",
+ "render": "Bij problemen met signalisatie kan men emailen naar {operator:email}"
+ }
+ }
+ }
+ }
+ },
+ "speelplekken_temp": {
+ "title": "Speelplekken in de Antwerpse Zuidrand",
+ "shortDescription": "Speelplekken in de Antwerpse Zuidrand",
+ "description": "Speelplekken in de Antwerpse Zuidrand. Een project van Provincie Antwerpen, in samenwerking met Createlli, Sportpret en OpenStreetMap België",
+ "layers": {
+ "6": {
+ "name": "Wandelroutes van provincie Antwerpen",
+ "tagRenderings": {
+ "0": {
+ "render": "Deze wandeling is {_length:km}km lang"
+ },
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "Dit is een internationale wandelroute"
+ },
+ "1": {
+ "then": "Dit is een nationale wandelroute"
+ },
+ "2": {
+ "then": "Dit is een regionale wandelroute"
+ },
+ "3": {
+ "then": "Dit is een lokale wandelroute"
+ }
+ }
+ },
+ "2": {
+ "render": "Korte beschrijving:
{description}"
+ },
+ "3": {
+ "question": "Wie beheert deze wandeling en plaatst dus de signalisatiebordjes?"
+ },
+ "4": {
+ "question": "Naar wie kan men emailen bij problemen rond signalisatie?",
+ "render": "Bij problemen met signalisatie kan men emailen naar {operator:email}"
+ }
+ }
+ }
+ }
+ },
+ "sport_pitches": {
+ "title": "Sportvelden",
+ "shortDescription": "Deze kaart toont sportvelden",
+ "description": "Een sportveld is een ingerichte plaats met infrastructuur om een sport te beoefenen"
+ },
+ "surveillance": {
+ "title": "Surveillance under Surveillance",
+ "shortDescription": "Bewakingscameras en dergelijke",
+ "description": "Op deze open kaart kan je bewakingscamera's vinden."
+ },
+ "trees": {
+ "title": "Bomen",
+ "shortDescription": "Breng bomen in kaart",
+ "description": "Breng bomen in kaart!"
+ },
+ "width": {
+ "title": "Straatbreedtes",
+ "shortDescription": "Is de straat breed genoeg?",
+ "description": " De straat is opgebruikt
\n Er is steeds meer druk op de openbare ruimte. Voetgangers, fietsers, steps, auto's, bussen, bestelwagens, buggies, cargobikes, ... willen allemaal hun deel van de openbare ruimte.
\n In deze studie nemen we Brugge onder de loep en kijken we hoe breed elke straat is én hoe breed elke straat zou moeten zijn voor een veilig én vlot verkeer.
\n Legende
\n     Straat te smal voor veilig verkeer
\n     Straat is breed genoeg veilig verkeer
\n     Straat zonder voetpad, te smal als ook voetgangers plaats krijgen
\n     Woonerf, autoluw, autoloos of enkel plaatselijk verkeer
\n
\n
\n Een gestippelde lijn is een straat waar ook voor fietsers éénrichtingsverkeer geldt.
\n Klik op een straat om meer informatie te zien.\n Hoe gaan we verder?
\n Verschillende ingrepen kunnen de stad teruggeven aan de inwoners en de stad leefbaarder en levendiger maken.
\n Denk aan:\n \n - De autovrije zone's uitbreiden
\n - De binnenstad fietszone maken
\n - Het aantal woonerven uitbreiden
\n - Grotere auto's meer belasten - ze nemen immers meer parkeerruimte in.
\n - Laat toeristen verplicht parkeren onder het zand; een (fiets)taxi kan hen naar hun hotel brengen
\n - Voorzie in elke straat enkele parkeerplaatsen voor kortparkeren. Zo kunnen leveringen, iemand afzetten,... gebeuren zonder op het voetpad en fietspad te parkeren
\n
",
+ "layers": {
+ "0": {
+ "name": "Straten met een breedte",
+ "title": {
+ "render": "{name}",
+ "mappings": {
+ "0": {
+ "then": "Naamloos segmet"
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/scripts/ScriptUtils.ts b/scripts/ScriptUtils.ts
index fc54759a2..93521089e 100644
--- a/scripts/ScriptUtils.ts
+++ b/scripts/ScriptUtils.ts
@@ -1,5 +1,7 @@
-import {lstatSync, readdirSync} from "fs";
+import {lstatSync, readdirSync, readFileSync} from "fs";
import * as https from "https";
+import {LayerConfigJson} from "../Customizations/JSON/LayerConfigJson";
+import {LayoutConfigJson} from "../Customizations/JSON/LayoutConfigJson";
export default class ScriptUtils {
public static readDirRecSync(path): string[] {
@@ -58,5 +60,34 @@ export default class ScriptUtils {
}).then(() => ScriptUtils.sleep(ms - 1000));
}
+ public static 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)
+ }
+ })
+ }
+
+ public static getThemeFiles() : {parsed: LayoutConfigJson, path: string}[] {
+ return ScriptUtils.readDirRecSync("./assets/themes")
+ .filter(path => path.endsWith(".json"))
+ .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 read file ", path, "due to ", e)
+ throw e
+ }
+ });
+ }
+
}
diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts
index f73836f1e..6f09acec2 100644
--- a/scripts/generateLayerOverview.ts
+++ b/scripts/generateLayerOverview.ts
@@ -8,6 +8,7 @@ import * as licenses from "../assets/generated/license_info.json"
import LayoutConfig from "../Customizations/JSON/LayoutConfig";
import {LayerConfigJson} from "../Customizations/JSON/LayerConfigJson";
import {Translation} from "../UI/i18n/Translation";
+import {LayoutConfigJson} from "../Customizations/JSON/LayoutConfigJson";
// This scripts scans 'assets/layers/*.json' for layer definition files and 'assets/themes/*.json' for theme definition files.
// It spits out an overview of those to be used to load them
@@ -17,43 +18,13 @@ interface LayersAndThemes {
}
-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)
- }
- })
- }
-
-
- 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
- }
- });
- }
-
+class LayerOverviewUtils {
loadThemesAndLayers(): LayersAndThemes {
- const layerFiles = this.getLayerFiles();
+ const layerFiles = ScriptUtils.getLayerFiles();
- const themeFiles: any[] = this.getThemeFiles();
+ const themeFiles: LayoutConfigJson[] = ScriptUtils.getThemeFiles().map(x => x.parsed);
console.log("Discovered", layerFiles.length, "layers and", themeFiles.length, "themes\n")
return {
diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts
index e3d392229..9cd8a0470 100644
--- a/scripts/generateTranslations.ts
+++ b/scripts/generateTranslations.ts
@@ -1,12 +1,8 @@
import * as fs from "fs";
+import {readFileSync, writeFileSync} 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";
-import {Script} from "vm";
const knownLanguages = ["en", "nl", "de", "fr", "es", "gl", "ca"];
@@ -44,17 +40,6 @@ class TranslationPart {
this.contents.set(translationsKey, v)
}
}
-
- isLeaf() {
- for (let key of Array.from(this.contents.keys())) {
- const value = this.contents.get(key);
- if (typeof value !== "string") {
- return false;
- }
- }
- return true;
- }
-
recursiveAdd(object: any) {
@@ -109,6 +94,7 @@ class TranslationPart {
if (typeof value === "string") {
value = value.replace(/"/g, "\\\"")
+ .replace(/\n/g, "\\n")
if (neededLanguage === undefined) {
parts.push(`\"${key}\": \"${value}\"`)
} else if (key === neededLanguage) {
@@ -191,26 +177,26 @@ function compileTranslationsFromWeblate() {
}
-function generateTranslationFromLayerConfig(layerConfig: LayerConfigJson): TranslationPart {
- const tr = new TranslationPart();
- tr.recursiveAdd(layerConfig)
- return tr;
-}
-
-// Get all the string out of the themes
-function generateLayerTranslationsObject() {
- const layerFiles = new LayerOverviewUtils().getLayerFiles();
-
+// Get all the strings out of the layers
+function generateTranslationsObjectFrom(objects: { path: string, parsed: { id: string } }[], target: string) {
const tr = new TranslationPart();
- for (const layerFile of layerFiles) {
- const config: LayerConfigJson = layerFile.parsed;
- const layerTr = generateTranslationFromLayerConfig(config)
+ for (const layerFile of objects) {
+ const config: { id: string } = layerFile.parsed;
+ const layerTr = new TranslationPart();
+ if (config === undefined) {
+ throw "Got something not parsed! Path is " + layerFile.path
+ }
+ layerTr.recursiveAdd(config)
tr.contents.set(config.id, layerTr)
}
const langs = tr.knownLanguages();
for (const lang of langs) {
+ if(lang === "#"){
+ // Lets not export our comments
+ continue;
+ }
console.log("Exporting ", lang)
let json = tr.toJson(lang)
@@ -220,7 +206,7 @@ function generateLayerTranslationsObject() {
console.error(e)
}
- writeFileSync("langs/layers/" + lang + ".json", json)
+ writeFileSync(`langs/${target}/${lang}.json`, json)
}
}
@@ -236,14 +222,14 @@ function MergeTranslation(source: any, target: any, language: string, context: s
// Already the same
continue;
}
-
- if(typeof targetV === "string"){
- console.error("Could not add a translation to string ", targetV, ". The translation is", sourceV, " in "+context)
+
+ if (typeof targetV === "string") {
+ console.error("Could not add a translation to string ", targetV, ". The translation is", sourceV, " in " + context)
continue;
}
targetV[language] = sourceV;
- console.log(" + ",context + "." + language, "-->", sourceV)
+ console.log(" + ", context + "." + language, "-->", sourceV)
continue
}
if (typeof sourceV === "object") {
@@ -285,14 +271,15 @@ function mergeLayerTranslations() {
translationFiles.set(language, JSON.parse(readFileSync(translationFilePath, "utf8")))
}
- const layerFiles = new LayerOverviewUtils().getLayerFiles();
+ const layerFiles = ScriptUtils.getLayerFiles();
for (const layerFile of layerFiles) {
mergeLayerTranslation(layerFile.parsed, layerFile.path, translationFiles)
}
}
-mergeLayerTranslations();
-generateLayerTranslationsObject()
+mergeLayerTranslations();
+generateTranslationsObjectFrom(ScriptUtils.getLayerFiles(), "layers")
+generateTranslationsObjectFrom(ScriptUtils.getThemeFiles(), "themes")
compileTranslationsFromWeblate();