Merge branch 'master' into develop

This commit is contained in:
Pieter Vander Vennet 2023-09-21 02:32:15 +02:00
commit 8d1ae657fc
28 changed files with 693 additions and 196 deletions

View file

@ -2763,7 +2763,8 @@
"en": "<b>Type 2</b> (mennekes) outputs at most 16 A",
"nl": "<b>Type 2</b> (mennekes) levert een stroom van maximaal 16 A",
"da": "<b>Type 2</b> (mennekes) udgange højst 16 A",
"de": "<b>Typ 2</b> (Mennekes) liefert maximal 16 A"
"de": "<b>Typ 2</b> (Mennekes) liefert maximal 16 A",
"ca": "<b>Tipus 2</b> (menneks) surt com a màxim a 16 A"
},
"icon": {
"path": "./assets/layers/charging_station/Type2_socket.svg",
@ -2776,7 +2777,8 @@
"en": "<b>Type 2</b> (mennekes) outputs at most 32 A",
"nl": "<b>Type 2</b> (mennekes) levert een stroom van maximaal 32 A",
"da": "<b>Type 2</b> (mennekes) udgange højst 32 A",
"de": "<b>Typ 2</b> (Mennekes) liefert maximal 32 A"
"de": "<b>Typ 2</b> (Mennekes) liefert maximal 32 A",
"ca": "<b>Tipus 2</b> (menneks) surt com a màxim a 32 A"
},
"icon": {
"path": "./assets/layers/charging_station/Type2_socket.svg",
@ -3528,7 +3530,8 @@
"en": "What current do the plugs with <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b> (A Type 2 with cable branded as Tesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> offer?",
"nl": "Welke stroom levert de stekker van type <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b> (Een Type 2 met kabel en Tesla-logo)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div>?",
"da": "Hvilken strømstyrke har stikkene med <div style='display: inline-block'><b><b> Tesla Supercharger (Destination)</b> (A Type 2 med kabel med Tesla-mærket)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> ?",
"de": "Welche Stromstärke liefern die Stecker mit <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b> (Typ 2 mit Kabel von Tesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div>?"
"de": "Welche Stromstärke liefern die Stecker mit <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b> (Typ 2 mit Kabel von Tesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div>?",
"ca": "Quin corrent donen els endolls amb <div style='display: inline-block'><b><b>Tesla Supercharger (destinació)</b> (un tipus 2 amb cable amb la marca Tesla)</b> <img style ='amplada: 1rem; mostrar: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> oferta?"
},
"render": {
"en": "<div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b> (A Type 2 with cable branded as Tesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> outputs at most {socket:tesla_destination:current}A",
@ -3546,7 +3549,8 @@
"en": "<b>Tesla Supercharger (Destination)</b> (A Type 2 with cable branded as tesla) outputs at most 16 A",
"nl": "<b>Tesla supercharger (Destination</b> (Een Type 2 met kabel en Tesla-logo) levert een stroom van maximaal 16 A",
"da": "<b>Tesla Supercharger (Destination)</b> (A Type 2 med kabel mærket som tesla) yder højst 16 A",
"de": "<b>Tesla Supercharger (Destination)</b> (Typ 2 mit Kabel) liefert maximal 16 A"
"de": "<b>Tesla Supercharger (Destination)</b> (Typ 2 mit Kabel) liefert maximal 16 A",
"ca": "<b>Supercarregador Tesla (destinació)</b> (Un Tipus 2 amb un cable de marca Tesla) surt com a màxim a 16 A"
},
"icon": {
"path": "./assets/layers/charging_station/Type2_tethered.svg",
@ -3559,7 +3563,8 @@
"en": "<b>Tesla Supercharger (Destination)</b> (A Type 2 with cable branded as Tesla) outputs at most 32 A",
"nl": "<b>Tesla Supercharger (Destination</b> (Een Type 2 met kabel en Tesla-logo) levert een stroom van maximaal 32 A",
"da": "<b>Tesla Supercharger (Destination)</b> (A Type 2 med kabel af Tesla-mærket) yder højst 32 A",
"de": "<b>Tesla Supercharger (Destination)</b> (Typ 2 mit Kabel von Tesla) liefert maximal 32 A"
"de": "<b>Tesla Supercharger (Destination)</b> (Typ 2 mit Kabel von Tesla) liefert maximal 32 A",
"ca": "<b>Supercarregador Tesla (destinació)</b> (Un Tipus 2 amb un cable de marca Tesla) surt com a màxim a 32 A"
},
"icon": {
"path": "./assets/layers/charging_station/Type2_tethered.svg",
@ -4949,7 +4954,7 @@
"question": {
"en": "Has a <div style='display: inline-block'><b><b>Type 2 CCS</b> (mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> connector",
"nl": "Heeft een <div style='display: inline-block'><b><b>Type 2 CCS</b> (mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>",
"ca": "Té un connector <div style='display: inline-block'><b><b> Tipus 2 CCS</b> (mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>",
"ca": "Té un connector <div style='display: inline-block'><b><b> CCS Tipus 2</b> (mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>",
"da": "Har en <div style='display: inline-block'><b><b> Type 2 CCS</b> (mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> connector",
"de": "Hat einen <div style='display: inline-block'><b><b>Typ 2 CCS</b> (Mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> Anschluss",
"es": "Tiene un conector <div style='display: inline-block'><b>Tipo 2 CCS</b> (mennekes)</b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>"
@ -4971,7 +4976,7 @@
"question": {
"en": "Has a <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (a branded type2_css)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> connector",
"nl": "Heeft een <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>",
"ca": "Té un connector <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (un tipus2_css de marca)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>",
"ca": "Té un connector <div style='display: inline-block'><b><b>CCS Tesla Supercharger </b> (un tipus2_css de marca)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>",
"da": "Har et <div style='display: inline-block'><b><b> Tesla Supercharger CCS-stik</b> (et mærkevarer type2_css)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> stik",
"de": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (Typ 2 CSS vonTesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> Anschluss",
"es": "Tiene un conector <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (un tipo2_css de marca)</b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>"

View file

@ -160,7 +160,7 @@
},
"render": {
"en": "<h3>Wikipedia article of the name giver</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}",
"nl": "<h3>Wikipedia artikel van de naamgever</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}",
"nl": "<h3>Wikipedia-artikel van de naamgever</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}",
"de": "<h3>Wikipedia Artikel zur Namensherkunft</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}",
"fr": "<h3>Article Wikipedia de la référence au nom</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}",
"ca": "<h3> Article de la Viquipèdia del nom donant</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}"

View file

@ -49,7 +49,7 @@
"nl": "een fastfood-zaak",
"ru": "быстрое питание",
"de": "ein Schnellimbiss",
"ca": "un de menjar ràpid",
"ca": "un negoci de menjar ràpid",
"fr": "un fast-food"
},
"tags": [

View file

@ -78,7 +78,8 @@
"fr": "Le nom de cette microbibliothèque est {name}",
"ru": "Название книжного шкафа — {name}",
"it": "Questa microbiblioteca si chiama {name}",
"hu": "Ennek a könyvespolcnak a neve: {name}"
"hu": "Ennek a könyvespolcnak a neve: {name}",
"ca": "El nom d'aquesta prestatgeria és {name}"
},
"question": {
"en": "What is the name of this public bookcase?",
@ -87,7 +88,8 @@
"fr": "Quel est le nom de cette microbibliothèque ?",
"ru": "Как называется этот общественный книжный шкаф?",
"it": "Come si chiama questa microbiblioteca pubblica?",
"hu": "Mi a neve ennek a nyilvános könyvespolcnak?"
"hu": "Mi a neve ennek a nyilvános könyvespolcnak?",
"ca": "Com es diu aquesta prestatgeria pública?"
},
"freeform": {
"key": "name",
@ -108,7 +110,8 @@
"fr": "Cette microbibliothèque n'a pas de nom",
"ru": "У этого книжного шкафа нет названия",
"it": "Questa microbiblioteca non ha un nome proprio",
"hu": "Ennek a könyvespolcnak nincs neve"
"hu": "Ennek a könyvespolcnak nincs neve",
"ca": "Aquesta prestatgeria no té un nom"
}
}
],
@ -122,7 +125,8 @@
"fr": "{capacity} livres peuvent entrer dans cette microbibliothèque",
"it": "Questa microbiblioteca può contenere fino a {capacity} libri",
"ru": "{capacity} книг помещается в этот книжный шкаф",
"hu": "Ezen a könyvespolcon {capacity} könyv fér el"
"hu": "Ezen a könyvespolcon {capacity} könyv fér el",
"ca": "Caben {capacity} llibres en aquesta prestatgeria"
},
"question": {
"en": "How many books fit into this public bookcase?",
@ -131,7 +135,8 @@
"fr": "Combien de livres peuvent entrer dans cette microbibliothèque ?",
"ru": "Сколько книг помещается в этом общественном книжном шкафу?",
"it": "Quanti libri può contenere questa microbiblioteca?",
"hu": "Hány könyv fér el ezen a nyilvános könyvespolcon?"
"hu": "Hány könyv fér el ezen a nyilvános könyvespolcon?",
"ca": "Quants llibres caben en aquesta prestatgeria pública?"
},
"freeform": {
"key": "capacity",
@ -149,7 +154,8 @@
"fr": "Quel type de livres peut-on dans cette microbibliothèque ?",
"it": "Che tipo di libri si possono trovare in questa microbiblioteca?",
"ru": "Какие книги можно найти в этом общественном книжном шкафу?",
"hu": "Milyen fajta könyvek találhatók ezen a közösségi könyvespolcon?"
"hu": "Milyen fajta könyvek találhatók ezen a közösségi könyvespolcon?",
"ca": "Quins tipus de llibres pots trobar a aquesta prestatgeria pública?"
},
"render": {
"nl": "Deze plaats serveert vooral {books}",
@ -174,7 +180,8 @@
"ru": "В основном детские книги",
"it": "Principalmente libri per l'infanzia",
"hu": "Többnyire gyermekkönyvek",
"es": "Mayoritariamente libros infantiles"
"es": "Mayoritariamente libros infantiles",
"ca": "Majoritàriament llibres infantils"
}
},
{
@ -187,7 +194,8 @@
"ru": "В основном книги для взрослых",
"it": "Principalmente libri per persone in età adulta",
"hu": "Többnyire felnőtteknek szóló könyvek",
"es": "Mayoritariamente libros para adultos"
"es": "Mayoritariamente libros para adultos",
"ca": "Majoritàriament llibres per a adults"
}
}
]
@ -200,7 +208,8 @@
"de": "Befindet sich der Bücherschrank im Freien?",
"fr": "Cette microbiliothèque est-elle en extérieur ?",
"it": "Questa microbiblioteca si trova all'aperto?",
"hu": "A szabadban van-e ez a könyvespolc?"
"hu": "A szabadban van-e ez a könyvespolc?",
"ca": "Aquesta prestatgeria es troba a l'exterior?"
},
"mappings": [
{
@ -210,7 +219,8 @@
"de": "Der Bücherschrank befindet sich im Innenbereich",
"fr": "Cette microbibliothèque est en intérieur",
"it": "Questa microbiblioteca si trova al chiuso",
"hu": "Ez a könyvespolc beltérben található"
"hu": "Ez a könyvespolc beltérben található",
"ca": "Aquesta prestatgeria es troba a l'interior"
},
"if": "indoor=yes"
},
@ -221,7 +231,8 @@
"de": "Dieser Bücherschrank befindet sich im Freien",
"fr": "Cette microbibliothèque est en extérieur",
"it": "Questa microbiblioteca si trova all'aperto",
"hu": "Ez a könyvespolc a szabadban van"
"hu": "Ez a könyvespolc a szabadban van",
"ca": "Aquesta prestatgeria es troba a l'exterior"
},
"if": "indoor=no"
},
@ -249,7 +260,8 @@
"fr": "Cette microbibliothèque est-elle librement accèssible ?",
"it": "Questa microbiblioteca è ad accesso libero?",
"ru": "Имеется ли свободный доступ к этому общественному книжному шкафу?",
"hu": "Szabadon hozzáférhető-e ez a közösségi könyvespolc?"
"hu": "Szabadon hozzáférhető-e ez a közösségi könyvespolc?",
"ca": "Aquesta prestatgeria pública és de lliure accés?"
},
"condition": "indoor=yes",
"mappings": [
@ -275,7 +287,8 @@
"fr": "Accèssible aux clients",
"it": "L'accesso è riservato ai clienti",
"hu": "Csak ügyfelek használhatják",
"es": "Solo accesible a clientes"
"es": "Solo accesible a clientes",
"ca": "Només accessible per als clients"
},
"if": "access=customers"
}
@ -288,7 +301,8 @@
"de": "Wer betreibt den Bücherschrank?",
"fr": "Qui entretien cette microbibliothèque ?",
"it": "Chi mantiene questa microbiblioteca?",
"hu": "Ki tartja fenn ezt a nyilvános könyvespolcot?"
"hu": "Ki tartja fenn ezt a nyilvános könyvespolcot?",
"ca": "Qui gestiona aquesta prestatgeria pública?"
},
"render": {
"en": "Operated by {operator}",
@ -296,7 +310,8 @@
"de": "Betrieben von {operator}",
"fr": "Entretenue par {operator}",
"it": "È gestita da {operator}",
"hu": "Üzemeltető: {operator}"
"hu": "Üzemeltető: {operator}",
"ca": "Gestionant per {operator}"
},
"freeform": {
"type": "string",
@ -311,7 +326,8 @@
"de": "Gehört der Bücherschrank zu einem Netzwerk?",
"fr": "Cette microbibliothèque fait-elle partie d'un réseau/groupe ?",
"it": "Questa microbiblioteca fa parte di una rete?",
"hu": "Része-e egy nagyobb hálózatnak ez a nyilvános könyvespolc?"
"hu": "Része-e egy nagyobb hálózatnak ez a nyilvános könyvespolc?",
"ca": "Aquesta prestatgeria pública forma part d'una xarxa més gran?"
},
"render": {
"en": "This public bookcase is part of {brand}",
@ -319,7 +335,8 @@
"de": "Dieser Bücherschrank ist Teil von {brand}",
"fr": "Cette microbibliothèque fait partie du groupe {brand}",
"it": "Questa microbiblioteca fa parte di {brand}",
"hu": "Ez a nyilvános könyvespolc a(z) {brand} része"
"hu": "Ez a nyilvános könyvespolc a(z) {brand} része",
"ca": "Aquesta prestatgeria pública forma part de {brand}"
},
"condition": "ref=",
"freeform": {
@ -335,7 +352,8 @@
"it": "Fa parte della rete 'Little Free Library'",
"hu": "A „Little Free Library” hálózat része",
"es": "Parte de la red 'Little Free Library'",
"pl": "Część sieci \"Little Free Library\""
"pl": "Część sieci \"Little Free Library\"",
"ca": "Part de la xarxa 'Little Free Library'"
},
"if": {
"and": [
@ -397,7 +415,8 @@
"de": "Dieser Bücherschrank ist nicht Teil eines größeren Netzwerks",
"fr": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe",
"it": "Questa microbiblioteca non fa parte di una rete",
"hu": "Ez a könyvespolc nem része egy nagyobb hálózatnak"
"hu": "Ez a könyvespolc nem része egy nagyobb hálózatnak",
"ca": "Aquesta prestatgeria no forma part d'una xarxa més gran"
},
"if": {
"and": [
@ -449,7 +468,8 @@
"fr": "Plus d'infos sur le site web",
"ru": "Более подробная информация на сайте",
"it": "Maggiori informazioni sul sito web",
"hu": "További információ ezen a weboldalon"
"hu": "További információ ezen a weboldalon",
"ca": "Més informació al web"
}
}
},
@ -488,7 +508,8 @@
"question": {
"en": "Has children books",
"nl": "Kinderboeken aanwezig",
"de": "Hat Kinderbücher"
"de": "Hat Kinderbücher",
"ca": "Té llibres infantils"
},
"osmTags": "books~i~.*children.*"
}
@ -501,7 +522,8 @@
"question": {
"en": "Has books for adults",
"nl": "Boeken voor volwassenen aanwezig",
"de": "Hat Bücher für Erwachsene"
"de": "Hat Bücher für Erwachsene",
"ca": "Té llibres per a adults"
},
"osmTags": "books~i~.*adults.*"
}
@ -516,14 +538,16 @@
"en": "Indoor or outdoor",
"de": "Innen oder Außen",
"hu": "Beltéri vagy kültéri",
"es": "Interior o exterior"
"es": "Interior o exterior",
"ca": "Interior o exterior"
}
},
{
"question": {
"en": "Located indoors",
"nl": "Bevindt zich binnen",
"de": "Befindet sich im Innenbereich"
"de": "Befindet sich im Innenbereich",
"ca": "Situat a l'interior"
},
"osmTags": "indoor=yes"
},
@ -531,7 +555,8 @@
"question": {
"nl": "Bevindt zich buiten",
"en": "Located outdoors",
"de": "Befindet sich im Freien"
"de": "Befindet sich im Freien",
"ca": "Situat a l'exterior"
},
"osmTags": {
"or": [

View file

@ -1285,7 +1285,8 @@
"icon": "./assets/layers/questions/denominations/chf/5rp-2019-800px.png",
"then": {
"en": "5 centimes coins are accepted",
"nl": "Munten van 5 rappen worden geaccepteerd"
"nl": "Munten van 5 rappen worden geaccepteerd",
"ca": "S'accepten monedes de 5 cèntims"
},
"hideInAnswer": "_currency!~.*CHF.*"
},
@ -1294,7 +1295,8 @@
"icon": "./assets/layers/questions/denominations/chf/10rp-2019-800px.png",
"then": {
"en": "10 centimes coins are accepted",
"nl": "Munten van 10 rappen worden geaccepteerd"
"nl": "Munten van 10 rappen worden geaccepteerd",
"ca": "S'accepten monedes de 10 cèntims"
},
"hideInAnswer": "_currency!~.*CHF.*"
},
@ -1303,7 +1305,8 @@
"icon": "./assets/layers/questions/denominations/chf/20rp-2019-800px.png",
"then": {
"en": "20 centimes coins are accepted",
"nl": "Munten van 20 rappen worden geaccepteerd"
"nl": "Munten van 20 rappen worden geaccepteerd",
"ca": "S'accepten monedes de 20 cèntims"
},
"hideInAnswer": "_currency!~.*CHF.*"
},
@ -2322,7 +2325,8 @@
"en": "When was this object last checked?",
"de": "Wann wurde dieses Objekt zuletzt kontrolliert?",
"nl": "Wanneer is dit object voor het laatst gecontroleerd?",
"pl": "Kiedy ten obiekt został ostatnio sprawdzony?"
"pl": "Kiedy ten obiekt został ostatnio sprawdzony?",
"ca": "Quan es va comprovar per última vegada aquest objecte?"
},
"freeform": {
"key": "check_date",
@ -2332,7 +2336,8 @@
"en": "This object was last checked on <b>{check_date}</b>",
"de": "Dieses Objekt wurde zuletzt kontrolliert am <b>{check_date}</b>",
"nl": "Dit object is voor het laatst gecontroleerd op <b>{check_date}</b>",
"pl": "Ten obiekt był ostatnio sprawdzony <b>{check_date}</b>"
"pl": "Ten obiekt był ostatnio sprawdzony <b>{check_date}</b>",
"ca": "Aquest objecte es va comprovar per darrera vegada el <b>{check_date}</b>"
},
"mappings": [
{
@ -2341,7 +2346,8 @@
"en": "This object was last checked today",
"de": "Dieses Objekt wurde heute zuletzt kontrolliert",
"nl": "Dit object is vandaag voor het laatst gecontroleerd",
"pl": "Ten obiekt został ostatnio sprawdzony dzisiaj"
"pl": "Ten obiekt został ostatnio sprawdzony dzisiaj",
"ca": "Aquest objecte es va comprovar per última vegada avui"
}
}
]

