From 14594b286dd2278bc64ed27f0305b76596d7e190 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Sat, 13 Jan 2024 01:58:18 +0100 Subject: [PATCH 01/18] Fix: turn favourites black again, sync them globally --- assets/layers/favourite/favourite.proto.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/assets/layers/favourite/favourite.proto.json b/assets/layers/favourite/favourite.proto.json index 7ad0e3d256..14be372ce2 100644 --- a/assets/layers/favourite/favourite.proto.json +++ b/assets/layers/favourite/favourite.proto.json @@ -18,7 +18,7 @@ } ] }, - "color": "red" + "color": "black" } ] } @@ -43,5 +43,6 @@ }, "tagRenderings": [ - ] + ], + "syncSelection": "global" } From ac74fd2683e842380b2c506e1d43ddff93cfee53 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 10 Jan 2024 23:51:30 +0000 Subject: [PATCH 02/18] Translated using Weblate (English) Currently translated at 100.0% (601 of 601 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/en/ --- langs/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/langs/en.json b/langs/en.json index 9437cba7ea..00f75c850b 100644 --- a/langs/en.json +++ b/langs/en.json @@ -366,7 +366,7 @@ "testing": "Testing - changes won't be saved", "uploadError": "Error while uploading changes: {error}", "uploadGpx": { - "choosePermission": "Choose below if your track should be shared:", + "choosePermission": "Choose below how your track should be shared:", "confirm": "Confirm upload", "gpxServiceOffline": "The GPX-service is currently offline - uploading is currently not possible. Try again later.", "intro0": "By uploading your track, OpenStreetMap.org will retain a full copy of the track.", From 8452e146bebe62016a74b0fa6bc0fd747d4bdbae Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 10 Jan 2024 14:35:19 +0000 Subject: [PATCH 03/18] Translated using Weblate (English) Currently translated at 100.0% (465 of 465 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/en/ --- langs/themes/en.json | 80 ++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/langs/themes/en.json b/langs/themes/en.json index 98c79d1807..477cfc1708 100644 --- a/langs/themes/en.json +++ b/langs/themes/en.json @@ -842,7 +842,7 @@ "hackerspaces": { "description": "On this map you can see hackerspaces, add a new hackerspace or update data directly", "shortDescription": "A map of hackerspaces", - "title": "Hackerspaces" + "title": "Hackerspaces and makerspaces" }, "hailhydrant": { "description": "On this map you can find and update hydrants, fire stations, ambulance stations, and extinguishers in your favorite neighborhoods.", @@ -918,6 +918,13 @@ } } }, + "10": { + "options": { + "0": { + "question": "Exclude etymology theme" + } + } + }, "2": { "options": { "0": { @@ -973,13 +980,6 @@ "question": "Exclude GRB theme" } } - }, - "10": { - "options": { - "0": { - "question": "Exclude etymology theme" - } - } } }, "name": "Changeset centers", @@ -1056,6 +1056,33 @@ "onwheels": { "description": "On this map, publicly weelchair accessible places are shown and can be easily added", "layers": { + "19": { + "override": { + "=title": { + "render": "Statistics" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "Import" + } + } + }, + "1": { + "render": { + "special": { + "message": "Add all the suggested tags" + } + } + } + } + } + }, "4": { "override": { "filter": { @@ -1098,33 +1125,6 @@ "override": { "name": "Disabled parking spaces" } - }, - "19": { - "override": { - "=title": { - "render": "Statistics" - } - } - }, - "20": { - "override": { - "+tagRenderings": { - "0": { - "render": { - "special": { - "text": "Import" - } - } - }, - "1": { - "render": { - "special": { - "message": "Add all the suggested tags" - } - } - } - } - } } }, "title": "OnWheels" @@ -1285,10 +1285,6 @@ "stations": { "description": "View, edit and add details to a train station", "layers": { - "3": { - "description": "Layer showing train stations", - "name": "Train Stations" - }, "16": { "description": "Displays showing the trains that will leave from this station", "name": "Departures boards", @@ -1320,6 +1316,10 @@ "title": { "render": "Departures board" } + }, + "3": { + "description": "Layer showing train stations", + "name": "Train Stations" } }, "title": "Train Stations" @@ -1498,4 +1498,4 @@ "shortDescription": "A map with waste baskets", "title": "Waste Basket" } -} \ No newline at end of file +} From 4529bd7d96151e435deb4ec147f78ed7f841c9fc Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Wed, 10 Jan 2024 15:05:08 +0000 Subject: [PATCH 04/18] Translated using Weblate (Spanish) Currently translated at 90.7% (422 of 465 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/es/ --- langs/themes/es.json | 145 ++++++++++++++++++++++++++++++++----------- 1 file changed, 108 insertions(+), 37 deletions(-) diff --git a/langs/themes/es.json b/langs/themes/es.json index 8adada4d93..e1a6aa3577 100644 --- a/langs/themes/es.json +++ b/langs/themes/es.json @@ -464,7 +464,7 @@ "description": "Este mapa muestra redes de nodos ciclistas y te permita añadir nodos nuevos de manera sencilla", "layers": { "0": { - "name": "enlaces nodo a nodo", + "name": "Vínculos entre nodos", "tagRenderings": { "node2node-survey:date": { "override": { @@ -476,19 +476,34 @@ "title": { "mappings": { "0": { - "then": "enlace nodo a nodo {ref}" + "then": "Vínculos entre nodos {ref}" } }, - "render": "enlace nodo a nodo" + "render": "Vínculos entre nodos" } }, "1": { - "name": "nodos", + "name": "Nodos", + "presets": { + "0": { + "title": "un nodo cíclico" + } + }, "tagRenderings": { "node-expected_rcn_route_relations": { + "freeform": { + "placeholder": "Por ejemplo, 3" + }, "question": "¿A cuántos otros nodos ciclistas enlaza este nodo?", "render": "Este nodo enlaza a {expected_rcn_route_relations} otros nodos ciclistas." }, + "node-rxn_ref": { + "freeform": { + "placeholder": "Por ejemplo, 1" + }, + "question": "¿Cuál es el número de referencia de este nodo cíclico?", + "render": "Este nodo cíclico tiene el número de referencia {rcn_ref}" + }, "node-survey:date": { "override": { "question": "¿Cuándo fue sondeado este nodo ciclista por última vez?", @@ -500,10 +515,30 @@ "mappings": { "0": { "then": "nodo ciclista {rcn_ref}" + }, + "1": { + "then": "Nodo de ciclo propuesto {proposed:rcn_ref}" } }, "render": "nodo ciclista" } + }, + "2": { + "override": { + "name": "Indicadores de ciclismo", + "title": { + "render": "Hito ciclista" + } + } + }, + "3": { + "override": { + "presets": { + "0": { + "title": "Un marcador de ruta para un enlace de nodo a nodo" + } + } + } } }, "title": "Redes de Nodos Ciclistas" @@ -746,6 +781,21 @@ "layers": { "0": { "override": { + "filter+": { + "0": { + "options": { + "0": { + "question": "No se prefiere ningún tipo de aceite" + }, + "1": { + "question": "Solo muestra freiduras que utilizan aceite vegetal" + }, + "2": { + "question": "Solo muestra freiduras que utilizan aceite animal" + } + } + } + }, "name": "Tienda de patatas fritas" } } @@ -792,7 +842,7 @@ "hackerspaces": { "description": "En este mapa puedes ver hackerspaces, añadir un nuevo hackerspace o actualizar datos directamente", "shortDescription": "Un mapa de hackerspaces", - "title": "Hackerspaces" + "title": "Hackerspaces and makerspaces" }, "hailhydrant": { "description": "En este mapa puedes encontrar y actualizar hidrantes contra incendios, estaciones de bomberos, estaciones de ambulancias y extintores en tus vecindarios favoritos.", @@ -824,6 +874,10 @@ "description": "En este mapa encontrarás hoteles en tu zona", "title": "Hoteles" }, + "icecream": { + "description": "Mapa de heladerías y máquinas expendedoras de helados", + "title": "Helado" + }, "indoors": { "description": "En este mapa se muestran los lugares cubiertos de acceso público", "title": "En interiores" @@ -844,6 +898,23 @@ }, "title": "Bordillos y cruces" }, + "mapcomplete-changes": { + "description": "Este mapa muestra todos los cambios realizados con MapComplete", + "layers": { + "0": { + "description": "Muestra todos los cambios de MapComplete", + "filter": { + "0": { + "options": { + "0": { + "question": "El nombre del tema contiene {search}" + } + } + } + } + } + } + }, "maproulette": { "description": "Tema que muestra las tareas de MapRoulette, permitiendo buscarlas, filtrarlas y arreglarlas.", "title": "Tareas de MapRoulette" @@ -875,6 +946,33 @@ "onwheels": { "description": "En este mapa se muestran los lugares accesibles al público en silla de ruedas, que pueden añadirse fácilmente", "layers": { + "19": { + "override": { + "=title": { + "render": "Estadísticas" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "Importar" + } + } + }, + "1": { + "render": { + "special": { + "message": "Añadir todas las etiquetas sugeridas" + } + } + } + } + } + }, "4": { "override": { "filter": { @@ -917,33 +1015,6 @@ "override": { "name": "Plazas de aparcamiento para discapacitados" } - }, - "19": { - "override": { - "=title": { - "render": "Estadísticas" - } - } - }, - "20": { - "override": { - "+tagRenderings": { - "0": { - "render": { - "special": { - "text": "Importar" - } - } - }, - "1": { - "render": { - "special": { - "message": "Añadir todas las etiquetas sugeridas" - } - } - } - } - } } }, "title": "Sobre ruedas" @@ -1104,10 +1175,6 @@ "stations": { "description": "Ver, editar y añadir detalles a una estación de tren", "layers": { - "3": { - "description": "Capa que muestra las estaciones de tren", - "name": "Estación de Tren" - }, "16": { "description": "Pantallas que muestran los trenes que saldrán de esta estación", "name": "Tableros de salidas", @@ -1139,6 +1206,10 @@ "title": { "render": "Tablero de salidas" } + }, + "3": { + "description": "Capa que muestra las estaciones de tren", + "name": "Estación de Tren" } }, "title": "Estaciones de tren" @@ -1260,4 +1331,4 @@ "shortDescription": "Un mapa con papeleras", "title": "Papeleras" } -} \ No newline at end of file +} From 4ac8ff0de03116122286bd50d12015f37a238ad7 Mon Sep 17 00:00:00 2001 From: kjon Date: Fri, 12 Jan 2024 21:20:43 +0000 Subject: [PATCH 05/18] Translated using Weblate (German) Currently translated at 87.8% (528 of 601 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/ --- langs/de.json | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/langs/de.json b/langs/de.json index bb1d42e211..4a59b2853f 100644 --- a/langs/de.json +++ b/langs/de.json @@ -60,12 +60,13 @@ "unmark": "Von persönlicher Liste bevorzugter Standorte entfernen", "unmarkNotDeleted": "Dieser Punkt wird nicht gelöscht und ist weiterhin auf der entsprechenden Karte für dich und andere sichtbar" }, - "downloadGeojson": "Lade deine Favoriten als geojson herunter", - "downloadGpx": "Lade deine Favoriten als GPX herunter", - "intro": "Du hast {length} Orte als Lieblingsort markiert.", + "downloadGeojson": "Favoriten als geojson herunterladen", + "downloadGpx": "Favoriten als GPX herunterladen", + "intro": "Du hast {length} Orte als Favorit markiert.", "introPrivacy": "Diese Liste ist nur für dich sichtbar", "loginToSeeList": "Melde dich an, um die Liste der Orte zu sehen, die du als Favoriten markiert hast", - "tab": "Deine Favoriten" + "tab": "Deine Favoriten", + "title": "Ausgewählte Orte" }, "flyer": { "aerial": "Diese Karte verwendet einen anderen Hintergrund, nämlich Luftaufnahmen der Agentschap Informatie Vlaanderen", @@ -416,12 +417,16 @@ "hotkeyDocumentation": { "action": "Aktion", "closeSidebar": "Seitenleiste schließen", - "geolocate": "Verschieben Sie die Karte auf den aktuellen Standort oder zoomen Sie die Karte auf den aktuellen Standort. Beantragt Standortberechtigung", + "geolocate": "Karte auf den aktuellen Standort verschieben oder zoomen. Erfordert Standortberechtigung", "intro": "MapComplete unterstützt folgende Tastaturbefehle:", "key": "Tastenkombination", - "openLayersPanel": "Öffnet das Menü für Ebenen und Filter", + "openLayersPanel": "Auswahl für Hintergrundebenen öffnen", "selectAerial": "Hintergrund als Luftbild oder Satellitenbild einstellen. Wechselt zwischen den zwei besten verfügbaren Ebenen", - "selectItem": "Wähle das POI, das dem Kartenmittelpunkt (Fadenkreuz) am nächsten liegt. Nur wenn die Tastaturnavigation verwendet wird", + "selectFavourites": "Favoriten anzeigen", + "selectItem": "Objekt auswählen, das dem Kartenmittelpunkt (Fadenkreuz) am nächsten liegt. Nur wenn die Tastaturnavigation verwendet wird", + "selectItem2": "Objekt auswählen, das dem Kartenmittelpunkt (Fadenkreuz) am zweitnächsten liegt. Nur wenn die Tastaturnavigation verwendet wird", + "selectItem3": "Objekt auswählen, das dem Kartenmittelpunkt (Fadenkreuz) am drittnächsten liegt. Nur wenn die Tastaturnavigation verwendet wird", + "selectItemI": "Objekt auswählen, das dem Kartenmittelpunkt (Fadenkreuz) am viertnächsten liegt. Nur wenn die Tastaturnavigation verwendet wird", "selectMap": "Karte aus externer Quelle als Hintergrund wählen. Wechselt zwischen den zwei besten verfügbaren Ebenen", "selectMapnik": "OpenStreetMap-carto als Hintergrundebene wählen", "selectOsmbasedmap": "OpenStreetMap-basierte Karte als Hintergrund auswählen (oder Hintergrundebene deaktivieren)", From 3f3d03a603ac530cb55d6782dd908ada4a602157 Mon Sep 17 00:00:00 2001 From: Ettore Atalan Date: Sat, 13 Jan 2024 09:05:18 +0000 Subject: [PATCH 06/18] Translated using Weblate (German) Currently translated at 93.5% (562 of 601 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/ --- langs/de.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/langs/de.json b/langs/de.json index 4a59b2853f..d9a6a85a62 100644 --- a/langs/de.json +++ b/langs/de.json @@ -174,12 +174,14 @@ "openIssueTracker": "Fehler melden", "openMapillary": "Mapillary öffnen", "openOsmcha": "Neueste Bearbeitungen mit {theme} ansehen", + "seeOnMapillary": "Dieses Bild auf Mapillary ansehen", "themeBy": "Dieses Thema wurde erstellt von {author}", "title": "Copyright und Urheberrechtsangabe", "translatedBy": "MapComplete wurde übersetzt von {contributors} und {hiddenCount} weiteren Personen" }, "back": "Zurück", "backToIndex": "Zur Übersicht aller Themenkarten", + "backToMap": "Zurück zur Karte", "backgroundMap": "Hintergrundkarte auswählen", "backgroundSwitch": "Hintergrund wechseln", "cancel": "Abbrechen", @@ -225,6 +227,13 @@ "histogram": { "error_loading": "Das Histogramm konnte nicht geladen werden" }, + "labels": { + "background": "Hintergrund ändern", + "filter": "Daten filtern", + "menu": "Menü", + "zoomIn": "Hineinzoomen", + "zoomOut": "Herauszoomen" + }, "layerSelection": { "title": "Ebenen auswählen", "zoomInToSeeThisLayer": "Ausschnitt vergrößern, um Ebene anzuzeigen" @@ -273,7 +282,9 @@ "closed_permanently": "Geschlossen auf unbestimmte Zeit", "closed_until": "Geschlossen bis {date}", "error_loading": "Fehler: Diese Öffnungszeiten können nicht angezeigt werden.", + "friday": "Am Freitag {ranges}", "loadingCountry": "Land ermitteln…", + "monday": "Am Montag {ranges}", "not_all_rules_parsed": "Die Öffnungszeiten sind kompliziert. Folgenden Regeln werden im Eingabefenster ignoriert:", "openTill": "bis", "open_24_7": "Durchgehend geöffnet", @@ -282,7 +293,15 @@ "ph_closed": "geschlossen", "ph_not_known": " ", "ph_open": "geöffnet", - "ph_open_as_usual": "geöffnet wie üblich" + "ph_open_as_usual": "geöffnet wie üblich", + "ranges": "von {starttime} bis {endtime}", + "rangescombined": "{range0} und {range1}", + "saturday": "Am Samstag {ranges}", + "sunday": "Am Sonntag {ranges}", + "thursday": "Am Donnerstag {ranges}", + "tuesday": "Am Dienstag {ranges}", + "unknown": "Die Öffnungszeiten sind unbekannt", + "wednesday": "Am Mittwoch {ranges}" }, "osmLinkTooltip": "Dieses Element auf OpenStreetMap öffnen, um Verlauf und Bearbeitungsmöglichkeiten anzuzeigen", "pdf": { @@ -291,7 +310,7 @@ "generatedWith": "Erstellt mit mapcomplete.org/{layoutid}", "versionInfo": "v{version} - erstellt am {date}" }, - "pickLanguage": "Sprache auswählen: ", + "pickLanguage": "Sprache auswählen", "poweredByOsm": "Unterstützt von OpenStreetMap", "questionBox": { "answeredMultiple": "Du hast {answered} Fragen beantwortet", @@ -325,6 +344,7 @@ "searchShort": "Suche…", "searching": "Suchen …" }, + "share": "Teilen", "sharescreen": { "copiedToClipboard": "Verknüpfung in Zwischenablage kopiert", "documentation": "Für weitere Informationen über verfügbare URL-Parameter, siehe Dokumentation", @@ -370,6 +390,27 @@ "uploadingChanges": "Änderungen werden hochgeladen…", "useSearch": "Verwenden Sie die Suche oben, um Voreinstellungen anzuzeigen", "useSearchForMore": "Verwenden Sie die Suchfunktion, um innerhalb von {total} weitere Werte zu suchen…", + "visualFeedback": { + "directionsAbsolute": { + "E": "Ost", + "N": "Nord", + "NE": "Nordost", + "NW": "Nordwest", + "S": "Süd", + "SE": "Südost", + "SW": "Südwest", + "W": "West" + }, + "directionsRelative": { + "left": "links", + "right": "rechts", + "sharp_left": "scharf links", + "sharp_right": "scharf rechts", + "slight_left": "leicht links", + "slight_right": "leicht rechts", + "straight": "geradeaus" + } + }, "waitingForGeopermission": "Warten auf Ihre Erlaubnis, Standortdaten zu verwenden…", "waitingForLocation": "Ihr Standort wird gesucht…", "weekdays": { From 7bbe4196eb9b6beb4455ef6e4c742c66ab3beff7 Mon Sep 17 00:00:00 2001 From: Ettore Atalan Date: Sat, 13 Jan 2024 09:04:49 +0000 Subject: [PATCH 07/18] Translated using Weblate (German) Currently translated at 100.0% (465 of 465 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/de/ --- langs/themes/de.json | 80 ++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/langs/themes/de.json b/langs/themes/de.json index c20fd97c88..672a46b9c8 100644 --- a/langs/themes/de.json +++ b/langs/themes/de.json @@ -842,7 +842,7 @@ "hackerspaces": { "description": "Auf dieser Karte können Sie Hackerspaces sehen, einen neuen Hackerspace hinzufügen oder Daten direkt aktualisieren", "shortDescription": "Eine Karte von Hackerspaces", - "title": "Hackerspaces" + "title": "Hackerspaces und Makerspaces" }, "hailhydrant": { "description": "Auf dieser Karte können Sie Hydranten, Feuerwachen, Krankenwagen und Feuerlöscher in Ihren bevorzugten Stadtvierteln finden und aktualisieren.", @@ -918,6 +918,13 @@ } } }, + "10": { + "options": { + "0": { + "question": "Etymologie-Thema ausschließen" + } + } + }, "2": { "options": { "0": { @@ -973,13 +980,6 @@ "question": "GRB-Theme ausschließen" } } - }, - "10": { - "options": { - "0": { - "question": "Etymologie-Thema ausschließen" - } - } } }, "name": "Zentrum der Änderungssätze", @@ -1056,6 +1056,33 @@ "onwheels": { "description": "Auf dieser Karte können Sie öffentlich zugängliche Orte für Rollstuhlfahrer ansehen, bearbeiten oder hinzufügen", "layers": { + "19": { + "override": { + "=title": { + "render": "Statistik" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "Import" + } + } + }, + "1": { + "render": { + "special": { + "message": "Alle vorgeschlagenen Tags hinzufügen" + } + } + } + } + } + }, "4": { "override": { "filter": { @@ -1098,33 +1125,6 @@ "override": { "name": "Barrierefreie Parkplätze" } - }, - "19": { - "override": { - "=title": { - "render": "Statistik" - } - } - }, - "20": { - "override": { - "+tagRenderings": { - "0": { - "render": { - "special": { - "text": "Import" - } - } - }, - "1": { - "render": { - "special": { - "message": "Alle vorgeschlagenen Tags hinzufügen" - } - } - } - } - } } }, "title": "Auf Rädern" @@ -1285,10 +1285,6 @@ "stations": { "description": "Bahnhofsdetails ansehen, bearbeiten und hinzufügen", "layers": { - "3": { - "description": "Ebene mit Bahnhöfen", - "name": "Bahnhöfe" - }, "16": { "description": "Anzeigen der Züge, die von diesem Bahnhof abfahren", "name": "Abfahrtstafeln", @@ -1320,6 +1316,10 @@ "title": { "render": "Abfahrtstafel" } + }, + "3": { + "description": "Ebene mit Bahnhöfen", + "name": "Bahnhöfe" } }, "title": "Bahnhöfe" @@ -1498,4 +1498,4 @@ "shortDescription": "Eine Karte mit Abfalleimern", "title": "Abfalleimer" } -} \ No newline at end of file +} From 64f6090c447cf5954a122bf6bb3a7ef6bea7f8b1 Mon Sep 17 00:00:00 2001 From: kjon Date: Sun, 14 Jan 2024 17:42:35 +0000 Subject: [PATCH 08/18] Translated using Weblate (German) Currently translated at 98.4% (3132 of 3182 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/de/ --- langs/layers/de.json | 849 +++++++++++++++++++++++++------------------ 1 file changed, 489 insertions(+), 360 deletions(-) diff --git a/langs/layers/de.json b/langs/layers/de.json index 46d5c4cc0d..ce42f1fb86 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -35,6 +35,16 @@ "1": { "title": "eine freistehende Posterbox" }, + "10": { + "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", + "title": "ein Schild" + }, + "11": { + "title": "eine Skulptur" + }, + "12": { + "title": "eine Wandmalerei" + }, "2": { "title": "eine wandmontierte Posterbox" }, @@ -61,16 +71,6 @@ }, "9": { "title": "ein Totem" - }, - "10": { - "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", - "title": "ein Schild" - }, - "11": { - "title": "eine Skulptur" - }, - "12": { - "title": "eine Wandmalerei" } }, "tagRenderings": { @@ -165,6 +165,9 @@ "1": { "then": "Dies ist ein Brett" }, + "10": { + "then": "Dies ist eine Wandmalerei" + }, "2": { "then": "Dies ist eine Litfaßsäule" }, @@ -188,9 +191,6 @@ }, "9": { "then": "Dies ist ein Totem" - }, - "10": { - "then": "Dies ist eine Wandmalerei" } }, "question": "Welche Art von Werbung ist das?", @@ -205,6 +205,9 @@ "1": { "then": "Brett" }, + "10": { + "then": "Wandmalerei" + }, "2": { "then": "Posterbox" }, @@ -228,9 +231,6 @@ }, "9": { "then": "Totem" - }, - "10": { - "then": "Wandmalerei" } } } @@ -353,6 +353,15 @@ "1": { "then": "Wandbild" }, + "10": { + "then": "Azulejo (spanische dekorative Fliesenarbeit)" + }, + "11": { + "then": "Fliesenarbeit" + }, + "12": { + "then": "Holzschnitzerei" + }, "2": { "then": "Malerei" }, @@ -376,15 +385,6 @@ }, "9": { "then": "Relief" - }, - "10": { - "then": "Azulejo (spanische dekorative Fliesenarbeit)" - }, - "11": { - "then": "Fliesenarbeit" - }, - "12": { - "then": "Holzschnitzerei" } }, "question": "Um welche Art Kunstwerk handelt es sich?", @@ -1942,30 +1942,6 @@ "1": { "question": "Verfügt über einen
Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)
" }, - "2": { - "question": "Verfügt über einen
europäischen Netzstecker mit Erdungsstift (CEE7/4 Typ E)
Anschluss" - }, - "3": { - "question": "Verfügt über einen
Chademo
Stecker" - }, - "4": { - "question": "Verfügt über einen
Typ 1 (J1772)
Stecker mit Kabel" - }, - "5": { - "question": "Verfügt über einen
Typ 1 (J1772)Stecker ohne Kabel
" - }, - "6": { - "question": "Verfügt über einen
Typ 1 CCS (Typ 1 Combo)
Stecker" - }, - "7": { - "question": "Verfügt über einen
Tesla Supercharger
Stecker" - }, - "8": { - "question": "Hat einen
Typ 2 (Mennekes)
Anschluss" - }, - "9": { - "question": "Hat einen
Typ 2 CCS (Mennekes)
Anschluss" - }, "10": { "question": "Hat einen
Typ 2 (Mennekes)
Anschluss mit Kabel" }, @@ -1986,6 +1962,30 @@ }, "16": { "question": "Hat einen
Bosch Active Connect Anschluss mit 5 Pins
und Kabel" + }, + "2": { + "question": "Verfügt über einen
europäischen Netzstecker mit Erdungsstift (CEE7/4 Typ E)
Anschluss" + }, + "3": { + "question": "Verfügt über einen
Chademo
Stecker" + }, + "4": { + "question": "Verfügt über einen
Typ 1 (J1772)
Stecker mit Kabel" + }, + "5": { + "question": "Verfügt über einen
Typ 1 (J1772)Stecker ohne Kabel
" + }, + "6": { + "question": "Verfügt über einen
Typ 1 CCS (Typ 1 Combo)
Stecker" + }, + "7": { + "question": "Verfügt über einen
Tesla Supercharger
Stecker" + }, + "8": { + "question": "Hat einen
Typ 2 (Mennekes)
Anschluss" + }, + "9": { + "question": "Hat einen
Typ 2 CCS (Mennekes)
Anschluss" } } } @@ -2041,30 +2041,6 @@ "1": { "then": "Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)" }, - "2": { - "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" - }, - "3": { - "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" - }, - "4": { - "then": "Chademo-Anschluss" - }, - "5": { - "then": "Chademo-Anschluss" - }, - "6": { - "then": "Typ 1 mit Kabel (J1772)" - }, - "7": { - "then": "Typ 1 mit Kabel (J1772)" - }, - "8": { - "then": "Typ 1 ohne Kabel (J1772)" - }, - "9": { - "then": " Typ 1 ohne Kabel (J1772)" - }, "10": { "then": "Typ 1 CCS (Typ 1 Combo)" }, @@ -2095,6 +2071,9 @@ "19": { "then": "Typ 2 mit Kabel (mennekes)" }, + "2": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, "20": { "then": "Tesla Supercharger CCS (Typ 2 CSS von Tesla)" }, @@ -2125,11 +2104,32 @@ "29": { "then": " Bosch Active Connect mit 3 Pins und Kabel" }, + "3": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, "30": { "then": "Bosch Active Connect mit 5 Pins und Kabel" }, "31": { "then": " Bosch Active Connect mit 5 Pins und Kabel" + }, + "4": { + "then": "Chademo-Anschluss" + }, + "5": { + "then": "Chademo-Anschluss" + }, + "6": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "7": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "8": { + "then": "Typ 1 ohne Kabel (J1772)" + }, + "9": { + "then": " Typ 1 ohne Kabel (J1772)" } }, "question": "Welche Ladeanschlüsse gibt es hier?" @@ -2226,7 +2226,7 @@ "then": "Für den Zugang zur Station muss ein Schlüssel angefordert werden
z.B. eine von einem Hotel betriebene Ladestation, die nur von dessen Gästen genutzt werden kann, die an der Rezeption einen Schlüssel erhalten, um die Ladestation aufzuschließen" }, "4": { - "then": "Die Station ist nicht für die Allgemeinheit zugänglich (z. B. nur für die Eigentümer, Mitarbeiter, …)" + "then": "Die Station ist nicht für die Allgemeinheit zugänglich (z. B. nur für die Eigentümer, Mitarbeiter, ...)" }, "5": { "then": "Diese Ladestation ist zu gewissen Öffnungszeiten oder Bedingungen öffentlich zugänglich. Einschränkungen sind möglich, aber generelle Nutzung ist erlaubt." @@ -2259,7 +2259,7 @@ "then": "Kostenlose Nutzung" }, "3": { - "then": "Die Nutzung ist kostenpflichtig, aber für Kunden des Betreibers der Einrichtung, wie Hotel, Krankenhaus, … kostenlos" + "then": "Die Nutzung ist kostenpflichtig, aber für Kunden des Betreibers der Einrichtung, wie Hotel, Krankenhaus, ... kostenlos" }, "4": { "then": "Die Nutzung ist kostenpflichtig" @@ -2304,7 +2304,67 @@ "mappings": { "then": "{{description}} liefert maximal {{commonCurrent}} A" }, - "question": "Welchen Strom bieten die Stecker mit {{description}}?" + "question": "Welchen Strom bieten die Stecker mit {{description}}?", + "render": "{{description}} liefert maximal {canonical({{key}}:current)}" + }, + "3": { + "mappings": { + "then": "{{description}} liefert maximal {{commonOutput}} A" + }, + "question": "Welche Leistung liefert ein einzelner Stecker des Typs {{description}}?", + "render": "{{description}} liefert maximal {canonical({{key}}:output)}" + } + }, + "rewrite": { + "into": { + "0": { + "2": "Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)" + }, + "1": { + "2": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, + "10": { + "2": "Tesla Supercharger CCS (Typ 2 CSS von Tesla)" + }, + "11": { + "2": "Tesla Supercharger (Destination)" + }, + "12": { + "2": "Tesla Supercharger (Destination) (Typ 2 mit Kabel von Tesla)" + }, + "13": { + "2": "USB zum Aufladen von Handys und kleinen Elektrogeräten" + }, + "14": { + "2": " Bosch Active Connect mit 3 Pins und Kabel" + }, + "15": { + "2": " Bosch Active Connect mit 5 Pins und Kabel" + }, + "2": { + "2": "Chademo-Stecker" + }, + "3": { + "2": "Typ 1 mit Kabel (J1772)" + }, + "4": { + "2": " Typ 1 ohne Kabel (J1772)" + }, + "5": { + "2": "Typ 1 CCS (Typ 1 Combo)" + }, + "6": { + "2": "Tesla Supercharger" + }, + "7": { + "2": "Typ 2 (Mennekes)" + }, + "8": { + "2": "Typ 2 CCS (Mennekes)" + }, + "9": { + "2": "Typ 2 mit Kabel (Mennekes)" + } } } }, @@ -3081,6 +3141,15 @@ "1": { "then": "Dieser Radweg hat einen festen Belag" }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" + }, "2": { "then": "Der Radweg ist aus Asphalt" }, @@ -3104,15 +3173,6 @@ }, "9": { "then": "Der Radweg ist aus Schotter" - }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" } }, "question": "Was ist der Belag dieses Radwegs?", @@ -3161,6 +3221,15 @@ "1": { "then": "Dieser Radweg hat einen festen Belag" }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" + }, "2": { "then": "Der Radweg ist aus Asphalt" }, @@ -3184,15 +3253,6 @@ }, "9": { "then": "Der Radweg ist aus Schotter" - }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" } }, "question": "Was ist der Belag dieser Straße?", @@ -3340,6 +3400,18 @@ "question": "Wie breit ist der Abstand zwischen Radweg und Straße?", "render": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m" }, + "incline": { + "mappings": { + "0": { + "then": "Hier gibt es (wahrscheinlich) keine Steigung" + }, + "1": { + "then": "Die Straße hat eine Steigung" + } + }, + "question": "Hat {title()} eine Steigung?", + "render": "Die Straße hat {incline} Steigung" + }, "is lit?": { "mappings": { "0": { @@ -3632,6 +3704,9 @@ }, "1": { "then": "Dies ist ein Wasserhahn oder eine Wasserpumpe mit nicht trinkbarem Wasser.
Beispiele sind Wasserhähne mit Regenwasser zum Zapfen von Wasser für nahe gelegene Pflanzen
" + }, + "2": { + "then": "Dies ist eine historische, manuelle Wasserpumpe, an der kein Trinkwasser zu finden ist" } } }, @@ -3670,8 +3745,58 @@ "question": "Ist diese Trinkwasserstelle noch in Betrieb?", "render": "Der Betriebsstatus ist {operational_status}" }, + "bench-artwork": { + "mappings": { + "0": { + "then": "Die Trinkwasserstelle hat ein integriertes Kunstwerk" + }, + "1": { + "then": "Die Trinkwasserstelle hat kein integriertes Kunstwerk" + }, + "2": { + "then": "Die Trinkwasserstelle hat wahrscheinlich kein integriertes Kunstwerk" + } + }, + "question": "Verfügt der Trinkwasserbrunnen über ein künstlerisches Element?", + "questionHint": "Z.B. eine integrierte Statue oder andere künstlerische Werke" + }, + "fee": { + "mappings": { + "0": { + "then": "Die Nutzung ist kostenlos" + }, + "1": { + "then": "Die Nutzung ist kostenpflichtig" + } + }, + "question": "Kann diese Trinkwasserstelle kostenlos genutzt werden?" + }, + "opening_hours_24_7": { + "override": { + "+mappings": { + "0": { + "then": "Der Trinkwasserbrunnen ist derzeit nicht in Betrieb. Deshalb werden keine Öffnungszeiten angezeigt." + } + }, + "questionHint": "Dies sind die Öffnungszeiten des Trinkwasserbrunnens, wenn dieser in Betrieb ist." + } + }, "render-closest-drinking-water": { "render": "Eine weitere Trinkwasserstelle befindet sich in {_closest_other_drinking_water_distance} Meter" + }, + "seasonal": { + "mappings": { + "0": { + "then": "Die Trinkwasserstelle ist ganzjährig in Betrieb" + }, + "1": { + "then": "Die Trinkwasserstelle ist nur im Sommer in Betrieb" + }, + "2": { + "then": "Die Trinkwasserstelle ist im Winter nicht in Betrieb" + } + }, + "question": "Ist die Trinkwasserstelle ganzjährig in Betrieb?" } }, "title": { @@ -4068,6 +4193,54 @@ } } }, + "10": { + "options": { + "0": { + "question": "Keine Bevorzugung von Hunden" + }, + "1": { + "question": "Hunde erlaubt" + }, + "2": { + "question": "Keine Hunde erlaubt" + } + } + }, + "11": { + "options": { + "0": { + "question": "Internetzugang vorhanden" + } + } + }, + "12": { + "options": { + "0": { + "question": "Stromanschluss vorhanden" + } + } + }, + "13": { + "options": { + "0": { + "question": "Hat zuckerfreie Angebote" + } + } + }, + "14": { + "options": { + "0": { + "question": "Hat glutenfreie Angebote" + } + } + }, + "15": { + "options": { + "0": { + "question": "Hat laktosefreie Angebote" + } + } + }, "2": { "options": { "0": { @@ -4138,54 +4311,6 @@ "question": "Nutzung kostenlos" } } - }, - "10": { - "options": { - "0": { - "question": "Keine Bevorzugung von Hunden" - }, - "1": { - "question": "Hunde erlaubt" - }, - "2": { - "question": "Keine Hunde erlaubt" - } - } - }, - "11": { - "options": { - "0": { - "question": "Internetzugang vorhanden" - } - } - }, - "12": { - "options": { - "0": { - "question": "Stromanschluss vorhanden" - } - } - }, - "13": { - "options": { - "0": { - "question": "Hat zuckerfreie Angebote" - } - } - }, - "14": { - "options": { - "0": { - "question": "Hat glutenfreie Angebote" - } - } - }, - "15": { - "options": { - "0": { - "question": "Hat laktosefreie Angebote" - } - } } } }, @@ -4305,30 +4430,6 @@ "1": { "then": "Die Fitness-Station hat ein Schild mit Anweisungen für eine bestimmte Übung." }, - "2": { - "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." - }, - "3": { - "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." - }, - "4": { - "then": "Die Fitness-Station hat Stangen zum Dehnen." - }, - "5": { - "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." - }, - "6": { - "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." - }, - "7": { - "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." - }, - "8": { - "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." - }, - "9": { - "then": "Die Fitness-Station hat Pfosten für Slalomübungen." - }, "10": { "then": "Die Fitness-Station hat Trittsteine." }, @@ -4359,6 +4460,9 @@ "19": { "then": "Die Fitness-Station hat Kampfseile (battle ropes)." }, + "2": { + "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." + }, "20": { "then": "Die Fitness-Station hat ein Fahrradergometer." }, @@ -4373,6 +4477,27 @@ }, "24": { "then": "Die Fitness-Station hat eine Slackline." + }, + "3": { + "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." + }, + "4": { + "then": "Die Fitness-Station hat Stangen zum Dehnen." + }, + "5": { + "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." + }, + "6": { + "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." + }, + "7": { + "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." + }, + "8": { + "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." + }, + "9": { + "then": "Die Fitness-Station hat Pfosten für Slalomübungen." } }, "question": "Welche Übungsgeräte gibt es an dieser Fitness-Station?" @@ -4492,6 +4617,21 @@ "1": { "then": "Dies ist eine Pommesbude" }, + "10": { + "then": "Hier werden chinesische Gerichte serviert" + }, + "11": { + "then": "Hier werden griechische Gerichte serviert" + }, + "12": { + "then": "Hier werden indische Gerichte serviert" + }, + "13": { + "then": "Hier werden türkische Gerichte serviert" + }, + "14": { + "then": "Hier werden thailändische Gerichte serviert" + }, "2": { "then": "Bietet vorwiegend Pastagerichte an" }, @@ -4515,21 +4655,6 @@ }, "9": { "then": "Hier werden französische Gerichte serviert" - }, - "10": { - "then": "Hier werden chinesische Gerichte serviert" - }, - "11": { - "then": "Hier werden griechische Gerichte serviert" - }, - "12": { - "then": "Hier werden indische Gerichte serviert" - }, - "13": { - "then": "Hier werden türkische Gerichte serviert" - }, - "14": { - "then": "Hier werden thailändische Gerichte serviert" } }, "question": "Was für Essen gibt es hier?", @@ -4897,6 +5022,10 @@ "2": { "1": "eine CNC-Fräse", "2": "CNC-Fräse" + }, + "4": { + "1": "eine Nähmaschine", + "2": "Nähmaschine" } } } @@ -5157,30 +5286,6 @@ "1": { "then": "Dies ist ein Auditorium" }, - "2": { - "then": "Dies ist ein Schlafzimmer" - }, - "3": { - "then": "Dies ist eine Kapelle" - }, - "4": { - "then": "Dies ist ein Klassenzimmer" - }, - "5": { - "then": "Dies ist ein Klassenzimmer" - }, - "6": { - "then": "Dies ist ein Computerraum" - }, - "7": { - "then": "Dies ist ein Konferenzraum" - }, - "8": { - "then": "Dies ist eine Krypta" - }, - "9": { - "then": "Dies ist eine Küche" - }, "10": { "then": "Dies ist ein Labor" }, @@ -5211,6 +5316,9 @@ "19": { "then": "Dies ist ein Lagerraum" }, + "2": { + "then": "Dies ist ein Schlafzimmer" + }, "20": { "then": "Dies ist ein Technikraum" }, @@ -5219,6 +5327,27 @@ }, "22": { "then": "Dies ist ein Wartezimmer" + }, + "3": { + "then": "Dies ist eine Kapelle" + }, + "4": { + "then": "Dies ist ein Klassenzimmer" + }, + "5": { + "then": "Dies ist ein Klassenzimmer" + }, + "6": { + "then": "Dies ist ein Computerraum" + }, + "7": { + "then": "Dies ist ein Konferenzraum" + }, + "8": { + "then": "Dies ist eine Krypta" + }, + "9": { + "then": "Dies ist eine Küche" } }, "question": "Wie wird dieser Raum genutzt?" @@ -5845,6 +5974,19 @@ } } }, + "10": { + "options": { + "0": { + "question": "Alle Notizen" + }, + "1": { + "question": "Importnotizen ausblenden" + }, + "2": { + "question": "Nur Importnotizen anzeigen" + } + } + }, "2": { "options": { "0": { @@ -5900,19 +6042,6 @@ "question": "Nur offene Notizen anzeigen" } } - }, - "10": { - "options": { - "0": { - "question": "Alle Notizen" - }, - "1": { - "question": "Importnotizen ausblenden" - }, - "2": { - "question": "Nur Importnotizen anzeigen" - } - } } }, "name": "OpenStreetMap-Hinweise", @@ -6232,6 +6361,21 @@ "1": { "then": "Dies ist ein normaler Stellplatz." }, + "10": { + "then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist." + }, + "11": { + "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." + }, + "12": { + "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." + }, + "13": { + "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." + }, + "14": { + "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." + }, "2": { "then": "Dies ist ein Behindertenstellplatz." }, @@ -6255,21 +6399,6 @@ }, "9": { "then": "Dies ist ein Stellplatz, der für Motorräder reserviert ist." - }, - "10": { - "then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist." - }, - "11": { - "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." - }, - "12": { - "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." - }, - "13": { - "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." - }, - "14": { - "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." } }, "question": "Welche Art von Stellplatz ist dies?" @@ -6861,6 +6990,21 @@ "1": { "then": "2-Cent-Münzen werden akzeptiert" }, + "10": { + "then": "20-Centime-Münzen werden akzeptiert" + }, + "11": { + "then": "½-Schweizer Franken-Münzen werden akzeptiert" + }, + "12": { + "then": "1-Schweizer Franken-Münzen werden akzeptiert" + }, + "13": { + "then": "2-Schweizer Franken-Münzen werden akzeptiert" + }, + "14": { + "then": "5-Schweizer Franken-Münzen werden akzeptiert" + }, "2": { "then": "5-Cent-Münzen werden akzeptiert" }, @@ -6884,21 +7028,6 @@ }, "9": { "then": "10-Centime-Münzen werden akzeptiert" - }, - "10": { - "then": "20-Centime-Münzen werden akzeptiert" - }, - "11": { - "then": "½-Schweizer Franken-Münzen werden akzeptiert" - }, - "12": { - "then": "1-Schweizer Franken-Münzen werden akzeptiert" - }, - "13": { - "then": "2-Schweizer Franken-Münzen werden akzeptiert" - }, - "14": { - "then": "5-Schweizer Franken-Münzen werden akzeptiert" } }, "question": "Mit welchen Münzen kann man hier bezahlen?" @@ -6911,6 +7040,15 @@ "1": { "then": "10-Euro-Scheine werden angenommen" }, + "10": { + "then": "100-Schweizer Franken-Scheine werden akzeptiert" + }, + "11": { + "then": "200-Schweizer Franken-Scheine werden akzeptiert" + }, + "12": { + "then": "1000-Schweizer Franken-Scheine werden akzeptiert" + }, "2": { "then": "20-Euro-Scheine werden angenommen" }, @@ -6934,15 +7072,6 @@ }, "9": { "then": "50-Schweizer Franken-Scheine werden akzeptiert" - }, - "10": { - "then": "100-Schweizer Franken-Scheine werden akzeptiert" - }, - "11": { - "then": "200-Schweizer Franken-Scheine werden akzeptiert" - }, - "12": { - "then": "1000-Schweizer Franken-Scheine werden akzeptiert" } }, "question": "Mit welchen Banknoten kann man hier bezahlen?" @@ -7381,30 +7510,6 @@ "1": { "question": "Recycling von Batterien" }, - "2": { - "question": "Recycling von Getränkekartons" - }, - "3": { - "question": "Recycling von Dosen" - }, - "4": { - "question": "Recycling von Kleidung" - }, - "5": { - "question": "Recycling von Speiseöl" - }, - "6": { - "question": "Recycling von Motoröl" - }, - "7": { - "question": "Recycling von Leuchtstoffröhren" - }, - "8": { - "question": "Recycling von Grünabfällen" - }, - "9": { - "question": "Recycling von Glasflaschen" - }, "10": { "question": "Recycling von Glas" }, @@ -7435,11 +7540,35 @@ "19": { "question": "Recycling von Restabfällen" }, + "2": { + "question": "Recycling von Getränkekartons" + }, "20": { "question": "Recycling von Druckerpatronen" }, "21": { "question": "Recycling von Fahrrädern" + }, + "3": { + "question": "Recycling von Dosen" + }, + "4": { + "question": "Recycling von Kleidung" + }, + "5": { + "question": "Recycling von Speiseöl" + }, + "6": { + "question": "Recycling von Motoröl" + }, + "7": { + "question": "Recycling von Leuchtstoffröhren" + }, + "8": { + "question": "Recycling von Grünabfällen" + }, + "9": { + "question": "Recycling von Glasflaschen" } } }, @@ -7507,30 +7636,6 @@ "1": { "then": "Getränkekartons können hier recycelt werden" }, - "2": { - "then": "Dosen können hier recycelt werden" - }, - "3": { - "then": "Kleidung kann hier recycelt werden" - }, - "4": { - "then": "Speiseöl kann hier recycelt werden" - }, - "5": { - "then": "Motoröl kann hier recycelt werden" - }, - "6": { - "then": "Hier können Leuchtstoffröhren recycelt werden" - }, - "7": { - "then": "Grünabfälle können hier recycelt werden" - }, - "8": { - "then": "Bio-Abfall kann hier recycelt werden" - }, - "9": { - "then": "Glasflaschen können hier recycelt werden" - }, "10": { "then": "Glas kann hier recycelt werden" }, @@ -7561,6 +7666,9 @@ "19": { "then": "Schuhe können hier recycelt werden" }, + "2": { + "then": "Dosen können hier recycelt werden" + }, "20": { "then": "Elektrokleingeräte können hier recycelt werden" }, @@ -7575,6 +7683,27 @@ }, "24": { "then": "Fahrräder können hier recycelt werden" + }, + "3": { + "then": "Kleidung kann hier recycelt werden" + }, + "4": { + "then": "Speiseöl kann hier recycelt werden" + }, + "5": { + "then": "Motoröl kann hier recycelt werden" + }, + "6": { + "then": "Hier können Leuchtstoffröhren recycelt werden" + }, + "7": { + "then": "Grünabfälle können hier recycelt werden" + }, + "8": { + "then": "Bio-Abfall kann hier recycelt werden" + }, + "9": { + "then": "Glasflaschen können hier recycelt werden" } }, "question": "Was kann hier recycelt werden?" @@ -8467,6 +8596,12 @@ "1": { "then": "Diese Straßenlaterne verwendet LEDs" }, + "10": { + "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" + }, + "11": { + "then": "Diese Straßenlaterne wird mit Gas beleuchtet" + }, "2": { "then": "Diese Straßenlaterne verwendet Glühlampenlicht" }, @@ -8490,12 +8625,6 @@ }, "9": { "then": "Diese Straßenlaterne verwendet Niederdruck-Natriumdampflampen (einfarbig orange)" - }, - "10": { - "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" - }, - "11": { - "then": "Diese Straßenlaterne wird mit Gas beleuchtet" } }, "question": "Mit welcher Art von Beleuchtung arbeitet diese Straßenlaterne?" @@ -9699,30 +9828,6 @@ "1": { "question": "Verkauf von Getränken" }, - "2": { - "question": "Verkauf von Süßigkeiten" - }, - "3": { - "question": "Verkauf von Lebensmitteln" - }, - "4": { - "question": "Verkauf von Zigaretten" - }, - "5": { - "question": "Verkauf von Kondomen" - }, - "6": { - "question": "Verkauf von Kaffee" - }, - "7": { - "question": "Verkauf von Trinkwasser" - }, - "8": { - "question": "Verkauf von Zeitungen" - }, - "9": { - "question": "Verkauf von Fahrradschläuchen" - }, "10": { "question": "Verkauf von Milch" }, @@ -9753,6 +9858,9 @@ "19": { "question": "Verkauf von Blumen" }, + "2": { + "question": "Verkauf von Süßigkeiten" + }, "20": { "question": "Verkauf von Parkscheinen" }, @@ -9776,6 +9884,27 @@ }, "27": { "question": "Verkauf von Fahrradschlössern" + }, + "3": { + "question": "Verkauf von Lebensmitteln" + }, + "4": { + "question": "Verkauf von Zigaretten" + }, + "5": { + "question": "Verkauf von Kondomen" + }, + "6": { + "question": "Verkauf von Kaffee" + }, + "7": { + "question": "Verkauf von Trinkwasser" + }, + "8": { + "question": "Verkauf von Zeitungen" + }, + "9": { + "question": "Verkauf von Fahrradschläuchen" } } } @@ -9822,30 +9951,6 @@ "1": { "then": "Süßigkeiten werden verkauft" }, - "2": { - "then": "Lebensmittel werden verkauft" - }, - "3": { - "then": "Zigaretten werden verkauft" - }, - "4": { - "then": "Kondome werden verkauft" - }, - "5": { - "then": "Kaffee wird verkauft" - }, - "6": { - "then": "Trinkwasser wird verkauft" - }, - "7": { - "then": "Zeitungen werden verkauft" - }, - "8": { - "then": "Fahrradschläuche werden verkauft" - }, - "9": { - "then": "Milch wird verkauft" - }, "10": { "then": "Brot wird verkauft" }, @@ -9876,6 +9981,9 @@ "19": { "then": "Parkscheine werden verkauft" }, + "2": { + "then": "Lebensmittel werden verkauft" + }, "20": { "then": "Souvenirmünzen werden verkauft" }, @@ -9896,6 +10004,27 @@ }, "26": { "then": "Fahrradschlösser werden verkauft" + }, + "3": { + "then": "Zigaretten werden verkauft" + }, + "4": { + "then": "Kondome werden verkauft" + }, + "5": { + "then": "Kaffee wird verkauft" + }, + "6": { + "then": "Trinkwasser wird verkauft" + }, + "7": { + "then": "Zeitungen werden verkauft" + }, + "8": { + "then": "Fahrradschläuche werden verkauft" + }, + "9": { + "then": "Milch wird verkauft" } }, "question": "Was wird in diesem Automaten verkauft?", @@ -10187,4 +10316,4 @@ "render": "Windrad" } } -} \ No newline at end of file +} From 3d865bd82a5ee31aa6ba7796a7c3998beb1b8ff5 Mon Sep 17 00:00:00 2001 From: nilocram Date: Sun, 14 Jan 2024 20:28:26 +0000 Subject: [PATCH 09/18] Translated using Weblate (Italian) Currently translated at 27.3% (870 of 3182 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/it/ --- langs/layers/it.json | 192 ++++++++++++++++++++++++++++++++----------- 1 file changed, 143 insertions(+), 49 deletions(-) diff --git a/langs/layers/it.json b/langs/layers/it.json index dc134a2dce..a50419e9d6 100644 --- a/langs/layers/it.json +++ b/langs/layers/it.json @@ -69,6 +69,15 @@ "1": { "then": "Murale" }, + "10": { + "then": "Azulejo (ornamento decorativo piastrellato spagnolo)" + }, + "11": { + "then": "Mosaico di piastrelle" + }, + "12": { + "then": "Scultura in legno" + }, "2": { "then": "Dipinto" }, @@ -92,12 +101,6 @@ }, "9": { "then": "Rilievo" - }, - "10": { - "then": "Azulejo (ornamento decorativo piastrellato spagnolo)" - }, - "11": { - "then": "Mosaico di piastrelle" } }, "question": "Che tipo di opera d’arte è questo?", @@ -110,6 +113,24 @@ "text": "Ulteriori informazioni su questo sito web" } } + }, + "artwork_subject": { + "question": "Che cosa rappresenta quest'opera d'arte?", + "render": "Quest'opera d'arte rappresenta {wikidata_label(subject:wikidata)}{wikipedia(subject:wikidata)}" + }, + "doubles_as_bench": { + "mappings": { + "0": { + "then": "Quest'opera d'arte funge anche da panchina" + }, + "1": { + "then": "Quest'opera d'arte non funge anche da panchina" + }, + "2": { + "then": "Quest'opera d'arte non funge anche da panchina" + } + }, + "question": "Quest'opera d'arte funge da panchina?" } }, "title": { @@ -121,6 +142,79 @@ "render": "Opera d’arte" } }, + "atm": { + "description": "Sportello Bancomat per prelevare denaro", + "name": "Sportelli Bancomat", + "presets": { + "0": { + "title": "Uno sportello bancomat" + } + }, + "tagRenderings": { + "cash_in": { + "mappings": { + "0": { + "then": "Probabilmente non puoi depositare dei contanti in questo sportello bancomat" + }, + "1": { + "then": "Puoi depositare dei contanti in questo sportello bancomat" + }, + "2": { + "then": "Non puoi depositare dei contanti in questo sportello bancomat" + } + }, + "question": "Puoi depositare dei contanti in questo sportello bancomat?" + }, + "cash_out": { + "mappings": { + "0": { + "then": "Puoi prelevare dei contanti da questo sportello bancomat" + }, + "1": { + "then": "Puoi prelevare dei contanti da questo sportello bancomat" + }, + "2": { + "then": "Non puoi prelevare dei contanti da questo sportello bancomat" + } + }, + "question": "Puoi prelevare dei contanti da questo sportello bancomat?" + }, + "cash_out-denominations-notes": { + "mappings": { + "0": { + "then": "Si possono prelevare banconote da 5 euro" + }, + "1": { + "then": "Si possono prelevare banconote da 10 euro" + }, + "2": { + "then": "Si possono prelevare banconote da 20 euro" + }, + "3": { + "then": "Si possono prelevare banconote da 50 euro" + }, + "4": { + "then": "Si possono prelevare banconote da 100 euro" + }, + "5": { + "then": "Non si possono prelevare banconote da 200 euro" + }, + "6": { + "then": "Non si possono prelevare banconote da 500 euro" + } + }, + "question": "Quali banconote si possono ritirare qui?" + }, + "name": { + "render": "Il nome di questo sportello bancomat è {name}" + }, + "operator": { + "freeform": { + "placeholder": "Operatore" + } + } + } + }, "bench": { "name": "Panchine", "presets": { @@ -1898,27 +1992,6 @@ "1": { "question": "Riciclo di batterie" }, - "2": { - "question": "Riciclo di confezioni per bevande" - }, - "3": { - "question": "Riciclo di lattine" - }, - "4": { - "question": "Riciclo di abiti" - }, - "5": { - "question": "Riciclo di olio da cucina" - }, - "6": { - "question": "Riciclo di olio da motore" - }, - "8": { - "question": "Riciclo di umido" - }, - "9": { - "question": "Riciclo di bottiglie di vetro" - }, "10": { "question": "Riciclo di vetro" }, @@ -1946,8 +2019,29 @@ "19": { "question": "Riciclo di secco" }, + "2": { + "question": "Riciclo di confezioni per bevande" + }, "20": { "question": "Riciclo di secco" + }, + "3": { + "question": "Riciclo di lattine" + }, + "4": { + "question": "Riciclo di abiti" + }, + "5": { + "question": "Riciclo di olio da cucina" + }, + "6": { + "question": "Riciclo di olio da motore" + }, + "8": { + "question": "Riciclo di umido" + }, + "9": { + "question": "Riciclo di bottiglie di vetro" } } }, @@ -2000,27 +2094,6 @@ "1": { "then": "Cartoni per bevande" }, - "2": { - "then": "Lattine" - }, - "3": { - "then": "Abiti" - }, - "4": { - "then": "Olio da cucina" - }, - "5": { - "then": "Olio di motore" - }, - "7": { - "then": "Verde" - }, - "8": { - "then": "Umido" - }, - "9": { - "then": "Bottiglie di vetro" - }, "10": { "then": "Vetro" }, @@ -2045,6 +2118,9 @@ "19": { "then": "Scarpe" }, + "2": { + "then": "Lattine" + }, "20": { "then": "Piccoli elettrodomestici" }, @@ -2056,6 +2132,24 @@ }, "23": { "then": "Secco" + }, + "3": { + "then": "Abiti" + }, + "4": { + "then": "Olio da cucina" + }, + "5": { + "then": "Olio di motore" + }, + "7": { + "then": "Verde" + }, + "8": { + "then": "Umido" + }, + "9": { + "then": "Bottiglie di vetro" } }, "question": "Cosa si può riciclare qui?" @@ -2856,4 +2950,4 @@ "render": "pala eolica" } } -} \ No newline at end of file +} From 5f627124e98e98f25e9e5a834f56e906237e0241 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 16 Jan 2024 13:04:46 +0100 Subject: [PATCH 10/18] Themes: fix typo in soft-deletion tag --- assets/layers/defibrillator/defibrillator.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/layers/defibrillator/defibrillator.json b/assets/layers/defibrillator/defibrillator.json index 23fa175074..fc69fcbb88 100644 --- a/assets/layers/defibrillator/defibrillator.json +++ b/assets/layers/defibrillator/defibrillator.json @@ -752,7 +752,7 @@ "deletion": { "softDeletionTags": { "and": [ - "disused:emergency:=defibrillator}", + "disused:emergency:=defibrillator", "emergency=" ] }, From 38b9523b835b72bfe9f068b55015d8f7868951c9 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 16 Jan 2024 17:37:40 +0100 Subject: [PATCH 11/18] Themes: phone validation now knows about some short-codes --- .../InputElement/Validators/PhoneValidator.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/UI/InputElement/Validators/PhoneValidator.ts b/src/UI/InputElement/Validators/PhoneValidator.ts index f8a76ff221..6ef6a50270 100644 --- a/src/UI/InputElement/Validators/PhoneValidator.ts +++ b/src/UI/InputElement/Validators/PhoneValidator.ts @@ -35,6 +35,10 @@ export default class PhoneValidator extends Validator { if (country !== undefined) { countryCode = country()?.toUpperCase() } + if (this.isShortCode(str, countryCode)) { + return true + } + return parsePhoneNumberFromString(str, countryCode)?.isValid() ?? false } @@ -46,9 +50,28 @@ export default class PhoneValidator extends Validator { if (country) { countryCode = country() } + if (this.isShortCode(str, countryCode?.toUpperCase())) { + return str + } return parsePhoneNumberFromString( str, countryCode?.toUpperCase() as any )?.formatInternational() } + + /** + * Indicates if the given string is a special 'short code' valid in the given country + * see https://nl.wikipedia.org/wiki/Short_code + * @param str a possible phone number + * @param country the upper case, two-letter code for a country + * @private + */ + private isShortCode(str: string, country: string) { + if (country == "BE" && str.length === 4 && str.match(/[0-9]{4}/)) { + return true + } + if (country == "NL" && str.length === 4 && str.match(/14[0-9]{3}/)) { + return true + } + } } From c62f7cce01da15ef3f123b95e08056ca5019b7c9 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 16 Jan 2024 21:53:11 +0100 Subject: [PATCH 12/18] Themes: allow to add multiple changing table locations, see #1756 --- assets/layers/toilet/toilet.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assets/layers/toilet/toilet.json b/assets/layers/toilet/toilet.json index 068ba43aa3..d4266476ce 100644 --- a/assets/layers/toilet/toilet.json +++ b/assets/layers/toilet/toilet.json @@ -26,7 +26,7 @@ "source": { "osmTags": "amenity=toilets" }, - "minzoom": 12, + "minzoom": 10, "title": { "render": { "en": "Toilet", @@ -683,6 +683,7 @@ } } ], + "multiAnswer": true, "id": "toilet-changing_table:location" }, { From 9923f849e09382532399f4dfda249a09fa1d7d3d Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 16 Jan 2024 22:21:35 +0100 Subject: [PATCH 13/18] Hotkeys: add hotkey to quickly switch translation mode on or off --- langs/en.json | 3 ++- src/Models/ThemeConfig/TagRenderingConfig.ts | 3 ++- src/Models/ThemeViewState.ts | 11 +++++++++++ src/UI/Popup/TagRendering/TagRenderingAnswer.svelte | 3 +-- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/langs/en.json b/langs/en.json index 00f75c850b..f1a5e5c1fa 100644 --- a/langs/en.json +++ b/langs/en.json @@ -500,7 +500,8 @@ "selectOsmbasedmap": "Set the background layer to on OpenStreetMap-based map (or disable the background raster layer)", "selectSearch": "Select the search bar to search locations", "shakePhone": "Shaking your phone", - "title": "Hotkeys" + "title": "Hotkeys", + "translationMode": "Toggle translation mode on or off" }, "image": { "addPicture": "Add picture", diff --git a/src/Models/ThemeConfig/TagRenderingConfig.ts b/src/Models/ThemeConfig/TagRenderingConfig.ts index 8a10a63485..67e3cd8080 100644 --- a/src/Models/ThemeConfig/TagRenderingConfig.ts +++ b/src/Models/ThemeConfig/TagRenderingConfig.ts @@ -496,7 +496,8 @@ export default class TagRenderingConfig { for (const leftover of leftovers) { applicableMappings.push({ then: new TypedTranslation( - this.render.replace("{" + this.freeform.key + "}", leftover).translations + this.render.replace("{" + this.freeform.key + "}", leftover).translations, + this.render.context ), }) } diff --git a/src/Models/ThemeViewState.ts b/src/Models/ThemeViewState.ts index 011cf335a4..538c98c50c 100644 --- a/src/Models/ThemeViewState.ts +++ b/src/Models/ThemeViewState.ts @@ -62,6 +62,7 @@ import FavouritesFeatureSource from "../Logic/FeatureSource/Sources/FavouritesFe import { ProvidedImage } from "../Logic/ImageProviders/ImageProvider" import { GeolocationControlState } from "../UI/BigComponents/GeolocationControl" import Zoomcontrol from "../UI/Zoomcontrol" +import Locale from "../UI/i18n/Locale" /** * @@ -654,6 +655,16 @@ export default class ThemeViewState implements SpecialVisualizationState { ) return true }) + + Hotkeys.RegisterHotkey( + { + shift: "T", + }, + Translations.t.hotkeyDocumentation.translationMode, + () => { + Locale.showLinkToWeblate.setData(!Locale.showLinkToWeblate.data) + } + ) } /** diff --git a/src/UI/Popup/TagRendering/TagRenderingAnswer.svelte b/src/UI/Popup/TagRendering/TagRenderingAnswer.svelte index 12a53e0bdf..4a5f64cf54 100644 --- a/src/UI/Popup/TagRendering/TagRenderingAnswer.svelte +++ b/src/UI/Popup/TagRendering/TagRenderingAnswer.svelte @@ -6,7 +6,6 @@ import type { SpecialVisualizationState } from "../../SpecialVisualization" import type { Feature } from "geojson" import { Store, UIEventSource } from "../../../Logic/UIEventSource" - import { onDestroy } from "svelte" import LayerConfig from "../../../Models/ThemeConfig/LayerConfig" import { twMerge } from "tailwind-merge" @@ -24,7 +23,7 @@ throw "Config is undefined in tagRenderingAnswer" } let trs: Store<{ then: Translation; icon?: string; iconClass?: string }[]> = tags.mapD((tags) => - Utils.NoNull(config?.GetRenderValues(tags)) + Utils.NoNull(config?.GetRenderValues(tags)), ) From a50620a8ba4339f4025d95ce8ecbdef856f8625d Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 16 Jan 2024 22:54:17 +0100 Subject: [PATCH 14/18] Refactoring: more cleanup of Svg.ts, remove a few old, unused classes --- src/UI/Base/AsyncLazy.ts | 26 ------------------ src/UI/Base/FilteredCombine.ts | 50 ---------------------------------- 2 files changed, 76 deletions(-) delete mode 100644 src/UI/Base/AsyncLazy.ts delete mode 100644 src/UI/Base/FilteredCombine.ts diff --git a/src/UI/Base/AsyncLazy.ts b/src/UI/Base/AsyncLazy.ts deleted file mode 100644 index 71c6ab34ea..0000000000 --- a/src/UI/Base/AsyncLazy.ts +++ /dev/null @@ -1,26 +0,0 @@ -import BaseUIElement from "../BaseUIElement" -import { VariableUiElement } from "./VariableUIElement" -import { Stores } from "../../Logic/UIEventSource" -import Loading from "./Loading" - -export default class AsyncLazy extends BaseUIElement { - private readonly _f: () => Promise - - constructor(f: () => Promise) { - super() - this._f = f - } - - protected InnerConstructElement(): HTMLElement { - // The caching of the BaseUIElement will guarantee that _f will only be called once - - return new VariableUiElement( - Stores.FromPromise(this._f()).map((el) => { - if (el === undefined) { - return new Loading() - } - return el - }) - ).ConstructElement() - } -} diff --git a/src/UI/Base/FilteredCombine.ts b/src/UI/Base/FilteredCombine.ts deleted file mode 100644 index 6ed315298d..0000000000 --- a/src/UI/Base/FilteredCombine.ts +++ /dev/null @@ -1,50 +0,0 @@ -import BaseUIElement from "../BaseUIElement" -import { UIEventSource } from "../../Logic/UIEventSource" -import { VariableUiElement } from "./VariableUIElement" -import Combine from "./Combine" -import Locale from "../i18n/Locale" -import { Utils } from "../../Utils" - -export default class FilteredCombine extends VariableUiElement { - /** - * Only shows item matching the search - * If predicate of an item is undefined, it will be filtered out as soon as a non-null or non-empty search term is given - * @param entries - * @param searchedValue - * @param options - */ - constructor( - entries: { - element: BaseUIElement | string - predicate?: (s: string) => boolean - }[], - searchedValue: UIEventSource, - options?: { - onEmpty?: BaseUIElement | string - innerClasses: string - } - ) { - entries = Utils.NoNull(entries) - super( - searchedValue.map( - (searchTerm) => { - if (searchTerm === undefined || searchTerm === "") { - return new Combine(entries.map((e) => e.element)).SetClass( - options?.innerClasses ?? "" - ) - } - const kept = entries.filter( - (entry) => entry?.predicate !== undefined && entry.predicate(searchTerm) - ) - if (kept.length === 0) { - return options?.onEmpty - } - return new Combine(kept.map((entry) => entry.element)).SetClass( - options?.innerClasses ?? "" - ) - }, - [Locale.language] - ) - ) - } -} From 114b72f6f79c95c5e581d64d79fce42872791dc7 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 16 Jan 2024 23:03:33 +0100 Subject: [PATCH 15/18] Refactoring: more cleanup of Svg.ts, remove a few old, unused classes --- scripts/generateIncludedImages.ts | 1 + .../ImageProviders/WikimediaImageProvider.ts | 1 - src/Models/ThemeConfig/LayerConfig.ts | 5 ++-- src/UI/Base/Loading.svelte | 3 ++- src/UI/Base/SubtleButton.ts | 3 --- src/UI/Popup/Notes/NoteCommentElement.ts | 11 +++++--- src/index.ts | 26 ++++++++++++------- 7 files changed, 30 insertions(+), 20 deletions(-) diff --git a/scripts/generateIncludedImages.ts b/scripts/generateIncludedImages.ts index 0798c7fe32..32fd3d917b 100644 --- a/scripts/generateIncludedImages.ts +++ b/scripts/generateIncludedImages.ts @@ -80,6 +80,7 @@ function genImages(dryrun = false) { "ring", "robot", "SocialImageForeground", + "speech_bubble", "speech_bubble_black_outline", "square", "star", diff --git a/src/Logic/ImageProviders/WikimediaImageProvider.ts b/src/Logic/ImageProviders/WikimediaImageProvider.ts index cc0d1dadda..e53f5d9dc0 100644 --- a/src/Logic/ImageProviders/WikimediaImageProvider.ts +++ b/src/Logic/ImageProviders/WikimediaImageProvider.ts @@ -1,6 +1,5 @@ import ImageProvider, { ProvidedImage } from "./ImageProvider" import BaseUIElement from "../../UI/BaseUIElement" -import Svg from "../../Svg" import { Utils } from "../../Utils" import { LicenseInfo } from "./LicenseInfo" import Wikimedia from "../Web/Wikimedia" diff --git a/src/Models/ThemeConfig/LayerConfig.ts b/src/Models/ThemeConfig/LayerConfig.ts index 7b2feacd0d..caf7d4393a 100644 --- a/src/Models/ThemeConfig/LayerConfig.ts +++ b/src/Models/ThemeConfig/LayerConfig.ts @@ -24,11 +24,12 @@ import Table from "../../UI/Base/Table" import FilterConfigJson from "./Json/FilterConfigJson" import { Overpass } from "../../Logic/Osm/Overpass" import { FixedUiElement } from "../../UI/Base/FixedUiElement" -import Svg from "../../Svg" import { ImmutableStore } from "../../Logic/UIEventSource" import { OsmTags } from "../OsmFeature" import Constants from "../Constants" import { QuestionableTagRenderingConfigJson } from "./Json/QuestionableTagRenderingConfigJson" +import SvelteUIElement from "../../UI/Base/SvelteUIElement" +import Statistics from "../../assets/svg/Statistics.svelte" export default class LayerConfig extends WithContextLoader { public static readonly syncSelectionAllowed = ["no", "local", "theme-only", "global"] as const @@ -466,7 +467,7 @@ export default class LayerConfig extends WithContextLoader { new Link( Utils.runningFromConsole ? "" - : Svg.statistics_svg().SetClass("w-4 h-4 mr-2"), + : new SvelteUIElement(Statistics, {class: "w-4 h-4 mr-2"}), "https://taginfo.openstreetmap.org/keys/" + values.key + "#values", true ), diff --git a/src/UI/Base/Loading.svelte b/src/UI/Base/Loading.svelte index 1f592312e8..57cdd2adca 100644 --- a/src/UI/Base/Loading.svelte +++ b/src/UI/Base/Loading.svelte @@ -2,13 +2,14 @@ import ToSvelte from "./ToSvelte.svelte" import Svg from "../../Svg" import { twMerge } from "tailwind-merge" + import Loading from "../../assets/svg/Loading.svelte" export let cls: string = undefined
- +
diff --git a/src/UI/Base/SubtleButton.ts b/src/UI/Base/SubtleButton.ts index 02db03ab26..9934e80d1e 100644 --- a/src/UI/Base/SubtleButton.ts +++ b/src/UI/Base/SubtleButton.ts @@ -1,9 +1,6 @@ import BaseUIElement from "../BaseUIElement" import { Store, UIEventSource } from "../../Logic/UIEventSource" import { UIElement } from "../UIElement" -import { VariableUiElement } from "./VariableUIElement" -import Lazy from "./Lazy" -import Loading from "./Loading" import SvelteUIElement from "./SvelteUIElement" import SubtleLink from "./SubtleLink.svelte" import Translations from "../i18n/Translations" diff --git a/src/UI/Popup/Notes/NoteCommentElement.ts b/src/UI/Popup/Notes/NoteCommentElement.ts index 5abaa52f9d..4dc3c8990e 100644 --- a/src/UI/Popup/Notes/NoteCommentElement.ts +++ b/src/UI/Popup/Notes/NoteCommentElement.ts @@ -1,6 +1,5 @@ import Combine from "../../Base/Combine" import BaseUIElement from "../../BaseUIElement" -import Svg from "../../../Svg" import Link from "../../Base/Link" import { FixedUiElement } from "../../Base/FixedUiElement" import Translations from "../../i18n/Translations" @@ -11,6 +10,10 @@ import { Stores, UIEventSource } from "../../../Logic/UIEventSource" import { OsmConnection } from "../../../Logic/Osm/OsmConnection" import { VariableUiElement } from "../../Base/VariableUIElement" import { SpecialVisualizationState } from "../../SpecialVisualization" +import SvelteUIElement from "../../Base/SvelteUIElement" +import Note from "../../../assets/svg/Note.svelte" +import Resolved from "../../../assets/svg/Resolved.svelte" +import Speech_bubble from "../../../assets/svg/Speech_bubble.svelte" export default class NoteCommentElement extends Combine { constructor( @@ -32,11 +35,11 @@ export default class NoteCommentElement extends Combine { let actionIcon: BaseUIElement if (comment.action === "opened" || comment.action === "reopened") { - actionIcon = Svg.note_svg() + actionIcon = new SvelteUIElement(Note) } else if (comment.action === "closed") { - actionIcon = Svg.resolved_svg() + actionIcon = new SvelteUIElement(Resolved) } else { - actionIcon = Svg.speech_bubble_svg() + actionIcon = new SvelteUIElement(Speech_bubble) } let user: BaseUIElement diff --git a/src/index.ts b/src/index.ts index 2a5b2600c6..3d2e6cd3af 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,11 +5,12 @@ import ThemeViewGUI from "./UI/ThemeViewGUI.svelte" import { FixedUiElement } from "./UI/Base/FixedUiElement" import Combine from "./UI/Base/Combine" import { SubtleButton } from "./UI/Base/SubtleButton" -import Svg from "./Svg" import { Utils } from "./Utils" +import Download from "./assets/svg/Download.svelte" + function webgl_support() { try { - var canvas = document.createElement("canvas") + const canvas = document.createElement("canvas") return ( !!window.WebGLRenderingContext && (canvas.getContext("webgl") || canvas.getContext("experimental-webgl")) @@ -18,6 +19,7 @@ function webgl_support() { return false } } + // @ts-ignore try { if (!webgl_support()) { @@ -31,16 +33,22 @@ try { }) .catch((err) => { console.error("Error while initializing: ", err, err.stack) + const customDefinition = DetermineLayout.getCustomDefinition() new Combine([ new FixedUiElement(err).SetClass("block alert"), - new SubtleButton(Svg.download_svg(), "Download the raw file").onClick(() => - Utils.offerContentsAsDownloadableFile( - DetermineLayout.getCustomDefinition(), - "mapcomplete-theme.json", - { mimetype: "application/json" } - ) - ), + customDefinition?.length > 0 + ? new SubtleButton( + new SvelteUIElement(Download), + "Download the raw file" + ).onClick(() => + Utils.offerContentsAsDownloadableFile( + DetermineLayout.getCustomDefinition(), + "mapcomplete-theme.json", + { mimetype: "application/json" } + ) + ) + : undefined, ]).AttachTo("maindiv") }) } catch (err) { From cdb1bb23b8e5df8bd1f2e0732ff14f3bd55935f5 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 16 Jan 2024 23:08:29 +0100 Subject: [PATCH 16/18] Fix: use correct relocation icon again --- src/UI/Popup/MoveWizardState.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/UI/Popup/MoveWizardState.ts b/src/UI/Popup/MoveWizardState.ts index 7096386606..a4faa60853 100644 --- a/src/UI/Popup/MoveWizardState.ts +++ b/src/UI/Popup/MoveWizardState.ts @@ -12,6 +12,7 @@ import { Feature, Point } from "geojson" import SvelteUIElement from "../Base/SvelteUIElement" import Confirm from "../../assets/svg/Confirm.svelte" import Relocation from "../../assets/svg/Relocation.svelte" +import Location from "../../assets/svg/Location.svelte" export interface MoveReason { text: Translation | string @@ -62,7 +63,7 @@ export class MoveWizardState { reasons.push({ text: t.reasons.reasonInaccurate, invitingText: t.inviteToMove.reasonInaccurate, - icon: new SvelteUIElement(Confirm), + icon: new SvelteUIElement(Location), changesetCommentValue: "improve_accuracy", lockBounds: true, includeSearch: false, From 5136d20477b81534658125c9d69f14ab3cad2a42 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 16 Jan 2024 23:10:47 +0100 Subject: [PATCH 17/18] Remove debugging output --- src/UI/Zoomcontrol.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/UI/Zoomcontrol.ts b/src/UI/Zoomcontrol.ts index 5d3687ecdb..898cd7d35e 100644 --- a/src/UI/Zoomcontrol.ts +++ b/src/UI/Zoomcontrol.ts @@ -29,9 +29,6 @@ export default class Zoomcontrol { this._allowZooming.addCallback((allowed) => { this.apply(allowed ? Zoomcontrol.initialValue : Zoomcontrol.noZoom) }) - Stores.Chronic(1000).addCallback((_) => - console.log(this.viewportElement.getAttribute("content")) - ) } private _resetZoom() { From 286fe729359db1ec36328768a6a7662a9e951ce8 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 16 Jan 2024 23:55:18 +0100 Subject: [PATCH 18/18] Fix: allow to link multiple mapillary-images --- package.json | 2 +- src/Logic/ImageProviders/Mapillary.ts | 1 - src/Logic/Osm/Actions/LinkImageAction.ts | 3 +-- src/Logic/Osm/Changes.ts | 2 +- src/UI/Image/LinkableImage.svelte | 15 +++++++-------- src/UI/Image/NearbyImages.svelte | 2 +- 6 files changed, 11 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 71f0b38be0..8eaa8e838b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapcomplete", - "version": "0.36.12", + "version": "0.36.13", "repository": "https://github.com/pietervdvn/MapComplete", "description": "A small website to edit OSM easily", "bugs": "https://github.com/pietervdvn/MapComplete/issues", diff --git a/src/Logic/ImageProviders/Mapillary.ts b/src/Logic/ImageProviders/Mapillary.ts index 85f1bd1ac3..a508263fea 100644 --- a/src/Logic/ImageProviders/Mapillary.ts +++ b/src/Logic/ImageProviders/Mapillary.ts @@ -155,7 +155,6 @@ export class Mapillary extends ImageProvider { Constants.mapillary_client_token_v4 const response = await Utils.downloadJsonCached(metadataUrl, 60 * 60) const url = response["thumb_1024_url"] - console.log(response) const url_hd = response["thumb_original_url"] return { id: "" + mapillaryId, diff --git a/src/Logic/Osm/Actions/LinkImageAction.ts b/src/Logic/Osm/Actions/LinkImageAction.ts index 908ce15834..9755fa724f 100644 --- a/src/Logic/Osm/Actions/LinkImageAction.ts +++ b/src/Logic/Osm/Actions/LinkImageAction.ts @@ -1,7 +1,6 @@ import ChangeTagAction from "./ChangeTagAction" import { Tag } from "../../Tags/Tag" import OsmChangeAction from "./OsmChangeAction" -import { Changes } from "../Changes" import { ChangeDescription } from "./ChangeDescription" import { Store } from "../../UIEventSource" @@ -40,7 +39,7 @@ export default class LinkImageAction extends OsmChangeAction { protected CreateChangeDescriptions(): Promise { let key = this._proposedKey let i = 0 - const currentTags = this._currentTags.data + const currentTags: Record = this._currentTags.data const url = this._url while (currentTags[key] !== undefined && currentTags[key] !== url) { key = this._proposedKey + ":" + i diff --git a/src/Logic/Osm/Changes.ts b/src/Logic/Osm/Changes.ts index 935bb80b3d..3f2611edb6 100644 --- a/src/Logic/Osm/Changes.ts +++ b/src/Logic/Osm/Changes.ts @@ -539,7 +539,7 @@ export class Changes { openChangeset ) - console.log("Upload successfull!") + console.log("Upload successful!") return true } diff --git a/src/UI/Image/LinkableImage.svelte b/src/UI/Image/LinkableImage.svelte index 572cc67766..ea692b0832 100644 --- a/src/UI/Image/LinkableImage.svelte +++ b/src/UI/Image/LinkableImage.svelte @@ -15,18 +15,15 @@ import SpecialTranslation from "../Popup/TagRendering/SpecialTranslation.svelte" export let tags: UIEventSource - export let lon: number - export let lat: number export let state: SpecialVisualizationState export let image: P4CPicture export let feature: Feature export let layer: LayerConfig export let linkable = true - let isLinked = Object.values(tags.data).some((v) => image.pictureUrl === v) - + let targetValue = Object.values(image.osmTags)[0] + let isLinked = new UIEventSource(Object.values(tags.data).some((v) => targetValue === v)) const t = Translations.t.image.nearby - const c = [lon, lat] const providedImage: ProvidedImage = { url: image.thumbUrl ?? image.pictureUrl, url_hd: image.pictureUrl, @@ -36,10 +33,11 @@ id: Object.values(image.osmTags)[0], } - $: { + function applyLink(isLinked :boolean) { + console.log("Applying linked image", isLinked, targetValue) const currentTags = tags.data const key = Object.keys(image.osmTags)[0] - const url = image.osmTags[key] + const url = targetValue if (isLinked) { const action = new LinkImageAction(currentTags.id, key, url, tags, { theme: tags.data._orig_theme ?? state.layout.id, @@ -59,6 +57,7 @@ } } } + isLinked.addCallback(isLinked => applyLink(isLinked))
@@ -71,7 +70,7 @@
{#if linkable} {/if} diff --git a/src/UI/Image/NearbyImages.svelte b/src/UI/Image/NearbyImages.svelte index 375b1b4495..11e5c4d0c8 100644 --- a/src/UI/Image/NearbyImages.svelte +++ b/src/UI/Image/NearbyImages.svelte @@ -55,7 +55,7 @@
{#each $images as image (image.pictureUrl)} - + {/each}