Merge branch 'develop' into feature/velopark

This commit is contained in:
Pieter Vander Vennet 2024-01-19 00:34:58 +01:00
commit 59e76b9c6f
30 changed files with 963 additions and 654 deletions

View file

@ -752,7 +752,7 @@
"deletion": {
"softDeletionTags": {
"and": [
"disused:emergency:=defibrillator}",
"disused:emergency:=defibrillator",
"emergency="
]
},

View file

@ -18,7 +18,7 @@
}
]
},
"color": "red"
"color": "black"
}
]
}
@ -43,5 +43,6 @@
},
"tagRenderings": [
]
],
"syncSelection": "global"
}

View file

@ -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"
},
{

View file

@ -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",
@ -173,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 <a href='https://github.com/pietervdvn/MapComplete/graphs/contributors' target='_blank'>{hiddenCount} weiteren Personen</a>"
},
"back": "Zurück",
"backToIndex": "Zur Übersicht aller Themenkarten",
"backToMap": "Zurück zur Karte",
"backgroundMap": "Hintergrundkarte auswählen",
"backgroundSwitch": "Hintergrund wechseln",
"cancel": "Abbrechen",
@ -224,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"
@ -272,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",
@ -281,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": {
@ -290,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",
@ -324,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, <a href='https://github.com/pietervdvn/MapComplete/blob/develop/Docs/URL_Parameters.md' target='_blank'>siehe Dokumentation</a>",
@ -369,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": {
@ -416,12 +458,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)",

View file

@ -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.",
@ -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",

File diff suppressed because it is too large Load diff

View file

@ -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 darte è 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 darte"
}
},
"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"
}
}
}
}

View file

@ -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"
}
}
}

View file

@ -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"
}
}
}

View file

@ -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 <strong>{ref}</strong>"
"then": "Vínculos entre nodos <strong>{ref}</strong>"
}
},
"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 <strong>{rcn_ref}</strong>"
},
"1": {
"then": "Nodo de ciclo propuesto <strong>{proposed:rcn_ref}</strong>"
}
},
"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"
}
}
}

View file

@ -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",

View file

@ -80,6 +80,7 @@ function genImages(dryrun = false) {
"ring",
"robot",
"SocialImageForeground",
"speech_bubble",
"speech_bubble_black_outline",
"square",
"square_rounded",

View file

@ -155,7 +155,6 @@ export class Mapillary extends ImageProvider {
Constants.mapillary_client_token_v4
const response = await Utils.downloadJsonCached(metadataUrl, 60 * 60)
const url = <string>response["thumb_1024_url"]
console.log(response)
const url_hd = <string>response["thumb_original_url"]
return {
id: "" + mapillaryId,

View file

@ -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"

View file

@ -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<ChangeDescription[]> {
let key = this._proposedKey
let i = 0
const currentTags = this._currentTags.data
const currentTags: Record<string, string> = this._currentTags.data
const url = this._url
while (currentTags[key] !== undefined && currentTags[key] !== url) {
key = this._proposedKey + ":" + i

View file

@ -539,7 +539,7 @@ export class Changes {
openChangeset
)
console.log("Upload successfull!")
console.log("Upload successful!")
return true
}

View file

@ -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
? "<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>"
: 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
),

View file

@ -496,7 +496,8 @@ export default class TagRenderingConfig {
for (const leftover of leftovers) {
applicableMappings.push({
then: new TypedTranslation<object>(
this.render.replace("{" + this.freeform.key + "}", leftover).translations
this.render.replace("{" + this.freeform.key + "}", leftover).translations,
this.render.context
),
})
}

View file

@ -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)
}
)
}
/**

View file

@ -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<BaseUIElement>
constructor(f: () => Promise<BaseUIElement>) {
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()
}
}

View file

@ -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<string>,
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]
)
)
}
}

View file

@ -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
</script>
<div class={twMerge("flex p-1 pl-2", cls)}>
<div class="min-w-6 h-6 w-6 shrink-0 animate-spin self-center">
<ToSvelte construct={Svg.loading_svg()} />
<Loading/>
</div>
<div class="ml-2">
<slot />

View file

@ -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"

View file

@ -21,8 +21,8 @@
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 providedImage: ProvidedImage = {
url: image.thumbUrl ?? image.pictureUrl,
@ -33,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,
@ -56,6 +57,7 @@
}
}
}
isLinked.addCallback(isLinked => applyLink(isLinked))
</script>
<div class="flex w-fit shrink-0 flex-col">
@ -68,7 +70,7 @@
</div>
{#if linkable}
<label>
<input bind:checked={isLinked} type="checkbox" />
<input bind:checked={$isLinked} type="checkbox" />
<SpecialTranslation t={t.link} {tags} {state} {layer} {feature} />
</label>
{/if}

View file

@ -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
}
}
}

View file

@ -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,

View file

@ -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

View file

@ -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)),
)
</script>

View file

@ -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() {

View file

@ -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) {