View file

@ -33,7 +33,8 @@
"de": "Überweg",
"nl": "Oversteekplaats",
"pa_PK": "کراسنگ",
"fr": "Passage"
"fr": "Passage",
"ca": "Creuament"
}
},
"presets": [
@ -42,7 +43,8 @@
"en": "a crossing",
"de": "einen Überweg",
"nl": "een oversteekplaats",
"fr": "un passage"
"fr": "un passage",
"ca": "un creuament"
},
"tags": [
"highway=footway",

View file

@ -15,7 +15,8 @@
"nl": "School <i>{name}</i>",
"de": "Schule <i>{name}</i>",
"fr": "School <i>{name}</i>",
"pl": "Szkoła <i>{name}</i>"
"pl": "Szkoła <i>{name}</i>",
"ca": "Escola <i>{name}</i>"
}
},
"calculatedTags": [
@ -79,7 +80,8 @@
"en": "What level of education is given on this school?",
"nl": "Wat is het onderwijsniveau van deze school?",
"de": "Welches Bildungsniveau wird an dieser Schule vermittelt?",
"fr": "Quel est le niveau d'enseignement dispensé dans cette école ?"
"fr": "Quel est le niveau d'enseignement dispensé dans cette école ?",
"ca": "Quin nivell d'educació s'imparteix en aquesta escola?"
},
"mappings": [
{
@ -98,7 +100,8 @@
"en": "This is a school where one learns primary skills such as basic literacy and numerical skills. <div class='subtle'>Pupils typically enroll from 6 years old till 12 years old</div>",
"nl": "Dit is een lagere school",
"de": "In dieser Schule lernt man grundlegende Fähigkeiten wie Lesen, Schreiben und Rechnen. <div class='subtle'>Schüler besuchen die Schule in der Regel im Alter von 6 bis 12 Jahren</div>",
"fr": "C'est une école où l'on apprend les compétences primaires telles que l'alphabétisation de base et les compétences numériques.. <div class='subtle'>Les élèves s'inscrivent généralement de 6 à 12 ans.</div>"
"fr": "C'est une école où l'on apprend les compétences primaires telles que l'alphabétisation de base et les compétences numériques.. <div class='subtle'>Les élèves s'inscrivent généralement de 6 à 12 ans.</div>",
"ca": "Aquesta és una escola on s'aprèn competències primàries com ara l'alfabetització bàsica i les habilitats numèriques. <div class='subtle'>Els alumnes solen matricular-se des dels 6 anys fins als 12 anys</div>"
}
},
{
@ -107,7 +110,8 @@
"en": "This is a secondary school which offers all grades",
"nl": "Dit is een middelbare school die alle schooljaren aanbiedt (dus van het eerste tot en met het zesde middelbaar)",
"de": "Dies ist eine weiterführende Schule, die alle Jahrgangsstufen anbietet",
"fr": "C'est une école secondaire qui offre toutes les classes"
"fr": "C'est une école secondaire qui offre toutes les classes",
"ca": "Aquesta és una escola secundària que ofereix tots els graus"
}
},
{
@ -234,7 +238,8 @@
"en": "This is a school where students study skills at their age-adequate level. <div>There are little or no special facilities to cater for students with special needs or facilities are ad-hoc</div>",
"nl": "Deze school richt zich op studenten zonder extra zorgbehoefte. <div class='subtle>Dit omvat leerlingen waarbij kleine, ad-hoc maatregelen volstaan om de lessen te volgen.</div>",
"de": "Es handelt sich um eine Schule, in der die Schüler Fähigkeiten auf ihrem altersgemäßen Niveau erlernen. <div>Es gibt wenig oder keine speziellen Einrichtungen für Schüler mit besonderen Bedürfnissen oder die Einrichtungen sind ad-hoc</div>",
"fr": "C'est un établissement scolaire où les étudiants acquièrent des compétences à un niveau adapté à leur âge. <div>Il y a peu ou pas d'adaptations spéciales pour aider les étudiants ayant des besoins particuliers, ou les installations sont ad-hoc</div> Remark: isn't it contradictory to say there's no special facility + the facilities are ad-hoc?"
"fr": "C'est un établissement scolaire où les étudiants acquièrent des compétences à un niveau adapté à leur âge. <div>Il y a peu ou pas d'adaptations spéciales pour aider les étudiants ayant des besoins particuliers, ou les installations sont ad-hoc</div> Remark: isn't it contradictory to say there's no special facility + the facilities are ad-hoc?",
"ca": "Aquesta és una escola on els estudiants estudien habilitats al nivell adequat per a la seva edat. <div>Hi ha poques o cap instal·lació especial per atendre els estudiants amb necessitats especials o les instal·lacions són ad-hoc</div>"
},
"hideInAnswer": true
},

