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", "en": "<b>Type 2</b> (mennekes) outputs at most 16 A",
"nl": "<b>Type 2</b> (mennekes) levert een stroom van maximaal 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", "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": { "icon": {
"path": "./assets/layers/charging_station/Type2_socket.svg", "path": "./assets/layers/charging_station/Type2_socket.svg",
@ -2776,7 +2777,8 @@
"en": "<b>Type 2</b> (mennekes) outputs at most 32 A", "en": "<b>Type 2</b> (mennekes) outputs at most 32 A",
"nl": "<b>Type 2</b> (mennekes) levert een stroom van maximaal 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", "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": { "icon": {
"path": "./assets/layers/charging_station/Type2_socket.svg", "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?", "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>?", "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> ?", "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": { "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", "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", "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", "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", "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": { "icon": {
"path": "./assets/layers/charging_station/Type2_tethered.svg", "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", "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", "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", "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": { "icon": {
"path": "./assets/layers/charging_station/Type2_tethered.svg", "path": "./assets/layers/charging_station/Type2_tethered.svg",
@ -4949,7 +4954,7 @@
"question": { "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", "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>", "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", "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", "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>" "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": { "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", "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>", "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", "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", "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>" "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": { "render": {
"en": "<h3>Wikipedia article of the name giver</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}", "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}", "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}", "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}" "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", "nl": "een fastfood-zaak",
"ru": "быстрое питание", "ru": "быстрое питание",
"de": "ein Schnellimbiss", "de": "ein Schnellimbiss",
"ca": "un de menjar ràpid", "ca": "un negoci de menjar ràpid",
"fr": "un fast-food" "fr": "un fast-food"
}, },
"tags": [ "tags": [

View file

@ -78,7 +78,8 @@
"fr": "Le nom de cette microbibliothèque est {name}", "fr": "Le nom de cette microbibliothèque est {name}",
"ru": "Название книжного шкафа — {name}", "ru": "Название книжного шкафа — {name}",
"it": "Questa microbiblioteca si chiama {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": { "question": {
"en": "What is the name of this public bookcase?", "en": "What is the name of this public bookcase?",
@ -87,7 +88,8 @@
"fr": "Quel est le nom de cette microbibliothèque ?", "fr": "Quel est le nom de cette microbibliothèque ?",
"ru": "Как называется этот общественный книжный шкаф?", "ru": "Как называется этот общественный книжный шкаф?",
"it": "Come si chiama questa microbiblioteca pubblica?", "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": { "freeform": {
"key": "name", "key": "name",
@ -108,7 +110,8 @@
"fr": "Cette microbibliothèque n'a pas de nom", "fr": "Cette microbibliothèque n'a pas de nom",
"ru": "У этого книжного шкафа нет названия", "ru": "У этого книжного шкафа нет названия",
"it": "Questa microbiblioteca non ha un nome proprio", "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", "fr": "{capacity} livres peuvent entrer dans cette microbibliothèque",
"it": "Questa microbiblioteca può contenere fino a {capacity} libri", "it": "Questa microbiblioteca può contenere fino a {capacity} libri",
"ru": "{capacity} книг помещается в этот книжный шкаф", "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": { "question": {
"en": "How many books fit into this public bookcase?", "en": "How many books fit into this public bookcase?",
@ -131,7 +135,8 @@
"fr": "Combien de livres peuvent entrer dans cette microbibliothèque ?", "fr": "Combien de livres peuvent entrer dans cette microbibliothèque ?",
"ru": "Сколько книг помещается в этом общественном книжном шкафу?", "ru": "Сколько книг помещается в этом общественном книжном шкафу?",
"it": "Quanti libri può contenere questa microbiblioteca?", "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": { "freeform": {
"key": "capacity", "key": "capacity",
@ -149,7 +154,8 @@
"fr": "Quel type de livres peut-on dans cette microbibliothèque ?", "fr": "Quel type de livres peut-on dans cette microbibliothèque ?",
"it": "Che tipo di libri si possono trovare in questa microbiblioteca?", "it": "Che tipo di libri si possono trovare in questa microbiblioteca?",
"ru": "Какие книги можно найти в этом общественном книжном шкафу?", "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": { "render": {
"nl": "Deze plaats serveert vooral {books}", "nl": "Deze plaats serveert vooral {books}",
@ -174,7 +180,8 @@
"ru": "В основном детские книги", "ru": "В основном детские книги",
"it": "Principalmente libri per l'infanzia", "it": "Principalmente libri per l'infanzia",
"hu": "Többnyire gyermekkönyvek", "hu": "Többnyire gyermekkönyvek",
"es": "Mayoritariamente libros infantiles" "es": "Mayoritariamente libros infantiles",
"ca": "Majoritàriament llibres infantils"
} }
}, },
{ {
@ -187,7 +194,8 @@
"ru": "В основном книги для взрослых", "ru": "В основном книги для взрослых",
"it": "Principalmente libri per persone in età adulta", "it": "Principalmente libri per persone in età adulta",
"hu": "Többnyire felnőtteknek szóló könyvek", "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?", "de": "Befindet sich der Bücherschrank im Freien?",
"fr": "Cette microbiliothèque est-elle en extérieur ?", "fr": "Cette microbiliothèque est-elle en extérieur ?",
"it": "Questa microbiblioteca si trova all'aperto?", "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": [ "mappings": [
{ {
@ -210,7 +219,8 @@
"de": "Der Bücherschrank befindet sich im Innenbereich", "de": "Der Bücherschrank befindet sich im Innenbereich",
"fr": "Cette microbibliothèque est en intérieur", "fr": "Cette microbibliothèque est en intérieur",
"it": "Questa microbiblioteca si trova al chiuso", "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" "if": "indoor=yes"
}, },
@ -221,7 +231,8 @@
"de": "Dieser Bücherschrank befindet sich im Freien", "de": "Dieser Bücherschrank befindet sich im Freien",
"fr": "Cette microbibliothèque est en extérieur", "fr": "Cette microbibliothèque est en extérieur",
"it": "Questa microbiblioteca si trova all'aperto", "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" "if": "indoor=no"
}, },
@ -249,7 +260,8 @@
"fr": "Cette microbibliothèque est-elle librement accèssible ?", "fr": "Cette microbibliothèque est-elle librement accèssible ?",
"it": "Questa microbiblioteca è ad accesso libero?", "it": "Questa microbiblioteca è ad accesso libero?",
"ru": "Имеется ли свободный доступ к этому общественному книжному шкафу?", "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", "condition": "indoor=yes",
"mappings": [ "mappings": [
@ -275,7 +287,8 @@
"fr": "Accèssible aux clients", "fr": "Accèssible aux clients",
"it": "L'accesso è riservato ai clienti", "it": "L'accesso è riservato ai clienti",
"hu": "Csak ügyfelek használhatják", "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" "if": "access=customers"
} }
@ -288,7 +301,8 @@
"de": "Wer betreibt den Bücherschrank?", "de": "Wer betreibt den Bücherschrank?",
"fr": "Qui entretien cette microbibliothèque ?", "fr": "Qui entretien cette microbibliothèque ?",
"it": "Chi mantiene questa microbiblioteca?", "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": { "render": {
"en": "Operated by {operator}", "en": "Operated by {operator}",
@ -296,7 +310,8 @@
"de": "Betrieben von {operator}", "de": "Betrieben von {operator}",
"fr": "Entretenue par {operator}", "fr": "Entretenue par {operator}",
"it": "È gestita da {operator}", "it": "È gestita da {operator}",
"hu": "Üzemeltető: {operator}" "hu": "Üzemeltető: {operator}",
"ca": "Gestionant per {operator}"
}, },
"freeform": { "freeform": {
"type": "string", "type": "string",
@ -311,7 +326,8 @@
"de": "Gehört der Bücherschrank zu einem Netzwerk?", "de": "Gehört der Bücherschrank zu einem Netzwerk?",
"fr": "Cette microbibliothèque fait-elle partie d'un réseau/groupe ?", "fr": "Cette microbibliothèque fait-elle partie d'un réseau/groupe ?",
"it": "Questa microbiblioteca fa parte di una rete?", "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": { "render": {
"en": "This public bookcase is part of {brand}", "en": "This public bookcase is part of {brand}",
@ -319,7 +335,8 @@
"de": "Dieser Bücherschrank ist Teil von {brand}", "de": "Dieser Bücherschrank ist Teil von {brand}",
"fr": "Cette microbibliothèque fait partie du groupe {brand}", "fr": "Cette microbibliothèque fait partie du groupe {brand}",
"it": "Questa microbiblioteca fa parte di {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=", "condition": "ref=",
"freeform": { "freeform": {
@ -335,7 +352,8 @@
"it": "Fa parte della rete 'Little Free Library'", "it": "Fa parte della rete 'Little Free Library'",
"hu": "A „Little Free Library” hálózat része", "hu": "A „Little Free Library” hálózat része",
"es": "Parte de la red 'Little Free Library'", "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": { "if": {
"and": [ "and": [
@ -397,7 +415,8 @@
"de": "Dieser Bücherschrank ist nicht Teil eines größeren Netzwerks", "de": "Dieser Bücherschrank ist nicht Teil eines größeren Netzwerks",
"fr": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe", "fr": "Cette microbibliothèque ne fait pas partie d'un réseau/groupe",
"it": "Questa microbiblioteca non fa parte di una rete", "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": { "if": {
"and": [ "and": [
@ -449,7 +468,8 @@
"fr": "Plus d'infos sur le site web", "fr": "Plus d'infos sur le site web",
"ru": "Более подробная информация на сайте", "ru": "Более подробная информация на сайте",
"it": "Maggiori informazioni sul sito web", "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": { "question": {
"en": "Has children books", "en": "Has children books",
"nl": "Kinderboeken aanwezig", "nl": "Kinderboeken aanwezig",
"de": "Hat Kinderbücher" "de": "Hat Kinderbücher",
"ca": "Té llibres infantils"
}, },
"osmTags": "books~i~.*children.*" "osmTags": "books~i~.*children.*"
} }
@ -501,7 +522,8 @@
"question": { "question": {
"en": "Has books for adults", "en": "Has books for adults",
"nl": "Boeken voor volwassenen aanwezig", "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.*" "osmTags": "books~i~.*adults.*"
} }
@ -516,14 +538,16 @@
"en": "Indoor or outdoor", "en": "Indoor or outdoor",
"de": "Innen oder Außen", "de": "Innen oder Außen",
"hu": "Beltéri vagy kültéri", "hu": "Beltéri vagy kültéri",
"es": "Interior o exterior" "es": "Interior o exterior",
"ca": "Interior o exterior"
} }
}, },
{ {
"question": { "question": {
"en": "Located indoors", "en": "Located indoors",
"nl": "Bevindt zich binnen", "nl": "Bevindt zich binnen",
"de": "Befindet sich im Innenbereich" "de": "Befindet sich im Innenbereich",
"ca": "Situat a l'interior"
}, },
"osmTags": "indoor=yes" "osmTags": "indoor=yes"
}, },
@ -531,7 +555,8 @@
"question": { "question": {
"nl": "Bevindt zich buiten", "nl": "Bevindt zich buiten",
"en": "Located outdoors", "en": "Located outdoors",
"de": "Befindet sich im Freien" "de": "Befindet sich im Freien",
"ca": "Situat a l'exterior"
}, },
"osmTags": { "osmTags": {
"or": [ "or": [

View file

@ -1285,7 +1285,8 @@
"icon": "./assets/layers/questions/denominations/chf/5rp-2019-800px.png", "icon": "./assets/layers/questions/denominations/chf/5rp-2019-800px.png",
"then": { "then": {
"en": "5 centimes coins are accepted", "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.*" "hideInAnswer": "_currency!~.*CHF.*"
}, },
@ -1294,7 +1295,8 @@
"icon": "./assets/layers/questions/denominations/chf/10rp-2019-800px.png", "icon": "./assets/layers/questions/denominations/chf/10rp-2019-800px.png",
"then": { "then": {
"en": "10 centimes coins are accepted", "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.*" "hideInAnswer": "_currency!~.*CHF.*"
}, },
@ -1303,7 +1305,8 @@
"icon": "./assets/layers/questions/denominations/chf/20rp-2019-800px.png", "icon": "./assets/layers/questions/denominations/chf/20rp-2019-800px.png",
"then": { "then": {
"en": "20 centimes coins are accepted", "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.*" "hideInAnswer": "_currency!~.*CHF.*"
}, },
@ -2322,7 +2325,8 @@
"en": "When was this object last checked?", "en": "When was this object last checked?",
"de": "Wann wurde dieses Objekt zuletzt kontrolliert?", "de": "Wann wurde dieses Objekt zuletzt kontrolliert?",
"nl": "Wanneer is dit object voor het laatst gecontroleerd?", "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": { "freeform": {
"key": "check_date", "key": "check_date",
@ -2332,7 +2336,8 @@
"en": "This object was last checked on <b>{check_date}</b>", "en": "This object was last checked on <b>{check_date}</b>",
"de": "Dieses Objekt wurde zuletzt kontrolliert am <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>", "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": [ "mappings": [
{ {
@ -2341,7 +2346,8 @@
"en": "This object was last checked today", "en": "This object was last checked today",
"de": "Dieses Objekt wurde heute zuletzt kontrolliert", "de": "Dieses Objekt wurde heute zuletzt kontrolliert",
"nl": "Dit object is vandaag voor het laatst gecontroleerd", "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", "de": "Überweg",
"nl": "Oversteekplaats", "nl": "Oversteekplaats",
"pa_PK": "کراسنگ", "pa_PK": "کراسنگ",
"fr": "Passage" "fr": "Passage",
"ca": "Creuament"
} }
}, },
"presets": [ "presets": [
@ -42,7 +43,8 @@
"en": "a crossing", "en": "a crossing",
"de": "einen Überweg", "de": "einen Überweg",
"nl": "een oversteekplaats", "nl": "een oversteekplaats",
"fr": "un passage" "fr": "un passage",
"ca": "un creuament"
}, },
"tags": [ "tags": [
"highway=footway", "highway=footway",

View file

@ -15,7 +15,8 @@
"nl": "School <i>{name}</i>", "nl": "School <i>{name}</i>",
"de": "Schule <i>{name}</i>", "de": "Schule <i>{name}</i>",
"fr": "School <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": [ "calculatedTags": [
@ -79,7 +80,8 @@
"en": "What level of education is given on this school?", "en": "What level of education is given on this school?",
"nl": "Wat is het onderwijsniveau van deze school?", "nl": "Wat is het onderwijsniveau van deze school?",
"de": "Welches Bildungsniveau wird an dieser Schule vermittelt?", "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": [ "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>", "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", "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>", "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", "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)", "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", "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>", "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>", "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>", "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 "hideInAnswer": true
}, },

View file

@ -23,7 +23,8 @@
"render": { "render": {
"en": "Shelter", "en": "Shelter",
"de": "Unterstand", "de": "Unterstand",
"nl": "Schuilplaats" "nl": "Schuilplaats",
"ca": "Refugi"
} }
}, },
"mapRendering": [ "mapRendering": [
@ -90,7 +91,8 @@
"question": { "question": {
"en": "What kind of shelter is this?", "en": "What kind of shelter is this?",
"de": "Um welche Art von Unterstand handelt es sich?", "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": { "render": {
"en": "Shelter type: {shelter_type}", "en": "Shelter type: {shelter_type}",

View file

@ -101,7 +101,8 @@
"ja": "このお店の名前は何ですか?", "ja": "このお店の名前は何ですか?",
"nl": "Wat is de naam van deze winkel?", "nl": "Wat is de naam van deze winkel?",
"de": "Wie ist der Name dieses Geschäfts?", "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": { "render": {
"en": "This shop is called <i>{name}</i>", "en": "This shop is called <i>{name}</i>",
@ -122,13 +123,15 @@
"en": "What kind of shop is this?", "en": "What kind of shop is this?",
"nl": "Wat voor soort winkel is dit?", "nl": "Wat voor soort winkel is dit?",
"de": "Um was für ein Geschäft handelt es sich?", "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": { "render": {
"en": "This is a {shop}", "en": "This is a {shop}",
"de": "Das ist ein {shop}", "de": "Das ist ein {shop}",
"fr": "C'est une {shop}", "fr": "C'est une {shop}",
"nl": "Dit is een {shop}" "nl": "Dit is een {shop}",
"ca": "Açò és una {shop}"
}, },
"freeform": { "freeform": {
"key": "shop", "key": "shop",
@ -158,7 +161,8 @@
"en": "What paper formats does this shop offer?", "en": "What paper formats does this shop offer?",
"de": "Welche Papierformate bietet das Geschäft an?", "de": "Welche Papierformate bietet das Geschäft an?",
"fr": "Quels formats de papier cette boutique propose-t-elle ?", "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, "multiAnswer": true,
"mappings": [ "mappings": [
@ -168,7 +172,8 @@
"en": "This shop can print on papers of size A4", "en": "This shop can print on papers of size A4",
"de": "Das Geschäft kann Unterlagen auf A4 Papier drucken", "de": "Das Geschäft kann Unterlagen auf A4 Papier drucken",
"fr": "Cette boutique peut imprimer sur des papiers de format A4", "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" "ifnot": "service:print:A4=no"
}, },
@ -178,7 +183,8 @@
"en": "This shop can print on papers of size A3", "en": "This shop can print on papers of size A3",
"de": "Das Geschäft kann Unterlagen auf A3 Papier drucken", "de": "Das Geschäft kann Unterlagen auf A3 Papier drucken",
"fr": "Cette boutique peut imprimer sur des papiers de format A3", "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" "ifnot": "service:print:A3=no"
}, },
@ -188,7 +194,8 @@
"en": "This shop can print on papers of size A2", "en": "This shop can print on papers of size A2",
"de": "Das Geschäft kann Unterlagen auf A2 Papier drucken", "de": "Das Geschäft kann Unterlagen auf A2 Papier drucken",
"fr": "Cette boutique peut imprimer sur des papiers de format A2", "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" "ifnot": "service:print:A2=no"
}, },
@ -198,7 +205,8 @@
"en": "This shop can print on papers of size A1", "en": "This shop can print on papers of size A1",
"de": "Das Geschäft kann Unterlagen auf A1 Papier drucken", "de": "Das Geschäft kann Unterlagen auf A1 Papier drucken",
"fr": "Cette boutique peut imprimer sur des papiers de format A1", "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" "ifnot": "service:print:A1=no"
}, },
@ -208,7 +216,8 @@
"en": "This shop can print on papers of size A0", "en": "This shop can print on papers of size A0",
"de": "Das Geschäft kann Unterlagen auf A0 Papier drucken", "de": "Das Geschäft kann Unterlagen auf A0 Papier drucken",
"fr": "Cette boutique peut imprimer sur des papiers de format A0", "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" "ifnot": "service:print:A0=no"
} }
@ -294,7 +303,8 @@
"nl": "een winkel", "nl": "een winkel",
"de": "ein Geschäft", "de": "ein Geschäft",
"eo": "Butiko", "eo": "Butiko",
"es": "una tienda" "es": "una tienda",
"ca": "una botiga"
}, },
"description": { "description": {
"en": "Add a new shop", "en": "Add a new shop",
@ -304,7 +314,8 @@
"nl": "Voeg een nieuwe winkel toe", "nl": "Voeg een nieuwe winkel toe",
"de": "Ein neues Geschäft hinzufügen", "de": "Ein neues Geschäft hinzufügen",
"eo": "Enmeti novan butikon", "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", "en": "{title()} has closed down permanently",
"de": "{title()} wurde dauerhaft geschlossen", "de": "{title()} wurde dauerhaft geschlossen",
"es": "{title()} ha cerrado permanentemente", "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" "changesetMessage": "shop_closed"
} }
@ -410,7 +422,8 @@
"de": "Nur Geschäfte, die {search} verkaufen", "de": "Nur Geschäfte, die {search} verkaufen",
"nl": "Toon enkel winkels die {search} verkopen", "nl": "Toon enkel winkels die {search} verkopen",
"es": "Solo mostrar tiendas que vendan {search}", "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": { "name": {
"en": "Shower", "en": "Shower",
"de": "Dusche", "de": "Dusche",
"fr": "Douche" "fr": "Douche",
"ca": "Dutxa"
}, },
"minzoom": 12, "minzoom": 12,
"source": { "source": {
@ -22,12 +23,14 @@
"title": { "title": {
"en": "a shower", "en": "a shower",
"de": "eine Dusche", "de": "eine Dusche",
"fr": "une douche" "fr": "une douche",
"ca": "una dutxa"
}, },
"description": { "description": {
"en": "A (public) shower", "en": "A (public) shower",
"de": "Eine (öffentliche) Dusche", "de": "Eine (öffentliche) Dusche",
"fr": "Une douche (publique)" "fr": "Une douche (publique)",
"ca": "Una dutxa (pública)"
}, },
"tags": [ "tags": [
"amenity=shower" "amenity=shower"
@ -42,7 +45,8 @@
"question": { "question": {
"en": "Who can use this shower?", "en": "Who can use this shower?",
"de": "Wer darf diese Dusche nutzen?", "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": [ "mappings": [
{ {
@ -50,7 +54,8 @@
"then": { "then": {
"en": "Anyone can use this shower", "en": "Anyone can use this shower",
"de": "Jeder darf diese Dusche nutzen", "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": { "then": {
"en": "Only customers can use this shower", "en": "Only customers can use this shower",
"de": "Nur Kunden dürfen diese Dusche nutzen", "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": { "then": {
"en": "Accesible, but one has to ask for a key", "en": "Accesible, but one has to ask for a key",
"de": "Zugänglich, aber man muss nach einem Schlüssel fragen", "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": { "question": {
"en": "How much does it cost to use this shower?", "en": "How much does it cost to use this shower?",
"de": "Wie viel kostet es, diese Dusche zu nutzen?", "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": { "freeform": {
"key": "charge", "key": "charge",
@ -117,7 +125,8 @@
"placeholder": { "placeholder": {
"en": "e.g. 1.50 EUR", "en": "e.g. 1.50 EUR",
"de": "z.B. 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": { "render": {
@ -187,7 +196,8 @@
"question": { "question": {
"en": "Hot water available", "en": "Hot water available",
"de": "Warmwasser verfügbar", "de": "Warmwasser verfügbar",
"fr": "Eau chaude disponible" "fr": "Eau chaude disponible",
"ca": "Aigua calenta disponible"
}, },
"osmTags": { "osmTags": {
"or": [ "or": [
@ -231,6 +241,7 @@
"description": { "description": {
"en": "A layer showing (public) showers", "en": "A layer showing (public) showers",
"de": "Eine Ebene mit (öffentlichen) Duschen", "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>", "fr": "La surface est <b>non pavée</b>",
"it": "La superficie è <b>non pavimentata</b>", "it": "La superficie è <b>non pavimentata</b>",
"de": "Die Oberfläche ist <b>ohne festen Belag</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 "hideInAnswer": true
}, },
@ -289,6 +290,7 @@
"description": { "description": {
"en": "All carfree roads", "en": "All carfree roads",
"nl": "Alle verkeersvrije wegen", "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", "en": "Speed Camera",
"de": "Blitzer", "de": "Blitzer",
"nl": "Flitspaal", "nl": "Flitspaal",
"es": "Cámara de velocidad" "es": "Cámara de velocidad",
"ca": "Càmera de velocitat"
}, },
"description": { "description": {
"en": "Layer showing speed cameras", "en": "Layer showing speed cameras",
"de": "Ebene mit Blitzern", "de": "Ebene mit Blitzern",
"nl": "Laag met flitspalen", "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": { "title": {
"render": { "render": {
"en": "Speed Camera", "en": "Speed Camera",
"de": "Blitzer", "de": "Blitzer",
"nl": "Flitspaal", "nl": "Flitspaal",
"es": "Cámara de velocidad" "es": "Cámara de velocidad",
"ca": "Càmera de velocitat"
} }
}, },
"minzoom": 12, "minzoom": 12,
@ -32,7 +35,8 @@
"de": "Wie hoch ist die zulässige Höchstgeschwindigkeit an diesem Blitzer?", "de": "Wie hoch ist die zulässige Höchstgeschwindigkeit an diesem Blitzer?",
"nl": "Wat is de maximum toegestane snelheid bij deze flitspaal?", "nl": "Wat is de maximum toegestane snelheid bij deze flitspaal?",
"es": "¿Cuál es la velocidad máxima permitida en este radar?", "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": { "freeform": {
"key": "maxspeed", "key": "maxspeed",
@ -42,7 +46,8 @@
"de": "Zulässige Höchstgeschwindigkeit", "de": "Zulässige Höchstgeschwindigkeit",
"nl": "Maximum toegestane snelheid", "nl": "Maximum toegestane snelheid",
"es": "Velocidad máxima permitida", "es": "Velocidad máxima permitida",
"fr": "Vitesse maximale autorisée" "fr": "Vitesse maximale autorisée",
"ca": "Velocitat màxima permesa"
} }
}, },
"render": { "render": {
@ -50,7 +55,8 @@
"de": "Die zulässige Höchstgeschwindigkeit beträgt {canonical(maxspeed)}", "de": "Die zulässige Höchstgeschwindigkeit beträgt {canonical(maxspeed)}",
"nl": "De maximum toegestane snelheid is {canonical(maxspeed)}", "nl": "De maximum toegestane snelheid is {canonical(maxspeed)}",
"es": "La velocidad máxima permitida es {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", "en": "a speed camera",
"de": "einen Blitzer", "de": "einen Blitzer",
"nl": "een flitspaal", "nl": "een flitspaal",
"es": "una cámara de velocidad" "es": "una cámara de velocidad",
"ca": "una càmera de velocitat"
}, },
"snapToLayer": [ "snapToLayer": [
"maxspeed" "maxspeed"

View file

@ -3,12 +3,14 @@
"name": { "name": {
"en": "Speed Display", "en": "Speed Display",
"de": "Geschwindigkeitsanzeigen", "de": "Geschwindigkeitsanzeigen",
"nl": "Snelheidsdisplay" "nl": "Snelheidsdisplay",
"ca": "Radar pedagògic"
}, },
"description": { "description": {
"en": "Layer showing speed displays that alert drivers of their speed.", "en": "Layer showing speed displays that alert drivers of their speed.",
"de": "Ebene mit Geschwindigkeitsanzeigen, die Fahrer auf ihre Geschwindigkeit hinweisen.", "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": { "title": {
"render": { "render": {
@ -62,13 +64,15 @@
"placeholder": { "placeholder": {
"en": "Text on speed display (e.g. 'Your speed')", "en": "Text on speed display (e.g. 'Your speed')",
"de": "Text auf der Geschwindigkeitsanzeige (z. B. \"Ihre Geschwindigkeit\")", "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": { "render": {
"en": "The text on this speed display is {inscription}", "en": "The text on this speed display is {inscription}",
"de": "Der Text auf dieser Geschwindigkeitsanzeige ist {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": { "title": {
"en": "a speed display", "en": "a speed display",
"de": "eine Geschwindigkeitsanzeige", "de": "eine Geschwindigkeitsanzeige",
"nl": "een snelheidsdisplay" "nl": "een snelheidsdisplay",
"ca": "un radar pedagògic"
}, },
"tags": [ "tags": [
"highway=speed_display" "highway=speed_display"

View file

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

View file

@ -235,7 +235,7 @@
}, },
"then": { "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, …", "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…", "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, ...", "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, …", "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", "en": "Settings",
"nl": "Instellingen", "nl": "Instellingen",
"de": "Einstellungen", "de": "Einstellungen",
"fr": "Paramètres" "fr": "Paramètres",
"da": "Indstillinger"
} }
}, },
"source": "special", "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.", "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.", "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.", "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", "en": "Allow to rotate the map",
"de": "Drehen der Karte zulassen", "de": "Drehen der Karte zulassen",
"ca": "Permet girar el mapa", "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", "id": "mangrove-keys",
"render": { "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>", "special": {
"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>" "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", "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", "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", "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!", "ca": "Has fet {_csCount} en diferents ocasions! Això és sorprenent!",
"fr": "Vous avez fait {_csCount} modifications ! C'est génial !", "fr": "Vous avez fait {_csCount} modifications ! C'est génial !",
"pt": "Você fez alterações em {_csCount} ocasiões diferentes! Isso é incrível!", "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" "icon": "party"
} }
@ -522,7 +540,8 @@
"en": "Don't show debug info", "en": "Don't show debug info",
"de": "Keine Debug-Informationen anzeigen", "de": "Keine Debug-Informationen anzeigen",
"cs": "Nezobrazovat informace o ladění", "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 "hideInAnswer": true
} }

View file

@ -33,7 +33,8 @@
"id": "turbin angin", "id": "turbin angin",
"hu": "szélerőmű", "hu": "szélerőmű",
"da": "vindmølle", "da": "vindmølle",
"pl": "turbina wiatrowa" "pl": "turbina wiatrowa",
"ca": "Turbina eòlica"
}, },
"mappings": [ "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>" "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": { "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": { "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>" "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": { "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": { "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>" "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?", "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" "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": { "current-13": {
"mappings": { "mappings": {
"0": { "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>?" "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": { "current-8": {
"mappings": { "mappings": {
"0": { "0": {
@ -3957,7 +3978,7 @@
}, },
"1": { "1": {
"description": "Un negoci de menjar centrat en el servei ràpid sols en mostrador i menjar per a endur", "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": { "2": {
"description": "Un local de menjar ràpid centrat en les patates fregides", "description": "Un local de menjar ràpid centrat en les patates fregides",
@ -5586,6 +5607,35 @@
} }
}, },
"public_bookcase": { "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", "name": "Bústies per llibres",
"presets": { "presets": {
"0": { "0": {
@ -5593,28 +5643,77 @@
} }
}, },
"tagRenderings": { "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": { "bookcase-is-accessible": {
"mappings": { "mappings": {
"0": { "0": {
"then": "Accessible al públic" "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": { "bookcase-is-indoors": {
"mappings": { "mappings": {
"0": {
"then": "Aquesta prestatgeria es troba a l'interior"
},
"1": {
"then": "Aquesta prestatgeria es troba a l'exterior"
},
"2": { "2": {
"then": "La prestatgeria està ubicada a l'exterior" "then": "La prestatgeria està ubicada a l'exterior"
} }
} },
"question": "Aquesta prestatgeria es troba a l'exterior?"
}, },
"public_bookcase-brand": { "public_bookcase-brand": {
"mappings": { "mappings": {
"0": {
"then": "Part de la xarxa 'Little Free Library'"
},
"1": { "1": {
"then": "Aquesta prestatgeria pública no és part d'una xarxa més gran" "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": { "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?" "question": "Quin és el número de referència d'aquesta prestatgeria pública?"
}, },
"public_bookcase-start_date": { "public_bookcase-start_date": {
@ -5622,7 +5721,12 @@
"render": "Instal·lat el dia {start_date}" "render": "Instal·lat el dia {start_date}"
}, },
"public_bookcase-website": { "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": { "title": {
@ -5636,6 +5740,15 @@
}, },
"questions": { "questions": {
"tagRenderings": { "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": { "denominations-coins": {
"mappings": { "mappings": {
"0": { "0": {
@ -5661,6 +5774,15 @@
}, },
"7": { "7": {
"then": "S'accepten monedes de 2 euros" "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í?" "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í", "name": "Pasos de vianants pintats amb l'arc de Sant Martí",
"presets": { "presets": {
"0": { "0": {
"description": "Pas de vianants" "description": "Pas de vianants",
"title": "un creuament"
} }
}, },
"tagRenderings": { "tagRenderings": {
@ -5998,6 +6121,9 @@
}, },
"question": "Aquest pas de vianants està pintat amb l'arc de Sant Martí?" "question": "Aquest pas de vianants està pintat amb l'arc de Sant Martí?"
} }
},
"title": {
"render": "Creuament"
} }
}, },
"reception_desk": { "reception_desk": {
@ -6302,6 +6428,12 @@
"0": { "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." "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": { "3": {
"then": "Aquesta és una escola secundària que <i>no</i> ofereix tots els graus, però ofereix <b>primer i segon</b> grau" "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": { "6": {
"then": "Aquesta escola ofereix educació post secundària (p.e. un sèptim o vuité any d'especialitzció)" "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": { "gender": {
"mappings": { "mappings": {
@ -6349,6 +6482,9 @@
}, },
"target-audience": { "target-audience": {
"mappings": { "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": { "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>" "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?", "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}" "render": "Aquesta escola té instal·lacions per a estudiants amb {school:for}"
} }
},
"title": {
"render": "Escola <i>{name}</i>"
} }
}, },
"selected_element": { "selected_element": {
"description": "Ressalta l'element seleccionat actualment. Anul·leu aquesta capa per tenir diferents colors" "description": "Ressalta l'element seleccionat actualment. Anul·leu aquesta capa per tenir diferents colors"
}, },
"shelter": { "shelter": {
"name": "Refugi" "name": "Refugi",
"tagRenderings": {
"shelter-type": {
"question": "Quin tipus de refugi és aquest?"
}
},
"title": {
"render": "Refugi"
}
}, },
"shops": { "shops": {
"deletion": {
"extraDeleteReasons": {
"0": {
"explanation": "{title()} ha tancat permanentment"
}
}
},
"description": "Una botiga", "description": "Una botiga",
"filter": {
"1": {
"options": {
"0": {
"question": "Sols mostrar botigues que venen {search}"
}
}
}
},
"name": "Botiga", "name": "Botiga",
"presets": {
"0": {
"description": "Afegir una botiga nova",
"title": "una botiga"
}
},
"tagRenderings": { "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": { "organic": {
"mappings": { "mappings": {
"0": { "0": {
@ -6404,6 +6599,7 @@
"question": "Aquesta botiga ofereix productes orgànics?" "question": "Aquesta botiga ofereix productes orgànics?"
}, },
"shops-name": { "shops-name": {
"question": "Quin és el nom d'aquesta botiga?",
"render": "La botiga s'anomena <i>{name}</i>" "render": "La botiga s'anomena <i>{name}</i>"
} }
}, },
@ -6420,8 +6616,43 @@
} }
}, },
"shower": { "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": { "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": { "charge": {
"freeform": {
"placeholder": "p. e. 1.50 eur"
},
"question": "Quant costa utilitzar aquesta dutxa?",
"render": "Costa {charge} utilitzar aquesta dutxa" "render": "Costa {charge} utilitzar aquesta dutxa"
}, },
"fee": { "fee": {
@ -6455,6 +6686,7 @@
} }
}, },
"slow_roads": { "slow_roads": {
"description": "Totes les carreteres sense cotxe",
"tagRenderings": { "tagRenderings": {
"slow_roads-surface": { "slow_roads-surface": {
"mappings": { "mappings": {
@ -6464,6 +6696,9 @@
"1": { "1": {
"then": "La superfície és <b>terra</b>" "then": "La superfície és <b>terra</b>"
}, },
"2": {
"then": "La superfície és <b>sense asfaltar</b>"
},
"3": { "3": {
"then": "La superfície és <b>sorra</b>" "then": "La superfície és <b>sorra</b>"
} }
@ -6472,6 +6707,25 @@
} }
}, },
"speed_camera": { "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": { "units": {
"0": { "0": {
"applicableUnits": { "applicableUnits": {
@ -6488,9 +6742,20 @@
} }
}, },
"speed_display": { "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": { "tagRenderings": {
"inscription": { "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": { "maxspeed": {
"render": "La velocitat màxima permesa a aquest radar pedagògic és {canonical(maxspeed)}" "render": "La velocitat màxima permesa a aquest radar pedagògic és {canonical(maxspeed)}"
@ -6541,6 +6806,11 @@
} }
}, },
"name": "Camps d'esports", "name": "Camps d'esports",
"presets": {
"1": {
"title": "una pista d'esports"
}
},
"tagRenderings": { "tagRenderings": {
"sport-pitch-access": { "sport-pitch-access": {
"mappings": { "mappings": {
@ -7607,7 +7877,8 @@
"0": { "0": {
"then": "{name}" "then": "{name}"
} }
} },
"render": "Turbina eòlica"
}, },
"units": { "units": {
"0": { "0": {

View file

@ -2951,6 +2951,42 @@
}, },
"usersettings": { "usersettings": {
"tagRenderings": { "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": { "translation-completeness": {
"render": "Oversættelser for {_theme} i {_language} er på {_translation_percentage}%: {_translation_translated_count} strenge ud af {_translation_total} er oversat" "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." "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": { "veterinary": {
"name": "dyrlæge", "name": "dyrlæge",

View file

@ -9592,7 +9592,12 @@
} }
}, },
"mangrove-keys": { "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": { "picture-license": {
"mappings": { "mappings": {

View file

@ -9680,7 +9680,12 @@
} }
}, },
"mangrove-keys": { "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": { "picture-license": {
"mappings": { "mappings": {

View file

@ -4279,7 +4279,7 @@
}, },
"wikipedia-etymology": { "wikipedia-etymology": {
"question": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?", "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": { "zoeken op inventaris onroerend erfgoed": {
"render": "<a href='https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst={name}' target='_blank'>Zoeken op inventaris onroerend erfgoed</a>" "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": { "Surveillance type: public, outdoor, indoor": {
"mappings": { "mappings": {
"0": { "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": { "1": {
"then": "Een buitenruimte met privaat karakter (zoals een privé-oprit, een parking, tankstation, …)" "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. * 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: * E.g:
* *
* const tag = TagUtils.ParseUploadableTag({"and": [ * const tag = TagUtils.ParseUploadableTag({"and": [

View file

@ -243,7 +243,10 @@ export default class TagRenderingConfig {
if (txt === "") { if (txt === "") {
throw context + " Rendering for language " + ln + " is empty" 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 continue
} }
if (txt.indexOf("{" + this.freeform.key + ":") >= 0) { 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 * 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 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 * @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 Translations from "../i18n/Translations"
import BaseUIElement from "../BaseUIElement" import BaseUIElement from "../BaseUIElement"
import { Store } from "../../Logic/UIEventSource" import { Store } from "../../Logic/UIEventSource"
import { Utils } from "../../Utils"
export default class Link extends BaseUIElement { export default class Link extends BaseUIElement {
private readonly _href: string | Store<string> private readonly _href: string | Store<string>
private readonly _embeddedShow: BaseUIElement private readonly _embeddedShow: BaseUIElement
private readonly _newTab: boolean private readonly _newTab: boolean
private readonly _download: string
constructor( constructor(
embeddedShow: BaseUIElement | string, embeddedShow: BaseUIElement | string,
href: string | Store<string>, href: string | Store<string>,
newTab: boolean = false newTab: boolean = false,
download: string = undefined
) { ) {
super() super()
this._download = download
this._embeddedShow = Translations.W(embeddedShow) this._embeddedShow = Translations.W(embeddedShow)
this._href = href this._href = href
this._newTab = newTab this._newTab = newTab
@ -58,6 +62,9 @@ export default class Link extends BaseUIElement {
if (this._newTab) { if (this._newTab) {
el.target = "_blank" el.target = "_blank"
} }
if (this._download) {
el.download = this._download
}
el.appendChild(embeddedShow) el.appendChild(embeddedShow)
return el return el
} }

View file

@ -1,76 +1,114 @@
<script lang="ts"> <script lang="ts">
import { Store, UIEventSource } from "../../../Logic/UIEventSource" import { UIEventSource } from "../../../Logic/UIEventSource";
import type { SpecialVisualizationState } from "../../SpecialVisualization" import type { SpecialVisualizationState } from "../../SpecialVisualization";
import Tr from "../../Base/Tr.svelte" import Tr from "../../Base/Tr.svelte";
import type { Feature } from "geojson" import type { Feature } from "geojson";
import type { Mapping } from "../../../Models/ThemeConfig/TagRenderingConfig" import type { Mapping } from "../../../Models/ThemeConfig/TagRenderingConfig";
import TagRenderingConfig from "../../../Models/ThemeConfig/TagRenderingConfig" import TagRenderingConfig from "../../../Models/ThemeConfig/TagRenderingConfig";
import { TagsFilter } from "../../../Logic/Tags/TagsFilter" import { TagsFilter } from "../../../Logic/Tags/TagsFilter";
import FreeformInput from "./FreeformInput.svelte" import FreeformInput from "./FreeformInput.svelte";
import Translations from "../../i18n/Translations.js" import Translations from "../../i18n/Translations.js";
import ChangeTagAction from "../../../Logic/Osm/Actions/ChangeTagAction" import ChangeTagAction from "../../../Logic/Osm/Actions/ChangeTagAction";
import { createEventDispatcher, onDestroy } from "svelte" import { createEventDispatcher, onDestroy } from "svelte";
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig" import LayerConfig from "../../../Models/ThemeConfig/LayerConfig";
import SpecialTranslation from "./SpecialTranslation.svelte" import SpecialTranslation from "./SpecialTranslation.svelte";
import TagHint from "../TagHint.svelte" import TagHint from "../TagHint.svelte";
import LoginToggle from "../../Base/LoginToggle.svelte" import LoginToggle from "../../Base/LoginToggle.svelte";
import SubtleButton from "../../Base/SubtleButton.svelte" import SubtleButton from "../../Base/SubtleButton.svelte";
import Loading from "../../Base/Loading.svelte" import Loading from "../../Base/Loading.svelte";
import TagRenderingMappingInput from "./TagRenderingMappingInput.svelte" import TagRenderingMappingInput from "./TagRenderingMappingInput.svelte";
import { Translation } from "../../i18n/Translation" import { Translation } from "../../i18n/Translation";
import Constants from "../../../Models/Constants" import Constants from "../../../Models/Constants";
import { Unit } from "../../../Models/Unit" import { Unit } from "../../../Models/Unit";
import UserRelatedState from "../../../Logic/State/UserRelatedState" import UserRelatedState from "../../../Logic/State/UserRelatedState";
import { twJoin } from "tailwind-merge" import { twJoin } from "tailwind-merge";
import { TagUtils } from "../../../Logic/Tags/TagUtils";
export let config: TagRenderingConfig export let config: TagRenderingConfig;
export let tags: UIEventSource<Record<string, string>> export let tags: UIEventSource<Record<string, string>>;
export let selectedElement: Feature export let selectedElement: Feature;
export let state: SpecialVisualizationState export let state: SpecialVisualizationState;
export let layer: LayerConfig 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 // Will be bound if a freeform is available
let freeformInput = new UIEventSource<string>(tags?.[config.freeform?.key]) let freeformInput = new UIEventSource<string>(tags?.[config.freeform?.key]);
let selectedMapping: number = undefined let selectedMapping: number = undefined;
let checkedMappings: boolean[] let checkedMappings: boolean[];
$: {
let tgs = $tags /**
mappings = config.mappings?.filter((m) => { * Prepares and fills the checkedMappings
*/
function initialize(tgs: Record<string, string>, confg: TagRenderingConfig) {
mappings = confg.mappings?.filter((m) => {
if (typeof m.hideInAnswer === "boolean") { 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 // 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 ( if (
config.mappings?.length > 0 && confg.mappings?.length > 0 &&
(checkedMappings === undefined || checkedMappings?.length + 1 < config.mappings.length) (checkedMappings === undefined || checkedMappings?.length < confg.mappings.length + (confg.freeform ? 1 : 0))
) { ) {
const seenFreeforms = [];
TagUtils.FlattenMultiAnswer()
checkedMappings = [ checkedMappings = [
...config.mappings.map((_) => false), ...confg.mappings.map((mapping) => {
false /*One element extra in case a freeform value is added*/, 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) { return matches;
if (!config.multiAnswer) { })
// Somehow, setting multianswer freeform values is broken if this is not set ];
freeformInput.setData(tgs[config.freeform.key])
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 { } 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 { try {
@ -79,10 +117,10 @@
selectedMapping, selectedMapping,
checkedMappings, checkedMappings,
tags.data tags.data
) );
} catch (e) { } catch (e) {
console.error("Could not calculate changeSpecification:", e) console.error("Could not calculate changeSpecification:", e);
selectedTags = undefined selectedTags = undefined;
} }
} }
@ -91,53 +129,53 @@
config: TagRenderingConfig config: TagRenderingConfig
applied: TagsFilter applied: TagsFilter
} }
}>() }>();
function onSave() { function onSave() {
if (selectedTags === undefined) { if (selectedTags === undefined) {
return return;
} }
if (layer.source === null) { if (layer.source === null) {
/** /**
* This is a special, priviliged layer. * This is a special, priviliged layer.
* We simply apply the tags onto the records * 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) { for (const { k, v } of kv) {
if (v === undefined) { if (v === undefined) {
delete tags.data[k] delete tags.data[k];
} else { } else {
tags.data[k] = v tags.data[k] = v;
} }
} }
tags.ping() tags.ping();
return return;
} }
dispatch("saved", { config, applied: selectedTags }) dispatch("saved", { config, applied: selectedTags });
const change = new ChangeTagAction(tags.data.id, selectedTags, tags.data, { const change = new ChangeTagAction(tags.data.id, selectedTags, tags.data, {
theme: state.layout.id, theme: state.layout.id,
changeType: "answer", changeType: "answer"
}) });
freeformInput.setData(undefined) freeformInput.setData(undefined);
selectedMapping = undefined selectedMapping = undefined;
selectedTags = undefined selectedTags = undefined;
change change
.CreateChangeDescriptions() .CreateChangeDescriptions()
.then((changes) => state.changes.applyChanges(changes)) .then((changes) => state.changes.applyChanges(changes))
.catch(console.error) .catch(console.error);
} }
let featureSwitchIsTesting = state.featureSwitchIsTesting let featureSwitchIsTesting = state.featureSwitchIsTesting;
let featureSwitchIsDebugging = state.featureSwitches.featureSwitchIsDebugging let featureSwitchIsDebugging = state.featureSwitches.featureSwitchIsDebugging;
let showTags = state.userRelatedState.showTags let showTags = state.userRelatedState.showTags;
let numberOfCs = state.osmConnection.userDetails.data.csCount let numberOfCs = state.osmConnection.userDetails.data.csCount;
onDestroy( onDestroy(
state.osmConnection.userDetails.addCallbackAndRun((ud) => { state.osmConnection.userDetails.addCallbackAndRun((ud) => {
numberOfCs = ud.csCount numberOfCs = ud.csCount;
}) })
) );
</script> </script>
{#if config.question !== undefined} {#if config.question !== undefined}

View file

@ -1155,19 +1155,24 @@ export default class SpecialVisualizations {
name: "class", name: "class",
doc: "CSS-classes to add to the element", 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( constr(
state: SpecialVisualizationState, state: SpecialVisualizationState,
tagSource: UIEventSource<Record<string, string>>, tagSource: UIEventSource<Record<string, string>>,
args: string[] args: string[]
): BaseUIElement { ): BaseUIElement {
const [text, href, classnames] = args const [text, href, classnames, download] = args
return new VariableUiElement( return new VariableUiElement(
tagSource.map((tags) => tagSource.map((tags) =>
new Link( new Link(
Utils.SubstituteKeys(text, tags), Utils.SubstituteKeys(text, tags),
Utils.SubstituteKeys(href, tags), Utils.SubstituteKeys(href, tags),
true download === undefined,
Utils.SubstituteKeys(download, tags)
).SetClass(classnames) ).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( public static SubstituteKeys(
txt: string | undefined, txt: string | undefined,
tags?: Record<string, any>, tags: Record<string, any> | undefined,
useLang?: string useLang?: string
): string | undefined { ): string | undefined {
if (txt === undefined) { if (txt === undefined) {