From 6e5eeca64fbdcc944dc84fc46d189aba9bccd7d5 Mon Sep 17 00:00:00 2001 From: paunofu Date: Mon, 25 Sep 2023 10:35:07 +0000 Subject: [PATCH 01/17] Translated using Weblate (Catalan) Currently translated at 82.2% (2576 of 3131 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/ca/ --- langs/layers/ca.json | 645 +++++++++++++++++++++++++++++-------------- 1 file changed, 440 insertions(+), 205 deletions(-) diff --git a/langs/layers/ca.json b/langs/layers/ca.json index 08e5831f0..819c2a916 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -35,6 +35,16 @@ "1": { "title": "un mupi" }, + "10": { + "description": "S'utilitza per a cartells publicitaris, rètols de neó, logotips i cartells en entrades institucionals", + "title": "un lletrer" + }, + "11": { + "title": "una escupltura" + }, + "12": { + "title": "una paret pintada" + }, "2": { "title": "un mupi sobre la paret" }, @@ -61,16 +71,6 @@ }, "9": { "title": "un tòtem" - }, - "10": { - "description": "S'utilitza per a cartells publicitaris, rètols de neó, logotips i cartells en entrades institucionals", - "title": "un lletrer" - }, - "11": { - "title": "una escupltura" - }, - "12": { - "title": "una paret pintada" } }, "tagRenderings": { @@ -165,6 +165,9 @@ "1": { "then": "Açò és un tauló d'anunis" }, + "10": { + "then": "Açò és una paret pintada" + }, "2": { "then": "Açò és una columna" }, @@ -188,9 +191,6 @@ }, "9": { "then": "Açò és un tòtem" - }, - "10": { - "then": "Açò és una paret pintada" } }, "question": "Quin tipus d'element publicitari és aquest?", @@ -205,6 +205,9 @@ "1": { "then": "Tauló d'anuncis" }, + "10": { + "then": "Paret Pintada" + }, "2": { "then": "Mupi" }, @@ -228,9 +231,6 @@ }, "9": { "then": "Tòtem" - }, - "10": { - "then": "Paret Pintada" } } } @@ -312,6 +312,15 @@ "1": { "then": "Mural" }, + "10": { + "then": "Azulejo (Rajoles decoratives espanyoles i portugueses)" + }, + "11": { + "then": "Enrajolat" + }, + "12": { + "then": "Tallat a la fusta" + }, "2": { "then": "Pintura" }, @@ -335,15 +344,6 @@ }, "9": { "then": "Relleu" - }, - "10": { - "then": "Azulejo (Rajoles decoratives espanyoles i portugueses)" - }, - "11": { - "then": "Enrajolat" - }, - "12": { - "then": "Tallat a la fusta" } }, "question": "Quin tipus d'obra és aquesta peça?", @@ -616,7 +616,7 @@ "then": "Un ciclista pot passar-hi." }, "1": { - "then": "Un ciclista pot passar-hi." + "then": "Un ciclista no pot passar-hi." } }, "question": "Una bicicleta pot passar aquesta barrera?" @@ -1820,6 +1820,27 @@ "1": { "question": "Té un connector
Schuko sense pin de terra (CEE7/4 tipus F)
connector" }, + "10": { + "question": "Té un connector
Tipus 2 amb cable (mennekes)
" + }, + "11": { + "question": "Té un connector
CCS Tesla Supercharger (un tipus2_css de marca)
" + }, + "12": { + "question": "Té un connector
Tesla Supercharger (destination)
" + }, + "13": { + "question": "Té un connector
Tesla Supercharger (Destination) (Tipus 2 amb un cable de marca tesla)
" + }, + "14": { + "question": "Té un connector
USB per a carregar telèfons i dispositius electrònics petits
" + }, + "15": { + "question": "Té un connector
Bosch Active Connect amb 3 pins i cable
" + }, + "16": { + "question": "Té un connector
Bosch Active Connect amb 5 pins i cable
" + }, "2": { "question": "Té un connector
endoll de paret Europeu amb un pin de terra (CEE7/4 tipus F)
" }, @@ -1843,27 +1864,6 @@ }, "9": { "question": "Té un connector
CCS Tipus 2 (mennekes)
" - }, - "10": { - "question": "Té un connector
Tipus 2 amb cable (mennekes)
" - }, - "11": { - "question": "Té un connector
CCS Tesla Supercharger (un tipus2_css de marca)
" - }, - "12": { - "question": "Té un connector
Tesla Supercharger (destination)
" - }, - "13": { - "question": "Té un connector
Tesla Supercharger (Destination) (Tipus 2 amb un cable de marca tesla)
" - }, - "14": { - "question": "Té un connector
USB per a carregar telèfons i dispositius electrònics petits
" - }, - "15": { - "question": "Té un connector
Bosch Active Connect amb 3 pins i cable
" - }, - "16": { - "question": "Té un connector
Bosch Active Connect amb 5 pins i cable
" } } } @@ -1919,30 +1919,6 @@ "1": { "then": "Endoll de paret Schuko sense pin a terra (CEE7/4 tipus F)" }, - "2": { - "then": "Endoll de paret Europeu amb pin de terra (CEE7/4 tipus E)" - }, - "3": { - "then": "Endoll de paret Europeu amb pin a terra (CEE7/4 tipus E)" - }, - "4": { - "then": "Chademo" - }, - "5": { - "then": "Chademo" - }, - "6": { - "then": "Tipus 1 amb cable (J1772)" - }, - "7": { - "then": "Tipus 1 amb cable (J1772)" - }, - "8": { - "then": "Tipus 1 sense cable (J1772)" - }, - "9": { - "then": "Tipus 1 sense cable (J1772)" - }, "10": { "then": "CSS 1Tipus 1 (també conegut com Tipus 1 combo)" }, @@ -1973,6 +1949,9 @@ "19": { "then": "Tipus 2 amb cable (mennekes)" }, + "2": { + "then": "Endoll de paret Europeu amb pin de terra (CEE7/4 tipus E)" + }, "20": { "then": "CSS Supercarregador Tesla (un tipus2_css de la marca)" }, @@ -2003,11 +1982,32 @@ "29": { "then": "Bosch Active Connect amb 3 pins i cable" }, + "3": { + "then": "Endoll de paret Europeu amb pin a terra (CEE7/4 tipus E)" + }, "30": { "then": "Bosch Active Connect amb 5 pins i cable" }, "31": { "then": "Bosch Active Connect amb 5 pins i cable" + }, + "4": { + "then": "Chademo" + }, + "5": { + "then": "Chademo" + }, + "6": { + "then": "Tipus 1 amb cable (J1772)" + }, + "7": { + "then": "Tipus 1 amb cable (J1772)" + }, + "8": { + "then": "Tipus 1 sense cable (J1772)" + }, + "9": { + "then": "Tipus 1 sense cable (J1772)" } }, "question": "Quins tipus de connexions de càrrega estan disponibles aquí?" @@ -2865,6 +2865,9 @@ "1": { "then": "Aquest carril bici està pavimentat" }, + "10": { + "then": "Aquesta via ciclista està feta de gravilla" + }, "2": { "then": "Aquest carril bici està fet d'asfalt" }, @@ -2876,9 +2879,6 @@ }, "9": { "then": "Aquesta via ciclista està feta de grava" - }, - "10": { - "then": "Aquesta via ciclista està feta de gravilla" } }, "question": "De què està feta la superfície d'aquest carrer?", @@ -3383,6 +3383,20 @@ } } }, + "speech_output_available": { + "questionHint": "P. e. anuncia la planta actual" + }, + "tactile_writing_available": { + "mappings": { + "0": { + "then": "L'ascensor té escriptura tàctil en Braille" + }, + "1": { + "then": "Aquest ascensor no té escriptura tàctil" + } + }, + "question": "Aquest ascensor té escriptura tàctil?" + }, "tactile_writing_language": { "render": { "special": { @@ -3428,6 +3442,12 @@ }, "1": { "then": "Costa 2 euros premsar un cèntim." + }, + "2": { + "then": "Costa 2 francs suïssos premsar un cèntim." + }, + "3": { + "then": "Costa 1 franc suís premsar un cèntim." } }, "question": "Quant costa premsar un cèntim?", @@ -3452,6 +3472,12 @@ }, "4": { "then": "Esta premsa de cèntims utilitza una moneda de 50 cèntims per a premsar." + }, + "5": { + "then": "Esta premsa de cèntims utilitza una moneda de 10 cèntims per a premsar." + }, + "6": { + "then": "Esta premsa de cèntims utilitza una moneda de 20 cèntims per a premsar." } }, "question": "Quina moneda s'utilitza per a premsar?", @@ -3478,6 +3504,20 @@ "question": "Quants dissenys hi han disponibles?", "render": "Esta premsa té {coin:design_count} dissenys disponibles." }, + "fee": { + "mappings": { + "0": { + "then": "Costa diners premsar una moneda." + }, + "1": { + "then": "Costa diners premsar una moneda." + }, + "2": { + "then": "És gratuït premsar una moneda." + } + }, + "question": "Costa diners premsar una moneda?" + }, "indoor": { "mappings": { "0": { @@ -3758,6 +3798,13 @@ "question": "Té opcions orgàniques" } } + }, + "9": { + "options": { + "0": { + "question": "Ús gratuït" + } + } } } }, @@ -3940,6 +3987,9 @@ }, "2": { "options": { + "0": { + "question": "Restaurants i negocis de menjar ràpid" + }, "1": { "question": "Només negocis de menjar ràpid" }, @@ -3948,6 +3998,13 @@ } } }, + "3": { + "options": { + "0": { + "question": "Té menú vegetarià" + } + } + }, "4": { "options": { "0": { @@ -3987,6 +4044,21 @@ "1": { "then": "Això és una fregiduria" }, + "10": { + "then": "Aquí es serveixen plats xinesos" + }, + "11": { + "then": "Aquí es serveixen plats grecs" + }, + "12": { + "then": "Aquí es serveixen plats indis" + }, + "13": { + "then": "Aquí es serveixen plats turcs" + }, + "14": { + "then": "Aquí es serveixen plats tailandesos" + }, "2": { "then": "Principalment serveix pasta" }, @@ -4010,21 +4082,6 @@ }, "9": { "then": "Aquí es serveixen plats francesos" - }, - "10": { - "then": "Aquí es serveixen plats xinesos" - }, - "11": { - "then": "Aquí es serveixen plats grecs" - }, - "12": { - "then": "Aquí es serveixen plats indis" - }, - "13": { - "then": "Aquí es serveixen plats turcs" - }, - "14": { - "then": "Aquí es serveixen plats tailandesos" } }, "question": "Quin menjar es serveix aquí?", @@ -4778,13 +4835,34 @@ } }, "tagRenderings": { + "map-attribution": { + "mappings": { + "0": { + "then": "OpenStreetMap està clarament atribuït, incloent la llicència ODBL" + }, + "1": { + "then": "OpenStreetMap està clarament atribuït, però no es menciona la llicència" + }, + "2": { + "then": "OpenStreetMap no es mencionava, però algú hi ha posat una enganxina d'OpenStreetMap" + }, + "3": { + "then": "No hi ha atribució" + }, + "4": { + "then": "No hi ha atribució" + } + }, + "question": "Hi ha atribució a OpenStreetMap?" + }, "map-map_source": { "mappings": { "0": { "then": "Aquest mapa està basat en OpenStreetMap" } }, - "question": "En quines dades es basa aquest mapa?" + "question": "En quines dades es basa aquest mapa?", + "render": "Aquest mapa està basat en {map_source}" }, "map_size": { "mappings": { @@ -4811,10 +4889,17 @@ "0": { "then": "Mapa topogràfic

El mapa conté línies de contorn.

" }, + "1": { + "then": "Un mapa amb tots els carrers o camins d'una àrea.

Els carrers estan majoritàriament nomenats; els angles, distàncies etc. són acurades

" + }, "2": { "then": "Això és un mapa esquemàtic.

Un mapa esbossat amb només camins importants i PDI. Els angles, els trajectes etc. són merament il·lustratius, no acurat.

" + }, + "3": { + "then": "Això és un toposcope.

Un marcador erigit en llocs alts que indica la direcció cap als elements paisatgístics notables que es poden veure des d'aquest punt

" } - } + }, + "question": "Quin tipus de mapa es mostra?" } }, "title": { @@ -4900,6 +4985,9 @@ }, "1": { "then": "La tasca està arreglada" + }, + "2": { + "then": "La tasca és un fals positiu" } } } @@ -5047,29 +5135,47 @@ }, "1": { "then": "No s'admeten gossos" + }, + "2": { + "then": "Els gossos poden anar solts" } - } + }, + "question": "Els gossos estan permesos en aquesta reserva natural?" }, "Editable description": { - "question": "Hi ha alguna informació addicional?" + "question": "Hi ha alguna informació addicional?", + "render": "Informació adicional: {description:0}" }, "Email": { "question": "A quina adreça de correu electrònic es pot enviar amb preguntes i problemes amb aquest parc natural?", "questionHint": "Respecteu la privadesa: només ompliu una adreça de correu electrònic personal si es publica àmpliament" }, "Name tag": { + "mappings": { + "0": { + "then": "Aquesta àrea no té un nom" + } + }, + "question": "Quin és el nom d'aquesta àrea?", "render": "Aquesta àrea s'anomena {name}" }, + "Non-editable description": { + "render": "Informació adicional: {description}" + }, "Operator tag": { "mappings": { "0": { "then": "Gestionat per NatuurPunt" }, + "1": { + "then": "Gestionat per {operator}" + }, "2": { "then": "Gestionat per Agentschap Natuur en Bos" } }, - "question": "Qui gestiona aquesta àrea?" + "question": "Qui gestiona aquesta àrea?", + "render": "Gestionat per {operator}" }, "Surface area": { "render": "Superfície: {_surface:ha}Ha" @@ -5078,12 +5184,25 @@ "question": "A quin número de telèfon es pot trucar amb preguntes i problemes amb aquest parc natural?", "questionHint": "Respecteu la privadesa: només empleneu una adreça de número de telèfon personal si es publica àmpliament" } + }, + "title": { + "render": "Reserva Natural" } }, "note": { "filter": { + "0": { + "options": { + "0": { + "question": "Has de mencionar {search} en el primer comentari" + } + } + }, "10": { "options": { + "0": { + "question": "Totes les notes" + }, "1": { "question": "Oculta les notes d'importació" }, @@ -5091,6 +5210,62 @@ "question": "Mostrar només les notes d'importació" } } + }, + "2": { + "options": { + "0": { + "question": "Obert pel contribuïdor {search}" + } + } + }, + "3": { + "options": { + "0": { + "question": "No obert pel contribuïdor {search}" + } + } + }, + "4": { + "options": { + "0": { + "question": "Editat per última vega pel contribuïdor {search}" + } + } + }, + "5": { + "options": { + "0": { + "question": "Oberta després de {search}" + } + } + }, + "6": { + "options": { + "0": { + "question": "Creada abans de {search}" + } + } + }, + "7": { + "options": { + "0": { + "question": "Creada després de {search}" + } + } + }, + "8": { + "options": { + "0": { + "question": "Sols mostrar les notes obertes per contribuïdors anònims" + } + } + }, + "9": { + "options": { + "0": { + "question": "Sols mostra les notes obertes" + } + } } }, "name": "Notes d'OpenStreetMap", @@ -5130,7 +5305,7 @@ }, "Operator": { "question": "Qui manté aquesta torre?", - "render": "Mantés per {operator}" + "render": "Mantés per {operator}" }, "access": { "mappings": { @@ -5399,6 +5574,12 @@ "1": { "then": "Aquesta és una plaça d'aparcament normal." }, + "10": { + "then": "Es tracta d'una plaça d'aparcament reservada per a pares amb fills." + }, + "11": { + "then": "Es tracta d'una plaça d'aparcament reservada al personal." + }, "2": { "then": "Aquesta és una plaça d'aparcament per a minusvàlids." }, @@ -5416,12 +5597,6 @@ }, "9": { "then": "Es tracta d'una plaça d'aparcament reservada per a motos." - }, - "10": { - "then": "Es tracta d'una plaça d'aparcament reservada per a pares amb fills." - }, - "11": { - "then": "Es tracta d'una plaça d'aparcament reservada al personal." } } } @@ -5452,9 +5627,27 @@ "name": "Camins per a vianants" }, "pharmacy": { + "filter": { + "1": { + "options": { + "0": { + "question": "Farmàcia que subministra medicaments amb recepta" + } + } + } + }, "name": "Farmàcies", + "presets": { + "0": { + "title": "una farmàcia" + } + }, "tagRenderings": { "name": { + "freeform": { + "placeholder": "Nom de la farmàcia" + }, + "question": "Quin és el nom de la farmàcia?", "render": "Aquesta farmàcia es diu {name}" }, "wheelchair": { @@ -5471,15 +5664,51 @@ }, "question": "És fàcil accedir a aquesta farmàcia amb una cadira de rodes?" } + }, + "title": { + "mappings": { + "0": { + "then": "Farmàcia" + } + }, + "render": "{name}" + } + }, + "physiotherapist": { + "description": "Aquesta capa mostra fisioterapeutes", + "name": "Fisioterapeuta", + "presets": { + "0": { + "title": "una consulta fisioterapèutica" + } + }, + "tagRenderings": { + "name": { + "question": "Quin és el nom d'aquesta consulta fisioterapèutica?", + "render": "Aquesta consulta fisioterapèutica es diu {name}" + } + }, + "title": { + "render": "Fisioterapeuta {name}" } }, "picnic_table": { + "description": "La capa mostra taules de pícnic", "name": "Taules de pícnic", "presets": { "0": { "title": "una taula de pícnic" } }, + "tagRenderings": { + "picnic_table-material": { + "mappings": { + "0": { + "then": "Aquesta és una taula de pícnic de fusta" + } + } + } + }, "title": { "render": "Taula de pícnic" } @@ -5895,6 +6124,9 @@ "1": { "then": "S'accepten monedes de 2 cèntims" }, + "10": { + "then": "S'accepten monedes de 20 cèntims" + }, "2": { "then": "S'accepten monedes de 5 cèntims" }, @@ -5918,9 +6150,6 @@ }, "9": { "then": "S'accepten monedes de 10 cèntims" - }, - "10": { - "then": "S'accepten monedes de 20 cèntims" } }, "question": "Quines monedes es poden utilitzar per a pagar aquí?" @@ -6306,30 +6535,6 @@ "1": { "question": "Reciclatge de piles" }, - "2": { - "question": "Reciclatge de cartrons de begudes" - }, - "3": { - "question": "Reciclatge de llaunes" - }, - "4": { - "question": "Reciclatge de roba" - }, - "5": { - "question": "Reciclatge d'oli de cuina" - }, - "6": { - "question": "Reciclatge d'oli de motor" - }, - "7": { - "question": "Reciclatge de tubs fluorescents" - }, - "8": { - "question": "Reciclatge de residus verds" - }, - "9": { - "question": "Reciclatge d'ampolles de vidre" - }, "10": { "question": "Reciclatge de vidre" }, @@ -6360,11 +6565,35 @@ "19": { "question": "Reciclatge del rebuig" }, + "2": { + "question": "Reciclatge de cartrons de begudes" + }, "20": { "question": "Reciclatge de cartutxos d'impressora" }, "21": { "question": "Reciclatge de bicicletes" + }, + "3": { + "question": "Reciclatge de llaunes" + }, + "4": { + "question": "Reciclatge de roba" + }, + "5": { + "question": "Reciclatge d'oli de cuina" + }, + "6": { + "question": "Reciclatge d'oli de motor" + }, + "7": { + "question": "Reciclatge de tubs fluorescents" + }, + "8": { + "question": "Reciclatge de residus verds" + }, + "9": { + "question": "Reciclatge d'ampolles de vidre" } } }, @@ -6432,30 +6661,6 @@ "1": { "then": "Aquí es poden reciclar els cartons de begudes" }, - "2": { - "then": "Aquí es poden reciclar llaunes" - }, - "3": { - "then": "Aquí es pot reciclar roba" - }, - "4": { - "then": "Aquí es pot reciclar oli de cuina" - }, - "5": { - "then": "Aquí es pot reciclar oli de motor" - }, - "6": { - "then": "Aquí es poden reciclar tub fluroescents" - }, - "7": { - "then": "Aquí es poden reciclar residus verds" - }, - "8": { - "then": "Ací es poden reciclar residus orgànics" - }, - "9": { - "then": "Aquí es poden reciclar ampolles de vidre" - }, "10": { "then": "Aquí es pot reciclar vidre" }, @@ -6486,6 +6691,9 @@ "19": { "then": "Aquí es poden reciclar sabates" }, + "2": { + "then": "Aquí es poden reciclar llaunes" + }, "20": { "then": "Aquí es poden reciclar petits electrodomèstics" }, @@ -6500,6 +6708,27 @@ }, "24": { "then": "Aquí es poden reciclar bicicletes" + }, + "3": { + "then": "Aquí es pot reciclar roba" + }, + "4": { + "then": "Aquí es pot reciclar oli de cuina" + }, + "5": { + "then": "Aquí es pot reciclar oli de motor" + }, + "6": { + "then": "Aquí es poden reciclar tub fluroescents" + }, + "7": { + "then": "Aquí es poden reciclar residus verds" + }, + "8": { + "then": "Ací es poden reciclar residus orgànics" + }, + "9": { + "then": "Aquí es poden reciclar ampolles de vidre" } }, "question": "Què es pot reciclar aquí?" @@ -6663,6 +6892,11 @@ "name": "Refugi", "tagRenderings": { "shelter-type": { + "mappings": { + "4": { + "then": "Es tracta d'un cobert amb 3 parets, destinat principalment a l'acampada." + } + }, "question": "Quin tipus de refugi és aquest?" } }, @@ -7158,6 +7392,12 @@ "1": { "then": "Aquest fanal utilitza LED" }, + "10": { + "then": "Aquest fanal utilitza làmpades de sodi d'alta pressió (taronja amb blanc)" + }, + "11": { + "then": "Aquest fanal s'il·lumina amb gas" + }, "2": { "then": "Aquest fanal utilitza il·luminació incandescent" }, @@ -7181,12 +7421,6 @@ }, "9": { "then": "Aquest fanal utilitza làmpades de sodi de baixa pressió (taronja monocroma)" - }, - "10": { - "then": "Aquest fanal utilitza làmpades de sodi d'alta pressió (taronja amb blanc)" - }, - "11": { - "then": "Aquest fanal s'il·lumina amb gas" } }, "question": "Quin tipus d'il·luminació utilitza aquest fanal?" @@ -7565,7 +7799,7 @@ } }, "toilet_at_amenity": { - "description": "Una capa que mostra banys (públics) ubicats en diferents llocs", + "description": "Una capa que mostra banys (públics) ubicats en diferents llocs.", "filter": { "0": { "options": { @@ -7575,6 +7809,7 @@ } } }, + "name": "Lavabos a altres instal·lacions", "tagRenderings": { "toilet-access": { "mappings": { @@ -8031,6 +8266,27 @@ "1": { "question": "Venda de begudes" }, + "10": { + "question": "Venda de llet" + }, + "11": { + "question": "Venda de pa" + }, + "12": { + "question": "Venda d'ous" + }, + "13": { + "question": "Venda de formatge" + }, + "14": { + "question": "Venda de mel" + }, + "15": { + "question": "Venda de patates" + }, + "16": { + "question": "Venda de flors" + }, "2": { "question": "Venda de llaminadures" }, @@ -8054,27 +8310,6 @@ }, "9": { "question": "Venda de càmeres interiors de bicicletes" - }, - "10": { - "question": "Venda de llet" - }, - "11": { - "question": "Venda de pa" - }, - "12": { - "question": "Venda d'ous" - }, - "13": { - "question": "Venda de formatge" - }, - "14": { - "question": "Venda de mel" - }, - "15": { - "question": "Venda de patates" - }, - "16": { - "question": "Venda de flors" } } } @@ -8115,30 +8350,6 @@ "1": { "then": "Es venen llaminadures" }, - "2": { - "then": "Es ven menjar" - }, - "3": { - "then": "Es ven tabaco" - }, - "4": { - "then": "Es venen preservatius" - }, - "5": { - "then": "Es ven cafè" - }, - "6": { - "then": "Es ven aigua" - }, - "7": { - "then": "Es venen diaris" - }, - "8": { - "then": "Es venen càmeres interiors de bicicletes" - }, - "9": { - "then": "Es ven llet" - }, "10": { "then": "Es ven pa" }, @@ -8165,6 +8376,30 @@ }, "18": { "then": "Es venen bitllets de transport públic" + }, + "2": { + "then": "Es ven menjar" + }, + "3": { + "then": "Es ven tabaco" + }, + "4": { + "then": "Es venen preservatius" + }, + "5": { + "then": "Es ven cafè" + }, + "6": { + "then": "Es ven aigua" + }, + "7": { + "then": "Es venen diaris" + }, + "8": { + "then": "Es venen càmeres interiors de bicicletes" + }, + "9": { + "then": "Es ven llet" } }, "question": "Que ven aquesta màquina expenedora?", @@ -8501,4 +8736,4 @@ } } } -} \ No newline at end of file +} From 6f5065be0f296ccf71b66a59b3b5fcee16ef387d Mon Sep 17 00:00:00 2001 From: paunofu Date: Tue, 26 Sep 2023 06:46:52 +0000 Subject: [PATCH 02/17] Translated using Weblate (Catalan) Currently translated at 86.3% (2719 of 3148 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/ca/ --- langs/layers/ca.json | 481 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 463 insertions(+), 18 deletions(-) diff --git a/langs/layers/ca.json b/langs/layers/ca.json index 819c2a916..e89503f01 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -672,6 +672,9 @@ }, "1": { "then": "Aquest banc no té una obra d'art integrada" + }, + "2": { + "then": "Aquest banc probablement no té cap obra d'art integrada" } }, "question": "Aquest banc té algun element artístic?", @@ -1653,6 +1656,9 @@ "tagRenderings": { "bird-hide-shelter-or-wall": { "mappings": { + "0": { + "then": "Observatori d'ocells" + }, "1": { "then": "Observatori d'ocells" }, @@ -1675,7 +1681,8 @@ "3": { "then": "No accessible per a persones amb cadira de rodes" } - } + }, + "question": "Aquest observatori d'ocells és accessible per als usuaris de cadira de rodes?" }, "birdhide-operator": { "mappings": { @@ -1691,6 +1698,9 @@ "mappings": { "1": { "then": "Observatori d'Ocells {name}" + }, + "2": { + "then": "Observatori d'ocells {name}" } }, "render": "Lloc d'observació d'ocells" @@ -3921,11 +3931,44 @@ "1": { "then": "Aquesta estació de fitness té un cartell amb instruccions per a un exercici concret." }, + "10": { + "then": "Aquesta estació de gimnàs té esglaons." + }, + "11": { + "then": "Aquesta estació de fitness disposa de cons per fer salts de granota." + }, + "12": { + "then": "Aquesta estació de fitness té bigues per saltar." + }, + "13": { + "then": "Aquesta estació de fitness té obstacles per a travesar." + }, + "14": { + "then": "Aquesta estació de fitness té una paret per enfilar-se." + }, "2": { "then": "Aquesta estació de fitness té una instal·lació per fer abdominals." }, "3": { "then": "Aquest estació de fitness té una instal·lació per a flexions. Normalment consta d'una o més barres horitzontals baixes." + }, + "4": { + "then": "Aquesta estació de fitness disposa de barres per fer estiraments." + }, + "5": { + "then": "Aquesta estació de fitness disposa d'una estació per fer hiperextensions." + }, + "6": { + "then": "Aquesta estació de fitness disposa d'anelles per fer exercicis de gimnàstica." + }, + "7": { + "then": "Aquest gimnàs té una escala horitzontal, també coneguda com a barres de mico." + }, + "8": { + "then": "Aquesta estació de fitness té barres per pujar-hi." + }, + "9": { + "then": "Aquesta estació de fitness té llocs per fer exercicis d'eslàlom." } } } @@ -4790,7 +4833,8 @@ "0": { "then": "Aquesta és una llar d'infants (també coneguda com a preescolar) on els nens petits reben educació primerenca." } - } + }, + "question": "Quin tipus d'instal·lació és aquesta?" }, "name": { "question": "Com s'anomena aquesta instal·lació?", @@ -5012,6 +5056,48 @@ }, "4": { "question": "Mostra les tasques que s'han omès" + }, + "5": { + "question": "Mostra tasques eliminades" + }, + "6": { + "question": "Mostra les tasques que ja estan arreglades" + }, + "7": { + "question": "Mostra les tasques marcades com a massa difícils" + }, + "8": { + "question": "Mostra tasques que s'han desactivat" + } + } + } + }, + "tagRenderings": { + "status": { + "mappings": { + "0": { + "then": "" + }, + "1": { + "then": "La tasca està arreglada" + }, + "2": { + "then": "La tasca és un fals positiu" + }, + "3": { + "then": "S'ha saltat la tasca" + }, + "4": { + "then": "S'ha suprimit la tasca" + }, + "5": { + "then": "La tasca ja està arreglada" + }, + "6": { + "then": "La tasca està marcada com a massa difícil" + }, + "7": { + "then": "La tasca està desactivada" } } } @@ -5198,6 +5284,13 @@ } } }, + "1": { + "options": { + "0": { + "question": "" + } + } + }, "10": { "options": { "0": { @@ -5618,8 +5711,12 @@ "then": "Aquesta màquina de tiquets d'aparcament no té número de referència" } }, + "question": "Quin és el número de referència d'aquesta màquina de bitllets d'aparcament?", "render": "Aquesta màquina de tiquets d'aparcament té el número de referència {ref}" } + }, + "title": { + "render": "Màquina de bitllets d'aparcament" } }, "pedestrian_path": { @@ -5627,7 +5724,15 @@ "name": "Camins per a vianants" }, "pharmacy": { + "description": "Una capa que mostra les farmàcies, que (probablement) distribueixen medicaments amb recepta", "filter": { + "0": { + "options": { + "0": { + "question": "Té autoservei" + } + } + }, "1": { "options": { "0": { @@ -5705,8 +5810,16 @@ "mappings": { "0": { "then": "Aquesta és una taula de pícnic de fusta" + }, + "1": { + "then": "Açò és una taula de pícnic de formigó" + }, + "2": { + "then": "Açò és una taula de pícnic feta de plàstic reciclat" } - } + }, + "question": "De quin material està feta aquesta taula de pícnic?", + "render": "Aquesta taula de pícnic està feta de {material}" } }, "title": { @@ -5754,6 +5867,9 @@ "2": { "then": "Només accessible per als clients del negoci que l'opera" }, + "3": { + "then": "Només accessible per als alumnes de l'escola" + }, "4": { "then": "No accessible" }, @@ -5779,7 +5895,8 @@ "question": "Aquest parc infantil està il·luminat per la nit?" }, "playground-max_age": { - "question": "Quina és l'edat màxima permesa per accedir al parc infantil?" + "question": "Quina és l'edat màxima permesa per accedir al parc infantil?", + "render": "Accessible per a nens de com a màxim {max_age}" }, "playground-min_age": { "question": "Quina és l'edat mínima requerida per a accedir al parc infantil?" @@ -5822,10 +5939,17 @@ }, "5": { "then": "La superfície és formigó" + }, + "6": { + "then": "La superfícies està sense pavimentar" + }, + "7": { + "then": "La superfície està pavimentada" } }, "question": "Quina és la superfície d'aquest parc infantil?", - "questionHint": "Si n'hi ha múltiples, selecciona la més predominant" + "questionHint": "Si n'hi ha múltiples, selecciona la més predominant", + "render": "La superfícies és {surface}" } }, "title": { @@ -5850,6 +5974,7 @@ } }, "postoffices": { + "description": "Una capa que mostra oficines postals.", "name": "Oficines de correus", "presets": { "0": { @@ -5880,7 +6005,8 @@ "then": "No pots enviar cartes des d'aquí" } }, - "question": "Pots enviar cartes des d'aquí?" + "question": "Pots enviar cartes des d'aquí?", + "render": "Podeu enviar cartes amb aquestes empreses: {post_office:letter_from}" }, "parcel-from": { "mappings": { @@ -5891,7 +6017,8 @@ "then": "No pots enviar paquets des d'aquí" } }, - "question": "Pots enviar un paquet des d'aquí?" + "question": "Pots enviar un paquet des d'aquí?", + "render": "Podeu enviar paquets amb aquestes empreses: {post_office:parcel_from}" }, "parcel-pickup": { "mappings": { @@ -5902,7 +6029,8 @@ "then": "No podeu recollir paquets perduts aquí" } }, - "question": "Es poden recollir els paquets perduts aquí?" + "question": "Es poden recollir els paquets perduts aquí?", + "render": "Podeu recollir paquets d'aquestes empreses: {post_office:parcel_pickup}" }, "parcel-to": { "mappings": { @@ -5913,7 +6041,8 @@ "then": "No pots enviar paquets ací per a arreplegar-los" } }, - "question": "Pots enviar paquets aquí per a arreplegar-los?" + "question": "Pots enviar paquets aquí per a arreplegar-los?", + "render": "Podeu enviar paquets aquí per recollir-los amb aquestes empreses: {post_office:parcel_to}" }, "partner-brand": { "mappings": { @@ -5970,7 +6099,7 @@ "then": "Col·laborador postal a {name}" } }, - "render": "Oficina de correus" + "render": "Oficina postal" } }, "public_bookcase": { @@ -6127,6 +6256,9 @@ "10": { "then": "S'accepten monedes de 20 cèntims" }, + "14": { + "then": "S'accepten monedes de 5 francs" + }, "2": { "then": "S'accepten monedes de 5 cèntims" }, @@ -6162,6 +6294,15 @@ "1": { "then": "S'accepten bitllets de 10 euros" }, + "10": { + "then": "S'accepten bitllets de 100 francs" + }, + "11": { + "then": "S'accepten bitllets de 200 francs" + }, + "12": { + "then": "S'accepten bitllets de 1000 francs" + }, "2": { "then": "S'accepten bitllets de 20 euros" }, @@ -6176,6 +6317,15 @@ }, "6": { "then": "S'accepten bitllets de 500 euros" + }, + "7": { + "then": "S'accepten bitllets de 10 francs" + }, + "8": { + "then": "S'accepten bitllets de 20 francs" + }, + "9": { + "then": "S'accepten bitllets de 50 francs" } }, "question": "Amb quins bitllets pot pagar aquí?" @@ -6263,6 +6413,13 @@ } } }, + "last_edit": { + "render": { + "special": { + "text": "Darrera edició el {_last_edit:timestamp} per {_last_edit:contributor}" + } + } + }, "level": { "mappings": { "0": { @@ -7280,6 +7437,12 @@ "tagRenderings": { "conveying": { "mappings": { + "0": { + "then": "Açò és una escala mecànica" + }, + "1": { + "then": "Açò no és una escala mecànica" + }, "2": { "then": "Això no és una escala mecànica" } @@ -7289,7 +7452,17 @@ "mappings": { "0": { "then": "Aquestes escales tenen barana" + }, + "1": { + "then": "Aquestes escales no tenen un passamà" } + }, + "question": "Aquestes escales tenen un passamà?" + }, + "multilevels": { + "override": { + "question": "Entre quines plantes estan aquestes escales?", + "render": "Aquestes escales estan entre les plantes {level}" } }, "ramp": { @@ -7300,6 +7473,9 @@ "1": { "then": "Aquí hi ha una rampa per a cadires de rodes" }, + "2": { + "then": "Aquí hi ha una rampa per a cadira de rodes, però es mostra separadament al mapa" + }, "3": { "then": "Aquí hi ha una rampa per als cotxets" }, @@ -7319,10 +7495,28 @@ } }, "question": "Aquestes escales tenen escriptura braille a la barana?" + }, + "tactile_writing_language": { + "render": { + "special": { + "question": "En quins idiomes hi ha escriptura tàctil (braille) per a la navegació? ", + "render_list_item": "Aquestes escales tenen escriptura tàctil en {language():font-bold}", + "render_single_language": "Aquestes escales tenen escriptura tàctil en {language():font-bold}" + } + } } + }, + "title": { + "mappings": { + "0": { + "then": "Escala mecànica" + } + }, + "render": "Escales" } }, "street_lamps": { + "description": "Una capa que mostra els llums del carrer", "name": "Fanals", "presets": { "0": { @@ -7342,7 +7536,8 @@ "then": "Aquest fanal emet llum taronja" } }, - "question": "Quin color de llum emet aquest fanal?" + "question": "Quin color de llum emet aquest fanal?", + "render": "Aquesta làmpada emet llum {light:color}" }, "count": { "mappings": { @@ -7353,7 +7548,8 @@ "then": "Aquest fanal té 2 aparells" } }, - "question": "Quants accessoris té aquest fanal?" + "question": "Quants accessoris té aquest fanal?", + "render": "Aquesta làmpada té {light:count} aparells" }, "direction": { "question": "Cap a on apunta aquest fanal?", @@ -7389,6 +7585,9 @@ }, "method": { "mappings": { + "0": { + "then": "Aquest fanal s'encén elèctricament" + }, "1": { "then": "Aquest fanal utilitza LED" }, @@ -7426,22 +7625,64 @@ "question": "Quin tipus d'il·luminació utilitza aquest fanal?" }, "ref": { - "question": "Quin és el número de referència d'aquest fanal?" + "question": "Quin és el número de referència d'aquest fanal?", + "render": "Aquest fanal té el número de referència {ref}" }, "support": { "mappings": { + "0": { + "then": "Aquesta làmpada està suspès mitjançant cables" + }, + "1": { + "then": "Aquesta làmpada està muntat al sostre" + }, + "2": { + "then": "Aquesta làmpada està muntat a terra" + }, + "3": { + "then": "Aquesta làmpada està muntada en un pal curt (principalment <1,5 m)" + }, "4": { - "then": "Aquest fanal està muntat en un pal" + "then": "Aquesta làmpada està muntada en un pal" + }, + "5": { + "then": "Aquesta làmpada està muntada directament a la paret" }, "6": { - "then": "Aquest fanal està muntat a la paret utilitzat una barra metàl·lica" + "then": "Aquesta làmpada està muntada a la paret utilitzat una barra metàl·lica" } - } + }, + "question": "Com està muntada aquesta làmpada?" } + }, + "title": { + "mappings": { + "0": { + "then": "Fanal {ref}" + } + }, + "render": "Fanal" } }, "surveillance_camera": { + "description": "Aquesta capa mostra les càmeres de vigilància i permet a qui col·labora, actualitzar la informació i afegir noves càmeres", "name": "Càmeres de videovigilància", + "presets": { + "0": { + "title": "una càmera de vigilància" + }, + "1": { + "title": "una càmera de vigilància muntada en una paret" + }, + "2": { + "description": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes.", + "title": "una càmera ALPR (lector automàtic de matrícules, per les seves sigles en anglès)" + }, + "3": { + "description": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes.", + "title": "una càmera ALPR (lector automàtic de matrícules) muntada a la paret" + } + }, "tagRenderings": { "Camera type: fixed; panning; dome": { "mappings": { @@ -7521,8 +7762,39 @@ "render": "Mètode de muntatge: {camera:mount}" }, "camera_direction": { + "mappings": { + "0": { + "then": "Grava en direcció {direction}" + } + }, "question": "En quina direcció geogràfica apunta aquesta càmera?", "render": "Grava en direcció {camera:direction}" + }, + "has_alpr": { + "mappings": { + "0": { + "then": "Es tracta d'una càmera sense reconeixement de matrícules." + }, + "1": { + "then": "Açò és un ALPR (lector automàtic de matrícules, per les seves sigles en anglès)" + } + }, + "question": "Aquesta càmera pot detectar matrícules automàticament?", + "questionHint": "Un ALPR (lector automàtic de matrícules, per les seves sigles en anglès) normalment té dues lents i una sèrie de LEDs infrarojos entremig." + }, + "is_indoor": { + "mappings": { + "0": { + "then": "Aquesta càmera es troba a l'interior" + }, + "1": { + "then": "Aquesta càmera es troba a l'exterior" + }, + "2": { + "then": "Aquesta càmera probablement es troba a l'exterior" + } + }, + "question": "L'espai públic vigilat per aquesta càmera és un espai interior o exterior?" } }, "title": { @@ -7530,13 +7802,19 @@ } }, "tertiary_education": { + "presets": { + "0": { + "title": "una universitat" + } + }, "tagRenderings": { "institution-kind": { "mappings": { "1": { "then": "Açò és una universitat, una institució d'educació terciaria on s'imparteixen carreres universitàries o superior." } - } + }, + "question": "Quin tipus d'institució és aquesta?" }, "isced": { "mappings": { @@ -7552,11 +7830,23 @@ }, "question": "Quin nivell d'educació és dona aquí?" } + }, + "title": { + "mappings": { + "2": { + "then": "Universitat" + } + } } }, "ticket_machine": { "description": "Troba màquines de bitllets per a bitllets de transport públic", "name": "Màquines de bitllets", + "presets": { + "0": { + "title": "una màquina de bitllets" + } + }, "tagRenderings": { "operator": { "freeform": { @@ -7860,16 +8150,60 @@ } }, "question": "Hi ha un lavabo específic per a usuaris amb cadira de rodes?" + }, + "wheelchair-door-width": { + "question": "Quina és l'amplada de la porta del lavabo accessible per a cadira de rodes?" + } + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": "metre" + }, + "1": { + "human": "centimetre" + } + } } } }, "trail": { "name": "Camins", + "tagRenderings": { + "Color": { + "mappings": { + "0": { + "then": "Ruta blava" + }, + "1": { + "then": "Ruta vermella" + }, + "2": { + "then": "Ruta verda" + }, + "3": { + "then": "Ruta groga" + } + } + }, + "trail-length": { + "render": "El sender té {_length:km} quilòmetres" + } + }, "title": { "render": "Camí" } }, "transit_routes": { + "description": "Capa que mostra les línies d'autobús", + "mapRendering": { + "0": { + "color": { + "render": "#ff0000" + } + } + }, "name": "Línies de bus", "tagRenderings": { "colour": { @@ -7891,7 +8225,18 @@ "to": { "question": "Quin és el punt final d'aquesta línea d'autobús?", "render": "Aquesta línia d'autobús acaba a {to}" + }, + "via": { + "render": "Aquesta línia d'autobús passa per {via}" } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Línia de bus" } }, "transit_stops": { @@ -7903,6 +8248,13 @@ } } }, + "1": { + "options": { + "0": { + "question": "Amb un banc" + } + } + }, "2": { "options": { "0": { @@ -7920,6 +8272,9 @@ }, "1": { "then": "Aquesta parada no té un banc" + }, + "2": { + "then": "Aquesta parada té un banc que està mapejat separadament" } }, "question": "Aquesta parada té un banc?" @@ -7931,6 +8286,9 @@ }, "1": { "then": "Aquesta parada no té paperera" + }, + "2": { + "then": "Aquesta parada té una paperera que està mapejada separadament" } }, "question": "Aquesta parada té una paperera?" @@ -7940,11 +8298,23 @@ }, "departures_board": { "mappings": { + "0": { + "then": "Aquesta parada té un tauler de sortides de tipus desconegut" + }, "1": { "then": "Aquesta parada té un tauló amb els horaris en temps real" }, "2": { "then": "Aquesta parada té un tauló amb els horaris en temps real" + }, + "3": { + "then": "Aquesta parada té un horari que mostra les sortides regulars" + }, + "4": { + "then": "Aquesta parada té un horari que conté només l'interval entre sortides" + }, + "5": { + "then": "Aquesta parada no té un tauler de sortides" } } }, @@ -7966,11 +8336,17 @@ }, "1": { "then": "Aquesta parada no té una coberta" + }, + "2": { + "then": "Aquesta parada té un refugi que està mapejat separadament" } }, "question": "Aquesta parada té una coberta?" }, "stop_name": { + "freeform": { + "placeholder": "Nom de la parada" + }, "mappings": { "0": { "then": "Aquesta parada no té nom" @@ -7990,9 +8366,17 @@ }, "question": "Aquesta parada té una superfície podotàctil?" } + }, + "title": { + "mappings": { + "0": { + "then": "Parada {name}" + } + } } }, "tree_node": { + "description": "Una capa que mostra arbres", "name": "Arbre", "presets": { "2": { @@ -8001,7 +8385,12 @@ }, "tagRenderings": { "circumference": { - "questionHint": "Es mesura a una alçada d'1,30 m" + "question": "Quina és la circumferència del tronc de l'arbre?", + "questionHint": "Es mesura a una alçada d'1,30 m", + "render": "El tronc de l'arbre té una circumferència de {circumference} metre" + }, + "height": { + "question": "Quina és l'alçada d'aquest arbre?" }, "tree-decidouous": { "mappings": { @@ -8012,9 +8401,18 @@ }, "tree-denotation": { "mappings": { + "2": { + "then": "L'arbre s'utilitza amb finalitats agrícoles, p. en un hort." + }, + "3": { + "then": "L'arbre està en un parc o semblant (cementiri, recinte escolar, …)." + }, "4": { "then": "L'arbre està en un jardí residencial." }, + "5": { + "then": "Aquest és un arbre al llarg d'una avinguda." + }, "6": { "then": "L'arbre està en una àrea urbana." } @@ -8090,6 +8488,32 @@ }, "question": "Les preguntes amb camps de dades desconeguts haurien d'aparèixer una per una o juntes?" }, + "background-layer": { + "mappings": { + "0": { + "then": "Utilitzeu la capa de fons predeterminada" + }, + "1": { + "then": "Utilitzeu OpenStreetMap-carto com a capa predeterminada" + }, + "2": { + "then": "Utilitzeu imatges aèries com a fons predeterminat" + }, + "3": { + "then": "Utilitzeu un mapa que no sigui openstreetmap com a fons predeterminat" + }, + "4": { + "then": "Utilitzeu la capa de fons actual ({__current_background}) com a fons predeterminat" + }, + "5": { + "then": "Utilitza la capa de fons {mapcomplete-preferred-background-layer} com a fons predeterminat" + } + }, + "question": "Quina capa de fons s'ha de mostrar per defecte?" + }, + "background-layer-readonly": { + "render": "Aquest mapa temàtic té un conjunt de capes de fons predefinides. La configuració predeterminada del tema no s'aplica" + }, "contributor-thanks": { "mappings": { "0": { @@ -8287,9 +8711,21 @@ "16": { "question": "Venda de flors" }, + "17": { + "question": "Venda d'aparcament" + }, + "18": { + "question": "Venda de monedes premsades" + }, + "19": { + "question": "Venda de bitllets de transport públic" + }, "2": { "question": "Venda de llaminadures" }, + "20": { + "question": "Venda de productes carnis" + }, "3": { "question": "Venda de menjar" }, @@ -8342,6 +8778,12 @@ "question": "Qui opera aquesta màquina expenedora?", "render": "{operator} gestiona aquesta màquina expenedora" }, + "phone": { + "override": { + "question": "Quin és el número de telèfon de l'operador d'aquesta màquina expenedora?", + "questionHint": "Aquest és el número al qual podeu trucar en cas de problemes amb la màquina expenedora" + } + }, "vending": { "mappings": { "0": { @@ -8377,6 +8819,9 @@ "18": { "then": "Es venen bitllets de transport públic" }, + "19": { + "then": "Es venen productes carnis" + }, "2": { "then": "Es ven menjar" }, From 02b38fec41cb3d2c24230bc02d438083b5631fbe Mon Sep 17 00:00:00 2001 From: kjon Date: Mon, 25 Sep 2023 16:51:29 +0000 Subject: [PATCH 03/17] Translated using Weblate (German) Currently translated at 98.6% (3106 of 3148 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/de/ --- langs/layers/de.json | 587 +++++++++++++++++++++++-------------------- 1 file changed, 308 insertions(+), 279 deletions(-) diff --git a/langs/layers/de.json b/langs/layers/de.json index d4e1387ef..e06449990 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -35,6 +35,16 @@ "1": { "title": "eine freistehende Posterbox" }, + "10": { + "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", + "title": "ein Schild" + }, + "11": { + "title": "eine Skulptur" + }, + "12": { + "title": "eine Wandmalerei" + }, "2": { "title": "eine wandmontierte Posterbox" }, @@ -61,16 +71,6 @@ }, "9": { "title": "ein Totem" - }, - "10": { - "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", - "title": "ein Schild" - }, - "11": { - "title": "eine Skulptur" - }, - "12": { - "title": "eine Wandmalerei" } }, "tagRenderings": { @@ -165,6 +165,9 @@ "1": { "then": "Dies ist ein Brett" }, + "10": { + "then": "Dies ist eine Wandmalerei" + }, "2": { "then": "Dies ist eine Litfaßsäule" }, @@ -188,9 +191,6 @@ }, "9": { "then": "Dies ist ein Totem" - }, - "10": { - "then": "Dies ist eine Wandmalerei" } }, "question": "Welche Art von Werbung ist das?", @@ -205,6 +205,9 @@ "1": { "then": "Brett" }, + "10": { + "then": "Wandmalerei" + }, "2": { "then": "Posterbox" }, @@ -228,9 +231,6 @@ }, "9": { "then": "Totem" - }, - "10": { - "then": "Wandmalerei" } } } @@ -312,6 +312,15 @@ "1": { "then": "Wandbild" }, + "10": { + "then": "Azulejo (spanische dekorative Fliesenarbeit)" + }, + "11": { + "then": "Fliesenarbeit" + }, + "12": { + "then": "Holzschnitzerei" + }, "2": { "then": "Malerei" }, @@ -335,15 +344,6 @@ }, "9": { "then": "Relief" - }, - "10": { - "then": "Azulejo (spanische dekorative Fliesenarbeit)" - }, - "11": { - "then": "Fliesenarbeit" - }, - "12": { - "then": "Holzschnitzerei" } }, "question": "Um welche Art Kunstwerk handelt es sich?", @@ -672,6 +672,9 @@ }, "1": { "then": "Diese Bank hat kein integriertes Kunstwerk" + }, + "2": { + "then": "Die Bank hat vermutlich kein integriertes Kunstwerk" } }, "question": "Hat diese Bank ein künstlerisches Element?", @@ -1834,6 +1837,27 @@ "1": { "question": "Verfügt über einen

Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)
" }, + "10": { + "question": "Hat einen
Typ 2 (Mennekes)
Anschluss mit Kabel" + }, + "11": { + "question": "Hat einen
Tesla Supercharger CCS (Typ 2 CSS vonTesla)
Anschluss" + }, + "12": { + "question": "Hat einen
Tesla Supercharger (Destination)
Anschluss" + }, + "13": { + "question": "Hat einen
Tesla Supercharger (Destination) (Typ 2 von Tesla)
Anschluss mit Kabel" + }, + "14": { + "question": "Hat einen
USB-Anschluss zum Aufladen von Telefonen und kleinen Elektrogeräten
" + }, + "15": { + "question": "Hat einen
Bosch Active Connect Anschluss mit 3 Pins
und Kabel" + }, + "16": { + "question": "Hat einen
Bosch Active Connect Anschluss mit 5 Pins
und Kabel" + }, "2": { "question": "Verfügt über einen
europäischen Netzstecker mit Erdungsstift (CEE7/4 Typ E)
Anschluss" }, @@ -1857,27 +1881,6 @@ }, "9": { "question": "Hat einen
Typ 2 CCS (Mennekes)
Anschluss" - }, - "10": { - "question": "Hat einen
Typ 2 (Mennekes)
Anschluss mit Kabel" - }, - "11": { - "question": "Hat einen
Tesla Supercharger CCS (Typ 2 CSS vonTesla)
Anschluss" - }, - "12": { - "question": "Hat einen
Tesla Supercharger (Destination)
Anschluss" - }, - "13": { - "question": "Hat einen
Tesla Supercharger (Destination) (Typ 2 von Tesla)
Anschluss mit Kabel" - }, - "14": { - "question": "Hat einen
USB-Anschluss zum Aufladen von Telefonen und kleinen Elektrogeräten
" - }, - "15": { - "question": "Hat einen
Bosch Active Connect Anschluss mit 3 Pins
und Kabel" - }, - "16": { - "question": "Hat einen
Bosch Active Connect Anschluss mit 5 Pins
und Kabel" } } } @@ -1933,30 +1936,6 @@ "1": { "then": "Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)" }, - "2": { - "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" - }, - "3": { - "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" - }, - "4": { - "then": "Chademo-Anschluss" - }, - "5": { - "then": "Chademo-Anschluss" - }, - "6": { - "then": "Typ 1 mit Kabel (J1772)" - }, - "7": { - "then": "Typ 1 mit Kabel (J1772)" - }, - "8": { - "then": "Typ 1 ohne Kabel (J1772)" - }, - "9": { - "then": " Typ 1 ohne Kabel (J1772)" - }, "10": { "then": "Typ 1 CCS (Typ 1 Combo)" }, @@ -1987,6 +1966,9 @@ "19": { "then": "Typ 2 mit Kabel (mennekes)" }, + "2": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, "20": { "then": "Tesla Supercharger CCS (Typ 2 CSS von Tesla)" }, @@ -2017,11 +1999,32 @@ "29": { "then": " Bosch Active Connect mit 3 Pins und Kabel" }, + "3": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, "30": { "then": "Bosch Active Connect mit 5 Pins und Kabel" }, "31": { "then": " Bosch Active Connect mit 5 Pins und Kabel" + }, + "4": { + "then": "Chademo-Anschluss" + }, + "5": { + "then": "Chademo-Anschluss" + }, + "6": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "7": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "8": { + "then": "Typ 1 ohne Kabel (J1772)" + }, + "9": { + "then": " Typ 1 ohne Kabel (J1772)" } }, "question": "Welche Ladeanschlüsse gibt es hier?" @@ -3559,6 +3562,15 @@ "1": { "then": "Dieser Radweg hat einen festen Belag" }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" + }, "2": { "then": "Der Radweg ist aus Asphalt" }, @@ -3582,15 +3594,6 @@ }, "9": { "then": "Der Radweg ist aus Schotter" - }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" } }, "question": "Was ist der Belag dieses Radwegs?", @@ -3639,6 +3642,15 @@ "1": { "then": "Dieser Radweg hat einen festen Belag" }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" + }, "2": { "then": "Der Radweg ist aus Asphalt" }, @@ -3662,15 +3674,6 @@ }, "9": { "then": "Der Radweg ist aus Schotter" - }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" } }, "question": "Was ist der Belag dieser Straße?", @@ -4241,28 +4244,34 @@ } }, "elongated_coin": { - "description": "Ebene mit Münzpressen.", - "name": "Münzpressen", + "description": "Ebene mit Münzprägeautomaten.", + "name": "Münzprägeautomaten", "presets": { "0": { - "title": "Eine Münzpresse" + "title": "Einen Münzprägeautomaten" } }, "tagRenderings": { "charge": { "freeform": { - "placeholder": "Einwurf (z.B. 0,5€)" + "placeholder": "Gebühr (z.B. 0,50 €)" }, "mappings": { "0": { - "then": "Eine Münze zu Pressen kostet 1 Euro." + "then": "Die Prägung einer Münze kostet 1,00 €." }, "1": { - "then": "Eine Münze zu Pressen kostet 2€." + "then": "Die Prägung einer Münze kostet 2,00 €." + }, + "2": { + "then": "Die Prägung einer Münze kostet 2 Schweizer Franken." + }, + "3": { + "then": "Die Prägung einer Münze kostet 1 Schweizer Franken." } }, - "question": "Wieviel kostet es eine Münze zu Pressen?", - "render": "Es kostet {charge}€ um eine Münze zu Pressen." + "question": "Wieviel kostet die Prägung einer Münze?", + "render": "Die Prägung einer Münze kostet {charge}." }, "coin": { "freeform": { @@ -4270,23 +4279,29 @@ }, "mappings": { "0": { - "then": "Die Münzpresse benötigt eine 2 Cent Münze um zu Pressen." + "then": "Der Automat prägt 2 Cent Münzen." }, "1": { - "then": "Die Münzpresse benötigt eine 5 Cent Münze um zu Pressen." + "then": "Der Automat prägt 5 Cent Münzen." }, "2": { - "then": "Die Münzpresse benötigt eine 10 Cent Münze um zu Pressen." + "then": "Der Automat prägt 10 Cent Münzen." }, "3": { - "then": "Die Münzpresse benötigt eine 25 Cent Münze um zu Pressen." + "then": "Der Automat prägt 25 Cent Münzen." }, "4": { - "then": "Die Münzpresse benötigt eine 50 Cent Münze um zu Pressen." + "then": "Der Automat prägt 50 Cent Münzen." + }, + "5": { + "then": "Der Automat prägt 10 Centime Münzen." + }, + "6": { + "then": "Der Automat prägt 5 Centime Münzen." } }, - "question": "Welche Münze wird zum Pressen verwendet?", - "render": "Die Münzpresse benötigt eine {coin:type} Münze um zu Pressen." + "question": "Welche Münzen können geprägt werden?", + "render": "Der Automat prägt {coin:type} Cent Münzen." }, "designs": { "freeform": { @@ -4294,35 +4309,49 @@ }, "mappings": { "0": { - "then": "Die Münzpresse hat ein Motiv zur Auswahl." + "then": "Der Prägeautomat hat ein Motiv zur Auswahl." }, "1": { - "then": "Die Münzpresse hat zwei Motive zur Auswahl." + "then": "Der Prägeautomat hat zwei Motive zur Auswahl." }, "2": { - "then": "Die Münzpresse hat drei Motive zur Auswahl." + "then": "Der Prägeautomat hat drei Motive zur Auswahl." }, "3": { - "then": "Die Münzpresse hat vier Motive zur Auswahl." + "then": "Der Prägeautomat hat vier Motive zur Auswahl." } }, "question": "Wieviele Motive sind verfügbar?", - "render": "Die Münzpresse hat {coin:design_count} Motive zur Auswahl." + "render": "Der Prägeautomat hat {coin:design_count} Motive zur Auswahl." + }, + "fee": { + "mappings": { + "0": { + "then": "Das Prägen ist kostenpflichtig." + }, + "1": { + "then": "Das Prägen ist kostenpflichtig." + }, + "2": { + "then": "Das Prägen ist kostenlos." + } + }, + "question": "Ist das Prägen kostenpflichtig?" }, "indoor": { "mappings": { "0": { - "then": "Die Münzpresse befindet sich im Inneren." + "then": "Der Prägeautomat befindet sich im Inneren." }, "1": { - "then": "Die Münzpresse befindet sich Draußen." + "then": "Der Prägeautomat befindet sich im Freien." } }, - "question": "Befindet sich die Münzpresse im Inneren?" + "question": "Befindet sich der Prägeautomat im Inneren?" } }, "title": { - "render": "Münzpresse" + "render": "Prägeautomat" } }, "entrance": { @@ -4721,30 +4750,6 @@ "1": { "then": "Die Fitness-Station hat ein Schild mit Anweisungen für eine bestimmte Übung." }, - "2": { - "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." - }, - "3": { - "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." - }, - "4": { - "then": "Die Fitness-Station hat Stangen zum Dehnen." - }, - "5": { - "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." - }, - "6": { - "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." - }, - "7": { - "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." - }, - "8": { - "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." - }, - "9": { - "then": "Die Fitness-Station hat Pfosten für Slalomübungen." - }, "10": { "then": "Die Fitness-Station hat Trittsteine." }, @@ -4775,6 +4780,9 @@ "19": { "then": "Die Fitness-Station hat Kampfseile (battle ropes)." }, + "2": { + "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." + }, "20": { "then": "Die Fitness-Station hat ein Fahrradergometer." }, @@ -4789,6 +4797,27 @@ }, "24": { "then": "Die Fitness-Station hat eine Slackline." + }, + "3": { + "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." + }, + "4": { + "then": "Die Fitness-Station hat Stangen zum Dehnen." + }, + "5": { + "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." + }, + "6": { + "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." + }, + "7": { + "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." + }, + "8": { + "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." + }, + "9": { + "then": "Die Fitness-Station hat Pfosten für Slalomübungen." } }, "question": "Welche Übungsgeräte gibt es an dieser Fitness-Station?" @@ -4898,6 +4927,21 @@ "1": { "then": "Dies ist eine Pommesbude" }, + "10": { + "then": "Hier werden chinesische Gerichte serviert" + }, + "11": { + "then": "Hier werden griechische Gerichte serviert" + }, + "12": { + "then": "Hier werden indische Gerichte serviert" + }, + "13": { + "then": "Hier werden türkische Gerichte serviert" + }, + "14": { + "then": "Hier werden thailändische Gerichte serviert" + }, "2": { "then": "Bietet vorwiegend Pastagerichte an" }, @@ -4921,21 +4965,6 @@ }, "9": { "then": "Hier werden französische Gerichte serviert" - }, - "10": { - "then": "Hier werden chinesische Gerichte serviert" - }, - "11": { - "then": "Hier werden griechische Gerichte serviert" - }, - "12": { - "then": "Hier werden indische Gerichte serviert" - }, - "13": { - "then": "Hier werden türkische Gerichte serviert" - }, - "14": { - "then": "Hier werden thailändische Gerichte serviert" } }, "question": "Was für Essen gibt es hier?", @@ -6154,6 +6183,19 @@ } } }, + "10": { + "options": { + "0": { + "question": "Alle Notizen" + }, + "1": { + "question": "Importnotizen ausblenden" + }, + "2": { + "question": "Nur Importnotizen anzeigen" + } + } + }, "2": { "options": { "0": { @@ -6209,19 +6251,6 @@ "question": "Nur offene Notizen anzeigen" } } - }, - "10": { - "options": { - "0": { - "question": "Alle Notizen" - }, - "1": { - "question": "Importnotizen ausblenden" - }, - "2": { - "question": "Nur Importnotizen anzeigen" - } - } } }, "name": "OpenStreetMap-Hinweise", @@ -6550,6 +6579,21 @@ "1": { "then": "Dies ist ein normaler Stellplatz." }, + "10": { + "then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist." + }, + "11": { + "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." + }, + "12": { + "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." + }, + "13": { + "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." + }, + "14": { + "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." + }, "2": { "then": "Dies ist ein Behindertenstellplatz." }, @@ -6573,21 +6617,6 @@ }, "9": { "then": "Dies ist ein Stellplatz, der für Motorräder reserviert ist." - }, - "10": { - "then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist." - }, - "11": { - "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." - }, - "12": { - "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." - }, - "13": { - "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." - }, - "14": { - "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." } }, "question": "Welche Art von Stellplatz ist dies?" @@ -7600,30 +7629,6 @@ "1": { "question": "Recycling von Batterien" }, - "2": { - "question": "Recycling von Getränkekartons" - }, - "3": { - "question": "Recycling von Dosen" - }, - "4": { - "question": "Recycling von Kleidung" - }, - "5": { - "question": "Recycling von Speiseöl" - }, - "6": { - "question": "Recycling von Motoröl" - }, - "7": { - "question": "Recycling von Leuchtstoffröhren" - }, - "8": { - "question": "Recycling von Grünabfällen" - }, - "9": { - "question": "Recycling von Glasflaschen" - }, "10": { "question": "Recycling von Glas" }, @@ -7654,11 +7659,35 @@ "19": { "question": "Recycling von Restabfällen" }, + "2": { + "question": "Recycling von Getränkekartons" + }, "20": { "question": "Recycling von Druckerpatronen" }, "21": { "question": "Recycling von Fahrrädern" + }, + "3": { + "question": "Recycling von Dosen" + }, + "4": { + "question": "Recycling von Kleidung" + }, + "5": { + "question": "Recycling von Speiseöl" + }, + "6": { + "question": "Recycling von Motoröl" + }, + "7": { + "question": "Recycling von Leuchtstoffröhren" + }, + "8": { + "question": "Recycling von Grünabfällen" + }, + "9": { + "question": "Recycling von Glasflaschen" } } }, @@ -7726,30 +7755,6 @@ "1": { "then": "Getränkekartons können hier recycelt werden" }, - "2": { - "then": "Dosen können hier recycelt werden" - }, - "3": { - "then": "Kleidung kann hier recycelt werden" - }, - "4": { - "then": "Speiseöl kann hier recycelt werden" - }, - "5": { - "then": "Motoröl kann hier recycelt werden" - }, - "6": { - "then": "Hier können Leuchtstoffröhren recycelt werden" - }, - "7": { - "then": "Grünabfälle können hier recycelt werden" - }, - "8": { - "then": "Bio-Abfall kann hier recycelt werden" - }, - "9": { - "then": "Glasflaschen können hier recycelt werden" - }, "10": { "then": "Glas kann hier recycelt werden" }, @@ -7780,6 +7785,9 @@ "19": { "then": "Schuhe können hier recycelt werden" }, + "2": { + "then": "Dosen können hier recycelt werden" + }, "20": { "then": "Elektrokleingeräte können hier recycelt werden" }, @@ -7794,6 +7802,27 @@ }, "24": { "then": "Fahrräder können hier recycelt werden" + }, + "3": { + "then": "Kleidung kann hier recycelt werden" + }, + "4": { + "then": "Speiseöl kann hier recycelt werden" + }, + "5": { + "then": "Motoröl kann hier recycelt werden" + }, + "6": { + "then": "Hier können Leuchtstoffröhren recycelt werden" + }, + "7": { + "then": "Grünabfälle können hier recycelt werden" + }, + "8": { + "then": "Bio-Abfall kann hier recycelt werden" + }, + "9": { + "then": "Glasflaschen können hier recycelt werden" } }, "question": "Was kann hier recycelt werden?" @@ -8597,6 +8626,12 @@ "1": { "then": "Diese Straßenlaterne verwendet LEDs" }, + "10": { + "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" + }, + "11": { + "then": "Diese Straßenlaterne wird mit Gas beleuchtet" + }, "2": { "then": "Diese Straßenlaterne verwendet Glühlampenlicht" }, @@ -8620,12 +8655,6 @@ }, "9": { "then": "Diese Straßenlaterne verwendet Niederdruck-Natriumdampflampen (einfarbig orange)" - }, - "10": { - "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" - }, - "11": { - "then": "Diese Straßenlaterne wird mit Gas beleuchtet" } }, "question": "Mit welcher Art von Beleuchtung arbeitet diese Straßenlaterne?" @@ -9719,6 +9748,27 @@ "1": { "question": "Verkauf von Getränken" }, + "10": { + "question": "Verkauf von Milch" + }, + "11": { + "question": "Verkauf von Brot" + }, + "12": { + "question": "Verkauf von Eiern" + }, + "13": { + "question": "Verkauf von Käse" + }, + "14": { + "question": "Verkauf von Honig" + }, + "15": { + "question": "Verkauf von Kartoffeln" + }, + "16": { + "question": "Verkauf von Blumen" + }, "2": { "question": "Verkauf von Süßigkeiten" }, @@ -9742,27 +9792,6 @@ }, "9": { "question": "Verkauf von Fahrradschläuchen" - }, - "10": { - "question": "Verkauf von Milch" - }, - "11": { - "question": "Verkauf von Brot" - }, - "12": { - "question": "Verkauf von Eiern" - }, - "13": { - "question": "Verkauf von Käse" - }, - "14": { - "question": "Verkauf von Honig" - }, - "15": { - "question": "Verkauf von Kartoffeln" - }, - "16": { - "question": "Verkauf von Blumen" } } } @@ -9803,30 +9832,6 @@ "1": { "then": "Süßigkeiten werden verkauft" }, - "2": { - "then": "Lebensmittel werden verkauft" - }, - "3": { - "then": "Zigaretten werden verkauft" - }, - "4": { - "then": "Kondome werden verkauft" - }, - "5": { - "then": "Kaffee wird verkauft" - }, - "6": { - "then": "Trinkwasser wird verkauft" - }, - "7": { - "then": "Zeitungen werden verkauft" - }, - "8": { - "then": "Fahrradschläuche werden verkauft" - }, - "9": { - "then": "Milch wird verkauft" - }, "10": { "then": "Brot wird verkauft" }, @@ -9850,6 +9855,30 @@ }, "18": { "then": "Fahrscheine werden verkauft" + }, + "2": { + "then": "Lebensmittel werden verkauft" + }, + "3": { + "then": "Zigaretten werden verkauft" + }, + "4": { + "then": "Kondome werden verkauft" + }, + "5": { + "then": "Kaffee wird verkauft" + }, + "6": { + "then": "Trinkwasser wird verkauft" + }, + "7": { + "then": "Zeitungen werden verkauft" + }, + "8": { + "then": "Fahrradschläuche werden verkauft" + }, + "9": { + "then": "Milch wird verkauft" } }, "question": "Was wird in diesem Automaten verkauft?", @@ -10186,4 +10215,4 @@ } } } -} \ No newline at end of file +} From 9df3e35f8c3f5a3689fd4100d47005d4ad07e775 Mon Sep 17 00:00:00 2001 From: paunofu Date: Wed, 27 Sep 2023 10:04:54 +0000 Subject: [PATCH 04/17] Translated using Weblate (Spanish) Currently translated at 44.8% (1412 of 3148 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/es/ --- langs/layers/es.json | 299 +++++++++++++++++++++---------------------- 1 file changed, 147 insertions(+), 152 deletions(-) diff --git a/langs/layers/es.json b/langs/layers/es.json index 96bab0796..6fd2c0855 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -35,6 +35,16 @@ "1": { "title": "un mupi" }, + "10": { + "description": "Se utiliza para carteles publicitarios, letreros de neón, logotipos y carteles en entradas institucionales", + "title": "un lletrer" + }, + "11": { + "title": "una escultura" + }, + "12": { + "title": "una pared pintada" + }, "2": { "title": "un mupi sobre la pared" }, @@ -61,16 +71,6 @@ }, "9": { "title": "un tótem" - }, - "10": { - "description": "Se utiliza para carteles publicitarios, letreros de neón, logotipos y carteles en entradas institucionales", - "title": "un lletrer" - }, - "11": { - "title": "una escultura" - }, - "12": { - "title": "una pared pintada" } }, "tagRenderings": { @@ -165,6 +165,9 @@ "1": { "then": "Esto es un tablón de anuncios" }, + "10": { + "then": "Esto es una pared pintada" + }, "2": { "then": "Esto es una columna" }, @@ -188,9 +191,6 @@ }, "9": { "then": "Esto es un tótem" - }, - "10": { - "then": "Esto es una pared pintada" } }, "question": "¿Qué tipo de elemento publicitario es?", @@ -205,6 +205,9 @@ "1": { "then": "Tablon de anuncios" }, + "10": { + "then": "Pared Pintada" + }, "2": { "then": "Mupi" }, @@ -228,9 +231,6 @@ }, "9": { "then": "Tótem" - }, - "10": { - "then": "Pared Pintada" } } } @@ -312,6 +312,15 @@ "1": { "then": "Mural" }, + "10": { + "then": "Azulejo (Baldosas decorativas Españolas y Portuguesas)" + }, + "11": { + "then": "Cerámica" + }, + "12": { + "then": "Tallado en madera" + }, "2": { "then": "Pintura" }, @@ -335,15 +344,6 @@ }, "9": { "then": "Relieve" - }, - "10": { - "then": "Azulejo (Baldosas decorativas Españolas y Portuguesas)" - }, - "11": { - "then": "Cerámica" - }, - "12": { - "then": "Tallado en madera" } }, "question": "¿Qué tipo de obra es esta pieza?", @@ -1440,6 +1440,27 @@ "0": { "question": "Todos los conectores" }, + "10": { + "question": "Tiene un conector
Tipo 2 con cable (mennekes)
" + }, + "11": { + "question": "Tiene un conector
Tesla Supercharger CCS (un tipo2_css de marca)
" + }, + "12": { + "question": "Tiene un conector
Tesla Supercharger (destination)
" + }, + "13": { + "question": "Tiene un conector
Tesla Supercharger (Destination) (Tipo2 A con un cable de marca tesla)
" + }, + "14": { + "question": "Tiene un conector
USB para cargar teléfonos y dispositivos electrónicos pequeños
" + }, + "15": { + "question": "Tiene un conector
Bosch Active Connect con 3 pines y cable
" + }, + "16": { + "question": "Tiene un conector
Bosch Active Connect con 5 pines y cable
" + }, "2": { "question": "Tiene un conector
enchufe de pared Europeo con un pin de tierra (CEE7/4 tipo E)
" }, @@ -1463,27 +1484,6 @@ }, "9": { "question": "Tiene un conector
Tipo 2 CCS (mennekes)
" - }, - "10": { - "question": "Tiene un conector
Tipo 2 con cable (mennekes)
" - }, - "11": { - "question": "Tiene un conector
Tesla Supercharger CCS (un tipo2_css de marca)
" - }, - "12": { - "question": "Tiene un conector
Tesla Supercharger (destination)
" - }, - "13": { - "question": "Tiene un conector
Tesla Supercharger (Destination) (Tipo2 A con un cable de marca tesla)
" - }, - "14": { - "question": "Tiene un conector
USB para cargar teléfonos y dispositivos electrónicos pequeños
" - }, - "15": { - "question": "Tiene un conector
Bosch Active Connect con 3 pines y cable
" - }, - "16": { - "question": "Tiene un conector
Bosch Active Connect con 5 pines y cable
" } } } @@ -1538,30 +1538,6 @@ "1": { "then": "Enchufe de pared Schuko sin pin de tierra (CEE7/4 tipo F)" }, - "2": { - "then": "Enchufe de pared Europeo con pin de tierra (CEE7/4 tipo E)" - }, - "3": { - "then": "Enchufe de pared Europeo con pin de tierra (CEE7/4 tipo E)" - }, - "4": { - "then": "Chademo" - }, - "5": { - "then": "Chademo" - }, - "6": { - "then": "Tipo 1 con cable (J1772)" - }, - "7": { - "then": "Tipo 1 con cable (J1772)" - }, - "8": { - "then": "Tipo 1 sin cable (J1772)" - }, - "9": { - "then": "Tipo 1 sin cable (J1772)" - }, "10": { "then": "CSS Tipo 1 (también conocido como Tipo 1 Combo)" }, @@ -1592,6 +1568,9 @@ "19": { "then": "Tipo 2 con cable (mennekes)" }, + "2": { + "then": "Enchufe de pared Europeo con pin de tierra (CEE7/4 tipo E)" + }, "20": { "then": "CCS Supercargador Tesla (un tipo2_css con marca)" }, @@ -1622,11 +1601,32 @@ "29": { "then": "Bosch Active Connect con 3 pines y cable" }, + "3": { + "then": "Enchufe de pared Europeo con pin de tierra (CEE7/4 tipo E)" + }, "30": { "then": "Bosch Active Connect con 5 pines y cable" }, "31": { "then": "Bosch Active Connect con 5 pines y cable" + }, + "4": { + "then": "Chademo" + }, + "5": { + "then": "Chademo" + }, + "6": { + "then": "Tipo 1 con cable (J1772)" + }, + "7": { + "then": "Tipo 1 con cable (J1772)" + }, + "8": { + "then": "Tipo 1 sin cable (J1772)" + }, + "9": { + "then": "Tipo 1 sin cable (J1772)" } }, "question": "¿Qué tipo de conexiones de carga están disponibles aquí?" @@ -2021,6 +2021,12 @@ "1": { "then": "Este carril bici está pavimentado" }, + "10": { + "then": "Este carril bici está hecho de gravilla" + }, + "12": { + "then": "Este carril bici está hecho de tierra natural" + }, "2": { "then": "Este carril bici está hecho de asfalto" }, @@ -2035,12 +2041,6 @@ }, "9": { "then": "Este carril bici está hecho de grava" - }, - "10": { - "then": "Este carril bici está hecho de gravilla" - }, - "12": { - "then": "Este carril bici está hecho de tierra natural" } }, "question": "¿De qué superficie está hecho este carril bici?", @@ -2086,6 +2086,9 @@ "1": { "then": "Este carril bici está pavimentado" }, + "10": { + "then": "Este carril bici está hecho de gravilla" + }, "2": { "then": "Este carril bici está hecho de asfalto" }, @@ -2097,9 +2100,6 @@ }, "9": { "then": "Este carril bici está hecho de grava" - }, - "10": { - "then": "Este carril bici está hecho de gravilla" } }, "question": "¿De qué esta hecha la superficie de esta calle?", @@ -2710,6 +2710,18 @@ "0": { "then": "Esto es una pizzería" }, + "10": { + "then": "Aquí se sirven platos Chinos" + }, + "11": { + "then": "Aquí se sirven platos Griegos" + }, + "12": { + "then": "Aquí se sirven platos Indios" + }, + "13": { + "then": "Aquí se sirven platos Turcos" + }, "2": { "then": "Principalmente sirve pasta" }, @@ -2730,18 +2742,6 @@ }, "9": { "then": "Aquí se sirven platos Franceses" - }, - "10": { - "then": "Aquí se sirven platos Chinos" - }, - "11": { - "then": "Aquí se sirven platos Griegos" - }, - "12": { - "then": "Aquí se sirven platos Indios" - }, - "13": { - "then": "Aquí se sirven platos Turcos" } }, "question": "¿Qué comida se sirve aquí?", @@ -3139,6 +3139,19 @@ } } }, + "10": { + "options": { + "0": { + "question": "Todas las notas" + }, + "1": { + "question": "Ocultar las notas de importación" + }, + "2": { + "question": "Solo mostrar las notas de importación" + } + } + }, "2": { "options": { "0": { @@ -3194,19 +3207,6 @@ "question": "Solo mostrar las notas abiertas" } } - }, - "10": { - "options": { - "0": { - "question": "Todas las notas" - }, - "1": { - "question": "Ocultar las notas de importación" - }, - "2": { - "question": "Solo mostrar las notas de importación" - } - } } }, "name": "Notas de OpenStreetMap", @@ -3440,7 +3440,7 @@ } }, "postoffices": { - "description": "Una capa que muestra oficinas de correo.", + "description": "Una capa que muestra oficinas postales.", "name": "Oficinas de correo", "presets": { "0": { @@ -3450,7 +3450,7 @@ "tagRenderings": { "opening_hours": { "override": { - "question": "¿Cuáles son las horas de apertura para esta oficina de correos?" + "question": "¿Cuáles son las horas de apertura para esta oficina postal?" } } }, @@ -3822,21 +3822,6 @@ "1": { "question": "Reciclaje de baterías" }, - "3": { - "question": "Reciclaje de latas" - }, - "4": { - "question": "Reciclaje de ropa" - }, - "5": { - "question": "Reciclaje de aceite de cocina" - }, - "6": { - "question": "Reciclaje de aceite de motor" - }, - "9": { - "question": "Reciclaje de botellas de cristal" - }, "10": { "question": "Reciclaje de cristal" }, @@ -3860,6 +3845,21 @@ }, "18": { "question": "Reciclaje de pequeños electrodomésticos" + }, + "3": { + "question": "Reciclaje de latas" + }, + "4": { + "question": "Reciclaje de ropa" + }, + "5": { + "question": "Reciclaje de aceite de cocina" + }, + "6": { + "question": "Reciclaje de aceite de motor" + }, + "9": { + "question": "Reciclaje de botellas de cristal" } } } @@ -3902,24 +3902,6 @@ "0": { "then": "Aquí se pueden reciclar baterías" }, - "2": { - "then": "Aquí se pueden reciclar latas" - }, - "3": { - "then": "Aquí se puede reciclar ropa" - }, - "4": { - "then": "Aquí se puede reciclar aceite de cocina" - }, - "5": { - "then": "Aquí se puede reciclar aceite de motor" - }, - "8": { - "then": "Aquí se pueden reciclar residuos orgánicos" - }, - "9": { - "then": "Aquí se pueden reciclar botellas de cristal" - }, "10": { "then": "Aquí se puede reciclar cristal" }, @@ -3943,6 +3925,24 @@ }, "19": { "then": "Aquí se pueden reciclar zapatos" + }, + "2": { + "then": "Aquí se pueden reciclar latas" + }, + "3": { + "then": "Aquí se puede reciclar ropa" + }, + "4": { + "then": "Aquí se puede reciclar aceite de cocina" + }, + "5": { + "then": "Aquí se puede reciclar aceite de motor" + }, + "8": { + "then": "Aquí se pueden reciclar residuos orgánicos" + }, + "9": { + "then": "Aquí se pueden reciclar botellas de cristal" } }, "question": "¿Qué se puede reciclar aquí?" @@ -4246,11 +4246,6 @@ "question": "¿De qué color es la luz que emite esta lámpara?", "render": "Esta lámpara emite luz {light:colour}" }, - "count": { - "mappings": { - "0": {} - } - }, "direction": { "question": "¿Hacia donde apunta esta lámpara?", "render": "Esta lámpara apunta hacia {light:direction}" @@ -4291,6 +4286,12 @@ "1": { "then": "Esta lámpara utiliza LEDs" }, + "10": { + "then": "Esta lámpara utiliza lámparas de sodio de alta presión (naranja con blanco)" + }, + "11": { + "then": "Esta lampara se ilumina con gas" + }, "2": { "then": "Esta lámpara utiliza iluminación incandescente" }, @@ -4311,12 +4312,6 @@ }, "9": { "then": "Esta lámpara utiliza lámparas de sodio de baja presión (naranja monocromo)" - }, - "10": { - "then": "Esta lámpara utiliza lámparas de sodio de alta presión (naranja con blanco)" - }, - "11": { - "then": "Esta lampara se ilumina con gas" } }, "question": "¿Qué tipo de iluminación utiliza esta lámpara?" @@ -4708,7 +4703,7 @@ "then": "El árbol está en un jardín privado o residencial." }, "5": { - "then": "El árbol está en bandejón de una avenida." + "then": "Este es un árbol a lo largo de una avenida." }, "6": { "then": "El árbol está en un zona urbana." @@ -4891,4 +4886,4 @@ } } } -} \ No newline at end of file +} From 8eabe873b03cecde18edc39d44027e622cfbce56 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 27 Sep 2023 14:41:23 +0000 Subject: [PATCH 05/17] Translated using Weblate (Dutch) Currently translated at 89.6% (2823 of 3148 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/nl/ --- langs/layers/nl.json | 496 ++++++++++++++++++++++--------------------- 1 file changed, 250 insertions(+), 246 deletions(-) diff --git a/langs/layers/nl.json b/langs/layers/nl.json index 460b43f84..391c14452 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -27,6 +27,9 @@ "advertising": { "name": "Reclame", "presets": { + "12": { + "title": "een muurschildering" + }, "3": { "description": "Een klein uithangbord voor buurtadvertenties, meestal gericht op voetgangers", "title": "een uithangbord" @@ -47,9 +50,6 @@ "8": { "description": "Een stuk groot, weerbestendig textiel met opgedrukte reclameboodschap die permanent aan de muur hangt", "title": "een spandoek" - }, - "12": { - "title": "een muurschildering" } }, "tagRenderings": { @@ -107,6 +107,9 @@ }, "title": { "mappings": { + "10": { + "then": "Muurschildering" + }, "3": { "then": "Aanplakzuil" }, @@ -124,9 +127,6 @@ }, "9": { "then": "Aanplakzuil" - }, - "10": { - "then": "Muurschildering" } } } @@ -208,6 +208,15 @@ "1": { "then": "Muurschildering" }, + "10": { + "then": "Azulejo (Spaanse siertegels)" + }, + "11": { + "then": "Tegelwerk" + }, + "12": { + "then": "Houtsculptuur" + }, "2": { "then": "Schilderij" }, @@ -231,15 +240,6 @@ }, "9": { "then": "Reliëf" - }, - "10": { - "then": "Azulejo (Spaanse siertegels)" - }, - "11": { - "then": "Tegelwerk" - }, - "12": { - "then": "Houtsculptuur" } }, "question": "Wat voor soort kunstwerk is dit?", @@ -1736,6 +1736,27 @@ "1": { "question": "Heeft een
Schuko stekker zonder aardingspin (CEE7/4 type F)
" }, + "10": { + "question": "Heeft een
Type 2 met kabel (J1772)
" + }, + "11": { + "question": "Heeft een
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
" + }, + "12": { + "question": "Heeft een
Tesla Supercharger (destination)
" + }, + "13": { + "question": "Heeft een
Tesla supercharger (destination) (Een Type 2 met kabel en Tesla-logo)
" + }, + "14": { + "question": "Heeft een
USB om GSMs en kleine electronica op te laden
" + }, + "15": { + "question": "Heeft een
Bosch Active Connect met 3 pinnen aan een kabel
" + }, + "16": { + "question": "Heeft een
Bosch Active Connect met 5 pinnen aan een kabel
" + }, "2": { "question": "Heeft een
Europese stekker met aardingspin (CEE7/4 type E)
" }, @@ -1759,27 +1780,6 @@ }, "9": { "question": "Heeft een
Type 2 CCS (mennekes)
" - }, - "10": { - "question": "Heeft een
Type 2 met kabel (J1772)
" - }, - "11": { - "question": "Heeft een
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
" - }, - "12": { - "question": "Heeft een
Tesla Supercharger (destination)
" - }, - "13": { - "question": "Heeft een
Tesla supercharger (destination) (Een Type 2 met kabel en Tesla-logo)
" - }, - "14": { - "question": "Heeft een
USB om GSMs en kleine electronica op te laden
" - }, - "15": { - "question": "Heeft een
Bosch Active Connect met 3 pinnen aan een kabel
" - }, - "16": { - "question": "Heeft een
Bosch Active Connect met 5 pinnen aan een kabel
" } } } @@ -1835,30 +1835,6 @@ "1": { "then": "Schuko stekker zonder aardingspin (CEE7/4 type F)" }, - "2": { - "then": "Europese stekker met aardingspin (CEE7/4 type E)" - }, - "3": { - "then": "Europese stekker met aardingspin (CEE7/4 type E)" - }, - "4": { - "then": "Chademo" - }, - "5": { - "then": "Chademo" - }, - "6": { - "then": "Type 1 met kabel (J1772)" - }, - "7": { - "then": "Type 1 met kabel (J1772)" - }, - "8": { - "then": "Type 1 zonder kabel (J1772)" - }, - "9": { - "then": "Type 1 zonder kabel (J1772)" - }, "10": { "then": "Type 1 CCS (ook gekend als Type 1 Combo)" }, @@ -1889,6 +1865,9 @@ "19": { "then": "Type 2 met kabel (J1772)" }, + "2": { + "then": "Europese stekker met aardingspin (CEE7/4 type E)" + }, "20": { "then": "Tesla Supercharger CCS (een type2 CCS met Tesla-logo)" }, @@ -1919,11 +1898,32 @@ "29": { "then": "Bosch Active Connect met 3 pinnen aan een kabel" }, + "3": { + "then": "Europese stekker met aardingspin (CEE7/4 type E)" + }, "30": { "then": "Bosch Active Connect met 5 pinnen aan een kabel" }, "31": { "then": "Bosch Active Connect met 5 pinnen aan een kabel" + }, + "4": { + "then": "Chademo" + }, + "5": { + "then": "Chademo" + }, + "6": { + "then": "Type 1 met kabel (J1772)" + }, + "7": { + "then": "Type 1 met kabel (J1772)" + }, + "8": { + "then": "Type 1 zonder kabel (J1772)" + }, + "9": { + "then": "Type 1 zonder kabel (J1772)" } }, "question": "Welke laadaansluitingen zijn hier beschikbaar?" @@ -3456,6 +3456,15 @@ "1": { "then": "Dit fietspad is geplaveid" }, + "10": { + "then": "Dit fietspad is gemaakt van fijn grind" + }, + "11": { + "then": "Dit fietspad is gemaakt van kiezelsteentjes" + }, + "12": { + "then": "Dit fietspad is gemaakt van aarde" + }, "2": { "then": "Dit fietspad is gemaakt van asfalt" }, @@ -3479,15 +3488,6 @@ }, "9": { "then": "Dit fietspad is gemaakt van grind" - }, - "10": { - "then": "Dit fietspad is gemaakt van fijn grind" - }, - "11": { - "then": "Dit fietspad is gemaakt van kiezelsteentjes" - }, - "12": { - "then": "Dit fietspad is gemaakt van aarde" } }, "question": "Waaruit is het oppervlak van het fietspad van gemaakt?", @@ -3536,6 +3536,15 @@ "1": { "then": "Dit fietspad is geplaveid" }, + "10": { + "then": "Dit fietspad is gemaakt van fijn grind" + }, + "11": { + "then": "Dit fietspad is gemaakt van kiezelsteentjes" + }, + "12": { + "then": "Dit fietspad is gemaakt van aarde" + }, "2": { "then": "Dit fietspad is gemaakt van asfalt" }, @@ -3559,15 +3568,6 @@ }, "9": { "then": "Dit fietspad is gemaakt van grind" - }, - "10": { - "then": "Dit fietspad is gemaakt van fijn grind" - }, - "11": { - "then": "Dit fietspad is gemaakt van kiezelsteentjes" - }, - "12": { - "then": "Dit fietspad is gemaakt van aarde" } }, "question": "Waaruit is het oppervlak van de straat gemaakt?", @@ -4572,6 +4572,21 @@ "1": { "then": "Dit is een frituur" }, + "10": { + "then": "Dit is een Chinees restaurant" + }, + "11": { + "then": "Dit is een Grieks restaurant" + }, + "12": { + "then": "Dit is een Indisch restaurant" + }, + "13": { + "then": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)" + }, + "14": { + "then": "Dit is een Thaïs restaurant" + }, "2": { "then": "Dit is een pastazaak" }, @@ -4595,21 +4610,6 @@ }, "9": { "then": "Dit is een Frans restaurant" - }, - "10": { - "then": "Dit is een Chinees restaurant" - }, - "11": { - "then": "Dit is een Grieks restaurant" - }, - "12": { - "then": "Dit is een Indisch restaurant" - }, - "13": { - "then": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)" - }, - "14": { - "then": "Dit is een Thaïs restaurant" } }, "question": "Welk soort gerechten worden hier geserveerd?", @@ -5744,6 +5744,19 @@ } } }, + "10": { + "options": { + "0": { + "question": "Alle Notes" + }, + "1": { + "question": "Verberg import Notes" + }, + "2": { + "question": "Toon enkel import Notes" + } + } + }, "2": { "options": { "0": { @@ -5799,19 +5812,6 @@ "question": "Toon enkel open Notes" } } - }, - "10": { - "options": { - "0": { - "question": "Alle Notes" - }, - "1": { - "question": "Verberg import Notes" - }, - "2": { - "question": "Toon enkel import Notes" - } - } } }, "name": "OpenStreetMap Notes", @@ -6107,6 +6107,21 @@ "1": { "then": "Dit is een normale parkeerplek." }, + "10": { + "then": "Deze parkeerplek is gereserveerd voor ouders met kinderen." + }, + "11": { + "then": "Deze parkeerplek is gereserveerd voor personeel." + }, + "12": { + "then": "Deze parkeerplek is gereserveerd voor taxis." + }, + "13": { + "then": "Deze parkeerplek is gereserveerd voor voertuigen met een aanhanger." + }, + "14": { + "then": "Deze parkeerplek is gereserveerd voor autodelen." + }, "2": { "then": "Dit is een gehandicaptenparkeerplaats." }, @@ -6130,21 +6145,6 @@ }, "9": { "then": "Deze parkeerplek is gereserveerd voor motoren." - }, - "10": { - "then": "Deze parkeerplek is gereserveerd voor ouders met kinderen." - }, - "11": { - "then": "Deze parkeerplek is gereserveerd voor personeel." - }, - "12": { - "then": "Deze parkeerplek is gereserveerd voor taxis." - }, - "13": { - "then": "Deze parkeerplek is gereserveerd voor voertuigen met een aanhanger." - }, - "14": { - "then": "Deze parkeerplek is gereserveerd voor autodelen." } }, "question": "Wat voor parkeerplek is dit?" @@ -6705,6 +6705,21 @@ "1": { "then": "Munten van 2 cent worden geaccepteerd" }, + "10": { + "then": "Munten van 20 rappen worden geaccepteerd" + }, + "11": { + "then": "Munten van ½ frank worden geaccepteerd" + }, + "12": { + "then": "Munten van 1 frank worden geaccepteerd" + }, + "13": { + "then": "Munten van 2 frank worden geaccepteerd" + }, + "14": { + "then": "Munten van 5 frank worden geaccepteerd" + }, "2": { "then": "Munten van 5 cent worden geaccepteerd" }, @@ -6728,21 +6743,6 @@ }, "9": { "then": "Munten van 10 rappen worden geaccepteerd" - }, - "10": { - "then": "Munten van 20 rappen worden geaccepteerd" - }, - "11": { - "then": "Munten van ½ frank worden geaccepteerd" - }, - "12": { - "then": "Munten van 1 frank worden geaccepteerd" - }, - "13": { - "then": "Munten van 2 frank worden geaccepteerd" - }, - "14": { - "then": "Munten van 5 frank worden geaccepteerd" } }, "question": "Met welke munten kan je hier betalen?" @@ -6755,6 +6755,15 @@ "1": { "then": "Biljetten van 10 euro worden geaccepteerd" }, + "10": { + "then": "Biljetten van 100 frank worden geaccepteerd" + }, + "11": { + "then": "Biljetten van 200 frank worden geaccepteerd" + }, + "12": { + "then": "Biljetten van 1000 frank worden geaccepteerd" + }, "2": { "then": "Biljetten van 20 euro worden geaccepteerd" }, @@ -6778,15 +6787,6 @@ }, "9": { "then": "Biljetten van 50 frank worden geaccepteerd" - }, - "10": { - "then": "Biljetten van 100 frank worden geaccepteerd" - }, - "11": { - "then": "Biljetten van 200 frank worden geaccepteerd" - }, - "12": { - "then": "Biljetten van 1000 frank worden geaccepteerd" } }, "question": "Met welke bankbiljetten kan je hier betalen?" @@ -7101,30 +7101,6 @@ "1": { "question": "Recycling van batterijen" }, - "2": { - "question": "Recycling van drankpakken" - }, - "3": { - "question": "Recycling van blikken" - }, - "4": { - "question": "Recycling van kleding" - }, - "5": { - "question": "Recycling van frituurvet" - }, - "6": { - "question": "Recycling van motorolie" - }, - "7": { - "question": "Recycling van tl-buizen" - }, - "8": { - "question": "Recycling van groen afval" - }, - "9": { - "question": "Recycling van glazen flessen" - }, "10": { "question": "Recycling van glas" }, @@ -7155,11 +7131,35 @@ "19": { "question": "Recycling van restafval" }, + "2": { + "question": "Recycling van drankpakken" + }, "20": { "question": "Recycling van inktpatronen" }, "21": { "question": "Recycling van fietsen" + }, + "3": { + "question": "Recycling van blikken" + }, + "4": { + "question": "Recycling van kleding" + }, + "5": { + "question": "Recycling van frituurvet" + }, + "6": { + "question": "Recycling van motorolie" + }, + "7": { + "question": "Recycling van tl-buizen" + }, + "8": { + "question": "Recycling van groen afval" + }, + "9": { + "question": "Recycling van glazen flessen" } } }, @@ -7227,30 +7227,6 @@ "1": { "then": "Drankpakken kunnen hier gerecycled worden" }, - "2": { - "then": "Blikken kunnen hier gerecycled worden" - }, - "3": { - "then": "Kleren kunnen hier gerecycled worden" - }, - "4": { - "then": "Frituurvet kan hier gerecycled worden" - }, - "5": { - "then": "Motorolie kan hier gerecycled worden" - }, - "6": { - "then": "TL-buizen kunnen hier gerecycled worden" - }, - "7": { - "then": "Groen afval kan hier gerecycled worden" - }, - "8": { - "then": "Organisch afval kan hier gerecycled worden" - }, - "9": { - "then": "Glazen flessen kunnen hier gerecycled worden" - }, "10": { "then": "Glas kan hier gerecycled worden" }, @@ -7281,6 +7257,9 @@ "19": { "then": "Schoenen kunnen hier gerecycled worden" }, + "2": { + "then": "Blikken kunnen hier gerecycled worden" + }, "20": { "then": "Kleine elektrische apparaten kunnen hier gerecycled worden" }, @@ -7295,6 +7274,27 @@ }, "24": { "then": "Fietsen (en fietswrakken) kunnen hier gerecycled worden" + }, + "3": { + "then": "Kleren kunnen hier gerecycled worden" + }, + "4": { + "then": "Frituurvet kan hier gerecycled worden" + }, + "5": { + "then": "Motorolie kan hier gerecycled worden" + }, + "6": { + "then": "TL-buizen kunnen hier gerecycled worden" + }, + "7": { + "then": "Groen afval kan hier gerecycled worden" + }, + "8": { + "then": "Organisch afval kan hier gerecycled worden" + }, + "9": { + "then": "Glazen flessen kunnen hier gerecycled worden" } }, "question": "Wat kan hier gerecycled worden?" @@ -8021,6 +8021,12 @@ "1": { "then": "Deze lantaarn gebruikt LEDs" }, + "10": { + "then": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)" + }, + "11": { + "then": "Deze lantaarn wordt verlicht met gas" + }, "2": { "then": "Deze lantaarn gebruikt gloeilampen" }, @@ -8044,12 +8050,6 @@ }, "9": { "then": "Deze lantaarn gebruikt lagedruknatriumlampen (monochroom oranje)" - }, - "10": { - "then": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)" - }, - "11": { - "then": "Deze lantaarn wordt verlicht met gas" } }, "question": "Wat voor verlichting gebruikt deze lantaarn?" @@ -8914,10 +8914,14 @@ "tagRenderings": { "all-questions-at-once": { "mappings": { + "0": { + "then": "Toon alle onbeantwoorde vragen" + }, "1": { "then": "Toon de vragen één per één" } - } + }, + "question": "Moeten onbeantwoorde vragen om beurt of allemaal samen getoond worden?" }, "contributor-thanks": { "mappings": { @@ -9009,6 +9013,27 @@ "1": { "question": "Verkoop van dranken" }, + "10": { + "question": "Verkoop van melk" + }, + "11": { + "question": "Verkoop van brood" + }, + "12": { + "question": "Verkoop van eieren" + }, + "13": { + "question": "Verkoop van kaas" + }, + "14": { + "question": "Verkoop van honing" + }, + "15": { + "question": "Verkoop van aardappelen" + }, + "16": { + "question": "Verkoop van bloemen" + }, "2": { "question": "Verkoop van snoep" }, @@ -9032,27 +9057,6 @@ }, "9": { "question": "Verkoop van fietsbinnenbanden" - }, - "10": { - "question": "Verkoop van melk" - }, - "11": { - "question": "Verkoop van brood" - }, - "12": { - "question": "Verkoop van eieren" - }, - "13": { - "question": "Verkoop van kaas" - }, - "14": { - "question": "Verkoop van honing" - }, - "15": { - "question": "Verkoop van aardappelen" - }, - "16": { - "question": "Verkoop van bloemen" } } } @@ -9093,30 +9097,6 @@ "1": { "then": "Snoep wordt verkocht" }, - "2": { - "then": "Eten wordt verkocht" - }, - "3": { - "then": "Sigaretten worden verkocht" - }, - "4": { - "then": "Condooms worden verkocht" - }, - "5": { - "then": "Koffie wordt verkocht" - }, - "6": { - "then": "Drinkwater wordt verkocht" - }, - "7": { - "then": "Kranten worden verkocht" - }, - "8": { - "then": "Binnenbanden voor fietsen worden verkocht" - }, - "9": { - "then": "Melk wordt verkocht" - }, "10": { "then": "Brood wordt verkocht" }, @@ -9143,6 +9123,30 @@ }, "19": { "then": "Vleesproducten worden hier verkocht" + }, + "2": { + "then": "Eten wordt verkocht" + }, + "3": { + "then": "Sigaretten worden verkocht" + }, + "4": { + "then": "Condooms worden verkocht" + }, + "5": { + "then": "Koffie wordt verkocht" + }, + "6": { + "then": "Drinkwater wordt verkocht" + }, + "7": { + "then": "Kranten worden verkocht" + }, + "8": { + "then": "Binnenbanden voor fietsen worden verkocht" + }, + "9": { + "then": "Melk wordt verkocht" } }, "question": "Wat verkoopt deze verkoopautomaat?", @@ -9480,4 +9484,4 @@ } } } -} \ No newline at end of file +} From afaec5fbbc4087e25de339e3dcf9fd8086e4f77c Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 27 Sep 2023 20:38:47 +0000 Subject: [PATCH 06/17] Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/ --- langs/layers/ca.json | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/langs/layers/ca.json b/langs/layers/ca.json index e89503f01..e3906df1d 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -5075,9 +5075,6 @@ "tagRenderings": { "status": { "mappings": { - "0": { - "then": "" - }, "1": { "then": "La tasca està arreglada" }, @@ -5284,13 +5281,6 @@ } } }, - "1": { - "options": { - "0": { - "question": "" - } - } - }, "10": { "options": { "0": { From ac9d353a0f5afe1f5a9e9a42c4e5547e2cf3ab50 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 28 Sep 2023 16:39:33 +0200 Subject: [PATCH 07/17] Version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 66bf5bccb..bc975ef3d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapcomplete", - "version": "0.33.4", + "version": "0.33.5", "repository": "https://github.com/pietervdvn/MapComplete", "description": "A small website to edit OSM easily", "bugs": "https://github.com/pietervdvn/MapComplete/issues", From 300daeff03a0a7dc2096ccb4c6561c6deea1b25a Mon Sep 17 00:00:00 2001 From: paunofu Date: Thu, 28 Sep 2023 10:48:12 +0000 Subject: [PATCH 08/17] Translated using Weblate (Catalan) Currently translated at 87.4% (2752 of 3148 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/ca/ --- langs/layers/ca.json | 95 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 91 insertions(+), 4 deletions(-) diff --git a/langs/layers/ca.json b/langs/layers/ca.json index f88322ac0..39a1facf4 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -2446,10 +2446,31 @@ } }, "climbing_route": { + "name": "Rutes d'escalada", + "presets": { + "0": { + "title": "una ruta d'escalada" + } + }, "tagRenderings": { + "Difficulty": { + "question": "Quin és el grau d'aquesta via d'escalada segons el sistema francès/belga?" + }, + "Length": { + "question": "Quant dura aquesta via d'escalada (en metres)?" + }, "Name": { + "question": "Quin és el nom d'aquesta ruta d'escalada?", "render": "{name}" } + }, + "title": { + "mappings": { + "0": { + "then": "Ruta d'escalada {name}" + } + }, + "render": "Ruta d'escalada" } }, "clock": { @@ -2748,6 +2769,17 @@ } }, "question": "Quin tipus de creuament és aquest?" + }, + "crossing-vibration": { + "mappings": { + "0": { + "then": "El botó d'aquest semàfor té un senyal de vibració per indicar que és segur creuar." + }, + "1": { + "then": "El botó d'aquest semàfor no té cap senyal de vibració que indiqui que és segur creuar." + } + }, + "question": "Aquest semàfor té senyals de vibració per facilitar el pas? (normalment es troba a la part inferior del botó d'encreuament)" } }, "title": { @@ -2812,7 +2844,8 @@ "6": { "then": "Utilitzable per a vehicles tot terreny especialitzats: tractor, ATV" } - } + }, + "question": "Quina és la suavitat d'aquesta via ciclista?" }, "Cycleway:surface": { "mappings": { @@ -2822,14 +2855,32 @@ "1": { "then": "Aquesta via ciclista està pavimentada" }, + "10": { + "then": "Aquesta via ciclista està feta de grava fina" + }, "2": { "then": "Aquesta via ciclista està feta d'asfalt" }, + "3": { + "then": "Aquesta via ciclista està feta de pedres de paviment suaus" + }, "4": { "then": "Aquesta via ciclista està feta de formigó" }, + "5": { + "then": "Aquesta via ciclista està feta de llambordes (sense tallar o muntar)" + }, + "6": { + "then": "Aquesta via ciclista està feta de llambordes naturals" + }, + "7": { + "then": "Aquesta via ciclista està feta de llamborda plana i quadrada" + }, "8": { "then": "Aquesta via ciclista està feta de fusta" + }, + "9": { + "then": "Aquesta via ciclista està feta de grava" } }, "question": "De quina superfície està fet aquesta via ciclista?", @@ -6246,6 +6297,12 @@ "10": { "then": "S'accepten monedes de 20 cèntims" }, + "12": { + "then": "S'accepten monedes d'1 franc" + }, + "13": { + "then": "S'accepten monedes de 2 francs" + }, "14": { "then": "S'accepten monedes de 5 francs" }, @@ -7709,6 +7766,9 @@ }, "question": "Quin tipus de càmera és aquesta?" }, + "Level": { + "render": "Ubicat a la planta {level}" + }, "Operator": { "question": "Qui opera aquest circuit de televisió tancat?", "render": "Operat per {operator}" @@ -8390,7 +8450,16 @@ "description": "Una capa que mostra arbres", "name": "Arbre", "presets": { + "0": { + "description": "Arbre d'una espècie amb fulles, com el roure o el pollancre.", + "title": "un arbre de fulla ampla" + }, + "1": { + "description": "Arbre d'una espècie amb agulles, com el pi o l'avet.", + "title": "un arbre amb fulles d'agulla" + }, "2": { + "description": "Si no esteu segur de si es tracta d'un arbre amb fulles amples o amb fulles d'agulles.", "title": "un arbre" } }, @@ -8401,17 +8470,28 @@ "render": "El tronc de l'arbre té una circumferència de {circumference} metre" }, "height": { - "question": "Quina és l'alçada d'aquest arbre?" + "question": "Quina és l'alçada d'aquest arbre?", + "render": "Aquest arbre té {height} metres d'altura" }, "tree-decidouous": { "mappings": { + "0": { + "then": "Caducifoli: l'arbre perd les fulles durant alguna època de l'any." + }, "1": { "then": "Perenne." } - } + }, + "question": "Aquest arbre és perenne o caducifoli?" }, "tree-denotation": { "mappings": { + "0": { + "then": "L'arbre és notable per la seva mida o per la seva ubicació destacada. És útil per a la navegació." + }, + "1": { + "then": "L'arbre és un monument natural, p. e. perquè és especialment antic o d'una espècie valuosa." + }, "2": { "then": "L'arbre s'utilitza amb finalitats agrícoles, p. en un hort." }, @@ -8426,11 +8506,18 @@ }, "6": { "then": "L'arbre està en una àrea urbana." + }, + "7": { + "then": "L'arbre es troba fora d'una zona urbana." } - } + }, + "question": "Quina importància té aquest arbre? Trieu la primera resposta que correspongui." }, "tree-heritage": { "mappings": { + "0": { + "then": "Registrat com a patrimoni per Onroerend Erfgoed Flandes" + }, "1": { "then": "Registrat com a patrimoni per la Direction du Patrimoine culturel Brussel·les" }, From 52cc5d24fe555bcf6ac1faaf3d07294943db7a49 Mon Sep 17 00:00:00 2001 From: paunofu Date: Thu, 28 Sep 2023 10:32:48 +0000 Subject: [PATCH 09/17] Translated using Weblate (Spanish) Currently translated at 44.8% (1412 of 3148 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/es/ --- langs/layers/es.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/langs/layers/es.json b/langs/layers/es.json index c95048d10..26e439ad5 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -4384,7 +4384,7 @@ }, "Level": { "question": "¿A qué nivel está colocada esta cámara?", - "render": "Está colocada a nivel {level}" + "render": "Ubicado en la planta {level}" }, "Operator": { "question": "¿Quién opera el sistema de esta cámara?", @@ -4683,7 +4683,7 @@ "then": "Siempreverde." } }, - "question": "¿El árbol es Siempreverde o Caduco?" + "question": "¿El árbol es perenne o caduco?" }, "tree-denotation": { "mappings": { From 39087fa7525b1491c5093a81bfe3adbfd1c84713 Mon Sep 17 00:00:00 2001 From: paunofu Date: Mon, 25 Sep 2023 08:34:53 +0000 Subject: [PATCH 10/17] Translated using Weblate (Catalan) Currently translated at 100.0% (484 of 484 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/ca/ --- langs/ca.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/langs/ca.json b/langs/ca.json index 7e9cc090b..4e5b7af5e 100644 --- a/langs/ca.json +++ b/langs/ca.json @@ -406,7 +406,9 @@ "dontDelete": "Cancel·lar", "isDeleted": "Esborrada", "nearby": { - "seeNearby": "Explora i vincula imatges properes" + "link": "Aquesta imatge mostra l'objecte", + "seeNearby": "Explora i vincula imatges properes", + "title": "Imatges a peu de carrer properes" }, "pleaseLogin": "Entrar per pujar una foto", "respectPrivacy": "Respecta la privacitat. No fotografiïs gent o matrícules. No facis servir imatges de Google Maps, Google Streetview o altres fonts amb copyright.", From f983bfe090742c323ac1089ce13be275e7306649 Mon Sep 17 00:00:00 2001 From: paunofu Date: Tue, 26 Sep 2023 06:21:45 +0000 Subject: [PATCH 11/17] Translated using Weblate (Catalan) Currently translated at 100.0% (500 of 500 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/ca/ --- langs/ca.json | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/langs/ca.json b/langs/ca.json index 4e5b7af5e..5ff6fcdd5 100644 --- a/langs/ca.json +++ b/langs/ca.json @@ -344,6 +344,8 @@ }, "useSearch": "Utilitzeu la cerca de dalt per veure els valors predefinits", "useSearchForMore": "Utilitzeu la funció de cerca per cercar dins de {total} valors més…", + "waitingForGeopermission": "Esperant al vostre permís per a utilitzar la geolocalització…", + "waitingForLocation": "Buscant la vostra ubicació actual…", "weekdays": { "abbreviations": { "friday": "Div", @@ -380,6 +382,7 @@ "born": "Nascut: {value}", "died": "Mort: {value}" }, + "readMore": "Llig la resta de l'article", "searchToShort": "La vostra consulta de cerca és massa curta, introduïu un text més llarg", "searchWikidata": "Cercar a Wikidata", "wikipediaboxTitle": "Viquipèdia" @@ -413,6 +416,22 @@ "pleaseLogin": "Entrar per pujar una foto", "respectPrivacy": "Respecta la privacitat. No fotografiïs gent o matrícules. No facis servir imatges de Google Maps, Google Streetview o altres fonts amb copyright.", "toBig": "La teva imatge és massa gran ara que medeix {actual_size}. Usa imatges de com a molt {max_size}", + "upload": { + "failReasons": "És possible que hàgiu perdut la connexió a Internet", + "failReasonsAdvanced": "Com a alternativa, assegureu-vos que el vostre navegador i les extensions no bloquegen les API de tercers.", + "multiple": { + "done": "{count} imatges s'han penjat correctament. Gràcies!", + "partiallyDone": "S'estan penjant {count} imatges, {done} imatges s'hanpenjat…", + "someFailed": "Ho sentim, no hem pogut penjar {count} imatges", + "uploading": "S'estan penjant {count} imatges…" + }, + "one": { + "done": "La teva imatge s'ha penjat correctament. Gràcies!", + "failed": "Ho sentim, no hem pogut penjar la teva imatge", + "retrying": "La teva imatge està tornant a penjar-se…", + "uploading": "La teva imatge s'està penjant…" + } + }, "uploadDone": "La teva imatge ha estat afegida. Gràcies per ajudar!", "uploadFailed": "No s'ha pogut pujar la imatge. Tens Internet i es permeten API de tercers? El navegador Brave o UMatrix podria bloquejar-les.", "uploadMultipleDone": "S'han afegit {count} imatges. Gràcies per ajudar!", @@ -498,7 +517,9 @@ }, "plantDetection": { "back": "Tornar a la visió general de les espècies", + "button": "Detecta automàticament les espècies vegetals mitjançant la IA de Plantnet.org", "confirm": "Seleccioneu espècies", + "done": "S'ha aplicat l'espècie", "error": "S'ha produït un error en detectar l'espècie d'arbre: {error}", "howTo": { "intro": "Per obtenir resultats òptims,", @@ -515,7 +536,8 @@ "poweredByPlantnet": "Desenvolupat per plantnet.org", "querying": "Consultant a plantnet.org amb {length} imatges", "seeInfo": "Veure més informació sobre l'espècie", - "takeImages": "Feu imatges de l'arbre per detectar automàticament el tipus d'arbre" + "takeImages": "Feu imatges de l'arbre per detectar automàticament el tipus d'arbre", + "tryAgain": "Seleccioneu una espècie diferent" }, "privacy": { "editing": "Quan facis un canvi al mapa, aquest canvi es registra a OpenStreetMap i està disponible públicament per a tothom. Un conjunt de canvis fet amb MapComplete inclou les dades següents:
  • Els canvis que has fet
  • El teu nom d'usuari
  • Quan es fa aquest canvi
  • La petició que vas utilitzar mentre feies el canvi
  • L'idioma de la interfície d'usuari
  • Una indicació de la proximitat a la que estaves dels objectes canviats. Altres mapejadors poden utilitzar aquesta informació per determinar si es va fer un canvi basant-se en una enquesta o en una investigació remota
Consulta la política de privadesa a OpenStreetMap.org per obtenir informació detallada. Ens agradaria recordar-te que pots utilitzar un nom de ficció quan et registris.", @@ -543,14 +565,14 @@ "title": "{count} revisions", "title_singular": "Una revisió", "tos": "Si crees una ressenya estàs d'acord amb els Termes de Servei i política de privacitat de Mangrove.reviews", - "write_a_comment": "Deixa una revisió…" + "write_a_comment": "Deixa una ressenya…" }, "split": { "cancel": "Cancel·lar", - "hasBeenSplit": "Has tallat aquesta via", + "hasBeenSplit": "Aquesta via s'ha dividit", "inviteToSplit": "Talla aquesta carretera en trossos més petits. Això et permetrà afegir informacions diferents a les parts.", - "loginToSplit": "Has d'entrar per poder tallar una carretera", - "split": "Tallar", + "loginToSplit": "Has d'entrar per poder dividir una carretera", + "split": "Dividir", "splitAgain": "Torneu a dividir aquesta carretera", "splitTitle": "Trieu al mapa on canvien les propietats d'aquesta carretera" }, @@ -570,7 +592,7 @@ }, "validation": { "color": { - "description": "Un color o codi hex" + "description": "Un color o codi hexadecimal" }, "date": { "description": "Una data, començant per l'any" From 5549ef2cd4253976b0e17aa7617dfa68fc129d7b Mon Sep 17 00:00:00 2001 From: kjon Date: Mon, 25 Sep 2023 16:59:17 +0000 Subject: [PATCH 12/17] Translated using Weblate (German) Currently translated at 97.6% (488 of 500 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/ --- langs/de.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/langs/de.json b/langs/de.json index 2c18b8185..93c229561 100644 --- a/langs/de.json +++ b/langs/de.json @@ -155,13 +155,13 @@ "mapillaryHelp": "Mapillary ist ein Online-Dienst, der Straßenbilder sammelt und sie unter einer freien Lizenz anbietet. Mitwirkende dürfen diese Bilder verwenden, um OpenStreetMap zu verbessern", "openIssueTracker": "Fehler melden", "openMapillary": "Mapillary öffnen", - "openOsmcha": "Letzte Bearbeitungen zum Thema {theme} ansehen", + "openOsmcha": "Neueste Bearbeitungen mit {theme} ansehen", "themeBy": "Dieses Thema wurde erstellt von {author}", "title": "Copyright und Urheberrechtsangabe", "translatedBy": "MapComplete wurde übersetzt von {contributors} und {hiddenCount} weiteren Personen" }, "back": "Zurück", - "backToIndex": "Zurück zur Übersicht aller thematischen Karten", + "backToIndex": "Zur Übersicht aller Themenkarten", "backgroundMap": "Hintergrundkarte auswählen", "backgroundSwitch": "Hintergrund wechseln", "cancel": "Abbrechen", @@ -344,6 +344,8 @@ }, "useSearch": "Verwenden Sie die Suche oben, um Voreinstellungen anzuzeigen", "useSearchForMore": "Verwenden Sie die Suchfunktion, um innerhalb von {total} weitere Werte zu suchen…", + "waitingForGeopermission": "Warten auf Ihre Erlaubnis, Standortdaten zu verwenden…", + "waitingForLocation": "Ihr Standort wird gesucht…", "weekdays": { "abbreviations": { "friday": "Fr", @@ -380,6 +382,7 @@ "born": "Geboren am: {value}", "died": "Gestorben am: {value}" }, + "readMore": "Weiterlesen", "searchToShort": "Ihre Suchanfrage ist zu kurz, geben Sie einen längeren Text ein", "searchWikidata": "Wikidata durchsuchen", "wikipediaboxTitle": "Wikipedia" @@ -413,6 +416,9 @@ "pleaseLogin": "Bitte anmelden, um ein Bild hinzuzufügen", "respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.", "toBig": "Ihr Bild ist mit {actual_size} zu groß. Die maximale Bildgröße ist {max_size}", + "upload": { + "failReasons": "Keine Internetverbindung" + }, "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!", "uploadFailed": "Das Bild konnte nicht hochladen werden. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.", "uploadMultipleDone": "{count} Bilder wurden hinzugefügt. Vielen Dank für die Hilfe!", @@ -533,7 +539,7 @@ }, "reviews": { "affiliated_reviewer_warning": "(Partner-Rezension)", - "attribution": "Rezensionen werden bereitgestellt von Mangrove Reviews und sind unter CC-BY 4.0 verfügbar.", + "attribution": "Rezensionen von Mangrove Reviews sind unter CC-BY 4.0 verfügbar.", "i_am_affiliated": "Ich bin an diesem Objekt beteiligt
Auswählen, wenn Sie Eigentümer, Ersteller, Angestellter … sind", "name_required": "Der Name des Objekts ist erforderlich, um Bewertungen zu erstellen und anzuzeigen", "no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!", From 99d288656ccc9e3b34ec25bc952e7766d0ffd355 Mon Sep 17 00:00:00 2001 From: paunofu Date: Tue, 26 Sep 2023 06:28:49 +0000 Subject: [PATCH 13/17] Translated using Weblate (Spanish) Currently translated at 74.6% (373 of 500 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/es/ --- langs/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/langs/es.json b/langs/es.json index 9522e2660..7e30fd52c 100644 --- a/langs/es.json +++ b/langs/es.json @@ -424,7 +424,7 @@ }, "split": { "cancel": "Cancelar", - "hasBeenSplit": "Esta característica se ha separado", + "hasBeenSplit": "Esta vía se ha dividido", "inviteToSplit": "Dividir esta carretera en segmentos más pequeños. Esto te permite darle propiedades diferentes a partes diferentes de la carretera.", "loginToSplit": "Debes de haber iniciado sesión para dividir una carretera", "split": "Dividir", From 5a2c2a860f5b3b806023a90a3e974c09c7c4e9b1 Mon Sep 17 00:00:00 2001 From: kjon Date: Wed, 27 Sep 2023 18:18:13 +0000 Subject: [PATCH 14/17] Translated using Weblate (German) Currently translated at 100.0% (425 of 425 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/de/ --- langs/themes/de.json | 70 ++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/langs/themes/de.json b/langs/themes/de.json index d528c5bb6..e0c713f2b 100644 --- a/langs/themes/de.json +++ b/langs/themes/de.json @@ -452,7 +452,7 @@ "title": "Kletterhallen, Vereine und Kletterstellen" }, "clock": { - "description": "Karte mit allen öffentlichen Uhren", + "description": "Eine Karte mit öffentlichen Uhren", "title": "Uhren" }, "cycle_highways": { @@ -608,8 +608,8 @@ "title": "Bildungseinrichtungen" }, "elongated_coin": { - "description": "Finde Münzpresse um deine eigenen Prägemünzen zu Pressen.", - "title": "Münzpressen" + "description": "Finde Automaten um Souvenirmünzen zu prägen.", + "title": "Münzprägeautomaten" }, "etymology": { "description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, und wurden mit Wikidata verknüpft. Im Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.

Sie können auch einen Beitrag leisten! Wenn Sie weit genug hinein zoomen werden alle Straßen angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.", @@ -991,6 +991,33 @@ "onwheels": { "description": "Auf dieser Karte können Sie öffentlich zugängliche Orte für Rollstuhlfahrer ansehen, bearbeiten oder hinzufügen", "layers": { + "19": { + "override": { + "=title": { + "render": "Statistik" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "Import" + } + } + }, + "1": { + "render": { + "special": { + "message": "Alle vorgeschlagenen Tags hinzufügen" + } + } + } + } + } + }, "4": { "override": { "filter": { @@ -1033,33 +1060,6 @@ "override": { "name": "Barrierefreie Parkplätze" } - }, - "19": { - "override": { - "=title": { - "render": "Statistik" - } - } - }, - "20": { - "override": { - "+tagRenderings": { - "0": { - "render": { - "special": { - "text": "Import" - } - } - }, - "1": { - "render": { - "special": { - "message": "Alle vorgeschlagenen Tags hinzufügen" - } - } - } - } - } } }, "title": "Auf Rädern" @@ -1220,10 +1220,6 @@ "stations": { "description": "Bahnhofsdetails ansehen, bearbeiten und hinzufügen", "layers": { - "3": { - "description": "Ebene mit Bahnhöfen", - "name": "Bahnhöfe" - }, "16": { "description": "Anzeigen der Züge, die von diesem Bahnhof abfahren", "name": "Abfahrtstafeln", @@ -1255,6 +1251,10 @@ "title": { "render": "Abfahrtstafel" } + }, + "3": { + "description": "Ebene mit Bahnhöfen", + "name": "Bahnhöfe" } }, "title": "Bahnhöfe" @@ -1350,4 +1350,4 @@ "shortDescription": "Eine Karte mit Abfalleimern", "title": "Abfalleimer" } -} \ No newline at end of file +} From f960f5befe6996d855d1f3a3d78544709b52002a Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 28 Sep 2023 14:53:01 +0000 Subject: [PATCH 15/17] Translated using Weblate (Catalan) Currently translated at 87.3% (2752 of 3149 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/ca/ --- langs/layers/ca.json | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/langs/layers/ca.json b/langs/layers/ca.json index 39a1facf4..aaf35b26e 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -6467,27 +6467,6 @@ } } }, - "single_level": { - "mappings": { - "0": { - "then": "Situat a planta subterrani" - }, - "1": { - "then": "Situat a planta zero" - }, - "2": { - "then": "Situat a la planta zero" - }, - "3": { - "then": "Situat a primera planta" - }, - "4": { - "then": "Localitzat a la planta base" - } - }, - "question": "A quina planta està situat aquest element?", - "render": "Situat a la planta {level}" - }, "luminous_or_lit": { "mappings": { "0": { @@ -7605,7 +7584,7 @@ } }, "question": "Quin color de llum emet aquest fanal?", - "render": "Aquesta làmpada emet llum {light:color}" + "render": "Aquesta làmpada emet llum {light:colour}" }, "count": { "mappings": { From 8ef9b48e2bd75839fe650bf1a3edecb1849973ca Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 28 Sep 2023 16:56:25 +0200 Subject: [PATCH 16/17] Chore: translation sync --- assets/layers/barrier/barrier.json | 2 +- assets/layers/bench/bench.json | 4 +- assets/layers/birdhide/birdhide.json | 9 +- .../layers/climbing_route/climbing_route.json | 21 +- assets/layers/crossings/crossings.json | 9 +- .../cycleways_and_roads.json | 21 +- assets/layers/elevator/elevator.json | 12 +- .../layers/elongated_coin/elongated_coin.json | 80 +-- assets/layers/etymology/etymology.json | 5 +- assets/layers/filters/filters.json | 3 +- .../fitness_station/fitness_station.json | 33 +- assets/layers/food/food.json | 6 +- assets/layers/icons/icons.json | 6 +- .../kindergarten_childcare.json | 3 +- assets/layers/map/map.json | 30 +- assets/layers/maproulette/maproulette.json | 3 +- .../maproulette_challenge.json | 33 +- .../layers/nature_reserve/nature_reserve.json | 27 +- assets/layers/note/note.json | 30 +- .../observation_tower/observation_tower.json | 2 +- .../parking_ticket_machine.json | 6 +- assets/layers/pharmacy/pharmacy.json | 24 +- .../physiotherapist/physiotherapist.json | 18 +- assets/layers/picnic_table/picnic_table.json | 18 +- assets/layers/playground/playground.json | 15 +- assets/layers/postoffices/postoffices.json | 21 +- assets/layers/questions/questions.json | 31 +- assets/layers/shelter/shelter.json | 3 +- assets/layers/stairs/stairs.json | 36 +- assets/layers/street_lamps/street_lamps.json | 43 +- .../surveillance_camera.json | 51 +- .../tertiary_education.json | 9 +- .../layers/ticket_machine/ticket_machine.json | 3 +- .../toilet_at_amenity/toilet_at_amenity.json | 14 +- assets/layers/trail/trail.json | 15 +- .../layers/transit_routes/transit_routes.json | 15 +- .../layers/transit_stops/transit_stops.json | 30 +- assets/layers/tree_node/tree_node.json | 64 ++- assets/layers/usersettings/usersettings.json | 30 +- .../vending_machine/vending_machine.json | 21 +- assets/themes/clock/clock.json | 2 +- .../themes/elongated_coin/elongated_coin.json | 4 +- langs/layers/ca.json | 498 ++++++++--------- langs/layers/de.json | 510 +++++++++--------- langs/layers/en.json | 91 ++++ langs/layers/es.json | 293 +++++----- langs/layers/nl.json | 490 ++++++++--------- langs/themes/de.json | 64 +-- 48 files changed, 1550 insertions(+), 1208 deletions(-) diff --git a/assets/layers/barrier/barrier.json b/assets/layers/barrier/barrier.json index f6c9cfab5..f3112f601 100644 --- a/assets/layers/barrier/barrier.json +++ b/assets/layers/barrier/barrier.json @@ -190,7 +190,7 @@ "da": "En cyklist kan ikke cykle forbi denne.", "es": "Un ciclista no puede pasar esto.", "cs": "Cyklista tudy nemůže projet.", - "ca": "Un ciclista pot passar-hi." + "ca": "Un ciclista no pot passar-hi." } } ], diff --git a/assets/layers/bench/bench.json b/assets/layers/bench/bench.json index 9bea58a07..7c69a231f 100644 --- a/assets/layers/bench/bench.json +++ b/assets/layers/bench/bench.json @@ -925,7 +925,9 @@ "if": "tourism=", "then": { "en": "This bench probably doesn't have an integrated artwork", - "nl": "Deze bank heeft waarschijnlijk geen geïntegreerd kunstwerk" + "nl": "Deze bank heeft waarschijnlijk geen geïntegreerd kunstwerk", + "ca": "Aquest banc probablement no té cap obra d'art integrada", + "de": "Die Bank hat vermutlich kein integriertes Kunstwerk" }, "hideInAnswer": true } diff --git a/assets/layers/birdhide/birdhide.json b/assets/layers/birdhide/birdhide.json index a1a1b9e77..897ba0d1b 100644 --- a/assets/layers/birdhide/birdhide.json +++ b/assets/layers/birdhide/birdhide.json @@ -71,7 +71,8 @@ "nl": "Vogelkijkwand {name}", "de": "Vogelversteck {name}", "fr": "Camouflage d’observation ornithologique {name}", - "da": "Fugletårn {name}" + "da": "Fugletårn {name}", + "ca": "Observatori d'ocells {name}" } } ] @@ -109,7 +110,8 @@ "nl": "Vogelkijkwand", "de": "Sichtschutz zur Vogelbeobachtung", "fr": "Camouflage d’observation ornithologique", - "da": "Fugletårn" + "da": "Fugletårn", + "ca": "Observatori d'ocells" } }, { @@ -171,7 +173,8 @@ "nl": "Is deze vogelkijkplaats rolstoeltoegankelijk?", "da": "Er dette fugleskjul tilgængeligt for kørestolsbrugere?", "de": "Ist der Ort rollstuhlgerecht gestaltet?", - "fr": "Cet observatoire ornithologique est-il accessible en chaise roulante ?" + "fr": "Cet observatoire ornithologique est-il accessible en chaise roulante ?", + "ca": "Aquest observatori d'ocells és accessible per als usuaris de cadira de rodes?" }, "mappings": [ { diff --git a/assets/layers/climbing_route/climbing_route.json b/assets/layers/climbing_route/climbing_route.json index 2183d5370..770181dcf 100644 --- a/assets/layers/climbing_route/climbing_route.json +++ b/assets/layers/climbing_route/climbing_route.json @@ -7,7 +7,8 @@ "ja": "登坂ルート", "nb_NO": "Klatreruter", "fr": "Voies d’escalade", - "it": "Vie di arrampicata" + "it": "Vie di arrampicata", + "ca": "Rutes d'escalada" }, "description": { "en": "A single climbing route and its properties. Some properties are derived from the containing features", @@ -32,7 +33,8 @@ "nb_NO": "Klatrerute", "it": "Via di arrampicata", "fr": "Voie d’escalade", - "da": "Klatrerute" + "da": "Klatrerute", + "ca": "Ruta d'escalada" }, "mappings": [ { @@ -44,7 +46,8 @@ "ja": "登坂ルート{name}", "it": "Via di arrampicata {name}", "fr": "Voie d’escalade {name}", - "da": "Klatrerute {name}" + "da": "Klatrerute {name}", + "ca": "Ruta d'escalada {name}" } } ] @@ -73,7 +76,8 @@ "it": "Come si chiama questa via di arrampicata?", "fr": "Quel est le nom de cette voie d’escalade ?", "nb_NO": "Hva er navnet på denne klatreruten?", - "da": "Hvad hedder denne klatrerute?" + "da": "Hvad hedder denne klatrerute?", + "ca": "Quin és el nom d'aquesta ruta d'escalada?" }, "freeform": { "key": "name" @@ -108,7 +112,8 @@ "fr": "Quelle est la longueur de cette voie (en mètres) ?", "de": "Wie lang ist diese Kletterroute (in Metern)?", "nb_NO": "Hvor mange meter er klatreruten?", - "da": "Hvor lang er denne klatrerute (i meter)?" + "da": "Hvor lang er denne klatrerute (i meter)?", + "ca": "Quant dura aquesta via d'escalada (en metres)?" }, "render": { "de": "Diese Route ist {canonical(climbing:length)} lang", @@ -131,7 +136,8 @@ "nl": "Hoe moeilijk is deze klimroute volgens het Franse/Belgische systeem?", "it": "Qual è la difficoltà di questa via di arrampicata nel sistema francese/belga?", "fr": "Quelle est la difficulté de cette voie selon le système franco-belge ?", - "de": "Wie hoch ist der Schwierigkeitsgrad dieser Kletterroute nach dem französisch/belgischen System?" + "de": "Wie hoch ist der Schwierigkeitsgrad dieser Kletterroute nach dem französisch/belgischen System?", + "ca": "Quin és el grau d'aquesta via d'escalada segons el sistema francès/belga?" }, "render": { "de": "Die Schwierigkeit ist {climbing:grade:french} entsprechend des französisch/belgischen Systems", @@ -208,7 +214,8 @@ "nl": "een klimroute", "fr": "une voie d’escalade", "de": "eine Kletterroute", - "it": "una via di arrampicata" + "it": "una via di arrampicata", + "ca": "una ruta d'escalada" }, "snapToLayer": [ "climbing_opportunity" diff --git a/assets/layers/crossings/crossings.json b/assets/layers/crossings/crossings.json index 9cad9e3c4..84e500529 100644 --- a/assets/layers/crossings/crossings.json +++ b/assets/layers/crossings/crossings.json @@ -438,7 +438,8 @@ "en": "Does this traffic light have vibration signals to aid crossing? (usually located at the bottom of the crossing button)", "de": "Gibt die Ampel ein Vibrationssignal, um das Überqueren zu erleichtern? (in der Regel am unteren Ende der Ampeltaste)", "nl": "Heeft dit verkeerslicht een element dat trilt om te helpen bij het oversteken? (meestal onderaan de oversteekknop geplaatst)", - "fr": "Est-ce que ce feu a un signal vibrant pour aider à traverser ? (habituellement situé sous le bouton)" + "fr": "Est-ce que ce feu a un signal vibrant pour aider à traverser ? (habituellement situé sous le bouton)", + "ca": "Aquest semàfor té senyals de vibració per facilitar el pas? (normalment es troba a la part inferior del botó d'encreuament)" }, "condition": { "and": [ @@ -453,7 +454,8 @@ "en": "The button for this traffic light has a vibration signal to indicate that it is safe to cross.", "de": "Die Ampeltaste vibriert während der Grünphase.", "nl": "De knop bij dit verkeerslicht trilt om aan te geven dat men veilig kan oversteken.", - "fr": "Le bouton de ce feu vibre pour indiquer qu'on peut traverser en sécurité." + "fr": "Le bouton de ce feu vibre pour indiquer qu'on peut traverser en sécurité.", + "ca": "El botó d'aquest semàfor té un senyal de vibració per indicar que és segur creuar." }, "icon": { "path": "./assets/layers/crossings/Vibrating_button_illustration.jpg", @@ -466,7 +468,8 @@ "en": "The button for this traffic light does not have a vibration signal to indicate that it is safe to cross.", "de": "Die Ampeltaste vibriert nicht während der Grünphase.", "nl": "De knop bij dit verkeerslicht kan niet trillen om aan te geven dat men veilig kan oversteken.", - "fr": "Le bouton de ce feu ne vibre pas pour indiquer qu'on peut traverser en sécurité." + "fr": "Le bouton de ce feu ne vibre pas pour indiquer qu'on peut traverser en sécurité.", + "ca": "El botó d'aquest semàfor no té cap senyal de vibració que indiqui que és segur creuar." } } ] diff --git a/assets/layers/cycleways_and_roads/cycleways_and_roads.json b/assets/layers/cycleways_and_roads/cycleways_and_roads.json index 458573007..3dc0d7350 100644 --- a/assets/layers/cycleways_and_roads/cycleways_and_roads.json +++ b/assets/layers/cycleways_and_roads/cycleways_and_roads.json @@ -577,7 +577,8 @@ "nl": "Dit fietspad is gemaakt van straatstenen", "de": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen", "es": "Este carril bici está hecho de piedras de pavimento suaves", - "fr": "Cette piste cyclable est faite de petits pavés" + "fr": "Cette piste cyclable est faite de petits pavés", + "ca": "Aquesta via ciclista està feta de pedres de paviment suaus" } }, { @@ -597,7 +598,8 @@ "en": "This cycleway is made of cobblestone (unhewn or sett)", "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)", "de": "Dieser Radweg besteht aus Kopfsteinpflaster", - "fr": "Cette piste cyclable est faite de pavés (taillé ou non)" + "fr": "Cette piste cyclable est faite de pavés (taillé ou non)", + "ca": "Aquesta via ciclista està feta de llambordes (sense tallar o muntar)" }, "hideInAnswer": true }, @@ -607,7 +609,8 @@ "en": "This cycleway is made of raw, natural cobblestone", "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien", "de": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster", - "fr": "Cette piste cyclable est en pavés bruts et naturels" + "fr": "Cette piste cyclable est en pavés bruts et naturels", + "ca": "Aquesta via ciclista està feta de llambordes naturals" } }, { @@ -616,7 +619,8 @@ "en": "This cycleway is made of flat, square cobblestone", "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien", "de": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster", - "fr": "Cette piste cyclable est en pavés plats ou carrés" + "fr": "Cette piste cyclable est en pavés plats ou carrés", + "ca": "Aquesta via ciclista està feta de llamborda plana i quadrada" } }, { @@ -637,7 +641,8 @@ "nl": "Dit fietspad is gemaakt van grind", "de": "Der Radweg ist aus Schotter", "es": "Este carril bici está hecho de grava", - "fr": "Cette piste cyclable est faite en graviers" + "fr": "Cette piste cyclable est faite en graviers", + "ca": "Aquesta via ciclista està feta de grava" } }, { @@ -647,7 +652,8 @@ "nl": "Dit fietspad is gemaakt van fijn grind", "de": "Dieser Radweg besteht aus feinem Schotter", "es": "Este carril bici está hecho de gravilla", - "fr": "Cette piste cyclable est faite en graviers fins" + "fr": "Cette piste cyclable est faite en graviers fins", + "ca": "Aquesta via ciclista està feta de grava fina" } }, { @@ -686,7 +692,8 @@ "nl": "Wat is de kwaliteit van dit fietspad?", "de": "Wie eben ist dieser Radweg?", "es": "¿Cual es la suavidad de este carril bici?", - "fr": "Quel est l'état de la piste cyclable ?" + "fr": "Quel est l'état de la piste cyclable ?", + "ca": "Quina és la suavitat d'aquesta via ciclista?" }, "condition": { "or": [ diff --git a/assets/layers/elevator/elevator.json b/assets/layers/elevator/elevator.json index 4a00a45ce..af6b24e5f 100644 --- a/assets/layers/elevator/elevator.json +++ b/assets/layers/elevator/elevator.json @@ -165,19 +165,22 @@ { "id": "tactile_writing_available", "question": { - "en": "Has this elevator tactile writing?" + "en": "Has this elevator tactile writing?", + "ca": "Aquest ascensor té escriptura tàctil?" }, "mappings": [ { "if": "tactile_writing:braille=yes", "then": { - "en": "This elevator has tactile writing in Braille" + "en": "This elevator has tactile writing in Braille", + "ca": "L'ascensor té escriptura tàctil en Braille" } }, { "if": "tactile_writing:braille=no", "then": { - "en": "This elevator does not have tactile writing" + "en": "This elevator does not have tactile writing", + "ca": "Aquest ascensor no té escriptura tàctil" } } ] @@ -218,7 +221,8 @@ }, "questionHint": { "en": "E.g. it announces the current floor", - "de": "Z.B. werden Stockwerke angesagt" + "de": "Z.B. werden Stockwerke angesagt", + "ca": "P. e. anuncia la planta actual" }, "mappings": [ { diff --git a/assets/layers/elongated_coin/elongated_coin.json b/assets/layers/elongated_coin/elongated_coin.json index 872bb92a3..d7276f390 100644 --- a/assets/layers/elongated_coin/elongated_coin.json +++ b/assets/layers/elongated_coin/elongated_coin.json @@ -2,13 +2,13 @@ "id": "elongated_coin", "name": { "en": "Penny Presses", - "de": "Münzpressen", + "de": "Münzprägeautomaten", "es": "Prensas de centavo", "ca": "Premses de cèntims" }, "description": { "en": "Layer showing penny presses.", - "de": "Ebene mit Münzpressen.", + "de": "Ebene mit Münzprägeautomaten.", "es": "Capa que muestra prensas de centavos.", "ca": "Capa que mostra premses de cèntims." }, @@ -23,7 +23,7 @@ "title": { "render": { "en": "Penny Press", - "de": "Münzpresse", + "de": "Prägeautomat", "es": "Prensa de centavo", "ca": "Premsa de cèntims" } @@ -51,7 +51,7 @@ }, "render": { "en": "This penny press has {coin:design_count} designs available.", - "de": "Die Münzpresse hat {coin:design_count} Motive zur Auswahl.", + "de": "Der Prägeautomat hat {coin:design_count} Motive zur Auswahl.", "es": "Esta prensa tiene {coin:design_count} diseños disponibles.", "ca": "Esta premsa té {coin:design_count} dissenys disponibles." }, @@ -60,7 +60,7 @@ "if": "coin:design_count=1", "then": { "en": "This penny press has one design available.", - "de": "Die Münzpresse hat ein Motiv zur Auswahl.", + "de": "Der Prägeautomat hat ein Motiv zur Auswahl.", "es": "Esta prensa tiene un diseño disponible.", "ca": "Esta premsa té un disseny disponible." } @@ -69,7 +69,7 @@ "if": "coin:design_count=2", "then": { "en": "This penny press has two designs available.", - "de": "Die Münzpresse hat zwei Motive zur Auswahl.", + "de": "Der Prägeautomat hat zwei Motive zur Auswahl.", "es": "Esta prensa tiene dos diseños disponibles.", "ca": "Esta premsa té dos dissenys disponibles." } @@ -78,7 +78,7 @@ "if": "coin:design_count=3", "then": { "en": "This penny press has three designs available.", - "de": "Die Münzpresse hat drei Motive zur Auswahl.", + "de": "Der Prägeautomat hat drei Motive zur Auswahl.", "es": "Esta prensa tiene tres diseños disponibles.", "ca": "Esta premsa té tres dissenys disponibles." } @@ -87,7 +87,7 @@ "if": "coin:design_count=4", "then": { "en": "This penny press has four designs available.", - "de": "Die Münzpresse hat vier Motive zur Auswahl.", + "de": "Der Prägeautomat hat vier Motive zur Auswahl.", "es": "Esta prensa tiene cuatro diseños disponibles.", "ca": "Esta premsa té quatre dissenys disponibles." } @@ -97,25 +97,33 @@ { "id": "fee", "question": { - "en": "Does it cost money to press a penny?" + "en": "Does it cost money to press a penny?", + "ca": "Costa diners premsar una moneda?", + "de": "Ist das Prägen kostenpflichtig?" }, "mappings": [ { "if": "fee=", "then": { - "en": "It costs money to press a penny." + "en": "It costs money to press a penny.", + "ca": "Costa diners premsar una moneda.", + "de": "Das Prägen ist kostenpflichtig." } }, { "if": "fee=yes", "then": { - "en": "It costs money to press a penny." + "en": "It costs money to press a penny.", + "ca": "Costa diners premsar una moneda.", + "de": "Das Prägen ist kostenpflichtig." } }, { "if": "fee=no", "then": { - "en": "It is free to press a penny." + "en": "It is free to press a penny.", + "ca": "És gratuït premsar una moneda.", + "de": "Das Prägen ist kostenlos." }, "addExtraTags": [ "payment:qr_code=", @@ -142,7 +150,7 @@ "id": "coin", "question": { "en": "What coin is used for pressing?", - "de": "Welche Münze wird zum Pressen verwendet?", + "de": "Welche Münzen können geprägt werden?", "es": "Qué moneda se utiliza para prensar?", "ca": "Quina moneda s'utilitza per a premsar?" }, @@ -162,7 +170,7 @@ "if": "coin:type=2cent", "then": { "en": "This penny press uses a 2 cent coin for pressing.", - "de": "Die Münzpresse benötigt eine 2 Cent Münze um zu Pressen.", + "de": "Der Automat prägt 2 Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda de 2 centavos para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de 2 cèntims per a premsar." }, @@ -177,7 +185,7 @@ "if": "coin:type=5cent", "then": { "en": "This penny press uses a 5 cent coin for pressing.", - "de": "Die Münzpresse benötigt eine 5 Cent Münze um zu Pressen.", + "de": "Der Automat prägt 5 Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda de 5 centavos para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de 5 cèntims per a premsar." }, @@ -192,7 +200,7 @@ "if": "coin:type=10cent", "then": { "en": "This penny press uses a 10 cent coin for pressing.", - "de": "Die Münzpresse benötigt eine 10 Cent Münze um zu Pressen.", + "de": "Der Automat prägt 10 Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda de 10 centavos para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de 10 cèntims per a premsar." }, @@ -207,7 +215,7 @@ "if": "coin:type=25cent", "then": { "en": "This penny press uses a 25 cent coin for pressing.", - "de": "Die Münzpresse benötigt eine 25 Cent Münze um zu Pressen.", + "de": "Der Automat prägt 25 Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda de 25 centavos para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de 20 cèntims per a premsar." }, @@ -217,7 +225,7 @@ "if": "coin:type=50cent", "then": { "en": "This penny press uses a 50 cent coin for pressing.", - "de": "Die Münzpresse benötigt eine 50 Cent Münze um zu Pressen.", + "de": "Der Automat prägt 50 Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda de 50 centavos para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de 50 cèntims per a premsar." }, @@ -226,21 +234,25 @@ { "if": "coin:type=10centimes", "then": { - "en": "This penny press uses a 10 centimes coin for pressing." + "en": "This penny press uses a 10 centimes coin for pressing.", + "ca": "Esta premsa de cèntims utilitza una moneda de 10 cèntims per a premsar.", + "de": "Der Automat prägt 10 Centime Münzen." }, "hideInAnswer": "_currency!~.*CHF.*" }, { "if": "coin:type=20centimes", "then": { - "en": "This penny press uses a 20 centimes coin for pressing." + "en": "This penny press uses a 20 centimes coin for pressing.", + "ca": "Esta premsa de cèntims utilitza una moneda de 20 cèntims per a premsar.", + "de": "Der Automat prägt 5 Centime Münzen." }, "hideInAnswer": "_currency!~.*CHF.*" } ], "render": { "en": "This penny press uses a {coin:type} coin for pressing.", - "de": "Die Münzpresse benötigt eine {coin:type} Münze um zu Pressen.", + "de": "Der Automat prägt {coin:type} Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda {coin:type} para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de {coin:type} per a premsar." } @@ -256,7 +268,7 @@ }, "question": { "en": "How much does it cost to press a penny?", - "de": "Wieviel kostet es eine Münze zu Pressen?", + "de": "Wieviel kostet die Prägung einer Münze?", "es": "¿Cuánto cuesta prensar un centavo?", "ca": "Quant costa premsar un cèntim?" }, @@ -264,7 +276,7 @@ "key": "charge", "placeholder": { "en": "Cost (e.g. 0.50 EUR)", - "de": "Einwurf (z.B. 0,5€)", + "de": "Gebühr (z.B. 0,50 €)", "fr": "Coût (par ex. 0.50 EUR)", "es": "Costo (por ejemplo, 0.50 euros)", "ca": "Cost (p. e, 0.50 euros)" @@ -275,7 +287,7 @@ "if": "charge=1 EUR", "then": { "en": "It costs 1 euro to press a penny.", - "de": "Eine Münze zu Pressen kostet 1 Euro.", + "de": "Die Prägung einer Münze kostet 1,00 €.", "es": "Cuesta 1 euro prensar un centavo.", "ca": "Costa 1 euro premsar un cèntim." }, @@ -285,7 +297,7 @@ "if": "charge=2 EUR", "then": { "en": "It costs 2 euros to press a penny.", - "de": "Eine Münze zu Pressen kostet 2€.", + "de": "Die Prägung einer Münze kostet 2,00 €.", "es": "Cuesta 2 euros prensa un centavo.", "ca": "Costa 2 euros premsar un cèntim." }, @@ -294,21 +306,25 @@ { "if": "charge=2 CHF", "then": { - "en": "It costs 2 Swiss francs to press a penny." + "en": "It costs 2 Swiss francs to press a penny.", + "ca": "Costa 2 francs suïssos premsar un cèntim.", + "de": "Die Prägung einer Münze kostet 2 Schweizer Franken." }, "hideInAnswer": "_currency!~.*CHF.*" }, { "if": "charge=1 CHF", "then": { - "en": "It costs 1 Swiss franc to press a penny." + "en": "It costs 1 Swiss franc to press a penny.", + "ca": "Costa 1 franc suís premsar un cèntim.", + "de": "Die Prägung einer Münze kostet 1 Schweizer Franken." }, "hideInAnswer": "_currency!~.*CHF.*" } ], "render": { "en": "It costs {charge} to press a penny.", - "de": "Es kostet {charge}€ um eine Münze zu Pressen.", + "de": "Die Prägung einer Münze kostet {charge}.", "es": "Cuesta {charge} prensar un centavo.", "ca": "Costa {charge} premsar un cèntim." } @@ -318,7 +334,7 @@ "id": "indoor", "question": { "en": "Is the penny press indoors?", - "de": "Befindet sich die Münzpresse im Inneren?", + "de": "Befindet sich der Prägeautomat im Inneren?", "es": "La prensa de centavo esta al interior?", "ca": "La premsa de cèntims està a l'interior?" }, @@ -327,7 +343,7 @@ "if": "indoor=yes", "then": { "en": "This penny press is located indoors.", - "de": "Die Münzpresse befindet sich im Inneren.", + "de": "Der Prägeautomat befindet sich im Inneren.", "es": "Esta prensa está ubicada en interior.", "ca": "Esta premsa està ubicada en interior." } @@ -336,7 +352,7 @@ "if": "indoor=no", "then": { "en": "This penny press is located outdoors.", - "de": "Die Münzpresse befindet sich Draußen.", + "de": "Der Prägeautomat befindet sich im Freien.", "es": "Esta prensa está ubicada al aire libre.", "ca": "Esta premsa està ubicada a l'exterior." } @@ -365,7 +381,7 @@ { "title": { "en": "a penny press", - "de": "Eine Münzpresse", + "de": "Einen Münzprägeautomaten", "es": "una prensa de centavo", "ca": "una premsa de cèntim" }, diff --git a/assets/layers/etymology/etymology.json b/assets/layers/etymology/etymology.json index aee734eda..bb6dd7dc1 100644 --- a/assets/layers/etymology/etymology.json +++ b/assets/layers/etymology/etymology.json @@ -46,7 +46,7 @@ }, { "id": "wikipedia-etymology", - "condition": "name~*", + "condition": "name:etymology!=unknown", "question": { "en": "What is the Wikidata-item that this object is named after?", "nl": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?", @@ -165,8 +165,7 @@ "de": "

Wikipedia Artikel zur Namensherkunft

{wikipedia(name:etymology:wikidata):max-height:20rem}", "fr": "

Article Wikipedia de la référence au nom

{wikipedia(name:etymology:wikidata):max-height:20rem}", "ca": "

Article de la Viquipèdia del nom donant

{wikipedia(name:etymology:wikidata):max-height:20rem}" - }, - "condition": "name:etymology!=unknown" + } }, { "id": "zoeken op inventaris onroerend erfgoed", diff --git a/assets/layers/filters/filters.json b/assets/layers/filters/filters.json index 551ef6897..8d7dc27d1 100644 --- a/assets/layers/filters/filters.json +++ b/assets/layers/filters/filters.json @@ -233,7 +233,8 @@ "nl": "Gratis toegankelijk", "de": "Nutzung kostenlos", "fr": "Utilisation gratuite", - "da": "Gratis at bruge" + "da": "Gratis at bruge", + "ca": "Ús gratuït" }, "osmTags": { "or": [ diff --git a/assets/layers/fitness_station/fitness_station.json b/assets/layers/fitness_station/fitness_station.json index 1166f1638..ed5668e8c 100644 --- a/assets/layers/fitness_station/fitness_station.json +++ b/assets/layers/fitness_station/fitness_station.json @@ -130,7 +130,8 @@ "if": "fitness_station=stretch_bars", "then": { "en": "This fitness station has bars for stretching.", - "de": "Die Fitness-Station hat Stangen zum Dehnen." + "de": "Die Fitness-Station hat Stangen zum Dehnen.", + "ca": "Aquesta estació de fitness disposa de barres per fer estiraments." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_stretch_bars.jpg", @@ -141,7 +142,8 @@ "if": "fitness_station=hyperextension", "then": { "en": "This fitness station has a station for making hyperextensions.", - "de": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." + "de": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions).", + "ca": "Aquesta estació de fitness disposa d'una estació per fer hiperextensions." }, "icon": { "path": "./assets/layers/fitness_station/Inclined_sit-up_and_hyperextension_bench.jpg", @@ -152,7 +154,8 @@ "if": "fitness_station=rings", "then": { "en": "This fitness station has rings for gymnastic exercises.", - "de": "Die Fitness-Station hat Ringe für Gymnastikübungen." + "de": "Die Fitness-Station hat Ringe für Gymnastikübungen.", + "ca": "Aquesta estació de fitness disposa d'anelles per fer exercicis de gimnàstica." }, "icon": { "path": "./assets/layers/fitness_station/Exercise9159.jpg", @@ -163,7 +166,8 @@ "if": "fitness_station=horizontal_ladder", "then": { "en": "This fitness station has a horizontal ladder, also known as monkey bars.", - "de": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." + "de": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars).", + "ca": "Aquest gimnàs té una escala horitzontal, també coneguda com a barres de mico." }, "icon": { "path": "./assets/layers/fitness_station/Horizontal_ladder.jpg", @@ -174,7 +178,8 @@ "if": "fitness_station=wall_bars", "then": { "en": "This fitness station has wall bars to climb on.", - "de": "Die Fitness-Station hat eine Sprossenwand zum Klettern." + "de": "Die Fitness-Station hat eine Sprossenwand zum Klettern.", + "ca": "Aquesta estació de fitness té barres per pujar-hi." }, "icon": { "path": "./assets/layers/fitness_station/RIAN_archive_493268_Sports_at_a_kindergarten.jpg", @@ -185,7 +190,8 @@ "if": "fitness_station=slalom", "then": { "en": "This fitness station has posts for performing slalom exercises.", - "de": "Die Fitness-Station hat Pfosten für Slalomübungen." + "de": "Die Fitness-Station hat Pfosten für Slalomübungen.", + "ca": "Aquesta estació de fitness té llocs per fer exercicis d'eslàlom." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_slalom.jpg", @@ -196,7 +202,8 @@ "if": "fitness_station=stepping_stones", "then": { "en": "This fitness station has stepping stones.", - "de": "Die Fitness-Station hat Trittsteine." + "de": "Die Fitness-Station hat Trittsteine.", + "ca": "Aquesta estació de gimnàs té esglaons." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_stepping_stone.jpg", @@ -207,7 +214,8 @@ "if": "fitness_station=leapfrog", "then": { "en": "This fitness station has cones for performing leapfrog jumps.", - "de": "Die Fitness-Station hat Hütchen für Bocksprünge." + "de": "Die Fitness-Station hat Hütchen für Bocksprünge.", + "ca": "Aquesta estació de fitness disposa de cons per fer salts de granota." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_leapfrog.jpg", @@ -218,7 +226,8 @@ "if": "fitness_station=beam_jump", "then": { "en": "This fitness station has beams to jump over.", - "de": "Die Fitness-Station hat Balken zum überspringen." + "de": "Die Fitness-Station hat Balken zum überspringen.", + "ca": "Aquesta estació de fitness té bigues per saltar." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_beam_jump.jpg", @@ -229,7 +238,8 @@ "if": "fitness_station=hurdling", "then": { "en": "This fitness station has hurdles to cross.", - "de": "Die Fitnessstation hat Hürden zum überspringen." + "de": "Die Fitnessstation hat Hürden zum überspringen.", + "ca": "Aquesta estació de fitness té obstacles per a travesar." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_hurdling.jpg", @@ -240,7 +250,8 @@ "if": "fitness_station=wall", "then": { "en": "This fitness station has a wall to climb on.", - "de": "Die Fitness-Station hat eine Kletterwand." + "de": "Die Fitness-Station hat eine Kletterwand.", + "ca": "Aquesta estació de fitness té una paret per enfilar-se." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_wall.jpg", diff --git a/assets/layers/food/food.json b/assets/layers/food/food.json index bac347058..40806ade3 100644 --- a/assets/layers/food/food.json +++ b/assets/layers/food/food.json @@ -1012,7 +1012,8 @@ "options": [ { "question": { - "en": "Restaurants and fast food businesses" + "en": "Restaurants and fast food businesses", + "ca": "Restaurants i negocis de menjar ràpid" } }, { @@ -1043,7 +1044,8 @@ { "question": { "en": "Has a vegetarian menu", - "nl": "Heeft een vegetarisch menu" + "nl": "Heeft een vegetarisch menu", + "ca": "Té menú vegetarià" }, "osmTags": { "or": [ diff --git a/assets/layers/icons/icons.json b/assets/layers/icons/icons.json index dd1efb4e3..91b2da863 100644 --- a/assets/layers/icons/icons.json +++ b/assets/layers/icons/icons.json @@ -164,12 +164,12 @@ { "if": "dog=no", "#": "ignore-image-in-then", - "then": "no_dogs" + "then": "no_dogs" }, { "if": "dog=leashed", "#": "ignore-image-in-then", - "then": "dogs are allowed but leashed" + "then": "dogs are allowed but leashed" }, { "if": { @@ -179,7 +179,7 @@ ] }, "#": "ignore-image-in-then", - "then": "dogs are allowed" + "then": "dogs are allowed" } ] }, diff --git a/assets/layers/kindergarten_childcare/kindergarten_childcare.json b/assets/layers/kindergarten_childcare/kindergarten_childcare.json index 638d16f99..23a52be38 100644 --- a/assets/layers/kindergarten_childcare/kindergarten_childcare.json +++ b/assets/layers/kindergarten_childcare/kindergarten_childcare.json @@ -47,7 +47,8 @@ "en": "What type of facility is this?", "nl": "Wat voor faciliteit is dit?", "de": "Um welche Art von Einrichtung handelt es sich?", - "pl": "Jaki to rodzaj placówki?" + "pl": "Jaki to rodzaj placówki?", + "ca": "Quin tipus d'instal·lació és aquesta?" }, "mappings": [ { diff --git a/assets/layers/map/map.json b/assets/layers/map/map.json index 41177739e..babc2c896 100644 --- a/assets/layers/map/map.json +++ b/assets/layers/map/map.json @@ -52,7 +52,8 @@ "question": { "en": "What type of map is shown?", "de": "Was für eine Karte ist das?", - "pl": "Jaki rodzaj mapy jest pokazany?" + "pl": "Jaki rodzaj mapy jest pokazany?", + "ca": "Quin tipus de mapa es mostra?" }, "mappings": [ { @@ -68,7 +69,8 @@ "then": { "en": "A map with all streets or ways of an area.

The streets are mostly named; the angles, distances etc. are accurate

", "de": "Eine Karte mit allen Straßen und Wegen eines Gebietes.

Die Straßen sind meist benannt; die Winkel, die Entfernungen, etc. stimmen

", - "pl": "Mapa z wszystkimi ulicami i ścieżkami w danym obszarze.

Ulica w większości mają nazwy; kąty, odległości itp. są poprawne

" + "pl": "Mapa z wszystkimi ulicami i ścieżkami w danym obszarze.

Ulica w większości mają nazwy; kąty, odległości itp. są poprawne

", + "ca": "Un mapa amb tots els carrers o camins d'una àrea.

Els carrers estan majoritàriament nomenats; els angles, distàncies etc. són acurades

" } }, { @@ -84,7 +86,8 @@ "if": "map_type=toposcope", "then": { "en": "This is a toposcope.

A marker erected on high places which indicates the direction to notable landscape features which can be seen from that point

", - "de": "Dies ist ein Toposkop.

Eine Markierung, die an hohen Stellen angebracht ist und die Richtung zu wichtigen Landschaftsobjekten anzeigt, die von diesem Punkt aus gesehen werden können

" + "de": "Dies ist ein Toposkop.

Eine Markierung, die an hohen Stellen angebracht ist und die Richtung zu wichtigen Landschaftsobjekten anzeigt, die von diesem Punkt aus gesehen werden können

", + "ca": "Això és un toposcope.

Un marcador erigit en llocs alts que indica la direcció cap als elements paisatgístics notables que es poden veure des d'aquest punt

" } } ] @@ -190,7 +193,8 @@ "fr": "Cette carte est basée sur {map_source}", "de": "Diese Karte basiert auf {map_source}", "es": "Este mapa se basa en {map_source}", - "pl": "Ta mapa bazuje na {map_source}" + "pl": "Ta mapa bazuje na {map_source}", + "ca": "Aquest mapa està basat en {map_source}" }, "id": "map-map_source" }, @@ -205,7 +209,8 @@ "it": "L’attribuzione a OpenStreetMap è presente?", "de": "Ist die OpenStreetMap-Attribution vorhanden?", "fr": "L’attribution à OpenStreetMap est elle-présente ?", - "es": "¿Hay una atribución a OpenStreetMap?" + "es": "¿Hay una atribución a OpenStreetMap?", + "ca": "Hi ha atribució a OpenStreetMap?" }, "mappings": [ { @@ -221,7 +226,8 @@ "de": "OpenStreetMap ist eindeutig attributiert, einschließlich der ODBL-Lizenz", "fr": "L’attribution est clairement inscrite ainsi que la licence ODBL", "es": "Se atribuye claramente a OpenStreetMap, incluyendo la licencia ODBL", - "pl": "Źródło, czyli OpenStreetMap, jest w widoczny sposób podane, zawiera informację o licencji ODBL" + "pl": "Źródło, czyli OpenStreetMap, jest w widoczny sposób podane, zawiera informację o licencji ODBL", + "ca": "OpenStreetMap està clarament atribuït, incloent la llicència ODBL" } }, { @@ -236,7 +242,8 @@ "it": "L’attribuzione a OpenStreetMap è chiaramente specificata ma la licenza non compare", "de": "OpenStreetMap ist eindeutig attributiert, aber die Lizenz wird nicht erwähnt", "fr": "L’attribution est clairement inscrite mais la licence est absente", - "es": "Se atribuya claramente a OpenStreetMap, pero no se menciona la licencia" + "es": "Se atribuya claramente a OpenStreetMap, pero no se menciona la licencia", + "ca": "OpenStreetMap està clarament atribuït, però no es menciona la llicència" } }, { @@ -251,7 +258,8 @@ "it": "Non era presente alcun cenno a OpenStreetMap ma qualcuno vi ha attaccato un adesivo di OpenStreetMap", "de": "OpenStreetMap wurde nicht erwähnt, aber jemand hat einen OpenStreetMap-Aufkleber darauf geklebt", "fr": "OpenStreetMap n’est pas mentionné, un sticker OpenStreetMap a été collé", - "es": "No se mencionaba OpenStreetMap, pero alguien le pegó una pegatina de OpenStreetMap" + "es": "No se mencionaba OpenStreetMap, pero alguien le pegó una pegatina de OpenStreetMap", + "ca": "OpenStreetMap no es mencionava, però algú hi ha posat una enganxina d'OpenStreetMap" } }, { @@ -266,7 +274,8 @@ "it": "Non c’è alcuna attribuzione", "fr": "Il n'y a aucune attribution", "de": "Es gibt überhaupt keine Namensnennung", - "es": "No hay atribución" + "es": "No hay atribución", + "ca": "No hi ha atribució" } }, { @@ -281,7 +290,8 @@ "it": "Non c’è alcuna attribuzione", "fr": "Il n'y a aucune attribution", "de": "Es gibt überhaupt keine Namensnennung", - "es": "No hay atribución" + "es": "No hay atribución", + "ca": "No hi ha atribució" }, "hideInAnswer": true } diff --git a/assets/layers/maproulette/maproulette.json b/assets/layers/maproulette/maproulette.json index 81aff2b28..2e5e10776 100644 --- a/assets/layers/maproulette/maproulette.json +++ b/assets/layers/maproulette/maproulette.json @@ -89,7 +89,8 @@ "en": "Task is a false positive", "de": "Aufgabe ist ein falsches Positiv", "nl": "Taak was vals positief", - "pl": "Zadanie jest fałszywie pozytywne" + "pl": "Zadanie jest fałszywie pozytywne", + "ca": "La tasca és un fals positiu" } }, { diff --git a/assets/layers/maproulette_challenge/maproulette_challenge.json b/assets/layers/maproulette_challenge/maproulette_challenge.json index cdf9cad3f..2617f910d 100644 --- a/assets/layers/maproulette_challenge/maproulette_challenge.json +++ b/assets/layers/maproulette_challenge/maproulette_challenge.json @@ -94,7 +94,8 @@ "then": { "en": "Task is fixed", "de": "Aufgabe wurde erledigt", - "nl": "Taak is opgelost" + "nl": "Taak is opgelost", + "ca": "La tasca està arreglada" } }, { @@ -102,7 +103,8 @@ "then": { "en": "Task is a false positive", "de": "Aufgabe ist ein falsches Positiv", - "nl": "Taak is vals positief" + "nl": "Taak is vals positief", + "ca": "La tasca és un fals positiu" } }, { @@ -110,7 +112,8 @@ "then": { "en": "Task is skipped", "de": "Aufgabe wurde übersprungen", - "nl": "Taak is overgeslagen" + "nl": "Taak is overgeslagen", + "ca": "S'ha saltat la tasca" } }, { @@ -118,7 +121,8 @@ "then": { "en": "Task is deleted", "de": "Aufgabe wurde gelöscht", - "nl": "Taak is verwijderd" + "nl": "Taak is verwijderd", + "ca": "S'ha suprimit la tasca" } }, { @@ -126,7 +130,8 @@ "then": { "en": "Task is already fixed", "de": "Aufgabe wurde bereits erledigt", - "nl": "Taak is al opgelost" + "nl": "Taak is al opgelost", + "ca": "La tasca ja està arreglada" } }, { @@ -134,7 +139,8 @@ "then": { "en": "Task is marked as too hard", "de": "Aufgabe wurde als zu schwer markiert", - "nl": "Taak is gemarkeerd als te lastig" + "nl": "Taak is gemarkeerd als te lastig", + "ca": "La tasca està marcada com a massa difícil" } }, { @@ -142,7 +148,8 @@ "then": { "en": "Task is disabled", "de": "Aufgabe wurde deaktiviert", - "nl": "Taak is uitgeschakeld" + "nl": "Taak is uitgeschakeld", + "ca": "La tasca està desactivada" } } ] @@ -203,7 +210,8 @@ "question": { "en": "Show tasks that are deleted", "de": "Aufgaben anzeigen, die gelöscht wurden", - "nl": "Toon taken die zijn verwijderd" + "nl": "Toon taken die zijn verwijderd", + "ca": "Mostra tasques eliminades" }, "osmTags": "mr_taskStatus=Deleted" }, @@ -211,7 +219,8 @@ "question": { "en": "Show tasks that are already fixed", "de": "Aufgaben anzeigen, die bereits erledigt wurden", - "nl": "Toon taken die reeds opgelost waren" + "nl": "Toon taken die reeds opgelost waren", + "ca": "Mostra les tasques que ja estan arreglades" }, "osmTags": "mr_taskStatus=Already fixed" }, @@ -219,7 +228,8 @@ "question": { "en": "Show tasks that are marked as too hard", "de": "Aufgaben anzeigen, die als zu schwierig markiert wurden", - "nl": "Toon taken die als te moeilijk waren ervaren" + "nl": "Toon taken die als te moeilijk waren ervaren", + "ca": "Mostra les tasques marcades com a massa difícils" }, "osmTags": "mr_taskStatus=Too hard" }, @@ -227,7 +237,8 @@ "question": { "en": "Show tasks that are disabled", "de": "Aufgaben anzeigen, die deaktiviert wurden", - "nl": "Toon taken die zijn uitgeschakeld" + "nl": "Toon taken die zijn uitgeschakeld", + "ca": "Mostra tasques que s'han desactivat" }, "osmTags": "mr_taskStatus=Disabled" } diff --git a/assets/layers/nature_reserve/nature_reserve.json b/assets/layers/nature_reserve/nature_reserve.json index c6838d304..f17040421 100644 --- a/assets/layers/nature_reserve/nature_reserve.json +++ b/assets/layers/nature_reserve/nature_reserve.json @@ -29,7 +29,8 @@ "render": { "nl": "Natuurgebied", "en": "Nature reserve", - "de": "Naturschutzgebiet" + "de": "Naturschutzgebiet", + "ca": "Reserva Natural" }, "mappings": [ { @@ -167,7 +168,8 @@ "en": "Operated by {operator}", "nl": "Beheer door {operator}", "de": "Betrieben von {operator}", - "es": "Operado por {operator}" + "es": "Operado por {operator}", + "ca": "Gestionat per {operator}" }, "question": { "en": "Who operates this area?", @@ -205,7 +207,8 @@ "en": "Operated by {operator}", "nl": "Dit gebied wordt beheerd door {operator}", "de": "Betrieben von {operator}", - "es": "Operado por {operator}" + "es": "Operado por {operator}", + "ca": "Gestionat per {operator}" }, "icon": "./assets/layers/nature_reserve/Natuurpunt.jpg", "hideInAnswer": true @@ -239,7 +242,8 @@ "nl": "Wat is de naam van dit gebied?", "en": "What is the name of this area?", "de": "Wie heißt das Gebiet?", - "es": "¿Cual es el nombre de esta área?" + "es": "¿Cual es el nombre de esta área?", + "ca": "Quin és el nom d'aquesta àrea?" }, "freeform": { "key": "name", @@ -264,7 +268,8 @@ "en": "This area doesn't have a name", "nl": "Dit gebied heeft geen naam", "de": "Das Gebiet hat keinen Namen", - "es": "Esta área no tiene un nombre" + "es": "Esta área no tiene un nombre", + "ca": "Aquesta àrea no té un nom" } } ], @@ -276,7 +281,8 @@ "en": "Are dogs allowed in this nature reserve?", "it": "I cani sono ammessi in questa riserva naturale?", "fr": "Les chiens sont-ils autorisés dans cette réserve naturelle ?", - "de": "Sind Hunde in diesem Naturschutzgebiet erlaubt?" + "de": "Sind Hunde in diesem Naturschutzgebiet erlaubt?", + "ca": "Els gossos estan permesos en aquesta reserva natural?" }, "condition": { "or": [ @@ -318,7 +324,8 @@ "it": "I cani sono liberi di girare liberi", "fr": "Les chiens sont autorisés à se promener librement", "de": "Hunde dürfen frei herumlaufen", - "es": "Los perros pueden ir sueltos" + "es": "Los perros pueden ir sueltos", + "ca": "Els gossos poden anar solts" } } ], @@ -413,7 +420,8 @@ "en": "Extra information: {description}", "nl": "Extra info: {description}", "de": "Zusätzliche Informationen: {description}", - "es": "Información adicional: {description}" + "es": "Información adicional: {description}", + "ca": "Informació adicional: {description}" }, "freeform": { "key": "description" @@ -432,7 +440,8 @@ "en": "Extra info: {description:0}", "nl": "Extra info: {description:0}", "de": "Zusätzliche Informationen: {description:0}", - "es": "Información adicional: {description:0}" + "es": "Información adicional: {description:0}", + "ca": "Informació adicional: {description:0}" }, "freeform": { "key": "description:0" diff --git a/assets/layers/note/note.json b/assets/layers/note/note.json index eb71c8c5e..ea7b296fe 100644 --- a/assets/layers/note/note.json +++ b/assets/layers/note/note.json @@ -149,7 +149,8 @@ "en": "Should mention {search} in the first comment", "nl": "Moet in de eerste opmerking \"{search}\" bevatten", "de": "Sollte {search} im ersten Kommentar erwähnen", - "es": "Debe mencionar {search} en el primer comentario" + "es": "Debe mencionar {search} en el primer comentario", + "ca": "Has de mencionar {search} en el primer comentari" } } ] @@ -188,7 +189,8 @@ "nl": "Geopend door bijdrager {search}", "de": "Erstellt von {search}", "es": "Abierto por el contributor {search}", - "fr": "Ouverte par {search}" + "fr": "Ouverte par {search}", + "ca": "Obert pel contribuïdor {search}" } } ] @@ -207,7 +209,8 @@ "en": "Not opened by contributor {search}", "nl": "Niet geopend door bijdrager {search}", "de": "Nicht erstellt von {search}", - "es": "No abierto por el contributor {search}" + "es": "No abierto por el contributor {search}", + "ca": "No obert pel contribuïdor {search}" } } ] @@ -226,7 +229,8 @@ "en": "Last edited by contributor {search}", "nl": "Laatst bewerkt door bijdrager {search}", "de": "Zuletzt bearbeitet von {search}", - "es": "Editada por última vez por el contributor {search}" + "es": "Editada por última vez por el contributor {search}", + "ca": "Editat per última vega pel contribuïdor {search}" } } ] @@ -245,7 +249,8 @@ "en": "Opened after {search}", "nl": "Geopend na {search}", "de": "Zuletzt bearbeitet nach dem {search}", - "es": "Abierta después de {search}" + "es": "Abierta después de {search}", + "ca": "Oberta després de {search}" } } ] @@ -265,7 +270,8 @@ "en": "Created before {search}", "nl": "Aangemaakt voor {search}", "de": "Erstellt vor dem {search}", - "es": "Creada antes de {search}" + "es": "Creada antes de {search}", + "ca": "Creada abans de {search}" } } ] @@ -285,7 +291,8 @@ "en": "Created after {search}", "nl": "Aangemaakt na {search}", "de": "Erstellt nach dem {search}", - "es": "Creada después de {search}" + "es": "Creada después de {search}", + "ca": "Creada després de {search}" } } ] @@ -299,7 +306,8 @@ "en": "Only show notes opened by an anonymous contributor", "nl": "Toon enkel de Notes geopend door een anonieme bijdrager", "de": "Nur Notizen anzeigen, die anonym erstellt wurden", - "es": "Solo mostrar las notas abiertas por contributores anómimos" + "es": "Solo mostrar las notas abiertas por contributores anómimos", + "ca": "Sols mostrar les notes obertes per contribuïdors anònims" } } ] @@ -313,7 +321,8 @@ "en": "Only show open notes", "nl": "Toon enkel open Notes", "de": "Nur offene Notizen anzeigen", - "es": "Solo mostrar las notas abiertas" + "es": "Solo mostrar las notas abiertas", + "ca": "Sols mostra les notes obertes" } } ] @@ -326,7 +335,8 @@ "en": "All Notes", "nl": "Alle Notes", "de": "Alle Notizen", - "es": "Todas las notas" + "es": "Todas las notas", + "ca": "Totes les notes" } }, { diff --git a/assets/layers/observation_tower/observation_tower.json b/assets/layers/observation_tower/observation_tower.json index bb8c0c59e..8dcb8842e 100644 --- a/assets/layers/observation_tower/observation_tower.json +++ b/assets/layers/observation_tower/observation_tower.json @@ -282,7 +282,7 @@ "de": "Betrieben von {operator}", "es": "Mantenida por {operator}", "pl": "Obsługiwana przez {operator}", - "ca": "Mantés per {operator}" + "ca": "Mantés per {operator}" }, "freeform": { "key": "operator" diff --git a/assets/layers/parking_ticket_machine/parking_ticket_machine.json b/assets/layers/parking_ticket_machine/parking_ticket_machine.json index 854a25729..e723f9eb8 100644 --- a/assets/layers/parking_ticket_machine/parking_ticket_machine.json +++ b/assets/layers/parking_ticket_machine/parking_ticket_machine.json @@ -15,7 +15,8 @@ "render": { "en": "Parking Ticket Machine", "nl": "Parkeerkaartautomaat", - "de": "Parkscheinautomat" + "de": "Parkscheinautomat", + "ca": "Màquina de bitllets d'aparcament" } }, "source": { @@ -51,7 +52,8 @@ "question": { "en": "What is the reference number of this parking ticket machine?", "nl": "Wat is het referentienummer van deze parkeerkaartautomaat?", - "de": "Wie lautet die Referenznummer dieses Parkscheinautomaten?" + "de": "Wie lautet die Referenznummer dieses Parkscheinautomaten?", + "ca": "Quin és el número de referència d'aquesta màquina de bitllets d'aparcament?" }, "freeform": { "key": "ref", diff --git a/assets/layers/pharmacy/pharmacy.json b/assets/layers/pharmacy/pharmacy.json index 1fd320d76..95d8ffbb3 100644 --- a/assets/layers/pharmacy/pharmacy.json +++ b/assets/layers/pharmacy/pharmacy.json @@ -12,14 +12,16 @@ "en": "A layer showing pharmacies, which (probably) dispense prescription drugs", "de": "Eine Ebene mit Apotheken, die (wahrscheinlich) verschreibungspflichtige Medikamente ausgeben", "nl": "Deze laag toont apotheken, welke (waarschijnlijk) ook medicijnen onder voorschrift verkopen", - "fr": "Une couche affichant les pharmacie qui (probablement) délivrent des médicaments" + "fr": "Une couche affichant les pharmacie qui (probablement) délivrent des médicaments", + "ca": "Una capa que mostra les farmàcies, que (probablement) distribueixen medicaments amb recepta" }, "title": { "render": { "en": "{name}", "de": "{name}", "nl": "{name}", - "fr": "{name}" + "fr": "{name}", + "ca": "{name}" }, "mappings": [ { @@ -29,7 +31,8 @@ "de": "Apotheke", "nl": "Apotheek", "pa_PK": "فارمیسی", - "fr": "Pharmacie" + "fr": "Pharmacie", + "ca": "Farmàcia" } } ] @@ -53,14 +56,16 @@ "en": "Name of the pharmacy", "de": "Name der Apotheke", "nl": "Naam van de apotheek", - "fr": "Nom de la pharmacie" + "fr": "Nom de la pharmacie", + "ca": "Nom de la farmàcia" } }, "question": { "en": "What is the name of the pharmacy?", "de": "Wie lautet der Name der Apotheke?", "nl": "Wat is de naam van deze apotheek?", - "fr": "Quel est le nom de cette pharmacie ?" + "fr": "Quel est le nom de cette pharmacie ?", + "ca": "Quin és el nom de la farmàcia?" }, "render": { "en": "This pharmacy is called {name}", @@ -151,7 +156,8 @@ "en": "Has drive through", "de": "Bietet einen Durchfahr-Service an", "nl": "Heeft een drive-through", - "fr": "A une drive" + "fr": "A une drive", + "ca": "Té autoservei" }, "osmTags": "drive_through=yes" } @@ -165,7 +171,8 @@ "en": "Pharmacy able to provide prescription drugs", "de": "Apotheke, die verschreibungspflichtige Arzneimittel ausgibt", "nl": "Deze apotheek verdeelt medicijnen met voorschrift", - "fr": "Pharmacie pouvant délivrer des médicaments sous prescription" + "fr": "Pharmacie pouvant délivrer des médicaments sous prescription", + "ca": "Farmàcia que subministra medicaments amb recepta" }, "osmTags": "dispensing=yes" } @@ -182,7 +189,8 @@ "en": "a pharmacy", "nl": "een apotheek", "de": "eine Apotheke", - "fr": "une pharmacie" + "fr": "une pharmacie", + "ca": "una farmàcia" } } ], diff --git a/assets/layers/physiotherapist/physiotherapist.json b/assets/layers/physiotherapist/physiotherapist.json index b63b9372f..66fa38c25 100644 --- a/assets/layers/physiotherapist/physiotherapist.json +++ b/assets/layers/physiotherapist/physiotherapist.json @@ -3,12 +3,14 @@ "name": { "en": "Physiotherapist", "nl": "Kinesist", - "de": "Physiotherapeuten" + "de": "Physiotherapeuten", + "ca": "Fisioterapeuta" }, "description": { "en": "This layer shows physiotherapists", "nl": "Deze laag toont kinesisten", - "de": "Diese Ebene zeigt Physiotherapeuten" + "de": "Diese Ebene zeigt Physiotherapeuten", + "ca": "Aquesta capa mostra fisioterapeutes" }, "source": { "osmTags": "healthcare=physiotherapist" @@ -17,7 +19,8 @@ "render": { "en": "Physiotherapist {name}", "nl": "Kinesist {name}", - "de": "Physiotherapeut {name}" + "de": "Physiotherapeut {name}", + "ca": "Fisioterapeuta {name}" } }, "minzoom": 13, @@ -27,12 +30,14 @@ "question": { "en": "What is the name of this physiotherapists office?", "nl": "Wat is de naam van deze kinesistenpraktijk?", - "de": "Wie heißt die Praxis des Physiotherapeuten?" + "de": "Wie heißt die Praxis des Physiotherapeuten?", + "ca": "Quin és el nom d'aquesta consulta fisioterapèutica?" }, "render": { "en": "This physiotherapists office is called {name}", "nl": "Deze kinesistenpraktijk heet {name}", - "de": "Die Praxis des Physiotherapeuten heißt {name}" + "de": "Die Praxis des Physiotherapeuten heißt {name}", + "ca": "Aquesta consulta fisioterapèutica es diu {name}" }, "freeform": { "key": "name" @@ -50,7 +55,8 @@ "en": "a physiotherapists office", "de": "Praxis eines Physiotherapeuten", "nl": "een fysiotherapeutenpraktijk", - "fr": "un cabinet de kinésithérapeutes" + "fr": "un cabinet de kinésithérapeutes", + "ca": "una consulta fisioterapèutica" }, "tags": [ "healthcare=physiotherapist" diff --git a/assets/layers/picnic_table/picnic_table.json b/assets/layers/picnic_table/picnic_table.json index 3d2ba4cee..048280a43 100644 --- a/assets/layers/picnic_table/picnic_table.json +++ b/assets/layers/picnic_table/picnic_table.json @@ -33,7 +33,8 @@ "fr": "La couche montrant les tables de pique-nique", "ru": "Слой, отображающий столы для пикника", "de": "Die Ebene zeigt Picknicktische an", - "es": "Una capa que muestra mesas de pícnic" + "es": "Una capa que muestra mesas de pícnic", + "ca": "La capa mostra taules de pícnic" }, "tagRenderings": [ "images", @@ -46,7 +47,8 @@ "de": "Aus welchem Material besteht dieser Picknicktisch?", "ru": "Из чего изготовлен этот стол для пикника?", "fr": "En quel matériau est faite la table de pique-nique ?", - "es": "¿De qué material está hecha esta mesa de pícnic?" + "es": "¿De qué material está hecha esta mesa de pícnic?", + "ca": "De quin material està feta aquesta taula de pícnic?" }, "render": { "en": "This picnic table is made of {material}", @@ -55,7 +57,8 @@ "de": "Dieser Picknicktisch besteht aus {material}", "ru": "Этот стол для пикника сделан из {material}", "fr": "La table est faite en {material}", - "es": "Esta mesa de pícnic está hecha de {material}" + "es": "Esta mesa de pícnic está hecha de {material}", + "ca": "Aquesta taula de pícnic està feta de {material}" }, "freeform": { "key": "material" @@ -70,7 +73,8 @@ "ru": "Это деревянный стол для пикника", "de": "Dies ist ein Picknicktisch aus Holz", "fr": "C’est une table en bois", - "es": "Esta es una mesa de pícnic de madera" + "es": "Esta es una mesa de pícnic de madera", + "ca": "Aquesta és una taula de pícnic de fusta" } }, { @@ -82,7 +86,8 @@ "ru": "Это бетонный стол для пикника", "de": "Dies ist ein Picknicktisch aus Beton", "fr": "C’est une table en béton", - "es": "Esta es una mesa de pícnic de hormigón" + "es": "Esta es una mesa de pícnic de hormigón", + "ca": "Açò és una taula de pícnic de formigó" } }, { @@ -92,7 +97,8 @@ "nl": "Deze picknictafel is gemaakt uit (gerecycleerd) plastiek", "de": "Dieser Picknicktisch ist aus (recyceltem) Kunststoff hergestellt", "es": "Esta es una mesa de picnic hecha de plástico reciclado", - "fr": "Cette table de pique-nique est en plastique (recyclé)" + "fr": "Cette table de pique-nique est en plastique (recyclé)", + "ca": "Açò és una taula de pícnic feta de plàstic reciclat" } } ], diff --git a/assets/layers/playground/playground.json b/assets/layers/playground/playground.json index 577667d9f..3d957f6cd 100644 --- a/assets/layers/playground/playground.json +++ b/assets/layers/playground/playground.json @@ -76,7 +76,8 @@ "ru": "Поверхность - {surface}", "de": "Die Oberfläche ist {surface}", "fr": "La surface est en {surface}", - "es": "La superficie es {surface}" + "es": "La superficie es {surface}", + "ca": "La superfícies és {surface}" }, "freeform": { "key": "surface" @@ -167,7 +168,8 @@ "it": "La superficie è non pavimentato", "de": "Die Oberfläche ist unbefestigt", "fr": "La surface n’a pas de revêtement", - "es": "La superficie está sin pavimentar" + "es": "La superficie está sin pavimentar", + "ca": "La superfícies està sense pavimentar" }, "hideInAnswer": true }, @@ -179,7 +181,8 @@ "it": "La superficie è pavimentato", "de": "Die Oberfläche ist befestigt", "fr": "La surface a un revêtement", - "es": "La superficie está pavimentada" + "es": "La superficie está pavimentada", + "ca": "La superfície està pavimentada" }, "hideInAnswer": true } @@ -274,7 +277,8 @@ "fr": "Accessible aux enfants de {max_age} au maximum", "ru": "Доступно детям до {max_age}", "de": "Zugang nur für Kinder bis maximal {max_age}", - "es": "Accesible a niños de hasta {max_age}" + "es": "Accesible a niños de hasta {max_age}", + "ca": "Accessible per a nens de com a màxim {max_age}" }, "question": { "nl": "Wat is de maximaal toegestane leeftijd voor deze speeltuin?", @@ -374,7 +378,8 @@ "it": "Accessibile solamente agli studenti della scuola", "de": "Nur für Schüler der Schule zugänglich", "fr": "Réservée aux élèves de l’école", - "es": "Solo accesibles para estudiantes de la escuela" + "es": "Solo accesibles para estudiantes de la escuela", + "ca": "Només accessible per als alumnes de l'escola" }, "hideInAnswer": true }, diff --git a/assets/layers/postoffices/postoffices.json b/assets/layers/postoffices/postoffices.json index d463f9b4d..4412de12b 100644 --- a/assets/layers/postoffices/postoffices.json +++ b/assets/layers/postoffices/postoffices.json @@ -31,7 +31,7 @@ "id": "Kantor Pos", "hu": "Posta", "nl": "Postkantoor", - "ca": "Oficina de correus", + "ca": "Oficina postal", "es": "Oficina de Correo", "fr": "Bureau de poste", "nb_NO": "Postkontor" @@ -72,9 +72,10 @@ "id": "Layer yang menunjukkan kantor pos.", "hu": "Postákat megjelenítő réteg.", "nl": "Een laag die postkantoren toont.", - "es": "Una capa que muestra oficinas de correo.", + "es": "Una capa que muestra oficinas postales.", "fr": "Un claque montrant les bureaux de poste.", - "nb_NO": "Et lag som viser postkontor." + "nb_NO": "Et lag som viser postkontor.", + "ca": "Una capa que mostra oficines postals." }, "tagRenderings": [ "images", @@ -91,7 +92,7 @@ "id": "Jam berapa kantor pos ini buka?", "hu": "Mikor van nyitva ez a posta?", "de": "Wie sind die Öffnungszeiten dieser Poststelle?", - "es": "¿Cuáles son las horas de apertura para esta oficina de correos?", + "es": "¿Cuáles son las horas de apertura para esta oficina postal?", "nl": "Wat zijn de openingsuren voor dit postkantoor?", "fr": "Quelles sont les heures d’ouverture de ce bureau de poste ?" } @@ -231,7 +232,8 @@ "render": { "en": "You can post letters with these companies: {post_office:letter_from}", "de": "Mit diesen Unternehmen können Sie Briefe aufgeben: {post_office:letter_from}", - "nl": "Je kan brieven posten met de volgende bedrijven: {post_office:letter_from}" + "nl": "Je kan brieven posten met de volgende bedrijven: {post_office:letter_from}", + "ca": "Podeu enviar cartes amb aquestes empreses: {post_office:letter_from}" }, "question": { "en": "Can you post a letter here?", @@ -269,7 +271,8 @@ "render": { "en": "You can post parcels with these companies: {post_office:parcel_from}", "de": "Sie können Pakete mit diesen Unternehmen versenden: {post_office:parcel_from}", - "nl": "Je kan pakketten versturen met deze bedrijven: {post_office:parcel_from}" + "nl": "Je kan pakketten versturen met deze bedrijven: {post_office:parcel_from}", + "ca": "Podeu enviar paquets amb aquestes empreses: {post_office:parcel_from}" }, "question": { "en": "Can you send a parcel here?", @@ -309,7 +312,8 @@ "id": "parcel-pickup", "render": { "en": "You can pick up parcels from these companies: {post_office:parcel_pickup}", - "de": "Sie können Pakete von diesen Unternehmen abholen: {post_office:parcel_pickup}" + "de": "Sie können Pakete von diesen Unternehmen abholen: {post_office:parcel_pickup}", + "ca": "Podeu recollir paquets d'aquestes empreses: {post_office:parcel_pickup}" }, "question": { "en": "Can you pick up missed parcels here?", @@ -343,7 +347,8 @@ "id": "parcel-to", "render": { "en": "You can send parcels to here for pickup with these companies: {post_office:parcel_to}", - "de": "Mit diesen Unternehmen können Sie Pakete zur Abholung hierher senden: {post_office:parcel_to}" + "de": "Mit diesen Unternehmen können Sie Pakete zur Abholung hierher senden: {post_office:parcel_to}", + "ca": "Podeu enviar paquets aquí per recollir-los amb aquestes empreses: {post_office:parcel_to}" }, "question": { "en": "Can you send parcels to here for pickup?", diff --git a/assets/layers/questions/questions.json b/assets/layers/questions/questions.json index af7f5742d..be115cedd 100644 --- a/assets/layers/questions/questions.json +++ b/assets/layers/questions/questions.json @@ -572,7 +572,6 @@ { "if": "dog=unleashed", "icon": "./assets/layers/questions/dogs_allowed.svg", - "then": { "en": "Dogs are allowed and can run around freely", "nl": "honden zijn welkom en mogen vrij rondlopen", @@ -1329,7 +1328,8 @@ "icon": "./assets/layers/questions/denominations/chf/1fr-2019-800px.png", "then": { "en": "1 franc coins are accepted", - "nl": "Munten van 1 frank worden geaccepteerd" + "nl": "Munten van 1 frank worden geaccepteerd", + "ca": "S'accepten monedes d'1 franc" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1338,7 +1338,8 @@ "icon": "./assets/layers/questions/denominations/chf/2fr-2019-800px.png", "then": { "en": "2 francs coins are accepted", - "nl": "Munten van 2 frank worden geaccepteerd" + "nl": "Munten van 2 frank worden geaccepteerd", + "ca": "S'accepten monedes de 2 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1347,7 +1348,8 @@ "icon": "./assets/layers/questions/denominations/chf/5fr-2019-800px.png", "then": { "en": "5 francs coins are accepted", - "nl": "Munten van 5 frank worden geaccepteerd" + "nl": "Munten van 5 frank worden geaccepteerd", + "ca": "S'accepten monedes de 5 francs" }, "hideInAnswer": "_currency!~.*CHF.*" } @@ -1493,7 +1495,8 @@ "icon": "./assets/layers/questions/denominations/chf/10chf.svg", "then": { "en": "10 francs notes are accepted", - "nl": "Biljetten van 10 frank worden geaccepteerd" + "nl": "Biljetten van 10 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 10 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1502,7 +1505,8 @@ "icon": "./assets/layers/questions/denominations/chf/20chf.svg", "then": { "en": "20 francs notes are accepted", - "nl": "Biljetten van 20 frank worden geaccepteerd" + "nl": "Biljetten van 20 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 20 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1511,7 +1515,8 @@ "icon": "./assets/layers/questions/denominations/chf/50chf.svg", "then": { "en": "50 francs notes are accepted", - "nl": "Biljetten van 50 frank worden geaccepteerd" + "nl": "Biljetten van 50 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 50 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1520,7 +1525,8 @@ "icon": "./assets/layers/questions/denominations/chf/100chf.svg", "then": { "en": "100 francs notes are accepted", - "nl": "Biljetten van 100 frank worden geaccepteerd" + "nl": "Biljetten van 100 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 100 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1529,7 +1535,8 @@ "icon": "./assets/layers/questions/denominations/chf/200chf.svg", "then": { "en": "200 francs notes are accepted", - "nl": "Biljetten van 200 frank worden geaccepteerd" + "nl": "Biljetten van 200 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 200 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1538,7 +1545,8 @@ "icon": "./assets/layers/questions/denominations/chf/1000chf.svg", "then": { "en": "1000 francs notes are accepted", - "nl": "Biljetten van 1000 frank worden geaccepteerd" + "nl": "Biljetten van 1000 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 1000 francs" }, "hideInAnswer": "_currency!~.*CHF.*" } @@ -1568,7 +1576,8 @@ "text": { "en": "Last edited on {_last_edit:timestamp} by {_last_edit:contributor}", "nl": "Laatst gewijzigd op {_last_edit:timestamp} door {_last_edit:contributor} ", - "de": "Zuletzt bearbeitet am {_last_edit:timestamp} von {_last_edit:contributor}" + "de": "Zuletzt bearbeitet am {_last_edit:timestamp} von {_last_edit:contributor}", + "ca": "Darrera edició el {_last_edit:timestamp} per {_last_edit:contributor}" }, "class": "subtle font-small" } diff --git a/assets/layers/shelter/shelter.json b/assets/layers/shelter/shelter.json index 9226cc44c..543aee864 100644 --- a/assets/layers/shelter/shelter.json +++ b/assets/layers/shelter/shelter.json @@ -73,7 +73,8 @@ "if": "shelter_type=lean_to", "then": { "en": "This is a shed with 3 walls, primarily intended for camping.", - "de": "Es handelt sich um einen an 3 Seiten geschlossenen Unterstand, der in erster Linie zum Campen gedacht ist." + "de": "Es handelt sich um einen an 3 Seiten geschlossenen Unterstand, der in erster Linie zum Campen gedacht ist.", + "ca": "Es tracta d'un cobert amb 3 parets, destinat principalment a l'acampada." } }, { diff --git a/assets/layers/stairs/stairs.json b/assets/layers/stairs/stairs.json index 9d416752a..e786b0610 100644 --- a/assets/layers/stairs/stairs.json +++ b/assets/layers/stairs/stairs.json @@ -15,7 +15,8 @@ "render": { "en": "Stairs", "nl": "Trap", - "de": "Treppe" + "de": "Treppe", + "ca": "Escales" }, "mappings": [ { @@ -23,7 +24,8 @@ "then": { "en": "Escalator", "nl": "Roltrap", - "de": "Rolltreppe" + "de": "Rolltreppe", + "ca": "Escala mecànica" } } ] @@ -40,12 +42,14 @@ "question": { "en": "Between which levels are these stairs?", "nl": "Tussen welke verdiepingen loopt deze trap?", - "de": "Zwischen welchen Stockwerken befindet sich diese Treppe?" + "de": "Zwischen welchen Stockwerken befindet sich diese Treppe?", + "ca": "Entre quines plantes estan aquestes escales?" }, "render": { "en": "These stairs are between the levels {level}", "nl": "Deze trap loopt tussen de verdiepingen {level}", - "de": "Diese Treppe ist zwischen den Stockwerken {level}" + "de": "Diese Treppe ist zwischen den Stockwerken {level}", + "ca": "Aquestes escales estan entre les plantes {level}" } } }, @@ -54,7 +58,8 @@ "question": { "en": "Does this stair have a handrail?", "nl": "Heeft deze trap een leuning?", - "de": "Hat die Treppe einen Handlauf?" + "de": "Hat die Treppe einen Handlauf?", + "ca": "Aquestes escales tenen un passamà?" }, "mappings": [ { @@ -71,7 +76,8 @@ "then": { "en": "These stairs do not have a handrail", "nl": "Deze trap heeft geen leuning", - "de": "Die Treppe hat keinen Handlauf" + "de": "Die Treppe hat keinen Handlauf", + "ca": "Aquestes escales no tenen un passamà" } } ] @@ -116,17 +122,20 @@ "question": { "en": "In which languages is there tactile writing (braille) for navigation? ", "de": "In welchen Sprachen gibt es taktile Schrift (Braille) für die Navigation? ", - "nl": "In welke talen is er voelbaar schrift (braille) voor navigatie? " + "nl": "In welke talen is er voelbaar schrift (braille) voor navigatie? ", + "ca": "En quins idiomes hi ha escriptura tàctil (braille) per a la navegació? " }, "render_list_item": { "en": "These stairs have tactile writing in {language():font-bold}", "de": "Die Treppe hat taktile Schrift in {language():font-bold}", - "nl": "Deze trap heeft voelbaar schrijft in {language():font-bold}" + "nl": "Deze trap heeft voelbaar schrijft in {language():font-bold}", + "ca": "Aquestes escales tenen escriptura tàctil en {language():font-bold}" }, "render_single_language": { "en": "These stairs have tactile writing in {language():font-bold}", "de": "Die Treppe hat taktile Schrift in {language():font-bold}", - "nl": "Deze trap heeft voelbaar schrijft in {language():font-bold}" + "nl": "Deze trap heeft voelbaar schrijft in {language():font-bold}", + "ca": "Aquestes escales tenen escriptura tàctil en {language():font-bold}" } } } @@ -139,7 +148,8 @@ "then": { "en": "This is an escalator", "nl": "Dit is een roltrap", - "de": "Das ist eine Rolltreppe" + "de": "Das ist eine Rolltreppe", + "ca": "Açò és una escala mecànica" } }, { @@ -147,7 +157,8 @@ "then": { "en": "This is not an escalator", "nl": "Dit is geen roltrap", - "de": "Das ist keine Rolltreppe" + "de": "Das ist keine Rolltreppe", + "ca": "Açò no és una escala mecànica" } }, { @@ -197,7 +208,8 @@ "then": { "en": "There is ramp for wheelchairs here, but it is shown separately on the map", "de": "Hier gibt es eine Rampe für Rollstühle, die jedoch auf der Karte separat angezeigt wird", - "nl": "Er is hier een helling voor rolstoelen, maar deze is los aangegeven op de kaart" + "nl": "Er is hier een helling voor rolstoelen, maar deze is los aangegeven op de kaart", + "ca": "Aquí hi ha una rampa per a cadira de rodes, però es mostra separadament al mapa" }, "hideInAnswer": true }, diff --git a/assets/layers/street_lamps/street_lamps.json b/assets/layers/street_lamps/street_lamps.json index 9c9ddef2c..495dfae9d 100644 --- a/assets/layers/street_lamps/street_lamps.json +++ b/assets/layers/street_lamps/street_lamps.json @@ -16,7 +16,8 @@ "en": "Street Lamp", "nl": "Straatlantaarn", "de": "Straßenlaterne", - "es": "Lámpara Callejera" + "es": "Lámpara Callejera", + "ca": "Fanal" }, "mappings": [ { @@ -25,7 +26,8 @@ "en": "Street Lamp {ref}", "nl": "Straatlantaarn {ref}", "de": "Straßenlaterne {ref}", - "es": "Lámpara Callejera {ref}" + "es": "Lámpara Callejera {ref}", + "ca": "Fanal {ref}" } } ] @@ -69,7 +71,8 @@ "en": "This street lamp has the reference number {ref}", "nl": "Deze straatlantaarn heeft het nummer {ref}", "de": "Diese Straßenlaterne hat die Referenznummer {ref}", - "es": "Esta lámpara callejera tiene el número de referencia {ref}" + "es": "Esta lámpara callejera tiene el número de referencia {ref}", + "ca": "Aquest fanal té el número de referència {ref}" }, "question": { "en": "What is the reference number of this street lamp?", @@ -88,7 +91,8 @@ "en": "How is this street lamp mounted?", "nl": "Hoe is deze straatlantaarn gemonteerd?", "de": "Wie ist diese Straßenlaterne befestigt?", - "es": "¿Cómo está montada esta lámpara?" + "es": "¿Cómo está montada esta lámpara?", + "ca": "Com està muntada aquesta làmpada?" }, "mappings": [ { @@ -97,7 +101,8 @@ "en": "This lamp is suspended using cables", "nl": "Deze lantaarn hangt aan kabels", "de": "Die Straßenlaterne ist an einem Kabel befestigt", - "es": "Esta lámpara se suspende utilizando cables" + "es": "Esta lámpara se suspende utilizando cables", + "ca": "Aquesta làmpada està suspès mitjançant cables" } }, { @@ -106,7 +111,8 @@ "en": "This lamp is mounted on a ceiling", "nl": "Deze lantaarn hangt aan een plafond", "de": "Die Straßenlaterne ist an einer Decke befestigt", - "es": "Esta lámpara está montada en un techo" + "es": "Esta lámpara está montada en un techo", + "ca": "Aquesta làmpada està muntat al sostre" } }, { @@ -115,7 +121,8 @@ "en": "This lamp is mounted in the ground", "nl": "Deze lantaarn zit in de grond", "de": "Die Straßenlaterne ist am Boden befestigt", - "es": "Esta lámpara está montada en el suelo" + "es": "Esta lámpara está montada en el suelo", + "ca": "Aquesta làmpada està muntat a terra" } }, { @@ -124,7 +131,8 @@ "en": "This lamp is mounted on a short pole (mostly < 1.5m)", "nl": "Deze lantaarn zit op een korte paal (meestal < 1.5m)", "de": "Die Straßenlaterne ist an einem kurzen Mast (< 1,5m) befestigt", - "es": "Esta lámpara está montada en un poste corto (mayoritariamente < 1.5m)" + "es": "Esta lámpara está montada en un poste corto (mayoritariamente < 1.5m)", + "ca": "Aquesta làmpada està muntada en un pal curt (principalment <1,5 m)" } }, { @@ -134,7 +142,7 @@ "nl": "Deze lantaarn zit op een paal", "de": "Die Straßenlaterne ist an einem Mast befestigt", "es": "Esta lámpara está montada en un poste", - "ca": "Aquest fanal està muntat en un pal" + "ca": "Aquesta làmpada està muntada en un pal" } }, { @@ -143,7 +151,8 @@ "en": "This lamp is mounted directly to the wall", "nl": "Deze lantaarn hangt direct aan de muur", "de": "Die Straßenlaterne ist direkt an der Wand befestigt", - "es": "Esta lámpara está montada directamente en la pared" + "es": "Esta lámpara está montada directamente en la pared", + "ca": "Aquesta làmpada està muntada directament a la paret" } }, { @@ -153,7 +162,7 @@ "nl": "Deze lantaarn hangt aan de muur met een metalen balk", "de": "Die Straßenlaterne ist mit einer Metallstange an der Wand befestigt", "es": "Esta lámpara está montada en la pared utilizando una barra metálica", - "ca": "Aquest fanal està muntat a la paret utilitzat una barra metàl·lica" + "ca": "Aquesta làmpada està muntada a la paret utilitzat una barra metàl·lica" } } ] @@ -207,7 +216,8 @@ "en": "This lamp is lit electrically", "nl": "Deze lantaarn is elektrisch verlicht", "de": "Diese Straßenlaterne leuchtet elektrisch", - "es": "Esta lámpara se ilumina eléctricamente" + "es": "Esta lámpara se ilumina eléctricamente", + "ca": "Aquest fanal s'encén elèctricament" }, "hideInAnswer": true }, @@ -335,7 +345,8 @@ "en": "This lamp emits {light:colour} light", "nl": "Deze lantaarn geeft {light:colour} licht", "de": "Diese Lampe strahlt {light:colour} Licht aus", - "es": "Esta lámpara emite luz {light:colour}" + "es": "Esta lámpara emite luz {light:colour}", + "ca": "Aquesta làmpada emet llum {light:colour}" }, "freeform": { "key": "light:colour", @@ -379,7 +390,8 @@ "render": { "en": "This lamp has {light:count} fixtures", "nl": "Deze lantaarn heeft {light:count} lampen", - "de": "Diese Straßenlaterne hat {light:count} Leuchten" + "de": "Diese Straßenlaterne hat {light:count} Leuchten", + "ca": "Aquesta làmpada té {light:count} aparells" }, "question": { "en": "How many fixtures does this light have?", @@ -498,6 +510,7 @@ "en": "A layer showing street lights", "nl": "Een laag die alle straatlantaarns toont", "de": "Eine Ebene mit Straßenbeleuchtung", - "es": "Una capa que muestra luces callejeras" + "es": "Una capa que muestra luces callejeras", + "ca": "Una capa que mostra els llums del carrer" } } diff --git a/assets/layers/surveillance_camera/surveillance_camera.json b/assets/layers/surveillance_camera/surveillance_camera.json index 2e59fb397..fba0f4faf 100644 --- a/assets/layers/surveillance_camera/surveillance_camera.json +++ b/assets/layers/surveillance_camera/surveillance_camera.json @@ -43,22 +43,26 @@ { "id": "has_alpr", "question": { - "en": "Can this camera automatically detect license plates?" + "en": "Can this camera automatically detect license plates?", + "ca": "Aquesta càmera pot detectar matrícules automàticament?" }, "questionHint": { - "en": "An ALPR (Automatic License Plate Reader) typically has two lenses and an array of infrared LEDS in between." + "en": "An ALPR (Automatic License Plate Reader) typically has two lenses and an array of infrared LEDS in between.", + "ca": "Un ALPR (lector automàtic de matrícules, per les seves sigles en anglès) normalment té dues lents i una sèrie de LEDs infrarojos entremig." }, "mappings": [ { "if": "surveillance:type=camera", "then": { - "en": "This is a camera without number plate recognition." + "en": "This is a camera without number plate recognition.", + "ca": "Es tracta d'una càmera sense reconeixement de matrícules." } }, { "if": "surveillance:type=ALPR", "then": { - "en": "This is an ALPR (Automatic License Plate Reader)" + "en": "This is an ALPR (Automatic License Plate Reader)", + "ca": "Açò és un ALPR (lector automàtic de matrícules, per les seves sigles en anglès)" }, "icon": { "path": "./assets/layers/surveillance_camera/ALPR.svg" @@ -178,7 +182,8 @@ "it": "Punta in direzione {direction}", "de": "filmt in Himmelsrichtung {direction}", "da": "Filmer til en kompasretning af {direction}", - "es": "Graba en dirección a {direction}" + "es": "Graba en dirección a {direction}", + "ca": "Grava en direcció {direction}" }, "hideInAnswer": true } @@ -283,7 +288,8 @@ "it": "Lo spazio pubblico sorvegliato da questa videocamera è all'aperto o al chiuso?", "de": "Handelt es sich bei dem von dieser Kamera überwachten öffentlichen Raum um einen Innen- oder Außenbereich?", "da": "Er det offentlige rum, der overvåges af dette kamera, et indendørs eller udendørs rum?", - "es": "¿El espacio público vigilado por esta cámara es un espacio interior o exterior?" + "es": "¿El espacio público vigilado por esta cámara es un espacio interior o exterior?", + "ca": "L'espai públic vigilat per aquesta càmera és un espai interior o exterior?" }, "condition": { "and": [ @@ -300,7 +306,8 @@ "it": "Questa videocamera si trova al chiuso", "de": "Diese Kamera befindet sich im Innenraum", "da": "Dette kamera er placeret indendørs", - "es": "Esta cámara está ubicada en un lugar interior" + "es": "Esta cámara está ubicada en un lugar interior", + "ca": "Aquesta càmera es troba a l'interior" } }, { @@ -313,7 +320,8 @@ "ru": "Эта камера расположена снаружи", "de": "Diese Kamera befindet sich im Freien", "da": "Dette kamera er placeret udendørs", - "es": "Esta cámara está ubicada en un lugar exterior" + "es": "Esta cámara está ubicada en un lugar exterior", + "ca": "Aquesta càmera es troba a l'exterior" } }, { @@ -326,7 +334,8 @@ "ru": "Возможно, эта камера расположена снаружи", "de": "Diese Kamera ist möglicherweise im Freien", "da": "Dette kamera er sandsynligvis placeret udendørs", - "es": "Esta cámara está probablemente colocada en el exterior" + "es": "Esta cámara está probablemente colocada en el exterior", + "ca": "Aquesta càmera probablement es troba a l'exterior" }, "hideInAnswer": true } @@ -348,7 +357,8 @@ "fr": "Situé au niveau {level}", "it": "Si trova al piano {level}", "de": "Befindet sich auf Ebene {level}", - "es": "Está colocada a nivel {level}" + "es": "Ubicado en la planta {level}", + "ca": "Ubicat a la planta {level}" }, "freeform": { "key": "level", @@ -598,7 +608,8 @@ "nl": "een bewakingscamera", "de": "eine Überwachungskamera", "es": "una cámara de vigilancia", - "fr": "une caméra de surveillance" + "fr": "une caméra de surveillance", + "ca": "una càmera de vigilància" } }, { @@ -612,7 +623,8 @@ "nl": "een bewakingscamera gemonteerd op een muur", "de": "eine an einer Wand montierte Überwachungskamera", "es": "una cámara de vigilancia montada en una pared", - "fr": "une caméra de surveillance fixée au mur" + "fr": "une caméra de surveillance fixée au mur", + "ca": "una càmera de vigilància muntada en una paret" }, "snapToLayer": "walls_and_buildings" }, @@ -622,10 +634,12 @@ "surveillance:type=ALPR" ], "title": { - "en": "an ALPR camera (Automatic Number Plate Reader)" + "en": "an ALPR camera (Automatic Number Plate Reader)", + "ca": "una càmera ALPR (lector automàtic de matrícules, per les seves sigles en anglès)" }, "description": { - "en": "An ALPR typically has two lenses and an array of infrared lights." + "en": "An ALPR typically has two lenses and an array of infrared lights.", + "ca": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes." }, "exampleImages": [ "./assets/layers/surveillance_camera/ALPR_Example.jpg", @@ -639,10 +653,12 @@ "camera:mount=wall" ], "title": { - "en": "an ALPR camera (Automatic Number Plate Reader) mounted on a wall" + "en": "an ALPR camera (Automatic Number Plate Reader) mounted on a wall", + "ca": "una càmera ALPR (lector automàtic de matrícules) muntada a la paret" }, "description": { - "en": "An ALPR typically has two lenses and an array of infrared lights." + "en": "An ALPR typically has two lenses and an array of infrared lights.", + "ca": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes." }, "exampleImages": [ "./assets/layers/surveillance_camera/ALPR_Example.jpg", @@ -724,6 +740,7 @@ "nl": "Deze laag toont bewakingscamera's en laat toe om de informatie te verrijken en om nieuwe camera\"s toe te voegen", "de": "Diese Ebene zeigt die Überwachungskameras an und ermöglicht es, Informationen zu aktualisieren und neue Kameras hinzuzufügen", "es": "Esta capa muestra las cámaras de vigilancia y permite a quien colabora, actualizar la información y agregar nuevas cámaras", - "fr": "Cette couche affiche les caméras de surveillance et permet au contributeur de mettre à jour les informations et ajouter de nouvelles caméras" + "fr": "Cette couche affiche les caméras de surveillance et permet au contributeur de mettre à jour les informations et ajouter de nouvelles caméras", + "ca": "Aquesta capa mostra les càmeres de vigilància i permet a qui col·labora, actualitzar la informació i afegir noves càmeres" } } diff --git a/assets/layers/tertiary_education/tertiary_education.json b/assets/layers/tertiary_education/tertiary_education.json index c200bee47..e9ddb41b0 100644 --- a/assets/layers/tertiary_education/tertiary_education.json +++ b/assets/layers/tertiary_education/tertiary_education.json @@ -53,7 +53,8 @@ "de": "Universität", "fr": "Universitée", "da": "Universitet", - "pa_PK": "یونیورسٹی" + "pa_PK": "یونیورسٹی", + "ca": "Universitat" } }, { @@ -76,7 +77,8 @@ "nl": "Wat voor onderwijsinstelling is dit?", "de": "Was für eine Art von Institution ist das?", "fr": "De quel type d'établissement s'agit-il ?", - "da": "Hvad er det for en institution?" + "da": "Hvad er det for en institution?", + "ca": "Quin tipus d'institució és aquesta?" }, "mappings": [ { @@ -193,7 +195,8 @@ "nl": "een universiteit", "de": "eine Universität", "fr": "une université", - "da": "et universitet" + "da": "et universitet", + "ca": "una universitat" }, "description": { "en": "An institute where tertiary education is given (at the level equivalent of a bachelors degree or higher). A single point per campus is enough - buildings and faculties should not be mapped with different university points.", diff --git a/assets/layers/ticket_machine/ticket_machine.json b/assets/layers/ticket_machine/ticket_machine.json index de507975e..6292fc6f9 100644 --- a/assets/layers/ticket_machine/ticket_machine.json +++ b/assets/layers/ticket_machine/ticket_machine.json @@ -85,7 +85,8 @@ "title": { "en": "a ticket machine", "de": "einen Fahrkartenautomat", - "nl": "een kaartautomaat" + "nl": "een kaartautomaat", + "ca": "una màquina de bitllets" } } ], diff --git a/assets/layers/toilet_at_amenity/toilet_at_amenity.json b/assets/layers/toilet_at_amenity/toilet_at_amenity.json index ba1664fcd..9d4090935 100644 --- a/assets/layers/toilet_at_amenity/toilet_at_amenity.json +++ b/assets/layers/toilet_at_amenity/toilet_at_amenity.json @@ -3,7 +3,8 @@ "name": { "en": "Toilets at other amenities", "de": "Toiletten in anderen Einrichtungen", - "nl": "Toilet in een voorziening" + "nl": "Toilet in een voorziening", + "ca": "Lavabos a altres instal·lacions" }, "minzoom": 12, "source": { @@ -264,7 +265,8 @@ "nl": "Hoe breed is de deur van de rolstoeltoegankelijke toilet?", "fr": "Quelle est la largeur de la porte des toilettes accessibles aux fauteuils roulants ?", "de": "Wie breit ist die Tür zur rollstuhlgerechten Toilette?", - "da": "Hvad er bredden på døren til det kørestolsvenlige toilet?" + "da": "Hvad er bredden på døren til det kørestolsvenlige toilet?", + "ca": "Quina és l'amplada de la porta del lavabo accessible per a cadira de rodes?" }, "render": { "en": "The door to the wheelchair-accessible toilet is {canonical(toilets:door:width)} wide", @@ -435,7 +437,7 @@ "en": "A layer showing (public) toilets located at different places.", "de": "Eine Ebene mit (öffentlichen) Toiletten an verschiedenen Orten.", "nl": "Een laag die (publiek toegankelijke) toiletten toont in verschillende andere voorzieningen.", - "ca": "Una capa que mostra banys (públics) ubicats en diferents llocs" + "ca": "Una capa que mostra banys (públics) ubicats en diferents llocs." }, "units": [ { @@ -453,7 +455,8 @@ "nl": "meter", "fr": "mètre", "de": "Meter", - "da": "meter" + "da": "meter", + "ca": "metre" } }, { @@ -467,7 +470,8 @@ "nl": "centimeter", "fr": "centimètre", "de": "Zentimeter", - "da": "centimeter" + "da": "centimeter", + "ca": "centimetre" } } ] diff --git a/assets/layers/trail/trail.json b/assets/layers/trail/trail.json index 173f81d4c..7a9764003 100644 --- a/assets/layers/trail/trail.json +++ b/assets/layers/trail/trail.json @@ -50,7 +50,8 @@ "nl": "Deze wandeling is {_length:km} kilometer lang", "de": "Der Wanderweg ist {_length:km} Kilometer lang", "fr": "Le sentier fait {_length:km} kilomètres de long", - "da": "Stien er {_length:km} kilometer lang" + "da": "Stien er {_length:km} kilometer lang", + "ca": "El sender té {_length:km} quilòmetres" } }, { @@ -127,7 +128,8 @@ "en": "Blue trail", "de": "Blauer Weg", "fr": "Sentier bleu", - "da": "Blå sti" + "da": "Blå sti", + "ca": "Ruta blava" } }, { @@ -137,7 +139,8 @@ "en": "Red trail", "de": "Roter Weg", "fr": "Sentier rouge", - "da": "Rød sti" + "da": "Rød sti", + "ca": "Ruta vermella" } }, { @@ -147,7 +150,8 @@ "en": "Green trail", "de": "Grüner Weg", "fr": "Sentier vert", - "da": "Grøn sti" + "da": "Grøn sti", + "ca": "Ruta verda" } }, { @@ -157,7 +161,8 @@ "en": "Yellow trail", "de": "Gelber Weg", "fr": "Sentier jaune", - "da": "Gul sti" + "da": "Gul sti", + "ca": "Ruta groga" } } ], diff --git a/assets/layers/transit_routes/transit_routes.json b/assets/layers/transit_routes/transit_routes.json index c24b25497..c4c263df7 100644 --- a/assets/layers/transit_routes/transit_routes.json +++ b/assets/layers/transit_routes/transit_routes.json @@ -11,7 +11,8 @@ "en": "Layer showing bus lines", "de": "Ebene mit Buslinien", "nl": "Laag met buslijnen", - "da": "Lag, der viser buslinjer" + "da": "Lag, der viser buslinjer", + "ca": "Capa que mostra les línies d'autobús" }, "source": { "osmTags": { @@ -27,7 +28,8 @@ "en": "Bus line", "de": "Buslinie", "nl": "Buslijn", - "da": "Buslinje" + "da": "Buslinje", + "ca": "Línia de bus" }, "mappings": [ { @@ -36,7 +38,8 @@ "en": "{name}", "de": "{name}", "da": "{name}", - "nl": "{name}" + "nl": "{name}", + "ca": "{name}" } } ] @@ -48,7 +51,8 @@ "en": "#ff0000", "de": "#ff0000", "da": "#ff0000", - "nl": "#ff0000" + "nl": "#ff0000", + "ca": "#ff0000" }, "mappings": [ { @@ -109,7 +113,8 @@ "de": "Die Buslinie fährt über {via}", "nl": "Deze buslijn gaat via {via}", "da": "Denne buslinje går via {via}", - "fr": "Cette ligne de bus passe par {via}" + "fr": "Cette ligne de bus passe par {via}", + "ca": "Aquesta línia d'autobús passa per {via}" }, "question": { "en": "What is the via point for this bus line?", diff --git a/assets/layers/transit_stops/transit_stops.json b/assets/layers/transit_stops/transit_stops.json index e9a871a88..517d17609 100644 --- a/assets/layers/transit_stops/transit_stops.json +++ b/assets/layers/transit_stops/transit_stops.json @@ -34,7 +34,8 @@ "en": "Stop {name}", "de": "Haltestelle {name}", "da": "Stop {name}", - "nl": "Halte {name}" + "nl": "Halte {name}", + "ca": "Parada {name}" } } ] @@ -80,7 +81,8 @@ "en": "Name of the stop", "de": "Name der Haltestelle", "da": "Navn på stoppestedet", - "nl": "Naam van de halte" + "nl": "Naam van de halte", + "ca": "Nom de la parada" } }, "mappings": [ @@ -139,7 +141,8 @@ "then": { "en": "This stop has a shelter, that's separately mapped", "de": "Die Haltestelle hat einen Unterstand, der separat kariert ist", - "nl": "Deze halte heeft een schuilplaats, die apart op de kaart staat" + "nl": "Deze halte heeft een schuilplaats, die apart op de kaart staat", + "ca": "Aquesta parada té un refugi que està mapejat separadament" }, "hideInAnswer": true } @@ -184,7 +187,8 @@ "en": "This stop has a bench, that's separately mapped", "de": "Die Haltestelle hat eine Bank, die separat kartiert ist", "nl": "Deze halte heeft een zitbank, die los aangegeven is op de kaart", - "fr": "Cet arrêt a un banc, cartographié séparément" + "fr": "Cet arrêt a un banc, cartographié séparément", + "ca": "Aquesta parada té un banc que està mapejat separadament" }, "hideInAnswer": true } @@ -228,7 +232,8 @@ "then": { "en": "This stop has a bin, that's separately mapped", "de": "Die Haltestelle hat einen Mülleimer, der separat kartiert ist", - "nl": "Deze heeft een vuilnisbak, die los op de kaart staat" + "nl": "Deze heeft een vuilnisbak, die los op de kaart staat", + "ca": "Aquesta parada té una paperera que està mapejada separadament" }, "hideInAnswer": true } @@ -315,7 +320,8 @@ "then": { "en": "This stop has a departures board of unknown type", "de": "Die Haltestelle hat einen Fahrplan, der nicht näher definiert ist", - "da": "Dette stoppested har en afgangstavle af ukendt type" + "da": "Dette stoppested har en afgangstavle af ukendt type", + "ca": "Aquesta parada té un tauler de sortides de tipus desconegut" }, "hideInAnswer": true }, @@ -344,7 +350,8 @@ "then": { "en": "This stop has a timetable showing regular departures", "de": "Die Haltestelle hat einen Fahrplan, der die regulären Abfahrtszeiten anzeigt", - "da": "Dette stop har en køreplan, der viser regelmæssige afgange" + "da": "Dette stop har en køreplan, der viser regelmæssige afgange", + "ca": "Aquesta parada té un horari que mostra les sortides regulars" } }, { @@ -352,7 +359,8 @@ "then": { "en": "This stop has a timetable containing just the interval between departures", "de": "Die Haltestelle hat einen Fahrplan, der den Abstand zwischen Abfahrten anzeigt", - "da": "Dette stop har en køreplan, der kun indeholder intervallet mellem afgangene" + "da": "Dette stop har en køreplan, der kun indeholder intervallet mellem afgangene", + "ca": "Aquesta parada té un horari que conté només l'interval entre sortides" } }, { @@ -360,7 +368,8 @@ "then": { "en": "This stop does not have a departures board", "de": "Die Haltestelle hat keinen Fahrplan", - "da": "Dette stop har ikke en afgangstavle" + "da": "Dette stop har ikke en afgangstavle", + "ca": "Aquesta parada no té un tauler de sortides" } } ] @@ -410,7 +419,8 @@ "question": { "en": "With a bench", "de": "Mit Sitzbank", - "fr": "Avec un banc" + "fr": "Avec un banc", + "ca": "Amb un banc" } } ] diff --git a/assets/layers/tree_node/tree_node.json b/assets/layers/tree_node/tree_node.json index 722b26d01..f8edc9415 100644 --- a/assets/layers/tree_node/tree_node.json +++ b/assets/layers/tree_node/tree_node.json @@ -129,7 +129,8 @@ "nl": "Wat is de omtrek van de boomstam? ", "es": "¿Cuál es la circunferencia del tronco del árbol?", "pt": "Qual é a circunferência do tronco da árvore?", - "pt_BR": "Qual é a circunferência do tronco da árvore?" + "pt_BR": "Qual é a circunferência do tronco da árvore?", + "ca": "Quina és la circumferència del tronc de l'arbre?" }, "render": { "en": "The tree trunk has a circumference of {circumference} meter", @@ -138,7 +139,8 @@ "nl": "De boomstam heeft een omtrek van {circumference} meter", "es": "El tronco del árbol tiene una circunferencia de {circumference} metros", "pt": "O tronco da árvore tem uma circunferência de {circumference} metros", - "pt_BR": "O tronco da árvore tem uma circunferência de {circumference} metro" + "pt_BR": "O tronco da árvore tem uma circunferência de {circumference} metro", + "ca": "El tronc de l'arbre té una circumferència de {circumference} metre" }, "freeform": { "key": "circumference", @@ -163,7 +165,8 @@ "fr": "Quelle est la hauteur de cette arbre ?", "nl": "Wat is de hoogte van deze boom?", "pt": "Qual a altura dessa árvore?", - "pt_BR": "Qual a altura dessa árvore?" + "pt_BR": "Qual a altura dessa árvore?", + "ca": "Quina és l'alçada d'aquest arbre?" }, "freeform": { "key": "height", @@ -177,7 +180,8 @@ "nl": "Deze boom is {height} meter hoog", "es": "Este árbol tiene {height} metros de altura", "pt": "Esta árvore tem {height} metros de altura", - "pt_BR": "Esta árvore tem {height} metros de altura" + "pt_BR": "Esta árvore tem {height} metros de altura", + "ca": "Aquest arbre té {height} metres d'altura" } }, { @@ -190,7 +194,8 @@ "de": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft.", "es": "¿Qué importancia tiene este árbol? Elige la primera respuesta que corresponda.", "da": "Hvor vigtigt er dette træ? Vælg det første svar, der passer.", - "pt": "Quão significativa é esta árvore? Escolha a primeira resposta que se aplica." + "pt": "Quão significativa é esta árvore? Escolha a primeira resposta que se aplica.", + "ca": "Quina importància té aquest arbre? Trieu la primera resposta que correspongui." }, "mappings": [ { @@ -207,7 +212,8 @@ "de": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung.", "es": "El árbol es notable debido a su tamaño o ubicación prominente. Es útil para la navegación.", "da": "Træet er bemærkelsesværdigt på grund af sin størrelse eller sin fremtrædende placering. Det er nyttigt til navigation.", - "pt": "A árvore é notável devido ao seu tamanho ou localização proeminente. É útil para navegação." + "pt": "A árvore é notável devido ao seu tamanho ou localização proeminente. É útil para navegação.", + "ca": "L'arbre és notable per la seva mida o per la seva ubicació destacada. És útil per a la navegació." } }, { @@ -224,7 +230,8 @@ "de": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört.", "es": "El árbol es un monumento natural, por ejemplo, porque es especialmente antiguo, o de una especie valiosa.", "da": "Træet er et naturmonument, f.eks. fordi den er særlig gammel eller af en værdifuld art.", - "pt": "A árvore é um monumento natural, por ex. porque é especialmente antigo ou de uma espécie valiosa." + "pt": "A árvore é um monumento natural, por ex. porque é especialmente antigo ou de uma espécie valiosa.", + "ca": "L'arbre és un monument natural, p. e. perquè és especialment antic o d'una espècie valuosa." } }, { @@ -241,7 +248,8 @@ "de": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage.", "es": "El árbol se utiliza con fines agrícolas, por ejemplo, en un huerto.", "da": "Træet anvendes til landbrugsformål, f.eks. i en frugtplantage.", - "pt": "A árvore é utilizada para fins agrícolas, por ex. em um pomar." + "pt": "A árvore é utilizada para fins agrícolas, por ex. em um pomar.", + "ca": "L'arbre s'utilitza amb finalitats agrícoles, p. en un hort." } }, { @@ -258,7 +266,8 @@ "de": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...).", "es": "El árbol está en un parque o similar (cementerio, recinto escolar, ...).", "da": "Træet står i en park eller lignende (kirkegård, skoleområde, ...).", - "pt": "A árvore está em um parque ou similar (cemitério, pátio da escola, …)." + "pt": "A árvore está em um parque ou similar (cemitério, pátio da escola, …).", + "ca": "L'arbre està en un parc o semblant (cementiri, recinte escolar, …)." } }, { @@ -291,9 +300,10 @@ "it": "Fa parte di un viale alberato.", "fr": "C'est un arbre le long d'une avenue.", "de": "Dieser Baum steht entlang einer Straße.", - "es": "El árbol está en bandejón de una avenida.", + "es": "Este es un árbol a lo largo de una avenida.", "da": "Dette er et træ langs en allé.", - "pt": "Esta é uma árvore ao longo de uma avenida." + "pt": "Esta é uma árvore ao longo de uma avenida.", + "ca": "Aquest és un arbre al llarg d'una avinguda." } }, { @@ -329,7 +339,8 @@ "de": "Dieser Baum steht außerhalb eines städtischen Gebiets.", "es": "El árbol está fuera de una zona urbana.", "da": "Træet står uden for et byområde.", - "pt": "A árvore está fora de uma área urbana." + "pt": "A árvore está fora de uma área urbana.", + "ca": "L'arbre es troba fora d'una zona urbana." } } ] @@ -432,10 +443,11 @@ "ru": "Это дерево вечнозелёное или листопадное?", "fr": "L’arbre est-il à feuillage persistant ou caduc ?", "de": "Ist dies ein Nadelbaum oder ein Laubbaum?", - "es": "¿El árbol es Siempreverde o Caduco?", + "es": "¿El árbol es perenne o caduco?", "da": "Er dette træ stedsegrønt eller løvfældende?", "pt": "Essa árvore é perene ou caducifólia?", - "pt_BR": "Essa árvore é perene ou caducifólia?" + "pt_BR": "Essa árvore é perene ou caducifólia?", + "ca": "Aquest arbre és perenne o caducifoli?" }, "mappings": [ { @@ -453,7 +465,8 @@ "de": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter.", "es": "Caduco o Deciduo: el árbol pierde las hojas en un período del año.", "da": "Løvfældende: træet mister bladene i en periode af året.", - "pt": "Caducifólia: a árvore perde as folhas em alguma época do ano." + "pt": "Caducifólia: a árvore perde as folhas em alguma época do ano.", + "ca": "Caducifoli: l'arbre perd les fulles durant alguna època de l'any." } }, { @@ -580,7 +593,8 @@ "de": "Als Denkmal registriert von der Onroerend Erfgoed Flandern", "es": "Registrado como patrimonio por Onroerend Erfgoed Flandes", "id": "Terdaftar sebagai warisan oleh Onroerend Erfgoed Flanders", - "pt": "Registrado como patrimônio por Onroerend Erfgoed Flanders" + "pt": "Registrado como patrimônio por Onroerend Erfgoed Flanders", + "ca": "Registrat com a patrimoni per Onroerend Erfgoed Flandes" }, "icon": { "path": "./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg", @@ -761,7 +775,8 @@ "de": "ein Laubbaum", "es": "árbol de hoja ancha", "da": "et løvtræ", - "pt": "uma árvore de folhas largas" + "pt": "uma árvore de folhas largas", + "ca": "un arbre de fulla ampla" }, "description": { "nl": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.", @@ -770,7 +785,8 @@ "fr": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier.", "de": "Ein Baum mit Blättern, z. B. Eiche oder Buche.", "es": "Un árbol de hojas como el Roble o el Álamo.", - "pt": "Uma árvore de uma espécie com folhas, como carvalho ou populus." + "pt": "Uma árvore de uma espécie com folhas, como carvalho ou populus.", + "ca": "Arbre d'una espècie amb fulles, com el roure o el pollancre." } }, { @@ -787,7 +803,8 @@ "de": "ein Nadelbaum", "es": "Árbol tipo Conífera", "da": "et nåletræ", - "pt": "uma árvore com folhas de agulha" + "pt": "uma árvore com folhas de agulha", + "ca": "un arbre amb fulles d'agulla" }, "description": { "nl": "Een boom van een soort met naalden, bijvoorbeeld den of spar.", @@ -797,7 +814,8 @@ "fr": "Une espèce d’arbre avec des épines comme le pin ou l’épicéa.", "de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte.", "es": "Un árbol de hojas agujas, como el Pino o el Abeto.", - "da": "Et træ af en art med nåle, såsom fyr eller gran." + "da": "Et træ af en art med nåle, såsom fyr eller gran.", + "ca": "Arbre d'una espècie amb agulles, com el pi o l'avet." } }, { @@ -826,7 +844,8 @@ "ru": "Если вы не уверены в том, лиственное это дерево или хвойное.", "de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt.", "es": "Si no estás seguro de si es un árbol de hoja ancha o de hoja de aguja.", - "da": "Hvis du ikke er sikker på, om det er et løv- eller nåletræ." + "da": "Hvis du ikke er sikker på, om det er et løv- eller nåletræ.", + "ca": "Si no esteu segur de si es tracta d'un arbre amb fulles amples o amb fulles d'agulles." } } ], @@ -874,6 +893,7 @@ "es": "Una capa que muestra árboles", "de": "Eine Ebene, die Bäume zeigt", "fr": "Une couche montrant les arbres", - "da": "Et lag, der viser træer" + "da": "Et lag, der viser træer", + "ca": "Una capa que mostra arbres" } } diff --git a/assets/layers/usersettings/usersettings.json b/assets/layers/usersettings/usersettings.json index 10d21c736..e4f8d8bcb 100644 --- a/assets/layers/usersettings/usersettings.json +++ b/assets/layers/usersettings/usersettings.json @@ -114,44 +114,51 @@ ] }, "render": { - "en": "This thematic map has a predefined background layer set. Your default theme setting does not apply" + "en": "This thematic map has a predefined background layer set. Your default theme setting does not apply", + "ca": "Aquest mapa temàtic té un conjunt de capes de fons predefinides. La configuració predeterminada del tema no s'aplica" } }, { "id": "background-layer", "question": { - "en": "What background layer should be shown by default?" + "en": "What background layer should be shown by default?", + "ca": "Quina capa de fons s'ha de mostrar per defecte?" }, "condition": "_theme:backgroundLayer=", "mappings": [ { "if": "mapcomplete-preferred-background-layer=", "then": { - "en": "Use the default background layer" + "en": "Use the default background layer", + "ca": "Utilitzeu la capa de fons predeterminada" } }, { "if": "mapcomplete-preferred-background-layer=osm", "then": { - "en": "Use OpenStreetMap-carto as default layer" + "en": "Use OpenStreetMap-carto as default layer", + "ca": "Utilitzeu OpenStreetMap-carto com a capa predeterminada" } }, { "if": "mapcomplete-preferred-background-layer=photo", "then": { - "en": "Use aerial imagery as default background" + "en": "Use aerial imagery as default background", + "ca": "Utilitzeu imatges aèries com a fons predeterminat" } }, { "if": "mapcomplete-preferred-background-layer=map", "then": { - "en": "Use a non-openstreetmap based map as default background" + "en": "Use a non-openstreetmap based map as default background", + "ca": "Utilitzeu un mapa que no sigui openstreetmap com a fons predeterminat" } }, { "if": "mapcomplete-preferred-background-layer:={__current_background}", "then": { - "en": "Use the current background layer ({__current_background}) as default background" + "en": "Use the current background layer ({__current_background}) as default background", + "ca": "Utilitzeu la capa de fons actual ({__current_background}) com a fons predeterminat" }, "hideInAnswer": { "or": [ @@ -164,7 +171,8 @@ { "if": "mapcomplete-preferred-background-layer~*", "then": { - "en": "Use background layer {mapcomplete-preferred-background-layer} as default background" + "en": "Use background layer {mapcomplete-preferred-background-layer} as default background", + "ca": "Utilitza la capa de fons {mapcomplete-preferred-background-layer} com a fons predeterminat" }, "hideInAnswer": true } @@ -287,7 +295,8 @@ "de": "Sollen Fragen für unbekannte Datenfelder einzeln oder zusammen angezeigt werden?", "fr": "Est-ce que les questions pour les champs sans donnée doivent apparaître une à une ou toutes ensembles ?", "pt": "As perguntas para campos de dados desconhecidos devem aparecer uma a uma ou juntas?", - "ca": "Les preguntes amb camps de dades desconeguts haurien d'aparèixer una per una o juntes?" + "ca": "Les preguntes amb camps de dades desconeguts haurien d'aparèixer una per una o juntes?", + "nl": "Moeten onbeantwoorde vragen om beurt of allemaal samen getoond worden?" }, "mappings": [ { @@ -297,7 +306,8 @@ "de": "Alle Fragen in der Infobox zusammen anzeigen", "ca": "Mostra totes les preguntes al quadre d'informació", "fr": "Afficher toutes les question en même temps dans l'infobox", - "pt": "Mostrar todas as perguntas na caixa de informações juntas" + "pt": "Mostrar todas as perguntas na caixa de informações juntas", + "nl": "Toon alle onbeantwoorde vragen" } }, { diff --git a/assets/layers/vending_machine/vending_machine.json b/assets/layers/vending_machine/vending_machine.json index b9a92c1ed..b75ba3e53 100644 --- a/assets/layers/vending_machine/vending_machine.json +++ b/assets/layers/vending_machine/vending_machine.json @@ -285,7 +285,8 @@ "if": "vending=meat", "then": { "en": "Meat products are being sold", - "nl": "Vleesproducten worden hier verkocht" + "nl": "Vleesproducten worden hier verkocht", + "ca": "Es venen productes carnis" }, "icon": "./assets/layers/id_presets/temaki-meat.svg" } @@ -371,10 +372,12 @@ "builtin": "phone", "override": { "question": { - "en": "What is the phone number of the operator of this vending machine?" + "en": "What is the phone number of the operator of this vending machine?", + "ca": "Quin és el número de telèfon de l'operador d'aquesta màquina expenedora?" }, "questionHint": { - "en": "This is the number you can call in case of problems with the vending machine" + "en": "This is the number you can call in case of problems with the vending machine", + "ca": "Aquest és el número al qual podeu trucar en cas de problemes amb la màquina expenedora" } } } @@ -805,25 +808,29 @@ { "osmTags": "vending~i~.*parking_tickets.*", "question": { - "en": "Sale of parking" + "en": "Sale of parking", + "ca": "Venda d'aparcament" } }, { "osmTags": "vending=elongated_coin", "question": { - "en": "Sale of pressed pennies" + "en": "Sale of pressed pennies", + "ca": "Venda de monedes premsades" } }, { "osmTags": "vending~i~.*public_transport_tickets.*", "question": { - "en": "Sale of public transport tickets" + "en": "Sale of public transport tickets", + "ca": "Venda de bitllets de transport públic" } }, { "osmTags": "vending=meat", "question": { - "en": "Sale of meat products" + "en": "Sale of meat products", + "ca": "Venda de productes carnis" } } ] diff --git a/assets/themes/clock/clock.json b/assets/themes/clock/clock.json index 95b4f4ebd..3e2c1a1ae 100644 --- a/assets/themes/clock/clock.json +++ b/assets/themes/clock/clock.json @@ -15,7 +15,7 @@ "en": "Map showing all public clocks", "nl": "Kaart met alle openbare klokken", "ca": "Mapa amb tots els rellotges públics", - "de": "Karte mit allen öffentlichen Uhren", + "de": "Eine Karte mit öffentlichen Uhren", "es": "Mapa con todos los relojes públicos", "cs": "Mapa zobrazující všechny veřejné hodiny", "fr": "Carte affichant toutes les horloges publiques" diff --git a/assets/themes/elongated_coin/elongated_coin.json b/assets/themes/elongated_coin/elongated_coin.json index 4ac8f93a1..c1e6b25b6 100644 --- a/assets/themes/elongated_coin/elongated_coin.json +++ b/assets/themes/elongated_coin/elongated_coin.json @@ -2,13 +2,13 @@ "id": "elongated_coin", "title": { "en": "Penny Presses", - "de": "Münzpressen", + "de": "Münzprägeautomaten", "es": "Prensa de céntimos", "ca": "Premsa de cèntims" }, "description": { "en": "Find penny presses to create your own elongated coins.", - "de": "Finde Münzpresse um deine eigenen Prägemünzen zu Pressen.", + "de": "Finde Automaten um Souvenirmünzen zu prägen.", "es": "Encuentra prensas de centimos para crear tus propias monedas alargadas.", "ca": "Trobeu premses de cèntims per crear les vostres pròpies monedes allargades." }, diff --git a/langs/layers/ca.json b/langs/layers/ca.json index aaf35b26e..c6888ea26 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -35,16 +35,6 @@ "1": { "title": "un mupi" }, - "10": { - "description": "S'utilitza per a cartells publicitaris, rètols de neó, logotips i cartells en entrades institucionals", - "title": "un lletrer" - }, - "11": { - "title": "una escupltura" - }, - "12": { - "title": "una paret pintada" - }, "2": { "title": "un mupi sobre la paret" }, @@ -71,6 +61,16 @@ }, "9": { "title": "un tòtem" + }, + "10": { + "description": "S'utilitza per a cartells publicitaris, rètols de neó, logotips i cartells en entrades institucionals", + "title": "un lletrer" + }, + "11": { + "title": "una escupltura" + }, + "12": { + "title": "una paret pintada" } }, "tagRenderings": { @@ -165,9 +165,6 @@ "1": { "then": "Açò és un tauló d'anunis" }, - "10": { - "then": "Açò és una paret pintada" - }, "2": { "then": "Açò és una columna" }, @@ -191,6 +188,9 @@ }, "9": { "then": "Açò és un tòtem" + }, + "10": { + "then": "Açò és una paret pintada" } }, "question": "Quin tipus d'element publicitari és aquest?", @@ -205,9 +205,6 @@ "1": { "then": "Tauló d'anuncis" }, - "10": { - "then": "Paret Pintada" - }, "2": { "then": "Mupi" }, @@ -231,6 +228,9 @@ }, "9": { "then": "Tòtem" + }, + "10": { + "then": "Paret Pintada" } } } @@ -312,15 +312,6 @@ "1": { "then": "Mural" }, - "10": { - "then": "Azulejo (Rajoles decoratives espanyoles i portugueses)" - }, - "11": { - "then": "Enrajolat" - }, - "12": { - "then": "Tallat a la fusta" - }, "2": { "then": "Pintura" }, @@ -344,6 +335,15 @@ }, "9": { "then": "Relleu" + }, + "10": { + "then": "Azulejo (Rajoles decoratives espanyoles i portugueses)" + }, + "11": { + "then": "Enrajolat" + }, + "12": { + "then": "Tallat a la fusta" } }, "question": "Quin tipus d'obra és aquesta peça?", @@ -1830,27 +1830,6 @@ "1": { "question": "Té un connector

Schuko sense pin de terra (CEE7/4 tipus F)
connector" }, - "10": { - "question": "Té un connector
Tipus 2 amb cable (mennekes)
" - }, - "11": { - "question": "Té un connector
CCS Tesla Supercharger (un tipus2_css de marca)
" - }, - "12": { - "question": "Té un connector
Tesla Supercharger (destination)
" - }, - "13": { - "question": "Té un connector
Tesla Supercharger (Destination) (Tipus 2 amb un cable de marca tesla)
" - }, - "14": { - "question": "Té un connector
USB per a carregar telèfons i dispositius electrònics petits
" - }, - "15": { - "question": "Té un connector
Bosch Active Connect amb 3 pins i cable
" - }, - "16": { - "question": "Té un connector
Bosch Active Connect amb 5 pins i cable
" - }, "2": { "question": "Té un connector
endoll de paret Europeu amb un pin de terra (CEE7/4 tipus F)
" }, @@ -1874,6 +1853,27 @@ }, "9": { "question": "Té un connector
CCS Tipus 2 (mennekes)
" + }, + "10": { + "question": "Té un connector
Tipus 2 amb cable (mennekes)
" + }, + "11": { + "question": "Té un connector
CCS Tesla Supercharger (un tipus2_css de marca)
" + }, + "12": { + "question": "Té un connector
Tesla Supercharger (destination)
" + }, + "13": { + "question": "Té un connector
Tesla Supercharger (Destination) (Tipus 2 amb un cable de marca tesla)
" + }, + "14": { + "question": "Té un connector
USB per a carregar telèfons i dispositius electrònics petits
" + }, + "15": { + "question": "Té un connector
Bosch Active Connect amb 3 pins i cable
" + }, + "16": { + "question": "Té un connector
Bosch Active Connect amb 5 pins i cable
" } } } @@ -1929,6 +1929,30 @@ "1": { "then": "Endoll de paret Schuko sense pin a terra (CEE7/4 tipus F)" }, + "2": { + "then": "Endoll de paret Europeu amb pin de terra (CEE7/4 tipus E)" + }, + "3": { + "then": "Endoll de paret Europeu amb pin a terra (CEE7/4 tipus E)" + }, + "4": { + "then": "Chademo" + }, + "5": { + "then": "Chademo" + }, + "6": { + "then": "Tipus 1 amb cable (J1772)" + }, + "7": { + "then": "Tipus 1 amb cable (J1772)" + }, + "8": { + "then": "Tipus 1 sense cable (J1772)" + }, + "9": { + "then": "Tipus 1 sense cable (J1772)" + }, "10": { "then": "CSS 1Tipus 1 (també conegut com Tipus 1 combo)" }, @@ -1959,9 +1983,6 @@ "19": { "then": "Tipus 2 amb cable (mennekes)" }, - "2": { - "then": "Endoll de paret Europeu amb pin de terra (CEE7/4 tipus E)" - }, "20": { "then": "CSS Supercarregador Tesla (un tipus2_css de la marca)" }, @@ -1992,32 +2013,11 @@ "29": { "then": "Bosch Active Connect amb 3 pins i cable" }, - "3": { - "then": "Endoll de paret Europeu amb pin a terra (CEE7/4 tipus E)" - }, "30": { "then": "Bosch Active Connect amb 5 pins i cable" }, "31": { "then": "Bosch Active Connect amb 5 pins i cable" - }, - "4": { - "then": "Chademo" - }, - "5": { - "then": "Chademo" - }, - "6": { - "then": "Tipus 1 amb cable (J1772)" - }, - "7": { - "then": "Tipus 1 amb cable (J1772)" - }, - "8": { - "then": "Tipus 1 sense cable (J1772)" - }, - "9": { - "then": "Tipus 1 sense cable (J1772)" } }, "question": "Quins tipus de connexions de càrrega estan disponibles aquí?" @@ -2855,9 +2855,6 @@ "1": { "then": "Aquesta via ciclista està pavimentada" }, - "10": { - "then": "Aquesta via ciclista està feta de grava fina" - }, "2": { "then": "Aquesta via ciclista està feta d'asfalt" }, @@ -2881,6 +2878,9 @@ }, "9": { "then": "Aquesta via ciclista està feta de grava" + }, + "10": { + "then": "Aquesta via ciclista està feta de grava fina" } }, "question": "De quina superfície està fet aquesta via ciclista?", @@ -2926,9 +2926,6 @@ "1": { "then": "Aquest carril bici està pavimentat" }, - "10": { - "then": "Aquesta via ciclista està feta de gravilla" - }, "2": { "then": "Aquest carril bici està fet d'asfalt" }, @@ -2940,6 +2937,9 @@ }, "9": { "then": "Aquesta via ciclista està feta de grava" + }, + "10": { + "then": "Aquesta via ciclista està feta de gravilla" } }, "question": "De què està feta la superfície d'aquest carrer?", @@ -3982,21 +3982,6 @@ "1": { "then": "Aquesta estació de fitness té un cartell amb instruccions per a un exercici concret." }, - "10": { - "then": "Aquesta estació de gimnàs té esglaons." - }, - "11": { - "then": "Aquesta estació de fitness disposa de cons per fer salts de granota." - }, - "12": { - "then": "Aquesta estació de fitness té bigues per saltar." - }, - "13": { - "then": "Aquesta estació de fitness té obstacles per a travesar." - }, - "14": { - "then": "Aquesta estació de fitness té una paret per enfilar-se." - }, "2": { "then": "Aquesta estació de fitness té una instal·lació per fer abdominals." }, @@ -4020,6 +4005,21 @@ }, "9": { "then": "Aquesta estació de fitness té llocs per fer exercicis d'eslàlom." + }, + "10": { + "then": "Aquesta estació de gimnàs té esglaons." + }, + "11": { + "then": "Aquesta estació de fitness disposa de cons per fer salts de granota." + }, + "12": { + "then": "Aquesta estació de fitness té bigues per saltar." + }, + "13": { + "then": "Aquesta estació de fitness té obstacles per a travesar." + }, + "14": { + "then": "Aquesta estació de fitness té una paret per enfilar-se." } } } @@ -4138,21 +4138,6 @@ "1": { "then": "Això és una fregiduria" }, - "10": { - "then": "Aquí es serveixen plats xinesos" - }, - "11": { - "then": "Aquí es serveixen plats grecs" - }, - "12": { - "then": "Aquí es serveixen plats indis" - }, - "13": { - "then": "Aquí es serveixen plats turcs" - }, - "14": { - "then": "Aquí es serveixen plats tailandesos" - }, "2": { "then": "Principalment serveix pasta" }, @@ -4176,6 +4161,21 @@ }, "9": { "then": "Aquí es serveixen plats francesos" + }, + "10": { + "then": "Aquí es serveixen plats xinesos" + }, + "11": { + "then": "Aquí es serveixen plats grecs" + }, + "12": { + "then": "Aquí es serveixen plats indis" + }, + "13": { + "then": "Aquí es serveixen plats turcs" + }, + "14": { + "then": "Aquí es serveixen plats tailandesos" } }, "question": "Quin menjar es serveix aquí?", @@ -5332,19 +5332,6 @@ } } }, - "10": { - "options": { - "0": { - "question": "Totes les notes" - }, - "1": { - "question": "Oculta les notes d'importació" - }, - "2": { - "question": "Mostrar només les notes d'importació" - } - } - }, "2": { "options": { "0": { @@ -5400,6 +5387,19 @@ "question": "Sols mostra les notes obertes" } } + }, + "10": { + "options": { + "0": { + "question": "Totes les notes" + }, + "1": { + "question": "Oculta les notes d'importació" + }, + "2": { + "question": "Mostrar només les notes d'importació" + } + } } }, "name": "Notes d'OpenStreetMap", @@ -5708,12 +5708,6 @@ "1": { "then": "Aquesta és una plaça d'aparcament normal." }, - "10": { - "then": "Es tracta d'una plaça d'aparcament reservada per a pares amb fills." - }, - "11": { - "then": "Es tracta d'una plaça d'aparcament reservada al personal." - }, "2": { "then": "Aquesta és una plaça d'aparcament per a minusvàlids." }, @@ -5731,6 +5725,12 @@ }, "9": { "then": "Es tracta d'una plaça d'aparcament reservada per a motos." + }, + "10": { + "then": "Es tracta d'una plaça d'aparcament reservada per a pares amb fills." + }, + "11": { + "then": "Es tracta d'una plaça d'aparcament reservada al personal." } } } @@ -6294,18 +6294,6 @@ "1": { "then": "S'accepten monedes de 2 cèntims" }, - "10": { - "then": "S'accepten monedes de 20 cèntims" - }, - "12": { - "then": "S'accepten monedes d'1 franc" - }, - "13": { - "then": "S'accepten monedes de 2 francs" - }, - "14": { - "then": "S'accepten monedes de 5 francs" - }, "2": { "then": "S'accepten monedes de 5 cèntims" }, @@ -6329,6 +6317,18 @@ }, "9": { "then": "S'accepten monedes de 10 cèntims" + }, + "10": { + "then": "S'accepten monedes de 20 cèntims" + }, + "12": { + "then": "S'accepten monedes d'1 franc" + }, + "13": { + "then": "S'accepten monedes de 2 francs" + }, + "14": { + "then": "S'accepten monedes de 5 francs" } }, "question": "Quines monedes es poden utilitzar per a pagar aquí?" @@ -6341,15 +6341,6 @@ "1": { "then": "S'accepten bitllets de 10 euros" }, - "10": { - "then": "S'accepten bitllets de 100 francs" - }, - "11": { - "then": "S'accepten bitllets de 200 francs" - }, - "12": { - "then": "S'accepten bitllets de 1000 francs" - }, "2": { "then": "S'accepten bitllets de 20 euros" }, @@ -6373,6 +6364,15 @@ }, "9": { "then": "S'accepten bitllets de 50 francs" + }, + "10": { + "then": "S'accepten bitllets de 100 francs" + }, + "11": { + "then": "S'accepten bitllets de 200 francs" + }, + "12": { + "then": "S'accepten bitllets de 1000 francs" } }, "question": "Amb quins bitllets pot pagar aquí?" @@ -6739,6 +6739,30 @@ "1": { "question": "Reciclatge de piles" }, + "2": { + "question": "Reciclatge de cartrons de begudes" + }, + "3": { + "question": "Reciclatge de llaunes" + }, + "4": { + "question": "Reciclatge de roba" + }, + "5": { + "question": "Reciclatge d'oli de cuina" + }, + "6": { + "question": "Reciclatge d'oli de motor" + }, + "7": { + "question": "Reciclatge de tubs fluorescents" + }, + "8": { + "question": "Reciclatge de residus verds" + }, + "9": { + "question": "Reciclatge d'ampolles de vidre" + }, "10": { "question": "Reciclatge de vidre" }, @@ -6769,35 +6793,11 @@ "19": { "question": "Reciclatge del rebuig" }, - "2": { - "question": "Reciclatge de cartrons de begudes" - }, "20": { "question": "Reciclatge de cartutxos d'impressora" }, "21": { "question": "Reciclatge de bicicletes" - }, - "3": { - "question": "Reciclatge de llaunes" - }, - "4": { - "question": "Reciclatge de roba" - }, - "5": { - "question": "Reciclatge d'oli de cuina" - }, - "6": { - "question": "Reciclatge d'oli de motor" - }, - "7": { - "question": "Reciclatge de tubs fluorescents" - }, - "8": { - "question": "Reciclatge de residus verds" - }, - "9": { - "question": "Reciclatge d'ampolles de vidre" } } }, @@ -6865,6 +6865,30 @@ "1": { "then": "Aquí es poden reciclar els cartons de begudes" }, + "2": { + "then": "Aquí es poden reciclar llaunes" + }, + "3": { + "then": "Aquí es pot reciclar roba" + }, + "4": { + "then": "Aquí es pot reciclar oli de cuina" + }, + "5": { + "then": "Aquí es pot reciclar oli de motor" + }, + "6": { + "then": "Aquí es poden reciclar tub fluroescents" + }, + "7": { + "then": "Aquí es poden reciclar residus verds" + }, + "8": { + "then": "Ací es poden reciclar residus orgànics" + }, + "9": { + "then": "Aquí es poden reciclar ampolles de vidre" + }, "10": { "then": "Aquí es pot reciclar vidre" }, @@ -6895,9 +6919,6 @@ "19": { "then": "Aquí es poden reciclar sabates" }, - "2": { - "then": "Aquí es poden reciclar llaunes" - }, "20": { "then": "Aquí es poden reciclar petits electrodomèstics" }, @@ -6912,27 +6933,6 @@ }, "24": { "then": "Aquí es poden reciclar bicicletes" - }, - "3": { - "then": "Aquí es pot reciclar roba" - }, - "4": { - "then": "Aquí es pot reciclar oli de cuina" - }, - "5": { - "then": "Aquí es pot reciclar oli de motor" - }, - "6": { - "then": "Aquí es poden reciclar tub fluroescents" - }, - "7": { - "then": "Aquí es poden reciclar residus verds" - }, - "8": { - "then": "Ací es poden reciclar residus orgànics" - }, - "9": { - "then": "Aquí es poden reciclar ampolles de vidre" } }, "question": "Què es pot reciclar aquí?" @@ -7638,12 +7638,6 @@ "1": { "then": "Aquest fanal utilitza LED" }, - "10": { - "then": "Aquest fanal utilitza làmpades de sodi d'alta pressió (taronja amb blanc)" - }, - "11": { - "then": "Aquest fanal s'il·lumina amb gas" - }, "2": { "then": "Aquest fanal utilitza il·luminació incandescent" }, @@ -7667,6 +7661,12 @@ }, "9": { "then": "Aquest fanal utilitza làmpades de sodi de baixa pressió (taronja monocroma)" + }, + "10": { + "then": "Aquest fanal utilitza làmpades de sodi d'alta pressió (taronja amb blanc)" + }, + "11": { + "then": "Aquest fanal s'il·lumina amb gas" } }, "question": "Quin tipus d'il·luminació utilitza aquest fanal?" @@ -8767,6 +8767,30 @@ "1": { "question": "Venda de begudes" }, + "2": { + "question": "Venda de llaminadures" + }, + "3": { + "question": "Venda de menjar" + }, + "4": { + "question": "Venda de tabaco" + }, + "5": { + "question": "Venda de preservatius" + }, + "6": { + "question": "Venda de cafè" + }, + "7": { + "question": "Venda d'aigua" + }, + "8": { + "question": "Venda de diaris" + }, + "9": { + "question": "Venda de càmeres interiors de bicicletes" + }, "10": { "question": "Venda de llet" }, @@ -8797,32 +8821,8 @@ "19": { "question": "Venda de bitllets de transport públic" }, - "2": { - "question": "Venda de llaminadures" - }, "20": { "question": "Venda de productes carnis" - }, - "3": { - "question": "Venda de menjar" - }, - "4": { - "question": "Venda de tabaco" - }, - "5": { - "question": "Venda de preservatius" - }, - "6": { - "question": "Venda de cafè" - }, - "7": { - "question": "Venda d'aigua" - }, - "8": { - "question": "Venda de diaris" - }, - "9": { - "question": "Venda de càmeres interiors de bicicletes" } } } @@ -8869,6 +8869,30 @@ "1": { "then": "Es venen llaminadures" }, + "2": { + "then": "Es ven menjar" + }, + "3": { + "then": "Es ven tabaco" + }, + "4": { + "then": "Es venen preservatius" + }, + "5": { + "then": "Es ven cafè" + }, + "6": { + "then": "Es ven aigua" + }, + "7": { + "then": "Es venen diaris" + }, + "8": { + "then": "Es venen càmeres interiors de bicicletes" + }, + "9": { + "then": "Es ven llet" + }, "10": { "then": "Es ven pa" }, @@ -8898,30 +8922,6 @@ }, "19": { "then": "Es venen productes carnis" - }, - "2": { - "then": "Es ven menjar" - }, - "3": { - "then": "Es ven tabaco" - }, - "4": { - "then": "Es venen preservatius" - }, - "5": { - "then": "Es ven cafè" - }, - "6": { - "then": "Es ven aigua" - }, - "7": { - "then": "Es venen diaris" - }, - "8": { - "then": "Es venen càmeres interiors de bicicletes" - }, - "9": { - "then": "Es ven llet" } }, "question": "Que ven aquesta màquina expenedora?", @@ -9258,4 +9258,4 @@ } } } -} +} \ No newline at end of file diff --git a/langs/layers/de.json b/langs/layers/de.json index 0af69a0bd..465881a40 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -35,16 +35,6 @@ "1": { "title": "eine freistehende Posterbox" }, - "10": { - "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", - "title": "ein Schild" - }, - "11": { - "title": "eine Skulptur" - }, - "12": { - "title": "eine Wandmalerei" - }, "2": { "title": "eine wandmontierte Posterbox" }, @@ -71,6 +61,16 @@ }, "9": { "title": "ein Totem" + }, + "10": { + "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", + "title": "ein Schild" + }, + "11": { + "title": "eine Skulptur" + }, + "12": { + "title": "eine Wandmalerei" } }, "tagRenderings": { @@ -165,9 +165,6 @@ "1": { "then": "Dies ist ein Brett" }, - "10": { - "then": "Dies ist eine Wandmalerei" - }, "2": { "then": "Dies ist eine Litfaßsäule" }, @@ -191,6 +188,9 @@ }, "9": { "then": "Dies ist ein Totem" + }, + "10": { + "then": "Dies ist eine Wandmalerei" } }, "question": "Welche Art von Werbung ist das?", @@ -205,9 +205,6 @@ "1": { "then": "Brett" }, - "10": { - "then": "Wandmalerei" - }, "2": { "then": "Posterbox" }, @@ -231,6 +228,9 @@ }, "9": { "then": "Totem" + }, + "10": { + "then": "Wandmalerei" } } } @@ -312,15 +312,6 @@ "1": { "then": "Wandbild" }, - "10": { - "then": "Azulejo (spanische dekorative Fliesenarbeit)" - }, - "11": { - "then": "Fliesenarbeit" - }, - "12": { - "then": "Holzschnitzerei" - }, "2": { "then": "Malerei" }, @@ -344,6 +335,15 @@ }, "9": { "then": "Relief" + }, + "10": { + "then": "Azulejo (spanische dekorative Fliesenarbeit)" + }, + "11": { + "then": "Fliesenarbeit" + }, + "12": { + "then": "Holzschnitzerei" } }, "question": "Um welche Art Kunstwerk handelt es sich?", @@ -1837,27 +1837,6 @@ "1": { "question": "Verfügt über einen
Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)
" }, - "10": { - "question": "Hat einen
Typ 2 (Mennekes)
Anschluss mit Kabel" - }, - "11": { - "question": "Hat einen
Tesla Supercharger CCS (Typ 2 CSS vonTesla)
Anschluss" - }, - "12": { - "question": "Hat einen
Tesla Supercharger (Destination)
Anschluss" - }, - "13": { - "question": "Hat einen
Tesla Supercharger (Destination) (Typ 2 von Tesla)
Anschluss mit Kabel" - }, - "14": { - "question": "Hat einen
USB-Anschluss zum Aufladen von Telefonen und kleinen Elektrogeräten
" - }, - "15": { - "question": "Hat einen
Bosch Active Connect Anschluss mit 3 Pins
und Kabel" - }, - "16": { - "question": "Hat einen
Bosch Active Connect Anschluss mit 5 Pins
und Kabel" - }, "2": { "question": "Verfügt über einen
europäischen Netzstecker mit Erdungsstift (CEE7/4 Typ E)
Anschluss" }, @@ -1881,6 +1860,27 @@ }, "9": { "question": "Hat einen
Typ 2 CCS (Mennekes)
Anschluss" + }, + "10": { + "question": "Hat einen
Typ 2 (Mennekes)
Anschluss mit Kabel" + }, + "11": { + "question": "Hat einen
Tesla Supercharger CCS (Typ 2 CSS vonTesla)
Anschluss" + }, + "12": { + "question": "Hat einen
Tesla Supercharger (Destination)
Anschluss" + }, + "13": { + "question": "Hat einen
Tesla Supercharger (Destination) (Typ 2 von Tesla)
Anschluss mit Kabel" + }, + "14": { + "question": "Hat einen
USB-Anschluss zum Aufladen von Telefonen und kleinen Elektrogeräten
" + }, + "15": { + "question": "Hat einen
Bosch Active Connect Anschluss mit 3 Pins
und Kabel" + }, + "16": { + "question": "Hat einen
Bosch Active Connect Anschluss mit 5 Pins
und Kabel" } } } @@ -1936,6 +1936,30 @@ "1": { "then": "Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)" }, + "2": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, + "3": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, + "4": { + "then": "Chademo-Anschluss" + }, + "5": { + "then": "Chademo-Anschluss" + }, + "6": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "7": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "8": { + "then": "Typ 1 ohne Kabel (J1772)" + }, + "9": { + "then": " Typ 1 ohne Kabel (J1772)" + }, "10": { "then": "Typ 1 CCS (Typ 1 Combo)" }, @@ -1966,9 +1990,6 @@ "19": { "then": "Typ 2 mit Kabel (mennekes)" }, - "2": { - "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" - }, "20": { "then": "Tesla Supercharger CCS (Typ 2 CSS von Tesla)" }, @@ -1999,32 +2020,11 @@ "29": { "then": " Bosch Active Connect mit 3 Pins und Kabel" }, - "3": { - "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" - }, "30": { "then": "Bosch Active Connect mit 5 Pins und Kabel" }, "31": { "then": " Bosch Active Connect mit 5 Pins und Kabel" - }, - "4": { - "then": "Chademo-Anschluss" - }, - "5": { - "then": "Chademo-Anschluss" - }, - "6": { - "then": "Typ 1 mit Kabel (J1772)" - }, - "7": { - "then": "Typ 1 mit Kabel (J1772)" - }, - "8": { - "then": "Typ 1 ohne Kabel (J1772)" - }, - "9": { - "then": " Typ 1 ohne Kabel (J1772)" } }, "question": "Welche Ladeanschlüsse gibt es hier?" @@ -3562,15 +3562,6 @@ "1": { "then": "Dieser Radweg hat einen festen Belag" }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" - }, "2": { "then": "Der Radweg ist aus Asphalt" }, @@ -3594,6 +3585,15 @@ }, "9": { "then": "Der Radweg ist aus Schotter" + }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" } }, "question": "Was ist der Belag dieses Radwegs?", @@ -3642,15 +3642,6 @@ "1": { "then": "Dieser Radweg hat einen festen Belag" }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" - }, "2": { "then": "Der Radweg ist aus Asphalt" }, @@ -3674,6 +3665,15 @@ }, "9": { "then": "Der Radweg ist aus Schotter" + }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" } }, "question": "Was ist der Belag dieser Straße?", @@ -4750,6 +4750,30 @@ "1": { "then": "Die Fitness-Station hat ein Schild mit Anweisungen für eine bestimmte Übung." }, + "2": { + "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." + }, + "3": { + "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." + }, + "4": { + "then": "Die Fitness-Station hat Stangen zum Dehnen." + }, + "5": { + "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." + }, + "6": { + "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." + }, + "7": { + "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." + }, + "8": { + "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." + }, + "9": { + "then": "Die Fitness-Station hat Pfosten für Slalomübungen." + }, "10": { "then": "Die Fitness-Station hat Trittsteine." }, @@ -4780,9 +4804,6 @@ "19": { "then": "Die Fitness-Station hat Kampfseile (battle ropes)." }, - "2": { - "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." - }, "20": { "then": "Die Fitness-Station hat ein Fahrradergometer." }, @@ -4797,27 +4818,6 @@ }, "24": { "then": "Die Fitness-Station hat eine Slackline." - }, - "3": { - "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." - }, - "4": { - "then": "Die Fitness-Station hat Stangen zum Dehnen." - }, - "5": { - "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." - }, - "6": { - "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." - }, - "7": { - "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." - }, - "8": { - "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." - }, - "9": { - "then": "Die Fitness-Station hat Pfosten für Slalomübungen." } }, "question": "Welche Übungsgeräte gibt es an dieser Fitness-Station?" @@ -4927,21 +4927,6 @@ "1": { "then": "Dies ist eine Pommesbude" }, - "10": { - "then": "Hier werden chinesische Gerichte serviert" - }, - "11": { - "then": "Hier werden griechische Gerichte serviert" - }, - "12": { - "then": "Hier werden indische Gerichte serviert" - }, - "13": { - "then": "Hier werden türkische Gerichte serviert" - }, - "14": { - "then": "Hier werden thailändische Gerichte serviert" - }, "2": { "then": "Bietet vorwiegend Pastagerichte an" }, @@ -4965,6 +4950,21 @@ }, "9": { "then": "Hier werden französische Gerichte serviert" + }, + "10": { + "then": "Hier werden chinesische Gerichte serviert" + }, + "11": { + "then": "Hier werden griechische Gerichte serviert" + }, + "12": { + "then": "Hier werden indische Gerichte serviert" + }, + "13": { + "then": "Hier werden türkische Gerichte serviert" + }, + "14": { + "then": "Hier werden thailändische Gerichte serviert" } }, "question": "Was für Essen gibt es hier?", @@ -6183,19 +6183,6 @@ } } }, - "10": { - "options": { - "0": { - "question": "Alle Notizen" - }, - "1": { - "question": "Importnotizen ausblenden" - }, - "2": { - "question": "Nur Importnotizen anzeigen" - } - } - }, "2": { "options": { "0": { @@ -6251,6 +6238,19 @@ "question": "Nur offene Notizen anzeigen" } } + }, + "10": { + "options": { + "0": { + "question": "Alle Notizen" + }, + "1": { + "question": "Importnotizen ausblenden" + }, + "2": { + "question": "Nur Importnotizen anzeigen" + } + } } }, "name": "OpenStreetMap-Hinweise", @@ -6579,21 +6579,6 @@ "1": { "then": "Dies ist ein normaler Stellplatz." }, - "10": { - "then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist." - }, - "11": { - "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." - }, - "12": { - "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." - }, - "13": { - "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." - }, - "14": { - "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." - }, "2": { "then": "Dies ist ein Behindertenstellplatz." }, @@ -6617,6 +6602,21 @@ }, "9": { "then": "Dies ist ein Stellplatz, der für Motorräder reserviert ist." + }, + "10": { + "then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist." + }, + "11": { + "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." + }, + "12": { + "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." + }, + "13": { + "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." + }, + "14": { + "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." } }, "question": "Welche Art von Stellplatz ist dies?" @@ -7629,6 +7629,30 @@ "1": { "question": "Recycling von Batterien" }, + "2": { + "question": "Recycling von Getränkekartons" + }, + "3": { + "question": "Recycling von Dosen" + }, + "4": { + "question": "Recycling von Kleidung" + }, + "5": { + "question": "Recycling von Speiseöl" + }, + "6": { + "question": "Recycling von Motoröl" + }, + "7": { + "question": "Recycling von Leuchtstoffröhren" + }, + "8": { + "question": "Recycling von Grünabfällen" + }, + "9": { + "question": "Recycling von Glasflaschen" + }, "10": { "question": "Recycling von Glas" }, @@ -7659,35 +7683,11 @@ "19": { "question": "Recycling von Restabfällen" }, - "2": { - "question": "Recycling von Getränkekartons" - }, "20": { "question": "Recycling von Druckerpatronen" }, "21": { "question": "Recycling von Fahrrädern" - }, - "3": { - "question": "Recycling von Dosen" - }, - "4": { - "question": "Recycling von Kleidung" - }, - "5": { - "question": "Recycling von Speiseöl" - }, - "6": { - "question": "Recycling von Motoröl" - }, - "7": { - "question": "Recycling von Leuchtstoffröhren" - }, - "8": { - "question": "Recycling von Grünabfällen" - }, - "9": { - "question": "Recycling von Glasflaschen" } } }, @@ -7755,6 +7755,30 @@ "1": { "then": "Getränkekartons können hier recycelt werden" }, + "2": { + "then": "Dosen können hier recycelt werden" + }, + "3": { + "then": "Kleidung kann hier recycelt werden" + }, + "4": { + "then": "Speiseöl kann hier recycelt werden" + }, + "5": { + "then": "Motoröl kann hier recycelt werden" + }, + "6": { + "then": "Hier können Leuchtstoffröhren recycelt werden" + }, + "7": { + "then": "Grünabfälle können hier recycelt werden" + }, + "8": { + "then": "Bio-Abfall kann hier recycelt werden" + }, + "9": { + "then": "Glasflaschen können hier recycelt werden" + }, "10": { "then": "Glas kann hier recycelt werden" }, @@ -7785,9 +7809,6 @@ "19": { "then": "Schuhe können hier recycelt werden" }, - "2": { - "then": "Dosen können hier recycelt werden" - }, "20": { "then": "Elektrokleingeräte können hier recycelt werden" }, @@ -7802,27 +7823,6 @@ }, "24": { "then": "Fahrräder können hier recycelt werden" - }, - "3": { - "then": "Kleidung kann hier recycelt werden" - }, - "4": { - "then": "Speiseöl kann hier recycelt werden" - }, - "5": { - "then": "Motoröl kann hier recycelt werden" - }, - "6": { - "then": "Hier können Leuchtstoffröhren recycelt werden" - }, - "7": { - "then": "Grünabfälle können hier recycelt werden" - }, - "8": { - "then": "Bio-Abfall kann hier recycelt werden" - }, - "9": { - "then": "Glasflaschen können hier recycelt werden" } }, "question": "Was kann hier recycelt werden?" @@ -8626,12 +8626,6 @@ "1": { "then": "Diese Straßenlaterne verwendet LEDs" }, - "10": { - "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" - }, - "11": { - "then": "Diese Straßenlaterne wird mit Gas beleuchtet" - }, "2": { "then": "Diese Straßenlaterne verwendet Glühlampenlicht" }, @@ -8655,6 +8649,12 @@ }, "9": { "then": "Diese Straßenlaterne verwendet Niederdruck-Natriumdampflampen (einfarbig orange)" + }, + "10": { + "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" + }, + "11": { + "then": "Diese Straßenlaterne wird mit Gas beleuchtet" } }, "question": "Mit welcher Art von Beleuchtung arbeitet diese Straßenlaterne?" @@ -9748,27 +9748,6 @@ "1": { "question": "Verkauf von Getränken" }, - "10": { - "question": "Verkauf von Milch" - }, - "11": { - "question": "Verkauf von Brot" - }, - "12": { - "question": "Verkauf von Eiern" - }, - "13": { - "question": "Verkauf von Käse" - }, - "14": { - "question": "Verkauf von Honig" - }, - "15": { - "question": "Verkauf von Kartoffeln" - }, - "16": { - "question": "Verkauf von Blumen" - }, "2": { "question": "Verkauf von Süßigkeiten" }, @@ -9792,6 +9771,27 @@ }, "9": { "question": "Verkauf von Fahrradschläuchen" + }, + "10": { + "question": "Verkauf von Milch" + }, + "11": { + "question": "Verkauf von Brot" + }, + "12": { + "question": "Verkauf von Eiern" + }, + "13": { + "question": "Verkauf von Käse" + }, + "14": { + "question": "Verkauf von Honig" + }, + "15": { + "question": "Verkauf von Kartoffeln" + }, + "16": { + "question": "Verkauf von Blumen" } } } @@ -9832,30 +9832,6 @@ "1": { "then": "Süßigkeiten werden verkauft" }, - "10": { - "then": "Brot wird verkauft" - }, - "11": { - "then": "Eier werden verkauft" - }, - "12": { - "then": "Käse wird verkauft" - }, - "13": { - "then": "Honig wird verkauft" - }, - "14": { - "then": "Kartoffeln werden verkauft" - }, - "15": { - "then": "Blumen werden verkauft" - }, - "16": { - "then": "Parkscheine werden verkauft" - }, - "18": { - "then": "Fahrscheine werden verkauft" - }, "2": { "then": "Lebensmittel werden verkauft" }, @@ -9879,6 +9855,30 @@ }, "9": { "then": "Milch wird verkauft" + }, + "10": { + "then": "Brot wird verkauft" + }, + "11": { + "then": "Eier werden verkauft" + }, + "12": { + "then": "Käse wird verkauft" + }, + "13": { + "then": "Honig wird verkauft" + }, + "14": { + "then": "Kartoffeln werden verkauft" + }, + "15": { + "then": "Blumen werden verkauft" + }, + "16": { + "then": "Parkscheine werden verkauft" + }, + "18": { + "then": "Fahrscheine werden verkauft" } }, "question": "Was wird in diesem Automaten verkauft?", @@ -10215,4 +10215,4 @@ } } } -} +} \ No newline at end of file diff --git a/langs/layers/en.json b/langs/layers/en.json index c0944b437..fbb4bc018 100644 --- a/langs/layers/en.json +++ b/langs/layers/en.json @@ -4642,6 +4642,19 @@ "question": "Free to use" } } + }, + "10": { + "options": { + "0": { + "question": "No preference towards dogs" + }, + "1": { + "question": "Dogs allowed" + }, + "2": { + "question": "No dogs allowed" + } + } } } }, @@ -5553,6 +5566,84 @@ }, "question": "What is the reference number of this room?", "render": "This room has the reference number {ref}" + }, + "room-capacity": { + "question": "How much people can at most fit in this room?", + "render": "At most {capacity} people fit this room" + }, + "room-type": { + "mappings": { + "0": { + "then": "This is a administrative room" + }, + "1": { + "then": "This is a auditorium" + }, + "2": { + "then": "This is a bedroom" + }, + "3": { + "then": "This is a chapel" + }, + "4": { + "then": "This is a classroom" + }, + "5": { + "then": "This is a classroom" + }, + "6": { + "then": "This is a computer room" + }, + "7": { + "then": "This is a conference room" + }, + "8": { + "then": "This is a crypt" + }, + "9": { + "then": "This is a kitchen" + }, + "10": { + "then": "This is a laboratory" + }, + "11": { + "then": "This is a library" + }, + "12": { + "then": "This is a locker room" + }, + "13": { + "then": "This is a nursery" + }, + "14": { + "then": "This is an office" + }, + "15": { + "then": "This is a prison_cell" + }, + "16": { + "then": "This is a restaurant" + }, + "17": { + "then": "This is a room to perform security checks" + }, + "18": { + "then": "This is a sport room" + }, + "19": { + "then": "This is a storage room" + }, + "20": { + "then": "This is a technical room" + }, + "21": { + "then": "These are toilets" + }, + "22": { + "then": "This is a waiting room" + } + }, + "question": "What type of room is this?" } }, "title": { diff --git a/langs/layers/es.json b/langs/layers/es.json index 26e439ad5..d2c209405 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -35,16 +35,6 @@ "1": { "title": "un mupi" }, - "10": { - "description": "Se utiliza para carteles publicitarios, letreros de neón, logotipos y carteles en entradas institucionales", - "title": "un lletrer" - }, - "11": { - "title": "una escultura" - }, - "12": { - "title": "una pared pintada" - }, "2": { "title": "un mupi sobre la pared" }, @@ -71,6 +61,16 @@ }, "9": { "title": "un tótem" + }, + "10": { + "description": "Se utiliza para carteles publicitarios, letreros de neón, logotipos y carteles en entradas institucionales", + "title": "un lletrer" + }, + "11": { + "title": "una escultura" + }, + "12": { + "title": "una pared pintada" } }, "tagRenderings": { @@ -165,9 +165,6 @@ "1": { "then": "Esto es un tablón de anuncios" }, - "10": { - "then": "Esto es una pared pintada" - }, "2": { "then": "Esto es una columna" }, @@ -191,6 +188,9 @@ }, "9": { "then": "Esto es un tótem" + }, + "10": { + "then": "Esto es una pared pintada" } }, "question": "¿Qué tipo de elemento publicitario es?", @@ -205,9 +205,6 @@ "1": { "then": "Tablon de anuncios" }, - "10": { - "then": "Pared Pintada" - }, "2": { "then": "Mupi" }, @@ -231,6 +228,9 @@ }, "9": { "then": "Tótem" + }, + "10": { + "then": "Pared Pintada" } } } @@ -312,15 +312,6 @@ "1": { "then": "Mural" }, - "10": { - "then": "Azulejo (Baldosas decorativas Españolas y Portuguesas)" - }, - "11": { - "then": "Cerámica" - }, - "12": { - "then": "Tallado en madera" - }, "2": { "then": "Pintura" }, @@ -344,6 +335,15 @@ }, "9": { "then": "Relieve" + }, + "10": { + "then": "Azulejo (Baldosas decorativas Españolas y Portuguesas)" + }, + "11": { + "then": "Cerámica" + }, + "12": { + "then": "Tallado en madera" } }, "question": "¿Qué tipo de obra es esta pieza?", @@ -1440,27 +1440,6 @@ "0": { "question": "Todos los conectores" }, - "10": { - "question": "Tiene un conector
Tipo 2 con cable (mennekes)
" - }, - "11": { - "question": "Tiene un conector
Tesla Supercharger CCS (un tipo2_css de marca)
" - }, - "12": { - "question": "Tiene un conector
Tesla Supercharger (destination)
" - }, - "13": { - "question": "Tiene un conector
Tesla Supercharger (Destination) (Tipo2 A con un cable de marca tesla)
" - }, - "14": { - "question": "Tiene un conector
USB para cargar teléfonos y dispositivos electrónicos pequeños
" - }, - "15": { - "question": "Tiene un conector
Bosch Active Connect con 3 pines y cable
" - }, - "16": { - "question": "Tiene un conector
Bosch Active Connect con 5 pines y cable
" - }, "2": { "question": "Tiene un conector
enchufe de pared Europeo con un pin de tierra (CEE7/4 tipo E)
" }, @@ -1484,6 +1463,27 @@ }, "9": { "question": "Tiene un conector
Tipo 2 CCS (mennekes)
" + }, + "10": { + "question": "Tiene un conector
Tipo 2 con cable (mennekes)
" + }, + "11": { + "question": "Tiene un conector
Tesla Supercharger CCS (un tipo2_css de marca)
" + }, + "12": { + "question": "Tiene un conector
Tesla Supercharger (destination)
" + }, + "13": { + "question": "Tiene un conector
Tesla Supercharger (Destination) (Tipo2 A con un cable de marca tesla)
" + }, + "14": { + "question": "Tiene un conector
USB para cargar teléfonos y dispositivos electrónicos pequeños
" + }, + "15": { + "question": "Tiene un conector
Bosch Active Connect con 3 pines y cable
" + }, + "16": { + "question": "Tiene un conector
Bosch Active Connect con 5 pines y cable
" } } } @@ -1538,6 +1538,30 @@ "1": { "then": "Enchufe de pared Schuko sin pin de tierra (CEE7/4 tipo F)" }, + "2": { + "then": "Enchufe de pared Europeo con pin de tierra (CEE7/4 tipo E)" + }, + "3": { + "then": "Enchufe de pared Europeo con pin de tierra (CEE7/4 tipo E)" + }, + "4": { + "then": "Chademo" + }, + "5": { + "then": "Chademo" + }, + "6": { + "then": "Tipo 1 con cable (J1772)" + }, + "7": { + "then": "Tipo 1 con cable (J1772)" + }, + "8": { + "then": "Tipo 1 sin cable (J1772)" + }, + "9": { + "then": "Tipo 1 sin cable (J1772)" + }, "10": { "then": "CSS Tipo 1 (también conocido como Tipo 1 Combo)" }, @@ -1568,9 +1592,6 @@ "19": { "then": "Tipo 2 con cable (mennekes)" }, - "2": { - "then": "Enchufe de pared Europeo con pin de tierra (CEE7/4 tipo E)" - }, "20": { "then": "CCS Supercargador Tesla (un tipo2_css con marca)" }, @@ -1601,32 +1622,11 @@ "29": { "then": "Bosch Active Connect con 3 pines y cable" }, - "3": { - "then": "Enchufe de pared Europeo con pin de tierra (CEE7/4 tipo E)" - }, "30": { "then": "Bosch Active Connect con 5 pines y cable" }, "31": { "then": "Bosch Active Connect con 5 pines y cable" - }, - "4": { - "then": "Chademo" - }, - "5": { - "then": "Chademo" - }, - "6": { - "then": "Tipo 1 con cable (J1772)" - }, - "7": { - "then": "Tipo 1 con cable (J1772)" - }, - "8": { - "then": "Tipo 1 sin cable (J1772)" - }, - "9": { - "then": "Tipo 1 sin cable (J1772)" } }, "question": "¿Qué tipo de conexiones de carga están disponibles aquí?" @@ -2021,12 +2021,6 @@ "1": { "then": "Este carril bici está pavimentado" }, - "10": { - "then": "Este carril bici está hecho de gravilla" - }, - "12": { - "then": "Este carril bici está hecho de tierra natural" - }, "2": { "then": "Este carril bici está hecho de asfalto" }, @@ -2041,6 +2035,12 @@ }, "9": { "then": "Este carril bici está hecho de grava" + }, + "10": { + "then": "Este carril bici está hecho de gravilla" + }, + "12": { + "then": "Este carril bici está hecho de tierra natural" } }, "question": "¿De qué superficie está hecho este carril bici?", @@ -2086,9 +2086,6 @@ "1": { "then": "Este carril bici está pavimentado" }, - "10": { - "then": "Este carril bici está hecho de gravilla" - }, "2": { "then": "Este carril bici está hecho de asfalto" }, @@ -2100,6 +2097,9 @@ }, "9": { "then": "Este carril bici está hecho de grava" + }, + "10": { + "then": "Este carril bici está hecho de gravilla" } }, "question": "¿De qué esta hecha la superficie de esta calle?", @@ -2710,18 +2710,6 @@ "0": { "then": "Esto es una pizzería" }, - "10": { - "then": "Aquí se sirven platos Chinos" - }, - "11": { - "then": "Aquí se sirven platos Griegos" - }, - "12": { - "then": "Aquí se sirven platos Indios" - }, - "13": { - "then": "Aquí se sirven platos Turcos" - }, "2": { "then": "Principalmente sirve pasta" }, @@ -2742,6 +2730,18 @@ }, "9": { "then": "Aquí se sirven platos Franceses" + }, + "10": { + "then": "Aquí se sirven platos Chinos" + }, + "11": { + "then": "Aquí se sirven platos Griegos" + }, + "12": { + "then": "Aquí se sirven platos Indios" + }, + "13": { + "then": "Aquí se sirven platos Turcos" } }, "question": "¿Qué comida se sirve aquí?", @@ -3139,19 +3139,6 @@ } } }, - "10": { - "options": { - "0": { - "question": "Todas las notas" - }, - "1": { - "question": "Ocultar las notas de importación" - }, - "2": { - "question": "Solo mostrar las notas de importación" - } - } - }, "2": { "options": { "0": { @@ -3207,6 +3194,19 @@ "question": "Solo mostrar las notas abiertas" } } + }, + "10": { + "options": { + "0": { + "question": "Todas las notas" + }, + "1": { + "question": "Ocultar las notas de importación" + }, + "2": { + "question": "Solo mostrar las notas de importación" + } + } } }, "name": "Notas de OpenStreetMap", @@ -3822,6 +3822,21 @@ "1": { "question": "Reciclaje de baterías" }, + "3": { + "question": "Reciclaje de latas" + }, + "4": { + "question": "Reciclaje de ropa" + }, + "5": { + "question": "Reciclaje de aceite de cocina" + }, + "6": { + "question": "Reciclaje de aceite de motor" + }, + "9": { + "question": "Reciclaje de botellas de cristal" + }, "10": { "question": "Reciclaje de cristal" }, @@ -3845,21 +3860,6 @@ }, "18": { "question": "Reciclaje de pequeños electrodomésticos" - }, - "3": { - "question": "Reciclaje de latas" - }, - "4": { - "question": "Reciclaje de ropa" - }, - "5": { - "question": "Reciclaje de aceite de cocina" - }, - "6": { - "question": "Reciclaje de aceite de motor" - }, - "9": { - "question": "Reciclaje de botellas de cristal" } } } @@ -3902,6 +3902,24 @@ "0": { "then": "Aquí se pueden reciclar baterías" }, + "2": { + "then": "Aquí se pueden reciclar latas" + }, + "3": { + "then": "Aquí se puede reciclar ropa" + }, + "4": { + "then": "Aquí se puede reciclar aceite de cocina" + }, + "5": { + "then": "Aquí se puede reciclar aceite de motor" + }, + "8": { + "then": "Aquí se pueden reciclar residuos orgánicos" + }, + "9": { + "then": "Aquí se pueden reciclar botellas de cristal" + }, "10": { "then": "Aquí se puede reciclar cristal" }, @@ -3925,24 +3943,6 @@ }, "19": { "then": "Aquí se pueden reciclar zapatos" - }, - "2": { - "then": "Aquí se pueden reciclar latas" - }, - "3": { - "then": "Aquí se puede reciclar ropa" - }, - "4": { - "then": "Aquí se puede reciclar aceite de cocina" - }, - "5": { - "then": "Aquí se puede reciclar aceite de motor" - }, - "8": { - "then": "Aquí se pueden reciclar residuos orgánicos" - }, - "9": { - "then": "Aquí se pueden reciclar botellas de cristal" } }, "question": "¿Qué se puede reciclar aquí?" @@ -4246,6 +4246,11 @@ "question": "¿De qué color es la luz que emite esta lámpara?", "render": "Esta lámpara emite luz {light:colour}" }, + "count": { + "mappings": { + "0": {} + } + }, "direction": { "question": "¿Hacia donde apunta esta lámpara?", "render": "Esta lámpara apunta hacia {light:direction}" @@ -4286,12 +4291,6 @@ "1": { "then": "Esta lámpara utiliza LEDs" }, - "10": { - "then": "Esta lámpara utiliza lámparas de sodio de alta presión (naranja con blanco)" - }, - "11": { - "then": "Esta lampara se ilumina con gas" - }, "2": { "then": "Esta lámpara utiliza iluminación incandescente" }, @@ -4312,6 +4311,12 @@ }, "9": { "then": "Esta lámpara utiliza lámparas de sodio de baja presión (naranja monocromo)" + }, + "10": { + "then": "Esta lámpara utiliza lámparas de sodio de alta presión (naranja con blanco)" + }, + "11": { + "then": "Esta lampara se ilumina con gas" } }, "question": "¿Qué tipo de iluminación utiliza esta lámpara?" @@ -4886,4 +4891,4 @@ } } } -} +} \ No newline at end of file diff --git a/langs/layers/nl.json b/langs/layers/nl.json index fb632fd5f..e474d249b 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -27,9 +27,6 @@ "advertising": { "name": "Reclame", "presets": { - "12": { - "title": "een muurschildering" - }, "3": { "description": "Een klein uithangbord voor buurtadvertenties, meestal gericht op voetgangers", "title": "een uithangbord" @@ -50,6 +47,9 @@ "8": { "description": "Een stuk groot, weerbestendig textiel met opgedrukte reclameboodschap die permanent aan de muur hangt", "title": "een spandoek" + }, + "12": { + "title": "een muurschildering" } }, "tagRenderings": { @@ -107,9 +107,6 @@ }, "title": { "mappings": { - "10": { - "then": "Muurschildering" - }, "3": { "then": "Aanplakzuil" }, @@ -127,6 +124,9 @@ }, "9": { "then": "Aanplakzuil" + }, + "10": { + "then": "Muurschildering" } } } @@ -208,15 +208,6 @@ "1": { "then": "Muurschildering" }, - "10": { - "then": "Azulejo (Spaanse siertegels)" - }, - "11": { - "then": "Tegelwerk" - }, - "12": { - "then": "Houtsculptuur" - }, "2": { "then": "Schilderij" }, @@ -240,6 +231,15 @@ }, "9": { "then": "Reliëf" + }, + "10": { + "then": "Azulejo (Spaanse siertegels)" + }, + "11": { + "then": "Tegelwerk" + }, + "12": { + "then": "Houtsculptuur" } }, "question": "Wat voor soort kunstwerk is dit?", @@ -1736,27 +1736,6 @@ "1": { "question": "Heeft een
Schuko stekker zonder aardingspin (CEE7/4 type F)
" }, - "10": { - "question": "Heeft een
Type 2 met kabel (J1772)
" - }, - "11": { - "question": "Heeft een
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
" - }, - "12": { - "question": "Heeft een
Tesla Supercharger (destination)
" - }, - "13": { - "question": "Heeft een
Tesla supercharger (destination) (Een Type 2 met kabel en Tesla-logo)
" - }, - "14": { - "question": "Heeft een
USB om GSMs en kleine electronica op te laden
" - }, - "15": { - "question": "Heeft een
Bosch Active Connect met 3 pinnen aan een kabel
" - }, - "16": { - "question": "Heeft een
Bosch Active Connect met 5 pinnen aan een kabel
" - }, "2": { "question": "Heeft een
Europese stekker met aardingspin (CEE7/4 type E)
" }, @@ -1780,6 +1759,27 @@ }, "9": { "question": "Heeft een
Type 2 CCS (mennekes)
" + }, + "10": { + "question": "Heeft een
Type 2 met kabel (J1772)
" + }, + "11": { + "question": "Heeft een
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
" + }, + "12": { + "question": "Heeft een
Tesla Supercharger (destination)
" + }, + "13": { + "question": "Heeft een
Tesla supercharger (destination) (Een Type 2 met kabel en Tesla-logo)
" + }, + "14": { + "question": "Heeft een
USB om GSMs en kleine electronica op te laden
" + }, + "15": { + "question": "Heeft een
Bosch Active Connect met 3 pinnen aan een kabel
" + }, + "16": { + "question": "Heeft een
Bosch Active Connect met 5 pinnen aan een kabel
" } } } @@ -1835,6 +1835,30 @@ "1": { "then": "Schuko stekker zonder aardingspin (CEE7/4 type F)" }, + "2": { + "then": "Europese stekker met aardingspin (CEE7/4 type E)" + }, + "3": { + "then": "Europese stekker met aardingspin (CEE7/4 type E)" + }, + "4": { + "then": "Chademo" + }, + "5": { + "then": "Chademo" + }, + "6": { + "then": "Type 1 met kabel (J1772)" + }, + "7": { + "then": "Type 1 met kabel (J1772)" + }, + "8": { + "then": "Type 1 zonder kabel (J1772)" + }, + "9": { + "then": "Type 1 zonder kabel (J1772)" + }, "10": { "then": "Type 1 CCS (ook gekend als Type 1 Combo)" }, @@ -1865,9 +1889,6 @@ "19": { "then": "Type 2 met kabel (J1772)" }, - "2": { - "then": "Europese stekker met aardingspin (CEE7/4 type E)" - }, "20": { "then": "Tesla Supercharger CCS (een type2 CCS met Tesla-logo)" }, @@ -1898,32 +1919,11 @@ "29": { "then": "Bosch Active Connect met 3 pinnen aan een kabel" }, - "3": { - "then": "Europese stekker met aardingspin (CEE7/4 type E)" - }, "30": { "then": "Bosch Active Connect met 5 pinnen aan een kabel" }, "31": { "then": "Bosch Active Connect met 5 pinnen aan een kabel" - }, - "4": { - "then": "Chademo" - }, - "5": { - "then": "Chademo" - }, - "6": { - "then": "Type 1 met kabel (J1772)" - }, - "7": { - "then": "Type 1 met kabel (J1772)" - }, - "8": { - "then": "Type 1 zonder kabel (J1772)" - }, - "9": { - "then": "Type 1 zonder kabel (J1772)" } }, "question": "Welke laadaansluitingen zijn hier beschikbaar?" @@ -3456,15 +3456,6 @@ "1": { "then": "Dit fietspad is geplaveid" }, - "10": { - "then": "Dit fietspad is gemaakt van fijn grind" - }, - "11": { - "then": "Dit fietspad is gemaakt van kiezelsteentjes" - }, - "12": { - "then": "Dit fietspad is gemaakt van aarde" - }, "2": { "then": "Dit fietspad is gemaakt van asfalt" }, @@ -3488,6 +3479,15 @@ }, "9": { "then": "Dit fietspad is gemaakt van grind" + }, + "10": { + "then": "Dit fietspad is gemaakt van fijn grind" + }, + "11": { + "then": "Dit fietspad is gemaakt van kiezelsteentjes" + }, + "12": { + "then": "Dit fietspad is gemaakt van aarde" } }, "question": "Waaruit is het oppervlak van het fietspad van gemaakt?", @@ -3536,15 +3536,6 @@ "1": { "then": "Dit fietspad is geplaveid" }, - "10": { - "then": "Dit fietspad is gemaakt van fijn grind" - }, - "11": { - "then": "Dit fietspad is gemaakt van kiezelsteentjes" - }, - "12": { - "then": "Dit fietspad is gemaakt van aarde" - }, "2": { "then": "Dit fietspad is gemaakt van asfalt" }, @@ -3568,6 +3559,15 @@ }, "9": { "then": "Dit fietspad is gemaakt van grind" + }, + "10": { + "then": "Dit fietspad is gemaakt van fijn grind" + }, + "11": { + "then": "Dit fietspad is gemaakt van kiezelsteentjes" + }, + "12": { + "then": "Dit fietspad is gemaakt van aarde" } }, "question": "Waaruit is het oppervlak van de straat gemaakt?", @@ -4572,21 +4572,6 @@ "1": { "then": "Dit is een frituur" }, - "10": { - "then": "Dit is een Chinees restaurant" - }, - "11": { - "then": "Dit is een Grieks restaurant" - }, - "12": { - "then": "Dit is een Indisch restaurant" - }, - "13": { - "then": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)" - }, - "14": { - "then": "Dit is een Thaïs restaurant" - }, "2": { "then": "Dit is een pastazaak" }, @@ -4610,6 +4595,21 @@ }, "9": { "then": "Dit is een Frans restaurant" + }, + "10": { + "then": "Dit is een Chinees restaurant" + }, + "11": { + "then": "Dit is een Grieks restaurant" + }, + "12": { + "then": "Dit is een Indisch restaurant" + }, + "13": { + "then": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)" + }, + "14": { + "then": "Dit is een Thaïs restaurant" } }, "question": "Welk soort gerechten worden hier geserveerd?", @@ -5744,19 +5744,6 @@ } } }, - "10": { - "options": { - "0": { - "question": "Alle Notes" - }, - "1": { - "question": "Verberg import Notes" - }, - "2": { - "question": "Toon enkel import Notes" - } - } - }, "2": { "options": { "0": { @@ -5812,6 +5799,19 @@ "question": "Toon enkel open Notes" } } + }, + "10": { + "options": { + "0": { + "question": "Alle Notes" + }, + "1": { + "question": "Verberg import Notes" + }, + "2": { + "question": "Toon enkel import Notes" + } + } } }, "name": "OpenStreetMap Notes", @@ -6107,21 +6107,6 @@ "1": { "then": "Dit is een normale parkeerplek." }, - "10": { - "then": "Deze parkeerplek is gereserveerd voor ouders met kinderen." - }, - "11": { - "then": "Deze parkeerplek is gereserveerd voor personeel." - }, - "12": { - "then": "Deze parkeerplek is gereserveerd voor taxis." - }, - "13": { - "then": "Deze parkeerplek is gereserveerd voor voertuigen met een aanhanger." - }, - "14": { - "then": "Deze parkeerplek is gereserveerd voor autodelen." - }, "2": { "then": "Dit is een gehandicaptenparkeerplaats." }, @@ -6145,6 +6130,21 @@ }, "9": { "then": "Deze parkeerplek is gereserveerd voor motoren." + }, + "10": { + "then": "Deze parkeerplek is gereserveerd voor ouders met kinderen." + }, + "11": { + "then": "Deze parkeerplek is gereserveerd voor personeel." + }, + "12": { + "then": "Deze parkeerplek is gereserveerd voor taxis." + }, + "13": { + "then": "Deze parkeerplek is gereserveerd voor voertuigen met een aanhanger." + }, + "14": { + "then": "Deze parkeerplek is gereserveerd voor autodelen." } }, "question": "Wat voor parkeerplek is dit?" @@ -6705,21 +6705,6 @@ "1": { "then": "Munten van 2 cent worden geaccepteerd" }, - "10": { - "then": "Munten van 20 rappen worden geaccepteerd" - }, - "11": { - "then": "Munten van ½ frank worden geaccepteerd" - }, - "12": { - "then": "Munten van 1 frank worden geaccepteerd" - }, - "13": { - "then": "Munten van 2 frank worden geaccepteerd" - }, - "14": { - "then": "Munten van 5 frank worden geaccepteerd" - }, "2": { "then": "Munten van 5 cent worden geaccepteerd" }, @@ -6743,6 +6728,21 @@ }, "9": { "then": "Munten van 10 rappen worden geaccepteerd" + }, + "10": { + "then": "Munten van 20 rappen worden geaccepteerd" + }, + "11": { + "then": "Munten van ½ frank worden geaccepteerd" + }, + "12": { + "then": "Munten van 1 frank worden geaccepteerd" + }, + "13": { + "then": "Munten van 2 frank worden geaccepteerd" + }, + "14": { + "then": "Munten van 5 frank worden geaccepteerd" } }, "question": "Met welke munten kan je hier betalen?" @@ -6755,15 +6755,6 @@ "1": { "then": "Biljetten van 10 euro worden geaccepteerd" }, - "10": { - "then": "Biljetten van 100 frank worden geaccepteerd" - }, - "11": { - "then": "Biljetten van 200 frank worden geaccepteerd" - }, - "12": { - "then": "Biljetten van 1000 frank worden geaccepteerd" - }, "2": { "then": "Biljetten van 20 euro worden geaccepteerd" }, @@ -6787,6 +6778,15 @@ }, "9": { "then": "Biljetten van 50 frank worden geaccepteerd" + }, + "10": { + "then": "Biljetten van 100 frank worden geaccepteerd" + }, + "11": { + "then": "Biljetten van 200 frank worden geaccepteerd" + }, + "12": { + "then": "Biljetten van 1000 frank worden geaccepteerd" } }, "question": "Met welke bankbiljetten kan je hier betalen?" @@ -7104,6 +7104,30 @@ "1": { "question": "Recycling van batterijen" }, + "2": { + "question": "Recycling van drankpakken" + }, + "3": { + "question": "Recycling van blikken" + }, + "4": { + "question": "Recycling van kleding" + }, + "5": { + "question": "Recycling van frituurvet" + }, + "6": { + "question": "Recycling van motorolie" + }, + "7": { + "question": "Recycling van tl-buizen" + }, + "8": { + "question": "Recycling van groen afval" + }, + "9": { + "question": "Recycling van glazen flessen" + }, "10": { "question": "Recycling van glas" }, @@ -7134,35 +7158,11 @@ "19": { "question": "Recycling van restafval" }, - "2": { - "question": "Recycling van drankpakken" - }, "20": { "question": "Recycling van inktpatronen" }, "21": { "question": "Recycling van fietsen" - }, - "3": { - "question": "Recycling van blikken" - }, - "4": { - "question": "Recycling van kleding" - }, - "5": { - "question": "Recycling van frituurvet" - }, - "6": { - "question": "Recycling van motorolie" - }, - "7": { - "question": "Recycling van tl-buizen" - }, - "8": { - "question": "Recycling van groen afval" - }, - "9": { - "question": "Recycling van glazen flessen" } } }, @@ -7230,6 +7230,30 @@ "1": { "then": "Drankpakken kunnen hier gerecycled worden" }, + "2": { + "then": "Blikken kunnen hier gerecycled worden" + }, + "3": { + "then": "Kleren kunnen hier gerecycled worden" + }, + "4": { + "then": "Frituurvet kan hier gerecycled worden" + }, + "5": { + "then": "Motorolie kan hier gerecycled worden" + }, + "6": { + "then": "TL-buizen kunnen hier gerecycled worden" + }, + "7": { + "then": "Groen afval kan hier gerecycled worden" + }, + "8": { + "then": "Organisch afval kan hier gerecycled worden" + }, + "9": { + "then": "Glazen flessen kunnen hier gerecycled worden" + }, "10": { "then": "Glas kan hier gerecycled worden" }, @@ -7260,9 +7284,6 @@ "19": { "then": "Schoenen kunnen hier gerecycled worden" }, - "2": { - "then": "Blikken kunnen hier gerecycled worden" - }, "20": { "then": "Kleine elektrische apparaten kunnen hier gerecycled worden" }, @@ -7277,27 +7298,6 @@ }, "24": { "then": "Fietsen (en fietswrakken) kunnen hier gerecycled worden" - }, - "3": { - "then": "Kleren kunnen hier gerecycled worden" - }, - "4": { - "then": "Frituurvet kan hier gerecycled worden" - }, - "5": { - "then": "Motorolie kan hier gerecycled worden" - }, - "6": { - "then": "TL-buizen kunnen hier gerecycled worden" - }, - "7": { - "then": "Groen afval kan hier gerecycled worden" - }, - "8": { - "then": "Organisch afval kan hier gerecycled worden" - }, - "9": { - "then": "Glazen flessen kunnen hier gerecycled worden" } }, "question": "Wat kan hier gerecycled worden?" @@ -8024,12 +8024,6 @@ "1": { "then": "Deze lantaarn gebruikt LEDs" }, - "10": { - "then": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)" - }, - "11": { - "then": "Deze lantaarn wordt verlicht met gas" - }, "2": { "then": "Deze lantaarn gebruikt gloeilampen" }, @@ -8053,6 +8047,12 @@ }, "9": { "then": "Deze lantaarn gebruikt lagedruknatriumlampen (monochroom oranje)" + }, + "10": { + "then": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)" + }, + "11": { + "then": "Deze lantaarn wordt verlicht met gas" } }, "question": "Wat voor verlichting gebruikt deze lantaarn?" @@ -9016,27 +9016,6 @@ "1": { "question": "Verkoop van dranken" }, - "10": { - "question": "Verkoop van melk" - }, - "11": { - "question": "Verkoop van brood" - }, - "12": { - "question": "Verkoop van eieren" - }, - "13": { - "question": "Verkoop van kaas" - }, - "14": { - "question": "Verkoop van honing" - }, - "15": { - "question": "Verkoop van aardappelen" - }, - "16": { - "question": "Verkoop van bloemen" - }, "2": { "question": "Verkoop van snoep" }, @@ -9060,6 +9039,27 @@ }, "9": { "question": "Verkoop van fietsbinnenbanden" + }, + "10": { + "question": "Verkoop van melk" + }, + "11": { + "question": "Verkoop van brood" + }, + "12": { + "question": "Verkoop van eieren" + }, + "13": { + "question": "Verkoop van kaas" + }, + "14": { + "question": "Verkoop van honing" + }, + "15": { + "question": "Verkoop van aardappelen" + }, + "16": { + "question": "Verkoop van bloemen" } } } @@ -9100,6 +9100,30 @@ "1": { "then": "Snoep wordt verkocht" }, + "2": { + "then": "Eten wordt verkocht" + }, + "3": { + "then": "Sigaretten worden verkocht" + }, + "4": { + "then": "Condooms worden verkocht" + }, + "5": { + "then": "Koffie wordt verkocht" + }, + "6": { + "then": "Drinkwater wordt verkocht" + }, + "7": { + "then": "Kranten worden verkocht" + }, + "8": { + "then": "Binnenbanden voor fietsen worden verkocht" + }, + "9": { + "then": "Melk wordt verkocht" + }, "10": { "then": "Brood wordt verkocht" }, @@ -9126,30 +9150,6 @@ }, "19": { "then": "Vleesproducten worden hier verkocht" - }, - "2": { - "then": "Eten wordt verkocht" - }, - "3": { - "then": "Sigaretten worden verkocht" - }, - "4": { - "then": "Condooms worden verkocht" - }, - "5": { - "then": "Koffie wordt verkocht" - }, - "6": { - "then": "Drinkwater wordt verkocht" - }, - "7": { - "then": "Kranten worden verkocht" - }, - "8": { - "then": "Binnenbanden voor fietsen worden verkocht" - }, - "9": { - "then": "Melk wordt verkocht" } }, "question": "Wat verkoopt deze verkoopautomaat?", @@ -9487,4 +9487,4 @@ } } } -} +} \ No newline at end of file diff --git a/langs/themes/de.json b/langs/themes/de.json index e0c713f2b..099e67d1e 100644 --- a/langs/themes/de.json +++ b/langs/themes/de.json @@ -991,33 +991,6 @@ "onwheels": { "description": "Auf dieser Karte können Sie öffentlich zugängliche Orte für Rollstuhlfahrer ansehen, bearbeiten oder hinzufügen", "layers": { - "19": { - "override": { - "=title": { - "render": "Statistik" - } - } - }, - "20": { - "override": { - "+tagRenderings": { - "0": { - "render": { - "special": { - "text": "Import" - } - } - }, - "1": { - "render": { - "special": { - "message": "Alle vorgeschlagenen Tags hinzufügen" - } - } - } - } - } - }, "4": { "override": { "filter": { @@ -1060,6 +1033,33 @@ "override": { "name": "Barrierefreie Parkplätze" } + }, + "19": { + "override": { + "=title": { + "render": "Statistik" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "Import" + } + } + }, + "1": { + "render": { + "special": { + "message": "Alle vorgeschlagenen Tags hinzufügen" + } + } + } + } + } } }, "title": "Auf Rädern" @@ -1220,6 +1220,10 @@ "stations": { "description": "Bahnhofsdetails ansehen, bearbeiten und hinzufügen", "layers": { + "3": { + "description": "Ebene mit Bahnhöfen", + "name": "Bahnhöfe" + }, "16": { "description": "Anzeigen der Züge, die von diesem Bahnhof abfahren", "name": "Abfahrtstafeln", @@ -1251,10 +1255,6 @@ "title": { "render": "Abfahrtstafel" } - }, - "3": { - "description": "Ebene mit Bahnhöfen", - "name": "Bahnhöfe" } }, "title": "Bahnhöfe" @@ -1350,4 +1350,4 @@ "shortDescription": "Eine Karte mit Abfalleimern", "title": "Abfalleimer" } -} +} \ No newline at end of file From 8a3f7a012d1abfcbd4ab08f079eaba5eb3f89997 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 28 Sep 2023 23:50:27 +0200 Subject: [PATCH 17/17] Chore: formatting --- Docs/BuiltinIndex.md | 26 +- Docs/BuiltinLayers.md | 134 ++- Docs/BuiltinQuestions.md | 21 +- Docs/CalculatedTags.md | 12 +- Docs/Layers/all_vending_machine.md | 18 +- Docs/Layers/bench.md | 5 +- Docs/Layers/bike_cafe.md | 10 + Docs/Layers/bike_repair_station.md | 18 +- Docs/Layers/cafe_pub.md | 18 +- Docs/Layers/charging_station.md | 18 +- Docs/Layers/charging_station_ebikes.md | 18 +- Docs/Layers/dogfoodb.md | 83 +- Docs/Layers/dogshop.md | 18 +- Docs/Layers/elongated_coin.md | 18 +- Docs/Layers/entrance.md | 18 +- Docs/Layers/fitness_centre.md | 18 +- Docs/Layers/food.md | 83 +- Docs/Layers/friture.md | 83 +- Docs/Layers/hackerspace.md | 18 +- Docs/Layers/indoors.md | 113 ++ Docs/Layers/medical-shops.md | 18 +- Docs/Layers/parking.md | 18 +- Docs/Layers/picnic_table.md | 18 +- Docs/Layers/railway_platforms.md | 18 +- Docs/Layers/reception_desk.md | 18 +- Docs/Layers/school.md | 2 + Docs/Layers/shops.md | 18 +- .../Layers/shops_with_climbing_shoe_repair.md | 18 +- Docs/Layers/shower.md | 18 +- Docs/Layers/sport_shops.md | 18 +- Docs/Layers/surveillance_camera.md | 18 + Docs/Layers/ticket_machine.md | 18 +- Docs/Layers/ticket_validator.md | 18 +- Docs/Layers/toilet.md | 18 +- Docs/Layers/toilet_at_amenity.md | 18 +- Docs/Layers/vending_machine.md | 18 +- Docs/SpecialRenderings.md | 50 +- Docs/TagInfo/mapcomplete_benches.json | 7 +- Docs/TagInfo/mapcomplete_food.json | 58 +- Docs/TagInfo/mapcomplete_fritures.json | 58 +- Docs/TagInfo/mapcomplete_indoors.json | 152 +++ Docs/TagInfo/mapcomplete_nature.json | 7 +- Docs/TagInfo/mapcomplete_onwheels.json | 58 +- Docs/TagInfo/mapcomplete_personal.json | 227 +++- Docs/TagInfo/mapcomplete_pets.json | 58 +- Docs/TagInfo/mapcomplete_playgrounds.json | 7 +- Docs/TagInfo/mapcomplete_surveillance.json | 10 + Docs/URL_Parameters.md | 2 +- .../charging_station/charging_station.json | 2 +- .../layers/questions/dogs_allowed.svg.license | 2 +- .../layers/questions/dogs_leashed.svg.license | 2 +- assets/svg/mangrove_logo.svg.license | 2 + package-lock.json | 16 +- package.json | 1 - .../Actors/PreferredRasterLayerSelector.ts | 76 +- .../ImageProviders/ImageUploadManager.ts | 280 ++--- src/Logic/ImageProviders/ImageUploader.ts | 4 +- src/Logic/ImageProviders/Imgur.ts | 19 +- src/Logic/Osm/Actions/LinkImageAction.ts | 37 +- src/Logic/Osm/ChangesetHandler.ts | 9 +- src/Logic/Osm/OsmConnection.ts | 1030 ++++++++--------- src/Logic/State/GeoLocationState.ts | 93 +- src/Logic/State/UserRelatedState.ts | 70 +- src/Logic/State/UserSettingsMetaTagging.ts | 48 +- src/Logic/Web/MangroveReviews.ts | 201 ++-- src/Models/RasterLayers.ts | 174 +-- .../Conversion/LegacyJsonConvert.ts | 4 +- src/UI/Base/Checkbox.svelte | 9 +- src/UI/Base/FileSelector.svelte | 70 +- src/UI/Base/FromHtml.svelte | 2 +- src/UI/Base/Loading.svelte | 10 +- src/UI/BigComponents/Filterview.svelte | 34 +- src/UI/BigComponents/ThemeIntroPanel.svelte | 78 +- src/UI/Image/UploadImage.svelte | 96 +- src/UI/Image/UploadingImageCounter.svelte | 60 +- src/UI/Map/MapLibreAdaptor.ts | 6 +- src/UI/PlantNet/PlantNet.svelte | 125 +- src/UI/PlantNet/PlantNetSpeciesList.svelte | 39 +- src/UI/PlantNet/SpeciesButton.svelte | 89 +- src/UI/Popup/AddNewPoint/AddNewPoint.svelte | 184 +-- src/UI/Popup/CreateNewNote.svelte | 2 +- src/UI/Popup/LinkableImage.svelte | 18 +- src/UI/Reviews/AllReviews.svelte | 53 +- src/UI/Reviews/ReviewForm.svelte | 101 +- src/UI/Reviews/SingleReview.svelte | 38 +- src/UI/Reviews/StarElement.svelte | 32 +- src/UI/Reviews/StarsBar.svelte | 22 +- src/UI/Reviews/StarsBarIcon.svelte | 7 +- src/UI/SpecialVisualization.ts | 191 +-- src/UI/SpecialVisualizations.ts | 197 ++-- src/UI/StylesheetTestGui.svelte | 2 +- src/UI/Wikipedia/WikipediaArticle.svelte | 34 +- src/UI/Wikipedia/WikipediaPanel.svelte | 2 +- src/assets/contributors.json | 4 +- src/assets/language_native.json | 5 +- src/assets/language_translations.json | 184 +-- src/assets/translators.json | 6 +- 97 files changed, 3350 insertions(+), 2136 deletions(-) create mode 100644 assets/svg/mangrove_logo.svg.license diff --git a/Docs/BuiltinIndex.md b/Docs/BuiltinIndex.md index 5e7f0dd77..75a5ccafb 100644 --- a/Docs/BuiltinIndex.md +++ b/Docs/BuiltinIndex.md @@ -55,7 +55,9 @@ + [minimap](#minimap) + [mastodon](#mastodon) + [contact](#contact) + + [etymology.wikipedia-etymology](#etymologywikipedia-etymology) + [denominations-notes](#denominations-notes) + + [single_level](#single_level) + [survey_date](#survey_date) + [id_presets.shop_types](#id_presetsshop_types) + [school.capacity](#schoolcapacity) @@ -442,9 +444,9 @@ - fitness_centre - food - hackerspace + - indoors - parking - picnic_table - - questions - railway_platforms - reception_desk - shops @@ -858,6 +860,17 @@ +### etymology.wikipedia-etymology + + + + + + - indoors + + + + ### denominations-notes @@ -871,6 +884,17 @@ +### single_level + + + + + + - questions + + + + ### survey_date diff --git a/Docs/BuiltinLayers.md b/Docs/BuiltinLayers.md index 15c328651..17eb11d08 100644 --- a/Docs/BuiltinLayers.md +++ b/Docs/BuiltinLayers.md @@ -61,9 +61,6 @@ + [just_created](#just_created) + [leftover-questions](#leftover-questions) + [all-tags](#all-tags) -1. [matchpoint](#matchpoint) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) 1. [import_candidate](#import_candidate) - [Basic tags for this layer](#basic-tags-for-this-layer) - [Supported attributes](#supported-attributes) @@ -79,9 +76,13 @@ + [inbox](#inbox) + [settings-link](#settings-link) + [logout](#logout) + + [background-layer-readonly](#background-layer-readonly) + + [background-layer](#background-layer) + [picture-license](#picture-license) + [show_tags](#show_tags) + [all-questions-at-once](#all-questions-at-once) + + [fixate-north](#fixate-north) + + [mangrove-keys](#mangrove-keys) + [translations-title](#translations-title) + [translation-mode](#translation-mode) + [translation-help](#translation-help) @@ -120,7 +121,6 @@ MapComplete has a few data layers available in the theme which have special prop - [split_point](#split_point) - [split_road](#split_road) - [current_view](#current_view) - - [matchpoint](#matchpoint) - [import_candidate](#import_candidate) - [usersettings](#usersettings) @@ -476,7 +476,9 @@ Meta-layer, simply showing a bbox in red - This layer is shown at zoomlevel **0** and higher - **This layer is included automatically in every theme. This layer might contain no points** + - This layer is not visible by default and must be enabled in the filter by the user. - Elements don't have a title set and cannot be toggled nor will they show up in the dashboard. If you import this layer in your theme, override `title` to make this toggleable. + - This layer is not visible by default and the visibility cannot be toggled, effectively resulting in a fully hidden layer. This can be useful, e.g. to calculate some metatags. If you want to render this layer (e.g. for debugging), enable it by setting the URL-parameter layer-=true - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` @@ -863,47 +865,6 @@ This tagrendering has no question and is thus read-only - matchpoint -============ - - - - - -The default rendering for a locationInput which snaps onto another object - - - - - - - - This layer is shown at zoomlevel **0** and higher - - This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing a minimap with custom data. - - - - - Basic tags for this layer ---------------------------- - - - -Elements must have the all of following tags to be shown on this layer: - - - - - - - - - Supported attributes ----------------------- - - - - - import_candidate ================== @@ -1043,9 +1004,12 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | +[](https://taginfo.openstreetmap.org/keys/__url_parameter_initialized:language#values) [__url_parameter_initialized:language](https://wiki.openstreetmap.org/wiki/Key:__url_parameter_initialized:language) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:__url_parameter_initialized:language%3Dyes) +[](https://taginfo.openstreetmap.org/keys/mapcomplete-preferred-background-layer#values) [mapcomplete-preferred-background-layer](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-preferred-background-layer) | Multiple choice | [](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3D) [osm](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3Dosm) [photo](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3Dphoto) [map](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3Dmap) [](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3D) [](https://taginfo.openstreetmap.org/keys/mapcomplete-pictures-license#values) [mapcomplete-pictures-license](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-pictures-license) | Multiple choice | [CC0](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-pictures-license%3DCC0) [CC-BY 4.0](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-pictures-license%3DCC-BY 4.0) [CC-BY-SA 4.0](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-pictures-license%3DCC-BY-SA 4.0) [](https://taginfo.openstreetmap.org/keys/mapcomplete-show_tags#values) [mapcomplete-show_tags](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-show_tags) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show_tags%3Dno) [](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show_tags%3D) [yes](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show_tags%3Dyes) [full](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show_tags%3Dfull) [](https://taginfo.openstreetmap.org/keys/mapcomplete-show-all-questions#values) [mapcomplete-show-all-questions](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-show-all-questions) | Multiple choice | [true](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show-all-questions%3Dtrue) [false](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show-all-questions%3Dfalse) +[](https://taginfo.openstreetmap.org/keys/mapcomplete-fixate-north#values) [mapcomplete-fixate-north](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-fixate-north) | Multiple choice | [](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-fixate-north%3D) [yes](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-fixate-north%3Dyes) [](https://taginfo.openstreetmap.org/keys/mapcomplete-translation-mode#values) [mapcomplete-translation-mode](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-translation-mode) | Multiple choice | [false](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-translation-mode%3Dfalse) [true](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-translation-mode%3Dtrue) [mobile](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-translation-mode%3Dmobile) [](https://taginfo.openstreetmap.org/keys/mapcomplete-translation-mode#values) [mapcomplete-translation-mode](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-translation-mode) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-translation-mode%3Dyes) [](https://taginfo.openstreetmap.org/keys/_translation_percentage#values) [_translation_percentage](https://wiki.openstreetmap.org/wiki/Key:_translation_percentage) | Multiple choice | [100](https://wiki.openstreetmap.org/wiki/Tag:_translation_percentage%3D100) @@ -1093,6 +1057,11 @@ This tagrendering has no question and is thus read-only + - *The language was set via an URL-parameter and cannot be set by the user.²* corresponds with `__url_parameter_initialized:language=yes` + + + + ### inbox @@ -1103,8 +1072,8 @@ This tagrendering has no question and is thus read-only - - *{link(Open your inbox,&LBRACE_backend&RBRACE/messages/inbox,)}* corresponds with `_unreadMessages=0` - - *{link(You have &LBRACE_unreadMessages&RBRACE
Open your inbox,&LBRACE_backend&RBRACE/messages/inbox,)}* corresponds with `_unreadMessages>0` + - *{link(Open your inbox,&LBRACE_backend&RBRACE/messages/inbox,,)}* corresponds with `_unreadMessages=0` + - *{link(You have &LBRACE_unreadMessages&RBRACE
Open your inbox,&LBRACE_backend&RBRACE/messages/inbox,,)}* corresponds with `_unreadMessages>0` @@ -1129,6 +1098,39 @@ This tagrendering has no question and is thus read-only +### background-layer-readonly + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `_theme:backgroundLayer~.+&mapcomplete-preferred-background-layer~.+&_theme:backgroundLayer!=` + + + +### background-layer + + + +The question is *What background layer should be shown by default?* + + + + + + - *Use the default background layer* corresponds with `` + - *Use OpenStreetMap-carto as default layer* corresponds with `mapcomplete-preferred-background-layer=osm` + - *Use aerial imagery as default background* corresponds with `mapcomplete-preferred-background-layer=photo` + - *Use a non-openstreetmap based map as default background* corresponds with `mapcomplete-preferred-background-layer=map` + - *Use the current background layer ({__current_background}) as default background* corresponds with `mapcomplete-preferred-background-layer=` + - *Use background layer {mapcomplete-preferred-background-layer} as default background* corresponds with `mapcomplete-preferred-background-layer~.+` + - This option cannot be chosen as answer + + + + ### picture-license @@ -1184,6 +1186,32 @@ The question is *Should questions for unknown data fields appear one-by-one or +### fixate-north + + + +The question is *Should north always be up?* + + + + + + - *Allow to rotate the map* corresponds with `` + - *Always keep north pointing up* corresponds with `mapcomplete-fixate-north=yes` + + + + +### mangrove-keys + + + +This tagrendering has no question and is thus read-only + + + + + ### translations-title @@ -1265,8 +1293,8 @@ This tagrendering has no question and is thus read-only - - *A link to your Mastodon-profile has been been found: {_mastodon_link}* corresponds with `_mastodon_link~.+` - - *We found a link to what looks to be a mastodon account, but it is unverified. Edit your profile description and place the following there: <a href="{_mastodon_candidate}" rel="me">Mastodon</a>* corresponds with `_mastodon_candidate~.+` + - *A link to your Mastodon-profile has been been found: {_mastodon_link}* corresponds with `_mastodon_link~.+` + - *We found a link to what looks to be a mastodon account, but it is unverified. Edit your profile description and place the following there: <a href="{_mastodon_candidate}" rel="me">Mastodon</a>* corresponds with `_mastodon_candidate~.+` @@ -1408,6 +1436,7 @@ The following layers are included in MapComplete: - [dogpark](./Layers/dogpark.md) - [drinking_water](./Layers/drinking_water.md) - [elevator](./Layers/elevator.md) + - [elongated_coin](./Layers/elongated_coin.md) - [entrance](./Layers/entrance.md) - [etymology](./Layers/etymology.md) - [extinguisher](./Layers/extinguisher.md) @@ -1438,8 +1467,8 @@ The following layers are included in MapComplete: - [map](./Layers/map.md) - [maproulette](./Layers/maproulette.md) - [maproulette_challenge](./Layers/maproulette_challenge.md) - - [matchpoint](./Layers/matchpoint.md) - [maxspeed](./Layers/maxspeed.md) + - [memorial](./Layers/memorial.md) - [named_streets](./Layers/named_streets.md) - [nature_reserve](./Layers/nature_reserve.md) - [note](./Layers/note.md) @@ -1458,6 +1487,7 @@ The following layers are included in MapComplete: - [postboxes](./Layers/postboxes.md) - [postoffices](./Layers/postoffices.md) - [public_bookcase](./Layers/public_bookcase.md) + - [questions](./Layers/questions.md) - [railway_platforms](./Layers/railway_platforms.md) - [rainbow_crossings](./Layers/rainbow_crossings.md) - [range](./Layers/range.md) @@ -1467,6 +1497,7 @@ The following layers are included in MapComplete: - [selected_element](./Layers/selected_element.md) - [shelter](./Layers/shelter.md) - [shops](./Layers/shops.md) + - [shower](./Layers/shower.md) - [slow_roads](./Layers/slow_roads.md) - [speed_camera](./Layers/speed_camera.md) - [speed_display](./Layers/speed_display.md) @@ -1487,6 +1518,7 @@ The following layers are included in MapComplete: - [transit_stops](./Layers/transit_stops.md) - [tree_node](./Layers/tree_node.md) - [usersettings](./Layers/usersettings.md) + - [vending_machine](./Layers/vending_machine.md) - [veterinary](./Layers/veterinary.md) - [viewpoint](./Layers/viewpoint.md) - [village_green](./Layers/village_green.md) @@ -1497,4 +1529,4 @@ The following layers are included in MapComplete: - [windturbine](./Layers/windturbine.md) -This document is autogenerated from [Customizations/AllKnownLayouts.ts](https://github.com/pietervdvn/MapComplete/blob/develop/Customizations/AllKnownLayouts.ts) +This document is autogenerated from [src/Customizations/AllKnownLayouts.ts](https://github.com/pietervdvn/MapComplete/blob/develop/src/Customizations/AllKnownLayouts.ts) diff --git a/Docs/BuiltinQuestions.md b/Docs/BuiltinQuestions.md index 10b886651..7b0f907da 100644 --- a/Docs/BuiltinQuestions.md +++ b/Docs/BuiltinQuestions.md @@ -46,7 +46,8 @@ Special library layer which does not need a '.questions'-prefix before being imp + [all_tags](#all_tags) + [just_created](#just_created) + [multilevels](#multilevels) - + [level](#level) + + [repeated](#repeated) + + [single_level](#single_level) + [smoking](#smoking) + [induction-loop](#induction-loop) + [internet](#internet) @@ -655,7 +656,21 @@ This is rendered with `This elevator goes to floors {level}` -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -678,6 +693,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### smoking diff --git a/Docs/CalculatedTags.md b/Docs/CalculatedTags.md index 4617eca58..d23c29204 100644 --- a/Docs/CalculatedTags.md +++ b/Docs/CalculatedTags.md @@ -198,7 +198,7 @@ Adds the geometry type as property. This is identical to the GoeJson geometry ty -Extract the 'level'-tag into a normalized, ';'-separated value +Extract the 'level'-tag into a normalized, ';'-separated value called '_level' (which also includes 'repeat_on'). The `level` tag (without underscore) will be normalized with only the value of `level`. @@ -260,7 +260,9 @@ To enable this feature, add a field `calculatedTags` in the layer object, e.g.: "calculatedTags": [ - "_someKey=javascript-expression", + "_someKey=javascript-expression (lazy execution)", + + "_some_other_key:=javascript expression (strict execution) "name=feat.properties.name ?? feat.properties.ref ?? feat.properties.operator", @@ -272,6 +274,12 @@ To enable this feature, add a field `calculatedTags` in the layer object, e.g.: +By using `:=` as separator, the attribute will be calculated as soone as the data is loaded (strict evaluation) + +The default behaviour, using `=` as separator, is lazy loading + + + The above code will be executed for every feature in the layer. The feature is accessible as `feat` and is an amended geojson object: diff --git a/Docs/Layers/all_vending_machine.md b/Docs/Layers/all_vending_machine.md index 323ec9fc5..469cc7e90 100644 --- a/Docs/Layers/all_vending_machine.md +++ b/Docs/Layers/all_vending_machine.md @@ -269,7 +269,21 @@ The question is *Is this vending machine indoors?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -292,6 +306,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### phone diff --git a/Docs/Layers/bench.md b/Docs/Layers/bench.md index 5d588d8e8..e9869f60e 100644 --- a/Docs/Layers/bench.md +++ b/Docs/Layers/bench.md @@ -56,7 +56,6 @@ attribute | type | values which are supported by this layer [](https://taginfo.openstreetmap.org/keys/colour#values) [colour](https://wiki.openstreetmap.org/wiki/Key:colour) | [color](../SpecialInputElements.md#color) | [brown](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dbrown) [green](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dgreen) [gray](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dgray) [white](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dwhite) [red](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dred) [black](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dblack) [blue](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dblue) [yellow](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dyellow) [](https://taginfo.openstreetmap.org/keys/survey:date#values) [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) | [date](../SpecialInputElements.md#date) | [](https://wiki.openstreetmap.org/wiki/Tag:survey:date%3D) [](https://taginfo.openstreetmap.org/keys/inscription#values) [inscription](https://wiki.openstreetmap.org/wiki/Key:inscription) | [text](../SpecialInputElements.md#text) | -[](https://taginfo.openstreetmap.org/keys/tourism#values) [tourism](https://wiki.openstreetmap.org/wiki/Key:tourism) | Multiple choice | [artwork](https://wiki.openstreetmap.org/wiki/Tag:tourism%3Dartwork) [](https://wiki.openstreetmap.org/wiki/Tag:tourism%3D) [](https://taginfo.openstreetmap.org/keys/historic#values) [historic](https://wiki.openstreetmap.org/wiki/Key:historic) | Multiple choice | [memorial](https://wiki.openstreetmap.org/wiki/Tag:historic%3Dmemorial) [](https://wiki.openstreetmap.org/wiki/Tag:historic%3D) [](https://taginfo.openstreetmap.org/keys/artwork_type#values) [artwork_type](https://wiki.openstreetmap.org/wiki/Key:artwork_type) | [string](../SpecialInputElements.md#string) | [architecture](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Darchitecture) [mural](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dmural) [painting](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dpainting) [sculpture](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dsculpture) [statue](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dstatue) [bust](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dbust) [stone](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dstone) [installation](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dinstallation) [graffiti](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dgraffiti) [relief](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Drelief) [azulejo](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dazulejo) [tilework](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dtilework) [woodcarving](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dwoodcarving) [](https://taginfo.openstreetmap.org/keys/artist:wikidata#values) [artist:wikidata](https://wiki.openstreetmap.org/wiki/Key:artist:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | @@ -263,7 +262,9 @@ The question is *Does this bench have an artistic element?* - *This bench has an integrated artwork* corresponds with `tourism=artwork` - - *This bench does not have an integrated artwork* corresponds with `` + - *This bench does not have an integrated artwork* corresponds with `not:tourism:artwork=yes` + - *This bench probably doesn't have an integrated artwork* corresponds with `` + - This option cannot be chosen as answer diff --git a/Docs/Layers/bike_cafe.md b/Docs/Layers/bike_cafe.md index 791caa5e3..70c265511 100644 --- a/Docs/Layers/bike_cafe.md +++ b/Docs/Layers/bike_cafe.md @@ -254,6 +254,16 @@ This tagrendering has no question and is thus read-only +### delete-button + + + +This tagrendering has no question and is thus read-only + + + + + ### last_edit diff --git a/Docs/Layers/bike_repair_station.md b/Docs/Layers/bike_repair_station.md index 04ffd306f..1c1c2713b 100644 --- a/Docs/Layers/bike_repair_station.md +++ b/Docs/Layers/bike_repair_station.md @@ -324,7 +324,21 @@ This tagrendering is only visible in the popup if the following condition is met -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -347,6 +361,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### leftover-questions diff --git a/Docs/Layers/cafe_pub.md b/Docs/Layers/cafe_pub.md index 3e2ed5f32..e2b400d5a 100644 --- a/Docs/Layers/cafe_pub.md +++ b/Docs/Layers/cafe_pub.md @@ -97,7 +97,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -120,6 +134,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### Name diff --git a/Docs/Layers/charging_station.md b/Docs/Layers/charging_station.md index 4bbc83000..100e02f9b 100644 --- a/Docs/Layers/charging_station.md +++ b/Docs/Layers/charging_station.md @@ -1933,7 +1933,21 @@ This is rendered with `More info on {website}` -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -1956,6 +1970,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### ref diff --git a/Docs/Layers/charging_station_ebikes.md b/Docs/Layers/charging_station_ebikes.md index 942a5ce08..98e83f35e 100644 --- a/Docs/Layers/charging_station_ebikes.md +++ b/Docs/Layers/charging_station_ebikes.md @@ -1931,7 +1931,21 @@ This is rendered with `More info on {website}` -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -1954,6 +1968,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### ref diff --git a/Docs/Layers/dogfoodb.md b/Docs/Layers/dogfoodb.md index 159eb7f82..1411d582e 100644 --- a/Docs/Layers/dogfoodb.md +++ b/Docs/Layers/dogfoodb.md @@ -46,13 +46,13 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | -[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/amenity#values) [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [fast_food](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dfast_food) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Drestaurant) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | [](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | [](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/cuisine#values) [cuisine](https://wiki.openstreetmap.org/wiki/Key:cuisine) | [string](../SpecialInputElements.md#string) | [pizza](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpizza) [friture](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfriture) [pasta](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpasta) [kebab](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dkebab) [sandwich](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsandwich) [burger](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dburger) [sushi](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsushi) [coffee](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dcoffee) [italian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Ditalian) [french](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfrench) [chinese](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dchinese) [greek](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dgreek) [indian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dindian) [turkish](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dturkish) [thai](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dthai) [](https://taginfo.openstreetmap.org/keys/reservation#values) [reservation](https://wiki.openstreetmap.org/wiki/Key:reservation) | Multiple choice | [required](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drequired) [recommended](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drecommended) [yes](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dno) @@ -107,31 +107,6 @@ This tagrendering has no question and is thus read-only -### level - - - -The question is *On what level is this feature located?* - -This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) - -This is rendered with `Located on the {level}th floor` - - - - - - - *Located underground* corresponds with `location=underground` - - This option cannot be chosen as answer - - *Located on the ground floor* corresponds with `level=0` - - *Located on the ground floor* corresponds with `` - - This option cannot be chosen as answer - - *Located on the first floor* corresponds with `level=1` - - *Located on the first basement level* corresponds with `level=-1` - - - - ### Name @@ -262,6 +237,47 @@ The question is *Which methods of payment are accepted here?* +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level + + + +The question is *On what level is this feature located?* + +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) + +This is rendered with `Located on the {level}th floor` + + + + + + - *Located underground* corresponds with `location=underground` + - This option cannot be chosen as answer + - *Located on the ground floor* corresponds with `level=0` + - *Located on the ground floor* corresponds with `` + - This option cannot be chosen as answer + - *Located on the first floor* corresponds with `level=1` + - *Located on the first basement level* corresponds with `level=-1` + + +This tagrendering has labels `level` + + + ### wheelchair-access @@ -727,7 +743,7 @@ reservation.0 | Reservation not required | reservation=no\|reservation=optional\ id | question | osmTags ---- | ---------- | --------- -food-category.0 | Has a vegetarian menu (default) | +food-category.0 | Restaurants and fast food businesses (default) | food-category.1 | Only fastfood businesses | amenity=fast_food food-category.2 | Only restaurants | amenity=restaurant @@ -736,14 +752,14 @@ food-category.2 | Only restaurants | amenity=restaurant id | question | osmTags ---- | ---------- | --------- -vegetarian.0 | Has a vegan menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only +vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -vegan.0 | Has a halal menu | diet:vegan=yes\|diet:vegan=only +vegan.0 | Has a vegan menu | diet:vegan=yes\|diet:vegan=only @@ -772,6 +788,15 @@ accepts_cash.0 | Accepts cash | payment:cash=yes id | question | osmTags ---- | ---------- | --------- accepts_cards.0 | Accepts payment cards | payment:cards=yes + + + + +id | question | osmTags +---- | ---------- | --------- +dogs.0 | No preference towards dogs (default) | +dogs.1 | Dogs allowed | dog=unleashed\|dog=yes +dogs.2 | No dogs allowed | dog=no This document is autogenerated from [assets/themes/pets/pets.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/pets/pets.json) diff --git a/Docs/Layers/dogshop.md b/Docs/Layers/dogshop.md index 4018d415b..8576e9557 100644 --- a/Docs/Layers/dogshop.md +++ b/Docs/Layers/dogshop.md @@ -384,7 +384,21 @@ The question is *Which methods of payment are accepted here?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -407,6 +421,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### copyshop-print-sizes diff --git a/Docs/Layers/elongated_coin.md b/Docs/Layers/elongated_coin.md index 8c0a80cbe..067b778d4 100644 --- a/Docs/Layers/elongated_coin.md +++ b/Docs/Layers/elongated_coin.md @@ -297,7 +297,21 @@ The question is *Is the penny press indoors?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -320,6 +334,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### check_date diff --git a/Docs/Layers/entrance.md b/Docs/Layers/entrance.md index b04e700bb..88c0bc060 100644 --- a/Docs/Layers/entrance.md +++ b/Docs/Layers/entrance.md @@ -93,7 +93,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -116,6 +130,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### Entrance type diff --git a/Docs/Layers/fitness_centre.md b/Docs/Layers/fitness_centre.md index be4b04f6a..9d6483660 100644 --- a/Docs/Layers/fitness_centre.md +++ b/Docs/Layers/fitness_centre.md @@ -206,7 +206,21 @@ The question is *Is this place accessible with a wheelchair?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -229,6 +243,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### reviews diff --git a/Docs/Layers/food.md b/Docs/Layers/food.md index 90c4b597d..9f36f751e 100644 --- a/Docs/Layers/food.md +++ b/Docs/Layers/food.md @@ -50,13 +50,13 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | -[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/amenity#values) [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [fast_food](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dfast_food) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Drestaurant) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | [](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | [](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/cuisine#values) [cuisine](https://wiki.openstreetmap.org/wiki/Key:cuisine) | [string](../SpecialInputElements.md#string) | [pizza](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpizza) [friture](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfriture) [pasta](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpasta) [kebab](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dkebab) [sandwich](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsandwich) [burger](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dburger) [sushi](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsushi) [coffee](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dcoffee) [italian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Ditalian) [french](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfrench) [chinese](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dchinese) [greek](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dgreek) [indian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dindian) [turkish](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dturkish) [thai](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dthai) [](https://taginfo.openstreetmap.org/keys/reservation#values) [reservation](https://wiki.openstreetmap.org/wiki/Key:reservation) | Multiple choice | [required](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drequired) [recommended](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drecommended) [yes](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dno) @@ -111,31 +111,6 @@ This tagrendering has no question and is thus read-only -### level - - - -The question is *On what level is this feature located?* - -This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) - -This is rendered with `Located on the {level}th floor` - - - - - - - *Located underground* corresponds with `location=underground` - - This option cannot be chosen as answer - - *Located on the ground floor* corresponds with `level=0` - - *Located on the ground floor* corresponds with `` - - This option cannot be chosen as answer - - *Located on the first floor* corresponds with `level=1` - - *Located on the first basement level* corresponds with `level=-1` - - - - ### Name @@ -266,6 +241,47 @@ The question is *Which methods of payment are accepted here?* +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level + + + +The question is *On what level is this feature located?* + +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) + +This is rendered with `Located on the {level}th floor` + + + + + + - *Located underground* corresponds with `location=underground` + - This option cannot be chosen as answer + - *Located on the ground floor* corresponds with `level=0` + - *Located on the ground floor* corresponds with `` + - This option cannot be chosen as answer + - *Located on the first floor* corresponds with `level=1` + - *Located on the first basement level* corresponds with `level=-1` + + +This tagrendering has labels `level` + + + ### wheelchair-access @@ -731,7 +747,7 @@ reservation.0 | Reservation not required | reservation=no\|reservation=optional\ id | question | osmTags ---- | ---------- | --------- -food-category.0 | Has a vegetarian menu (default) | +food-category.0 | Restaurants and fast food businesses (default) | food-category.1 | Only fastfood businesses | amenity=fast_food food-category.2 | Only restaurants | amenity=restaurant @@ -740,14 +756,14 @@ food-category.2 | Only restaurants | amenity=restaurant id | question | osmTags ---- | ---------- | --------- -vegetarian.0 | Has a vegan menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only +vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -vegan.0 | Has a halal menu | diet:vegan=yes\|diet:vegan=only +vegan.0 | Has a vegan menu | diet:vegan=yes\|diet:vegan=only @@ -776,6 +792,15 @@ accepts_cash.0 | Accepts cash | payment:cash=yes id | question | osmTags ---- | ---------- | --------- accepts_cards.0 | Accepts payment cards | payment:cards=yes + + + + +id | question | osmTags +---- | ---------- | --------- +dogs.0 | No preference towards dogs (default) | +dogs.1 | Dogs allowed | dog=unleashed\|dog=yes +dogs.2 | No dogs allowed | dog=no This document is autogenerated from [assets/layers/food/food.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/food/food.json) diff --git a/Docs/Layers/friture.md b/Docs/Layers/friture.md index 8d326c30f..7c61831c8 100644 --- a/Docs/Layers/friture.md +++ b/Docs/Layers/friture.md @@ -46,13 +46,13 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | -[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/amenity#values) [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [fast_food](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dfast_food) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Drestaurant) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | [](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | [](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/cuisine#values) [cuisine](https://wiki.openstreetmap.org/wiki/Key:cuisine) | [string](../SpecialInputElements.md#string) | [pizza](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpizza) [friture](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfriture) [pasta](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpasta) [kebab](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dkebab) [sandwich](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsandwich) [burger](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dburger) [sushi](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsushi) [coffee](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dcoffee) [italian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Ditalian) [french](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfrench) [chinese](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dchinese) [greek](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dgreek) [indian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dindian) [turkish](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dturkish) [thai](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dthai) [](https://taginfo.openstreetmap.org/keys/reservation#values) [reservation](https://wiki.openstreetmap.org/wiki/Key:reservation) | Multiple choice | [required](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drequired) [recommended](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drecommended) [yes](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dno) @@ -107,31 +107,6 @@ This tagrendering has no question and is thus read-only -### level - - - -The question is *On what level is this feature located?* - -This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) - -This is rendered with `Located on the {level}th floor` - - - - - - - *Located underground* corresponds with `location=underground` - - This option cannot be chosen as answer - - *Located on the ground floor* corresponds with `level=0` - - *Located on the ground floor* corresponds with `` - - This option cannot be chosen as answer - - *Located on the first floor* corresponds with `level=1` - - *Located on the first basement level* corresponds with `level=-1` - - - - ### Name @@ -262,6 +237,47 @@ The question is *Which methods of payment are accepted here?* +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level + + + +The question is *On what level is this feature located?* + +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) + +This is rendered with `Located on the {level}th floor` + + + + + + - *Located underground* corresponds with `location=underground` + - This option cannot be chosen as answer + - *Located on the ground floor* corresponds with `level=0` + - *Located on the ground floor* corresponds with `` + - This option cannot be chosen as answer + - *Located on the first floor* corresponds with `level=1` + - *Located on the first basement level* corresponds with `level=-1` + + +This tagrendering has labels `level` + + + ### wheelchair-access @@ -727,7 +743,7 @@ reservation.0 | Reservation not required | reservation=no\|reservation=optional\ id | question | osmTags ---- | ---------- | --------- -food-category.0 | Has a vegetarian menu (default) | +food-category.0 | Restaurants and fast food businesses (default) | food-category.1 | Only fastfood businesses | amenity=fast_food food-category.2 | Only restaurants | amenity=restaurant @@ -736,14 +752,14 @@ food-category.2 | Only restaurants | amenity=restaurant id | question | osmTags ---- | ---------- | --------- -vegetarian.0 | Has a vegan menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only +vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -vegan.0 | Has a halal menu | diet:vegan=yes\|diet:vegan=only +vegan.0 | Has a vegan menu | diet:vegan=yes\|diet:vegan=only @@ -772,6 +788,15 @@ accepts_cash.0 | Accepts cash | payment:cash=yes id | question | osmTags ---- | ---------- | --------- accepts_cards.0 | Accepts payment cards | payment:cards=yes + + + + +id | question | osmTags +---- | ---------- | --------- +dogs.0 | No preference towards dogs (default) | +dogs.1 | Dogs allowed | dog=unleashed\|dog=yes +dogs.2 | No dogs allowed | dog=no This document is autogenerated from [assets/themes/fritures/fritures.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/fritures/fritures.json) diff --git a/Docs/Layers/hackerspace.md b/Docs/Layers/hackerspace.md index 3daf2b5ef..dcf2e7d37 100644 --- a/Docs/Layers/hackerspace.md +++ b/Docs/Layers/hackerspace.md @@ -126,7 +126,21 @@ This is rendered with `This hackerspace is named {name}` -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -149,6 +163,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### website diff --git a/Docs/Layers/indoors.md b/Docs/Layers/indoors.md index 13365ac85..25feafe57 100644 --- a/Docs/Layers/indoors.md +++ b/Docs/Layers/indoors.md @@ -49,8 +49,12 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | +[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/room#values) [room](https://wiki.openstreetmap.org/wiki/Key:room) | Multiple choice | [administration](https://wiki.openstreetmap.org/wiki/Tag:room%3Dadministration) [auditorium](https://wiki.openstreetmap.org/wiki/Tag:room%3Dauditorium) [bedroom](https://wiki.openstreetmap.org/wiki/Tag:room%3Dbedroom) [chapel](https://wiki.openstreetmap.org/wiki/Tag:room%3Dchapel) [class](https://wiki.openstreetmap.org/wiki/Tag:room%3Dclass) [computer](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcomputer) [conference](https://wiki.openstreetmap.org/wiki/Tag:room%3Dconference) [crypt](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcrypt) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:room%3Dkitchen) [laboratory](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlaboratory) [library](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlibrary) [locker](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlocker) [nursery](https://wiki.openstreetmap.org/wiki/Tag:room%3Dnursery) [office](https://wiki.openstreetmap.org/wiki/Tag:room%3Doffice) [prison_cell](https://wiki.openstreetmap.org/wiki/Tag:room%3Dprison_cell) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:room%3Drestaurant) [security_check](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsecurity_check) [sport](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsport) [storage](https://wiki.openstreetmap.org/wiki/Tag:room%3Dstorage) [technical](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtechnical) [toilets](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtoilets) [waiting](https://wiki.openstreetmap.org/wiki/Tag:room%3Dwaiting) +[](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/name:etymology:wikidata#values) [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | @@ -86,6 +90,47 @@ This tagrendering has no question and is thus read-only +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level + + + +The question is *On what level is this feature located?* + +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) + +This is rendered with `Located on the {level}th floor` + + + + + + - *Located underground* corresponds with `location=underground` + - This option cannot be chosen as answer + - *Located on the ground floor* corresponds with `level=0` + - *Located on the ground floor* corresponds with `` + - This option cannot be chosen as answer + - *Located on the first floor* corresponds with `level=1` + - *Located on the first basement level* corresponds with `level=-1` + + +This tagrendering has labels `level` + + + ### ref @@ -118,6 +163,74 @@ This tagrendering is only visible in the popup if the following condition is met +### room-type + + + +The question is *What type of room is this?* + + + + + + - *This is a administrative room* corresponds with `room=administration` + - *This is a auditorium* corresponds with `room=auditorium` + - *This is a bedroom* corresponds with `room=bedroom` + - *This is a chapel* corresponds with `room=chapel` + - *This is a classroom* corresponds with `room=class` + - *This is a classroom* corresponds with `room=classroom` + - This option cannot be chosen as answer + - *This is a computer room* corresponds with `room=computer` + - *This is a conference room* corresponds with `room=conference` + - *This is a crypt* corresponds with `room=crypt` + - *This is a kitchen* corresponds with `room=kitchen` + - *This is a laboratory* corresponds with `room=laboratory` + - *This is a library* corresponds with `room=library` + - *This is a locker room* corresponds with `room=locker` + - *This is a nursery* corresponds with `room=nursery` + - *This is an office* corresponds with `room=office` + - *This is a prison_cell* corresponds with `room=prison_cell` + - *This is a restaurant* corresponds with `room=restaurant` + - *This is a room to perform security checks* corresponds with `room=security_check` + - *This is a sport room* corresponds with `room=sport` + - *This is a storage room* corresponds with `room=storage` + - *This is a technical room* corresponds with `room=technical` + - *These are toilets* corresponds with `room=toilets` + - *This is a waiting room* corresponds with `room=waiting` + + + + +### room-capacity + + + +The question is *How much people can at most fit in this room?* + +This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) + +This is rendered with `At most {capacity} people fit this room` + + + +This tagrendering is only visible in the popup if the following condition is met: `room=waiting|room=restaurant|room=office|room=nursery|room=conference|room=auditorium|room=chapel|room=bedroom|room=classroom` + + + +### wikipedia-etymology + + + +The question is *What is the Wikidata-item that this object is named after?* + +This rendering asks information about the property [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) + +This is rendered with `

Wikipedia article of the name giver

{wikipedia(name:etymology:wikidata):max-height:20rem}` + + + + + ### leftover-questions diff --git a/Docs/Layers/medical-shops.md b/Docs/Layers/medical-shops.md index 36e0bce0d..2464db22e 100644 --- a/Docs/Layers/medical-shops.md +++ b/Docs/Layers/medical-shops.md @@ -384,7 +384,21 @@ The question is *Which methods of payment are accepted here?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -407,6 +421,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### copyshop-print-sizes diff --git a/Docs/Layers/parking.md b/Docs/Layers/parking.md index 1fcc04a39..6856d586d 100644 --- a/Docs/Layers/parking.md +++ b/Docs/Layers/parking.md @@ -88,7 +88,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -111,6 +125,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### parking-type diff --git a/Docs/Layers/picnic_table.md b/Docs/Layers/picnic_table.md index 807abbcd1..089627951 100644 --- a/Docs/Layers/picnic_table.md +++ b/Docs/Layers/picnic_table.md @@ -86,7 +86,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -109,6 +123,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### picnic_table-material diff --git a/Docs/Layers/railway_platforms.md b/Docs/Layers/railway_platforms.md index 5dc7387d1..9e9a075d8 100644 --- a/Docs/Layers/railway_platforms.md +++ b/Docs/Layers/railway_platforms.md @@ -74,7 +74,21 @@ This is rendered with `Platform {ref}` -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -97,6 +111,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### leftover-questions diff --git a/Docs/Layers/reception_desk.md b/Docs/Layers/reception_desk.md index f78d8e3e0..be0164aa8 100644 --- a/Docs/Layers/reception_desk.md +++ b/Docs/Layers/reception_desk.md @@ -85,7 +85,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -108,6 +122,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### desk-height diff --git a/Docs/Layers/school.md b/Docs/Layers/school.md index 1841a44f6..69d9c4859 100644 --- a/Docs/Layers/school.md +++ b/Docs/Layers/school.md @@ -15,6 +15,8 @@ Schools giving primary and secondary education and post-secondary, non-tertiary - This layer is shown at zoomlevel **12** and higher + - This layer will automatically load [school](./school.md) into the layout as it depends on it: a calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _enclosing) + - This layer is needed as dependency for layer [school](#school) diff --git a/Docs/Layers/shops.md b/Docs/Layers/shops.md index 551096faf..557b58c58 100644 --- a/Docs/Layers/shops.md +++ b/Docs/Layers/shops.md @@ -389,7 +389,21 @@ The question is *Which methods of payment are accepted here?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -412,6 +426,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### copyshop-print-sizes diff --git a/Docs/Layers/shops_with_climbing_shoe_repair.md b/Docs/Layers/shops_with_climbing_shoe_repair.md index 879540277..0ee5662e7 100644 --- a/Docs/Layers/shops_with_climbing_shoe_repair.md +++ b/Docs/Layers/shops_with_climbing_shoe_repair.md @@ -401,7 +401,21 @@ The question is *Which methods of payment are accepted here?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -424,6 +438,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### copyshop-print-sizes diff --git a/Docs/Layers/shower.md b/Docs/Layers/shower.md index b5551bce7..28edf884c 100644 --- a/Docs/Layers/shower.md +++ b/Docs/Layers/shower.md @@ -88,7 +88,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -111,6 +125,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### access diff --git a/Docs/Layers/sport_shops.md b/Docs/Layers/sport_shops.md index 17c61c236..75cb17865 100644 --- a/Docs/Layers/sport_shops.md +++ b/Docs/Layers/sport_shops.md @@ -384,7 +384,21 @@ The question is *Which methods of payment are accepted here?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -407,6 +421,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### copyshop-print-sizes diff --git a/Docs/Layers/surveillance_camera.md b/Docs/Layers/surveillance_camera.md index a03451ad8..d28122081 100644 --- a/Docs/Layers/surveillance_camera.md +++ b/Docs/Layers/surveillance_camera.md @@ -16,6 +16,7 @@ This layer shows surveillance cameras and allows a contributor to update informa - This layer is shown at zoomlevel **12** and higher - This layer will automatically load [walls_and_buildings](./walls_and_buildings.md) into the layout as it depends on it: a preset snaps to this layer (presets[1]) + - This layer will automatically load [walls_and_buildings](./walls_and_buildings.md) into the layout as it depends on it: a preset snaps to this layer (presets[3]) @@ -48,6 +49,7 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | +[](https://taginfo.openstreetmap.org/keys/surveillance:type#values) [surveillance:type](https://wiki.openstreetmap.org/wiki/Key:surveillance:type) | Multiple choice | [camera](https://wiki.openstreetmap.org/wiki/Tag:surveillance:type%3Dcamera) [ALPR](https://wiki.openstreetmap.org/wiki/Tag:surveillance:type%3DALPR) [](https://taginfo.openstreetmap.org/keys/camera:type#values) [camera:type](https://wiki.openstreetmap.org/wiki/Key:camera:type) | Multiple choice | [fixed](https://wiki.openstreetmap.org/wiki/Tag:camera:type%3Dfixed) [dome](https://wiki.openstreetmap.org/wiki/Tag:camera:type%3Ddome) [panning](https://wiki.openstreetmap.org/wiki/Tag:camera:type%3Dpanning) [](https://taginfo.openstreetmap.org/keys/camera:direction#values) [camera:direction](https://wiki.openstreetmap.org/wiki/Key:camera:direction) | [direction](../SpecialInputElements.md#direction) | [](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | @@ -91,6 +93,22 @@ This tagrendering has no question and is thus read-only +### has_alpr + + + +The question is *Can this camera automatically detect license plates?* + + + + + + - *This is a camera without number plate recognition.* corresponds with `surveillance:type=camera` + - *This is an ALPR (Automatic License Plate Reader)* corresponds with `surveillance:type=ALPR` + + + + ### Camera type: fixed; panning; dome diff --git a/Docs/Layers/ticket_machine.md b/Docs/Layers/ticket_machine.md index 50ab62d9b..6c7baebf6 100644 --- a/Docs/Layers/ticket_machine.md +++ b/Docs/Layers/ticket_machine.md @@ -86,7 +86,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -109,6 +123,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### operator diff --git a/Docs/Layers/ticket_validator.md b/Docs/Layers/ticket_validator.md index 1449ab289..6779a03f5 100644 --- a/Docs/Layers/ticket_validator.md +++ b/Docs/Layers/ticket_validator.md @@ -73,7 +73,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -96,6 +110,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### barrier diff --git a/Docs/Layers/toilet.md b/Docs/Layers/toilet.md index c18ea698c..19e914f89 100644 --- a/Docs/Layers/toilet.md +++ b/Docs/Layers/toilet.md @@ -98,7 +98,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -121,6 +135,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### toilet-access diff --git a/Docs/Layers/toilet_at_amenity.md b/Docs/Layers/toilet_at_amenity.md index 761d80e99..0644230f1 100644 --- a/Docs/Layers/toilet_at_amenity.md +++ b/Docs/Layers/toilet_at_amenity.md @@ -95,7 +95,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -118,6 +132,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### toilet-access diff --git a/Docs/Layers/vending_machine.md b/Docs/Layers/vending_machine.md index 6034c6854..5e5300866 100644 --- a/Docs/Layers/vending_machine.md +++ b/Docs/Layers/vending_machine.md @@ -269,7 +269,21 @@ The question is *Is this vending machine indoors?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -292,6 +306,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### phone diff --git a/Docs/SpecialRenderings.md b/Docs/SpecialRenderings.md index 6743c425f..1faec577e 100644 --- a/Docs/SpecialRenderings.md +++ b/Docs/SpecialRenderings.md @@ -110,8 +110,12 @@ In other words: use `{ "before": ..., "after": ..., "special": {"type": ..., "ar * [Example usage of image_carousel](#example-usage-of-image_carousel) + [image_upload](#image_upload) * [Example usage of image_upload](#example-usage-of-image_upload) - + [reviews](#reviews) - * [Example usage of reviews](#example-usage-of-reviews) + + [rating](#rating) + * [Example usage of rating](#example-usage-of-rating) + + [create_review](#create_review) + * [Example usage of create_review](#example-usage-of-create_review) + + [list_reviews](#list_reviews) + * [Example usage of list_reviews](#example-usage-of-list_reviews) + [opening_hours_table](#opening_hours_table) * [Example usage of opening_hours_table](#example-usage-of-opening_hours_table) + [live](#live) @@ -744,17 +748,49 @@ image_key | image,mapillary,image,wikidata,wikimedia_commons,image,image | The k name | default | description ------ | --------- | ------------- -image-key | image | Image tag to add the URL to (or image-tag:0, image-tag:1 when multiple images are added) -label | Add image | The text to show on the button +image-key | _undefined_ | Image tag to add the URL to (or image-tag:0, image-tag:1 when multiple images are added) +label | _undefined_ | The text to show on the button #### Example usage of image_upload - `{image_upload(image,Add image)}` + `{image_upload(,)}` -### reviews +### rating + + Shows stars which represent the avarage rating on mangrove.reviews + +name | default | description +------ | --------- | ------------- +subjectKey | name | The key to use to determine the subject. If specified, the subject will be tags[subjectKey] +fallback | _undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value + + +#### Example usage of rating + + `{rating(name,)}` + + + +### create_review + + Invites the contributor to leave a review. Somewhat small UI-element until interacted + +name | default | description +------ | --------- | ------------- +subjectKey | name | The key to use to determine the subject. If specified, the subject will be tags[subjectKey] +fallback | _undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value + + +#### Example usage of create_review + + `{create_review(name,)}` + + + +### list_reviews Adds an overview of the mangrove-reviews of this object. Mangrove.Reviews needs - in order to identify the reviewed object - a coordinate and a name. By default, the name of the object is given, but this can be overwritten @@ -764,7 +800,7 @@ subjectKey | name | The key to use to determine the subject. If specified, the s fallback | _undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value -#### Example usage of reviews +#### Example usage of list_reviews `{reviews()}` for a vanilla review, `{reviews(name, play_forest)}` to review a play forest. If a name is known, the name will be used as identifier, otherwise 'play_forest' is used diff --git a/Docs/TagInfo/mapcomplete_benches.json b/Docs/TagInfo/mapcomplete_benches.json index 30ad200de..338a97a45 100644 --- a/Docs/TagInfo/mapcomplete_benches.json +++ b/Docs/TagInfo/mapcomplete_benches.json @@ -247,9 +247,14 @@ "description": "Layer 'Benches' shows tourism=artwork with a fixed text, namely 'This bench has an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches')", "value": "artwork" }, + { + "key": "not:tourism:artwork", + "description": "Layer 'Benches' shows not:tourism:artwork=yes with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches')", + "value": "yes" + }, { "key": "tourism", - "description": "Layer 'Benches' shows with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches') Picking this answer will delete the key tourism.", + "description": "Layer 'Benches' shows with a fixed text, namely 'This bench probably doesn't have an integrated artwork' (in the mapcomplete.org theme 'Benches') Picking this answer will delete the key tourism.", "value": "" }, { diff --git a/Docs/TagInfo/mapcomplete_food.json b/Docs/TagInfo/mapcomplete_food.json index 315523e95..16e351db3 100644 --- a/Docs/TagInfo/mapcomplete_food.json +++ b/Docs/TagInfo/mapcomplete_food.json @@ -40,35 +40,6 @@ "key": "wikipedia", "description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Restaurants and fast food')" - }, - { - "key": "location", - "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Restaurants and fast food')", - "value": "underground" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", - "value": "0" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Restaurants and fast food') Picking this answer will delete the key level.", - "value": "" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", - "value": "1" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", - "value": "-1" - }, { "key": "name", "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Restaurants and fast food')" @@ -126,6 +97,35 @@ "description": "Layer 'Restaurants and fast food' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", "value": "yes" }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Restaurants and fast food')" + }, + { + "key": "location", + "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Restaurants and fast food')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Restaurants and fast food') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", + "value": "-1" + }, { "key": "wheelchair", "description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", diff --git a/Docs/TagInfo/mapcomplete_fritures.json b/Docs/TagInfo/mapcomplete_fritures.json index d6e655e01..c3de637cd 100644 --- a/Docs/TagInfo/mapcomplete_fritures.json +++ b/Docs/TagInfo/mapcomplete_fritures.json @@ -44,35 +44,6 @@ "key": "wikipedia", "description": "The layer 'Fries shop allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, - { - "key": "level", - "description": "Layer 'Fries shop' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Fries shops')" - }, - { - "key": "location", - "description": "Layer 'Fries shop' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Fries shops')", - "value": "underground" - }, - { - "key": "level", - "description": "Layer 'Fries shop' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", - "value": "0" - }, - { - "key": "level", - "description": "Layer 'Fries shop' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Fries shops') Picking this answer will delete the key level.", - "value": "" - }, - { - "key": "level", - "description": "Layer 'Fries shop' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", - "value": "1" - }, - { - "key": "level", - "description": "Layer 'Fries shop' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", - "value": "-1" - }, { "key": "name", "description": "Layer 'Fries shop' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Fries shops')" @@ -130,6 +101,35 @@ "description": "Layer 'Fries shop' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", "value": "yes" }, + { + "key": "level", + "description": "Layer 'Fries shop' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Fries shops')" + }, + { + "key": "location", + "description": "Layer 'Fries shop' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Fries shops')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Fries shop' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Fries shop' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Fries shops') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Fries shop' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Fries shop' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", + "value": "-1" + }, { "key": "wheelchair", "description": "Layer 'Fries shop' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", diff --git a/Docs/TagInfo/mapcomplete_indoors.json b/Docs/TagInfo/mapcomplete_indoors.json index 594b6fb25..b28e95e76 100644 --- a/Docs/TagInfo/mapcomplete_indoors.json +++ b/Docs/TagInfo/mapcomplete_indoors.json @@ -55,6 +55,35 @@ "key": "wikipedia", "description": "The layer 'Indoors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "level", + "description": "Layer 'Indoors' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Indoors')" + }, + { + "key": "location", + "description": "Layer 'Indoors' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Indoors')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Indoors') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "-1" + }, { "key": "ref", "description": "Layer 'Indoors' shows and asks freeform values for key 'ref' (in the mapcomplete.org theme 'Indoors') (This is only shown if indoor=room|indoor=area|indoor=corridor)" @@ -63,6 +92,129 @@ "key": "name", "description": "Layer 'Indoors' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Indoors') (This is only shown if indoor=room|indoor=area|indoor=corridor)" }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=administration with a fixed text, namely 'This is a administrative room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "administration" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=auditorium with a fixed text, namely 'This is a auditorium' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "auditorium" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=bedroom with a fixed text, namely 'This is a bedroom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "bedroom" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=chapel with a fixed text, namely 'This is a chapel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "chapel" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=class with a fixed text, namely 'This is a classroom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "class" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=classroom with a fixed text, namely 'This is a classroom' (in the mapcomplete.org theme 'Indoors')", + "value": "classroom" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=computer with a fixed text, namely 'This is a computer room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "computer" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=conference with a fixed text, namely 'This is a conference room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "conference" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=crypt with a fixed text, namely 'This is a crypt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "crypt" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=kitchen with a fixed text, namely 'This is a kitchen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "kitchen" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=laboratory with a fixed text, namely 'This is a laboratory' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "laboratory" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=library with a fixed text, namely 'This is a library' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "library" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=locker with a fixed text, namely 'This is a locker room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "locker" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=nursery with a fixed text, namely 'This is a nursery' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "nursery" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=office with a fixed text, namely 'This is an office' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "office" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=prison_cell with a fixed text, namely 'This is a prison_cell' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "prison_cell" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=restaurant with a fixed text, namely 'This is a restaurant' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "restaurant" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=security_check with a fixed text, namely 'This is a room to perform security checks' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "security_check" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=sport with a fixed text, namely 'This is a sport room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "sport" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=storage with a fixed text, namely 'This is a storage room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "storage" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=technical with a fixed text, namely 'This is a technical room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "technical" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=toilets with a fixed text, namely 'These are toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "toilets" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=waiting with a fixed text, namely 'This is a waiting room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "waiting" + }, + { + "key": "capacity", + "description": "Layer 'Indoors' shows and asks freeform values for key 'capacity' (in the mapcomplete.org theme 'Indoors') (This is only shown if room=waiting|room=restaurant|room=office|room=nursery|room=conference|room=auditorium|room=chapel|room=bedroom|room=classroom)" + }, + { + "key": "name:etymology:wikidata", + "description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Indoors') (This is only shown if name:etymology!=unknown)" + }, { "key": "highway", "description": "The MapComplete theme Indoors has a layer Pedestrian paths showing features with this tag", diff --git a/Docs/TagInfo/mapcomplete_nature.json b/Docs/TagInfo/mapcomplete_nature.json index 4fd740c19..d6a050921 100644 --- a/Docs/TagInfo/mapcomplete_nature.json +++ b/Docs/TagInfo/mapcomplete_nature.json @@ -668,9 +668,14 @@ "description": "Layer 'Benches' shows tourism=artwork with a fixed text, namely 'This bench has an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", "value": "artwork" }, + { + "key": "not:tourism:artwork", + "description": "Layer 'Benches' shows not:tourism:artwork=yes with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "value": "yes" + }, { "key": "tourism", - "description": "Layer 'Benches' shows with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') Picking this answer will delete the key tourism.", + "description": "Layer 'Benches' shows with a fixed text, namely 'This bench probably doesn't have an integrated artwork' (in the mapcomplete.org theme 'Into nature') Picking this answer will delete the key tourism.", "value": "" }, { diff --git a/Docs/TagInfo/mapcomplete_onwheels.json b/Docs/TagInfo/mapcomplete_onwheels.json index 97ce2f8c7..4b030a3fc 100644 --- a/Docs/TagInfo/mapcomplete_onwheels.json +++ b/Docs/TagInfo/mapcomplete_onwheels.json @@ -550,35 +550,6 @@ "key": "wikipedia", "description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'OnWheels')" - }, - { - "key": "location", - "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'OnWheels')", - "value": "underground" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", - "value": "0" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'OnWheels') Picking this answer will delete the key level.", - "value": "" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", - "value": "1" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", - "value": "-1" - }, { "key": "name", "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'OnWheels')" @@ -636,6 +607,35 @@ "description": "Layer 'Restaurants and fast food' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "yes" }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'OnWheels')" + }, + { + "key": "location", + "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'OnWheels')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'OnWheels') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "-1" + }, { "key": "wheelchair", "description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", diff --git a/Docs/TagInfo/mapcomplete_personal.json b/Docs/TagInfo/mapcomplete_personal.json index 06ef64b47..09d70051e 100644 --- a/Docs/TagInfo/mapcomplete_personal.json +++ b/Docs/TagInfo/mapcomplete_personal.json @@ -979,9 +979,14 @@ "description": "Layer 'Benches' shows tourism=artwork with a fixed text, namely 'This bench has an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "artwork" }, + { + "key": "not:tourism:artwork", + "description": "Layer 'Benches' shows not:tourism:artwork=yes with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, { "key": "tourism", - "description": "Layer 'Benches' shows with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key tourism.", + "description": "Layer 'Benches' shows with a fixed text, namely 'This bench probably doesn't have an integrated artwork' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key tourism.", "value": "" }, { @@ -7305,35 +7310,6 @@ "key": "wikipedia", "description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Personal theme')" - }, - { - "key": "location", - "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Personal theme')", - "value": "underground" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "0" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key level.", - "value": "" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "1" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "-1" - }, { "key": "name", "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Personal theme')" @@ -7391,6 +7367,35 @@ "description": "Layer 'Restaurants and fast food' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "location", + "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Personal theme')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "-1" + }, { "key": "wheelchair", "description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", @@ -8383,6 +8388,35 @@ "key": "wikipedia", "description": "The layer 'Indoors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "level", + "description": "Layer 'Indoors' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "location", + "description": "Layer 'Indoors' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Personal theme')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "-1" + }, { "key": "ref", "description": "Layer 'Indoors' shows and asks freeform values for key 'ref' (in the mapcomplete.org theme 'Personal theme') (This is only shown if indoor=room|indoor=area|indoor=corridor)" @@ -8391,6 +8425,129 @@ "key": "name", "description": "Layer 'Indoors' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Personal theme') (This is only shown if indoor=room|indoor=area|indoor=corridor)" }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=administration with a fixed text, namely 'This is a administrative room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "administration" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=auditorium with a fixed text, namely 'This is a auditorium' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "auditorium" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=bedroom with a fixed text, namely 'This is a bedroom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "bedroom" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=chapel with a fixed text, namely 'This is a chapel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "chapel" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=class with a fixed text, namely 'This is a classroom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "class" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=classroom with a fixed text, namely 'This is a classroom' (in the mapcomplete.org theme 'Personal theme')", + "value": "classroom" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=computer with a fixed text, namely 'This is a computer room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "computer" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=conference with a fixed text, namely 'This is a conference room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "conference" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=crypt with a fixed text, namely 'This is a crypt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "crypt" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=kitchen with a fixed text, namely 'This is a kitchen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "kitchen" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=laboratory with a fixed text, namely 'This is a laboratory' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "laboratory" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=library with a fixed text, namely 'This is a library' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "library" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=locker with a fixed text, namely 'This is a locker room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "locker" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=nursery with a fixed text, namely 'This is a nursery' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "nursery" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=office with a fixed text, namely 'This is an office' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "office" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=prison_cell with a fixed text, namely 'This is a prison_cell' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "prison_cell" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=restaurant with a fixed text, namely 'This is a restaurant' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "restaurant" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=security_check with a fixed text, namely 'This is a room to perform security checks' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "security_check" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=sport with a fixed text, namely 'This is a sport room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "sport" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=storage with a fixed text, namely 'This is a storage room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "storage" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=technical with a fixed text, namely 'This is a technical room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "technical" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=toilets with a fixed text, namely 'These are toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "toilets" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=waiting with a fixed text, namely 'This is a waiting room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "waiting" + }, + { + "key": "capacity", + "description": "Layer 'Indoors' shows and asks freeform values for key 'capacity' (in the mapcomplete.org theme 'Personal theme') (This is only shown if room=waiting|room=restaurant|room=office|room=nursery|room=conference|room=auditorium|room=chapel|room=bedroom|room=classroom)" + }, + { + "key": "name:etymology:wikidata", + "description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Personal theme') (This is only shown if name:etymology!=unknown)" + }, { "key": "information", "description": "The MapComplete theme Personal theme has a layer Information boards showing features with this tag", @@ -12686,6 +12843,16 @@ "key": "wikipedia", "description": "The layer 'Surveillance camera's allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "surveillance:type", + "description": "Layer 'Surveillance camera's' shows surveillance:type=camera with a fixed text, namely 'This is a camera without number plate recognition.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "camera" + }, + { + "key": "surveillance:type", + "description": "Layer 'Surveillance camera's' shows surveillance:type=ALPR with a fixed text, namely 'This is an ALPR (Automatic License Plate Reader)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "ALPR" + }, { "key": "camera:type", "description": "Layer 'Surveillance camera's' shows camera:type=fixed with a fixed text, namely 'A fixed (non-moving) camera' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", diff --git a/Docs/TagInfo/mapcomplete_pets.json b/Docs/TagInfo/mapcomplete_pets.json index 22b0186f7..16f805568 100644 --- a/Docs/TagInfo/mapcomplete_pets.json +++ b/Docs/TagInfo/mapcomplete_pets.json @@ -114,35 +114,6 @@ "key": "wikipedia", "description": "The layer 'Dog friendly eateries allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, - { - "key": "level", - "description": "Layer 'Dog friendly eateries' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')" - }, - { - "key": "location", - "description": "Layer 'Dog friendly eateries' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", - "value": "underground" - }, - { - "key": "level", - "description": "Layer 'Dog friendly eateries' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", - "value": "0" - }, - { - "key": "level", - "description": "Layer 'Dog friendly eateries' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') Picking this answer will delete the key level.", - "value": "" - }, - { - "key": "level", - "description": "Layer 'Dog friendly eateries' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", - "value": "1" - }, - { - "key": "level", - "description": "Layer 'Dog friendly eateries' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", - "value": "-1" - }, { "key": "name", "description": "Layer 'Dog friendly eateries' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')" @@ -200,6 +171,35 @@ "description": "Layer 'Dog friendly eateries' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "yes" }, + { + "key": "level", + "description": "Layer 'Dog friendly eateries' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')" + }, + { + "key": "location", + "description": "Layer 'Dog friendly eateries' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Dog friendly eateries' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Dog friendly eateries' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Dog friendly eateries' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Dog friendly eateries' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "-1" + }, { "key": "wheelchair", "description": "Layer 'Dog friendly eateries' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", diff --git a/Docs/TagInfo/mapcomplete_playgrounds.json b/Docs/TagInfo/mapcomplete_playgrounds.json index 8f2e64beb..92903d04a 100644 --- a/Docs/TagInfo/mapcomplete_playgrounds.json +++ b/Docs/TagInfo/mapcomplete_playgrounds.json @@ -340,9 +340,14 @@ "description": "Layer 'Benches' shows tourism=artwork with a fixed text, namely 'This bench has an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds')", "value": "artwork" }, + { + "key": "not:tourism:artwork", + "description": "Layer 'Benches' shows not:tourism:artwork=yes with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds')", + "value": "yes" + }, { "key": "tourism", - "description": "Layer 'Benches' shows with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds') Picking this answer will delete the key tourism.", + "description": "Layer 'Benches' shows with a fixed text, namely 'This bench probably doesn't have an integrated artwork' (in the mapcomplete.org theme 'Playgrounds') Picking this answer will delete the key tourism.", "value": "" }, { diff --git a/Docs/TagInfo/mapcomplete_surveillance.json b/Docs/TagInfo/mapcomplete_surveillance.json index 5648fa720..c81f266a6 100644 --- a/Docs/TagInfo/mapcomplete_surveillance.json +++ b/Docs/TagInfo/mapcomplete_surveillance.json @@ -50,6 +50,16 @@ "key": "wikipedia", "description": "The layer 'Surveillance camera's allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "surveillance:type", + "description": "Layer 'Surveillance camera's' shows surveillance:type=camera with a fixed text, namely 'This is a camera without number plate recognition.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Surveillance under Surveillance')", + "value": "camera" + }, + { + "key": "surveillance:type", + "description": "Layer 'Surveillance camera's' shows surveillance:type=ALPR with a fixed text, namely 'This is an ALPR (Automatic License Plate Reader)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Surveillance under Surveillance')", + "value": "ALPR" + }, { "key": "camera:type", "description": "Layer 'Surveillance camera's' shows camera:type=fixed with a fixed text, namely 'A fixed (non-moving) camera' and allows to pick this as a default answer (in the mapcomplete.org theme 'Surveillance under Surveillance')", diff --git a/Docs/URL_Parameters.md b/Docs/URL_Parameters.md index 7f88f3f50..a4e2da5bc 100644 --- a/Docs/URL_Parameters.md +++ b/Docs/URL_Parameters.md @@ -346,7 +346,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L199) - The default value is _osm_ + No default value set diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json index 62361dea1..174b24c58 100644 --- a/assets/layers/charging_station/charging_station.json +++ b/assets/layers/charging_station/charging_station.json @@ -5294,4 +5294,4 @@ }, "neededChangesets": 10 } -} +} \ No newline at end of file diff --git a/assets/layers/questions/dogs_allowed.svg.license b/assets/layers/questions/dogs_allowed.svg.license index e14c126f7..cc80da1dd 100644 --- a/assets/layers/questions/dogs_allowed.svg.license +++ b/assets/layers/questions/dogs_allowed.svg.license @@ -1,2 +1,2 @@ SPDX-FileCopyrightText: OpenClipArt -SPDX-License-Identifier: PD \ No newline at end of file +SPDX-License-Identifier: PUBLIC-DOMAIN \ No newline at end of file diff --git a/assets/layers/questions/dogs_leashed.svg.license b/assets/layers/questions/dogs_leashed.svg.license index e32d67ee6..ae864e1e2 100644 --- a/assets/layers/questions/dogs_leashed.svg.license +++ b/assets/layers/questions/dogs_leashed.svg.license @@ -1,2 +1,2 @@ SPDX-FileCopyrightText: NPS Graphics, converted by User:ZyMOS -SPDX-License-Identifier: PD \ No newline at end of file +SPDX-License-Identifier: PUBLIC-DOMAIN \ No newline at end of file diff --git a/assets/svg/mangrove_logo.svg.license b/assets/svg/mangrove_logo.svg.license new file mode 100644 index 000000000..0f5f50aa6 --- /dev/null +++ b/assets/svg/mangrove_logo.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Mangrove.reviews +SPDX-License-Identifier: LicenseRef-LOGO \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5f6a1ce4f..2c7347c43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mapcomplete", - "version": "0.33.1", + "version": "0.33.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mapcomplete", - "version": "0.33.1", + "version": "0.33.5", "license": "GPL-3.0-or-later", "dependencies": { "@rgossiaux/svelte-headlessui": "^1.0.2", @@ -4970,9 +4970,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "version": "1.0.30001541", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz", + "integrity": "sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==", "dev": true, "funding": [ { @@ -17021,9 +17021,9 @@ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, "caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "version": "1.0.30001541", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz", + "integrity": "sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==", "dev": true }, "canvg": { diff --git a/package.json b/package.json index bc975ef3d..a70b46f67 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,6 @@ "main": "index.ts", "type": "module", "config": { - "#": "Various endpoints that are instance-specific. This is the default configuration, which is re-exported in 'Constants.ts'.", "#": "Use MAPCOMPLETE_CONFIGURATION to use an additional configuration, e.g. `MAPCOMPLETE_CONFIGURATION=config_hetzner`", "#oauth_credentials:comment": [ "`oauth_credentials` are the OAuth-2 credentials for the production-OSM server and the test-server.", diff --git a/src/Logic/Actors/PreferredRasterLayerSelector.ts b/src/Logic/Actors/PreferredRasterLayerSelector.ts index 7ed20aa95..a4c38512a 100644 --- a/src/Logic/Actors/PreferredRasterLayerSelector.ts +++ b/src/Logic/Actors/PreferredRasterLayerSelector.ts @@ -1,5 +1,5 @@ -import { Store, UIEventSource } from "../UIEventSource"; -import { RasterLayerPolygon } from "../../Models/RasterLayers"; +import { Store, UIEventSource } from "../UIEventSource" +import { RasterLayerPolygon } from "../../Models/RasterLayers" /** * Selects the appropriate raster layer as background for the given query parameter, theme setting, user preference or default value. @@ -7,40 +7,47 @@ import { RasterLayerPolygon } from "../../Models/RasterLayers"; * It the requested layer is not available, a layer of the same type will be selected. */ export class PreferredRasterLayerSelector { - private readonly _rasterLayerSetting: UIEventSource; - private readonly _availableLayers: Store; - private readonly _preferredBackgroundLayer: UIEventSource; - private readonly _queryParameter: UIEventSource; + private readonly _rasterLayerSetting: UIEventSource + private readonly _availableLayers: Store + private readonly _preferredBackgroundLayer: UIEventSource< + string | "photo" | "map" | "osmbasedmap" | undefined + > + private readonly _queryParameter: UIEventSource - constructor(rasterLayerSetting: UIEventSource, availableLayers: Store, queryParameter: UIEventSource, preferredBackgroundLayer: UIEventSource) { - this._rasterLayerSetting = rasterLayerSetting; - this._availableLayers = availableLayers; - this._queryParameter = queryParameter; - this._preferredBackgroundLayer = preferredBackgroundLayer; - const self = this; + constructor( + rasterLayerSetting: UIEventSource, + availableLayers: Store, + queryParameter: UIEventSource, + preferredBackgroundLayer: UIEventSource< + string | "photo" | "map" | "osmbasedmap" | undefined + > + ) { + this._rasterLayerSetting = rasterLayerSetting + this._availableLayers = availableLayers + this._queryParameter = queryParameter + this._preferredBackgroundLayer = preferredBackgroundLayer + const self = this - this._rasterLayerSetting.addCallbackD(layer => { + this._rasterLayerSetting.addCallbackD((layer) => { if (layer.properties.id !== this._queryParameter.data) { - this._queryParameter.setData(undefined); - return true; + this._queryParameter.setData(undefined) + return true } - }); + }) - - this._queryParameter.addCallbackAndRunD(_ => { - const isApplied = self.updateLayer(); + this._queryParameter.addCallbackAndRunD((_) => { + const isApplied = self.updateLayer() if (!isApplied) { // A different layer was set as background // We remove this queryParameter instead - self._queryParameter.setData(undefined); - return true; // Unregister + self._queryParameter.setData(undefined) + return true // Unregister } - }); + }) - this._preferredBackgroundLayer.addCallbackD(_ => self.updateLayer()); - - this._availableLayers.addCallbackD(_ => self.updateLayer()); + this._preferredBackgroundLayer.addCallbackD((_) => self.updateLayer()) + this._availableLayers.addCallbackD((_) => self.updateLayer()) } /** @@ -48,20 +55,19 @@ export class PreferredRasterLayerSelector { * @private */ private updateLayer() { - // What is the ID of the layer we have to (try to) load? - const targetLayerId = this._queryParameter.data ?? this._preferredBackgroundLayer.data; - const available = this._availableLayers.data; - const isCategory = targetLayerId === "photo" || targetLayerId === "osmbasedmap" || targetLayerId === "map" - const foundLayer = isCategory ? available.find(l => l.properties.category === targetLayerId) : available.find(l => l.properties.id === targetLayerId); + const targetLayerId = this._queryParameter.data ?? this._preferredBackgroundLayer.data + const available = this._availableLayers.data + const isCategory = + targetLayerId === "photo" || targetLayerId === "osmbasedmap" || targetLayerId === "map" + const foundLayer = isCategory + ? available.find((l) => l.properties.category === targetLayerId) + : available.find((l) => l.properties.id === targetLayerId) if (foundLayer) { - this._rasterLayerSetting.setData(foundLayer); - return true; + this._rasterLayerSetting.setData(foundLayer) + return true } // The current layer is not in view - - } - } diff --git a/src/Logic/ImageProviders/ImageUploadManager.ts b/src/Logic/ImageProviders/ImageUploadManager.ts index 85964a507..a187e82ef 100644 --- a/src/Logic/ImageProviders/ImageUploadManager.ts +++ b/src/Logic/ImageProviders/ImageUploadManager.ts @@ -1,159 +1,159 @@ -import { ImageUploader } from "./ImageUploader"; -import LinkImageAction from "../Osm/Actions/LinkImageAction"; -import FeaturePropertiesStore from "../FeatureSource/Actors/FeaturePropertiesStore"; -import { OsmId, OsmTags } from "../../Models/OsmFeature"; -import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; -import { Store, UIEventSource } from "../UIEventSource"; -import { OsmConnection } from "../Osm/OsmConnection"; -import { Changes } from "../Osm/Changes"; -import Translations from "../../UI/i18n/Translations"; -import NoteCommentElement from "../../UI/Popup/NoteCommentElement"; - +import { ImageUploader } from "./ImageUploader" +import LinkImageAction from "../Osm/Actions/LinkImageAction" +import FeaturePropertiesStore from "../FeatureSource/Actors/FeaturePropertiesStore" +import { OsmId, OsmTags } from "../../Models/OsmFeature" +import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig" +import { Store, UIEventSource } from "../UIEventSource" +import { OsmConnection } from "../Osm/OsmConnection" +import { Changes } from "../Osm/Changes" +import Translations from "../../UI/i18n/Translations" +import NoteCommentElement from "../../UI/Popup/NoteCommentElement" /** * The ImageUploadManager has a */ export class ImageUploadManager { + private readonly _uploader: ImageUploader + private readonly _featureProperties: FeaturePropertiesStore + private readonly _layout: LayoutConfig - private readonly _uploader: ImageUploader; - private readonly _featureProperties: FeaturePropertiesStore; - private readonly _layout: LayoutConfig; + private readonly _uploadStarted: Map> = new Map() + private readonly _uploadFinished: Map> = new Map() + private readonly _uploadFailed: Map> = new Map() + private readonly _uploadRetried: Map> = new Map() + private readonly _uploadRetriedSuccess: Map> = new Map() + private readonly _osmConnection: OsmConnection + private readonly _changes: Changes - private readonly _uploadStarted: Map> = new Map(); - private readonly _uploadFinished: Map> = new Map(); - private readonly _uploadFailed: Map> = new Map(); - private readonly _uploadRetried: Map> = new Map(); - private readonly _uploadRetriedSuccess: Map> = new Map(); - private readonly _osmConnection: OsmConnection; - private readonly _changes: Changes; - - constructor(layout: LayoutConfig, uploader: ImageUploader, featureProperties: FeaturePropertiesStore, osmConnection: OsmConnection, changes: Changes) { - this._uploader = uploader; - this._featureProperties = featureProperties; - this._layout = layout; - this._osmConnection = osmConnection; - this._changes = changes; - } - - /** - * Gets various counters. - * Note that counters can only increase - * If a retry was a success, both 'retrySuccess' _and_ 'uploadFinished' will be increased - * @param featureId: the id of the feature you want information for. '*' has a global counter - */ - public getCountsFor(featureId: string | "*"): { - retried: Store; - uploadStarted: Store; - retrySuccess: Store; - failed: Store; - uploadFinished: Store - } { - return { - uploadStarted: this.getCounterFor(this._uploadStarted, featureId), - uploadFinished: this.getCounterFor(this._uploadFinished, featureId), - retried: this.getCounterFor(this._uploadRetried, featureId), - failed: this.getCounterFor(this._uploadFailed, featureId), - retrySuccess: this.getCounterFor(this._uploadRetriedSuccess, featureId) - - }; - } - - /** - * Uploads the given image, applies the correct title and license for the known user. - * Will then add this image to the OSM-feature or the OSM-note - */ - public async uploadImageAndApply(file: File, tagsStore: UIEventSource) : Promise{ - - const sizeInBytes = file.size; - const tags= tagsStore.data - const featureId = tags.id; - const self = this; - if (sizeInBytes > this._uploader.maxFileSizeInMegabytes * 1000000) { - this.increaseCountFor(this._uploadStarted, featureId); - this.increaseCountFor(this._uploadFailed, featureId); - throw ( - Translations.t.image.toBig.Subs({ - actual_size: Math.floor(sizeInBytes / 1000000) + "MB", - max_size: self._uploader.maxFileSizeInMegabytes + "MB" - }).txt - ); + constructor( + layout: LayoutConfig, + uploader: ImageUploader, + featureProperties: FeaturePropertiesStore, + osmConnection: OsmConnection, + changes: Changes + ) { + this._uploader = uploader + this._featureProperties = featureProperties + this._layout = layout + this._osmConnection = osmConnection + this._changes = changes } - - const licenseStore = this._osmConnection?.GetPreference("pictures-license", "CC0"); - const license = licenseStore?.data ?? "CC0"; - - const matchingLayer = this._layout?.getMatchingLayer(tags); - - const title = - matchingLayer?.title?.GetRenderValue(tags)?.Subs(tags)?.textFor("en") ?? - tags.name ?? - "https//osm.org/" + tags.id; - const description = [ - "author:" + this._osmConnection.userDetails.data.name, - "license:" + license, - "osmid:" + tags.id - ].join("\n"); - - console.log("Upload done, creating "); - const action = await this.uploadImageWithLicense(featureId, title, description, file); - if(!isNaN(Number( featureId))){ - // THis is a map note - const url = action._url - await this._osmConnection.addCommentToNote(featureId, url) - NoteCommentElement.addCommentTo(url, > tagsStore, {osmConnection: this._osmConnection}) - return + /** + * Gets various counters. + * Note that counters can only increase + * If a retry was a success, both 'retrySuccess' _and_ 'uploadFinished' will be increased + * @param featureId: the id of the feature you want information for. '*' has a global counter + */ + public getCountsFor(featureId: string | "*"): { + retried: Store + uploadStarted: Store + retrySuccess: Store + failed: Store + uploadFinished: Store + } { + return { + uploadStarted: this.getCounterFor(this._uploadStarted, featureId), + uploadFinished: this.getCounterFor(this._uploadFinished, featureId), + retried: this.getCounterFor(this._uploadRetried, featureId), + failed: this.getCounterFor(this._uploadFailed, featureId), + retrySuccess: this.getCounterFor(this._uploadRetriedSuccess, featureId), + } } - await this._changes.applyAction(action); - } - private async uploadImageWithLicense( - featureId: OsmId, - title: string, description: string, blob: File - ): Promise { - this.increaseCountFor(this._uploadStarted, featureId); - const properties = this._featureProperties.getStore(featureId); - let key: string; - let value: string; - try { - ({ key, value } = await this._uploader.uploadImage(title, description, blob)); - } catch (e) { - this.increaseCountFor(this._uploadRetried, featureId); - console.error("Could not upload image, trying again:", e); - try { + /** + * Uploads the given image, applies the correct title and license for the known user. + * Will then add this image to the OSM-feature or the OSM-note + */ + public async uploadImageAndApply(file: File, tagsStore: UIEventSource): Promise { + const sizeInBytes = file.size + const tags = tagsStore.data + const featureId = tags.id + const self = this + if (sizeInBytes > this._uploader.maxFileSizeInMegabytes * 1000000) { + this.increaseCountFor(this._uploadStarted, featureId) + this.increaseCountFor(this._uploadFailed, featureId) + throw Translations.t.image.toBig.Subs({ + actual_size: Math.floor(sizeInBytes / 1000000) + "MB", + max_size: self._uploader.maxFileSizeInMegabytes + "MB", + }).txt + } - ({ key, value } = await this._uploader.uploadImage(title, description, blob)); - this.increaseCountFor(this._uploadRetriedSuccess, featureId); - } catch (e) { - console.error("Could again not upload image due to", e); - this.increaseCountFor(this._uploadFailed, featureId); - } + const licenseStore = this._osmConnection?.GetPreference("pictures-license", "CC0") + const license = licenseStore?.data ?? "CC0" + const matchingLayer = this._layout?.getMatchingLayer(tags) + + const title = + matchingLayer?.title?.GetRenderValue(tags)?.Subs(tags)?.textFor("en") ?? + tags.name ?? + "https//osm.org/" + tags.id + const description = [ + "author:" + this._osmConnection.userDetails.data.name, + "license:" + license, + "osmid:" + tags.id, + ].join("\n") + + console.log("Upload done, creating ") + const action = await this.uploadImageWithLicense(featureId, title, description, file) + if (!isNaN(Number(featureId))) { + // THis is a map note + const url = action._url + await this._osmConnection.addCommentToNote(featureId, url) + NoteCommentElement.addCommentTo(url, >tagsStore, { + osmConnection: this._osmConnection, + }) + return + } + await this._changes.applyAction(action) } - console.log("Uploading done, creating action for", featureId); - const action = new LinkImageAction(featureId, key, value, properties, { - theme: this._layout.id, - changeType: "add-image" - }); - this.increaseCountFor(this._uploadFinished, featureId); - return action; - } - private getCounterFor(collection: Map>, key: string | "*") { - if (this._featureProperties.aliases.has(key)) { - key = this._featureProperties.aliases.get(key); + private async uploadImageWithLicense( + featureId: OsmId, + title: string, + description: string, + blob: File + ): Promise { + this.increaseCountFor(this._uploadStarted, featureId) + const properties = this._featureProperties.getStore(featureId) + let key: string + let value: string + try { + ;({ key, value } = await this._uploader.uploadImage(title, description, blob)) + } catch (e) { + this.increaseCountFor(this._uploadRetried, featureId) + console.error("Could not upload image, trying again:", e) + try { + ;({ key, value } = await this._uploader.uploadImage(title, description, blob)) + this.increaseCountFor(this._uploadRetriedSuccess, featureId) + } catch (e) { + console.error("Could again not upload image due to", e) + this.increaseCountFor(this._uploadFailed, featureId) + } + } + console.log("Uploading done, creating action for", featureId) + const action = new LinkImageAction(featureId, key, value, properties, { + theme: this._layout.id, + changeType: "add-image", + }) + this.increaseCountFor(this._uploadFinished, featureId) + return action } - if (!collection.has(key)) { - collection.set(key, new UIEventSource(0)); + + private getCounterFor(collection: Map>, key: string | "*") { + if (this._featureProperties.aliases.has(key)) { + key = this._featureProperties.aliases.get(key) + } + if (!collection.has(key)) { + collection.set(key, new UIEventSource(0)) + } + return collection.get(key) } - return collection.get(key); - } - - private increaseCountFor(collection: Map>, key: string | "*") { - const counter = this.getCounterFor(collection, key); - counter.setData(counter.data + 1); - const global = this.getCounterFor(collection, "*"); - global.setData(counter.data + 1); - } + private increaseCountFor(collection: Map>, key: string | "*") { + const counter = this.getCounterFor(collection, key) + counter.setData(counter.data + 1) + const global = this.getCounterFor(collection, "*") + global.setData(counter.data + 1) + } } diff --git a/src/Logic/ImageProviders/ImageUploader.ts b/src/Logic/ImageProviders/ImageUploader.ts index 3efb8d279..40601892b 100644 --- a/src/Logic/ImageProviders/ImageUploader.ts +++ b/src/Logic/ImageProviders/ImageUploader.ts @@ -1,5 +1,5 @@ export interface ImageUploader { - maxFileSizeInMegabytes?: number; + maxFileSizeInMegabytes?: number /** * Uploads the 'blob' as image, with some metadata. * Returns the URL to be linked + the appropriate key to add this to OSM @@ -11,5 +11,5 @@ export interface ImageUploader { title: string, description: string, blob: File - ): Promise<{ key: string, value: string }>; + ): Promise<{ key: string; value: string }> } diff --git a/src/Logic/ImageProviders/Imgur.ts b/src/Logic/ImageProviders/Imgur.ts index 4e4a1c541..536616403 100644 --- a/src/Logic/ImageProviders/Imgur.ts +++ b/src/Logic/ImageProviders/Imgur.ts @@ -1,15 +1,15 @@ -import ImageProvider, { ProvidedImage } from "./ImageProvider"; -import BaseUIElement from "../../UI/BaseUIElement"; -import { Utils } from "../../Utils"; -import Constants from "../../Models/Constants"; -import { LicenseInfo } from "./LicenseInfo"; -import { ImageUploader } from "./ImageUploader"; +import ImageProvider, { ProvidedImage } from "./ImageProvider" +import BaseUIElement from "../../UI/BaseUIElement" +import { Utils } from "../../Utils" +import Constants from "../../Models/Constants" +import { LicenseInfo } from "./LicenseInfo" +import { ImageUploader } from "./ImageUploader" -export class Imgur extends ImageProvider implements ImageUploader{ +export class Imgur extends ImageProvider implements ImageUploader { public static readonly defaultValuePrefix = ["https://i.imgur.com"] public static readonly singleton = new Imgur() public readonly defaultKeyPrefixes: string[] = ["image"] - public readonly maxFileSizeInMegabytes = 10 + public readonly maxFileSizeInMegabytes = 10 private constructor() { super() } @@ -24,7 +24,7 @@ export class Imgur extends ImageProvider implements ImageUploader{ title: string, description: string, blob: File - ): Promise<{ key: string, value: string }> { + ): Promise<{ key: string; value: string }> { const apiUrl = "https://api.imgur.com/3/image" const apiKey = Constants.ImgurApiKey @@ -33,7 +33,6 @@ export class Imgur extends ImageProvider implements ImageUploader{ formData.append("title", title) formData.append("description", description) - const settings: RequestInit = { method: "POST", body: formData, diff --git a/src/Logic/Osm/Actions/LinkImageAction.ts b/src/Logic/Osm/Actions/LinkImageAction.ts index 7d4ec23c8..908ce1583 100644 --- a/src/Logic/Osm/Actions/LinkImageAction.ts +++ b/src/Logic/Osm/Actions/LinkImageAction.ts @@ -1,15 +1,15 @@ -import ChangeTagAction from "./ChangeTagAction"; -import { Tag } from "../../Tags/Tag"; -import OsmChangeAction from "./OsmChangeAction"; -import { Changes } from "../Changes"; -import { ChangeDescription } from "./ChangeDescription"; -import { Store } from "../../UIEventSource"; +import ChangeTagAction from "./ChangeTagAction" +import { Tag } from "../../Tags/Tag" +import OsmChangeAction from "./OsmChangeAction" +import { Changes } from "../Changes" +import { ChangeDescription } from "./ChangeDescription" +import { Store } from "../../UIEventSource" export default class LinkImageAction extends OsmChangeAction { - private readonly _proposedKey: "image" | "mapillary" | "wiki_commons" | string; - public readonly _url: string; - private readonly _currentTags: Store>; - private readonly _meta: { theme: string; changeType: "add-image" | "link-image" }; + private readonly _proposedKey: "image" | "mapillary" | "wiki_commons" | string + public readonly _url: string + private readonly _currentTags: Store> + private readonly _meta: { theme: string; changeType: "add-image" | "link-image" } /** * Adds an image-link to a feature @@ -31,10 +31,10 @@ export default class LinkImageAction extends OsmChangeAction { } ) { super(elementId, true) - this._proposedKey = proposedKey; - this._url = url; - this._currentTags = currentTags; - this._meta = meta; + this._proposedKey = proposedKey + this._url = url + this._currentTags = currentTags + this._meta = meta } protected CreateChangeDescriptions(): Promise { @@ -46,9 +46,12 @@ export default class LinkImageAction extends OsmChangeAction { key = this._proposedKey + ":" + i i++ } - const tagChangeAction = new ChangeTagAction ( this.mainObjectId, new Tag(key, url), currentTags, this._meta) + const tagChangeAction = new ChangeTagAction( + this.mainObjectId, + new Tag(key, url), + currentTags, + this._meta + ) return tagChangeAction.CreateChangeDescriptions() } - - } diff --git a/src/Logic/Osm/ChangesetHandler.ts b/src/Logic/Osm/ChangesetHandler.ts index 4b2a70b32..f3d78336d 100644 --- a/src/Logic/Osm/ChangesetHandler.ts +++ b/src/Logic/Osm/ChangesetHandler.ts @@ -5,7 +5,7 @@ import Locale from "../../UI/i18n/Locale" import Constants from "../../Models/Constants" import { Changes } from "./Changes" import { Utils } from "../../Utils" -import FeaturePropertiesStore from "../FeatureSource/Actors/FeaturePropertiesStore"; +import FeaturePropertiesStore from "../FeatureSource/Actors/FeaturePropertiesStore" export interface ChangesetTag { key: string @@ -30,11 +30,14 @@ export class ChangesetHandler { constructor( dryRun: Store, osmConnection: OsmConnection, - allElements: FeaturePropertiesStore | { addAlias: (id0: string, id1: string) => void } | undefined, + allElements: + | FeaturePropertiesStore + | { addAlias: (id0: string, id1: string) => void } + | undefined, changes: Changes ) { this.osmConnection = osmConnection - this.allElements = allElements + this.allElements = allElements this.changes = changes this._dryRun = dryRun this.userDetails = osmConnection.userDetails diff --git a/src/Logic/Osm/OsmConnection.ts b/src/Logic/Osm/OsmConnection.ts index 07028c35a..6f4e3755b 100644 --- a/src/Logic/Osm/OsmConnection.ts +++ b/src/Logic/Osm/OsmConnection.ts @@ -1,553 +1,553 @@ // @ts-ignore -import { osmAuth } from "osm-auth"; -import { Store, Stores, UIEventSource } from "../UIEventSource"; -import { OsmPreferences } from "./OsmPreferences"; -import { Utils } from "../../Utils"; -import { LocalStorageSource } from "../Web/LocalStorageSource"; -import * as config from "../../../package.json"; +import { osmAuth } from "osm-auth" +import { Store, Stores, UIEventSource } from "../UIEventSource" +import { OsmPreferences } from "./OsmPreferences" +import { Utils } from "../../Utils" +import { LocalStorageSource } from "../Web/LocalStorageSource" +import * as config from "../../../package.json" export default class UserDetails { - public loggedIn = false; - public name = "Not logged in"; - public uid: number; - public csCount = 0; - public img?: string; - public unreadMessages = 0; - public totalMessages: number = 0; - public home: { lon: number; lat: number }; - public backend: string; - public account_created: string; - public tracesCount: number = 0; - public description: string; + public loggedIn = false + public name = "Not logged in" + public uid: number + public csCount = 0 + public img?: string + public unreadMessages = 0 + public totalMessages: number = 0 + public home: { lon: number; lat: number } + public backend: string + public account_created: string + public tracesCount: number = 0 + public description: string - constructor(backend: string) { - this.backend = backend; - } + constructor(backend: string) { + this.backend = backend + } } export interface AuthConfig { - "#"?: string; // optional comment - oauth_client_id: string; - oauth_secret: string; - url: string; + "#"?: string // optional comment + oauth_client_id: string + oauth_secret: string + url: string } export type OsmServiceState = "online" | "readonly" | "offline" | "unknown" | "unreachable" export class OsmConnection { - public static readonly oauth_configs: Record = - config.config.oauth_credentials; - public auth; - public userDetails: UIEventSource; - public isLoggedIn: Store; - public gpxServiceIsOnline: UIEventSource = new UIEventSource( - "unknown" - ); - public apiIsOnline: UIEventSource = new UIEventSource( - "unknown" - ); + public static readonly oauth_configs: Record = + config.config.oauth_credentials + public auth + public userDetails: UIEventSource + public isLoggedIn: Store + public gpxServiceIsOnline: UIEventSource = new UIEventSource( + "unknown" + ) + public apiIsOnline: UIEventSource = new UIEventSource( + "unknown" + ) - public loadingStatus = new UIEventSource<"not-attempted" | "loading" | "error" | "logged-in">( - "not-attempted" - ); - public preferencesHandler: OsmPreferences; - public readonly _oauth_config: AuthConfig; - private readonly _dryRun: Store; - private fakeUser: boolean; - private _onLoggedIn: ((userDetails: UserDetails) => void)[] = []; - private readonly _iframeMode: Boolean | boolean; - private readonly _singlePage: boolean; - private isChecking = false; + public loadingStatus = new UIEventSource<"not-attempted" | "loading" | "error" | "logged-in">( + "not-attempted" + ) + public preferencesHandler: OsmPreferences + public readonly _oauth_config: AuthConfig + private readonly _dryRun: Store + private fakeUser: boolean + private _onLoggedIn: ((userDetails: UserDetails) => void)[] = [] + private readonly _iframeMode: Boolean | boolean + private readonly _singlePage: boolean + private isChecking = false - constructor(options?: { - dryRun?: Store - fakeUser?: false | boolean - oauth_token?: UIEventSource - // Used to keep multiple changesets open and to write to the correct changeset - singlePage?: boolean - osmConfiguration?: "osm" | "osm-test" - attemptLogin?: true | boolean - }) { - options = options ?? {}; - this.fakeUser = options.fakeUser ?? false; - this._singlePage = options.singlePage ?? true; - this._oauth_config = - OsmConnection.oauth_configs[options.osmConfiguration ?? "osm"] ?? - OsmConnection.oauth_configs.osm; - console.debug("Using backend", this._oauth_config.url); - this._iframeMode = Utils.runningFromConsole ? false : window !== window.top; + constructor(options?: { + dryRun?: Store + fakeUser?: false | boolean + oauth_token?: UIEventSource + // Used to keep multiple changesets open and to write to the correct changeset + singlePage?: boolean + osmConfiguration?: "osm" | "osm-test" + attemptLogin?: true | boolean + }) { + options = options ?? {} + this.fakeUser = options.fakeUser ?? false + this._singlePage = options.singlePage ?? true + this._oauth_config = + OsmConnection.oauth_configs[options.osmConfiguration ?? "osm"] ?? + OsmConnection.oauth_configs.osm + console.debug("Using backend", this._oauth_config.url) + this._iframeMode = Utils.runningFromConsole ? false : window !== window.top - // Check if there are settings available in environment variables, and if so, use those - if ( - import.meta.env.VITE_OSM_OAUTH_CLIENT_ID !== undefined && - import.meta.env.VITE_OSM_OAUTH_SECRET !== undefined - ) { - console.debug("Using environment variables for oauth config"); - this._oauth_config = { - oauth_client_id: import.meta.env.VITE_OSM_OAUTH_CLIENT_ID, - oauth_secret: import.meta.env.VITE_OSM_OAUTH_SECRET, - url: "https://api.openstreetmap.org" - }; - } - - this.userDetails = new UIEventSource( - new UserDetails(this._oauth_config.url), - "userDetails" - ); - if (options.fakeUser) { - const ud = this.userDetails.data; - ud.csCount = 5678; - ud.loggedIn = true; - ud.unreadMessages = 0; - ud.name = "Fake user"; - ud.totalMessages = 42; - } - const self = this; - this.UpdateCapabilities(); - this.isLoggedIn = this.userDetails.map( - (user) => - user.loggedIn && - (self.apiIsOnline.data === "unknown" || self.apiIsOnline.data === "online"), - [this.apiIsOnline] - ); - this.isLoggedIn.addCallback((isLoggedIn) => { - if (self.userDetails.data.loggedIn == false && isLoggedIn == true) { - // We have an inconsistency: the userdetails say we _didn't_ log in, but this actor says we do - // This means someone attempted to toggle this; so we attempt to login! - self.AttemptLogin(); - } - }); - - this._dryRun = options.dryRun ?? new UIEventSource(false); - - this.updateAuthObject(); - - this.preferencesHandler = new OsmPreferences( - this.auth, - this - ); - - if (options.oauth_token?.data !== undefined) { - console.log(options.oauth_token.data); - const self = this; - this.auth.bootstrapToken( - options.oauth_token.data, - (x) => { - console.log("Called back: ", x); - self.AttemptLogin(); - }, - this.auth - ); - - options.oauth_token.setData(undefined); - } - if (this.auth.authenticated() && options.attemptLogin !== false) { - this.AttemptLogin(); // Also updates the user badge - } else { - console.log("Not authenticated"); - } - } - - public GetPreference( - key: string, - defaultValue: string = undefined, - options?: { - documentation?: string - prefix?: string - } - ): UIEventSource { - return this.preferencesHandler.GetPreference(key, defaultValue, options); - } - - public GetLongPreference(key: string, prefix: string = "mapcomplete-"): UIEventSource { - return this.preferencesHandler.GetLongPreference(key, prefix); - } - - public OnLoggedIn(action: (userDetails: UserDetails) => void) { - this._onLoggedIn.push(action); - } - - public LogOut() { - this.auth.logout(); - this.userDetails.data.loggedIn = false; - this.userDetails.data.csCount = 0; - this.userDetails.data.name = ""; - this.userDetails.ping(); - console.log("Logged out"); - this.loadingStatus.setData("not-attempted"); - } - - /** - * The backend host, without path or trailing '/' - * - * new OsmConnection().Backend() // => "https://www.openstreetmap.org" - */ - public Backend(): string { - return this._oauth_config.url; - } - - public AttemptLogin() { - this.UpdateCapabilities(); - this.loadingStatus.setData("loading"); - if (this.fakeUser) { - this.loadingStatus.setData("logged-in"); - console.log("AttemptLogin called, but ignored as fakeUser is set"); - return; - } - const self = this; - console.log("Trying to log in..."); - this.updateAuthObject(); - LocalStorageSource.Get("location_before_login").setData( - Utils.runningFromConsole ? undefined : window.location.href - ); - this.auth.xhr( - { - method: "GET", - path: "/api/0.6/user/details" - }, - function(err, details) { - if (err != null) { - console.log(err); - self.loadingStatus.setData("error"); - if (err.status == 401) { - console.log("Clearing tokens..."); - // Not authorized - our token probably got revoked - self.auth.logout(); - self.LogOut(); - } - return; + // Check if there are settings available in environment variables, and if so, use those + if ( + import.meta.env.VITE_OSM_OAUTH_CLIENT_ID !== undefined && + import.meta.env.VITE_OSM_OAUTH_SECRET !== undefined + ) { + console.debug("Using environment variables for oauth config") + this._oauth_config = { + oauth_client_id: import.meta.env.VITE_OSM_OAUTH_CLIENT_ID, + oauth_secret: import.meta.env.VITE_OSM_OAUTH_SECRET, + url: "https://api.openstreetmap.org", + } } - if (details == null) { - self.loadingStatus.setData("error"); - return; + this.userDetails = new UIEventSource( + new UserDetails(this._oauth_config.url), + "userDetails" + ) + if (options.fakeUser) { + const ud = this.userDetails.data + ud.csCount = 5678 + ud.loggedIn = true + ud.unreadMessages = 0 + ud.name = "Fake user" + ud.totalMessages = 42 + } + const self = this + this.UpdateCapabilities() + this.isLoggedIn = this.userDetails.map( + (user) => + user.loggedIn && + (self.apiIsOnline.data === "unknown" || self.apiIsOnline.data === "online"), + [this.apiIsOnline] + ) + this.isLoggedIn.addCallback((isLoggedIn) => { + if (self.userDetails.data.loggedIn == false && isLoggedIn == true) { + // We have an inconsistency: the userdetails say we _didn't_ log in, but this actor says we do + // This means someone attempted to toggle this; so we attempt to login! + self.AttemptLogin() + } + }) + + this._dryRun = options.dryRun ?? new UIEventSource(false) + + this.updateAuthObject() + + this.preferencesHandler = new OsmPreferences( + this.auth, + this + ) + + if (options.oauth_token?.data !== undefined) { + console.log(options.oauth_token.data) + const self = this + this.auth.bootstrapToken( + options.oauth_token.data, + (x) => { + console.log("Called back: ", x) + self.AttemptLogin() + }, + this.auth + ) + + options.oauth_token.setData(undefined) + } + if (this.auth.authenticated() && options.attemptLogin !== false) { + this.AttemptLogin() // Also updates the user badge + } else { + console.log("Not authenticated") + } + } + + public GetPreference( + key: string, + defaultValue: string = undefined, + options?: { + documentation?: string + prefix?: string + } + ): UIEventSource { + return this.preferencesHandler.GetPreference(key, defaultValue, options) + } + + public GetLongPreference(key: string, prefix: string = "mapcomplete-"): UIEventSource { + return this.preferencesHandler.GetLongPreference(key, prefix) + } + + public OnLoggedIn(action: (userDetails: UserDetails) => void) { + this._onLoggedIn.push(action) + } + + public LogOut() { + this.auth.logout() + this.userDetails.data.loggedIn = false + this.userDetails.data.csCount = 0 + this.userDetails.data.name = "" + this.userDetails.ping() + console.log("Logged out") + this.loadingStatus.setData("not-attempted") + } + + /** + * The backend host, without path or trailing '/' + * + * new OsmConnection().Backend() // => "https://www.openstreetmap.org" + */ + public Backend(): string { + return this._oauth_config.url + } + + public AttemptLogin() { + this.UpdateCapabilities() + this.loadingStatus.setData("loading") + if (this.fakeUser) { + this.loadingStatus.setData("logged-in") + console.log("AttemptLogin called, but ignored as fakeUser is set") + return + } + const self = this + console.log("Trying to log in...") + this.updateAuthObject() + LocalStorageSource.Get("location_before_login").setData( + Utils.runningFromConsole ? undefined : window.location.href + ) + this.auth.xhr( + { + method: "GET", + path: "/api/0.6/user/details", + }, + function (err, details) { + if (err != null) { + console.log(err) + self.loadingStatus.setData("error") + if (err.status == 401) { + console.log("Clearing tokens...") + // Not authorized - our token probably got revoked + self.auth.logout() + self.LogOut() + } + return + } + + if (details == null) { + self.loadingStatus.setData("error") + return + } + + self.CheckForMessagesContinuously() + + // details is an XML DOM of user details + let userInfo = details.getElementsByTagName("user")[0] + + let data = self.userDetails.data + data.loggedIn = true + console.log("Login completed, userinfo is ", userInfo) + data.name = userInfo.getAttribute("display_name") + data.account_created = userInfo.getAttribute("account_created") + data.uid = Number(userInfo.getAttribute("id")) + data.csCount = Number.parseInt( + userInfo.getElementsByTagName("changesets")[0].getAttribute("count") ?? 0 + ) + data.tracesCount = Number.parseInt( + userInfo.getElementsByTagName("traces")[0].getAttribute("count") ?? 0 + ) + + data.img = undefined + const imgEl = userInfo.getElementsByTagName("img") + if (imgEl !== undefined && imgEl[0] !== undefined) { + data.img = imgEl[0].getAttribute("href") + } + + const description = userInfo.getElementsByTagName("description") + if (description !== undefined && description[0] !== undefined) { + data.description = description[0]?.innerHTML + } + const homeEl = userInfo.getElementsByTagName("home") + if (homeEl !== undefined && homeEl[0] !== undefined) { + const lat = parseFloat(homeEl[0].getAttribute("lat")) + const lon = parseFloat(homeEl[0].getAttribute("lon")) + data.home = { lat: lat, lon: lon } + } + + self.loadingStatus.setData("logged-in") + const messages = userInfo + .getElementsByTagName("messages")[0] + .getElementsByTagName("received")[0] + data.unreadMessages = parseInt(messages.getAttribute("unread")) + data.totalMessages = parseInt(messages.getAttribute("count")) + + self.userDetails.ping() + for (const action of self._onLoggedIn) { + action(self.userDetails.data) + } + self._onLoggedIn = [] + } + ) + } + + /** + * Interact with the API. + * + * @param path: the path to query, without host and without '/api/0.6'. Example 'notes/1234/close' + */ + public async interact( + path: string, + method: "GET" | "POST" | "PUT" | "DELETE", + header?: Record, + content?: string + ): Promise { + return new Promise((ok, error) => { + this.auth.xhr( + { + method, + options: { + header, + }, + content, + path: `/api/0.6/${path}`, + }, + function (err, response) { + if (err !== null) { + error(err) + } else { + ok(response) + } + } + ) + }) + } + + public async post( + path: string, + content?: string, + header?: Record + ): Promise { + return await this.interact(path, "POST", header, content) + } + + public async put( + path: string, + content?: string, + header?: Record + ): Promise { + return await this.interact(path, "PUT", header, content) + } + + public async get(path: string, header?: Record): Promise { + return await this.interact(path, "GET", header) + } + + public closeNote(id: number | string, text?: string): Promise { + let textSuffix = "" + if ((text ?? "") !== "") { + textSuffix = "?text=" + encodeURIComponent(text) + } + if (this._dryRun.data) { + console.warn("Dryrun enabled - not actually closing note ", id, " with text ", text) + return new Promise((ok) => { + ok() + }) + } + return this.post(`notes/${id}/close${textSuffix}`) + } + + public reopenNote(id: number | string, text?: string): Promise { + if (this._dryRun.data) { + console.warn("Dryrun enabled - not actually reopening note ", id, " with text ", text) + return new Promise((ok) => { + ok() + }) + } + let textSuffix = "" + if ((text ?? "") !== "") { + textSuffix = "?text=" + encodeURIComponent(text) + } + return this.post(`notes/${id}/reopen${textSuffix}`) + } + + public async openNote(lat: number, lon: number, text: string): Promise<{ id: number }> { + if (this._dryRun.data) { + console.warn("Dryrun enabled - not actually opening note with text ", text) + return new Promise<{ id: number }>((ok) => { + window.setTimeout( + () => ok({ id: Math.floor(Math.random() * 1000) }), + Math.random() * 5000 + ) + }) + } + // Lat and lon must be strings for the API to accept it + const content = `lat=${lat}&lon=${lon}&text=${encodeURIComponent(text)}` + const response = await this.post("notes.json", content, { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + }) + const parsed = JSON.parse(response) + const id = parsed.properties + console.log("OPENED NOTE", id) + return id + } + + public async uploadGpxTrack( + gpx: string, + options: { + description: string + visibility: "private" | "public" | "trackable" | "identifiable" + filename?: string + /** + * Some words to give some properties; + * + * Note: these are called 'tags' on the wiki, but I opted to name them 'labels' instead as they aren't "key=value" tags, but just words. + */ + labels: string[] + } + ): Promise<{ id: number }> { + if (this._dryRun.data) { + console.warn("Dryrun enabled - not actually uploading GPX ", gpx) + return new Promise<{ id: number }>((ok, error) => { + window.setTimeout( + () => ok({ id: Math.floor(Math.random() * 1000) }), + Math.random() * 5000 + ) + }) } - self.CheckForMessagesContinuously(); - - // details is an XML DOM of user details - let userInfo = details.getElementsByTagName("user")[0]; - - let data = self.userDetails.data; - data.loggedIn = true; - console.log("Login completed, userinfo is ", userInfo); - data.name = userInfo.getAttribute("display_name"); - data.account_created = userInfo.getAttribute("account_created"); - data.uid = Number(userInfo.getAttribute("id")); - data.csCount = Number.parseInt( - userInfo.getElementsByTagName("changesets")[0].getAttribute("count") ?? 0 - ); - data.tracesCount = Number.parseInt( - userInfo.getElementsByTagName("traces")[0].getAttribute("count") ?? 0 - ); - - data.img = undefined; - const imgEl = userInfo.getElementsByTagName("img"); - if (imgEl !== undefined && imgEl[0] !== undefined) { - data.img = imgEl[0].getAttribute("href"); + const contents = { + file: gpx, + description: options.description ?? "", + tags: options.labels?.join(",") ?? "", + visibility: options.visibility, } - const description = userInfo.getElementsByTagName("description"); - if (description !== undefined && description[0] !== undefined) { - data.description = description[0]?.innerHTML; - } - const homeEl = userInfo.getElementsByTagName("home"); - if (homeEl !== undefined && homeEl[0] !== undefined) { - const lat = parseFloat(homeEl[0].getAttribute("lat")); - const lon = parseFloat(homeEl[0].getAttribute("lon")); - data.home = { lat: lat, lon: lon }; + const extras = { + file: + '; filename="' + + (options.filename ?? "gpx_track_mapcomplete_" + new Date().toISOString()) + + '"\r\nContent-Type: application/gpx+xml', } - self.loadingStatus.setData("logged-in"); - const messages = userInfo - .getElementsByTagName("messages")[0] - .getElementsByTagName("received")[0]; - data.unreadMessages = parseInt(messages.getAttribute("unread")); - data.totalMessages = parseInt(messages.getAttribute("count")); + const boundary = "987654" - self.userDetails.ping(); - for (const action of self._onLoggedIn) { - action(self.userDetails.data); + let body = "" + for (const key in contents) { + body += "--" + boundary + "\r\n" + body += 'Content-Disposition: form-data; name="' + key + '"' + if (extras[key] !== undefined) { + body += extras[key] + } + body += "\r\n\r\n" + body += contents[key] + "\r\n" } - self._onLoggedIn = []; - } - ); - } + body += "--" + boundary + "--\r\n" - /** - * Interact with the API. - * - * @param path: the path to query, without host and without '/api/0.6'. Example 'notes/1234/close' - */ - public async interact( - path: string, - method: "GET" | "POST" | "PUT" | "DELETE", - header?: Record, - content?: string - ): Promise { - return new Promise((ok, error) => { - this.auth.xhr( - { - method, - options: { - header - }, - content, - path: `/api/0.6/${path}` - }, - function(err, response) { - if (err !== null) { - error(err); - } else { - ok(response); - } + const response = await this.post("gpx/create", body, { + "Content-Type": "multipart/form-data; boundary=" + boundary, + "Content-Length": body.length, + }) + const parsed = JSON.parse(response) + console.log("Uploaded GPX track", parsed) + return { id: parsed } + } + + public addCommentToNote(id: number | string, text: string): Promise { + if (this._dryRun.data) { + console.warn("Dryrun enabled - not actually adding comment ", text, "to note ", id) + return new Promise((ok) => { + ok() + }) } - ); - }); - } - - public async post( - path: string, - content?: string, - header?: Record - ): Promise { - return await this.interact(path, "POST", header, content); - } - - public async put( - path: string, - content?: string, - header?: Record - ): Promise { - return await this.interact(path, "PUT", header, content); - } - - public async get(path: string, header?: Record): Promise { - return await this.interact(path, "GET", header); - } - - public closeNote(id: number | string, text?: string): Promise { - let textSuffix = ""; - if ((text ?? "") !== "") { - textSuffix = "?text=" + encodeURIComponent(text); - } - if (this._dryRun.data) { - console.warn("Dryrun enabled - not actually closing note ", id, " with text ", text); - return new Promise((ok) => { - ok(); - }); - } - return this.post(`notes/${id}/close${textSuffix}`); - } - - public reopenNote(id: number | string, text?: string): Promise { - if (this._dryRun.data) { - console.warn("Dryrun enabled - not actually reopening note ", id, " with text ", text); - return new Promise((ok) => { - ok(); - }); - } - let textSuffix = ""; - if ((text ?? "") !== "") { - textSuffix = "?text=" + encodeURIComponent(text); - } - return this.post(`notes/${id}/reopen${textSuffix}`); - } - - public async openNote(lat: number, lon: number, text: string): Promise<{ id: number }> { - if (this._dryRun.data) { - console.warn("Dryrun enabled - not actually opening note with text ", text); - return new Promise<{ id: number }>((ok) => { - window.setTimeout( - () => ok({ id: Math.floor(Math.random() * 1000) }), - Math.random() * 5000 - ); - }); - } - // Lat and lon must be strings for the API to accept it - const content = `lat=${lat}&lon=${lon}&text=${encodeURIComponent(text)}` - const response = await this.post("notes.json", content, { - "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" - }); - const parsed = JSON.parse(response); - const id = parsed.properties; - console.log("OPENED NOTE", id); - return id; - } - - public async uploadGpxTrack( - gpx: string, - options: { - description: string - visibility: "private" | "public" | "trackable" | "identifiable" - filename?: string - /** - * Some words to give some properties; - * - * Note: these are called 'tags' on the wiki, but I opted to name them 'labels' instead as they aren't "key=value" tags, but just words. - */ - labels: string[] - } - ): Promise<{ id: number }> { - if (this._dryRun.data) { - console.warn("Dryrun enabled - not actually uploading GPX ", gpx); - return new Promise<{ id: number }>((ok, error) => { - window.setTimeout( - () => ok({ id: Math.floor(Math.random() * 1000) }), - Math.random() * 5000 - ); - }); - } - - const contents = { - file: gpx, - description: options.description ?? "", - tags: options.labels?.join(",") ?? "", - visibility: options.visibility - }; - - const extras = { - file: - "; filename=\"" + - (options.filename ?? "gpx_track_mapcomplete_" + new Date().toISOString()) + - "\"\r\nContent-Type: application/gpx+xml" - }; - - const boundary = "987654"; - - let body = ""; - for (const key in contents) { - body += "--" + boundary + "\r\n"; - body += "Content-Disposition: form-data; name=\"" + key + "\""; - if (extras[key] !== undefined) { - body += extras[key]; - } - body += "\r\n\r\n"; - body += contents[key] + "\r\n"; - } - body += "--" + boundary + "--\r\n"; - - const response = await this.post("gpx/create", body, { - "Content-Type": "multipart/form-data; boundary=" + boundary, - "Content-Length": body.length - }); - const parsed = JSON.parse(response); - console.log("Uploaded GPX track", parsed); - return { id: parsed }; - } - - public addCommentToNote(id: number | string, text: string): Promise { - if (this._dryRun.data) { - console.warn("Dryrun enabled - not actually adding comment ", text, "to note ", id); - return new Promise((ok) => { - ok(); - }); - } - if ((text ?? "") === "") { - throw "Invalid text!"; - } - - return new Promise((ok, error) => { - this.auth.xhr( - { - method: "POST", - - path: `/api/0.6/notes/${id}/comment?text=${encodeURIComponent(text)}` - }, - function(err, _) { - if (err !== null) { - error(err); - } else { - ok(); - } + if ((text ?? "") === "") { + throw "Invalid text!" } - ); - }); - } - /** - * To be called by land.html - */ - public finishLogin(callback: (previousURL: string) => void) { - this.auth.authenticate(function() { - // Fully authed at this point - console.log("Authentication successful!"); - const previousLocation = LocalStorageSource.Get("location_before_login"); - callback(previousLocation.data); - }); - } + return new Promise((ok, error) => { + this.auth.xhr( + { + method: "POST", - private updateAuthObject() { - let pwaStandAloneMode = false; - try { - if (Utils.runningFromConsole) { - pwaStandAloneMode = true; - } else if ( - window.matchMedia("(display-mode: standalone)").matches || - window.matchMedia("(display-mode: fullscreen)").matches - ) { - pwaStandAloneMode = true; - } - } catch (e) { - console.warn( - "Detecting standalone mode failed", - e, - ". Assuming in browser and not worrying furhter" - ); + path: `/api/0.6/notes/${id}/comment?text=${encodeURIComponent(text)}`, + }, + function (err, _) { + if (err !== null) { + error(err) + } else { + ok() + } + } + ) + }) } - const standalone = this._iframeMode || pwaStandAloneMode || !this._singlePage; - // In standalone mode, we DON'T use single page login, as 'redirecting' opens a new window anyway... - // Same for an iframe... - - this.auth = new osmAuth({ - client_id: this._oauth_config.oauth_client_id, - url: this._oauth_config.url, - scope: "read_prefs write_prefs write_api write_gpx write_notes", - redirect_uri: Utils.runningFromConsole - ? "https://mapcomplete.org/land.html" - : window.location.protocol + "//" + window.location.host + "/land.html", - singlepage: !standalone, - auto: true - }); - } - - private CheckForMessagesContinuously() { - const self = this; - if (this.isChecking) { - return; + /** + * To be called by land.html + */ + public finishLogin(callback: (previousURL: string) => void) { + this.auth.authenticate(function () { + // Fully authed at this point + console.log("Authentication successful!") + const previousLocation = LocalStorageSource.Get("location_before_login") + callback(previousLocation.data) + }) } - this.isChecking = true; - Stores.Chronic(5 * 60 * 1000).addCallback((_) => { - if (self.isLoggedIn.data) { - console.log("Checking for messages"); - self.AttemptLogin(); - } - }); - } - private UpdateCapabilities(): void { - const self = this; - this.FetchCapabilities().then(({ api, gpx }) => { - self.apiIsOnline.setData(api); - self.gpxServiceIsOnline.setData(gpx); - }); - } + private updateAuthObject() { + let pwaStandAloneMode = false + try { + if (Utils.runningFromConsole) { + pwaStandAloneMode = true + } else if ( + window.matchMedia("(display-mode: standalone)").matches || + window.matchMedia("(display-mode: fullscreen)").matches + ) { + pwaStandAloneMode = true + } + } catch (e) { + console.warn( + "Detecting standalone mode failed", + e, + ". Assuming in browser and not worrying furhter" + ) + } + const standalone = this._iframeMode || pwaStandAloneMode || !this._singlePage - private async FetchCapabilities(): Promise<{ api: OsmServiceState; gpx: OsmServiceState }> { - if (Utils.runningFromConsole) { - return { api: "online", gpx: "online" }; + // In standalone mode, we DON'T use single page login, as 'redirecting' opens a new window anyway... + // Same for an iframe... + + this.auth = new osmAuth({ + client_id: this._oauth_config.oauth_client_id, + url: this._oauth_config.url, + scope: "read_prefs write_prefs write_api write_gpx write_notes", + redirect_uri: Utils.runningFromConsole + ? "https://mapcomplete.org/land.html" + : window.location.protocol + "//" + window.location.host + "/land.html", + singlepage: !standalone, + auto: true, + }) } - const result = await Utils.downloadAdvanced(this.Backend() + "/api/0.6/capabilities"); - if (result["content"] === undefined) { - console.log("Something went wrong:", result); - return { api: "unreachable", gpx: "unreachable" }; + + private CheckForMessagesContinuously() { + const self = this + if (this.isChecking) { + return + } + this.isChecking = true + Stores.Chronic(5 * 60 * 1000).addCallback((_) => { + if (self.isLoggedIn.data) { + console.log("Checking for messages") + self.AttemptLogin() + } + }) + } + + private UpdateCapabilities(): void { + const self = this + this.FetchCapabilities().then(({ api, gpx }) => { + self.apiIsOnline.setData(api) + self.gpxServiceIsOnline.setData(gpx) + }) + } + + private async FetchCapabilities(): Promise<{ api: OsmServiceState; gpx: OsmServiceState }> { + if (Utils.runningFromConsole) { + return { api: "online", gpx: "online" } + } + const result = await Utils.downloadAdvanced(this.Backend() + "/api/0.6/capabilities") + if (result["content"] === undefined) { + console.log("Something went wrong:", result) + return { api: "unreachable", gpx: "unreachable" } + } + const xmlRaw = result["content"] + const parsed = new DOMParser().parseFromString(xmlRaw, "text/xml") + const statusEl = parsed.getElementsByTagName("status")[0] + const api = statusEl.getAttribute("api") + const gpx = statusEl.getAttribute("gpx") + return { api, gpx } } - const xmlRaw = result["content"]; - const parsed = new DOMParser().parseFromString(xmlRaw, "text/xml"); - const statusEl = parsed.getElementsByTagName("status")[0]; - const api = statusEl.getAttribute("api"); - const gpx = statusEl.getAttribute("gpx"); - return { api, gpx }; - } } diff --git a/src/Logic/State/GeoLocationState.ts b/src/Logic/State/GeoLocationState.ts index fe395fde0..7c6c7b1e7 100644 --- a/src/Logic/State/GeoLocationState.ts +++ b/src/Logic/State/GeoLocationState.ts @@ -1,13 +1,13 @@ -import { UIEventSource } from "../UIEventSource"; -import { LocalStorageSource } from "../Web/LocalStorageSource"; -import { QueryParameters } from "../Web/QueryParameters"; +import { UIEventSource } from "../UIEventSource" +import { LocalStorageSource } from "../Web/LocalStorageSource" +import { QueryParameters } from "../Web/QueryParameters" export type GeolocationPermissionState = "prompt" | "requested" | "granted" | "denied" export interface GeoLocationPointProperties extends GeolocationCoordinates { - id: "gps"; - "user:location": "yes"; - date: string; + id: "gps" + "user:location": "yes" + date: string } /** @@ -23,22 +23,22 @@ export class GeoLocationState { */ public readonly permission: UIEventSource = new UIEventSource( "prompt" - ); + ) /** * Important to determine e.g. if we move automatically on fix or not */ - public readonly requestMoment: UIEventSource = new UIEventSource(undefined); + public readonly requestMoment: UIEventSource = new UIEventSource(undefined) /** * If true: the map will center (and re-center) to this location */ - public readonly allowMoving: UIEventSource = new UIEventSource(true); + public readonly allowMoving: UIEventSource = new UIEventSource(true) /** * The latest GeoLocationCoordinates, as given by the WebAPI */ public readonly currentGPSLocation: UIEventSource = - new UIEventSource(undefined); + new UIEventSource(undefined) /** * A small flag on localstorage. If the user previously granted the geolocation, it will be set. @@ -50,46 +50,46 @@ export class GeoLocationState { */ private readonly _previousLocationGrant: UIEventSource<"true" | "false"> = ( LocalStorageSource.Get("geolocation-permissions") - ); + ) /** * Used to detect a permission retraction */ - private readonly _grantedThisSession: UIEventSource = new UIEventSource(false); + private readonly _grantedThisSession: UIEventSource = new UIEventSource(false) constructor() { - const self = this; + const self = this this.permission.addCallbackAndRunD(async (state) => { if (state === "granted") { - self._previousLocationGrant.setData("true"); - self._grantedThisSession.setData(true); + self._previousLocationGrant.setData("true") + self._grantedThisSession.setData(true) } if (state === "prompt" && self._grantedThisSession.data) { // This is _really_ weird: we had a grant earlier, but it's 'prompt' now? // This means that the rights have been revoked again! - self._previousLocationGrant.setData("false"); - self.permission.setData("denied"); - self.currentGPSLocation.setData(undefined); - console.warn("Detected a downgrade in permissions!"); + self._previousLocationGrant.setData("false") + self.permission.setData("denied") + self.currentGPSLocation.setData(undefined) + console.warn("Detected a downgrade in permissions!") } if (state === "denied") { - self._previousLocationGrant.setData("false"); + self._previousLocationGrant.setData("false") } - }); - console.log("Previous location grant:", this._previousLocationGrant.data); + }) + console.log("Previous location grant:", this._previousLocationGrant.data) if (this._previousLocationGrant.data === "true") { // A previous visit successfully granted permission. Chance is high that we are allowed to use it again! // We set the flag to false again. If the user only wanted to share their location once, we are not gonna keep bothering them - this._previousLocationGrant.setData("false"); - console.log("Requesting access to GPS as this was previously granted"); + this._previousLocationGrant.setData("false") + console.log("Requesting access to GPS as this was previously granted") const latLonGivenViaUrl = - QueryParameters.wasInitialized("lat") || QueryParameters.wasInitialized("lon"); + QueryParameters.wasInitialized("lat") || QueryParameters.wasInitialized("lon") if (!latLonGivenViaUrl) { - this.requestMoment.setData(new Date()); + this.requestMoment.setData(new Date()) } - this.requestPermission(); + this.requestPermission() } } @@ -101,37 +101,36 @@ export class GeoLocationState { public requestPermission() { if (typeof navigator === "undefined") { // Not compatible with this browser - this.permission.setData("denied"); - return; + this.permission.setData("denied") + return } if (this.permission.data !== "prompt" && this.permission.data !== "requested") { // If the user denies the first prompt, revokes the deny and then tries again, we have to run the flow as well // Hence that we continue the flow if it is "requested" - return; + return } - this.permission.setData("requested"); + this.permission.setData("requested") try { navigator?.permissions ?.query({ name: "geolocation" }) .then((status) => { - const self = this; - if(status.state === "granted" || status.state === "denied"){ + const self = this + if (status.state === "granted" || status.state === "denied") { self.permission.setData(status.state) return } status.addEventListener("change", (e) => { - self.permission.setData(status.state); - - }); + self.permission.setData(status.state) + }) // The code above might have reset it to 'prompt', but we _did_ request permission! this.permission.setData("requested") // We _must_ call 'startWatching', as that is the actual trigger for the popup... - self.startWatching(); + self.startWatching() }) - .catch((e) => console.error("Could not get geopermission", e)); + .catch((e) => console.error("Could not get geopermission", e)) } catch (e) { - console.error("Could not get permission:", e); + console.error("Could not get permission:", e) } } @@ -140,18 +139,18 @@ export class GeoLocationState { * @private */ private async startWatching() { - const self = this; + const self = this navigator.geolocation.watchPosition( - function(position) { - self.currentGPSLocation.setData(position.coords); - self._previousLocationGrant.setData("true"); + function (position) { + self.currentGPSLocation.setData(position.coords) + self._previousLocationGrant.setData("true") }, - function() { - console.warn("Could not get location with navigator.geolocation"); + function () { + console.warn("Could not get location with navigator.geolocation") }, { - enableHighAccuracy: true + enableHighAccuracy: true, } - ); + ) } } diff --git a/src/Logic/State/UserRelatedState.ts b/src/Logic/State/UserRelatedState.ts index 867ef45d5..21648e0b7 100644 --- a/src/Logic/State/UserRelatedState.ts +++ b/src/Logic/State/UserRelatedState.ts @@ -1,23 +1,23 @@ -import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; -import { OsmConnection } from "../Osm/OsmConnection"; -import { MangroveIdentity } from "../Web/MangroveReviews"; -import { Store, Stores, UIEventSource } from "../UIEventSource"; -import StaticFeatureSource from "../FeatureSource/Sources/StaticFeatureSource"; -import { FeatureSource } from "../FeatureSource/FeatureSource"; -import { Feature } from "geojson"; -import { Utils } from "../../Utils"; -import translators from "../../assets/translators.json"; -import codeContributors from "../../assets/contributors.json"; -import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; -import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson"; -import usersettings from "../../../src/assets/generated/layers/usersettings.json"; -import Locale from "../../UI/i18n/Locale"; -import LinkToWeblate from "../../UI/Base/LinkToWeblate"; -import FeatureSwitchState from "./FeatureSwitchState"; -import Constants from "../../Models/Constants"; -import { QueryParameters } from "../Web/QueryParameters"; -import { ThemeMetaTagging } from "./UserSettingsMetaTagging"; -import { MapProperties } from "../../Models/MapProperties"; +import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig" +import { OsmConnection } from "../Osm/OsmConnection" +import { MangroveIdentity } from "../Web/MangroveReviews" +import { Store, Stores, UIEventSource } from "../UIEventSource" +import StaticFeatureSource from "../FeatureSource/Sources/StaticFeatureSource" +import { FeatureSource } from "../FeatureSource/FeatureSource" +import { Feature } from "geojson" +import { Utils } from "../../Utils" +import translators from "../../assets/translators.json" +import codeContributors from "../../assets/contributors.json" +import LayerConfig from "../../Models/ThemeConfig/LayerConfig" +import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson" +import usersettings from "../../../src/assets/generated/layers/usersettings.json" +import Locale from "../../UI/i18n/Locale" +import LinkToWeblate from "../../UI/Base/LinkToWeblate" +import FeatureSwitchState from "./FeatureSwitchState" +import Constants from "../../Models/Constants" +import { QueryParameters } from "../Web/QueryParameters" +import { ThemeMetaTagging } from "./UserSettingsMetaTagging" +import { MapProperties } from "../../Models/MapProperties" /** * The part of the state which keeps track of user-related stuff, e.g. the OSM-connection, @@ -42,8 +42,10 @@ export default class UserRelatedState { public readonly fixateNorth: UIEventSource public readonly homeLocation: FeatureSource public readonly language: UIEventSource - public readonly preferredBackgroundLayer: UIEventSource - public readonly imageLicense : UIEventSource + public readonly preferredBackgroundLayer: UIEventSource< + string | "photo" | "map" | "osmbasedmap" | undefined + > + public readonly imageLicense: UIEventSource /** * The number of seconds that the GPS-locations are stored in memory. * Time in seconds @@ -61,7 +63,7 @@ export default class UserRelatedState { * Note: these are linked via OsmConnection.preferences which exports all preferences as UIEventSource */ public readonly preferencesAsTags: UIEventSource> - private readonly _mapProperties: MapProperties; + private readonly _mapProperties: MapProperties constructor( osmConnection: OsmConnection, @@ -71,7 +73,7 @@ export default class UserRelatedState { mapProperties?: MapProperties ) { this.osmConnection = osmConnection - this._mapProperties = mapProperties; + this._mapProperties = mapProperties { const translationMode: UIEventSource = this.osmConnection.GetPreference("translation-mode", "false") @@ -104,12 +106,17 @@ export default class UserRelatedState { this.mangroveIdentity = new MangroveIdentity( this.osmConnection.GetLongPreference("identity", "mangrove") ) - this.preferredBackgroundLayer= this.osmConnection.GetPreference("preferred-background-layer", undefined, { - documentation: "The ID of a layer or layer category that MapComplete uses by default" - }) + this.preferredBackgroundLayer = this.osmConnection.GetPreference( + "preferred-background-layer", + undefined, + { + documentation: + "The ID of a layer or layer category that MapComplete uses by default", + } + ) - this.imageLicense = this.osmConnection.GetPreference("pictures-license", "CC0", { - documentation: "The license under which new images are uploaded" + this.imageLicense = this.osmConnection.GetPreference("pictures-license", "CC0", { + documentation: "The license under which new images are uploaded", }) this.installedUserThemes = this.InitInstalledUserThemes() @@ -277,7 +284,6 @@ export default class UserRelatedState { amendedPrefs.data["__url_parameter_initialized:" + key] = "yes" } - const osmConnection = this.osmConnection osmConnection.preferencesHandler.preferences.addCallback((newPrefs) => { for (const k in newPrefs) { @@ -405,13 +411,11 @@ export default class UserRelatedState { } } - - this._mapProperties?.rasterLayer?.addCallbackAndRun(l => { + this._mapProperties?.rasterLayer?.addCallbackAndRun((l) => { amendedPrefs.data["__current_background"] = l?.properties?.id amendedPrefs.ping() }) - return amendedPrefs } } diff --git a/src/Logic/State/UserSettingsMetaTagging.ts b/src/Logic/State/UserSettingsMetaTagging.ts index 33a5ae85b..6e568c5c3 100644 --- a/src/Logic/State/UserSettingsMetaTagging.ts +++ b/src/Logic/State/UserSettingsMetaTagging.ts @@ -1,14 +1,42 @@ import { Utils } from "../../Utils" /** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */ export class ThemeMetaTagging { - public static readonly themeName = "usersettings" + public static readonly themeName = "usersettings" - public metaTaggging_for_usersettings(feat: {properties: Record}) { - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_md', () => feat.properties._description.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)?.at(1) ) - Utils.AddLazyProperty(feat.properties, '_d', () => feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? '' ) - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ) - Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) ) - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a ) - feat.properties['__current_backgroun'] = 'initial_value' - } -} \ No newline at end of file + public metaTaggging_for_usersettings(feat: { properties: Record }) { + Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_md", () => + feat.properties._description + .match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/) + ?.at(1) + ) + Utils.AddLazyProperty( + feat.properties, + "_d", + () => feat.properties._description?.replace(/</g, "<")?.replace(/>/g, ">") ?? "" + ) + Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_a", () => + ((feat) => { + const e = document.createElement("div") + e.innerHTML = feat.properties._d + return Array.from(e.getElementsByTagName("a")).filter( + (a) => a.href.match(/mastodon|en.osm.town/) !== null + )[0]?.href + })(feat) + ) + Utils.AddLazyProperty(feat.properties, "_mastodon_link", () => + ((feat) => { + const e = document.createElement("div") + e.innerHTML = feat.properties._d + return Array.from(e.getElementsByTagName("a")).filter( + (a) => a.getAttribute("rel")?.indexOf("me") >= 0 + )[0]?.href + })(feat) + ) + Utils.AddLazyProperty( + feat.properties, + "_mastodon_candidate", + () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a + ) + feat.properties["__current_backgroun"] = "initial_value" + } +} diff --git a/src/Logic/Web/MangroveReviews.ts b/src/Logic/Web/MangroveReviews.ts index 15819a735..19e2228d4 100644 --- a/src/Logic/Web/MangroveReviews.ts +++ b/src/Logic/Web/MangroveReviews.ts @@ -1,35 +1,34 @@ -import { ImmutableStore, Store, UIEventSource } from "../UIEventSource"; -import { MangroveReviews, Review } from "mangrove-reviews-typescript"; -import { Utils } from "../../Utils"; -import { Feature, Position } from "geojson"; -import { GeoOperations } from "../GeoOperations"; +import { ImmutableStore, Store, UIEventSource } from "../UIEventSource" +import { MangroveReviews, Review } from "mangrove-reviews-typescript" +import { Utils } from "../../Utils" +import { Feature, Position } from "geojson" +import { GeoOperations } from "../GeoOperations" export class MangroveIdentity { - public readonly keypair: Store; - public readonly key_id: Store; + public readonly keypair: Store + public readonly key_id: Store constructor(mangroveIdentity: UIEventSource) { - const key_id = new UIEventSource(undefined); - this.key_id = key_id; - const keypairEventSource = new UIEventSource(undefined); - this.keypair = keypairEventSource; + const key_id = new UIEventSource(undefined) + this.key_id = key_id + const keypairEventSource = new UIEventSource(undefined) + this.keypair = keypairEventSource mangroveIdentity.addCallbackAndRunD(async (data) => { if (data === "") { - return; + return } - const keypair = await MangroveReviews.jwkToKeypair(JSON.parse(data)); - keypairEventSource.setData(keypair); - const pem = await MangroveReviews.publicToPem(keypair.publicKey); - key_id.setData(pem); - }); + const keypair = await MangroveReviews.jwkToKeypair(JSON.parse(data)) + keypairEventSource.setData(keypair) + const pem = await MangroveReviews.publicToPem(keypair.publicKey) + key_id.setData(pem) + }) try { if (!Utils.runningFromConsole && (mangroveIdentity.data ?? "") === "") { - MangroveIdentity.CreateIdentity(mangroveIdentity).then((_) => { - }); + MangroveIdentity.CreateIdentity(mangroveIdentity).then((_) => {}) } } catch (e) { - console.error("Could not create identity: ", e); + console.error("Could not create identity: ", e) } } @@ -39,13 +38,13 @@ export class MangroveIdentity { * @constructor */ private static async CreateIdentity(identity: UIEventSource): Promise { - const keypair = await MangroveReviews.generateKeypair(); - const jwk = await MangroveReviews.keypairToJwk(keypair); + const keypair = await MangroveReviews.generateKeypair() + const jwk = await MangroveReviews.keypairToJwk(keypair) if ((identity.data ?? "") !== "") { // Identity has been loaded via osmPreferences by now - we don't overwrite - return; + return } - identity.setData(JSON.stringify(jwk)); + identity.setData(JSON.stringify(jwk)) } } @@ -53,18 +52,18 @@ export class MangroveIdentity { * Tracks all reviews of a given feature, allows to create a new review */ export default class FeatureReviews { - private static readonly _featureReviewsCache: Record = {}; - public readonly subjectUri: Store; - public readonly average: Store; + private static readonly _featureReviewsCache: Record = {} + public readonly subjectUri: Store + public readonly average: Store private readonly _reviews: UIEventSource<(Review & { madeByLoggedInUser: Store })[]> = - new UIEventSource([]); + new UIEventSource([]) public readonly reviews: Store<(Review & { madeByLoggedInUser: Store })[]> = - this._reviews; - private readonly _lat: number; - private readonly _lon: number; - private readonly _uncertainty: number; - private readonly _name: Store; - private readonly _identity: MangroveIdentity; + this._reviews + private readonly _lat: number + private readonly _lon: number + private readonly _uncertainty: number + private readonly _name: Store + private readonly _identity: MangroveIdentity private constructor( feature: Feature, @@ -77,72 +76,72 @@ export default class FeatureReviews { } ) { const centerLonLat = GeoOperations.centerpointCoordinates(feature) - ;[this._lon, this._lat] = centerLonLat; + ;[this._lon, this._lat] = centerLonLat this._identity = - mangroveIdentity ?? new MangroveIdentity(new UIEventSource(undefined)); - const nameKey = options?.nameKey ?? "name"; + mangroveIdentity ?? new MangroveIdentity(new UIEventSource(undefined)) + const nameKey = options?.nameKey ?? "name" if (feature.geometry.type === "Point") { - this._uncertainty = options?.uncertaintyRadius ?? 10; + this._uncertainty = options?.uncertaintyRadius ?? 10 } else { - let coordss: Position[][]; + let coordss: Position[][] if (feature.geometry.type === "LineString") { - coordss = [feature.geometry.coordinates]; + coordss = [feature.geometry.coordinates] } else if ( feature.geometry.type === "MultiLineString" || feature.geometry.type === "Polygon" ) { - coordss = feature.geometry.coordinates; + coordss = feature.geometry.coordinates } - let maxDistance = 0; + let maxDistance = 0 for (const coords of coordss) { for (const coord of coords) { maxDistance = Math.max( maxDistance, GeoOperations.distanceBetween(centerLonLat, coord) - ); + ) } } - this._uncertainty = options?.uncertaintyRadius ?? maxDistance; + this._uncertainty = options?.uncertaintyRadius ?? maxDistance } - this._name = tagsSource.map((tags) => tags[nameKey] ?? options?.fallbackName); + this._name = tagsSource.map((tags) => tags[nameKey] ?? options?.fallbackName) - this.subjectUri = this.ConstructSubjectUri(); + this.subjectUri = this.ConstructSubjectUri() - const self = this; + const self = this this.subjectUri.addCallbackAndRunD(async (sub) => { - const reviews = await MangroveReviews.getReviews({ sub }); - self.addReviews(reviews.reviews); - }); + const reviews = await MangroveReviews.getReviews({ sub }) + self.addReviews(reviews.reviews) + }) /* We also construct all subject queries _without_ encoding the name to work around a previous bug * See https://github.com/giggls/opencampsitemap/issues/30 */ this.ConstructSubjectUri(true).addCallbackAndRunD(async (sub) => { try { - const reviews = await MangroveReviews.getReviews({ sub }); - self.addReviews(reviews.reviews); + const reviews = await MangroveReviews.getReviews({ sub }) + self.addReviews(reviews.reviews) } catch (e) { - console.log("Could not fetch reviews for partially incorrect query ", sub); + console.log("Could not fetch reviews for partially incorrect query ", sub) } - }); - this.average = this._reviews.map(reviews => { + }) + this.average = this._reviews.map((reviews) => { if (!reviews) { - return null; - } - if(reviews.length === 0){ return null } - let sum = 0; - let count = 0; + if (reviews.length === 0) { + return null + } + let sum = 0 + let count = 0 for (const review of reviews) { if (review.rating !== undefined) { - count++; - sum += review.rating; + count++ + sum += review.rating } } return Math.round(sum / count) - }); + }) } /** @@ -158,14 +157,14 @@ export default class FeatureReviews { uncertaintyRadius?: number } ) { - const key = feature.properties.id; - const cached = FeatureReviews._featureReviewsCache[key]; + const key = feature.properties.id + const cached = FeatureReviews._featureReviewsCache[key] if (cached !== undefined) { - return cached; + return cached } - const featureReviews = new FeatureReviews(feature, tagsSource, mangroveIdentity, options); - FeatureReviews._featureReviewsCache[key] = featureReviews; - return featureReviews; + const featureReviews = new FeatureReviews(feature, tagsSource, mangroveIdentity, options) + FeatureReviews._featureReviewsCache[key] = featureReviews + return featureReviews } /** @@ -174,15 +173,15 @@ export default class FeatureReviews { public async createReview(review: Omit): Promise { const r: Review = { sub: this.subjectUri.data, - ...review - }; - const keypair: CryptoKeyPair = this._identity.keypair.data; - console.log(r); - const jwt = await MangroveReviews.signReview(keypair, r); - console.log("Signed:", jwt); - await MangroveReviews.submitReview(jwt); - this._reviews.data.push({ ...r, madeByLoggedInUser: new ImmutableStore(true) }); - this._reviews.ping(); + ...review, + } + const keypair: CryptoKeyPair = this._identity.keypair.data + console.log(r) + const jwt = await MangroveReviews.signReview(keypair, r) + console.log("Signed:", jwt) + await MangroveReviews.submitReview(jwt) + this._reviews.data.push({ ...r, madeByLoggedInUser: new ImmutableStore(true) }) + this._reviews.ping() } /** @@ -191,48 +190,48 @@ export default class FeatureReviews { * @private */ private addReviews(reviews: { payload: Review; kid: string }[]) { - const self = this; - const alreadyKnown = new Set(self._reviews.data.map((r) => r.rating + " " + r.opinion)); + const self = this + const alreadyKnown = new Set(self._reviews.data.map((r) => r.rating + " " + r.opinion)) - let hasNew = false; + let hasNew = false for (const reviewData of reviews) { - const review = reviewData.payload; + const review = reviewData.payload try { - const url = new URL(review.sub); - console.log("URL is", url); + const url = new URL(review.sub) + console.log("URL is", url) if (url.protocol === "geo:") { const coordinate = <[number, number]>( url.pathname.split(",").map((n) => Number(n)) - ); + ) const distance = GeoOperations.distanceBetween( [this._lat, this._lon], coordinate - ); + ) if (distance > this._uncertainty) { - continue; + continue } } } catch (e) { - console.warn(e); + console.warn(e) } - const key = review.rating + " " + review.opinion; + const key = review.rating + " " + review.opinion if (alreadyKnown.has(key)) { - continue; + continue } self._reviews.data.push({ ...review, madeByLoggedInUser: this._identity.key_id.map((user_key_id) => { - return reviewData.kid === user_key_id; - }) - }); - hasNew = true; + return reviewData.kid === user_key_id + }), + }) + hasNew = true } if (hasNew) { self._reviews.data.sort((a, b) => b.iat - a.iat) // Sort with most recent first - self._reviews.ping(); + self._reviews.ping() } } @@ -245,13 +244,13 @@ export default class FeatureReviews { private ConstructSubjectUri(dontEncodeName: boolean = false): Store { // https://www.rfc-editor.org/rfc/rfc5870#section-3.4.2 // `u` stands for `uncertainty`, https://www.rfc-editor.org/rfc/rfc5870#section-3.4.3 - const self = this; - return this._name.map(function(name) { - let uri = `geo:${self._lat},${self._lon}?u=${self._uncertainty}`; + const self = this + return this._name.map(function (name) { + let uri = `geo:${self._lat},${self._lon}?u=${self._uncertainty}` if (name) { - uri += "&q=" + (dontEncodeName ? name : encodeURIComponent(name)); + uri += "&q=" + (dontEncodeName ? name : encodeURIComponent(name)) } - return uri; - }); + return uri + }) } } diff --git a/src/Models/RasterLayers.ts b/src/Models/RasterLayers.ts index dbd34894b..700a0cb30 100644 --- a/src/Models/RasterLayers.ts +++ b/src/Models/RasterLayers.ts @@ -1,41 +1,41 @@ -import { Feature, Polygon } from "geojson"; -import * as editorlayerindex from "../assets/editor-layer-index.json"; -import * as globallayers from "../assets/global-raster-layers.json"; -import { BBox } from "../Logic/BBox"; -import { Store, Stores } from "../Logic/UIEventSource"; -import { GeoOperations } from "../Logic/GeoOperations"; -import { RasterLayerProperties } from "./RasterLayerProperties"; +import { Feature, Polygon } from "geojson" +import * as editorlayerindex from "../assets/editor-layer-index.json" +import * as globallayers from "../assets/global-raster-layers.json" +import { BBox } from "../Logic/BBox" +import { Store, Stores } from "../Logic/UIEventSource" +import { GeoOperations } from "../Logic/GeoOperations" +import { RasterLayerProperties } from "./RasterLayerProperties" export class AvailableRasterLayers { public static EditorLayerIndex: (Feature & - RasterLayerPolygon)[] = editorlayerindex.features; + RasterLayerPolygon)[] = editorlayerindex.features public static globalLayers: RasterLayerPolygon[] = globallayers.layers.map( (properties) => { type: "Feature", properties, - geometry: BBox.global.asGeometry() + geometry: BBox.global.asGeometry(), } - ); + ) public static readonly osmCartoProperties: RasterLayerProperties = { id: "osm", name: "OpenStreetMap", url: "https://tile.openstreetmap.org/{z}/{x}/{y}.png", attribution: { text: "OpenStreetMap", - url: "https://openStreetMap.org/copyright" + url: "https://openStreetMap.org/copyright", }, best: true, max_zoom: 19, min_zoom: 0, - category: "osmbasedmap" - }; + category: "osmbasedmap", + } public static readonly osmCarto: RasterLayerPolygon = { type: "Feature", properties: AvailableRasterLayers.osmCartoProperties, - geometry: BBox.global.asGeometry() - }; + geometry: BBox.global.asGeometry(), + } public static readonly maptilerDefaultLayer: RasterLayerPolygon = { type: "Feature", @@ -47,11 +47,11 @@ export class AvailableRasterLayers { type: "vector", attribution: { text: "Maptiler", - url: "https://www.maptiler.com/copyright/" - } + url: "https://www.maptiler.com/copyright/", + }, }, - geometry: BBox.global.asGeometry() - }; + geometry: BBox.global.asGeometry(), + } public static readonly maptilerCarto: RasterLayerPolygon = { type: "Feature", @@ -63,11 +63,11 @@ export class AvailableRasterLayers { type: "vector", attribution: { text: "Maptiler", - url: "https://www.maptiler.com/copyright/" - } + url: "https://www.maptiler.com/copyright/", + }, }, - geometry: BBox.global.asGeometry() - }; + geometry: BBox.global.asGeometry(), + } public static readonly maptilerBackdrop: RasterLayerPolygon = { type: "Feature", @@ -79,11 +79,11 @@ export class AvailableRasterLayers { type: "vector", attribution: { text: "Maptiler", - url: "https://www.maptiler.com/copyright/" - } + url: "https://www.maptiler.com/copyright/", + }, }, - geometry: BBox.global.asGeometry() - }; + geometry: BBox.global.asGeometry(), + } public static readonly americana: RasterLayerPolygon = { type: "Feature", properties: { @@ -94,43 +94,45 @@ export class AvailableRasterLayers { type: "vector", attribution: { text: "Americana", - url: "https://github.com/ZeLonewolf/openstreetmap-americana/" - } + url: "https://github.com/ZeLonewolf/openstreetmap-americana/", + }, }, - geometry: BBox.global.asGeometry() - }; + geometry: BBox.global.asGeometry(), + } public static layersAvailableAt( location: Store<{ lon: number; lat: number }> ): Store { const availableLayersBboxes = Stores.ListStabilized( location.mapD((loc) => { - const lonlat: [number, number] = [loc.lon, loc.lat]; + const lonlat: [number, number] = [loc.lon, loc.lat] return AvailableRasterLayers.EditorLayerIndex.filter((eliPolygon) => BBox.get(eliPolygon).contains(lonlat) - ); + ) }) - ); + ) const available = Stores.ListStabilized( availableLayersBboxes.map((eliPolygons) => { - const loc = location.data; - const lonlat: [number, number] = [loc.lon, loc.lat]; + const loc = location.data + const lonlat: [number, number] = [loc.lon, loc.lat] const matching: RasterLayerPolygon[] = eliPolygons.filter((eliPolygon) => { if (eliPolygon.geometry === null) { - return true; // global ELI-layer + return true // global ELI-layer } - return GeoOperations.inside(lonlat, eliPolygon); - }); - matching.push(...AvailableRasterLayers.globalLayers); - matching.unshift(AvailableRasterLayers.maptilerDefaultLayer, + return GeoOperations.inside(lonlat, eliPolygon) + }) + matching.push(...AvailableRasterLayers.globalLayers) + matching.unshift( + AvailableRasterLayers.maptilerDefaultLayer, AvailableRasterLayers.osmCarto, AvailableRasterLayers.maptilerCarto, AvailableRasterLayers.maptilerBackdrop, - AvailableRasterLayers.americana); - return matching; + AvailableRasterLayers.americana + ) + return matching }) - ); - return available; + ) + return available } } @@ -148,22 +150,22 @@ export class RasterLayerUtils { preferredCategory: string, ignoreLayer?: RasterLayerPolygon ): RasterLayerPolygon { - let secondBest: RasterLayerPolygon = undefined; + let secondBest: RasterLayerPolygon = undefined for (const rasterLayer of available) { if (rasterLayer === ignoreLayer) { - continue; + continue } - const p = rasterLayer.properties; + const p = rasterLayer.properties if (p.category === preferredCategory) { if (p.best) { - return rasterLayer; + return rasterLayer } if (!secondBest) { - secondBest = rasterLayer; + secondBest = rasterLayer } } } - return secondBest; + return secondBest } } @@ -179,11 +181,11 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties { /** * The name of the imagery source */ - readonly name: string; + readonly name: string /** * Whether the imagery name should be translated */ - readonly i18n?: boolean; + readonly i18n?: boolean readonly type: | "tms" | "wms" @@ -191,7 +193,7 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties { | "scanex" | "wms_endpoint" | "wmts" - | "vector"; /* Vector is not actually part of the ELI-spec, we add it for vector layers */ + | "vector" /* Vector is not actually part of the ELI-spec, we add it for vector layers */ /** * A rough categorisation of different types of layers. See https://github.com/osmlab/editor-layer-index/blob/gh-pages/CONTRIBUTING.md#categories for a description of the individual categories. */ @@ -203,53 +205,53 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties { | "historicphoto" | "qa" | "elevation" - | "other"; + | "other" /** * A URL template for imagery tiles */ - readonly url: string; - readonly min_zoom?: number; - readonly max_zoom?: number; + readonly url: string + readonly min_zoom?: number + readonly max_zoom?: number /** * explicit/implicit permission by the owner for use in OSM */ - readonly permission_osm?: "explicit" | "implicit" | "no"; + readonly permission_osm?: "explicit" | "implicit" | "no" /** * A URL for the license or permissions for the imagery */ - readonly license_url?: string; + readonly license_url?: string /** * A URL for the privacy policy of the operator or false if there is no existing privacy policy for tis imagery. */ - readonly privacy_policy_url?: string | boolean; + readonly privacy_policy_url?: string | boolean /** * A unique identifier for the source; used in imagery_used changeset tag */ - readonly id: string; + readonly id: string /** * A short English-language description of the source */ - readonly description?: string; + readonly description?: string /** * The ISO 3166-1 alpha-2 two letter country code in upper case. Use ZZ for unknown or multiple. */ - readonly country_code?: string; + readonly country_code?: string /** * Whether this imagery should be shown in the default world-wide menu */ - readonly default?: boolean; + readonly default?: boolean /** * Whether this imagery is the best source for the region */ - readonly best?: boolean; + readonly best?: boolean /** * The age of the oldest imagery or data in the source, as an RFC3339 date or leading portion of one */ - readonly start_date?: string; + readonly start_date?: string /** * The age of the newest imagery or data in the source, as an RFC3339 date or leading portion of one */ - readonly end_date?: string; + readonly end_date?: string /** * HTTP header to check for information if the tile is invalid */ @@ -259,61 +261,61 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties { * via the `patternProperty` "^.*$". */ [k: string]: string[] | null - }; + } /** * 'true' if tiles are transparent and can be overlaid on another source */ - readonly overlay?: boolean & string; - readonly available_projections?: string[]; + readonly overlay?: boolean & string + readonly available_projections?: string[] readonly attribution?: { readonly url?: string readonly text?: string readonly html?: string readonly required?: boolean - }; + } /** * A URL for an image, that can be displayed in the list of imagery layers next to the name */ - readonly icon?: string; + readonly icon?: string /** * A link to an EULA text that has to be accepted by the user, before the imagery source is added. Can contain {lang} to be replaced by a current user language wiki code (like FR:) or an empty string for the default English text. */ - readonly eula?: string; + readonly eula?: string /** * A URL for an image, that is displayed in the mapview for attribution */ - readonly "logo-image"?: string; + readonly "logo-image"?: string /** * Customized text for the terms of use link (default is "Background Terms of Use") */ - readonly "terms-of-use-text"?: string; + readonly "terms-of-use-text"?: string /** * Specify a checksum for tiles, which aren't real tiles. `type` is the digest type and can be MD5, SHA-1, SHA-256, SHA-384 and SHA-512, value is the hex encoded checksum in lower case. To create a checksum save the tile as file and upload it to e.g. https://defuse.ca/checksums.htm. */ - readonly "no-tile-checksum"?: string; + readonly "no-tile-checksum"?: string /** * header-name attribute specifies a header returned by tile server, that will be shown as `metadata-key` attribute in Show Tile Info dialog */ - readonly "metadata-header"?: string; + readonly "metadata-header"?: string /** * Set to `true` if imagery source is properly aligned and does not need imagery offset adjustments. This is used for OSM based sources too. */ - readonly "valid-georeference"?: boolean; + readonly "valid-georeference"?: boolean /** * Size of individual tiles delivered by a TMS service */ - readonly "tile-size"?: number; + readonly "tile-size"?: number /** * Whether tiles status can be accessed by appending /status to the tile URL and can be submitted for re-rendering by appending /dirty. */ - readonly "mod-tile-features"?: string; + readonly "mod-tile-features"?: string /** * HTTP headers to be sent to server. It has two attributes header-name and header-value. May be specified multiple times. */ readonly "custom-http-headers"?: { readonly "header-name"?: string readonly "header-value"?: string - }; + } /** * Default layer to open (when using WMS_ENDPOINT type). Contains list of layer tag with two attributes - name and style, e.g. `"default-layers": ["layer": { name="Basisdata_NP_Basiskart_JanMayen_WMTS_25829" "style":"default" } ]` (not allowed in `mirror` attribute) */ @@ -324,17 +326,17 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties { [k: string]: unknown } [k: string]: unknown - }[]; + }[] /** * format to use when connecting tile server (when using WMS_ENDPOINT type) */ - readonly format?: string; + readonly format?: string /** * If `true` transparent tiles will be requested from WMS server */ - readonly transparent?: boolean & string; + readonly transparent?: boolean & string /** * minimum expiry time for tiles in seconds. The larger the value, the longer entry in cache will be considered valid */ - readonly "minimum-tile-expire"?: number; + readonly "minimum-tile-expire"?: number } diff --git a/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts b/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts index 7e33de4bb..50a90dc83 100644 --- a/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts +++ b/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts @@ -4,7 +4,7 @@ import LineRenderingConfigJson from "../Json/LineRenderingConfigJson" import { LayerConfigJson } from "../Json/LayerConfigJson" import { DesugaringStep, Each, Fuse, On } from "./Conversion" import PointRenderingConfigJson from "../Json/PointRenderingConfigJson" -import { del } from "idb-keyval"; +import { del } from "idb-keyval" export class UpdateLegacyLayer extends DesugaringStep< LayerConfigJson | string | { builtin; override } @@ -197,7 +197,7 @@ class UpdateLegacyTheme extends DesugaringStep { delete oldThemeConfig.socialImage } - if(oldThemeConfig.defaultBackgroundId === "osm"){ + if (oldThemeConfig.defaultBackgroundId === "osm") { console.log("Removing old background in", json.id) } diff --git a/src/UI/Base/Checkbox.svelte b/src/UI/Base/Checkbox.svelte index 92de427ac..2ff713e2e 100644 --- a/src/UI/Base/Checkbox.svelte +++ b/src/UI/Base/Checkbox.svelte @@ -1,13 +1,14 @@ +