Merge branch 'develop' of source.mapcomplete.org:MapComplete/MapComplete into develop

This commit is contained in:
Pieter Vander Vennet 2025-02-17 01:34:31 +01:00
commit 7413765646
67 changed files with 1025 additions and 525 deletions

View file

@ -0,0 +1,2 @@
SPDX-FileCopyrightText: Pieter Vander Vennet; OSM
SPDX-License-Identifier: LicenseRef-LOGO AND CC-BY-SA-4.0

View file

@ -0,0 +1,2 @@
SPDX-FileCopyrightText: Pieter Vander Vennet; OSM
SPDX-License-Identifier: LicenseRef-LOGO AND CC-BY-SA-4.0

View file

@ -0,0 +1,2 @@
SPDX-FileCopyrightText: Pieter Vander Vennet; OSM
SPDX-License-Identifier: LicenseRef-LOGO AND CC-BY-SA-4.0

View file

@ -0,0 +1,346 @@
{
"id": "building",
"isCounted": false,
"source": {
"osmTags": "building~*"
},
"description": {
"en": "All buildings"
},
"pointRendering": [
{
"location": [
"point"
],
"marker": [
{
"icon": "circle",
"color": "white"
}
],
"iconSize": "10,10"
}
],
"lineRendering": [
{
"color": "#ff2222",
"width": 1
}
],
"name": {
"en": "Buildings"
},
"title": {
"render": {
"en": "Building"
}
},
"tagRenderings": [
{
"id": "architecture",
"question": {
"en": "What is the architectural style of this building?"
},
"mappings": [
{
"if": "building:architecture=islamic",
"then": {
"en": "Islamic architecture",
"fr": "Architecture islamique",
"nl": "Islamitische architectuur"
}
},
{
"if": "building:architecture=mamluk",
"then": {
"en": "Mamluk architecture",
"fr": "Architecture mamelouke",
"nl": "Mamelukse architectuur"
}
},
{
"if": "building:architecture=romanesque",
"then": {
"en": "Romanesque architecture",
"fr": "Architecture romane",
"nl": "Romaanse architectuur"
}
},
{
"if": "building:architecture=gothic",
"then": {
"en": "Gothic architecture",
"fr": "Architecture gothique",
"nl": "Gotische architectuur"
}
},
{
"if": "building:architecture=renaissance",
"then": {
"en": "Renaissance architecture",
"fr": "Architecture Renaissance",
"nl": "Renaissance-architectuur"
}
},
{
"if": "building:architecture=mannerism",
"then": {
"en": "Mannerism",
"fr": "Maniérisme",
"nl": "Maniërisme"
}
},
{
"if": "building:architecture=ottoman",
"then": {
"en": "Ottoman architecture",
"fr": "Architecture ottomane",
"nl": "Ottomaanse architectuur"
}
},
{
"if": "building:architecture=baroque",
"then": {
"en": "Baroque architecture",
"fr": "Architecture baroque",
"nl": "Barokarchitectuur"
}
},
{
"if": "building:architecture=rococo",
"then": {
"en": "Rococo",
"fr": "Rococo",
"nl": "Rococo"
}
},
{
"if": "building:architecture=empire",
"then": {
"en": "Empire style",
"fr": "Style Empire",
"nl": "Empirestijl"
}
},
{
"if": "building:architecture=moorish revival",
"then": {
"en": "Moorish Revival",
"fr": "Architecture néo-mauresque",
"nl": "Neo-Moorse architectuur"
}
},
{
"if": "building:architecture=neoclassicism",
"then": {
"en": "Neoclassical architecture",
"fr": "Architecture néoclassique",
"nl": "Neoclassicistische architectuur"
}
},
{
"if": "building:architecture=georgian",
"then": {
"en": "Georgian architecture",
"fr": "Architecture géorgienne",
"nl": "Georgian architectuur"
}
},
{
"if": "building:architecture=victorian",
"then": {
"en": "Victorian architecture",
"fr": "Architecture victorienne",
"nl": "Victoriaanse architectuur"
}
},
{
"if": "building:architecture=historicism",
"then": {
"en": "Historicism",
"fr": "Historicisme",
"nl": "Historisme"
}
},
{
"if": "building:architecture=neo-romanesque",
"then": {
"en": "Romanesque Revival",
"fr": "Architecture néo-romane",
"nl": "Neo-Romaanse architectuur"
}
},
{
"if": "building:architecture=neo-byzantine",
"then": {
"en": "Byzantine Revival",
"fr": "Architecture néo-byzantine",
"nl": "Neo-Byzantijnse architectuur"
}
},
{
"if": "building:architecture=neo-gothic",
"then": {
"en": "Gothic Revival",
"fr": "Architecture néo-gothique",
"nl": "Neo-Gotische architectuur"
}
},
{
"if": "building:architecture=neo-renaissance",
"then": {
"en": "Renaissance Revival",
"fr": "Architecture néo-Renaissance",
"nl": "Neo-Renaissance architectuur"
}
},
{
"if": "building:architecture=neo-baroque",
"then": {
"en": "Baroque Revival",
"fr": "Architecture néo-baroque",
"nl": "Neo-Barokarchitectuur"
}
},
{
"if": "building:architecture=art_nouveau",
"then": {
"en": "Art Nouveau",
"fr": "Art nouveau",
"nl": "Art Nouveau"
}
},
{
"if": "building:architecture=eclectic",
"then": {
"en": "Eclecticism in architecture",
"fr": "Éclectisme en architecture",
"nl": "Eclecticisme in architectuur"
}
},
{
"if": "building:architecture=functionalism",
"then": {
"en": "Functionalism",
"fr": "Fonctionnalisme",
"nl": "Functionalisme"
}
},
{
"if": "building:architecture=cubism",
"then": {
"en": "Cubism",
"fr": "Cubisme",
"nl": "Kubisme"
}
},
{
"if": "building:architecture=new_objectivity",
"then": {
"en": "New Objectivity",
"fr": "Nouvelle Objectivité",
"nl": "Nieuwe Zakelijkheid"
}
},
{
"if": "building:architecture=art_deco",
"then": {
"en": "Art Deco",
"fr": "Art déco",
"nl": "Art Deco"
}
},
{
"if": "building:architecture=modern",
"then": {
"en": "Modern architecture",
"fr": "Architecture moderne",
"nl": "Moderne architectuur"
}
},
{
"if": "building:architecture=amsterdam_school",
"then": {
"en": "Amsterdam School",
"fr": "École d'Amsterdam",
"nl": "Amsterdamse School"
}
},
{
"if": "building:architecture=international_style",
"then": {
"en": "International Style",
"fr": "Style international",
"nl": "Internationale Stijl"
}
},
{
"if": "building:architecture=constructivism",
"then": {
"en": "Constructivism",
"fr": "Constructivisme",
"nl": "Constructivisme"
}
},
{
"if": "building:architecture=stalinist_neoclassicism",
"then": {
"en": "Stalinist architecture",
"fr": "Architecture stalinienne",
"nl": "Stalinistische architectuur"
}
},
{
"if": "building:architecture=brutalist",
"then": {
"en": "Brutalist architecture",
"fr": "Architecture brutaliste",
"nl": "Brutalistische architectuur"
}
},
{
"if": "building:architecture=postmodern",
"then": {
"en": "Postmodern architecture",
"fr": "Architecture postmoderne",
"nl": "Postmoderne architectuur"
}
},
{
"if": "building:architecture=contemporary",
"then": {
"en": "Contemporary architecture",
"fr": "Architecture contemporaine",
"nl": "Hedendaagse architectuur"
}
}
],
"render": {
"en": "{building:architecture}"
},
"multiAnswer": true,
"freeform": {
"key": "building:architecture"
}
},
{
"id": "construction_date",
"question": {
"en": "When was this built?"
},
"render": {
"en": "Built in <b>{construction_date}</b>"
},
"freeform": {
"key": "construction_date",
"type": "date"
}
},
"address.address"
],
"minzoom": 18,
"allowMove": {
"enableRelocation": false,
"enableImproveAccuracy": true
}
}

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText: Diego Naive; VideoPlasty; Pietervdvn
SPDX-License-Identifier: CC-BY-4.0

View file

@ -83,7 +83,7 @@
"it": "Qual è il livello della via più facile qua, secondo il sistema di classificazione francese?",
"cs": "Jaký je stupeň nejjednodušší trasy podle francouzského klasifikačního systému?",
"es": "¿Cuál es el grado de la vía más fácil aquí, según el sistema de clasificación francés?",
"ca": "Quin és el grau de la ruta més fàcil aquí, segons el sistema de classificació francès?"
"ca": "Quin és el grau de la ruta més fàcil aquí segons el sistema de classificació francès?"
},
"render": {
"de": "Die leichteste Route hat hier die Schwierigkeit {climbing:grade:french:min} (französisch/belgisches System)",
@ -94,7 +94,7 @@
"it": "Il minimo livello di difficoltà è {climbing:grade:french:min} secondo il sistema francese/belga",
"cs": "Nejnižší stupeň je {climbing:grade:french:min} podle francouzského/belgického systému",
"es": "El grado más bajo es {climbing:grade:french:min} según el sistema francés/belga",
"ca": "La nota més baixa és {climbing:grade:french:min} segons el sistema francès/belga"
"ca": "El grau més baix és {climbing:grade:french:min} segons el sistema francès/belga"
},
"freeform": {
"key": "climbing:grade:french:min"
@ -111,7 +111,7 @@
"it": "Qual è il livello della via più difficile qua, secondo il sistema di classificazione francese?",
"cs": "Jaká je zde trasa nejvyššího stupně podle francouzského klasifikačního systému?",
"es": "¿Cuál es la vía de mayor grado aquí, según el sistema de clasificación francés?",
"ca": "Quina és la ruta de grau més alt d'aquí, segons el sistema de classificació francès?"
"ca": "Quina és la ruta de major aquí, segons el sistema de classificació francès?"
},
"render": {
"de": "Die schwierigste Route hat hier die Schwierigkeitsstufe {climbing:grade:french:max} (französisch/belgisches System)",
@ -122,7 +122,7 @@
"it": "Il massimo livello di difficoltà è {climbing:grade:french:max} secondo il sistema francese/belga",
"cs": "Nejvyšší stupeň je {climbing:grade:french:max} podle francouzského/belgického systému",
"es": "El grado más alto es {climbing:grade:french:max} según el sistema francés/belga",
"ca": "La nota més alta és {climbing:grade:french:max} segons el sistema francès/belga"
"ca": "La grau més alt és {climbing:grade:french:max} segons el sistema francès/belga"
},
"freeform": {
"key": "climbing:grade:french:max"
@ -228,7 +228,7 @@
"it": "È possibile arrampicarsi con la corda dallalto qua?",
"cs": "Je zde možné lezení po laně?",
"es": "¿Es posible la escalada con cuerda desde arriba aquí?",
"ca": "És possible l'escalada propícia aquí?"
"ca": "És possible l'escalada en politja aquí?"
},
"mappings": [
{
@ -242,7 +242,7 @@
"it": "È possibile arrampicarsi con moulinette qua",
"cs": "Lezení po laně je zde možné",
"es": "La escalada con cuerda desde arriba es posible aquí",
"ca": "L'escalada propícia és possible aquí"
"ca": "L'escalada en politja és possible aquí"
}
},
{
@ -256,7 +256,7 @@
"it": "Non è possibile arrampicarsi con moulinette qua",
"cs": "Lezení po laně zde není možné",
"es": "La escalada con cuerda desde arriba no es posible aquí",
"ca": "L'escalada propícia no és possible aquí"
"ca": "L'escalada en politja no és possible aquí"
}
},
{
@ -270,7 +270,7 @@
"it": "Sono presenti {climbing:toprope} vie con moulinette",
"cs": "Je zde {climbing:toprope} tras pro lezení na laně",
"es": "Hay {climbing:toprope} vías de escalada con cuerda desde arriba",
"ca": "Hi ha {climbing:toprope} rutes específiques"
"ca": "Hi ha {climbing:toprope} rutes d'escalada en politja"
},
"hideInAnswer": true
}
@ -357,7 +357,7 @@
"it": "usando attrezzi propri, ad es. dadi",
"cs": "Pomocí vlastního zařízení, např. klíny",
"es": "Usando tu propio equipo, p. ej., fisureros",
"ca": "Utilitzant el vostre propi engranatge, p. ex., chocks"
"ca": "Utilitzant el vostre propi equipament, p. ex., cales"
},
"mappings": [
{
@ -396,7 +396,7 @@
"it": "Sono presenti {climbing:traditional} vie di arrampicata tradizionale",
"cs": "Existují {climbing:traditional} tradiční lezecké cesty",
"es": "Hay {climbing:traditional} vías de escalada tradicional",
"ca": "Hi ha {climbing:traditional} vies d'escalada tradicionals"
"ca": "Hi ha {climbing:traditional} rutes d'escalada tradicionals"
},
"hideInAnswer": true
}
@ -410,7 +410,7 @@
"nl": "Wat is het maximum aantal bouten in routes ban {title()}?",
"cs": "Kolik šroubů na trasu {title()} je potřeba?",
"es": "¿Cuántos parabolts tienen como máximo las vías en {title()}?",
"ca": "Quants parabolts tenen com a màxim les rutes a {title()} ?"
"ca": "Quants ancoratges d'anella tenen com a màxim les rutes a {title()} ?"
},
"render": {
"en": "The sport climbing routes here have at most {climbing:bolts:max} bolts. <div class='subtle'>This is without belay stations and indicates how much quickdraws a climber needs.</div>",

View file

@ -70,7 +70,7 @@
"nl": "Klimrots of klimzone <b>{name}</b>",
"cs": "Lezecká cesta <b>{name}</b>",
"es": "Pared de escalada <b>{name}</b>",
"ca": "Trenca d'escalada <b>{name}</b>"
"ca": "Paret d'escalada <b>{name}</b>"
}
},
{
@ -310,7 +310,7 @@
"nl": "Een klimzone - een enkele rots of klif met klimroutes",
"cs": "Lezecká skála - jediná skála nebo útes s alespoň několika lezeckými cestami",
"es": "Una pared de escalada - una sola roca o acantilado con al menos algunas vías de escalada",
"ca": "Un cinglera d'escalada - una sola roca o penya-segat amb almenys unes quantes rutes d'escalada"
"ca": "Un cinglera d'escalada: una sola roca o penya-segat amb almenys unes quantes rutes d'escalada"
}
},
{

View file

@ -162,7 +162,7 @@
"hu": "Mászószervezet",
"cs": "lezecká nezisková organizace",
"es": "una ONG de escalada",
"ca": "un ngo d'escalada"
"ca": "una ONG d'escalada"
},
"description": {
"de": "Eine Organisation, die sich mit dem Klettern beschäftigt",
@ -174,7 +174,7 @@
"hu": "Mászással foglalkozó civil szervezet",
"cs": "Nevládní organizace působící v oblasti lezení",
"es": "Una ONG que trabaja en torno a la escalada",
"ca": "Una ONG que treballa per l'escalada"
"ca": "Una ONG que treballa amb l'escalada"
}
}
],

View file