View file

@ -23,7 +23,8 @@
"render": {
"en": "Shelter",
"de": "Unterstand",
"nl": "Schuilplaats"
"nl": "Schuilplaats",
"ca": "Refugi"
}
},
"mapRendering": [
@ -90,7 +91,8 @@
"question": {
"en": "What kind of shelter is this?",
"de": "Um welche Art von Unterstand handelt es sich?",
"nl": "Wat voor schuilplaats is dit?"
"nl": "Wat voor schuilplaats is dit?",
"ca": "Quin tipus de refugi és aquest?"
},
"render": {
"en": "Shelter type: {shelter_type}",

View file

@ -101,7 +101,8 @@
"ja": "このお店の名前は何ですか?",
"nl": "Wat is de naam van deze winkel?",
"de": "Wie ist der Name dieses Geschäfts?",
"es": "¿Cual es el nombre de esta tienda?"
"es": "¿Cual es el nombre de esta tienda?",
"ca": "Quin és el nom d'aquesta botiga?"
},
"render": {
"en": "This shop is called <i>{name}</i>",
@ -122,13 +123,15 @@
"en": "What kind of shop is this?",
"nl": "Wat voor soort winkel is dit?",
"de": "Um was für ein Geschäft handelt es sich?",
"fr": "Quel genre de magasin est-ce?"
"fr": "Quel genre de magasin est-ce?",
"ca": "Quin tipus de botiga és aquesta?"
},
"render": {
"en": "This is a {shop}",
"de": "Das ist ein {shop}",
"fr": "C'est une {shop}",
"nl": "Dit is een {shop}"
"nl": "Dit is een {shop}",
"ca": "Açò és una {shop}"
},
"freeform": {
"key": "shop",
@ -158,7 +161,8 @@
"en": "What paper formats does this shop offer?",
"de": "Welche Papierformate bietet das Geschäft an?",
"fr": "Quels formats de papier cette boutique propose-t-elle ?",
"nl": "Op welke papiergroottes kan deze zaak printen?"
"nl": "Op welke papiergroottes kan deze zaak printen?",
"ca": "Quins formats de paper ofereix aquesta botiga?"
},
"multiAnswer": true,
"mappings": [
@ -168,7 +172,8 @@
"en": "This shop can print on papers of size A4",
"de": "Das Geschäft kann Unterlagen auf A4 Papier drucken",
"fr": "Cette boutique peut imprimer sur des papiers de format A4",
"nl": "Deze zaak kan printen op A4-formaat"
"nl": "Deze zaak kan printen op A4-formaat",
"ca": "Aquesta botiga pot imprimir en papers de mida A4"
},
"ifnot": "service:print:A4=no"
},
@ -178,7 +183,8 @@
"en": "This shop can print on papers of size A3",
"de": "Das Geschäft kann Unterlagen auf A3 Papier drucken",
"fr": "Cette boutique peut imprimer sur des papiers de format A3",
"nl": "Deze zaak kan printen op A3-formaat"
"nl": "Deze zaak kan printen op A3-formaat",
"ca": "Aquesta botiga pot imprimir en papers de mida A3"
},
"ifnot": "service:print:A3=no"
},
@ -188,7 +194,8 @@
"en": "This shop can print on papers of size A2",
"de": "Das Geschäft kann Unterlagen auf A2 Papier drucken",
"fr": "Cette boutique peut imprimer sur des papiers de format A2",
"nl": "Deze zaak kan printen op A2-formaat"
"nl": "Deze zaak kan printen op A2-formaat",
"ca": "Aquesta botiga pot imprimir en papers de mida A2"
},
"ifnot": "service:print:A2=no"
},
@ -198,7 +205,8 @@
"en": "This shop can print on papers of size A1",
"de": "Das Geschäft kann Unterlagen auf A1 Papier drucken",
"fr": "Cette boutique peut imprimer sur des papiers de format A1",
"nl": "Deze zaak kan printen op A1-formaat"
"nl": "Deze zaak kan printen op A1-formaat",
"ca": "Aquesta botiga pot imprimir en papers de mida A1"
},
"ifnot": "service:print:A1=no"
},
@ -208,7 +216,8 @@
"en": "This shop can print on papers of size A0",
"de": "Das Geschäft kann Unterlagen auf A0 Papier drucken",
"fr": "Cette boutique peut imprimer sur des papiers de format A0",
"nl": "Deze zaak kan printen op A0-formaat"
"nl": "Deze zaak kan printen op A0-formaat",
"ca": "Aquesta botiga pot imprimir en papers de mida A0"
},
"ifnot": "service:print:A0=no"
}
@ -294,7 +303,8 @@
"nl": "een winkel",
"de": "ein Geschäft",
"eo": "Butiko",
"es": "una tienda"
"es": "una tienda",
"ca": "una botiga"
},
"description": {
"en": "Add a new shop",
@ -304,7 +314,8 @@
"nl": "Voeg een nieuwe winkel toe",
"de": "Ein neues Geschäft hinzufügen",
"eo": "Enmeti novan butikon",
"es": "Añadir una nueva tienda"
"es": "Añadir una nueva tienda",
"ca": "Afegir una botiga nova"
}
}
],
@ -322,7 +333,8 @@
"en": "{title()} has closed down permanently",
"de": "{title()} wurde dauerhaft geschlossen",
"es": "{title()} ha cerrado permanentemente",
"fr": "{title()} a fermé définitivement"
"fr": "{title()} a fermé définitivement",
"ca": "{title()} ha tancat permanentment"
},
"changesetMessage": "shop_closed"
}
@ -410,7 +422,8 @@
"de": "Nur Geschäfte, die {search} verkaufen",
"nl": "Toon enkel winkels die {search} verkopen",
"es": "Solo mostrar tiendas que vendan {search}",
"fr": "N'afficher que les magasins vendant {search}"
"fr": "N'afficher que les magasins vendant {search}",
"ca": "Sols mostrar botigues que venen {search}"
}
}
]

View file

@ -3,7 +3,8 @@
"name": {
"en": "Shower",
"de": "Dusche",
"fr": "Douche"
"fr": "Douche",
"ca": "Dutxa"
},
"minzoom": 12,
"source": {
@ -22,12 +23,14 @@
"title": {
"en": "a shower",
"de": "eine Dusche",
"fr": "une douche"
"fr": "une douche",
"ca": "una dutxa"
},
"description": {
"en": "A (public) shower",
"de": "Eine (öffentliche) Dusche",
"fr": "Une douche (publique)"
"fr": "Une douche (publique)",
"ca": "Una dutxa (pública)"
},
"tags": [
"amenity=shower"
@ -42,7 +45,8 @@
"question": {
"en": "Who can use this shower?",
"de": "Wer darf diese Dusche nutzen?",
"fr": "Qui peut utiliser cette douche ?"
"fr": "Qui peut utiliser cette douche ?",
"ca": "Qui pot utilitzar aquesta dutxa?"
},
"mappings": [
{
@ -50,7 +54,8 @@
"then": {
"en": "Anyone can use this shower",
"de": "Jeder darf diese Dusche nutzen",
"fr": "Tout le monde peut utiliser cette douche"
"fr": "Tout le monde peut utiliser cette douche",
"ca": "Qualsevol pot utilitzar aquesta dutxa"
}
},
{
@ -58,7 +63,8 @@
"then": {
"en": "Only customers can use this shower",
"de": "Nur Kunden dürfen diese Dusche nutzen",
"fr": "Seuls les clients peuvent utiliser cette douche"
"fr": "Seuls les clients peuvent utiliser cette douche",
"ca": "Només els clients poden utilitzar aquesta dutxa"
}
},
{
@ -66,7 +72,8 @@
"then": {
"en": "Accesible, but one has to ask for a key",
"de": "Zugänglich, aber man muss nach einem Schlüssel fragen",
"fr": "Accessible, mais il faut demander une clé"
"fr": "Accessible, mais il faut demander une clé",
"ca": "Accessible, però s'ha de demanar una clau"
}
}
]
@ -109,7 +116,8 @@
"question": {
"en": "How much does it cost to use this shower?",
"de": "Wie viel kostet es, diese Dusche zu nutzen?",
"fr": "Quel est le prix pour utiliser cette douche ?"
"fr": "Quel est le prix pour utiliser cette douche ?",
"ca": "Quant costa utilitzar aquesta dutxa?"
},
"freeform": {
"key": "charge",
@ -117,7 +125,8 @@
"placeholder": {
"en": "e.g. 1.50 EUR",
"de": "z.B. 1,50 EUR",
"fr": "par ex. 1,50 EUR"
"fr": "par ex. 1,50 EUR",
"ca": "p. e. 1.50 eur"
}
},
"render": {
@ -187,7 +196,8 @@
"question": {
"en": "Hot water available",
"de": "Warmwasser verfügbar",
"fr": "Eau chaude disponible"
"fr": "Eau chaude disponible",
"ca": "Aigua calenta disponible"
},
"osmTags": {
"or": [
@ -231,6 +241,7 @@
"description": {
"en": "A layer showing (public) showers",
"de": "Eine Ebene mit (öffentlichen) Duschen",
"fr": "Une couche affichant les douches (publiques)"
"fr": "Une couche affichant les douches (publiques)",
"ca": "Una capa que mostra dutxes (públiques)"
}
}

View file

@ -162,7 +162,8 @@
"fr": "La surface est <b>non pavée</b>",
"it": "La superficie è <b>non pavimentata</b>",
"de": "Die Oberfläche ist <b>ohne festen Belag</b>",
"es": "La superficie está <b>sin pavimentar</b>"
"es": "La superficie está <b>sin pavimentar</b>",
"ca": "La superfície és <b>sense asfaltar</b>"
},
"hideInAnswer": true
},
@ -289,6 +290,7 @@
"description": {
"en": "All carfree roads",
"nl": "Alle verkeersvrije wegen",
"de": "Alle autofreien Straßen"
"de": "Alle autofreien Straßen",
"ca": "Totes les carreteres sense cotxe"
}
}

View file

@ -4,20 +4,23 @@
"en": "Speed Camera",
"de": "Blitzer",
"nl": "Flitspaal",
"es": "Cámara de velocidad"
"es": "Cámara de velocidad",
"ca": "Càmera de velocitat"
},
"description": {
"en": "Layer showing speed cameras",
"de": "Ebene mit Blitzern",
"nl": "Laag met flitspalen",
"es": "Capa con cámaras de velocidad"
"es": "Capa con cámaras de velocidad",
"ca": "Capa que mostra càmeres de velocitat"
},
"title": {
"render": {
"en": "Speed Camera",
"de": "Blitzer",
"nl": "Flitspaal",
"es": "Cámara de velocidad"
"es": "Cámara de velocidad",
"ca": "Càmera de velocitat"
}
},
"minzoom": 12,
@ -32,7 +35,8 @@
"de": "Wie hoch ist die zulässige Höchstgeschwindigkeit an diesem Blitzer?",
"nl": "Wat is de maximum toegestane snelheid bij deze flitspaal?",
"es": "¿Cuál es la velocidad máxima permitida en este radar?",
"fr": "Quelle est la vitesse maximale autorisée au niveau de ce radar ?"
"fr": "Quelle est la vitesse maximale autorisée au niveau de ce radar ?",
"ca": "Quina és la velocitat màxima permesa en aquest radar?"
},
"freeform": {
"key": "maxspeed",
@ -42,7 +46,8 @@
"de": "Zulässige Höchstgeschwindigkeit",
"nl": "Maximum toegestane snelheid",
"es": "Velocidad máxima permitida",
"fr": "Vitesse maximale autorisée"
"fr": "Vitesse maximale autorisée",
"ca": "Velocitat màxima permesa"
}
},
"render": {
@ -50,7 +55,8 @@
"de": "Die zulässige Höchstgeschwindigkeit beträgt {canonical(maxspeed)}",
"nl": "De maximum toegestane snelheid is {canonical(maxspeed)}",
"es": "La velocidad máxima permitida es {canonical(maxspeed)}",
"fr": "La vitesse maximale autorisée est {canonical(maxspeed)}"
"fr": "La vitesse maximale autorisée est {canonical(maxspeed)}",
"ca": "La velocitat màxima permesa és {canonical(maxspeed)}"
}
},
{
@ -73,7 +79,8 @@
"en": "a speed camera",
"de": "einen Blitzer",
"nl": "een flitspaal",
"es": "una cámara de velocidad"
"es": "una cámara de velocidad",
"ca": "una càmera de velocitat"
},
"snapToLayer": [
"maxspeed"

View file

@ -3,12 +3,14 @@
"name": {
"en": "Speed Display",
"de": "Geschwindigkeitsanzeigen",
"nl": "Snelheidsdisplay"
"nl": "Snelheidsdisplay",
"ca": "Radar pedagògic"
},
"description": {
"en": "Layer showing speed displays that alert drivers of their speed.",
"de": "Ebene mit Geschwindigkeitsanzeigen, die Fahrer auf ihre Geschwindigkeit hinweisen.",
"nl": "Laag met snelheidsdisplays om bestuurders op hun snelheid te wijzen."
"nl": "Laag met snelheidsdisplays om bestuurders op hun snelheid te wijzen.",
"ca": "Capa que mostra radars pedagògics que alerten als conductors de la seva velocitat."
},
"title": {
"render": {
@ -62,13 +64,15 @@
"placeholder": {
"en": "Text on speed display (e.g. 'Your speed')",
"de": "Text auf der Geschwindigkeitsanzeige (z. B. \"Ihre Geschwindigkeit\")",
"nl": "Tekst op snelheidsdisplay (b.v. 'Uw snelheid')"
"nl": "Tekst op snelheidsdisplay (b.v. 'Uw snelheid')",
"ca": "Text al radar pedagògic (p. e. 'La seva velocitat')"
}
},
"render": {
"en": "The text on this speed display is {inscription}",
"de": "Der Text auf dieser Geschwindigkeitsanzeige ist {inscription}",
"nl": "De tekst op dit snelheidsdisplay is {inscription}"
"nl": "De tekst op dit snelheidsdisplay is {inscription}",
"ca": "El text a aquest radar pedagogic és {inscription}"
}
}
],
@ -77,7 +81,8 @@
"title": {
"en": "a speed display",
"de": "eine Geschwindigkeitsanzeige",
"nl": "een snelheidsdisplay"
"nl": "een snelheidsdisplay",
"ca": "un radar pedagògic"
},
"tags": [
"highway=speed_display"

View file

@ -565,7 +565,8 @@
"ru": "Спортивная площадка",
"it": "una campo sportivo",
"de": "einen Sportplatz",
"es": "una pista de deportes"
"es": "una pista de deportes",
"ca": "una pista d'esports"
},
"tags": [
"leisure=pitch",

View file

@ -235,7 +235,7 @@
},
"then": {
"en": "A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or tunnel, …",
"nl": "Bewaking van de publieke ruilmte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel…",
"nl": "Bewaking van de publieke ruimte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel…",
"fr": "Une zone publique est surveillée, telle qu'une rue, un pont, une place, un parc, une gare, un couloir, un tunnel public…",
"it": "Sorveglia un'area pubblica, come una strada, un ponte, una piazza, un parco, una stazione, un passaggio o un sottopasso pubblico, ...",
"de": "Die Kamera überwacht einen öffentlichen Bereich, z. B. Straßen, Brücken, Plätze, Parks, Bahnhöfe, öffentliche Gänge oder Tunnel, …",

View file

@ -11,7 +11,8 @@
"en": "Settings",
"nl": "Instellingen",
"de": "Einstellungen",
"fr": "Paramètres"
"fr": "Paramètres",
"da": "Indstillinger"
}
},
"source": "special",
@ -129,7 +130,8 @@
"cs": "Pořízené fotografie budou licencovány pod <b>CC0</b> a přidány do veřejné domény. To znamená, že kdokoli může vaše snímky použít k jakémukoli účelu.",
"ca": "Les imatges que feu tindran llicència <b>CC0</b> i s'afegiran al domini públic. Això vol dir que tothom pot utilitzar les vostres imatges per a qualsevol propòsit.",
"es": "Las fotografías que tome tendrán una licencia con <b>CC0</b> y se agregarán al dominio público. Esto significa que todos pueden usar sus imágenes para cualquier propósito.",
"pt": "As fotos que você tirar serão licenciadas com <b>CC0</b> e adicionadas ao domínio público. Isso significa que todos podem usar suas fotos para qualquer finalidade."
"pt": "As fotos que você tirar serão licenciadas com <b>CC0</b> e adicionadas ao domínio público. Isso significa que todos podem usar suas fotos para qualquer finalidade.",
"da": "Billeder, som du har taget, vil blive udgivet under <b>CC0</b>-licensen og lagt ud i fælleseje. Det betyder, at alle kan bruge dine billeder til ethvert formål."
}
},
{
@ -245,7 +247,8 @@
"en": "Allow to rotate the map",
"de": "Drehen der Karte zulassen",
"ca": "Permet girar el mapa",
"fr": "Autoriser la rotation de la carte"
"fr": "Autoriser la rotation de la carte",
"da": "Tillad rotation af kortet"
}
},
{
@ -261,8 +264,21 @@
{
"id": "mangrove-keys",
"render": {
"en": "<a href='data:application/json,{mangroveidentity}' download='mangrove_private_key_{_name}'>Download the private key for your Mangrove Account</a> <p>Anyone possessing this file can make reviews with your identity</p>",
"de": "<a href='data:application/json,{mangroveidentity}' download='mangrove_private_key_{_name}'>Laden Sie den privaten Schlüssel für Ihr Mangrove-Konto herunter</a> <p>Jeder, der diese Datei besitzt, kann mit Ihrer Identität Rezensionen vornehmen</p>"
"special": {
"type": "link",
"href": "data:application/json,{mangroveidentity}",
"download": "mangrove_private_key_{_name}",
"text": {
"en": "Download the private key for your Mangrove Account",
"de": "Laden Sie den privaten Schlüssel für Ihr Mangrove-Konto herunter",
"da": "Hent den private nøgle til din Mangrove-konto"
}
},
"after": {
"en": "Anyone possessing this file can make reviews with your identity",
"de": "Jeder, der diese Datei besitzt, kann mit Ihrer Identität Rezensionen vornehmen",
"da": "Enhver, der har denne fil, kan lave ændringer med din identitet"
}
}
},
{
@ -305,7 +321,8 @@
"de": "Schaltfläche anzeigen zum schnellen Öffnen von Übersetzungen beim Verwenden von MapComplete auf einem großen Bildschirm",
"fr": "Afficher un bouton pour ouvrir rapidement les traductions lorsque vous utilisez MapComplete sur un grand écran",
"ca": "Mostra un botó per a obrir ràpidament les traduccions quan utilitzes MapComplet en una pantalla gran",
"pt": "Mostrar um botão para abrir traduções rapidamente ao usar o MapComplete em uma tela grande"
"pt": "Mostrar um botão para abrir traduções rapidamente ao usar o MapComplete em uma tela grande",
"da": "Vis en knap for hurtigt at åbne oversættelser, når du bruger MapComplete på en stor skærm"
}
},
{
@ -447,7 +464,8 @@
"ca": "Has fet {_csCount} en diferents ocasions! Això és sorprenent!",
"fr": "Vous avez fait {_csCount} modifications ! C'est génial !",
"pt": "Você fez alterações em {_csCount} ocasiões diferentes! Isso é incrível!",
"nl": "Je hebt {_csCount} verschillende keren bijgedragen! Dat is indrukwekkend!"
"nl": "Je hebt {_csCount} verschillende keren bijgedragen! Dat is indrukwekkend!",
"da": "Du har lavet ændringer ved {_csCount} forskellige begivenheder! Det er fantastisk!"
},
"icon": "party"
}
@ -522,7 +540,8 @@
"en": "Don't show debug info",
"de": "Keine Debug-Informationen anzeigen",
"cs": "Nezobrazovat informace o ladění",
"pt": "Não mostrar informações de depuração"
"pt": "Não mostrar informações de depuração",
"da": "Vis ikke debug-informationer"
},
"hideInAnswer": true
}