@ -64,7 +64,7 @@
"cs": "Lezecká tělocvična <strong>{name}</strong>",
"es": "Gimnasio de escalada <strong>{name}</strong>",
"uk": "Скеледром <strong>{name}</strong>",
"ca": "gimnàs d'escalada <strong>{name}</strong>"
"ca": "Gimnàs d'escalada <strong>{name}</strong>"
}
}
]
@ -163,7 +163,7 @@
"pl": "Czy można tutaj wypożyczyć buty do wspinaczki?",
"cs": "Lze si zde půjčit lezeckou obuv?",
"es": "¿Se pueden alquilar zapatillas de escalada aquí?",
"ca": "Es poden llogar sabates d'escalada aquí per utilitzar al gimnàs?"
"ca": "Aquí es poden llogar sabates d'escalada per utilitzar al gimnàs?"
},
"mappings": [
{
@ -180,7 +180,7 @@
"de": "Kletterschuhe können hier kostenlos ausgeliehen werden",
"cs": "Lezeckou obuv si můžete zdarma vypůjčit zde",
"es": "Se pueden pedir prestadas zapatillas de escalada gratis aquí",
"ca": "Les sabates d'escalada es poden demanar en préstec gratuïtament aquí"
"ca": "Aquí es poden demanar en préstec gratuïtament sabates d'escalada"
},
"addExtraTags": [
"service:climbing_shoes:rental:charge="
@ -219,7 +219,7 @@
"pl": "Można tutaj wypożyczyć buty do wspinaczki",
"cs": "Lezeckou obuv si můžete půjčit zde",
"es": "Se pueden alquilar zapatillas de escalada aquí",
"ca": "Es poden llogar sabates d'escalada aquí"
"ca": "Aquí es poden llogar sabates d'escalada"
},
"addExtraTags": [
"service:climbing_shoes:rental:charge="
@ -235,7 +235,7 @@
"pl": "<b>Nie</b> można wypożyczyć tutaj butów do wspinaczki",
"cs": "Lezeckou obuv si zde <b>nemůžete</b> zapůjčit",
"es": "No se pueden alquilar zapatillas de escalada aquí",
"ca": "Les sabates d'escalada poden llogar-se aquí <b>no</b>"
"ca": "Aquí <b>no</b> poden llogar-se sabates d'escalada"
},
"addExtraTags": [
"service:climbing_shoes:rental:fee=",
@ -253,7 +253,7 @@
"de": "Kann man hier einen Klettergurt für die Kletterwand ausleihen?",
"cs": "Lze si zde zapůjčit horolezecký postroj?",
"es": "¿Se puede alquilar un arnés de escalada aquí?",
"ca": "Es pot llogar un arnès d'escalada aquí per utilitzar al gimnàs?"
"ca": "Aquí es pot llogar un arnès d'escalada per utilitzar al gimnàs?"
},
"condition": {
"or": [
@ -292,7 +292,7 @@
"de": "Ein Klettergurt kann hier kostenlos ausgeliehen werden",
"cs": "Lezecký úvazek si můžete zdarma vypůjčit zde",
"es": "Se puede pedir prestado un arnés de escalada gratis aquí",
"ca": "Un arnès d'escalada es pot demanar prestat gratuïtament aquí"
"ca": "Aquí es pot demanar prestat gratuïtament un arnès d'escalada"
},
"addExtraTags": [
"service:climbing_harness:rental:charge="
@ -325,7 +325,7 @@
"de": "Ein Klettergurt kann hier ausgeliehen werden",
"cs": "Lezecký postroj si můžete půjčit zde",
"es": "Se puede alquilar un arnés de escalada aquí",
"ca": "Es pot llogar un arnès d'escalada aquí"
"ca": "Aquí es pot llogar un arnès d'escalada"
},
"addExtraTags": [
"service:climbing_harness:rental:fee=",
@ -341,7 +341,7 @@
"de": "Ein Klettergurt kann hier <b>nicht</b> ausgeliehen werden",
"cs": "Lezecký úvazek si zde <b>nemůžete</b> zapůjčit",
"es": "No se puede alquilar un arnés de escalada aquí",
"ca": "Un arnés d'escalada pot <b>no</b> ser llogat aquí"
"ca": "Aquí <b>no</b> es pot llogar un arnés d'escalada"
},
"addExtraTags": [
"service:climbing_harness:rental:fee=",
@ -356,7 +356,7 @@
"en": "Are there auto belays for top roping here?",
"nl": "Zijn hier auto belays voor toprope?",
"de": "Gibt es hier Selbstsicherungen für das Toprope-Klettern?",
"ca": "Hi ha belays automàtics per a la corda superior aquí?"
"ca": "Hi ha relleus automàtics per a l'escalada en politja aquí?"
},
"questionHint": {
"en": "Excluding auto belays that are only for speed climbing",
@ -381,7 +381,7 @@
"en": "There are no auto belays for top roping",
"nl": "Er zijn geen autobelays voor toprope",
"de": "Es gibt keine Selbstsicherungen für das Toprope-Klettern",
"ca": "No hi ha relleus automàtics per a la corda superior"
"ca": "No hi ha asseguraments automàtics per a l'escalada en politja"
}
},
{
@ -390,7 +390,7 @@
"en": "There are a number of auto belays for top roping",
"nl": "Er zijn enkele autobelays voor toprope",
"de": "Es gibt eine Reihe von Selbstsicherungen für das Toprope-Klettern",
"ca": "Hi ha una sèrie de relleus automàtics per a la corda superior"
"ca": "Hi ha una sèrie d'asseguraments automàtics per a l'escalada en politja"
}
},
{
@ -399,7 +399,7 @@
"en": "There is an auto belay for every top rope route but manual belaying is also possible",
"nl": "Elke toproperoute kan op autobelay geklommen worden maar handmatig zekeren is ook mogelijk",
"de": "Für jede Toprope-Route gibt es eine Selbstsicherung , aber auch manuelles Sichern ist möglich",
"ca": "Hi ha un relleu automàtic per a cada ruta de la corda superior, però també és possible el relleu manual"
"ca": "Hi ha un assegurament automàtic per a cada ruta d'escalada en politja, però també és possible el relleu manual"
}
},
{
@ -408,7 +408,7 @@
"en": "Top rope routes can only be climbed on auto belay",
"nl": "Toproperoutes kunnen enkel op autobelay geklommen worden",
"de": "Klettersteige können nur mit Selbstsicherung geklettert werden",
"ca": "Les rutes de corda més altes només es poden escalar en relleu automàtic"
"ca": "Les rutes d'escalada en politja només es poden escalar en relleu automàtic"
}
}
],
@ -416,7 +416,7 @@
"en": "There are {climbing:autobelay:toprope} auto belay devices for top roping",
"nl": "Er zijn {climbing:autobelay:toprope} autobelaytoestellen voor toprope",
"de": "Es gibt {climbing:autobelay:toprope} Selbstsicherungsgeräte für das Toprope-Klettern",
"ca": "Hi ha {climbing:autobelay:toprope} dispositius de relleu automàtic per a cordes superiors"
"ca": "Hi ha {climbing:autobelay:toprope} dispositius de relleu automàtic per a l'escalada en politja"
}
},
{
@ -425,7 +425,7 @@
"en": "Are there auto belays for lead climbing here?",
"nl": "Zijn hier autobelays voor voorklimmen?",
"de": "Gibt es hier Selbstsicherungen für das Vorstiegsklettern?",
"ca": "Hi ha rèpliques automàtiques per a l'escalada de plom?"
"ca": "Hi ha asseguraments automàtics per al cap de corda?"
},
"condition": {
"and": [
@ -444,7 +444,7 @@
"en": "There are no auto belays for lead climbing",
"nl": "Er zijn geen autobelays voor voorklimmen",
"de": "Es gibt keine Selbstsicherungen für das Vorstiegsklettern",
"ca": "No hi ha relleus automàtics per a l'escalada de plom"
"ca": "No hi ha asseguraments automàtics per al cap de corda"
}
},
{
@ -453,7 +453,7 @@
"en": "There is a number of auto belays for lead climbing",
"nl": "Er zijn enkele autobelays voor voorklimmen",
"de": "Es gibt eine Reihe von Selbstsicherungen für das Vorstiegsklettern",
"ca": "Hi ha una sèrie de relleus automàtics per a l'escalada de plom"
"ca": "Hi ha una sèrie d'asseguraments automàtics per a cada cap de corda"
}
},
{
@ -462,7 +462,7 @@
"en": "There is an auto belay for every lead climbing route",
"nl": "Elke voorklimroute kan op autobelay geklommen worden",
"de": "Für jede Vorstiegskletterroute gibt es eine Selbstsicherung",
"ca": "Hi ha un relleu automàtic per a cada ruta d'escalada de plom"
"ca": "Hi ha un assegurament automàtic per a cada cap de corda"
}
}
],
@ -470,7 +470,7 @@
"en": "There are {climbing:autobelay:sport} auto belays for lead climbing",
"nl": "Er zijn {climbing:autobelay:sport} autobelays voor voorklimmen",
"de": "Es gibt {climbing:autobelay:sport} Selbstsicherungen für das Vorstiegsklettern",
"ca": "Hi ha {climbing:autobelay:sport} relleus automàtics per a l'escalada de plom"
"ca": "Hi ha {climbing:autobelay:sport} asseguraments automàtics per al cap de corda"
}
},
{
@ -482,7 +482,7 @@
"de": "Kann man hier ein Sicherungsgerät für die Kletterwand ausleihen?",
"cs": "Lze si zde půjčit jištění?",
"es": "¿Se puede alquilar un dispositivo de aseguramiento aquí?",
"ca": "Es pot llogar un aparell de belay aquí per utilitzar al gimnàs?"
"ca": "Aquí es pot llogar un aparell d'assegurament per utilitzar al gimnàs?"
},
"condition": {
"or": [
@ -510,7 +510,7 @@
"de": "Jedes Seil hat ein Sicherungsgerät",
"cs": "U každého lana jsou k dispozici jistící zařízení",
"es": "Se proporcionan dispositivos de aseguramiento en cada cuerda",
"ca": "Els dispositius Belay es proporcionen a cada corda"
"ca": "Els dispositius d'assegurament es proporcionen a cada corda"
},
"addExtraTags": [
"service:climbing_belay_device:rental=",
@ -532,7 +532,7 @@
"de": "Ein Sicherungsgerät kann hier kostenlos ausgeliehen werden",
"cs": "Jištění si můžete zdarma vypůjčit zde",
"es": "Se puede pedir prestado un dispositivo de aseguramiento gratis aquí",
"ca": "Un dispositiu d'aspiració es pot demanar prestat gratuïtament aquí"
"ca": "Aquí es pot sol·licitar prestat un dispositiu d'assegurament gratuït"
},
"addExtraTags": [
"service:climbing_belay_device:provided_at_each_rope=",
@ -566,7 +566,7 @@
"de": "Ein Sicherungsgerät kann hier ausgeliehen werden",
"cs": "Jištění si můžete zapůjčit zde",
"es": "Se puede alquilar un dispositivo de aseguramiento aquí",
"ca": "Es pot llogar un dispositiu d'aspiració aquí"
"ca": "Aquí es pot llogar un dispositiu d'assegurament"
},
"addExtraTags": [
"service:climbing_belay_device:provided_at_each_rope=",
@ -583,7 +583,7 @@
"de": "Ein Sicherungsgerät kann hier <b>nicht</b> ausgeliehen werden",
"cs": "Zde si <b>nelze</b> půjčit jištění",
"es": "No se puede alquilar un dispositivo de aseguramiento aquí",
"ca": "Un dispositiu de relleu pot llogar <b>no</b> aquí"
"ca": "Aquí <b>no</b> es pot llogar un dispositiu d'assegurament"
},
"addExtraTags": [
"service:climbing_belay_device:provided_at_each_rope=",
@ -602,7 +602,7 @@
"de": "Kann man hier ein Kletterseil für die Kletterwand ausleihen?",
"cs": "Lze si zde půjčit lezecké lano?",
"es": "¿Se puede alquilar una cuerda de escalada aquí?",
"ca": "Es pot llogar una corda d'escalada aquí per utilitzar al gimnàs?"
"ca": "Aquí es pot llogar una corda d'escalada per a utilitzar al gimnàs?"
},
"condition": "climbing:sport!=no",
"mappings": [
@ -620,7 +620,7 @@
"de": "Ein Kletterseil kann hier kostenlos ausgeliehen werden",
"cs": "Lezecké lano si můžete zdarma vypůjčit zde",
"es": "Se puede pedir prestada una cuerda de escalada gratis aquí",
"ca": "Una corda d'escalada es pot demanar prestat gratuïtament aquí"
"ca": "Aquí es pot demanar prestat gratuïtament una corda d'escalada"
},
"addExtraTags": [
"service:climbing_rope:rental:charge="
@ -653,7 +653,7 @@
"de": "Ein Kletterseil kann hier ausgeliehen werden",
"cs": "Lezecké lano si můžete půjčit zde",
"es": "Se puede alquilar una cuerda de escalada aquí",
"ca": "Es pot llogar una corda d'escalada aquí"
"ca": "Aquí es pot llogar una corda d'escalada"
},
"addExtraTags": [
"service:climbing_rope:rental:fee=",
@ -669,7 +669,7 @@
"de": "Ein Kletterseil kann hier <b>nicht</b> ausgeliehen werden",
"cs": "Lezecké lano si zde <b>nemůžete</b> zapůjčit",
"es": "No se puede alquilar una cuerda de escalada aquí",
"ca": "Es pot llogar una corda d'escalada <b>no</b> aquí"
"ca": "Aquí <b>no</b> es pot llogar una corda d'escalada"
},
"addExtraTags": [
"service:climbing_rope:rental:fee=",
@ -708,7 +708,7 @@
"fr": "Y a-t-il un mur d'escalade de vitesse ?",
"cs": "Je zde rychlostní lezecká stěna?",
"es": "¿Hay una pared de escalada de velocidad?",
"ca": "Hi ha una paret d'escalada ràpida?"
"ca": "Hi ha una paret d'escalada de velocitat?"
},
"mappings": [
{

View file

@ -206,7 +206,7 @@
"fr": "Cette voie fait {canonical(climbing:length)} de long",
"cs": "Tato trasa je {canonical(climbing:length)} dlouhá",
"es": "Esta vía mide {canonical(climbing:length)} de largo",
"ca": "Aquesta ruta és {canonical(climbing:length)} llarga"
"ca": "Aquesta ruta és {canonical(climbing:length)} de llarg"
},
"freeform": {
"key": "climbing:length",
@ -234,7 +234,7 @@
"fr": "Selon le système franco-belge, la difficulté de cette voie est de {climbing:grade:french}",
"cs": "Stupeň je {climbing:grade:french} podle francouzského/belgického systému",
"es": "El grado es {climbing:grade:french} según el sistema francés/belga",
"ca": "La qualificació és {climbing:grade:french} segons el sistema francès/belga"
"ca": "El grau és {climbing:grade:french} segons el sistema francès/belga"
},
"freeform": {
"key": "climbing:grade:french"
@ -251,7 +251,7 @@
"nl": "Hoeveel bouten heeft deze route voordat je het relay bereikt?",
"cs": "Kolik šroubů má tato cesta před dosažením kotvy?",
"es": "¿Cuántos parabolts tiene esta vía antes de llegar al anclaje?",
"ca": "Quants perns té aquesta ruta abans d'arribar a l'ancoratge?"
"ca": "Quants ancoratges d'anella té aquesta ruta abans d'arribar a l'ancoratge?"
},
"render": {
"en": "This route has {climbing:bolts} bolts. <div class='subtle'>This is without belay stations and indicates how much quickdraws a climber needs.</div>",
@ -260,7 +260,7 @@
"it": "Questo percorso ha {climbing:bolts} bulloni <div class='subtle'>Questa è senza collettori e indica di quanti bloccaggi rapidi ha bisogno un arrampicatore</div>",
"nl": "Deze route heeft {climbing:bolts} haken. <div class='subtle'>Hierbij wordt de standplaats niet meegeteld. Een klimmer heeft normaal gezien dus minstens {climbing:bolts} setjes nodig.</div>",
"es": "Esta vía tiene {climbing:bolts} parabolts <div class='subtle'>Esto es sin reuniones e indica cuántos cintas exprés necesita un escalador</div>",
"ca": "Aquesta ruta té {climbing:bolts} perns. <div class='subtle'>Això no té estacions d'aspiració i indica quant de ràpid necessita un escalador.</div>"
"ca": "Aquesta ruta té {climbing:bolts} ancoratges d'anella. <div class='subtle'>Això és sense estacions d'assegurament i indica quantes cintes necessita un escalador.</div>"
},
"freeform": {
"key": "climbing:bolts",
@ -281,7 +281,7 @@
"nl": "Deze route heeft geen bouten",
"cs": "Tato trasa není vyšroubovaná",
"es": "Esta vía no tiene parabolts",
"ca": "Aquesta ruta no està vorejada"
"ca": "Aquesta ruta no té ancoratges d'anella"
},
"addExtraTags": [
"climbing:bolts="

View file

@ -135,7 +135,7 @@
"de": "eine Wanduhr, die direkt an der Wand angebracht ist",
"es": "un reloj, montado directamente en una pared",
"cs": "nástěnné hodiny, namontované přímo na stěnu",
"ca": "un rellotge muntat a la paret, muntat directament en una paret"
"ca": "un rellotge muntat directament en una paret"
},
"description": {
"en": "A publicly visible clock mounted directly on a wall",

View file

@ -235,7 +235,7 @@
"nl": "Wat voor markering heeft deze oversteekplaats?",
"de": "Welche Art von Markierungen gibt es an diesem Übergang?",
"es": "¿Qué tipo de señalización tiene este cruce?",
"ca": "Quin tipus de marques té aquest encreuament?"
"ca": "Quin tipus de senyalització té aquest encreuament?"
},
"mappings": [
{
@ -261,7 +261,7 @@
"de": "Dieser Übergang ist mit Zebrastreifen markiert",
"es": "Este paso de cebra está señalizado",
"cs": "Tento přechod má označení zebra",
"ca": "Aquest encreuament té marques zebra"
"ca": "Aquest pas de vianants té marques de zebra"
},
"icon": {
"class": "large",
@ -318,7 +318,7 @@
"de": "Dieser Übergang hat gestrichelte Linien auf beiden Seiten des Übergangs",
"es": "Este cruce tiene líneas discontinuas a ambos lados del cruce",
"cs": "Tento přechod má po obou stranách přerušované čáry",
"ca": "Aquest encreuament ha traçat línies a banda i banda de la travessia"
"ca": "Aquest encreuament té traçades línies a banda i banda de la travessia"
},
"icon": {
"class": "large",
@ -347,7 +347,7 @@
"nl": "Deze oversteekplaats is gemarkeerd door een anders gekleurd wegdek",
"de": "Dieser Übergang wird durch eine andersfarbige Oberfläche gekennzeichnet",
"es": "Este cruce se marca utilizando una superficie de color diferente",
"ca": "Aquest encreuament està marcat per l'ús d'una superfície de color diferent"
"ca": "Aquest encreuament està marcat usant una superfície de color diferent"
},
"icon": {
"class": "large",
@ -361,7 +361,7 @@
"nl": "Deze oversteekplaats heeft lijnen aan beide kanten van de oversteekplaats, met schuine strepen die ze verbinden",
"de": "Diese Kreuzung hat Linien auf beiden Seiten der Kreuzung, zusammen mit abgewinkelten Stangen, die sie verbinden",
"es": "Este cruce tiene líneas a ambos lados, junto con barras en ángulo que las conectan",
"ca": "Aquest encreuament té línies a banda i banda de l'encreuament, juntament amb barres angletes que les connecten"
"ca": "Aquest encreuament té línies a banda i banda de l'encreuament, juntament amb barres en diagonal que les connecten"
},
"icon": {
"class": "large",
@ -386,7 +386,7 @@
"de": "Dieser Übergang hat Zebrastreifen in wechselnden Farben",
"es": "Este paso tiene marcas de cebra en colores alternos",
"cs": "Tento přechod má označení zebry ve střídavých barvách",
"ca": "Aquest encreuament té marques zebra en colors alterns"
"ca": "Aquest pas de vianants té marques de zebra en colors alterns"
},
"icon": {
"class": "large",
@ -401,7 +401,7 @@
"de": "Dieser Übergang hat doppelte Zebrastreifen",
"es": "Este paso de cebra tiene doble señalización",
"cs": "Tento přechod má dvojité značení zebry",
"ca": "Aquest encreuament té marcacions de doble zebra"
"ca": "Aquest pas de vianants té marques de zebra doble"
},
"icon": {
"class": "large",
@ -438,7 +438,7 @@
"de": "Dieser Übergang hat doppelte Linien auf beiden Seiten des Übergangs",
"es": "Este cruce tiene líneas dobles a cada lado del cruce",
"cs": "Tento přechod má dvojité čáry na obou stranách přechodu",
"ca": "Aquest encreuament té línies dobles a banda i banda de la travessia"
"ca": "Aquest encreuament té línies dobles a banda i banda del creuament"
},
"icon": {
"class": "large",
@ -451,7 +451,7 @@
"nl": "Deze oversteekplaats heeft {crossing:markings} markeringen",
"de": "Dieser Übergang hat {crossing:markings} Markierungen",
"es": "Este cruce tiene marcas {crossing:markings}",
"ca": "Aquest encreuament té {crossing:markings} marques"
"ca": "Aquest encreuament té marques {crossing:markings}"
},
"freeform": {
"key": "crossing:markings",

View file

@ -799,7 +799,7 @@
"es": "Este carril bici está hecho de tierra",
"fr": "Cette piste cyclable est faite en sol brut",
"cs": "Tato cyklostezka je vyrobena ze surové zeminy",
"ca": "Aquest carril bici està fet de terra crua"
"ca": "Aquest carril bici està fet de terra"
}
}
],
@ -842,7 +842,7 @@
"de": "Hier gibt es (wahrscheinlich) keine Steigung",
"nl": "De straat heeft hier (waarschijnlijk) geen helling",
"es": "Probablemente no hay inclinación aquí",
"ca": "Hi ha (probablement) cap inclinació aquí"
"ca": "Probablement aquí no hi ha inclinació"
},
"hideInAnswer": true
},
@ -976,7 +976,7 @@
"fr": "Impasse / Aucun véhicule roulant",
"cs": "Neprůjezdné / Zákaz vjezdu vozidel",
"es": "Intransitable / Ningún vehículo con ruedas",
"ca": "Impassable / Sense vehicle rodat"
"ca": "Impassable / Cap vehicle amb rodes"
}
}
],
@ -1006,7 +1006,7 @@
"fr": "Cette piste cycable est non durcie",
"cs": "Tato cyklostezka není zpevněná",
"es": "Este carril bici no está pavimentado",
"ca": "Aquest carril bici no està endurit"
"ca": "Aquest carril bici no està paviment"
},
"hideInAnswer": true
},
@ -1047,7 +1047,7 @@
"fr": "Cette piste cyclable est faite en pavés lisses",
"cs": "Tato cyklostezka je tvořena hladkými dlažebními kostkami",
"es": "Este carril bici está hecho de adoquines lisos",
"ca": "Aquest carril bici està fet de llises pedres de paviment"
"ca": "Aquest carril bici està fet adoquins llisos"
}
},
{
@ -1073,7 +1073,7 @@
"fr": "Cette piste cyclable est faite de pavés (taillé ou non)",
"cs": "Tato cyklostezka je vyrobena z dlážděného kamene (netesaného nebo vydlabaného)",
"es": "Este carril bici está hecho de adoquines (sin labrar o de sillería)",
"ca": "Aquest carril bici està fet de llamborda (sense mànigues o sett)"
"ca": "Aquest carril bici està fet de llambordes (sense tallar o carreu)"
},
"hideInAnswer": true
},
@ -1087,7 +1087,7 @@
"fr": "Cette piste cyclable est en pavés bruts et naturels",
"cs": "Tato cyklostezka je vyrobena ze surového přírodního dlažebního kamene",
"es": "Este carril bici está hecho de adoquines naturales sin labrar",
"ca": "Aquest carril bici és de pedra empedrada natural i crua"
"ca": "Aquest carril bici és de pedra empedrada natural sense tallar"
}
},
{
@ -1164,7 +1164,7 @@
"fr": "Cette piste cyclable est faite en sol brut",
"cs": "Tato cyklostezka je vyrobena ze surové půdy",
"es": "Este carril bici está hecho de tierra",
"ca": "Aquest carril bici està fet de terra crua"
"ca": "Aquest carril bici està fet de terra"
}
}
],
@ -1258,7 +1258,7 @@
"fr": "Utilisable pour les véhicules à dégagement élevé : véhicule tout-terrain léger",
"cs": "Použitelné pro vozidla s vysokou světlou výškou: lehké terénní vozidlo",
"es": "Utilizable para vehículos con altura libre al suelo alta: vehículo todoterreno ligero",
"ca": "Utilitzable per a vehicles amb alta habilitació: vehicle off-road lleuger"
"ca": "Utilitzable per a vehicles amb gran espai lliure al terra: vehicle tot terreny lleuger"
}
},
{
@ -1271,7 +1271,7 @@
"fr": "Utilisable pour les véhicules tout-terrain : véhicule tout-terrain lourd",
"cs": "Použitelné pro terénní vozidla: těžké terénní vozidlo",
"es": "Utilizable para vehículos todoterreno: vehículo todoterreno pesado",
"ca": "Utilitzable per a vehicles off-road: vehicle off-road de gran consum"
"ca": "Utilitzable per a vehicles tot terreny: vehicle tot terreny pesat"
}
},
{
@ -1284,7 +1284,7 @@
"fr": "Utilisable pour les véhicules hors route spécialisés : tracteur, véhicule 4x4",
"cs": "Použitelný pro specializované terénní vozy: traktor, čtyřkolka",
"es": "Utilizable para vehículos todoterreno especializados: tractor, ATV",
"ca": "Utilitzable per a vehicles especialitzats off-road: tractor, ATV"
"ca": "Utilitzable per a vehicles tot terreny especialitzats: tractor, quad"
}
},
{
@ -1296,7 +1296,7 @@
"fr": "Impasse / Aucun véhicule roulant",
"cs": "Neprůjezdné / Pro vozidla",
"es": "Intransitable / Ningún vehículo con ruedas",
"ca": "Impassable / Sense vehicle rodat"
"ca": "Impassable / Cap vehicle amb rodes"
}
}
],
@ -1675,7 +1675,7 @@
"fr": "Le panneau de signalisation D7 (<img src='./assets/layers/cycleways_and_roads/traffic_sign/be/Belgian_road_sign_D07.svg' style='width: 1.5em'>) a-t-il un panneau supplémentaire ?",
"cs": "Má dopravní značka D7 (<img src='./assets/layers/cycleways_and_roads/traffic_sign/be/Belgian_road_sign_D07.svg' style='width: 1.5em'>) doplňkovou značku?",
"es": "¿Tiene la señal de tráfico D7 (<img src='./assets/layers/cycleways_and_roads/traffic_sign/be/Belgian_road_sign_D07.svg' style='width: 1.5em'>) una señal complementaria?",
"ca": "El signe de trànsit D7 (<img src='./assets/layers/cyclewaysandroads/trafficsign/be/BelgianroadsignD07.svg' style='width: 1.5em'>) té un signe suplementari?"
"ca": "El senyal de trànsit D7 (<img src='./assets/layers/cyclewaysandroads/trafficsign/be/BelgianroadsignD07.svg' style='width: 1.5em'>) té un senyal suplementari?"
},
"condition": {
"or": [
@ -1713,7 +1713,7 @@
"fr": "Les VAE (Vélo à Assistance Electrique) rapides doivent utiliser la piste cyclable",
"cs": "Rychlá Elektrokola musí používat cyklostezku",
"es": "Las bicicletas de pedaleo asistido deben usar el carril bici",
"ca": "Els acceleradors han d'utilitzar la via"
"ca": "Les bicicletes de pedaleig assistit han d'utilitzar el carril bici"
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@ -1733,7 +1733,7 @@
"fr": "Les cyclomoteurs et les VAE doivent utiliser la piste cyclable",
"cs": "Mopedy a rychlá elektrokola musí používat cyklostezku",
"es": "Los ciclomotores y las bicicletas de pedaleo asistido deben usar el carril bici",
"ca": "Els ciclomotors i els acceleradors han d'utilitzar la via"
"ca": "Els ciclomotors i bicicletes de pedaleig assistit han d'utilitzar la via"
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@ -1774,7 +1774,7 @@
"fr": "Les VAE ne sont pas autorisés",
"cs": "Rychlá elektrokola nejsou povoleny",
"es": "Las bicicletas de pedaleo asistido no están permitidas",
"ca": "No es permet l'ús de peel·les ràpides"
"ca": "Les bicicletes de pedaleig assistit no estan permeses"
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@ -1794,7 +1794,7 @@
"fr": "Les cyclomoteurs et les VAE ne sont pas autorisés",
"cs": "Mopedy a rychlá elektrokola nejsou povoleny",
"es": "Los ciclomotores y las bicicletas de pedaleo asistido no están permitidos",
"ca": "No es permet l'ús de ciclomotors i acceleradors"
"ca": "No es permet l'ús de ciclomotors i bicicletes de pedaleig assistit"
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@ -1827,7 +1827,7 @@
"de": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m",
"cs": "Nárazník vedle této cyklostezky je {cycleway:buffer} m",
"es": "El espacio junto a este carril bici es de {cycleway:buffer} m",
"ca": "La memòria intermèdia a més d'aquesta pista és {cycleway:buffer} m"
"ca": "L'espai junt a aquest carril bici és de {cycleway:buffer} m"
},
"question": {
"en": "How wide is the gap between the cycleway and the road?",

View file

@ -4,7 +4,7 @@
"en": "Cyclist Waiting Aids",
"de": "Radfahrer-Wartehilfen",
"es": "Ayudas a la espera de ciclistas",
"ca": "Ciclista que espera ajuda"
"ca": "Ajudes a l'espera dels ciclistes"
},
"description": {
"en": "Various pieces of infrastructure that aid cyclists while they wait at a traffic light.",
@ -21,7 +21,7 @@
"de": "Radfahrer-Wartehilfe",
"es": "Ayuda para ciclistas en espera",
"nl": "Steuntje voor wachtende fietsers",
"ca": "Ciclista esperant ajuda"
"ca": "Ajuda per a ciclistes en espera"
}
},
"pointRendering": [
@ -54,7 +54,7 @@
"en": "a cyclist waiting aid",
"de": "eine Radfahrer-Wartehilfe",
"es": "un ciclista espera ayuda",
"ca": "una ajuda d'espera ciclista"
"ca": "una ajuda a l'espera del ciclista"
},
"tags": [
"highway=cyclist_waiting_aid"
@ -77,7 +77,7 @@
"en": "What kind of components does this waiting aid have?",
"de": "Aus welchen Bestandteilen besteht diese Wartehilfe?",
"es": "¿Qué tipo de componentes tiene esta ayuda a la espera?",
"ca": "Quin tipus de components té aquesta ajuda d'espera?"
"ca": "Quin tipus de components té aquesta ajuda a l'espera?"
},
"id": "type",
"multiAnswer": true,
@ -98,7 +98,7 @@
"en": "There is a rail or a handle to hold on to here",
"de": "Hier gibt es eine Schiene oder einen Griff zum Festhalten",
"es": "Hay una barandilla o un asa para agarrarse aquí",
"ca": "Hi ha un tren o una nansa per aferrar-se aquí"
"ca": "Hi ha una barana o una nansa per aferrar-se aquí"
},
"ifnot": "handrest="
}
@ -119,7 +119,7 @@
"en": "This waiting aid is located on the left side",
"de": "Diese Wartehilfe befindet sich auf der linken Seite",
"es": "Esta ayuda a la espera se encuentra en el lado izquierdo",
"ca": "Aquesta ajuda d'espera es troba a la banda esquerra"
"ca": "Aquesta ajuda a l'espera es troba a la banda esquerra"
}
},
{
@ -128,7 +128,7 @@
"en": "This waiting aid is located on the right side",
"de": "Diese Wartehilfe befindet sich auf der rechten Seite",
"es": "Esta ayuda a la espera se encuentra en el lado derecho",
"ca": "Aquesta ajuda d'espera es troba al costat dret"
"ca": "Aquesta ajuda a l'espera es troba al costat dret"
}
},
{
@ -137,7 +137,7 @@
"en": "There are waiting aids on both sides of the road",
"de": "Auf beiden Seiten der Straße gibt es Wartehilfen",
"es": "Hay ayudas a la espera a ambos lados de la carretera",
"ca": "Hi ha ajudes d'espera a banda i banda de la carretera"
"ca": "Hi ha ajudes a l'espera a ambdós costats de la carretera"
}
}
]
@ -152,7 +152,7 @@
"en": "This waiting aid can be used when going forward on this way",
"de": "Diese Wartehilfe kann bei der Weiterfahrt auf diesem Weg genutzt werden",
"es": "Esta ayuda a la espera puede utilizarse cuando se avanza por esta vía",
"ca": "Aquesta ajuda d'espera es pot utilitzar en avançar d'aquesta manera"
"ca": "Aquesta ajuda a l'espera es pot utilitzar quan s'avança en aquesta via"
}
},
{
@ -161,7 +161,7 @@
"en": "This waiting aid can be used when going backward on this way",
"de": "Diese Wartehilfe kann beim Rückwärtsfahren auf diesem Weg benutzt werden",
"es": "Esta ayuda a la espera puede utilizarse cuando se retrocede por este camino",
"ca": "Aquesta ajuda d'espera es pot utilitzar en retrocedir d'aquesta manera"
"ca": "Aquesta ajuda a l'espera es pot utilitzar quan es retrocedeix per aquest camí"
}
}
],
@ -169,7 +169,7 @@
"en": "This waiting aid can be used when going in {direction} direction",
"de": "Diese Wartehilfe kann in Fahrtrichtung {direction} benutzt werden",
"es": "Esta ayuda a la espera puede utilizarse cuando se va en dirección {direction}",
"ca": "Aquesta ajuda d'espera es pot utilitzar en anar en direcció {direction}"
"ca": "Aquesta ajuda a l'espera es pot utilitzar quan es va en direcció {direction}"
}
}
],