View file

@ -33,7 +33,8 @@
"id": "turbin angin",
"hu": "szélerőmű",
"da": "vindmølle",
"pl": "turbina wiatrowa"
"pl": "turbina wiatrowa",
"ca": "Turbina eòlica"
},
"mappings": [
{

View file

@ -1842,13 +1842,13 @@
"question": "Té un connector <div style='display: inline-block'><b><b>Tipus 2</b> (mennekes)</b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_socket.svg'/></div>"
},
"9": {
"question": "Té un connector <div style='display: inline-block'><b><b> Tipus 2 CCS</b> (mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>"
"question": "Té un connector <div style='display: inline-block'><b><b> CCS Tipus 2</b> (mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>"
},
"10": {
"question": "Té un connector <div style='display: inline-block'><b><b>Tipus 2 amb cable</b> (mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div>"
},
"11": {
"question": "Té un connector <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (un tipus2_css de marca)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>"
"question": "Té un connector <div style='display: inline-block'><b><b>CCS Tesla Supercharger </b> (un tipus2_css de marca)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>"
},
"12": {
"question": "Té un connector <div style='display: inline-block'><b><b>Tesla Supercharger (destination)</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div>"
@ -2141,6 +2141,17 @@
"question": "Quin corrent fan els endolls amb <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b></b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div> offer?",
"render": "<div style='display: inline-block'><b><b>Tesla Supercharger (Destinació)</b></b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div> sortida com a màxim {socket:tesla_destination:current}A"
},
"current-12": {
"mappings": {
"0": {
"then": "<b>Supercarregador Tesla (destinació)</b> (Un Tipus 2 amb un cable de marca Tesla) surt com a màxim a 16 A"
},
"1": {
"then": "<b>Supercarregador Tesla (destinació)</b> (Un Tipus 2 amb un cable de marca Tesla) surt com a màxim a 32 A"
}
},
"question": "Quin corrent donen els endolls amb <div style='display: inline-block'><b><b>Tesla Supercharger (destinació)</b> (un tipus 2 amb cable amb la marca Tesla)</b> <img style ='amplada: 1rem; mostrar: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> oferta?"
},
"current-13": {
"mappings": {
"0": {
@ -2161,6 +2172,16 @@
},
"question": "Quin corrent ofereixen els endolls amb <div style='display: inline-block'><b><b>Chademo</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Chademo_type4.svg'/></div>?"
},
"current-7": {
"mappings": {
"0": {
"then": "<b>Tipus 2</b> (menneks) surt com a màxim a 16 A"
},
"1": {
"then": "<b>Tipus 2</b> (menneks) surt com a màxim a 32 A"
}
}
},
"current-8": {
"mappings": {
"0": {
@ -3957,7 +3978,7 @@
},
"1": {
"description": "Un negoci de menjar centrat en el servei ràpid sols en mostrador i menjar per a endur",
"title": "un de menjar ràpid"
"title": "un negoci de menjar ràpid"
},
"2": {
"description": "Un local de menjar ràpid centrat en les patates fregides",
@ -5586,6 +5607,35 @@
}
},
"public_bookcase": {
"filter": {
"0": {
"options": {
"0": {
"question": "Té llibres infantils"
}
}
},
"1": {
"options": {
"0": {
"question": "Té llibres per a adults"
}
}
},
"2": {
"options": {
"0": {
"question": "Interior o exterior"
},
"1": {
"question": "Situat a l'interior"
},
"2": {
"question": "Situat a l'exterior"
}
}
}
},
"name": "Bústies per llibres",
"presets": {
"0": {
@ -5593,28 +5643,77 @@
}
},
"tagRenderings": {
"bookcase-booktypes": {
"mappings": {
"0": {
"then": "Majoritàriament llibres infantils"
},
"1": {
"then": "Majoritàriament llibres per a adults"
}
},
"question": "Quins tipus de llibres pots trobar a aquesta prestatgeria pública?"
},
"bookcase-is-accessible": {
"mappings": {
"0": {
"then": "Accessible al públic"
},
"1": {
"then": "Només accessible per als clients"
}
}
},
"question": "Aquesta prestatgeria pública és de lliure accés?"
},
"bookcase-is-indoors": {
"mappings": {
"0": {
"then": "Aquesta prestatgeria es troba a l'interior"
},
"1": {
"then": "Aquesta prestatgeria es troba a l'exterior"
},
"2": {
"then": "La prestatgeria està ubicada a l'exterior"
}
}
},
"question": "Aquesta prestatgeria es troba a l'exterior?"
},
"public_bookcase-brand": {
"mappings": {
"0": {
"then": "Part de la xarxa 'Little Free Library'"
},
"1": {
"then": "Aquesta prestatgeria pública no és part d'una xarxa més gran"
}
},
"question": "Aquesta prestatgeria pública forma part d'una xarxa més gran?",
"render": "Aquesta prestatgeria pública forma part de {brand}"
},
"public_bookcase-capacity": {
"question": "Quants llibres caben en aquesta prestatgeria pública?",
"render": "Caben {capacity} llibres en aquesta prestatgeria"
},
"public_bookcase-name": {
"mappings": {
"0": {
"then": "Aquesta prestatgeria no té un nom"
}
},
"question": "Com es diu aquesta prestatgeria pública?",
"render": "El nom d'aquesta prestatgeria és {name}"
},
"public_bookcase-operator": {
"question": "Qui gestiona aquesta prestatgeria pública?",
"render": "Gestionant per {operator}"
},
"public_bookcase-ref": {
"mappings": {
"0": {
"then": "Aquesta prestatgeria no forma part d'una xarxa més gran"
}
},
"question": "Quin és el número de referència d'aquesta prestatgeria pública?"
},
"public_bookcase-start_date": {
@ -5622,7 +5721,12 @@
"render": "Instal·lat el dia {start_date}"
},
"public_bookcase-website": {
"question": "Hi ha algun lloc web amb més informació sobre aquesta prestatgeria pública?"
"question": "Hi ha algun lloc web amb més informació sobre aquesta prestatgeria pública?",
"render": {
"special": {
"text": "Més informació al web"
}
}
}
},
"title": {
@ -5636,6 +5740,15 @@
},
"questions": {
"tagRenderings": {
"check_date": {
"mappings": {
"0": {
"then": "Aquest objecte es va comprovar per última vegada avui"
}
},
"question": "Quan es va comprovar per última vegada aquest objecte?",
"render": "Aquest objecte es va comprovar per darrera vegada el <b>{check_date}</b>"
},
"denominations-coins": {
"mappings": {
"0": {
@ -5661,6 +5774,15 @@
},
"7": {
"then": "S'accepten monedes de 2 euros"
},
"8": {
"then": "S'accepten monedes de 5 cèntims"
},
"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í?"
@ -5980,7 +6102,8 @@
"name": "Pasos de vianants pintats amb l'arc de Sant Martí",
"presets": {
"0": {
"description": "Pas de vianants"
"description": "Pas de vianants",
"title": "un creuament"
}
},
"tagRenderings": {
@ -5998,6 +6121,9 @@
},
"question": "Aquest pas de vianants està pintat amb l'arc de Sant Martí?"
}
},
"title": {
"render": "Creuament"
}
},
"reception_desk": {
@ -6302,6 +6428,12 @@
"0": {
"then": "Aquesta és una escola amb una secció deducació infantil on els més petits reben una educació que prepara la lectura i lescriptura."
},
"1": {
"then": "Aquesta és una escola on s'aprèn competències primàries com ara l'alfabetització bàsica i les habilitats numèriques. <div class='subtle'>Els alumnes solen matricular-se des dels 6 anys fins als 12 anys</div>"
},
"2": {
"then": "Aquesta és una escola secundària que ofereix tots els graus"
},
"3": {
"then": "Aquesta és una escola secundària que <i>no</i> ofereix tots els graus, però ofereix <b>primer i segon</b> grau"
},
@ -6314,7 +6446,8 @@
"6": {
"then": "Aquesta escola ofereix educació post secundària (p.e. un sèptim o vuité any d'especialitzció)"
}
}
},
"question": "Quin nivell d'educació s'imparteix en aquesta escola?"
},
"gender": {
"mappings": {
@ -6349,6 +6482,9 @@
},
"target-audience": {
"mappings": {
"0": {
"then": "Aquesta és una escola on els estudiants estudien habilitats al nivell adequat per a la seva edat. <div>Hi ha poques o cap instal·lació especial per atendre els estudiants amb necessitats especials o les instal·lacions són ad-hoc</div>"
},
"1": {
"then": "Aquesta és una escola per a estudiants sense necessitats especials <div class='subtle'> Açò inclou alumnes que poden seguir les classes amb petites mesures</div>"
},
@ -6377,18 +6513,77 @@
"question": "Aquesta escola es dirigeix a estudiants amb necessitats especials? Quines instal·lacions estructurals té aquesta escola?",
"render": "Aquesta escola té instal·lacions per a estudiants amb {school:for}"
}
},
"title": {
"render": "Escola <i>{name}</i>"
}
},
"selected_element": {
"description": "Ressalta l'element seleccionat actualment. Anul·leu aquesta capa per tenir diferents colors"
},
"shelter": {
"name": "Refugi"
"name": "Refugi",
"tagRenderings": {
"shelter-type": {
"question": "Quin tipus de refugi és aquest?"
}
},
"title": {
"render": "Refugi"
}
},
"shops": {
"deletion": {
"extraDeleteReasons": {
"0": {
"explanation": "{title()} ha tancat permanentment"
}
}
},
"description": "Una botiga",
"filter": {
"1": {
"options": {
"0": {
"question": "Sols mostrar botigues que venen {search}"
}
}
}
},
"name": "Botiga",
"presets": {
"0": {
"description": "Afegir una botiga nova",
"title": "una botiga"
}
},
"tagRenderings": {
"copyshop-print-sizes": {
"mappings": {
"0": {
"then": "Aquesta botiga pot imprimir en papers de mida A4"
},
"1": {
"then": "Aquesta botiga pot imprimir en papers de mida A3"
},
"2": {
"then": "Aquesta botiga pot imprimir en papers de mida A2"
},
"3": {
"then": "Aquesta botiga pot imprimir en papers de mida A1"
},
"4": {
"then": "Aquesta botiga pot imprimir en papers de mida A0"
}
},
"question": "Quins formats de paper ofereix aquesta botiga?"
},
"id_presets.shop_types": {
"override": {
"question": "Quin tipus de botiga és aquesta?",
"render": "Açò és una {shop}"
}
},
"organic": {
"mappings": {
"0": {
@ -6404,6 +6599,7 @@
"question": "Aquesta botiga ofereix productes orgànics?"
},
"shops-name": {
"question": "Quin és el nom d'aquesta botiga?",
"render": "La botiga s'anomena <i>{name}</i>"
}
},
@ -6420,8 +6616,43 @@
}
},
"shower": {
"description": "Una capa que mostra dutxes (públiques)",
"filter": {
"1": {
"options": {
"0": {
"question": "Aigua calenta disponible"
}
}
}
},
"name": "Dutxa",
"presets": {
"0": {
"description": "Una dutxa (pública)",
"title": "una dutxa"
}
},
"tagRenderings": {
"access": {
"mappings": {
"0": {
"then": "Qualsevol pot utilitzar aquesta dutxa"
},
"1": {
"then": "Només els clients poden utilitzar aquesta dutxa"
},
"2": {
"then": "Accessible, però s'ha de demanar una clau"
}
},
"question": "Qui pot utilitzar aquesta dutxa?"
},
"charge": {
"freeform": {
"placeholder": "p. e. 1.50 eur"
},
"question": "Quant costa utilitzar aquesta dutxa?",
"render": "Costa {charge} utilitzar aquesta dutxa"
},
"fee": {
@ -6455,6 +6686,7 @@
}
},
"slow_roads": {
"description": "Totes les carreteres sense cotxe",
"tagRenderings": {
"slow_roads-surface": {
"mappings": {
@ -6464,6 +6696,9 @@
"1": {
"then": "La superfície és <b>terra</b>"
},
"2": {
"then": "La superfície és <b>sense asfaltar</b>"
},
"3": {
"then": "La superfície és <b>sorra</b>"
}
@ -6472,6 +6707,25 @@
}
},
"speed_camera": {
"description": "Capa que mostra càmeres de velocitat",
"name": "Càmera de velocitat",
"presets": {
"0": {
"title": "una càmera de velocitat"
}
},
"tagRenderings": {
"maxspeed": {
"freeform": {
"placeholder": "Velocitat màxima permesa"
},
"question": "Quina és la velocitat màxima permesa en aquest radar?",
"render": "La velocitat màxima permesa és {canonical(maxspeed)}"
}
},
"title": {
"render": "Càmera de velocitat"
},
"units": {
"0": {
"applicableUnits": {
@ -6488,9 +6742,20 @@
}
},
"speed_display": {
"description": "Capa que mostra radars pedagògics que alerten als conductors de la seva velocitat.",
"name": "Radar pedagògic",
"presets": {
"0": {
"title": "un radar pedagògic"
}
},
"tagRenderings": {
"inscription": {
"question": "Quin text es mostra al radar pedagògic?"
"freeform": {
"placeholder": "Text al radar pedagògic (p. e. 'La seva velocitat')"
},
"question": "Quin text es mostra al radar pedagògic?",
"render": "El text a aquest radar pedagogic és {inscription}"
},
"maxspeed": {
"render": "La velocitat màxima permesa a aquest radar pedagògic és {canonical(maxspeed)}"
@ -6541,6 +6806,11 @@
}
},
"name": "Camps d'esports",
"presets": {
"1": {
"title": "una pista d'esports"
}
},
"tagRenderings": {
"sport-pitch-access": {
"mappings": {
@ -7607,7 +7877,8 @@
"0": {
"then": "{name}"
}
}
},
"render": "Turbina eòlica"
},
"units": {
"0": {

View file

@ -2951,6 +2951,42 @@
},
"usersettings": {
"tagRenderings": {
"cscount-thanks": {
"mappings": {
"0": {
"then": "Du har lavet ændringer ved {_csCount} forskellige begivenheder! Det er fantastisk!"
}
}
},
"fixate-north": {
"mappings": {
"0": {
"then": "Tillad rotation af kortet"
}
}
},
"mangrove-keys": {
"render": {
"after": "Enhver, der har denne fil, kan lave ændringer med din identitet",
"special": {
"text": "Hent den private nøgle til din Mangrove-konto"
}
}
},
"picture-license": {
"mappings": {
"1": {
"then": "Billeder, som du har taget, vil blive udgivet under <b>CC0</b>-licensen og lagt ud i fælleseje. Det betyder, at alle kan bruge dine billeder til ethvert formål."
}
}
},
"show_debug": {
"mappings": {
"2": {
"then": "Vis ikke debug-informationer"
}
}
},
"translation-completeness": {
"render": "Oversættelser for {_theme} i {_language} er på {_translation_percentage}%: {_translation_translated_count} strenge ud af {_translation_total} er oversat"
},
@ -2960,8 +2996,18 @@
"then": "Klik på 'oversæt'-ikonet ved siden af en streng for at indtaste eller opdatere et stykke tekst. Du skal have en Weblate-konto for at kunne gøre dette. Opret en med dit OSM-brugernavn for automatisk at låse oversættelsestilstanden op."
}
}
},
"translation-mode": {
"mappings": {
"1": {
"then": "Vis en knap for hurtigt at åbne oversættelser, når du bruger MapComplete på en stor skærm"
}
}
}
},
"title": {
"render": "Indstillinger"
}
},
"veterinary": {
"name": "dyrlæge",

View file

@ -9592,7 +9592,12 @@
}
},
"mangrove-keys": {
"render": "<a href='data:application/json,{mangroveidentity}' download='mangrove_private_key_{_name}'>Laden Sie den privaten Schlüssel für Ihr Mangrove-Konto herunter</a> <p>Jeder, der diese Datei besitzt, kann mit Ihrer Identität Rezensionen vornehmen</p>"
"render": {
"after": "Jeder, der diese Datei besitzt, kann mit Ihrer Identität Rezensionen vornehmen",
"special": {
"text": "Laden Sie den privaten Schlüssel für Ihr Mangrove-Konto herunter"
}
}
},
"picture-license": {
"mappings": {

View file

@ -9680,7 +9680,12 @@
}
},
"mangrove-keys": {
"render": "<a href='data:application/json,{mangroveidentity}' download='mangrove_private_key_{_name}'>Download the private key for your Mangrove Account</a> <p>Anyone possessing this file can make reviews with your identity</p>"
"render": {
"after": "Anyone possessing this file can make reviews with your identity",
"special": {
"text": "Download the private key for your Mangrove Account"
}
}
},
"picture-license": {
"mappings": {

View file

@ -4279,7 +4279,7 @@
},
"wikipedia-etymology": {
"question": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?",
"render": "<h3>Wikipedia artikel van de naamgever</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}"
"render": "<h3>Wikipedia-artikel van de naamgever</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}"
},
"zoeken op inventaris onroerend erfgoed": {
"render": "<a href='https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst={name}' target='_blank'>Zoeken op inventaris onroerend erfgoed</a>"
@ -8135,7 +8135,7 @@
"Surveillance type: public, outdoor, indoor": {
"mappings": {
"0": {
"then": "Bewaking van de publieke ruilmte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel…"
"then": "Bewaking van de publieke ruimte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel…"
},
"1": {
"then": "Een buitenruimte met privaat karakter (zoals een privé-oprit, een parking, tankstation, …)"

View file

@ -132,6 +132,9 @@ export class TagUtils {
/**
* Given multiple tagsfilters which can be used as answer, will take the tags with the same keys together as set.
*
* @see MatchesMultiAnswer to do the reverse
*
* E.g:
*
* const tag = TagUtils.ParseUploadableTag({"and": [

View file

@ -243,7 +243,10 @@ export default class TagRenderingConfig {
if (txt === "") {
throw context + " Rendering for language " + ln + " is empty"
}
if (txt.indexOf("{" + this.freeform.key + "}") >= 0 || txt.indexOf("&LBRACE" + this.freeform.key + "&RBRACE") ) {
if (
txt.indexOf("{" + this.freeform.key + "}") >= 0 ||
txt.indexOf("&LBRACE" + this.freeform.key + "&RBRACE")
) {
continue
}
if (txt.indexOf("{" + this.freeform.key + ":") >= 0) {
@ -645,6 +648,16 @@ export default class TagRenderingConfig {
/**
* Given a value for the freeform key and an overview of the selected mappings, construct the correct tagsFilter to apply
*
* const config = new TagRenderingConfig({"id":"bookcase-booktypes","render":{"en":"This place mostly serves {books}" },
* "question":{"en":"What kind of books can be found in this public bookcase?"},
* "freeform":{"key":"books","addExtraTags":["fixme=Freeform tag `books` used, to be doublechecked"],
* "inline":true},
* "multiAnswer":true,
* "mappings":[{"if":"books=children","then":"Mostly children books"},
* {"if":"books=adults","then": "Mostly books for adults"}]}
* , "testcase")
* config.constructChangeSpecification(undefined, undefined, [false, true, false], {amenity: "public_bookcase"}) // => new And([new Tag("books","adults")])
*
* @param freeformValue The freeform value which will be applied as 'freeform.key'. Ignored if 'freeform.key' is not set
*
* @param singleSelectedMapping (Only used if multiAnswer == false): the single mapping to apply. Use (mappings.length) for the freeform

View file

@ -1,18 +1,22 @@
import Translations from "../i18n/Translations"
import BaseUIElement from "../BaseUIElement"
import { Store } from "../../Logic/UIEventSource"
import { Utils } from "../../Utils"
export default class Link extends BaseUIElement {
private readonly _href: string | Store<string>
private readonly _embeddedShow: BaseUIElement
private readonly _newTab: boolean
private readonly _download: string
constructor(
embeddedShow: BaseUIElement | string,
href: string | Store<string>,
newTab: boolean = false
newTab: boolean = false,
download: string = undefined
) {
super()
this._download = download
this._embeddedShow = Translations.W(embeddedShow)
this._href = href
this._newTab = newTab
@ -58,6 +62,9 @@ export default class Link extends BaseUIElement {
if (this._newTab) {
el.target = "_blank"
}
if (this._download) {
el.download = this._download
}
el.appendChild(embeddedShow)
return el
}

View file

@ -1,76 +1,114 @@
<script lang="ts">
import { Store, UIEventSource } from "../../../Logic/UIEventSource"
import type { SpecialVisualizationState } from "../../SpecialVisualization"
import Tr from "../../Base/Tr.svelte"
import type { Feature } from "geojson"
import type { Mapping } from "../../../Models/ThemeConfig/TagRenderingConfig"
import TagRenderingConfig from "../../../Models/ThemeConfig/TagRenderingConfig"
import { TagsFilter } from "../../../Logic/Tags/TagsFilter"
import FreeformInput from "./FreeformInput.svelte"
import Translations from "../../i18n/Translations.js"
import ChangeTagAction from "../../../Logic/Osm/Actions/ChangeTagAction"
import { createEventDispatcher, onDestroy } from "svelte"
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"
import SpecialTranslation from "./SpecialTranslation.svelte"
import TagHint from "../TagHint.svelte"
import LoginToggle from "../../Base/LoginToggle.svelte"
import SubtleButton from "../../Base/SubtleButton.svelte"
import Loading from "../../Base/Loading.svelte"
import TagRenderingMappingInput from "./TagRenderingMappingInput.svelte"
import { Translation } from "../../i18n/Translation"
import Constants from "../../../Models/Constants"
import { Unit } from "../../../Models/Unit"
import UserRelatedState from "../../../Logic/State/UserRelatedState"
import { twJoin } from "tailwind-merge"
import { UIEventSource } from "../../../Logic/UIEventSource";
import type { SpecialVisualizationState } from "../../SpecialVisualization";
import Tr from "../../Base/Tr.svelte";
import type { Feature } from "geojson";
import type { Mapping } from "../../../Models/ThemeConfig/TagRenderingConfig";
import TagRenderingConfig from "../../../Models/ThemeConfig/TagRenderingConfig";
import { TagsFilter } from "../../../Logic/Tags/TagsFilter";
import FreeformInput from "./FreeformInput.svelte";
import Translations from "../../i18n/Translations.js";
import ChangeTagAction from "../../../Logic/Osm/Actions/ChangeTagAction";
import { createEventDispatcher, onDestroy } from "svelte";
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig";
import SpecialTranslation from "./SpecialTranslation.svelte";
import TagHint from "../TagHint.svelte";
import LoginToggle from "../../Base/LoginToggle.svelte";
import SubtleButton from "../../Base/SubtleButton.svelte";
import Loading from "../../Base/Loading.svelte";
import TagRenderingMappingInput from "./TagRenderingMappingInput.svelte";
import { Translation } from "../../i18n/Translation";
import Constants from "../../../Models/Constants";
import { Unit } from "../../../Models/Unit";
import UserRelatedState from "../../../Logic/State/UserRelatedState";
import { twJoin } from "tailwind-merge";
import { TagUtils } from "../../../Logic/Tags/TagUtils";
export let config: TagRenderingConfig
export let tags: UIEventSource<Record<string, string>>
export let selectedElement: Feature
export let state: SpecialVisualizationState
export let layer: LayerConfig
export let config: TagRenderingConfig;
export let tags: UIEventSource<Record<string, string>>;
export let selectedElement: Feature;
export let state: SpecialVisualizationState;
export let layer: LayerConfig;
let feedback: UIEventSource<Translation> = new UIEventSource<Translation>(undefined)
let feedback: UIEventSource<Translation> = new UIEventSource<Translation>(undefined);
let unit: Unit = layer.units?.find((unit) => unit.appliesToKeys.has(config.freeform?.key))
let unit: Unit = layer.units?.find((unit) => unit.appliesToKeys.has(config.freeform?.key));
// Will be bound if a freeform is available
let freeformInput = new UIEventSource<string>(tags?.[config.freeform?.key])
let selectedMapping: number = undefined
let checkedMappings: boolean[]
$: {
let tgs = $tags
mappings = config.mappings?.filter((m) => {
let freeformInput = new UIEventSource<string>(tags?.[config.freeform?.key]);
let selectedMapping: number = undefined;
let checkedMappings: boolean[];
/**
* Prepares and fills the checkedMappings
*/
function initialize(tgs: Record<string, string>, confg: TagRenderingConfig) {
mappings = confg.mappings?.filter((m) => {
if (typeof m.hideInAnswer === "boolean") {
return !m.hideInAnswer
return !m.hideInAnswer;
}
return !m.hideInAnswer.matchesProperties(tgs)
})
return !m.hideInAnswer.matchesProperties(tgs);
});
// We received a new config -> reinit
unit = layer.units.find((unit) => unit.appliesToKeys.has(config.freeform?.key))
unit = layer.units.find((unit) => unit.appliesToKeys.has(confg.freeform?.key));
if (
config.mappings?.length > 0 &&
(checkedMappings === undefined || checkedMappings?.length + 1 < config.mappings.length)
confg.mappings?.length > 0 &&
(checkedMappings === undefined || checkedMappings?.length < confg.mappings.length + (confg.freeform ? 1 : 0))
) {
const seenFreeforms = [];
TagUtils.FlattenMultiAnswer()
checkedMappings = [
...config.mappings.map((_) => false),
false /*One element extra in case a freeform value is added*/,
]
...confg.mappings.map((mapping) => {
const matches = TagUtils.MatchesMultiAnswer(mapping.if, tgs)
if (matches && confg.freeform) {
const newProps = TagUtils.changeAsProperties(mapping.if.asChange());
seenFreeforms.push(newProps[confg.freeform.key]);
}
if (config.freeform?.key) {
if (!config.multiAnswer) {
// Somehow, setting multianswer freeform values is broken if this is not set
freeformInput.setData(tgs[config.freeform.key])
return matches;
})
];
if(tgs !== undefined && confg.freeform){
const unseenFreeformValues = tgs[confg.freeform.key]?.split(";") ?? []
for (const seenFreeform of seenFreeforms) {
if(!seenFreeform){
continue
}
const index = unseenFreeformValues.indexOf(seenFreeform)
if(index < 0){
continue
}
unseenFreeformValues.splice(index, 1)
}
// TODO this has _to much_ values
freeformInput.setData(unseenFreeformValues.join(";"))
checkedMappings.push(unseenFreeformValues.length > 0)
}
}
console.log("Inited 'checkMappings' to", checkedMappings);
if (confg.freeform?.key) {
if (!confg.multiAnswer) {
// Somehow, setting multi-answer freeform values is broken if this is not set
freeformInput.setData(tgs[confg.freeform.key]);
}
} else {
freeformInput.setData(undefined)
freeformInput.setData(undefined);
}
feedback.setData(undefined)
feedback.setData(undefined);
}
export let selectedTags: TagsFilter = undefined
let mappings: Mapping[] = config?.mappings
let searchTerm: UIEventSource<string> = new UIEventSource("")
$: {
// Even though 'config' is not declared as a store, Svelte uses it as one to update the component
// We want to (re)-initialize whenever the 'tags' or 'config' change - but not when 'checkedConfig' changes
initialize($tags, config);
}
export let selectedTags: TagsFilter = undefined;
let mappings: Mapping[] = config?.mappings;
let searchTerm: UIEventSource<string> = new UIEventSource("");
$: {
try {
@ -79,10 +117,10 @@
selectedMapping,
checkedMappings,
tags.data
)
);
} catch (e) {
console.error("Could not calculate changeSpecification:", e)
selectedTags = undefined
console.error("Could not calculate changeSpecification:", e);
selectedTags = undefined;
}
}
@ -91,53 +129,53 @@
config: TagRenderingConfig
applied: TagsFilter
}
}>()
}>();
function onSave() {
if (selectedTags === undefined) {
return
return;
}
if (layer.source === null) {
/**
* This is a special, priviliged layer.
* We simply apply the tags onto the records
*/
const kv = selectedTags.asChange(tags.data)
const kv = selectedTags.asChange(tags.data);
for (const { k, v } of kv) {
if (v === undefined) {
delete tags.data[k]
delete tags.data[k];
} else {
tags.data[k] = v
tags.data[k] = v;
}
}
tags.ping()
return
tags.ping();
return;
}
dispatch("saved", { config, applied: selectedTags })
dispatch("saved", { config, applied: selectedTags });
const change = new ChangeTagAction(tags.data.id, selectedTags, tags.data, {
theme: state.layout.id,
changeType: "answer",
})
freeformInput.setData(undefined)
selectedMapping = undefined
selectedTags = undefined
changeType: "answer"
});
freeformInput.setData(undefined);
selectedMapping = undefined;
selectedTags = undefined;
change
.CreateChangeDescriptions()
.then((changes) => state.changes.applyChanges(changes))
.catch(console.error)
.catch(console.error);
}
let featureSwitchIsTesting = state.featureSwitchIsTesting
let featureSwitchIsDebugging = state.featureSwitches.featureSwitchIsDebugging
let showTags = state.userRelatedState.showTags
let numberOfCs = state.osmConnection.userDetails.data.csCount
let featureSwitchIsTesting = state.featureSwitchIsTesting;
let featureSwitchIsDebugging = state.featureSwitches.featureSwitchIsDebugging;
let showTags = state.userRelatedState.showTags;
let numberOfCs = state.osmConnection.userDetails.data.csCount;
onDestroy(
state.osmConnection.userDetails.addCallbackAndRun((ud) => {
numberOfCs = ud.csCount
numberOfCs = ud.csCount;
})
)
);
</script>
{#if config.question !== undefined}

View file

@ -1155,19 +1155,24 @@ export default class SpecialVisualizations {
name: "class",
doc: "CSS-classes to add to the element",
},
{
name: "download",
doc: "If set, this link will act as a download-button. The contents of `href` will be offered for download; this parameter will act as the proposed filename",
},
],
constr(
state: SpecialVisualizationState,
tagSource: UIEventSource<Record<string, string>>,
args: string[]
): BaseUIElement {
const [text, href, classnames] = args
const [text, href, classnames, download] = args
return new VariableUiElement(
tagSource.map((tags) =>
new Link(
Utils.SubstituteKeys(text, tags),
Utils.SubstituteKeys(href, tags),
true
download === undefined,
Utils.SubstituteKeys(download, tags)
).SetClass(classnames)
)
)

View file

@ -471,7 +471,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
*/
public static SubstituteKeys(
txt: string | undefined,
tags?: Record<string, any>,
tags: Record<string, any> | undefined,
useLang?: string
): string | undefined {
if (txt === undefined) {