View file

@ -9,7 +9,7 @@
"description": {
"en": "A dog toilet is a facility designated for dogs to urinate and excrete. This can be a designated, signposted patch of grass, a sand pit or a fenced area.",
"de": "Eine Hundetoilette ist eine Einrichtung, die für das Urinieren und die Ausscheidung von Hunden vorgesehen ist. Dabei kann es sich um eine ausgewiesene, ausgeschilderte Rasenfläche, eine Sandgrube oder einen eingezäunten Bereich handeln.",
"ca": "Un vàter de gos és una instal·lació designada per a gossos per orinar i excretar. Aquest pot ser un pegat d'herba designat i senyalitzat, un pou de sorra o una zona tancada."
"ca": "Un vàter de gos és una instal·lació designada per a gossos per orinar i excretar. Pot ser un tros d'herba senyalitzat, un pou de sorra o una zona tancada."
},
"source": {
"osmTags": "amenity=dog_toilet"
@ -76,7 +76,7 @@
"then": {
"en": "There is a hedge around this dog toilet",
"de": "Diese Hundetoilette ist von einer Hecke umgeben",
"ca": "Hi ha una tanca al voltant d'aquest vàter de gos"
"ca": "Hi ha una esbardissa al voltant d'aquest vàter de gos"
}
},
{

View file

@ -244,7 +244,7 @@
"de": "Die Trinkwasserstelle ist dauerhaft geschlossen",
"uk": "Цей пункт питної води постійно закритий",
"es": "Esta fuente de agua potable está cerrada permanentemente",
"ca": "Aquesta aigua potable està tancada permanentment"
"ca": "Aquesta font d'aigua potable està tancada permanentment"
}
}
],
@ -305,7 +305,7 @@
"de": "Dies ist ein Sprudelbrunnen. Ein Wasserstrahl zum Trinken wird nach oben gerichtet und in der Regel durch einen Druckknopf gesteuert.",
"uk": "Це барботажний фонтан. Струмінь води, з якого можна пити, спрямовується вгору, зазвичай керується кнопкою.",
"es": "Esta es una fuente de chorro. Un chorro de agua para beber se envía hacia arriba, típicamente controlado por un botón.",
"ca": "Aquesta és una font de bombolles. Un raig d'aigua per beure s'envia cap amunt, normalment controlat per un botó d'empenta."
"ca": "Aquesta és una font de raig. Un raig d'aigua per beure s'envia cap amunt, normalment controlat per un botó d'empenta."
},
"addExtraTags": [
"man_made="
@ -419,7 +419,7 @@
"en": "Actively cooled water is available here",
"nl": "Afgekoeld water is hier beschikbaar",
"de": "Hier steht aktiv gekühltes Wasser zur Verfügung",
"ca": "L'aigua freda activa està disponible aquí"
"ca": "Aquí hi ha aigua refrigerada activament"
}
},
{
@ -429,7 +429,7 @@
"en": "Ambient temperature water (without active cooling or heating) is available here",
"nl": "Water aan omgevingstemperatuur (zonder actieve koeling of opwarming) is hier beschikbaar",
"de": "Wasser mit Umgebungstemperatur (ohne aktive Kühlung oder Heizung) ist hier verfügbar",
"ca": "L'aigua a temperatura ambient (sense refrigeració activa ni calefacció) està disponible aquí"
"ca": "L'aigua a temperatura ambient (sense refrigeració ni calefacció activa) està disponible aquí"
}
},
{
@ -449,7 +449,7 @@
"en": "Hot water is provided here",
"nl": "Heet water is hier beschikbaar",
"de": "Hier wird heißes Wasser bereitgestellt",
"ca": "L'aigua calenta es proporciona aquí"
"ca": "Aquí es proporciona aigua calenta"
}
}
]

View file

@ -390,7 +390,7 @@
"cs": "Má tento výtah hlasový výstup?",
"es": "¿Tiene este ascensor salida de voz?",
"nl": "Heeft deze lift spraakuitvoer?",
"ca": "Té aquesta sortida de veu d'ascensor?"
"ca": "Té sortida de veu aquest ascensor?"
},
"questionHint": {
"en": "E.g. it announces the current floor",

View file

@ -122,7 +122,7 @@
"da": "Hvilket Wikidata-emne er dette objekt opkaldt efter?",
"es": "¿Cuál es el elemento de Wikidata en honor a el cual se nombra este objeto?",
"uk": "На честь якого елемента Вікіданих названо цей об'єкт?",
"ca": "Quin és l'element de Wikidata que porta el nom d'aquest objecte?"
"ca": "Quin és l'element de Wikidata en honor al qual s'anomena aquest objecte?"
},
"freeform": {
"key": "name:etymology:wikidata",
@ -272,7 +272,7 @@
"fr": "<a href='https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst={name}' target='_blank'>Chercher sur inventaris onroerend erfgoed</a>",
"cs": "<a href='https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst={name}' target='_blank'>Hledání na inventaris onroerend erfgoed</a>",
"es": "<a href='https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst={name}' target='_blank'>Buscar en Inventaris Onroerend Erfgoed</a>",
"ca": "<a href='https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst={name}' target='blank'>Cerca en inventaris onroerend erfgoed</a>"
"ca": "<a href='https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst={name}' target='_blank'>Cerca en inventaris onroerend erfgoed</a>"
},
"condition": "_country=be"
},
@ -287,7 +287,7 @@
"cs": "Po čem je tento objekt pojmenován?",
"da": "Hvad er dette objekt opkaldt efter?",
"es": "¿A qué se debe el nombre de este objeto?",
"ca": "De què porta aquest objecte?"
"ca": "A que es deu el nom d'aquest objecte?"
},
"render": {
"en": "Named after {name:etymology}",
@ -298,7 +298,7 @@
"pl": "Nazwane po {name:etymology}",
"cs": "Pojmenováno po {name:etymology}",
"es": "Nombrado en honor a {name:etymology}",
"ca": "Anomenat després de {name:etymology}"
"ca": "Anomenat en honor a {name:etymology}"
},
"freeform": {
"key": "name:etymology",

View file

@ -14,7 +14,7 @@
"en": "Now open",
"nl": "Nu open",
"de": "Jetzt geöffnet",
"ca": "Obert ara",
"ca": "Ara obert",
"es": "Abierto ahora",
"fr": "Ouvert maintenant",
"hu": "Most nyitva van",
@ -289,7 +289,7 @@
"de": "Keine Bevorzugung von Hunden",
"cs": "Bez preference psů",
"es": "Sin preferencia por los perros",
"ca": "No hi ha preferència cap als gossos"
"ca": "Sense preferència pels gossos"
}
},
{
@ -299,7 +299,7 @@
"de": "Hunde erlaubt",
"cs": "Psi povoleny",
"es": "Se permiten perros",
"ca": "Permesos"
"ca": "Es permeten gossos"
},
"emoji": "🐕",
"osmTags": {
@ -333,7 +333,7 @@
"de": "Internetzugang vorhanden",
"cs": "Nabízí internet",
"es": "Ofrece internet",
"ca": "Ofertes d'internet"
"ca": "Ofereix internet"
},
"icon": "wifi",
"osmTags": {
@ -355,7 +355,7 @@
"de": "Stromanschluss vorhanden",
"cs": "Nabízí elektřinu",
"es": "Ofrece electricidad",
"ca": "Ofertes d'electricitat"
"ca": "Ofereix electricitat"
},
"osmTags": "service:electricity=yes"
}
@ -370,7 +370,7 @@
"cs": "Má nabídku bez cukru",
"de": "Hat zuckerfreie Angebote",
"es": "Tiene una oferta sin azúcar",
"ca": "Té una oferta sense sucre"
"ca": "Disposa d'oferta sense sucre"
},
"osmTags": {
"or": [
@ -413,7 +413,7 @@
"cs": "Má nabídku bez laktózy",
"de": "Hat laktosefreie Angebote",
"es": "Tiene una oferta sin lactosa",
"ca": "una oferta lliure de lactosa"
"ca": "Disposa d'una oferta lliure de lactosa"
},
"icon": "./assets/layers/questions/lactose_free.svg",
"osmTags": {

View file

@ -4,7 +4,7 @@
"en": "Firepit",
"de": "Feuerstelle",
"es": "Hoguera",
"ca": "Aixeta"
"ca": "Foguera"
},
"description": {
"en": "An outdoor place to make a fire, typically open to the public.",
@ -21,7 +21,7 @@
"en": "Firepit",
"de": "Feuerstelle",
"es": "Hoguera",
"ca": "Aixeta"
"ca": "Foguera"
}
},
"titleIcons": [
@ -52,7 +52,7 @@
"en": "Firepit",
"de": "Feuerstelle",
"es": "Hoguera",
"ca": "Aixeta"
"ca": "Foguera"
},
"description": {
"de": "Eine Stelle im Freien zum Feuermachen, typischerweise öffentlich zugänglich.",
@ -127,7 +127,7 @@
"de": "Zugang nur für Berechtigte",
"en": "Access only for authorized",
"es": "Acceso solo para autorizados",
"ca": "Accés només per autoritzat"
"ca": "Accés només per a autoritzats"
}
}
]
@ -140,7 +140,7 @@
"nl": "Is deze kampvuurplaats heel het jaar door beschikbaar?",
"de": "Ist diese Feuerstelle rund um das Jahr nutzbar?",
"es": "¿Está la hoguera disponible todo el año?",
"ca": "Està disponible la cabina durant tot l'any?"
"ca": "Està disponible la foguera durant tot l'any?"
}
}
}

46
assets/license_info.json Normal file
View file

@ -0,0 +1,46 @@
[
{
"path": "icon-background.png",
"license": "LOGO AND CC-BY-SA-4.0",
"authors": [
"Pieter Vander Vennet",
"OSM"
],
"sources": [
"https://mapcomplete.org"
]
},
{
"path": "icon-foreground.png",
"license": "LOGO AND CC-BY-SA-4.0",
"authors": [
"Pieter Vander Vennet",
"OSM"
],
"sources": [
"https://mapcomplete.org"
]
},
{
"path": "icon-only.png",
"license": "LOGO AND CC-BY-SA-4.0",
"authors": [
"Pieter Vander Vennet",
"OSM"
],
"sources": [
"https://mapcomplete.org"
]
},
{
"path": "splash-dark.png",
"license": "LOGO AND CC-BY-SA-4.0",
"authors": [
"Pieter Vander Vennet",
"OSM"
],
"sources": [
"https://mapcomplete.org"
]
}
]

View file

@ -0,0 +1,2 @@
SPDX-FileCopyrightText: Pieter Vander Vennet; OSM
SPDX-License-Identifier: LicenseRef-LOGO AND CC-BY-SA-4.0

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText: Dave Gandy; Pieter Vander Vennet
SPDX-License-Identifier: CC-BY-SA-3.0

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText: Pieter Vander Vennet
SPDX-License-Identifier: CC0-1.0

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText: Engr.eponce
SPDX-License-Identifier: CC-BY-SA-4.0

View file

@ -737,7 +737,7 @@
]
},
{
"path": "mapcomplete_logo.svg",
"path": "mapcomplete_logo_centered.svg",
"license": "LOGO AND CC-BY-SA-4.0",
"authors": [
"Pieter Vander Vennet",

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText: Pol Labaut
SPDX-License-Identifier: CC0-1.0

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText:
SPDX-License-Identifier: LicenseRef-TRIVIAL

View file

@ -0,0 +1,2 @@
SPDX-FileCopyrightText: Pieter Vander Vennet; OSM
SPDX-License-Identifier: LicenseRef-LOGO AND CC-BY-SA-4.0

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText:
SPDX-License-Identifier: LicenseRef-TRIVIAL

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText:
SPDX-License-Identifier: LicenseRef-TRIVIAL

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText:
SPDX-License-Identifier: LicenseRef-TRIVIAL

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText:
SPDX-License-Identifier: LicenseRef-TRIVIAL

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText:
SPDX-License-Identifier: LicenseRef-TRIVIAL

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText: Pieter Vander Vennet
SPDX-License-Identifier: CC0-1.0

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText: https://www.openstreetmap.org/user/GEO%20ECLA
SPDX-License-Identifier: CC0-1.0

View file

@ -0,0 +1,38 @@
{
"id": "architecture",
"title": {
"en": "Buildings with an architectural style"
},
"description": {
"en": "A map showing the archetectural style of buildings"
},
"icon": "./assets/themes/architecture/architecture.svg",
"defaultBackgroundId": "protomaps.white",
"layers": [
{
"builtin": "building",
"override": {
"id": "buildings_with_architecture",
"isCounted": true,
"minzoom": 12,
"source": {
"osmTags": {
"and+": [
"building:architecture~*"
]
}
}
}
},
{
"builtin": "building",
"override": {
"name": null,
"filter": {
"sameAs": "buildings_with_architecture"
}
}
}
]
}

View file

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 295.239 295.239" xml:space="preserve">
<g>
<g>
<g>
<path d="M244.352,239.382l-6.91-6.557c-0.348,0.367-0.729,0.695-1.081,1.057l-39.614-129.643
c5.005-6.448,8.014-14.514,8.014-23.286c0-21.005-17.09-38.095-38.095-38.095V25.372c1.267,0.195,2.524,0.329,3.79,0.562
l1.738-9.367c-1.957-0.362-3.91-0.595-5.867-0.867c-1.59-8.905-9.352-15.7-18.71-15.7c-9.358,0-17.117,6.796-18.707,15.701
c-1.957,0.276-3.91,0.505-5.867,0.867l1.738,9.367c1.267-0.233,2.524-0.367,3.79-0.562v17.486
c-21.005,0-38.095,17.09-38.095,38.095c0,8.771,3.01,16.838,8.01,23.281L58.871,233.877c-0.352-0.362-0.733-0.69-1.081-1.057
l-6.91,6.557c1.557,1.638,3.214,3.19,4.857,4.757l-7.914,25.905l-0.205,25.2l27.91-20.933l3.757-12.295
c1.014,0.61,2.005,1.281,3.024,1.852l4.662-8.305c-1.624-0.914-3.214-1.952-4.819-2.952l17.533-57.367h95.862l17.529,57.371
c-1.605,1-3.19,2.038-4.819,2.952l4.662,8.305c1.024-0.576,2.01-1.248,3.024-1.852l3.757,12.295l27.919,20.929V270.72
l-8.124-26.581C241.138,242.572,242.8,241.02,244.352,239.382z M166.667,52.382c15.757,0,28.571,12.814,28.571,28.571
c0,9.171-4.362,17.329-11.1,22.557c-2.79-9.433-9.138-17.333-17.49-22.176c0-0.129,0.019-0.252,0.019-0.381
c0-10.276-4.11-19.595-10.748-26.457C159.243,53.144,162.867,52.382,166.667,52.382z M165.086,91.73
c5.181,4.019,8.943,9.767,10.41,16.381c-2.782,0.909-5.744,1.414-8.829,1.414c-3.8,0-7.424-0.762-10.748-2.114
C160.138,103.049,163.324,97.697,165.086,91.73z M147.619,102.191c-4.362-3.919-7.524-9.138-8.833-15.062
c2.785-0.909,5.747-1.414,8.833-1.414s6.048,0.505,8.833,1.414C155.142,93.053,151.981,98.272,147.619,102.191z M147.619,76.191
c-3.205,0-6.3,0.443-9.276,1.19c0.876-6.985,4.286-13.18,9.276-17.666c4.99,4.481,8.4,10.676,9.276,17.662
C153.919,76.634,150.824,76.191,147.619,76.191z M139.319,107.411c-3.324,1.352-6.948,2.114-10.748,2.114
c-3.086,0-6.048-0.505-8.833-1.414c1.467-6.614,5.229-12.362,10.41-16.381C131.914,97.696,135.1,103.049,139.319,107.411z
M128.571,119.048c6.943,0,13.438-1.895,19.048-5.152c5.61,3.257,12.105,5.152,19.048,5.152c3.205,0,6.3-0.443,9.276-1.19
c-1.767,14.072-13.781,25-28.324,25c-14.543,0-26.557-10.929-28.324-25C122.271,118.606,125.366,119.048,128.571,119.048z
M138.095,19.049c0-5.252,4.271-9.524,9.524-9.524s9.524,4.271,9.524,9.524v25.062c-3.381,0.876-6.576,2.19-9.524,3.9
c-2.948-1.714-6.143-3.024-9.524-3.9V19.049z M128.571,52.382c3.8,0,7.424,0.762,10.748,2.114
c-6.638,6.862-10.748,16.181-10.748,26.457c0,0.129,0.019,0.252,0.019,0.381c-8.352,4.843-14.7,12.743-17.49,22.176
c-6.738-5.229-11.1-13.386-11.1-22.557C100,65.196,112.814,52.382,128.571,52.382z M67.329,268.549l-10.186,7.642v-4.052
l49.024-160.448c1.086,0.795,2.21,1.533,3.376,2.21c0,0.133-0.019,0.257-0.019,0.386c0,3.79,0.576,7.443,1.61,10.9
L67.329,268.549z M102.6,185.715l14.776-48.357c6.967,9.11,17.914,15.024,30.243,15.024c12.329,0,23.276-5.914,30.243-15.024
l14.776,48.357H102.6z M238.096,276.191L238.096,276.191l-10.187-7.638l-43.804-143.362c1.033-3.462,1.61-7.114,1.61-10.905
c0-0.129-0.019-0.252-0.019-0.381c1.167-0.676,2.29-1.419,3.376-2.21l49.024,160.443V276.191z"/>
<path d="M208.3,28.882c-5.633-2.876-11.529-5.381-17.514-7.433l-3.081,9.014c5.557,1.9,11.029,4.224,16.262,6.9L208.3,28.882z"/>
<path d="M262.886,80.568c-3.186-5.457-6.795-10.748-10.733-15.714l-7.462,5.914c3.662,4.619,7.014,9.529,9.971,14.595
L262.886,80.568z"/>
<path d="M239.29,50.815c-4.605-4.357-9.552-8.419-14.714-12.067l-5.5,7.776c4.79,3.39,9.39,7.162,13.667,11.21L239.29,50.815z"/>
<path d="M267.876,118.053l9.248-2.262c-1.505-6.157-3.476-12.252-5.852-18.133l-8.829,3.571
C264.652,106.687,266.481,112.349,267.876,118.053z"/>
<path d="M280.319,134.558l-9.476,0.919c0.386,4.019,0.586,8.1,0.586,12.143c0,1.857-0.038,3.7-0.119,5.538l9.514,0.419
c0.086-1.976,0.129-3.962,0.129-5.957C280.952,143.272,280.743,138.877,280.319,134.558z"/>
<path d="M264.767,187.801l9.01,3.086c2.057-5.99,3.69-12.186,4.867-18.405l-9.362-1.767
C268.19,176.491,266.671,182.239,264.767,187.801z"/>
<path d="M248.671,219.172l7.771,5.505c3.671-5.176,6.995-10.648,9.876-16.267l-8.471-4.352
C255.167,209.282,252.081,214.368,248.671,219.172z"/>
<path d="M174.533,268.491l2.067,9.3c6.348-1.414,12.624-3.3,18.662-5.619l-3.414-8.89
C186.248,265.43,180.424,267.182,174.533,268.491z"/>
<path d="M147.614,271.43c-3.029-0.071-6.048-0.105-9.067-0.324l-0.695,9.495c3.19,0.238,6.414,0.352,9.581,0.352
c3.448,0.062,6.643-0.11,9.89-0.348l-0.686-9.495C153.676,271.325,150.638,271.43,147.614,271.43z"/>
<path d="M99.924,272.153c6.067,2.329,12.343,4.219,18.657,5.619l2.062-9.3c-5.857-1.295-11.681-3.052-17.305-5.21L99.924,272.153
z"/>
<path d="M107.681,30.415l-3.071-9.014c-5.995,2.038-11.9,4.533-17.543,7.419l4.333,8.481
C96.638,34.625,102.114,32.311,107.681,30.415z"/>
<path d="M50.633,70.672l-7.457-5.924c-3.948,4.971-7.567,10.257-10.748,15.705l8.224,4.81
C43.605,80.196,46.967,75.291,50.633,70.672z"/>
<path d="M28.857,208.287c2.881,5.629,6.2,11.1,9.862,16.281l7.776-5.505c-3.405-4.805-6.486-9.89-9.157-15.119L28.857,208.287z"
/>
<path d="M25.933,170.582l-9.362,1.757c1.171,6.233,2.8,12.424,4.848,18.414l9.014-3.076
C28.529,182.12,27.014,176.368,25.933,170.582z"/>
<path d="M23.81,147.615c0-4.09,0.2-8.229,0.6-12.281l-9.476-0.938c-0.433,4.371-0.648,8.819-0.648,13.224
c0,1.943,0.043,3.876,0.124,5.81l9.514-0.419C23.848,151.22,23.81,149.425,23.81,147.615z"/>
<path d="M76.271,46.444l-5.495-7.776c-5.162,3.643-10.119,7.695-14.729,12.048l6.538,6.929
C66.871,53.601,71.476,49.834,76.271,46.444z"/>
<path d="M32.843,101.106l-8.824-3.581c-2.376,5.857-4.352,11.952-5.871,18.11l9.243,2.281
C28.805,112.206,30.638,106.549,32.843,101.106z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

View file

@ -0,0 +1,2 @@
SPDX-FileCopyrightText: Design Thinking
SPDX-License-Identifier: CC0-1.0

View file

@ -0,0 +1,12 @@
[
{
"path": "architecture.svg",
"license": "CC0-1.0",
"authors": [
"Design Thinking"
],
"sources": [
"https://www.svgrepo.com/svg/144391/architecture"
]
}
]

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText: ©UNESCO-UIS 2012 http://www.uis.unesco.org
SPDX-License-Identifier: LicenseRef-ALL-RIGHTS-RESERVED

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText: vladi1081384728
SPDX-License-Identifier: CC-BY-SA-4.0

View file

@ -246,6 +246,10 @@
"if": "theme=aed",
"then": "./assets/themes/aed/aed.svg"
},
{
"if": "theme=architecture",
"then": "./assets/themes/architecture/architecture.svg"
},
{
"if": "theme=artwork",
"then": "./assets/themes/artwork/artwork.svg"

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText: Vlaamse Overheid
SPDX-License-Identifier: LicenseRef-ALL-RIGHTS-RESERVED

View file

@ -616,6 +616,7 @@
"intro": "Maps about various topics which you can contribute to",
"learnMore": "Learn more",
"logIn": "Log in to see other themes you previously visited",
"recentThemes": "Recently visited themes",
"title": "MapComplete"
},
"inspector": {

View file

@ -3057,16 +3057,16 @@
"render": "S'ha de pagar una tarifa de {charge} per a escalar aquí"
},
"max_bolts": {
"question": "Quants parabolts tenen com a màxim les rutes a {title()} ?",
"question": "Quants ancoratges d'anella tenen com a màxim les rutes a {title()} ?",
"render": "Les rutes d'escalada esportiva aquí tenen com a màxim {climbing:bolts:max} perns. <div class='subtle'>Això és sense estacions d'assegurament i indica quantes cintes necessita un escalador.</div>"
},
"max_difficulty": {
"question": "Quina és la ruta de grau més alt d'aquí, segons el sistema de classificació francès?",
"render": "La nota més alta és {climbing:grade:french:max} segons el sistema francès/belga"
"question": "Quina és la ruta de major aquí, segons el sistema de classificació francès?",
"render": "La grau més alt és {climbing:grade:french:max} segons el sistema francès/belga"
},
"min_difficulty": {
"question": "Quin és el grau de la ruta més fàcil aquí, segons el sistema de classificació francès?",
"render": "La nota més baixa és {climbing:grade:french:min} segons el sistema francès/belga"
"question": "Quin és el grau de la ruta més fàcil aquí segons el sistema de classificació francès?",
"render": "El grau més baix és {climbing:grade:french:min} segons el sistema francès/belga"
},
"sportclimbing": {
"mappings": {
@ -3085,16 +3085,16 @@
"toprope": {
"mappings": {
"0": {
"then": "L'escalada propícia és possible aquí"
"then": "L'escalada en politja és possible aquí"
},
"1": {
"then": "L'escalada propícia no és possible aquí"
"then": "L'escalada en politja no és possible aquí"
},
"2": {
"then": "Hi ha {climbing:toprope} rutes específiques"
"then": "Hi ha {climbing:toprope} rutes d'escalada en politja"
}
},
"question": "És possible l'escalada propícia aquí?"
"question": "És possible l'escalada en politja aquí?"
},
"trad_climbing": {
"mappings": {
@ -3105,11 +3105,11 @@
"then": "L'escalada tradicional no és possible aquí"
},
"2": {
"then": "Hi ha {climbing:traditional} vies d'escalada tradicionals"
"then": "Hi ha {climbing:traditional} rutes d'escalada tradicionals"
}
},
"question": "És possible l'escalada tradicional aquí?",
"questionHint": "Utilitzant el vostre propi engranatge, p. ex., chocks"
"questionHint": "Utilitzant el vostre propi equipament, p. ex., cales"
},
"website": {
"question": "Hi ha un lloc web (no oficial) amb més informació (p. ex. topos)?"
@ -3150,7 +3150,7 @@
"then": "Una roca d'escalada: una única roca o penya-segat amb una o unes quantes vies d'escalada que es poden escalar amb seguretat sense corda"
},
"1": {
"then": "Un cinglera d'escalada - una sola roca o penya-segat amb almenys unes quantes rutes d'escalada"
"then": "Un cinglera d'escalada: una sola roca o penya-segat amb almenys unes quantes rutes d'escalada"
},
"2": {
"then": "Una zona d'escalada amb un o més penya-segats i/o roques"
@ -3170,7 +3170,7 @@
"title": {
"mappings": {
"0": {
"then": "Trenca d'escalada <b>{name}</b>"
"then": "Paret d'escalada <b>{name}</b>"
},
"1": {
"then": "Àrea d'escalada <b>{name}</b>"
@ -3194,8 +3194,8 @@
"title": "un club d'escalada"
},
"1": {
"description": "Una ONG que treballa per l'escalada",
"title": "un ngo d'escalada"
"description": "Una ONG que treballa amb l'escalada",
"title": "una ONG d'escalada"
}
},
"tagRenderings": {
@ -3234,78 +3234,78 @@
"then": "Hi ha {climbing:speed} parets d'escalada de velocitat"
}
},
"question": "Hi ha una paret d'escalada ràpida?"
"question": "Hi ha una paret d'escalada de velocitat?"
},
"auto_belay_lead": {
"mappings": {
"0": {
"then": "No hi ha relleus automàtics per a l'escalada de plom"
"then": "No hi ha asseguraments automàtics per al cap de corda"
},
"1": {
"then": "Hi ha una sèrie de relleus automàtics per a l'escalada de plom"
"then": "Hi ha una sèrie d'asseguraments automàtics per a cada cap de corda"
},
"2": {
"then": "Hi ha un relleu automàtic per a cada ruta d'escalada de plom"
"then": "Hi ha un assegurament automàtic per a cada cap de corda"
}
},
"question": "Hi ha rèpliques automàtiques per a l'escalada de plom?",
"render": "Hi ha {climbing:autobelay:sport} relleus automàtics per a l'escalada de plom"
"question": "Hi ha asseguraments automàtics per al cap de corda?",
"render": "Hi ha {climbing:autobelay:sport} asseguraments automàtics per al cap de corda"
},
"auto_belay_toprope": {
"mappings": {
"0": {
"then": "No hi ha relleus automàtics per a la corda superior"
"then": "No hi ha asseguraments automàtics per a l'escalada en politja"
},
"1": {
"then": "Hi ha una sèrie de relleus automàtics per a la corda superior"
"then": "Hi ha una sèrie d'asseguraments automàtics per a l'escalada en politja"
},
"2": {
"then": "Hi ha un relleu automàtic per a cada ruta de la corda superior, però també és possible el relleu manual"
"then": "Hi ha un assegurament automàtic per a cada ruta d'escalada en politja, però també és possible el relleu manual"
},
"3": {
"then": "Les rutes de corda més altes només es poden escalar en relleu automàtic"
"then": "Les rutes d'escalada en politja només es poden escalar en relleu automàtic"
}
},
"question": "Hi ha belays automàtics per a la corda superior aquí?",
"question": "Hi ha relleus automàtics per a l'escalada en politja aquí?",
"questionHint": "Excloent els relleus automàtics que només són per a l'escalada de velocitat",
"render": "Hi ha {climbing:autobelay:toprope} dispositius de relleu automàtic per a cordes superiors"
"render": "Hi ha {climbing:autobelay:toprope} dispositius de relleu automàtic per a l'escalada en politja"
},
"belay_device_rental": {
"mappings": {
"0": {
"then": "Els dispositius Belay es proporcionen a cada corda"
"then": "Els dispositius d'assegurament es proporcionen a cada corda"
},
"1": {
"then": "Un dispositiu d'aspiració es pot demanar prestat gratuïtament aquí"
"then": "Aquí es pot sol·licitar prestat un dispositiu d'assegurament gratuït"
},
"2": {
"then": "Es pot llogar un dispositiu de relleu aquí per {service:climbing_belay_device:rental:charge}"
},
"3": {
"then": "Es pot llogar un dispositiu d'aspiració aquí"
"then": "Aquí es pot llogar un dispositiu d'assegurament"
},
"4": {
"then": "Un dispositiu de relleu pot llogar <b>no</b> aquí"
"then": "Aquí <b>no</b> es pot llogar un dispositiu d'assegurament"
}
},
"question": "Es pot llogar un aparell de belay aquí per utilitzar al gimnàs?"
"question": "Aquí es pot llogar un aparell d'assegurament per utilitzar al gimnàs?"
},
"harness_rental": {
"mappings": {
"0": {
"then": "Un arnès d'escalada es pot demanar prestat gratuïtament aquí"
"then": "Aquí es pot demanar prestat gratuïtament un arnès d'escalada"
},
"1": {
"then": "Es pot llogar un arnès d'escalada aquí per {service:climbing_harness:rental:charge}"
},
"2": {
"then": "Es pot llogar un arnès d'escalada aquí"
"then": "Aquí es pot llogar un arnès d'escalada"
},
"3": {
"then": "Un arnés d'escalada pot <b>no</b> ser llogat aquí"
"then": "Aquí <b>no</b> es pot llogar un arnés d'escalada"
}
},
"question": "Es pot llogar un arnès d'escalada aquí per utilitzar al gimnàs?"
"question": "Aquí es pot llogar un arnès d'escalada per utilitzar al gimnàs?"
},
"name": {
"question": "Quin és el nom d'aquest gimnàs d'escalada?"
@ -3313,42 +3313,42 @@
"rope_rental": {
"mappings": {
"0": {
"then": "Una corda d'escalada es pot demanar prestat gratuïtament aquí"
"then": "Aquí es pot demanar prestat gratuïtament una corda d'escalada"
},
"1": {
"then": "Es pot llogar una corda d'escalada aquí per {service:climbing_rope:rental:charge}"
},
"2": {
"then": "Es pot llogar una corda d'escalada aquí"
"then": "Aquí es pot llogar una corda d'escalada"
},
"3": {
"then": "Es pot llogar una corda d'escalada <b>no</b> aquí"
"then": "Aquí <b>no</b> es pot llogar una corda d'escalada"
}
},
"question": "Es pot llogar una corda d'escalada aquí per utilitzar al gimnàs?"
"question": "Aquí es pot llogar una corda d'escalada per a utilitzar al gimnàs?"
},
"shoe_rental": {
"mappings": {
"0": {
"then": "Les sabates d'escalada es poden demanar en préstec gratuïtament aquí"
"then": "Aquí es poden demanar en préstec gratuïtament sabates d'escalada"
},
"1": {
"then": "Les sabates d'escalada es poden llogar aquí per {service:climbing_shoes:rental:charge}"
},
"2": {
"then": "Es poden llogar sabates d'escalada aquí"
"then": "Aquí es poden llogar sabates d'escalada"
},
"3": {
"then": "Les sabates d'escalada poden llogar-se aquí <b>no</b>"
"then": "Aquí <b>no</b> poden llogar-se sabates d'escalada"
}
},
"question": "Es poden llogar sabates d'escalada aquí per utilitzar al gimnàs?"
"question": "Aquí es poden llogar sabates d'escalada per utilitzar al gimnàs?"
}
},
"title": {
"mappings": {
"0": {
"then": "gimnàs d'escalada <strong>{name}</strong>"
"then": "Gimnàs d'escalada <strong>{name}</strong>"
}
},
"render": "Gimnàs d'escalada"
@ -3392,11 +3392,11 @@
"tagRenderings": {
"Difficulty": {
"question": "Quin és el grau d'aquesta via d'escalada segons el sistema francès/belga?",
"render": "La qualificació és {climbing:grade:french} segons el sistema francès/belga"
"render": "El grau és {climbing:grade:french} segons el sistema francès/belga"
},
"Length": {
"question": "Quant dura aquesta via d'escalada (en metres)?",
"render": "Aquesta ruta és {canonical(climbing:length)} llarga"
"render": "Aquesta ruta és {canonical(climbing:length)} de llarg"
},
"Name": {
"mappings": {
@ -3413,11 +3413,11 @@
"bolts": {
"mappings": {
"0": {
"then": "Aquesta ruta no està vorejada"
"then": "Aquesta ruta no té ancoratges d'anella"
}
},
"question": "Quants perns té aquesta ruta abans d'arribar a l'ancoratge?",
"render": "Aquesta ruta té {climbing:bolts} perns. <div class='subtle'>Això no té estacions d'aspiració i indica quant de ràpid necessita un escalador.</div>"
"question": "Quants ancoratges d'anella té aquesta ruta abans d'arribar a l'ancoratge?",
"render": "Aquesta ruta té {climbing:bolts} ancoratges d'anella. <div class='subtle'>Això és sense estacions d'assegurament i indica quantes cintes necessita un escalador.</div>"
}
},
"title": {
@ -3443,7 +3443,7 @@
},
"2": {
"description": "Un rellotge visible públicament muntat directament en una paret",
"title": "un rellotge muntat a la paret, muntat directament en una paret"
"title": "un rellotge muntat directament en una paret"
}
},
"tagRenderings": {
@ -3752,13 +3752,13 @@
"then": "Aquest encreuament no té marques"
},
"1": {
"then": "Aquest encreuament té marques zebra"
"then": "Aquest pas de vianants té marques de zebra"
},
"10": {
"then": "Aquest encreuament té marques zebra en colors alterns"
"then": "Aquest pas de vianants té marques de zebra en colors alterns"
},
"11": {
"then": "Aquest encreuament té marcacions de doble zebra"
"then": "Aquest pas de vianants té marques de zebra doble"
},
"12": {
"then": "Aquest encreuament té pictogrames a la carretera"
@ -3767,7 +3767,7 @@
"then": "Aquest encreuament té línies a banda i banda de l'encreuament, juntament amb barres que les connecten, amb una interrupció a cada barra"
},
"14": {
"then": "Aquest encreuament té línies dobles a banda i banda de la travessia"
"then": "Aquest encreuament té línies dobles a banda i banda del creuament"
},
"2": {
"then": "Aquest encreuament té marques d'un tipus desconegut"
@ -3779,23 +3779,23 @@
"then": "Aquest encreuament té línies a banda i banda de l'encreuament, juntament amb barres que els connecten"
},
"5": {
"then": "Aquest encreuament ha traçat línies a banda i banda de la travessia"
"then": "Aquest encreuament té traçades línies a banda i banda de la travessia"
},
"6": {
"then": "Aquest encreuament té línies de punts a banda i banda del encreuament"
},
"7": {
"then": "Aquest encreuament està marcat per l'ús d'una superfície de color diferent"
"then": "Aquest encreuament està marcat usant una superfície de color diferent"
},
"8": {
"then": "Aquest encreuament té línies a banda i banda de l'encreuament, juntament amb barres angletes que les connecten"
"then": "Aquest encreuament té línies a banda i banda de l'encreuament, juntament amb barres en diagonal que les connecten"
},
"9": {
"then": "Aquest encreuament té marques zebra amb una interrupció en cada barra"
}
},
"question": "Quin tipus de marques té aquest encreuament?",
"render": "Aquest encreuament té {crossing:markings} marques"
"question": "Quin tipus de senyalització té aquest encreuament?",
"render": "Aquest encreuament té marques {crossing:markings}"
}
},
"title": {
@ -3868,7 +3868,7 @@
"then": "Utilitzable per a vehicles tot terreny especialitzats: tractor, ATV"
},
"7": {
"then": "Impassable / Sense vehicle rodat"
"then": "Impassable / Cap vehicle amb rodes"
}
},
"question": "Quina és la suavitat d'aquesta via ciclista?"
@ -3888,7 +3888,7 @@
"then": "Aquest carril bici està fet de pedra empedrada"
},
"12": {
"then": "Aquest carril bici està fet de terra crua"
"then": "Aquest carril bici està fet de terra"
},
"2": {
"then": "Aquesta via ciclista està feta d'asfalt"
@ -3956,7 +3956,7 @@
"Surface of the road": {
"mappings": {
"0": {
"then": "Aquest carril bici no està endurit"
"then": "Aquest carril bici no està paviment"
},
"1": {
"then": "Aquest carril bici està pavimentat"
@ -3968,22 +3968,22 @@
"then": "Aquest carril bici està fet de pedra empedrada"
},
"12": {
"then": "Aquest carril bici està fet de terra crua"
"then": "Aquest carril bici està fet de terra"
},
"2": {
"then": "Aquest carril bici està fet d'asfalt"
},
"3": {
"then": "Aquest carril bici està fet de llises pedres de paviment"
"then": "Aquest carril bici està fet adoquins llisos"
},
"4": {
"then": "Aquest carril bici està fet de formigó"
},
"5": {
"then": "Aquest carril bici està fet de llamborda (sense mànigues o sett)"
"then": "Aquest carril bici està fet de llambordes (sense tallar o carreu)"
},
"6": {
"then": "Aquest carril bici és de pedra empedrada natural i crua"
"then": "Aquest carril bici és de pedra empedrada natural sense tallar"
},
"7": {
"then": "Aquest carril bici és de pedra empedrada plana i quadrada"
@ -4013,16 +4013,16 @@
"then": "Utilitzable per rodes robustes; Bicicleta de treking, cotxes, bicitaxi"
},
"4": {
"then": "Utilitzable per a vehicles amb alta habilitació: vehicle off-road lleuger"
"then": "Utilitzable per a vehicles amb gran espai lliure al terra: vehicle tot terreny lleuger"
},
"5": {
"then": "Utilitzable per a vehicles off-road: vehicle off-road de gran consum"
"then": "Utilitzable per a vehicles tot terreny: vehicle tot terreny pesat"
},
"6": {
"then": "Utilitzable per a vehicles especialitzats off-road: tractor, ATV"
"then": "Utilitzable per a vehicles tot terreny especialitzats: tractor, quad"
},
"7": {
"then": "Impassable / Sense vehicle rodat"
"then": "Impassable / Cap vehicle amb rodes"
}
},
"question": "Quina és la suavitat d'aquest carrer?"
@ -4116,34 +4116,34 @@
"then": "Els ciclomotors han d'utilitzar la via ciclista"
},
"1": {
"then": "Els acceleradors han d'utilitzar la via"
"then": "Les bicicletes de pedaleig assistit han d'utilitzar el carril bici"
},
"2": {
"then": "Els ciclomotors i els acceleradors han d'utilitzar la via"
"then": "Els ciclomotors i bicicletes de pedaleig assistit han d'utilitzar la via"
},
"3": {
"then": "Els ciclomotors no estan permesos"
},
"4": {
"then": "No es permet l'ús de peel·les ràpides"
"then": "Les bicicletes de pedaleig assistit no estan permeses"
},
"5": {
"then": "No es permet l'ús de ciclomotors i acceleradors"
"then": "No es permet l'ús de ciclomotors i bicicletes de pedaleig assistit"
},
"6": {
"then": "No hi ha cap senyal de trànsit addicional"
}
},
"question": "El signe de trànsit D7 (<img src='./assets/layers/cyclewaysandroads/trafficsign/be/BelgianroadsignD07.svg' style='width: 1.5em'>) té un signe suplementari?"
"question": "El senyal de trànsit D7 (<img src='./assets/layers/cyclewaysandroads/trafficsign/be/BelgianroadsignD07.svg' style='width: 1.5em'>) té un senyal suplementari?"
},
"cycleways_and_roads-cycleway:buffer": {
"question": "Quina és la distància entre el carril bici i la carretera?",
"render": "La memòria intermèdia a més d'aquesta pista és {cycleway:buffer} m"
"render": "L'espai junt a aquest carril bici és de {cycleway:buffer} m"
},
"incline": {
"mappings": {
"0": {
"then": "Hi ha (probablement) cap inclinació aquí"
"then": "Probablement aquí no hi ha inclinació"
},
"1": {
"then": "Aquesta carretera té pendent"
@ -4213,35 +4213,35 @@
},
"cyclist_waiting_aid": {
"description": "Diverses infraestructures que ajuden els ciclistes mentre esperen a un semàfor.",
"name": "Ciclista que espera ajuda",
"name": "Ajudes a l'espera dels ciclistes",
"presets": {
"0": {
"description": "Un reposapeus, barana o altres ajudes, per millorar la comoditat mentre s'espera als semàfors",
"title": "una ajuda d'espera ciclista"
"title": "una ajuda a l'espera del ciclista"
}
},
"tagRenderings": {
"direction": {
"mappings": {
"0": {
"then": "Aquesta ajuda d'espera es pot utilitzar en avançar d'aquesta manera"
"then": "Aquesta ajuda a l'espera es pot utilitzar quan s'avança en aquesta via"
},
"1": {
"then": "Aquesta ajuda d'espera es pot utilitzar en retrocedir d'aquesta manera"
"then": "Aquesta ajuda a l'espera es pot utilitzar quan es retrocedeix per aquest camí"
}
},
"render": "Aquesta ajuda d'espera es pot utilitzar en anar en direcció {direction}"
"render": "Aquesta ajuda a l'espera es pot utilitzar quan es va en direcció {direction}"
},
"side": {
"mappings": {
"0": {
"then": "Aquesta ajuda d'espera es troba a la banda esquerra"
"then": "Aquesta ajuda a l'espera es troba a la banda esquerra"
},
"1": {
"then": "Aquesta ajuda d'espera es troba al costat dret"
"then": "Aquesta ajuda a l'espera es troba al costat dret"
},
"2": {
"then": "Hi ha ajudes d'espera a banda i banda de la carretera"
"then": "Hi ha ajudes a l'espera a ambdós costats de la carretera"
}
},
"question": "A quin costat de la carretera es troba?"
@ -4252,14 +4252,14 @@
"then": "Hi ha un tauler o una clavilla per descansar el peu aquí"
},
"1": {
"then": "Hi ha un tren o una nansa per aferrar-se aquí"
"then": "Hi ha una barana o una nansa per aferrar-se aquí"
}
},
"question": "Quin tipus de components té aquesta ajuda d'espera?"
"question": "Quin tipus de components té aquesta ajuda a l'espera?"
}
},
"title": {
"render": "Ciclista esperant ajuda"
"render": "Ajuda per a ciclistes en espera"
}
},
"defibrillator": {
@ -4474,7 +4474,7 @@
}
},
"dog_toilet": {
"description": "Un vàter de gos és una instal·lació designada per a gossos per orinar i excretar. Aquest pot ser un pegat d'herba designat i senyalitzat, un pou de sorra o una zona tancada.",
"description": "Un vàter de gos és una instal·lació designada per a gossos per orinar i excretar. Pot ser un tros d'herba senyalitzat, un pou de sorra o una zona tancada.",
"name": "Vàters per a gossos",
"presets": {
"0": {
@ -4488,7 +4488,7 @@
"then": "Hi ha una tanca al voltant d'aquest vàter per a gossos"
},
"1": {
"then": "Hi ha una tanca al voltant d'aquest vàter de gos"
"then": "Hi ha una esbardissa al voltant d'aquest vàter de gos"
},
"2": {
"then": "Hi ha una barrera al voltant d'aquest vàter per a gossos"
@ -4593,7 +4593,7 @@
"then": "Aquesta font d'aigua potable està tancada"
},
"3": {
"then": "Aquesta aigua potable està tancada permanentment"
"then": "Aquesta font d'aigua potable està tancada permanentment"
}
},
"question": "Aquest punt d'aigua potable continua operatiu?",
@ -4649,16 +4649,16 @@
"then": "Aquí es proporciona aigua freda"
},
"1": {
"then": "L'aigua freda activa està disponible aquí"
"then": "Aquí hi ha aigua refrigerada activament"
},
"2": {
"then": "L'aigua a temperatura ambient (sense refrigeració activa ni calefacció) està disponible aquí"
"then": "L'aigua a temperatura ambient (sense refrigeració ni calefacció activa) està disponible aquí"
},
"3": {
"then": "Aquí es proporciona aigua calenta; l'aigua no és perillosament calenta"
},
"4": {
"then": "L'aigua calenta es proporciona aquí"
"then": "Aquí es proporciona aigua calenta"
}
},
"question": "Hi ha aigua freda aquí?"
@ -4666,7 +4666,7 @@
"type": {
"mappings": {
"0": {
"then": "Aquesta és una font de bombolles. Un raig d'aigua per beure s'envia cap amunt, normalment controlat per un botó d'empenta."
"then": "Aquesta és una font de raig. Un raig d'aigua per beure s'envia cap amunt, normalment controlat per un botó d'empenta."
},
"1": {
"then": "Aquest és un punt de reomplida d'ampolles on l'aigua s'envia cap avall, normalment controlat per un polsador o un sensor de moviment. Beure directament del raig pot ser molt difícil o impossible."
@ -4842,7 +4842,7 @@
"then": "Aquest ascensor no té sortida de veu"
}
},
"question": "Té aquesta sortida de veu d'ascensor?",
"question": "Té sortida de veu aquest ascensor?",
"questionHint": "P. e. anuncia la planta actual"
},
"tactile_writing_available": {
@ -5114,9 +5114,9 @@
"then": "L'origen d'aquest nom és desconegut en tota la literatura"
}
},
"question": "De què porta aquest objecte?",
"question": "A que es deu el nom d'aquest objecte?",
"questionHint": "Això podria estar escrit al cartell del nom del carrer",
"render": "Anomenat després de {name:etymology}"
"render": "Anomenat en honor a {name:etymology}"
},
"street-name-sign-image": {
"render": "{image_carousel(image:streetsign)}<br/>{image_upload(image:streetsign, Afegeix una imatge de la placa amb el nom del carrer)}"
@ -5125,11 +5125,11 @@
"render": "Existeix un article de la Viquipèdia sobre aquest <b>carrer</b>:<br/>{wikipedia():max-height:25rem}"
},
"wikipedia-etymology": {
"question": "Quin és l'element de Wikidata que porta el nom d'aquest objecte?",
"question": "Quin és l'element de Wikidata en honor al qual s'anomena aquest objecte?",
"render": "<h3> Article de la Viquipèdia del nom donant</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}"
},
"zoeken op inventaris onroerend erfgoed": {
"render": "<a href='https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst={name}' target='blank'>Cerca en inventaris onroerend erfgoed</a>"
"render": "<a href='https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst={name}' target='_blank'>Cerca en inventaris onroerend erfgoed</a>"
}
}
},
@ -5165,7 +5165,7 @@
"0": {
"options": {
"0": {
"question": "Obert ara"
"question": "Ara obert"
}
}
},
@ -5179,10 +5179,10 @@
"10": {
"options": {
"0": {
"question": "No hi ha preferència cap als gossos"
"question": "Sense preferència pels gossos"
},
"1": {
"question": "Permesos"
"question": "Es permeten gossos"
},
"2": {
"question": "No s'admeten gossos"
@ -5192,21 +5192,21 @@
"11": {
"options": {
"0": {
"question": "Ofertes d'internet"
"question": "Ofereix internet"
}
}
},
"12": {
"options": {
"0": {
"question": "Ofertes d'electricitat"
"question": "Ofereix electricitat"
}
}
},
"13": {
"options": {
"0": {
"question": "Té una oferta sense sucre"
"question": "Disposa d'oferta sense sucre"
}
}
},
@ -5220,7 +5220,7 @@
"15": {
"options": {
"0": {
"question": "una oferta lliure de lactosa"
"question": "Disposa d'una oferta lliure de lactosa"
}
}
},
@ -5367,11 +5367,11 @@
},
"firepit": {
"description": "Un lloc a l'aire lliure per fer un foc, normalment obert al públic.",
"name": "Aixeta",
"name": "Foguera",
"presets": {
"0": {
"description": "Un lloc a l'aire lliure per fer un foc, normalment obert al públic.",
"title": "Aixeta"
"title": "Foguera"
}
},
"tagRenderings": {
@ -5393,19 +5393,19 @@
"then": "Accés només per a clients"
},
"5": {
"then": "Accés només per autoritzat"
"then": "Accés només per a autoritzats"
}
},
"question": "Quin és l'accés permès?"
},
"seasonal": {
"override": {
"question": "Està disponible la cabina durant tot l'any?"
"question": "Està disponible la foguera durant tot l'any?"
}
}
},
"title": {
"render": "Aixeta"
"render": "Foguera"
}
},
"fitness_centre": {

View file

@ -2065,9 +2065,6 @@
},
"title": {
"mappings": {
"0": {
"then": "{name}"
},
"1": {
"then": "Vogelkijkhut {name}"
},
@ -6383,11 +6380,6 @@
}
},
"title": {
"mappings": {
"0": {
"then": "{name}"
}
},
"render": "Natuurgebied"
}
},
@ -6919,21 +6911,6 @@
"render": "Picknicktafel"
}
},
"play_forest": {
"description": "Een speelbos is een vrij toegankelijke zone in een bos",
"name": "Speelbossen",
"title": {
"mappings": {
"0": {
"then": "{name}"
},
"1": {
"then": "Speelbos {name}"
}
},
"render": "Speelbos"
}
},
"playground": {
"deletion": {
"nonDeleteMappings": {
@ -8587,9 +8564,6 @@
},
"title": {
"mappings": {
"0": {
"then": "{name}"
},
"1": {
"then": "Voetpad"
},
@ -10755,25 +10729,13 @@
}
},
"village_green": {
"description": "Een laag die dorpsgroen toont (gemeenschapsgroen, maar niet echt een park)",
"name": "Speelweide",
"title": {
"mappings": {
"0": {
"then": "{name}"
}
},
"render": "Speelweide"
}
"description": "Een laag die dorpsgroen toont (gemeenschapsgroen, maar niet echt een park)"
},
"visitor_information_centre": {
"description": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd.",
"name": "Bezoekerscentrum",
"title": {
"mappings": {
"0": {
"then": "{name:nl}"
},
"1": {
"then": "{name}"
}

View file

@ -838,7 +838,8 @@
"question": "Як називається цей бізнес?",
"render": "Цей бізнес називається {name}"
}
}
},
"name": "Кафе та паби"
},
"caravansites": {
"tagRenderings": {

15
package-lock.json generated
View file

@ -47,6 +47,7 @@
"fake-dom": "^1.0.4",
"flowbite-svelte": "^0.47.4",
"follow-redirects": "^1.15.9",
"fuse.js": "^7.1.0",
"geojson2svg": "^2.0.2",
"html-to-image": "^1.11.11",
"i18next-client": "^1.11.4",
@ -15781,6 +15782,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/fuse.js": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz",
"integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=10"
}
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"dev": true,
@ -41193,6 +41203,11 @@
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
},
"fuse.js": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz",
"integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ=="
},
"gensync": {
"version": "1.0.0-beta.2",
"dev": true,

View file

@ -103,6 +103,7 @@
"refresh:layeroverview": "export NODE_OPTIONS=\"--max-old-space-size=8192\" && vite-node scripts/generateLayerOverview.ts -- --force",
"generate:licenses": "vite-node scripts/generateLicenseInfo.ts -- --no-fail",
"query:licenses": "vite-node scripts/generateLicenseInfo.ts -- --query && npm run generate:licenses",
"clean:licenses": "find . -type f -name \"*.license\" -exec rm -f {} +",
"generate:contributor-list": "vite-node scripts/generateContributors.ts",
"generate:service-worker": "tsc src/service-worker.ts --outFile public/service-worker.js && git_hash=$(git rev-parse HEAD) && sed -i.bak \"s/GITHUB-COMMIT/$git_hash/\" public/service-worker.js && rm public/service-worker.js.bak",
"reset:layeroverview": "npm run prep:layeroverview && npm run generate:layeroverview && npm run refresh:layeroverview",
@ -208,6 +209,7 @@
"fake-dom": "^1.0.4",
"flowbite-svelte": "^0.47.4",
"follow-redirects": "^1.15.9",
"fuse.js": "^7.1.0",
"geojson2svg": "^2.0.2",
"html-to-image": "^1.11.11",
"i18next-client": "^1.11.4",

View file

@ -1140,10 +1140,6 @@ input[type="range"].range-lg::-moz-range-thumb {
position: absolute;
}
.\!relative {
position: relative !important;
}
.relative {
position: relative;
}
@ -2565,6 +2561,10 @@ input[type="range"].range-lg::-moz-range-thumb {
grid-template-columns: repeat(7, minmax(0, 1fr));
}
.grid-rows-2 {
grid-template-rows: repeat(2, minmax(0, 1fr));
}
.flex-row {
flex-direction: row;
}
@ -8729,6 +8729,10 @@ svg.apply-fill path {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.md\:grid-rows-1 {
grid-template-rows: repeat(1, minmax(0, 1fr));
}
.md\:flex-row {
flex-direction: row;
}

View file

@ -9,16 +9,12 @@ import {
DoesImageExist,
PrevalidateTheme,
ValidateLayer,
ValidateThemeEnsemble,
ValidateThemeEnsemble
} from "../src/Models/ThemeConfig/Conversion/Validation"
import { Translation } from "../src/UI/i18n/Translation"
import { PrepareLayer } from "../src/Models/ThemeConfig/Conversion/PrepareLayer"
import { PrepareTheme } from "../src/Models/ThemeConfig/Conversion/PrepareTheme"
import {
Conversion,
DesugaringContext,
DesugaringStep,
} from "../src/Models/ThemeConfig/Conversion/Conversion"
import { Conversion, DesugaringContext, DesugaringStep } from "../src/Models/ThemeConfig/Conversion/Conversion"
import { Utils } from "../src/Utils"
import Script from "./Script"
import { AllSharedLayers } from "../src/Customizations/AllSharedLayers"
@ -267,6 +263,7 @@ class LayerOverviewUtils extends Script {
addWord(lang, tr[lang])
}
}
addWord("*", l.id)
addWords(l.title)
addWords(l.description)
@ -317,7 +314,10 @@ class LayerOverviewUtils extends Script {
hideFromOverview: theme.hideFromOverview,
mustHaveLanguage: theme.mustHaveLanguage,
keywords,
layers: theme.layers.filter((l) => sharedLayers.has(l["id"])).map((l) => l["id"]),
layers: (<LayerConfigJson[]>theme.layers)
.filter((l) => sharedLayers.has(l.id))
.filter(l => l.minzoom < 17)
.map((l) => l.id)
}
perId.set(data.id, data)
}
@ -392,10 +392,10 @@ class LayerOverviewUtils extends Script {
tagRenderings: bootstrapTagRenderings,
tagRenderingOrder: bootstrapTagRenderingsOrder,
sharedLayers: null,
publicLayers: null,
publicLayers: null
},
{
addTagRenderingsToContext: true,
addTagRenderingsToContext: true
}
)
@ -431,7 +431,7 @@ class LayerOverviewUtils extends Script {
"src/assets/SocialImageBanner.svg",
"src/assets/SocialImageRepo.svg",
"src/assets/svg/osm-logo.svg",
"src/assets/templates/*",
"src/assets/templates/*"
]
for (const path of allSvgs) {
if (
@ -529,7 +529,7 @@ class LayerOverviewUtils extends Script {
JSON.stringify({
layers: Array.from(sharedLayers.values()).filter(
(l) => !(l["#no-index"] === "yes")
),
)
})
)
}
@ -546,11 +546,11 @@ class LayerOverviewUtils extends Script {
// mapcomplete-changes shows an icon for each corresponding mapcomplete-theme
const iconsPerTheme = Array.from(sharedThemes.values()).map((th) => ({
if: "theme=" + th.id,
then: th.icon,
then: th.icon
}))
const proto: ThemeConfigJson = JSON.parse(
readFileSync("./assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json", {
encoding: "utf8",
encoding: "utf8"
})
)
const protolayer = <LayerConfigJson>(
@ -566,7 +566,7 @@ class LayerOverviewUtils extends Script {
new DetectDuplicateFilters().convertStrict(
{
layers: ScriptUtils.getLayerFiles().map((f) => f.parsed),
themes: ScriptUtils.getThemeFiles().map((f) => f.parsed),
themes: ScriptUtils.getThemeFiles().map((f) => f.parsed)
},
ConversionContext.construct([], [])
)
@ -614,7 +614,7 @@ class LayerOverviewUtils extends Script {
const state: DesugaringContext = {
tagRenderings: LayerOverviewUtils.asDict(sharedTagRenderings),
tagRenderingOrder: sharedTagRenderings.map((tr) => tr.id),
sharedLayers: AllSharedLayers.getSharedLayersConfigs(),
sharedLayers: AllSharedLayers.getSharedLayersConfigs()
}
const sharedLayers = new Map<string, LayerConfigJson>()
const prepLayer = new PrepareLayer(state)
@ -686,11 +686,11 @@ class LayerOverviewUtils extends Script {
private extractJavascriptCode(themeFile: ThemeConfigJson) {
const allCode = [
"import {Feature} from 'geojson'",
'import { ExtraFuncType } from "../../../Logic/ExtraFunctions";',
'import { Utils } from "../../../Utils"',
"import { ExtraFuncType } from \"../../../Logic/ExtraFunctions\";",
"import { Utils } from \"../../../Utils\"",
"export class ThemeMetaTagging {",
" public static readonly themeName = " + JSON.stringify(themeFile.id),
"",
""
]
for (const layer of themeFile.layers) {
const l = <LayerConfigJson>layer
@ -754,7 +754,7 @@ class LayerOverviewUtils extends Script {
`/** This code is autogenerated - do not edit. Edit ./assets/layers/${l?.id}/${l?.id}.json instead */`,
"export class ThemeMetaTagging {",
" public static readonly themeName = " + JSON.stringify(l.id),
"",
""
]
const code = l.calculatedTags ?? []
@ -813,7 +813,7 @@ class LayerOverviewUtils extends Script {
sharedLayers,
tagRenderings: LayerOverviewUtils.asDict(trs),
tagRenderingOrder: trs.map((tr) => tr.id),
publicLayers,
publicLayers
}
const knownTagRenderings = new Set<string>()
convertState.tagRenderings.forEach((_, key) => knownTagRenderings.add(key))
@ -870,7 +870,7 @@ class LayerOverviewUtils extends Script {
)
try {
themeFile = new PrepareTheme(convertState, {
skipDefaultLayers: true,
skipDefaultLayers: true
}).convertStrict(
themeFile,
ConversionContext.construct([themePath], ["PrepareLayer"])
@ -919,7 +919,7 @@ class LayerOverviewUtils extends Script {
const e: string = [
`the icon for theme ${themeFile.id} is too small. Please rescale the icon at ${themeFile.icon}`,
`Even though an SVG is 'infinitely scaleable', the icon should be dimensioned bigger. One of the build steps of the theme does convert the image to a PNG (to serve as PWA-icon) and having a small dimension will cause blurry images.`,
` Width = ${width} height = ${height}; we recommend a size of at least 500px * 500px and to use a square aspect ratio.`,
` Width = ${width} height = ${height}; we recommend a size of at least 500px * 500px and to use a square aspect ratio.`
].join("\n")
err(e)
}
@ -956,7 +956,7 @@ class LayerOverviewUtils extends Script {
hideFromOverview: t.hideFromOverview ?? false,
shortDescription:
t.shortDescription ?? new Translation(t.description).FirstSentence(),
mustHaveLanguage: t.mustHaveLanguage?.length > 0,
mustHaveLanguage: t.mustHaveLanguage?.length > 0
}
}),
sharedLayers

View file

@ -50,6 +50,7 @@ export default class ThemeSource implements IndexedFeatureSource {
const features = (this.features = new UIEventSource<Feature[]>([]))
const featuresById = (this.featuresById = new UIEventSource(new Map()))
this.core = mvtAvailableLayers.mapD((mvtAvailableLayers) => {
this.core?.data?.destruct()
const core = new ThemeSourceCore(
layers,
featureSwitches,
@ -300,4 +301,9 @@ class ThemeSourceCore extends FeatureSourceMerger {
// await Promise.all(this.supportsForceDownload.map((i) => i.updateAsync()))
console.log("Done")
}
public destruct() {
this.features.destroy()
this.featuresById.destroy()
}
}

View file

@ -1,19 +1,109 @@
import ThemeConfig, { MinimalThemeInformation } from "../../Models/ThemeConfig/ThemeConfig"
import { Store } from "../UIEventSource"
import UserRelatedState from "../State/UserRelatedState"
import { Utils } from "../../Utils"
import Locale from "../../UI/i18n/Locale"
import themeOverview from "../../assets/generated/theme_overview.json"
import LayerSearch from "./LayerSearch"
import SearchUtils from "./SearchUtils"
import { OsmConnection } from "../Osm/OsmConnection"
import { AndroidPolyfill } from "../Web/AndroidPolyfill"
import Fuse from "fuse.js"
import Constants from "../../Models/Constants"
import Locale from "../../UI/i18n/Locale"
import { Utils } from "../../Utils"
type ThemeSearchScore = {
theme: MinimalThemeInformation
lowest: number
perLayer?: Record<string, number>
other: number
export class ThemeSearchIndex {
private readonly themeIndex: Fuse<MinimalThemeInformation>
private readonly layerIndex: Fuse<{ id: string, description }>
constructor(language: string, themesToSearch?: MinimalThemeInformation[], layersToIgnore: string[] = []) {
const themes = Utils.NoNull(themesToSearch ?? ThemeSearch.officialThemes?.themes)
if (!themes) {
throw "No themes loaded. Did generate:layeroverview fail?"
}
const fuseOptions = {
ignoreLocation: true,
threshold: 0.2,
keys: [
{ name: "id", weight: 2 },
"title." + language,
"keywords." + language,
"shortDescription." + language
]
}
this.themeIndex = new Fuse(themes.filter(th => th?.id !== "personal"), fuseOptions)
const toIgnore = new Set(layersToIgnore)
const layersAsList: { id: string, description: Record<string, string[]> }[] = []
for (const id in ThemeSearch.officialThemes.layers) {
if (Constants.isPriviliged(id)) {
continue
}
if (toIgnore.has(id)) {
continue
}
const l: Record<string, string[]> = ThemeSearch.officialThemes.layers[id]
layersAsList.push({ id, description: l })
}
this.layerIndex = new Fuse(layersAsList, {
includeScore: true,
minMatchCharLength: 3,
ignoreLocation: true,
threshold: 0.02,
keys: ["id", "description." + language]
})
}
public search(text: string, limit?: number): MinimalThemeInformation[] {
const scored = this.searchWithScores(text)
let result = Array.from(scored.entries())
result.sort((a, b) => b[0] - a[0])
if (limit) {
result = result.slice(0, limit)
}
return result.map(e => ThemeSearch.officialThemesById.get(e[0]))
}
public searchWithScores(text: string): Map<string, number> {
const result = new Map<string, number>()
const themeResults = this.themeIndex.search(text)
for (const themeResult of themeResults) {
result.set(themeResult.item.id, themeResult.score)
}
const layerResults = this.layerIndex.search(text)
for (const layer of layerResults) {
const matchingThemes = ThemeSearch.layersToThemes.get(layer.item.id)
const score = layer.score
matchingThemes?.forEach(th => {
const previous = result.get(th.id) ?? 10000
result.set(th.id, Math.min(previous, score * 5))
})
}
return result
}
/**
* Builds a search index containing all public and visited themes, but ignoring the layers loaded by the current theme
*/
public static fromState(state: { osmConnection: OsmConnection; theme: ThemeConfig }): Store<ThemeSearchIndex> {
const layersToIgnore = state.theme.layers.filter((l) => l.isNormal()).map((l) => l.id)
const knownHidden: Store<string[]> = UserRelatedState.initDiscoveredHiddenThemes(
state.osmConnection
).map((list) => Utils.Dedup(list))
const otherThemes: MinimalThemeInformation[] = ThemeSearch.officialThemes.themes.filter(
(th) => th.id !== state.theme.id
)
return Locale.language.map(language => {
const themes = otherThemes.concat(...knownHidden.data.map(id => ThemeSearch.officialThemesById.get(id)))
return new ThemeSearchIndex(language, themes, layersToIgnore)
},
[knownHidden]
)
}
}
export default class ThemeSearch {
@ -25,40 +115,24 @@ export default class ThemeSearch {
string,
MinimalThemeInformation
>()
/*
* For every layer id, states which themes use the layer
*/
public static readonly layersToThemes: Map<string, MinimalThemeInformation[]> = new Map()
static {
for (const th of ThemeSearch.officialThemes.themes ?? []) {
ThemeSearch.officialThemesById.set(th.id, th)
for (const layer of th.layers) {
let list = ThemeSearch.layersToThemes.get(layer)
if (!list) {
list = []
ThemeSearch.layersToThemes.set(layer, list)
}
list.push(th)
}
}
private readonly _knownHiddenThemes: Store<Set<string>>
private readonly _layersToIgnore: string[]
private readonly _otherThemes: MinimalThemeInformation[]
constructor(state: { osmConnection: OsmConnection; theme: ThemeConfig }) {
this._layersToIgnore = state.theme.layers.filter((l) => l.isNormal()).map((l) => l.id)
this._knownHiddenThemes = UserRelatedState.initDiscoveredHiddenThemes(
state.osmConnection
).map((list) => new Set(list))
this._otherThemes = ThemeSearch.officialThemes.themes.filter(
(th) => th.id !== state.theme.id
)
}
public search(query: string, limit: number, threshold: number = 3): MinimalThemeInformation[] {
if (query.length < 1) {
return []
}
const sorted = ThemeSearch.sortedByLowestScores(
query,
this._otherThemes,
this._layersToIgnore
)
return sorted
.filter((sorted) => sorted.lowest < threshold)
.map((th) => th.theme)
.filter((th) => !th.hideFromOverview || this._knownHiddenThemes.data.has(th.id))
.slice(0, limit)
}
public static createUrlFor(layout: { id: string }, state?: { layoutToUse?: { id } }): string {
@ -97,82 +171,5 @@ export default class ThemeSearch {
return `${linkPrefix}`
}
/**
* Returns a score based on textual search
*
* Note that, if `query.length < 3`, layers are _not_ searched because this takes too much time
* @param query
* @param themes
* @param ignoreLayers
* @private
*/
private static scoreThemes(
query: string,
themes: MinimalThemeInformation[],
ignoreLayers: string[] = undefined
): Record<string, ThemeSearchScore> {
if (query?.length < 1) {
return undefined
}
themes = Utils.NoNullInplace(themes)
let options: { blacklist: Set<string> } = undefined
if (ignoreLayers?.length > 0) {
options = { blacklist: new Set(ignoreLayers) }
}
const layerScores = query.length < 3 ? {} : LayerSearch.scoreLayers(query, options)
const results: Record<string, ThemeSearchScore> = {}
for (const layoutInfo of themes) {
const theme = layoutInfo.id
if (theme === "personal") {
continue
}
if (Utils.simplifyStringForSearch(theme) === query) {
results[theme] = {
theme: layoutInfo,
lowest: -1,
other: 0,
}
continue
}
const perLayer = Utils.asRecord(layoutInfo.layers ?? [], (layer) => layerScores[layer])
const language = Locale.language.data
const keywords = Utils.NoNullInplace([
layoutInfo.shortDescription,
layoutInfo.title,
]).map((item) => (typeof item === "string" ? item : item[language] ?? item["*"]))
const other = Math.min(
SearchUtils.scoreKeywords(query, keywords),
SearchUtils.scoreKeywords(query, layoutInfo.keywords)
)
const lowest = Math.min(other, ...Object.values(perLayer))
results[theme] = {
theme: layoutInfo,
perLayer,
other,
lowest,
}
}
return results
}
public static sortedByLowestScores(
search: string,
themes: MinimalThemeInformation[],
ignoreLayers: string[] = []
): ThemeSearchScore[] {
const scored = Object.values(this.scoreThemes(search, themes, ignoreLayers))
scored.sort((a, b) => a.lowest - b.lowest)
return scored
}
public static sortedByLowest(
search: string,
themes: MinimalThemeInformation[],
ignoreLayers: string[] = []
): MinimalThemeInformation[] {
return this.sortedByLowestScores(search, themes, ignoreLayers).map((th) => th.theme)
}
}

View file

@ -8,7 +8,6 @@ import Translations from "../../UI/i18n/Translations"
import { RegexTag } from "../Tags/RegexTag"
import { Or } from "../Tags/Or"
import FilterConfig from "../../Models/ThemeConfig/FilterConfig"
import Constants from "../../Models/Constants"
export type ActiveFilter = {
layer: LayerConfig

View file

@ -4,7 +4,7 @@ import CombinedSearcher from "../Search/CombinedSearcher"
import FilterSearch, { FilterSearchResult } from "../Search/FilterSearch"
import LocalElementSearch from "../Search/LocalElementSearch"
import CoordinateSearch from "../Search/CoordinateSearch"
import ThemeSearch from "../Search/ThemeSearch"
import { ThemeSearchIndex } from "../Search/ThemeSearch"
import OpenStreetMapIdSearch from "../Search/OpenStreetMapIdSearch"
import PhotonSearch from "../Search/PhotonSearch"
import ThemeViewState from "../../Models/ThemeViewState"
@ -67,8 +67,8 @@ export default class SearchState {
Stores.concat(suggestions).map((suggestions) => CombinedSearcher.merge(suggestions))
)
const themeSearch = new ThemeSearch(state)
this.themeSuggestions = this.searchTerm.mapD((query) => themeSearch.search(query, 3))
const themeSearch = ThemeSearchIndex.fromState(state)
this.themeSuggestions = this.searchTerm.mapD((query) => themeSearch.data.search(query, 3), [themeSearch])
const layerSearch = new LayerSearch(state.theme)
this.layerSuggestions = this.searchTerm.mapD((query) => layerSearch.search(query, 5))

View file

@ -626,11 +626,9 @@ class MappedStore<TIn, T> extends Store<T> {
}
private registerCallbacksToUpstream() {
const self = this
this._unregisterFromUpstream = this._upstream.addCallback((_) => self.update())
this._unregisterFromUpstream = this._upstream.addCallback((_) => this.update())
this._unregisterFromExtraStores = this._extraStores?.map((store) =>
store?.addCallback((_) => self.update())
store?.addCallback((_) => this.update())
)
this._callbacksAreRegistered = true
}

View file

@ -1,6 +1,5 @@
import { ImageUploadManager } from "../../Logic/ImageProviders/ImageUploadManager"
import { Store, UIEventSource } from "../../Logic/UIEventSource"
import { ProvidedImage } from "../../Logic/ImageProviders/ImageProvider"
import { Store } from "../../Logic/UIEventSource"
import { CombinedFetcher } from "../../Logic/Web/NearbyImagesSearch"
import ThemeConfig from "../ThemeConfig/ThemeConfig"
import { PanoramaxUploader } from "../../Logic/ImageProviders/Panoramax"
@ -13,7 +12,6 @@ import { SpecialVisualizationState } from "../../UI/SpecialVisualization"
export class WithImageState extends WithGuiState implements SpecialVisualizationState {
readonly imageUploadManager: ImageUploadManager
readonly previewedImage = new UIEventSource<ProvidedImage>(undefined)
readonly nearbyImageSearcher: CombinedFetcher
constructor(layout: ThemeConfig, mvtAvailableLayers: Store<Set<string>>) {

View file

@ -45,7 +45,7 @@ export class WithSelectedElementState extends UserMapFeatureswitchState {
selected?.properties?.name,
selected?.properties?.alt_name,
selected?.properties?.local_name,
layer?.title.GetRenderValue(selected?.properties ?? {}).txt,
layer?.title?.GetRenderValue(selected?.properties ?? {})?.txt,
selected.properties.display_name,
selected.properties.id,
]

View file

@ -18,15 +18,16 @@
import Mastodon from "../assets/svg/Mastodon.svelte"
import Liberapay from "../assets/svg/Liberapay.svelte"
import Bug from "../assets/svg/Bug.svelte"
import Github from "../assets/svg/Github.svelte"
import { Utils } from "../Utils"
import { ArrowTrendingUp } from "@babeard/svelte-heroicons/solid/ArrowTrendingUp"
import Searchbar from "./Base/Searchbar.svelte"
import ThemeSearch from "../Logic/Search/ThemeSearch"
import ThemeSearch, { ThemeSearchIndex } from "../Logic/Search/ThemeSearch"
import SearchUtils from "../Logic/Search/SearchUtils"
import ChevronDoubleRight from "@babeard/svelte-heroicons/mini/ChevronDoubleRight"
import { AndroidPolyfill } from "../Logic/Web/AndroidPolyfill"
import Forgejo from "../assets/svg/Forgejo.svelte"
import Locale from "./i18n/Locale"
AndroidPolyfill.init().then(() => console.log("Android polyfill setup completed"))
const featureSwitches = new OsmConnectionFeatureSwitches()
const osmConnection = new OsmConnection({
@ -35,13 +36,15 @@
"oauth_token",
undefined,
"Used to complete the login"
),
)
})
const state = new UserRelatedState(osmConnection)
const t = Translations.t.index
const tu = Translations.t.general
const tr = Translations.t.general.morescreen
const recentThemes = state.recentlyVisitedThemes.value.mapD(themes => themes.map(thId => ThemeSearch.officialThemesById.get(thId)))
let userLanguages = osmConnection.userDetails.map((ud) => ud?.languages ?? [])
let search: UIEventSource<string | undefined> = new UIEventSource<string>("")
let searchStable = search.stabilized(100)
@ -64,30 +67,28 @@
const customThemes: Store<MinimalThemeInformation[]> = Stores.ListStabilized<string>(
state.installedUserThemes
).mapD((stableIds) => Utils.NoNullInplace(stableIds.map((id) => state.getUnofficialTheme(id))))
function filtered(themes: Store<MinimalThemeInformation[]>): Store<MinimalThemeInformation[]> {
const searchIndex = Locale.language.map(language => {
return new ThemeSearchIndex(language, themes.data)
}, [themes])
return searchStable.map(
(search) => {
(searchTerm) => {
if (!themes.data) {
return []
}
if (!search) {
if (!searchTerm) {
return themes.data
}
const start = new Date().getTime()
const scores = ThemeSearch.sortedByLowestScores(search, themes.data)
const end = new Date().getTime()
console.trace("Scores for", search, "are", scores, "searching took", end - start, "ms")
const strict = scores.filter((sc) => sc.lowest < 2)
if (strict.length > 0) {
return strict.map((sc) => sc.theme)
}
return scores
.filter((sc) => sc.lowest < 4)
.slice(0, 6)
.map((sc) => sc.theme)
const index = searchIndex.data
return index.search(searchTerm)
},
[themes]
[searchIndex]
)
}
@ -165,6 +166,17 @@
</div>
</div>
<LoginToggle {state}>
{#if $recentThemes.length > 2}
<div class="my-4">
<h2>
<Tr t={Translations.t.index.recentThemes} />
</h2>
<ThemesList {state} themes={$recentThemes} onlyIcons />
</div>
{/if}
</LoginToggle>
<Searchbar
value={search}
placeholder={tr.searchForATheme}

View file

@ -8,7 +8,6 @@
import Constants from "../../Models/Constants"
import ContributorCount from "../../Logic/ContributorCount"
import BaseUIElement from "../BaseUIElement"
import Github from "../../assets/svg/Github.svelte"
import { TranslateIcon } from "@rgossiaux/svelte-heroicons/solid"
import Osm_logo from "../../assets/svg/Osm_logo.svelte"
import Generic_map from "../../assets/svg/Generic_map.svelte"

View file

@ -1,5 +1,4 @@
<script lang="ts">
import { ImmutableStore, Store } from "../../Logic/UIEventSource"
import { OsmConnection } from "../../Logic/Osm/OsmConnection"
import type { MinimalThemeInformation } from "../../Models/ThemeConfig/ThemeConfig"
import Tr from "../Base/Tr.svelte"
@ -10,7 +9,7 @@
export let theme: MinimalThemeInformation & { isOfficial?: boolean }
let isCustom: boolean = theme.id.startsWith("https://") || theme.id.startsWith("http://")
export let state: { layoutToUse?: { id: string }; osmConnection: OsmConnection }
export let iconOnly: boolean = false
$: title = Translations.T(
theme.title,
!isCustom && !theme.mustHaveLanguage ? "themes:" + theme.id + ".title" : undefined
@ -71,12 +70,17 @@
)
</script>
{#if iconOnly}
<a class="low-interaction my-1 rounded p-1" href={$href}>
<Marker icons={theme.icon} size="w-8 h-8 sm:w-11 sm:h-11" />
</a>
{:else}
<a class="low-interaction my-1 flex w-full items-center text-ellipsis rounded p-1" href={$href}>
<Marker icons={theme.icon} size="block h-8 w-8 sm:h-11 sm:w-11 m-1 sm:mx-2 md:mx-4 shrink-0" />
<span class="flex flex-col overflow-hidden text-ellipsis text-xl font-bold">
<Tr cls="" t={title} />
<Tr cls="subtle text-base" t={description} />
<slot />
</span>
</a>
{/if}

View file

@ -7,19 +7,21 @@
import { MinimalThemeInformation } from "../../Models/ThemeConfig/ThemeConfig"
import Translations from "../i18n/Translations"
import Tr from "../Base/Tr.svelte"
import { twMerge } from "tailwind-merge"
export let search: UIEventSource<string>
export let search: UIEventSource<string> = new UIEventSource<string>(undefined)
export let themes: MinimalThemeInformation[]
export let state: { osmConnection: OsmConnection }
export let onlyIcons: boolean = false
export let hasSelection: boolean = true
</script>
<section class="w-full">
<slot name="title" />
<div class="theme-list my-2 gap-4 md:grid md:grid-flow-row md:grid-cols-2 lg:grid-cols-3">
<div
class={onlyIcons ? "flex gap-x-2 flex-wrap items-center justify-center" : ("theme-list my-2 gap-4 md:grid md:grid-flow-row md:grid-cols-2 lg:grid-cols-3")}>
{#each themes as theme (theme.id)}
<ThemeButton {theme} {state}>
<ThemeButton {theme} {state} iconOnly={onlyIcons}>
{#if $search && hasSelection && themes?.[0] === theme}
<span class="thanks hidden-on-mobile" aria-hidden="true">
<Tr t={Translations.t.general.morescreen.enterToOpen} />

View file

@ -352,6 +352,11 @@ class LineRenderingLayer {
// After waiting 'till the map has loaded, the data might have changed already
// As such, we only now read the features from the featureSource and compare with the previously set data
const features = featureSource.data
if (features.length === 0) {
// This is a very ugly workaround for https://source.mapcomplete.org/MapComplete/MapComplete/issues/2312,
// but I couldn't find the root cause
return
}
const src = <GeoJSONSource>map.getSource(this._layername)
{
// Add source to the map or update the feature source

View file

@ -29,7 +29,7 @@ class QuestionViz implements SpecialVisualizationSvelte {
},
{
name: "blacklisted-labels",
doc: "One or more ';'-separated labels of questions which should _not_ be included",
doc: "One or more ';'-separated labels of questions which should _not_ be included. Default: 'hidden'"
},
]
svelteBased = true
@ -46,10 +46,13 @@ class QuestionViz implements SpecialVisualizationSvelte {
?.split(";")
?.map((s) => s.trim())
?.filter((s) => s !== "")
const blacklist = args[1]
const blacklist = (args[1])
?.split(";")
?.map((s) => s.trim())
?.filter((s) => s !== "")
if (blacklist.length === 0) {
blacklist.push("hidden")
}
return new SvelteUIElement(Questionbox, {
layer,
tags,

View file

@ -1,4 +0,0 @@
<script>
export let color = "#000000"
</script>
<svg {...$$restProps} on:click on:mouseover on:mouseenter on:mouseleave on:keydown on:focus width="100" height="100" version="1.1" id="svg1" sodipodi:docname="github.svg" viewBox="0 0 100 100" inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> <sodipodi:namedview id="namedview1" pagecolor="#ffffff" bordercolor="#999999" borderopacity="1" inkscape:showpageshadow="2" inkscape:pageopacity="0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:zoom="8.0714286" inkscape:cx="49" inkscape:cy="48.00885" inkscape:window-width="1920" inkscape:window-height="995" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="svg1" /> <defs id="defs1" /> <path fill-rule="evenodd" clip-rule="evenodd" d="M 48.854,0 C 21.839,0 0,22 0,49.217 c 0,21.756 13.993,40.172 33.405,46.69 2.427,0.49 3.316,-1.059 3.316,-2.362 0,-1.141 -0.08,-5.052 -0.08,-9.127 -13.59,2.934 -16.42,-5.867 -16.42,-5.867 -2.184,-5.704 -5.42,-7.17 -5.42,-7.17 -4.448,-3.015 0.324,-3.015 0.324,-3.015 4.934,0.326 7.523,5.052 7.523,5.052 4.367,7.496 11.404,5.378 14.235,4.074 0.404,-3.178 1.699,-5.378 3.074,-6.6 -10.839,-1.141 -22.243,-5.378 -22.243,-24.283 0,-5.378 1.94,-9.778 5.014,-13.2 -0.485,-1.222 -2.184,-6.275 0.486,-13.038 0,0 4.125,-1.304 13.426,5.052 a 46.97,46.97 0 0 1 12.214,-1.63 c 4.125,0 8.33,0.571 12.213,1.63 9.302,-6.356 13.427,-5.052 13.427,-5.052 2.67,6.763 0.97,11.816 0.485,13.038 3.155,3.422 5.015,7.822 5.015,13.2 0,18.905 -11.404,23.06 -22.324,24.283 1.78,1.548 3.316,4.481 3.316,9.126 0,6.6 -0.08,11.897 -0.08,13.526 0,1.304 0.89,2.853 3.316,2.364 C 83.634,89.388 97.627,70.973 97.627,49.217 97.707,22 75.788,0 48.854,0 Z" fill="#24292f" id="path1" /> </svg>