Chore: housekeeping

This commit is contained in:
Pieter Vander Vennet 2024-06-24 13:11:35 +02:00
parent 18e3e6f806
commit a3a7e74f56
94 changed files with 1273 additions and 1080 deletions
Docs
assets
langs
scripts
src

View file

@ -42,6 +42,7 @@ Available languages:
- eu
- pl
- it
- da
This document is autogenerated from [assets/themes/advertising/advertising.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/advertising/advertising.json)

View file

@ -48,6 +48,7 @@ Available languages:
- eu
- it
- pl
- da
This document is autogenerated from [assets/themes/atm/atm.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/atm/atm.json)

View file

@ -34,6 +34,7 @@ Available languages:
- ca
- fr
- pl
- da
This document is autogenerated from [assets/themes/bicycle_parkings/bicycle_parkings.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/bicycle_parkings/bicycle_parkings.json)

View file

@ -46,6 +46,7 @@ Available languages:
- eu
- it
- pl
- da
This document is autogenerated from [assets/themes/blind_osm/blind_osm.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/blind_osm/blind_osm.json)

View file

@ -46,6 +46,7 @@ Available languages:
- cs
- eu
- pl
- da
This document is autogenerated from [assets/themes/bookcases/bookcases.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/bookcases/bookcases.json)

View file

@ -39,6 +39,7 @@ Available languages:
- fr
- eu
- pl
- da
This document is autogenerated from [assets/themes/clock/clock.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/clock/clock.json)

View file

@ -36,6 +36,7 @@ Available languages:
- de
- es
- ca
- da
This document is autogenerated from [assets/themes/disaster_response/disaster_response.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/disaster_response/disaster_response.json)

View file

@ -34,6 +34,7 @@ Available languages:
- cs
- ca
- es
- da
This document is autogenerated from [assets/themes/icecream/icecream.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/icecream/icecream.json)

View file

@ -31,6 +31,7 @@ Available languages:
- en
- de
- da
This document is autogenerated from [assets/themes/lighthouses/lighthouses.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/lighthouses/lighthouses.json)

View file

@ -31,6 +31,7 @@ Available languages:
- en
- da
- de

View file

@ -38,6 +38,7 @@ Available languages:
- de
- fr
- nl
- da
This document is autogenerated from [assets/themes/memorials/memorials.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/memorials/memorials.json)

View file

@ -44,6 +44,7 @@ Available languages:
- es
- cs
- pl
- da
This document is autogenerated from [assets/themes/openwindpowermap/openwindpowermap.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/openwindpowermap/openwindpowermap.json)

View file

@ -42,6 +42,8 @@ Available languages:
- en
- de
- es
- da
- fr
This document is autogenerated from [assets/themes/ski/ski.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/ski/ski.json)

View file

@ -61,6 +61,7 @@ Available languages:
- cs
- zh_Hant
- pl
- da
This document is autogenerated from [assets/themes/stations/stations.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/stations/stations.json)

View file

@ -42,6 +42,7 @@ Available languages:
- es
- pl
- zh_Hant
- da
This document is autogenerated from [assets/themes/vending_machine/vending_machine.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/vending_machine/vending_machine.json)

View file

@ -134,7 +134,7 @@ This documentation is defined in the source code at [Locale.ts](/src/UI/i18n/Loc
If true, 'dryrun' mode is activated and a fake user account is loaded
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L33)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L37)
The default value is _false_
@ -145,7 +145,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Disables/Enables logging in and thus disables editing all together. This effectively puts MapComplete into read-only mode.
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L74)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L100)
The default value is _true_
@ -156,7 +156,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Disables/Enables the search bar
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L89)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L115)
The default value is _true_
@ -165,9 +165,9 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
fs-background
---------------
Disables/Enables the background layer control
Disables/Enables the background layer control where a user can enable e.g. aerial imagery
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L94)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L120)
The default value is _true_
@ -176,9 +176,9 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
fs-filter
-----------
Disables/Enables the filter view
Disables/Enables the filter view where a user can enable/disable MapComplete-layers or filter for certain properties
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L100)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L126)
The default value is _true_
@ -189,7 +189,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Disables/enables the help menu or welcome message
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L106)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L132)
The default value is _true_
@ -200,7 +200,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Disables/enables the button to get in touch with the community
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L111)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L137)
The default value is _true_
@ -211,7 +211,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Disables/Enables the extraLink button. By default, if in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch or another extraLink button is enabled)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L116)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L142)
The default value is _true_
@ -222,7 +222,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Disables/Enables the various links which go back to the index page with the theme overview
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L121)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L147)
The default value is _true_
@ -233,7 +233,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Disables/Enables the 'Share-screen'-tab in the welcome message
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L126)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L152)
The default value is _true_
@ -244,7 +244,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Disables/Enables the geolocation button
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L131)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L157)
The default value is _true_
@ -255,7 +255,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Always show all questions
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L136)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L162)
The default value is _false_
@ -266,7 +266,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Enable the export as GeoJSON and CSV button
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L142)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L168)
The default value is _true_
@ -277,7 +277,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L156)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L182)
The default value is _false_
@ -288,7 +288,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
If true, shows some extra debugging help such as all the available tags on every object
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L162)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L188)
The default value is _false_
@ -299,7 +299,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
If true, the location distance indication will not be written to the changeset and other privacy enhancing measures might be taken.
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L168)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L194)
The default value is _false_
@ -310,7 +310,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L174)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L200)
The default value is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_
@ -321,7 +321,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Set a different timeout (in seconds) for queries in overpass
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L185)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L211)
The default value is _30_
@ -332,7 +332,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
point to switch between OSM-api and overpass
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L193)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L219)
The default value is _16_
@ -343,7 +343,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
Tilesize when the OSM-API is used to fetch data within a BBOX
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L201)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L227)
The default value is _17_
@ -354,7 +354,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
The id of the background layer to start with
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L208)
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L234)
No default value set
@ -398,7 +398,7 @@ This documentation is defined in the source code at [InitialMapPositioning.ts](/
Used to complete the login
This documentation is defined in the source code at [ThemeViewState.ts](/src/Models/ThemeViewState.ts#L175)
This documentation is defined in the source code at [ThemeViewState.ts](/src/Models/ThemeViewState.ts#L168)
No default value set

View file

@ -130,7 +130,7 @@
{{service_item
|name= [https://mapcomplete.org/atm atm]
|region= Worldwide
|lang= {{#language:en|en}}, {{#language:de|en}}, {{#language:fr|en}}, {{#language:nl|en}}, {{#language:ca|en}}, {{#language:cs|en}}, {{#language:nb_NO|en}}, {{#language:es|en}}, {{#language:id|en}}, {{#language:zh_Hant|en}}, {{#language:eu|en}}, {{#language:it|en}}, {{#language:pl|en}}
|lang= {{#language:en|en}}, {{#language:de|en}}, {{#language:fr|en}}, {{#language:nl|en}}, {{#language:ca|en}}, {{#language:cs|en}}, {{#language:nb_NO|en}}, {{#language:es|en}}, {{#language:id|en}}, {{#language:zh_Hant|en}}, {{#language:eu|en}}, {{#language:it|en}}, {{#language:pl|en}}, {{#language:da|en}}
|descr= A MapComplete theme: This map shows ATMs to withdraw or deposit money
|material= {{yes|[https://mapcomplete.org/ Yes]}}
|image= MapComplete_Screenshot.png
@ -220,7 +220,7 @@
{{service_item
|name= [https://mapcomplete.org/clock clock]
|region= Worldwide
|lang= {{#language:en|en}}, {{#language:nl|en}}, {{#language:ca|en}}, {{#language:de|en}}, {{#language:es|en}}, {{#language:cs|en}}, {{#language:fr|en}}, {{#language:pl|en}}
|lang= {{#language:en|en}}, {{#language:nl|en}}, {{#language:ca|en}}, {{#language:de|en}}, {{#language:es|en}}, {{#language:cs|en}}, {{#language:fr|en}}, {{#language:pl|en}}, {{#language:da|en}}
|descr= A MapComplete theme: Map showing all public clocks
|material= {{yes|[https://mapcomplete.org/ Yes]}}
|image= MapComplete_Screenshot.png

View file

@ -367,7 +367,7 @@
"nl": "Dit is een <b>nachtclub</b> met dansvloer, DJ met bijhorende lichteffecten en bar waar men (alcoholische) dranken kan nuttigen",
"de": "Dies ist ein <b>Club</b> oder eine Disco mit Fokus auf Tanzen, Musik von einem DJ mit begleitender Lichtshow und einer Bar, an der man (alkoholische) Getränke bekommt",
"es": "Este es un <b>club nocturno</b> o discoteca centrado en bailar, música de un DJ con un espectáculo de luces que la acompaña y un bar donde conseguir bebidas (alcohólicas)",
"fr": "C'est une <b>boîte de nuit</b> ou discothèque orientée danse, la musique d'un DJ avec un spectacle de lumière et un bar pour prendre des boissons (alcoolisées)",
"fr": "Une <b>boîte de nuit</b> ou discothèque orientée danse, la musique d'un DJ avec un spectacle de lumière et un bar pour prendre des boissons (alcoolisées)",
"da": "Dette er en <b>natklub</b> eller diskotek med fokus på dans, musik af en DJ med tilhørende lysshow og en bar, hvor man kan købe (alkoholiske) drikkevarer",
"ca": "Açò és un <b>club nocturn</b> o discoteca centrat en ballar, música d'un DJ acompanyat d'un espectacle de llums i una barra on obtindre begudes (alcohòliques)",
"cs": "Jedná se o <b>noční klub</b> nebo diskotéku se zaměřením na tanec, hudbu DJ s doprovodnou světelnou show a bar, kde si můžete dát (alkoholické) nápoje"

View file

@ -6,7 +6,8 @@
"de": "Objekte mit Namensherkunft",
"fr": "A une étymologie",
"ca": "Té etimologia",
"cs": "Má etymologii"
"cs": "Má etymologii",
"da": "Har etymologi"
},
"description": {
"en": "All objects which have an etymology known",
@ -15,7 +16,8 @@
"hu": "Minden olyan objektum, amelynél ismert a nevének az eredete",
"fr": "Tous les objets dont létymologie est connue",
"ca": "Tots els objectes que tenen una etimologia coneguda",
"cs": "Všechny objekty, které mají známou etymologii"
"cs": "Všechny objekty, které mají známou etymologii",
"da": "Alle objekter med kendt etymologi"
},
"source": {
"osmTags": {
@ -113,7 +115,8 @@
"nl": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?",
"de": "Was ist das Wikidata-Element, nach dem dieses Objekt benannt ist?",
"fr": "Quel est l'Item Wikidata auquel l'objet fait référence ?",
"cs": "Po jaké položce Wikidat je tento objekt pojmenován?"
"cs": "Po jaké položce Wikidat je tento objekt pojmenován?",
"da": "Hvilket Wikidata-emne er dette objekt opkaldt efter?"
},
"freeform": {
"key": "name:etymology:wikidata",
@ -248,7 +251,8 @@
"de": "<h3>Wikipedia Artikel zur Namensherkunft</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}",
"fr": "<h3>Article Wikipedia de la référence au nom</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}",
"ca": "<h3> Article de la Viquipèdia del nom donant</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}",
"cs": "<h3>Článek autora jména na Wikipedii</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}"
"cs": "<h3>Článek autora jména na Wikipedii</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}",
"da": "<h3>Wikipedia-artikel om navnets ophav</h3>{wikipedia(name:etymology:wikidata):max-height:20rem}"
}
},
{
@ -270,7 +274,8 @@
"de": "Wonach ist dieses Objekt benannt?",
"fr": "En référence à quoi cet objet est-il nommé ?",
"pl": "Po czym nazwany jest ten obiekt?",
"cs": "Po čem je tento objekt pojmenován?"
"cs": "Po čem je tento objekt pojmenován?",
"da": "Hvad er dette objekt opkaldt efter?"
},
"render": {
"en": "Named after {name:etymology}",
@ -322,7 +327,8 @@
"de": "{image_carousel(image:streetsign)}<br/>{image_upload(image:streetsign, Bild eines Straßenschildes hinzufügen)}",
"fr": "{image_carousel(image:streetsign)}<br/>{image_upload(image:streetsign, Ajouter une photo de la plaque de rue)}",
"ca": "{image_carousel(image:streetsign)}<br/>{image_upload(image:streetsign, Afegeix una imatge de la placa amb el nom del carrer)}",
"cs": "{image_carousel(image:streetsign)}<br/>{image_upload(image:streetsign, Add image of a street name sign)}"
"cs": "{image_carousel(image:streetsign)}<br/>{image_upload(image:streetsign, Add image of a street name sign)}",
"da": "{image_carousel(image:streetsign)}<br/>{image_upload(image:streetsign, Tilføj foto af gadenavneskilt)}"
}
},
{
@ -339,7 +345,8 @@
"de": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Automatische Datenübernahme auf alle Segmente mit demselben Namen, true)}",
"fr": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Appliquer automatiquement aux segments avec le même nom, true)}",
"ca": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etimology, aplicació automàtica de dades a tots els segments amb el mateix nom, vertader)}",
"cs": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Auto-applying data on all segments with the same name, true)}"
"cs": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Auto-applying data on all segments with the same name, true)}",
"da": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Tilføjer automatisk til alle segmenter med samme navn, true)}"
}
},
{
@ -352,7 +359,8 @@
"fr": "Un article Wikipédia à propos de cette <b>rue</b> existe :<br/>{wikipedia():max-height:25rem}",
"pl": "Istnieje artykuł Wikipedii na temat tej <b>ulicy</b>:<br/>{wikipedia():max-height:25rem}",
"ca": "Existeix un article de la Viquipèdia sobre aquest <b>carrer</b>:<br/>{wikipedia():max-height:25rem}",
"cs": "Článek na Wikipedii o této <b>ulici</b> existuje:<br/>{wikipedia():max-height:25rem}"
"cs": "Článek na Wikipedii o této <b>ulici</b> existuje:<br/>{wikipedia():max-height:25rem}",
"da": "Der findes en Wikipedia-artikel om denne <b>gade</b>:<br/>{wikipedia():max-height:25rem}"
},
"condition": "wikidata~*"
}

View file

@ -288,7 +288,8 @@
"en": "Open on openstreetmap.org",
"nl": "Bekijk op openstreetmap.org",
"de": "Auf openstreetmap.org öffnen",
"pl": "Otwórz na openstreetmap.org"
"pl": "Otwórz na openstreetmap.org",
"da": "Åbn på openstreetmap.org"
}
}
},
@ -310,7 +311,8 @@
"en": "Open on openstreetmap.org",
"nl": "Bekijk op openstreetmap.org",
"de": "Auf openstreetmap.org öffnen",
"pl": "Otwórz na openstreetmap.org"
"pl": "Otwórz na openstreetmap.org",
"da": "Åbn på openstreetmap.org"
}
}
}

View file

@ -55,7 +55,8 @@
"ariaLabel": {
"en": "See on OpenStreetMap.org",
"nl": "Bekijk op OpenStreetMap.org",
"de": "Auf OpenStreetMap.org ansehen"
"de": "Auf OpenStreetMap.org ansehen",
"da": "Se på OpenStreetMap.org"
},
"render": "<a href='https://openstreetmap.org/note/{id}' target='_blank'><img src='./assets/svg/osm-logo-us.svg'></a>"
}
@ -251,7 +252,8 @@
"de": "Zuletzt bearbeitet von {search}",
"es": "Editada por última vez por el contributor {search}",
"ca": "Editat per última vega pel contribuïdor {search}",
"cs": "Naposledy upravil přispěvatel {search}"
"cs": "Naposledy upravil přispěvatel {search}",
"da": "Senest redigeret af bidragsyder {search}"
}
}
]

View file

@ -277,7 +277,8 @@
"then": {
"en": "The surface is tartan - a synthetic, springy surface typically seen on athletic pistes",
"nl": "De ondergrond bestaat uit Tartan - een synthetisch, elastisch en poreus materiaal dat je ook vindt op atletiekpistes",
"de": "Der Belag ist aus Tartan - ein synthetischer, federnder Belag, der typischerweise auf Sportbahnen zu finden ist"
"de": "Der Belag ist aus Tartan - ein synthetischer, federnder Belag, der typischerweise auf Sportbahnen zu finden ist",
"fr": "La surface est en tartan - un revêtement synthétique typiquement utilisé sur les pistes d'athlétisme"
}
},
{
@ -285,7 +286,8 @@
"then": {
"en": "The surface is made from rubber, such as rubber tiles, rubber mulch or a big rubber area",
"nl": "De ondergrond bestaat uit rubber, zoals rubberen tegels, rubber snippers of een groot rubberen oppervlak",
"de": "Die Oberfläche besteht aus Gummi, z. B. aus Gummifliesen, Gummimulch oder einer großen Gummifläche"
"de": "Die Oberfläche besteht aus Gummi, z. B. aus Gummifliesen, Gummimulch oder einer großen Gummifläche",
"fr": "La surface est en caoutchouc, comme des dalles de caoutchouc, des copeaux de caoutchouc ou une grande surface en caoutchouc"
}
}
],

View file

@ -2691,7 +2691,8 @@
"en": "Scan this code to open this location on another device",
"nl": "Scan deze code om deze locatie op een ander apparaat te zien",
"de": "Scannen Sie den Code, um diesen Ort auf einem anderen Gerät zu öffnen",
"sl": "Skenirajte to kodo, da odprete ta kraj na drugi napravi"
"sl": "Skenirajte to kodo, da odprete ta kraj na drugi napravi",
"da": "Skan denne kode for at åbne dette sted på en anden enhed"
}
}
},
@ -2724,7 +2725,8 @@
"nl": "Laatst gewijzigd op {_last_edit:timestamp} door {_last_edit:contributor} ",
"de": "Zuletzt bearbeitet am {_last_edit:timestamp} von {_last_edit:contributor}",
"ca": "Darrera edició el {_last_edit:timestamp} per {_last_edit:contributor}",
"cs": "Naposledy upravil {_last_edit:timestamp} {_last_edit:contributor}"
"cs": "Naposledy upravil {_last_edit:timestamp} {_last_edit:contributor}",
"da": "Senest redigeret {_last_edit:timestamp} af {_last_edit:contributor}"
},
"class": "subtle font-small"
}
@ -2746,7 +2748,8 @@
"type": "if_nothing_known",
"text": {
"en": "Nothing is known about this place. Help by filling out the questions",
"nl": "Er is nog niets geweten. Help mee door de vragen te beantwoorden"
"nl": "Er is nog niets geweten. Help mee door de vragen te beantwoorden",
"de": "Über diesen Ort ist nichts bekannt. Hilf mit, indem du die Fragen ausfüllst"
},
"cssClasses": "subtle m-4 italic flex items-center justify-center"
}

View file

@ -2,11 +2,13 @@
"id": "ski_piste",
"name": {
"en": "Ski and snowboard pistes",
"de": "Ski- und Snowboardpisten"
"de": "Ski- und Snowboardpisten",
"fr": "Pistes de ski et de snowboard"
},
"description": {
"en": "Ski and snowboard pistes",
"de": "Ski- und Snowboardpisten"
"de": "Ski- und Snowboardpisten",
"fr": "Pistes de ski et de snowboard"
},
"source": {
"osmTags": {
@ -25,7 +27,8 @@
"title": {
"render": {
"en": "Ski piste {name}",
"de": "Skipiste {name}"
"de": "Skipiste {name}",
"fr": "Piste de ski {name}"
}
},
"pointRendering": [
@ -80,7 +83,8 @@
{
"question": {
"en": "What is the difficulty of this piste?",
"de": "Was ist der Schwierigkeitsgrad der Piste?"
"de": "Was ist der Schwierigkeitsgrad der Piste?",
"fr": "Quelle est la difficulté de cette piste?"
},
"id": "piste_difficulty",
"condition": "piste:type!=connection",
@ -89,42 +93,48 @@
"if": "piste:difficulty=novice",
"then": {
"en": "Novice (green)",
"de": "Anfänger (grün)"
"de": "Anfänger (grün)",
"fr": "Débutant (vert)"
}
},
{
"if": "piste:difficulty=easy",
"then": {
"en": "Easy (blue)",
"de": "Einfach (blau)"
"de": "Einfach (blau)",
"fr": "Facile (bleu)"
}
},
{
"if": "piste:difficulty=intermediate",
"then": {
"en": "Intermediate (red)",
"de": "Mittel (rot)"
"de": "Mittel (rot)",
"fr": "Intermédiaire (rouge)"
}
},
{
"if": "piste:difficulty=advanced",
"then": {
"en": "Advanced (black)",
"de": "Fortgeschritten (schwarz)"
"de": "Fortgeschritten (schwarz)",
"fr": "Avancé (noir)"
}
},
{
"if": "piste:difficulty=expert",
"then": {
"en": "Expert (orange/double black)",
"de": "Experte (orange/doppel schwarz)"
"de": "Experte (orange/doppel schwarz)",
"fr": "Expert (orange/double noir)"
}
},
{
"if": "piste:difficulty=freeride",
"then": {
"en": "Freeride",
"de": "Freeride"
"de": "Freeride",
"fr": "Hors piste"
}
}
]
@ -133,7 +143,8 @@
"id": "length",
"render": {
"en": "This part of the ski piste is {_length:km} kilometer long",
"de": "Dieser Teil der Skipiste hat eine Länge von {_length:km} km"
"de": "Dieser Teil der Skipiste hat eine Länge von {_length:km} km",
"fr": "Ce tronçon de piste de ski mesure {_length:km} kilomètres de long"
}
}
]

View file

@ -3,13 +3,15 @@
"name": {
"en": "Paths, carfree and slow roads",
"nl": "Paadjes, trage wegen en autoluwe straten",
"de": "Pfade, autofreie und geschwindigkeitsreduzierte Straßen"
"de": "Pfade, autofreie und geschwindigkeitsreduzierte Straßen",
"fr": "Chemins, routes non carrossables et routes à vitesse réduite"
},
"description": {
"en": "All carfree roads",
"nl": "Alle verkeersvrije wegen",
"de": "Alle autofreien Straßen",
"ca": "Totes les carreteres sense cotxe"
"ca": "Totes les carreteres sense cotxe",
"fr": "Toutes les routes non carrossables"
},
"source": {
"osmTags": {
@ -115,7 +117,8 @@
"then": {
"en": "This is a living street",
"nl": "<div> Dit is een woonerf: <ul><li>Voetgangers mogen hier de volledige breedte van de straat gebruiken</li><li>Gemotoriseerd verkeer mag maximaal <b>20km/h</b> rijden</li></ul></div>",
"de": "Dies ist eine Wohnstraße"
"de": "Dies ist eine Wohnstraße",
"fr": "C'est une zone de rencontre"
},
"icon": {
"path": "./assets/layers/slow_roads/woonerf.svg",
@ -135,7 +138,8 @@
"then": {
"en": "This is a footway",
"nl": "Dit is een voetpaadje",
"de": "Dies ist ein Fußweg"
"de": "Dies ist ein Fußweg",
"fr": "C'est un chemin piéton"
}
},
{
@ -143,7 +147,8 @@
"then": {
"en": "This is a small path",
"nl": "Dit is een wegeltje of bospad",
"de": "Dies ist ein schmaler Pfad"
"de": "Dies ist ein schmaler Pfad",
"fr": "C'est un petit sentier"
}
},
{
@ -151,7 +156,8 @@
"then": {
"en": "This is a bridleway",
"nl": "Dit is een ruiterswegel",
"de": "Dies ist ein Reitweg"
"de": "Dies ist ein Reitweg",
"fr": "C'est une voie équestre"
}
},
{
@ -307,7 +313,8 @@
"question": {
"en": "Is this road lit at night?",
"nl": "Is deze weg 's nachts verlicht?",
"de": "Ist diese Straße nachts beleuchtet?"
"de": "Ist diese Straße nachts beleuchtet?",
"fr": "Cette route est-elle éclairée la nuit?"
},
"mappings": [
{

View file

@ -177,7 +177,7 @@
"then": {
"en": "Public access",
"de": "Der Zugang ist öffentlich",
"fr": "Accès publique",
"fr": "Accès public",
"nl": "Publiek toegankelijk",
"it": "Accesso pubblico",
"ru": "Свободный доступ",
@ -603,7 +603,8 @@
"then": {
"en": "Free menstrual products are available to all visitors of these toilets",
"nl": "Er zijn gratis menstruatieprocten beschikbaar voor alle bezoekers van deze toiletten",
"de": "Für alle Besucher dieser Toiletten stehen kostenlose Menstruationsprodukte zur Verfügung"
"de": "Für alle Besucher dieser Toiletten stehen kostenlose Menstruationsprodukte zur Verfügung",
"fr": "Protections menstruelles gratuites disponibles dans ces toilettes, pour tout le monde"
}
},
{
@ -611,7 +612,8 @@
"then": {
"en": "Free menstrual products are available to some visitors of these toilets",
"nl": "De gratis menstruatieproducten zijn enkel beschikbaar in een deel van de toiletten",
"de": "Für einige Besucher dieser Toiletten gibt es kostenlose Menstruationsprodukte"
"de": "Für einige Besucher dieser Toiletten gibt es kostenlose Menstruationsprodukte",
"fr": "Protections menstruelles gratuites disponibles dans ces toilettes, réservées à certains visiteurs"
},
"hideInAnswer": "gender_segregated=yes"
},
@ -621,7 +623,8 @@
"then": {
"en": "No free menstrual products are available here",
"nl": "Er zijn geen gratis menstruatieproducten beschikbaar",
"de": "Hier gibt es keine kostenlosen Menstruationsprodukte"
"de": "Hier gibt es keine kostenlosen Menstruationsprodukte",
"fr": "Pas protection menstruelle disponible ici"
}
}
]

View file

@ -53,7 +53,8 @@
"de": "Die Sprache wurde über einen URL-Parameter gesetzt und kann nicht vom Benutzer eingestellt werden.",
"ca": "L'idioma es va establir mitjançant un paràmetre d'URL i l'usuari no pot definir-lo.",
"cs": "Jazyk byl nastaven pomocí parametru URL a uživatel jej nemůže nastavit.²",
"nl": "De taal werd ingesteld via een URL-parameter en kan niet manueel ingesteld worden."
"nl": "De taal werd ingesteld via een URL-parameter en kan niet manueel ingesteld worden.",
"da": "Sproget er angivet vha. en URL-parameter og kan ikke angives af brugeren."
}
}
]
@ -72,7 +73,8 @@
"nl": "Ga naar je inbox",
"de": "Deinen Posteingang öffnen",
"ca": "Obre la teva safata d'entrada",
"cs": "Otevřít schránku"
"cs": "Otevřít schránku",
"da": "Åbn din indbakke"
}
}
}
@ -87,7 +89,8 @@
"de": "<b class='alert'>Sie haben {_unreadMessages} Nachrichten</b><br/>Posteingang öffnen",
"ca": "<b class='alert'>Tens {_unreadMessages} missatges </b><br/>Obri la safata d'entrada",
"cs": "<b class='alert'>Máte {_unreadMessages}</b><br/>Otevřít schránku",
"nl": "<b class='alert'>Je hebt {_unreadMessages} ongelezen berichten</b><br/>Ga naar je inbox"
"nl": "<b class='alert'>Je hebt {_unreadMessages} ongelezen berichten</b><br/>Ga naar je inbox",
"da": "<b class='alert'>Du har {_unreadMessages} beskeder</b><br/>Åbn din indbakke"
},
"href": "{_backend}/messages/inbox"
}
@ -105,7 +108,8 @@
"de": "Öffne Deine Einstellungen auf OpenStreetMap.org",
"ca": "Obriu la vostra configuració a OpenStreetMap.org",
"cs": "Otevřít vaše nastavení na OpenStreetMap.org",
"nl": "Open je instellingen op OpenStreetMap.org"
"nl": "Open je instellingen op OpenStreetMap.org",
"da": "Åbn dine indstillinger på OpenStreetMap.org"
},
"href": "{_backend}/account/edit"
}
@ -122,7 +126,8 @@
"question": {
"en": "What accessibility features should be applied?",
"nl": "Wanneer moet de toegankelijkheidsmode ingeschakeld worden?",
"de": "Welche Barrierefrei-Funktionen sollen angewendet werden?"
"de": "Welche Barrierefrei-Funktionen sollen angewendet werden?",
"da": "Hvilke tilgængelighedsfunktioner skal anvendes?"
},
"mappings": [
{
@ -132,7 +137,8 @@
"en": "Enable accessibility features when arrow keys are used to navigate the map",
"ca": "Activar les funcions d'accessibilitat quan s'utilitzen les tecles de fletxa per navegar pel mapa",
"nl": "Schakel toegankelijkheidsmode aan wanneer op de pijltjestoetsen wordt geduwd om de kaart te bewegen",
"de": "Barrierefrei-Modus aktivieren, wenn Pfeiltasten zum Navigieren in der Karte verwendet werden"
"de": "Barrierefrei-Modus aktivieren, wenn Pfeiltasten zum Navigieren in der Karte verwendet werden",
"da": "Aktiver tilgængelighedsfunktioner, når piletaster anvendes til at navigere i kortet"
}
},
{
@ -141,7 +147,8 @@
"en": "Always enable accessibility features",
"ca": "Sempre habilita les característiques d'accessibilitat",
"nl": "Schakel de toegankelijkheidsmode altijd aan",
"de": "Barrierefrei-Modus immer aktivieren"
"de": "Barrierefrei-Modus immer aktivieren",
"da": "Aktiver altid tilgængelighedsfunktioner"
}
},
{
@ -149,7 +156,8 @@
"then": {
"en": "Never enable accessibility features",
"nl": "Gebruik geen toegankelijkheidsmode",
"de": "Barrierefrei-Modus niemals aktivieren"
"de": "Barrierefrei-Modus niemals aktivieren",
"da": "Aktiver aldrig tilgængelighedsfunktioner"
}
}
]
@ -168,7 +176,8 @@
"ca": "Aquest mapa temàtic té un conjunt de capes de fons predefinides. La configuració predeterminada del tema no s'aplica",
"de": "Diese thematische Karte hat einen vordefinierten Hintergrund. Ihr Standardhintergrund wird nicht angewendet",
"cs": "Tato tematická mapa má předdefinovanou sadu podkladových vrstev. Vaše výchozí nastavení tématu se nepoužije",
"nl": "Deze kaart heeft een achtegrondlaag instgesteld. Je instellingen worden niet gebruikt"
"nl": "Deze kaart heeft een achtegrondlaag instgesteld. Je instellingen worden niet gebruikt",
"da": "Dette temakort har angivet et foruddefineret baggrundslag. Dine standardindstillinger benyttes ikke"
}
},
{
@ -179,7 +188,8 @@
"de": "Welche Hintergrundebene soll als Standard verwendet werden?",
"cs": "Jaká vrstva pozadí by se měla zobrazovat ve výchozím nastavení?",
"nl": "Welke achtergrondlaag moet altijd gebruikt worden?",
"fr": "Quel fond souhaitez-vous utiliser par défaut?"
"fr": "Quel fond souhaitez-vous utiliser par défaut?",
"da": "Hvilket baggrundslag skal vises som standard?"
},
"condition": "_theme:backgroundLayer=",
"mappings": [
@ -192,7 +202,8 @@
"de": "Standardhintergrund verwenden",
"cs": "Použití výchozí vrstvu pozadí",
"nl": "Gebruik de standaard achtergrondlaag",
"fr": "Utiliser le fond par défaut"
"fr": "Utiliser le fond par défaut",
"da": "Vis standardbaggrundslaget"
}
},
{
@ -203,7 +214,8 @@
"de": "OpenStreetMap-carto als Standardhintergrund verwenden",
"cs": "Použít OpenStreetMap-carto jako výchozí vrstvu",
"nl": "Gebruik OpenStreetMap-carto altijd als achtergrondlaag",
"fr": "Utiliser le fond OpenStreetMap-carto par défaut"
"fr": "Utiliser le fond OpenStreetMap-carto par défaut",
"da": "Brug OpenStreetMap-carto som standardlag"
}
},
{
@ -214,7 +226,8 @@
"de": "Satellitenbilder als Standardhintergrund verwenden",
"cs": "Použít letecké snímky jako výchozí pozadí",
"nl": "Gebruik luchtfoto's als standaard achtergrondlaag",
"fr": "Utiliser le fond imagerie aérienne par défaut"
"fr": "Utiliser le fond imagerie aérienne par défaut",
"da": "Brug luftfoto som standardbaggrund"
}
},
{
@ -225,7 +238,8 @@
"de": "Eine eigene Karte als Standardhintergrund verwenden",
"cs": "Použití mapy, která není založena na mapě openstreetmap, jako výchozího pozadí",
"nl": "Gebruik altijd een kaart di niet op OpenStreetMap gebaseerd is als achtergrond",
"fr": "Utiliser un fond non basé sur OpenStreetMap par défaut"
"fr": "Utiliser un fond non basé sur OpenStreetMap par défaut",
"da": "Brug et ikke-OpenSreetMap-baseret kort som standardbaggrund"
}
},
{
@ -236,7 +250,8 @@
"de": "Aktuelle Hintergrundebene (<span class='code'>{__current_background}</span>) als Standardhintergrund verwenden",
"cs": "Použít aktuální vrstvu pozadí (<span class='code'>{__current_background}</span>) jako výchozí pozadí",
"nl": "Gebruik altijd <span class='code'>{__current_background}</span> als achtergrondlaag. Dit is de huidige achtergrond.",
"fr": "Utiliser le fond actuel (<span class='code'>{__current_background}</span>) par défaut"
"fr": "Utiliser le fond actuel (<span class='code'>{__current_background}</span>) par défaut",
"da": "Brug det nuværende baggrundslag (<span class='code'>{__current_background}</span>) som standardbaggrund"
},
"hideInAnswer": {
"or": [
@ -254,7 +269,8 @@
"de": "Hintergrundebene <span class='code'>{mapcomplete-preferred-background-layer}</span> als Standardhintergrund verwenden",
"cs": "Použít vrstvu pozadí <span class='code'>{mapcomplete-preferred-background-layer}</span> jako výchozí pozadí",
"nl": "Gebruik <span class='code'>{mapcomplete-preferred-background-layer}</span> altijd als achtergrondlaag",
"fr": "Utiliser le fond (<span class='code'>{mapcomplete-preferred-background-layer}</span>)par défaut"
"fr": "Utiliser le fond (<span class='code'>{mapcomplete-preferred-background-layer}</span>)par défaut",
"da": "Brug baggrundslaget <span class='code'>{mapcomplete-preferred-background-layer}</span> som standardbaggrund"
},
"hideInAnswer": true
}
@ -269,7 +285,8 @@
"nl": "Met welke licentie wil je je afbeeldingen toevoegen?",
"ca": "Sota quina llicència vols publicar les teves fotos?",
"pt": "Sob que licença você deseja publicar suas fotos?",
"cs": "Pod jakou licencí chcete své fotografie zveřejnit?"
"cs": "Pod jakou licencí chcete své fotografie zveřejnit?",
"da": "Under hvilken licens vil du frigive dine billeder?"
},
"mappings": [
{
@ -402,7 +419,8 @@
"pt": "As perguntas para campos de dados desconhecidos devem aparecer uma a uma ou juntas?",
"ca": "Les preguntes amb camps de dades desconeguts haurien d'aparèixer una per una o juntes?",
"nl": "Moeten onbeantwoorde vragen om beurt of allemaal samen getoond worden?",
"cs": "Mají se otázky pro neznámá datová pole zobrazovat jednotlivě, nebo společně?"
"cs": "Mají se otázky pro neznámá datová pole zobrazovat jednotlivě, nebo společně?",
"da": "Skal spørgsmål for ukendte oplysninger vises ét ad gangen eller alle på én gang?"
},
"mappings": [
{
@ -414,7 +432,8 @@
"fr": "Afficher toutes les question en même temps dans l'infobox",
"pt": "Mostrar todas as perguntas na caixa de informações juntas",
"nl": "Toon alle onbeantwoorde vragen",
"cs": "Zobrazit všechny otázky v infoboxu dohromady"
"cs": "Zobrazit všechny otázky v infoboxu dohromady",
"da": "Vis alle spørgsmål i infoboksen på én gang"
}
},
{
@ -426,7 +445,8 @@
"fr": "Afficher les questions une à une",
"pt": "Mostrar perguntas uma a uma",
"nl": "Toon de vragen één per één",
"cs": "Zobrazit otázky jednu po druhé"
"cs": "Zobrazit otázky jednu po druhé",
"da": "Vis spørgsmål ét ad gangen"
}
}
]
@ -469,37 +489,43 @@
{
"id": "add-new-feature",
"question": {
"en": "How should the menu to add a new feature be opened?"
"en": "How should the menu to add a new feature be opened?",
"de": "Wie soll das Menü zum Hinzufügen eines neuen Objekts geöffnet werden?"
},
"mappings": [
{
"if": "mapcomplete-preferences-add-new-mode=button",
"then": {
"en": "Adding a new feature is done with the button at the bottom left. Clicking the map does nothing"
"en": "Adding a new feature is done with the button at the bottom left. Clicking the map does nothing",
"de": "Das Hinzufügen eines neuen Objekts erfolgt über die Schaltfläche unten links. Ein Klick auf die Karte bewirkt nichts"
}
},
{
"if": "mapcomplete-preferences-add-new-mode=click",
"then": {
"en": "When clicking or tapping the map, a marker pops up where a new feature is added"
"en": "When clicking or tapping the map, a marker pops up where a new feature is added",
"de": "Wenn Sie auf die Karte klicken oder tippen, wird eine Markierung eingeblendet, an der ein neues Objekt hinzugefügt wird"
}
},
{
"if": "mapcomplete-preferences-add-new-mode=click_right",
"then": {
"en": "When right-clicking or long-pressing the map, a marker pops up where a new feature can be added"
"en": "When right-clicking or long-pressing the map, a marker pops up where a new feature can be added",
"de": "Beim Rechtsklick oder einem langen Druck auf die Karte erscheint eine Markierung, mit der ein neues Objekt hinzugefügt werden kann"
}
},
{
"if": "mapcomplete-preferences-add-new-mode=button_click",
"then": {
"en": "When clicking or tapping the map, a marker pops up where a new feature can be added. Additionally, a button at the bottom left is shown"
"en": "When clicking or tapping the map, a marker pops up where a new feature can be added. Additionally, a button at the bottom left is shown",
"de": "Beim Klicken oder Tippen auf die Karte wird eine Markierung eingeblendet, an der ein neues Objekt hinzugefügt werden kann. Zusätzlich wird unten links eine Schaltfläche angezeigt"
}
},
{
"if": "mapcomplete-preferences-add-new-mode=button_click_right",
"then": {
"en": "When right-clicking or long-pressing the map, a marker pops up where a new feature can be added. Additionally, a button at the bottom left is shown"
"en": "When right-clicking or long-pressing the map, a marker pops up where a new feature can be added. Additionally, a button at the bottom left is shown",
"de": "Beim Rechtsklick oder einem langen Druck auf die Karte erscheint eine Markierung, an der ein neues Objekt hinzugefügt werden kann. Zusätzlich wird unten links eine Schaltfläche angezeigt"
}
}
]
@ -511,7 +537,8 @@
"de": "Soll Norden immer oben sein?",
"ca": "El nord hauria d'estar sempre amunt?",
"cs": "Měl by být sever vždy nahoře?",
"nl": "Moet het noorden altijd naar boven getoond worden?"
"nl": "Moet het noorden altijd naar boven getoond worden?",
"da": "Skal nord altid pege opad?"
},
"mappings": [
{
@ -536,7 +563,8 @@
"fr": "Toujours garder le nord en haut",
"ca": "Mantingueu sempre el nord apuntant cap amunt",
"cs": "Sever vždy směřujte nahoru",
"nl": "Hou het noorden altijd naar boven"
"nl": "Hou het noorden altijd naar boven",
"da": "Nord peger altid opad"
}
}
]
@ -623,13 +651,15 @@
"text": {
"en": "Import a mangrove private key from backup",
"nl": "Herstel een Mangrove Private sleutel van backup",
"de": "Privaten Mangrove-Schlüssel aus Backup importieren"
"de": "Privaten Mangrove-Schlüssel aus Backup importieren",
"da": "Indlæs en privat Mangrove-nøgle fra backup"
}
},
"after": {
"en": "Uploading a private key erases your current private key. If you made reviews with it, download your current private key first",
"de": "Wenn du einen privaten Schlüssel hochlädst, wird dein aktueller privater Schlüssel gelöscht. Wenn du damit Rezensionen geschrieben hast, lade zuerst deinen aktuellen privaten Schlüssel hoch",
"nl": "Een private sleutel uploaden overschrijft je huidige private sleutel. Indien je beoordelingen maakte met je huidige private sleutel, download deze dan eerst"
"nl": "Een private sleutel uploaden overschrijft je huidige private sleutel. Indien je beoordelingen maakte met je huidige private sleutel, download deze dan eerst",
"da": "Når du uploader en privat nøgle, slettes din nuværende private nøgle. Hvis du har brugt den til at lave anmeldelser, kan du downloade din private nøgle først"
}
}
},
@ -652,7 +682,8 @@
"ca": "Vols ajudar a traduir MapComplete?",
"fr": "Voulez-vous aider à traduire MapComplete ?",
"pt": "Quer ajudar na tradução do MapComplete?",
"nl": "Wil je MapComplete helpen vertalen?"
"nl": "Wil je MapComplete helpen vertalen?",
"da": "Vil du hjælpe med at oversætte MapComplete?"
},
"mappings": [
{
@ -862,7 +893,8 @@
"de": "Sie haben Code zu MapComplete mit {_code_contributions} Commits beigetragen! Das ist großartig!",
"nl": "Je hebt mee geprogrammeerd aan MapComplete met {_code_contributions} commits! Das supercool van je! Bedankt hiervoor!",
"ca": "Heu aportat codi a MapComplete amb {_code_contributions} commits! Això és increïble!",
"cs": "Přispěli jste do MapComplete kódem s {_code_contributions} revizemi! To je úžasné!"
"cs": "Přispěli jste do MapComplete kódem s {_code_contributions} revizemi! To je úžasné!",
"da": "Du har bidraget kode til MapComplete med {_code_contributions} commits! Det er fantastisk!"
},
"icon": "party",
"hideInAnswer": true

View file

@ -11,7 +11,8 @@
"zh_Hant": "廣告物件",
"eu": "Publizitatea",
"pl": "Reklamy",
"it": "Pubblicità"
"it": "Pubblicità",
"da": "Reklamer"
},
"description": {
"ca": "Alguna vegada t'has preguntat quanta publictat hi ha als nostres carrers i carreteres? Amb aquest mapa podràs trobar i afegir informació de tots els elements publictaris que t'hi trobes pel carrer",

View file

@ -20,7 +20,7 @@
"sl": "Defibrilatorji",
"zh_Hans": "Open AED Map",
"fil": "Open AED Map",
"da": "Åben AED Kort",
"da": "Hjertestartere",
"cs": "Defibrilátory",
"zgh": "ⴽⵛⵎ ⵖⵔ ⵜⴽⴰⵕⴹⴰ AED",
"eu": "Desfibriladoreak"

View file

@ -17,7 +17,7 @@
"ca": "Obra d'art",
"zh_Hans": "Open Artwork Map",
"fil": "Open Artwork Map",
"da": "Åbn illustrationskort",
"da": "Kunstværker",
"cs": "Umělecká díla",
"pa_PK": "آزاد کلاکاری نقشہ",
"zgh": "ⵕⵥⵎ ⵜⴰⴽⴰⵕⴹⴰ ⵜⵡⵓⵔⵉ ⵜⴰⵏⴰⵥⵓⵕⵜ",

View file

@ -14,7 +14,8 @@
"zh_Hant": "自動櫃員機",
"eu": "Kutxazain automatikoa",
"it": "Sportelli bancomat",
"pl": "Bankomaty"
"pl": "Bankomaty",
"da": "Hæveautomater"
},
"description": {
"en": "This map shows ATMs to withdraw or deposit money",
@ -29,7 +30,8 @@
"zh_Hant": "此地圖顯示了提款或存款的 ATM",
"eu": "Mapa honek dirua atera edo sartzeko kutxazain automatikoak erakusten ditu",
"it": "Questa mappa mostra gli sportelli Bancomat per ritirare o depositare del denaro",
"pl": "Ta mapa pokazuje bankomaty, w których można wypłacać lub wpłacać pieniądze"
"pl": "Ta mapa pokazuje bankomaty, w których można wypłacać lub wpłacać pieniądze",
"da": "Dette kort viser hæveautomater, hvor du kan hæve og indsætte kontanter"
},
"icon": "./assets/themes/atm/logo.svg",
"layers": [
@ -96,7 +98,8 @@
"eu": "Inportatu kutxazain automatiko hau",
"it": "Importa questo sportello bancomat",
"pl": "Importuj ten bankomat",
"cs": "Importovat tento bankomat"
"cs": "Importovat tento bankomat",
"da": "Importer denne hæveautomat"
},
"icon": "./assets/svg/addSmall.svg"
}
@ -112,7 +115,8 @@
"ca": "OpenStreetMap sap sobre <a href='#{_closest_osm_poi}'>un caixer automàtic que està a {_closest_osm_poi_distance} de distància.</a> ",
"cs": "OpenStreetMap ví o <a href='#{_closest_osm_poi}'> bankomatu, který je {_closest_osm_poi_distance} metr daleko.</a> ",
"pl": "OpenStreetMap wie o <a href='#{_closest_osm_poi}'>bankomacie oddalonym o {_closest_osm_poi_distance} metry.</a> ",
"nl": "OpenStreetMap kent <a href='#{_closest_osm_poi}'>een geldautomaat die {_closest_osm_poi_distance} meter weg is</a> "
"nl": "OpenStreetMap kent <a href='#{_closest_osm_poi}'>een geldautomaat die {_closest_osm_poi_distance} meter weg is</a> ",
"da": "OpenStreetMap kender <a href='#{_closest_osm_poi}'>en hæveautomatet, som ligger {_closest_osm_poi_distance} meter væk.</a> "
}
},
{
@ -132,7 +136,8 @@
"eu": "Gehitu iradokitako etiketa guztiak hurbilen dagoen kutxazainari",
"pl": "Dodaj wszystkie sugerowane znaczniki do najbliższego bankomatu",
"cs": "Přidání všech navrhovaných značek do nejbližšího bankomatu",
"nl": "Voeg alle gesuggereerde tags toe aan de dichtstbijzijnde geldautomaat"
"nl": "Voeg alle gesuggereerde tags toe aan de dichtstbijzijnde geldautomaat",
"da": "Tilføj alle foreslåede tags til den nærmeste hæveautomat"
},
"image": "./assets/svg/addSmall.svg",
"maproulette_id": "mr_taskId"

View file

@ -5,7 +5,8 @@
"de": "Fahrradabstellplätze",
"ca": "Aparcament de bicicletes",
"fr": "Stationnement vélo",
"pl": "Parkingi dla rowerów"
"pl": "Parkingi dla rowerów",
"da": "Cykelparkering"
},
"description": {
"en": "A map showing all types of bicycle parkings",

View file

@ -12,7 +12,8 @@
"es": "OSM para ciegos",
"eu": "OSM itsuentzat",
"it": "OSM per i non vedenti",
"pl": "OSM dla niewidomych"
"pl": "OSM dla niewidomych",
"da": "OSM for blinde"
},
"description": {
"en": "Help to map features relevant for the blind",

View file

@ -17,7 +17,8 @@
"pa_PK": "آزاد کتاب نقشہ",
"cs": "Veřejné knihovničky",
"eu": "Apalategi publikoak",
"pl": "Publiczne regały na książki"
"pl": "Publiczne regały na książki",
"da": "Bogbytteskabe"
},
"description": {
"en": "A public bookcase is a small streetside cabinet, box, old phone booth or some other objects where books are stored. Everyone can place or take a book. This map aims to collect all these bookcases.",
@ -30,7 +31,7 @@
"it": "Una libreria pubblica è una piccola cabina a lato della strada, un locale, una vecchia cabina telefonica o qualche altro luogo in cui sono tenuti libri. Chiunque può lasciare o prendere libri. Scopo della mappa è individuarle. Se scopri nuove librerie nelle vicinanze, puoi facilmente aggiungerle con un account OpenStreetMap.",
"hu": "A nyilvános könyvespolc egy kis utcai szekrény, doboz, régi telefonfülke vagy más tárgy, ahol könyveket tárolnak. Bárki tehet rá vagy vihet el róla könyvet. Ez a térkép ezeket a könyvespolcokat kívánja összegyűjteni. Ha felfedezett egy új könyvespolcot a közelben, akkor egy ingyenes OpenStreetMap-fiókkal gyorsan fel is rajzolhatja a térképre.",
"es": "Una librería pública es un pequeño armario en la calle, una caja, una vieja cabina telefónica o algún otro objeto donde se guardan libros. Todo el mundo puede colocar o coger un libro. Este mapa pretende recoger todas estas librerías.",
"da": "Et offentligt bogskab er et lille skab, en kasse, en gammel telefonboks eller andre steder, hvor bøger opbevares. Alle kan lægge eller tage en bog. Dette kort har til formål at samle alle disse bogskabe. Du kan opdage nye bogkasser i nærheden og med en gratis OpenStreetMap-konto hurtigt tilføje dine yndlingsbogkasser.",
"da": "Et bogbytteskab er et lille skab, en kasse, en gammel telefonboks eller andre steder, hvor bøger opbevares. Enhver kan lægge eller tage en bog. Dette kort har til formål at samle alle disse bogbytteskabe.",
"ca": "Una llibreria pública és un xicotet armari al carrer, una caixa, una vella cabina telefònica o algun altre objecte on es guarden llibres. Tothom pot col·locar o agafar un llibre. Aquest mapa pretén recollir totes aquestes llibreries.",
"cs": "Veřejná knihovna je malá pouliční skříňka, krabice, stará telefonní budka nebo jiný předmět, ve kterém jsou uloženy knihy. Kdokoliv do ní může umístit, nebo si z ní vzít knihu. Cílem této mapy je shromáždit všechny tyto knihovny.",
"eu": "Kale-liburutegi publiko bat kale-armairu txiki bat da, kaxa, telefono-kabina zaharra edo liburuak gordetzeko beste objektu batzuk. Guztiek jar edo har dezakete liburu bat. Koaderno horiek guztiak biltzea da mapa honen helburua.",

View file

@ -348,7 +348,8 @@
"es": "¿Esta tienda de reparación de zapatos repara zapatos de escalada?",
"ca": "Aquesta botiga de reparació de calçat repara sabates d'escalada?",
"cs": "Opravuje tato opravna obuvy horolezecké boty?",
"pl": "Czy ten warsztat szewski naprawia buty wspinaczkowe?"
"pl": "Czy ten warsztat szewski naprawia buty wspinaczkowe?",
"da": "Reparerer denne butik klatresko?"
},
"mappings": [
{
@ -360,7 +361,8 @@
"es": "Esta tienda repara zapatos de escalada",
"ca": "Aquesta botiga repara sabates d'escalada",
"cs": "Tento obchod opravuje lezeckou obuv",
"pl": "Ten warsztat naprawia buty wspinaczkowe"
"pl": "Ten warsztat naprawia buty wspinaczkowe",
"da": "Denne butik reparerer klatresko"
}
},
{
@ -372,7 +374,8 @@
"es": "Esta tienda no repara zapatos de escalada",
"ca": "Aquesta botiga no repara sabates d'escalada",
"cs": "Tento obchod neopravuje lezeckou obuv",
"pl": "Ten warsztat nie naprawia butów wspinaczkowych"
"pl": "Ten warsztat nie naprawia butów wspinaczkowych",
"da": "Denne butik reparerer ikke klatresko"
}
}
]
@ -404,7 +407,8 @@
"es": "¿Esta tienda de reparación de zapatos también repara zapatos de escalada?",
"ca": "Aquesta botiga de reparació de calçat també repara sabates d'escalada?",
"cs": "Opravuje tato opravna obuvy také lezeckou obuv?",
"pl": "Czy ten warsztat obuwniczy naprawia również buty wspinaczkowe?"
"pl": "Czy ten warsztat obuwniczy naprawia również buty wspinaczkowe?",
"da": "Reparerer denne skomager klatresko?"
},
"mappings": [
{
@ -416,7 +420,8 @@
"es": "Esta tienda repara zapatos de escalada",
"ca": "Aquesta botiga repara sabates d'escalada",
"cs": "Tento obchod opravuje lezeckou obuv",
"pl": "Ten warsztat naprawia buty wspinaczkowe"
"pl": "Ten warsztat naprawia buty wspinaczkowe",
"da": "Denne butik reparerer klatresko"
}
},
{
@ -428,7 +433,8 @@
"es": "Esta tienda no repara zapatos de escalada",
"ca": "Aquesta botiga no repara sabates d'escalada",
"cs": "Tento obchod neopravuje lezeckou obuv",
"pl": "Ten warsztat nie naprawia butów wspinaczkowych"
"pl": "Ten warsztat nie naprawia butów wspinaczkowych",
"da": "Denne butik reparerer ikke klatresko"
}
}
]
@ -446,7 +452,8 @@
"es": "una tienda de reparación de zapatos",
"ca": "una botiga de reparació de calçat",
"cs": "opravna bot",
"pl": "warsztat szewski"
"pl": "warsztat szewski",
"da": "en skomager"
}
}
]

View file

@ -9,7 +9,8 @@
"cs": "Hodiny",
"fr": "Horloges",
"eu": "Erlojuak",
"pl": "Zegary"
"pl": "Zegary",
"da": "Ure"
},
"description": {
"en": "Map showing all public clocks",
@ -19,7 +20,8 @@
"es": "Mapa con todos los relojes públicos",
"cs": "Mapa zobrazující veřejné hodiny",
"fr": "Carte affichant toutes les horloges publiques",
"pl": "Mapa pokazująca wszystkie zegary publiczne"
"pl": "Mapa pokazująca wszystkie zegary publiczne",
"da": "Kort over alle ure i det offentlige rum"
},
"icon": "./assets/layers/clock/clock.svg",
"layers": [

View file

@ -229,7 +229,8 @@
"de": "z.B. 1",
"cs": "e.g. 1",
"es": "Por ejemplo, 1",
"pl": "np. 1"
"pl": "np. 1",
"da": "fx 1"
}
},
"render": {
@ -298,7 +299,8 @@
"de": "z.B. 3",
"cs": "e.g. 3",
"es": "Por ejemplo, 3",
"pl": "np. 3"
"pl": "np. 3",
"da": "fx 3"
}
},
"id": "node-expected_rcn_route_relations"

View file

@ -624,7 +624,8 @@
"ca": "Residents permesos",
"es": "Residentes autorizados",
"cs": "Přístup povolen obyvatelům",
"pl": "Mieszkańcy dopuszczeni"
"pl": "Mieszkańcy dopuszczeni",
"da": "Beboere tilladt"
},
"icon": {
"path": "./assets/themes/cyclestreets/Zeichen_244_1020-30.svg",
@ -647,7 +648,8 @@
"cs": "Vjezd motorových vozidel povolen",
"ca": "Vehicles a motor permesos",
"es": "Vehículos a motor permitidos",
"pl": "Pojazdy silnikowe dozwolone"
"pl": "Pojazdy silnikowe dozwolone",
"da": "Motorkøretøjer tilladt"
},
"icon": {
"path": "./assets/themes/cyclestreets/Zeichen_244_KFZ_frei.svg",
@ -671,7 +673,8 @@
"cs": "Vjezd motocyklů povolen",
"ca": "Motos permeses",
"es": "Motocicletas permitidas",
"pl": "Motocykle dozwolone"
"pl": "Motocykle dozwolone",
"da": "Motorcykler tilladt"
},
"icon": {
"path": "./assets/themes/cyclestreets/Zeichen_244_1022-12.svg",
@ -696,7 +699,8 @@
"nb_NO": "Biler tillatt",
"ca": "Cotxes permesos",
"es": "Coches permitidos",
"pl": "Samochody dozwolone"
"pl": "Samochody dozwolone",
"da": "Biler tilladt"
},
"icon": {
"path": "./assets/themes/cyclestreets/Zeichen_244_1024-10.svg",

View file

@ -5,7 +5,8 @@
"it": "Risposta ai disastri",
"de": "Katastrophenschutz",
"es": "Respuesta ante desastres",
"ca": "Resposta davant de desastres"
"ca": "Resposta davant de desastres",
"da": "Beredskab"
},
"description": {
"en": "This map contains elements meant for disaster preparedness and response.",

View file

@ -10,7 +10,7 @@
"hu": "Etimológiai térkép",
"fr": "Étymologie - d'où les rues tirent leur nom ?",
"ca": "Etimologia: com rep el nom un carrer?",
"da": "Åbn oprindelseskort",
"da": "Etymology - hvad er et sted opkaldt efter?",
"nb_NO": "Åpent etymologikart",
"cs": "Etymologie - podle čeho se ulice jmenuje?",
"es": "Etimología - a qué se debe el nombre de una calle?",

View file

@ -6,7 +6,7 @@
"fr": "Carte des friteries",
"de": "Pommesbuden",
"ca": "Botigues de patates",
"da": "Pommes frites butik",
"da": "Pomfritbutikker",
"pa_PK": "فرائیاں دیاں دکاناں",
"cs": "Obchody s hranolky",
"es": "Tiendas de patatas fritas",
@ -37,7 +37,7 @@
"it": "Friggitoria",
"hu": "Sültkrumplievő-hely",
"ca": "Botigues de patates",
"da": "Pommes frites butik",
"da": "Pomfritbutik",
"pa_PK": "فرائیاں دی دکان",
"cs": "Obchod s hranolky",
"es": "Tienda de patatas fritas",

View file

@ -5,7 +5,8 @@
"de": "Eiscreme",
"cs": "Zmrzlina",
"ca": "Gelat",
"es": "Helado"
"es": "Helado",
"da": "Is"
},
"description": {
"en": "A map showing ice cream parlors and ice cream vending machines",

View file

@ -2,7 +2,8 @@
"id": "lighthouses",
"title": {
"en": "Lighthouses",
"de": "Leuchttürme"
"de": "Leuchttürme",
"da": "Fyrtårne"
},
"description": {
"en": "Lighthouses are tall buildings with a light on top to guide marine traffic.",

View file

@ -6,7 +6,7 @@
"ca": "Velocitat",
"de": "Höchstgeschwindigkeit",
"fr": "Vitesse maximale",
"da": "Højeste hastighed",
"da": "Fartgrænser",
"nl": "Maximale snelheden",
"pa_PK": "حد رفتار",
"cs": "Maximální rychlost",

View file

@ -4,7 +4,8 @@
"en": "Memorials",
"de": "Denkmäler",
"fr": "Mémoriaux",
"nl": "Gedenktekens en graven"
"nl": "Gedenktekens en graven",
"da": "Mindesmærker"
},
"description": {
"en": "Memorials are physical objects permantently placed in the public space to remember a person or event. They can be a wide range of objects, such as statues, plaques, paintings, military objects (such as tanks), ...",

View file

@ -279,7 +279,8 @@
"cs": "Parkovací místa pro osoby se zdravotním postižením",
"es": "Plazas de aparcamiento para discapacitados",
"ca": "Places d'aparcament per a minusvàlids",
"pl": "Miejsca parkingowe dla niepełnosprawnych"
"pl": "Miejsca parkingowe dla niepełnosprawnych",
"da": "Handikapparkeringspladser"
}
},
"hideTagRenderingsWithLabels": [

View file

@ -111,7 +111,8 @@
"title": {
"en": "a condom vending machine",
"de": "ein Kondomautomat",
"es": "una máquina de venta de condones"
"es": "una máquina de venta de condones",
"da": "en kondomautomat"
},
"tags": [
"amenity=vending_machine",

View file

@ -15,7 +15,8 @@
"pa_PK": "اوپن‌ونڈ‌پاور‌میپ",
"es": "Generadores de energía eólica",
"cs": "Větrné elektrárny",
"pl": "Generatory wiatrowe"
"pl": "Generatory wiatrowe",
"da": "Vindmøller"
},
"description": {
"en": "A map for showing and editing wind turbines.",

View file

@ -2,7 +2,7 @@
"id": "pets",
"title": {
"en": "Veterinarians, dog parks and other pet-amenities",
"da": "hundesteder",
"da": "Dyrlæger, hundeparker og andre faciliteter for kæledyr",
"de": "Tierärzte, Hundeparks und andere Einrichtungen für Haustiere",
"nl": "Dierenartsen, hondenloopzones en andere huisdiervriendelijke plaatsen",
"fr": "Vétérinaires, parcs à chiens et autres endroits pour chiens",

View file

@ -9,7 +9,7 @@
"hu": "Posta- és postaládatérkép",
"nl": "Brievenbussen en postkantoren",
"fr": "Carte des bureaux de poste et boîtes à lettres",
"da": "Postkasse- og Posthus-Kort",
"da": "Postkasser og posthuse",
"ca": "Mapa de bústies i oficines de correus",
"es": "Mapa de Buzones y Oficinas de Correos",
"cs": "Mapa poštovních schránek a pošt",

View file

@ -4,7 +4,7 @@
"en": "Rainbow pedestrian crossings",
"de": "Regenbogen-Fußgängerübergänge",
"fr": "Passages piétons arc-en-ciel",
"da": "Regnbue fodgængerfelter",
"da": "Regnbuemalede fodgængerfelter",
"nl": "Regenboogzebrapaden",
"ru": "Радужные пешеходные переходы",
"ca": "Pasos de vianants amb l'arc de Sant Martí",

View file

@ -12,7 +12,7 @@
"hu": "Bolttérkép",
"nl": "Winkels",
"ca": "Botigues",
"da": "Åbn butikskort",
"da": "Butikker",
"es": "Tiendas",
"cs": "Obchody",
"eu": "Denda",

View file

@ -3,7 +3,9 @@
"title": {
"en": "Ski pistes and aerialways",
"de": "Skipisten und Seilbahnen",
"es": "Pistas de esquí y vías aéreas"
"es": "Pistas de esquí y vías aéreas",
"da": "Skiløjper og skilifte",
"fr": "Pistes de ski et remontées mécaniques"
},
"description": {
"en": "Everything you need to go skiing",

View file

@ -10,7 +10,8 @@
"es": "Estaciones de tren",
"cs": "Vlaková nádraží",
"zh_Hant": "火車站",
"pl": "Stacje Kolejowe"
"pl": "Stacje Kolejowe",
"da": "Togstationer"
},
"description": {
"en": "View, edit and add details to a train station",
@ -72,7 +73,8 @@
"cs": "Vlaková nádraží",
"it": "Stazioni ferroviarie",
"pl": "Stacje Kolejowe",
"zh_Hant": "火車站"
"zh_Hant": "火車站",
"da": "Togstationer"
},
"description": {
"en": "Layer showing train stations",
@ -294,7 +296,8 @@
"es": "Tableros de salidas",
"cs": "Odjezdové tabule",
"pl": "Tablice odjazdów",
"zh_Hant": "出發板"
"zh_Hant": "出發板",
"da": "Afgangstavler"
},
"description": {
"en": "Displays showing the trains that will leave from this station",
@ -316,7 +319,8 @@
"es": "Tablero de salidas",
"cs": "Odjezdová tabule",
"zh_Hant": "時刻表",
"pl": "Tablica odjazdów"
"pl": "Tablica odjazdów",
"da": "Afgangstavle"
}
},
"minzoom": 18,
@ -342,7 +346,8 @@
"es": "¿Qué tipo de tablero de salidas es éste?",
"cs": "Co je to za odjezdovou tabuli?",
"zh_Hant": "這是那種類型的時刻表?",
"pl": "Co to za tablica odjazdów?"
"pl": "Co to za tablica odjazdów?",
"da": "Hvilken type afgangstavle er dette?"
},
"mappings": [
{
@ -417,7 +422,8 @@
"es": "un tablero de salidas",
"cs": "odjezdová tabule",
"zh_Hant": "時刻表",
"pl": "tablica odjazdów"
"pl": "tablica odjazdów",
"da": "en afgangstavle"
},
"description": {
"en": "Add a board showing departures, either electronic or paper",

View file

@ -13,7 +13,7 @@
"nb_NO": "Åpent toalettkart",
"hu": "WC-térkép",
"ca": "Lavabos públics",
"da": "Åbn toiletkort",
"da": "Offentlige toiletter",
"es": "Baños públicos",
"cs": "Veřejné toalety"
},

View file

@ -9,7 +9,8 @@
"cs": "Prodejní automaty",
"es": "Máquinas expendedoras",
"pl": "Automaty sprzedające",
"zh_Hant": "自動販賣機"
"zh_Hant": "自動販賣機",
"da": "Salgsautomater"
},
"description": {
"en": "Find vending machines for everything",

View file

@ -23,7 +23,7 @@
"fr": "Carte des poubelles et infrastructures de recyclage.",
"it": "Mappa dei cestini per i rifiuti e i centri di raccolta e riciclo rifiuti.",
"ca": "Mapa que mostra papereres i infraestructures de reciclatge.",
"da": "Kort over affaldskurve og genbrugsanlæg.",
"da": "Kort over skraldespande og genbrugsanlæg.",
"es": "Mapa que muestra las papeleras y las instalaciones de reciclaje.",
"cs": "Mapa zobrazující koše na odpadky a recyklační zařízení.",
"zh_Hant": "顯示垃圾筒與回收設施的地圖。",

View file

@ -11,7 +11,7 @@
"ca": "Papepera",
"fr": "Poubelles",
"nb_NO": "Søppelkurv",
"da": "Affaldskurv",
"da": "Skraldespande",
"pa_PK": "کوڑے دی ٹوکری",
"es": "Papeleras",
"cs": "Odpadkový koš",
@ -25,7 +25,7 @@
"zh_Hant": "在這份地圖當中,你可以找到你附近的垃圾筒。如果地圖有遺漏垃圾筒,你可以自己加上去",
"hu": "Ezen a térképen megtalálhatod a közeledben lévő szemeteskosarakat. Ha hiányzik egy kuka a térképről, te is felrajzolhatod",
"fr": "Retrouvez les poubelles près de vous. Si une poubelle est manquante, vous pouvez lajouter vous même",
"da": "På dette kort finder du affaldskurve i nærheden af dig. Hvis der mangler en affaldskurv på dette kort, kan du selv tilføje den",
"da": "På dette kort finder du skraldespande i nærheden af dig. Hvis der mangler en skraldespand på dette kort, kan du selv tilføje den",
"ca": "A aquest mapa trobaràs les papereres a prop teua. Si falta una paperera al mapa pots afegir-la tu mateix",
"es": "En este mapa, encontrará las papeleras cercanas a usted. Si falta una papelera en el mapa, puede añadirla usted mismo",
"cs": "Na této mapě najdete koše na odpadky ve vašem okolí. Pokud na této mapě odpadkový koš chybí, můžete jej přidat sami",
@ -40,7 +40,7 @@
"hu": "Szemeteskosarakat ábrázoló térkép",
"fr": "Une carte des poubelles",
"nb_NO": "Oversikt over søppelkurver",
"da": "Et kort med affaldskurve",
"da": "Et kort over skraldespande",
"ca": "Un mapa amb papereres",
"es": "Un mapa con papeleras",
"cs": "Mapa odpadkových košů",

View file

@ -94,12 +94,6 @@
"1": {
"then": "Vægmaleri"
},
"10": {
"then": "Azulejo (spansk dekorativt flisebeklædning)"
},
"11": {
"then": "flisebeklædning"
},
"2": {
"then": "Maleri"
},
@ -123,6 +117,12 @@
},
"9": {
"then": "Relief"
},
"10": {
"then": "Azulejo (spansk dekorativt flisebeklædning)"
},
"11": {
"then": "flisebeklædning"
}
},
"question": "Hvilken slags kunstværk er det?",
@ -2873,4 +2873,4 @@
"render": "vindmølle"
}
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -35,23 +35,6 @@
"1": {
"title": "un panneau à affiches scellé au sol"
},
"10": {
"description": "Une pièce de textile imperméable avec un message imprimé, ancrée de façon permanente sur un mur.",
"title": "une bâche"
},
"11": {
"title": "un totem"
},
"12": {
"description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées",
"title": "une enseigne"
},
"13": {
"title": "une sculpture"
},
"14": {
"title": "une peinture murale"
},
"2": {
"title": "un panneau à affiches monté sur un mur"
},
@ -77,6 +60,23 @@
},
"9": {
"title": "un écran fixé sur un abri de transport"
},
"10": {
"description": "Une pièce de textile imperméable avec un message imprimé, ancrée de façon permanente sur un mur.",
"title": "une bâche"
},
"11": {
"title": "un totem"
},
"12": {
"description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées",
"title": "une enseigne"
},
"13": {
"title": "une sculpture"
},
"14": {
"title": "une peinture murale"
}
},
"tagRenderings": {
@ -168,9 +168,6 @@
"1": {
"then": "C'est un petit panneau"
},
"10": {
"then": "C'est une peinture murale"
},
"2": {
"then": "C'est une colonne"
},
@ -194,6 +191,9 @@
},
"9": {
"then": "C'est un totem"
},
"10": {
"then": "C'est une peinture murale"
}
},
"question": "De quel type de dispositif publicitaire s'agit-il ?",
@ -205,9 +205,6 @@
"1": {
"then": "Petit panneau"
},
"10": {
"then": "Peinture murale"
},
"3": {
"then": "Colonne"
},
@ -228,6 +225,9 @@
},
"9": {
"then": "Totem"
},
"10": {
"then": "Peinture murale"
}
}
}
@ -328,15 +328,6 @@
"1": {
"then": "Peinture murale"
},
"10": {
"then": "Azulejo (faïence latine)"
},
"11": {
"then": "Carrelage"
},
"12": {
"then": "Sculpture sur bois"
},
"2": {
"then": "Peinture"
},
@ -360,6 +351,15 @@
},
"9": {
"then": "Relief"
},
"10": {
"then": "Azulejo (faïence latine)"
},
"11": {
"then": "Carrelage"
},
"12": {
"then": "Sculpture sur bois"
}
},
"question": "Quel est le type de cette œuvre d'art ?",
@ -2451,15 +2451,6 @@
"1": {
"then": "Cette piste cyclable est goudronée"
},
"10": {
"then": "Cette piste cyclable est faite en graviers fins"
},
"11": {
"then": "Cette piste cyclable est en cailloux"
},
"12": {
"then": "Cette piste cyclable est faite en sol brut"
},
"2": {
"then": "Cette piste cyclable est asphaltée"
},
@ -2483,6 +2474,15 @@
},
"9": {
"then": "Cette piste cyclable est faite en graviers"
},
"10": {
"then": "Cette piste cyclable est faite en graviers fins"
},
"11": {
"then": "Cette piste cyclable est en cailloux"
},
"12": {
"then": "Cette piste cyclable est faite en sol brut"
}
},
"question": "De quoi est faite la surface de la piste cyclable ?",
@ -2531,15 +2531,6 @@
"1": {
"then": "Cette piste cyclable est pavée"
},
"10": {
"then": "Cette piste cyclable est faite en graviers fins"
},
"11": {
"then": "Cette piste cyclable est en cailloux"
},
"12": {
"then": "Cette piste cyclable est faite en sol brut"
},
"2": {
"then": "Cette piste cyclable est asphaltée"
},
@ -2563,6 +2554,15 @@
},
"9": {
"then": "Cette piste cyclable est faite en graviers"
},
"10": {
"then": "Cette piste cyclable est faite en graviers fins"
},
"11": {
"then": "Cette piste cyclable est en cailloux"
},
"12": {
"then": "Cette piste cyclable est faite en sol brut"
}
},
"question": "De quel materiel est faite cette rue ?",
@ -3412,21 +3412,6 @@
"1": {
"then": "C'est une friterie"
},
"10": {
"then": "Des plats chinois sont servis ici"
},
"11": {
"then": "Des plats grecs sont servis ici"
},
"12": {
"then": "Des plats indiens sont servis ici"
},
"13": {
"then": "Des plats turcs sont servis ici"
},
"14": {
"then": "Des plats thaïlandais sont servis ici"
},
"2": {
"then": "Restaurant Italien"
},
@ -3450,6 +3435,21 @@
},
"9": {
"then": "Des plats français sont servis ici"
},
"10": {
"then": "Des plats chinois sont servis ici"
},
"11": {
"then": "Des plats grecs sont servis ici"
},
"12": {
"then": "Des plats indiens sont servis ici"
},
"13": {
"then": "Des plats turcs sont servis ici"
},
"14": {
"then": "Des plats thaïlandais sont servis ici"
}
},
"question": "Quelle type de nourriture est servie ici ?",
@ -3843,11 +3843,11 @@
},
"room-type": {
"mappings": {
"14": {
"then": "C'est un bureau"
},
"4": {
"then": "C'est une salle de classe"
},
"14": {
"then": "C'est un bureau"
}
}
}
@ -4128,18 +4128,6 @@
"1": {
"then": "C'est une plaque"
},
"10": {
"then": "C'est une croix"
},
"11": {
"then": "C'est une plaque bleue (spécifique aux pays anglo-saxons)"
},
"12": {
"then": "C'est un char historique, placé de manière permanente dans l'espace public comme mémorial"
},
"13": {
"then": "C'est un arbre du souvenir"
},
"2": {
"then": "C'est un banc commémoratif"
},
@ -4163,6 +4151,18 @@
},
"9": {
"then": "C'est un obélisque"
},
"10": {
"then": "C'est une croix"
},
"11": {
"then": "C'est une plaque bleue (spécifique aux pays anglo-saxons)"
},
"12": {
"then": "C'est un char historique, placé de manière permanente dans l'espace public comme mémorial"
},
"13": {
"then": "C'est un arbre du souvenir"
}
},
"question": "C'est un mémorial de guerre",
@ -5254,6 +5254,30 @@
"1": {
"question": "Recyclage de piles et batteries domestiques"
},
"2": {
"question": "Recyclage d'emballage de boissons"
},
"3": {
"question": "Recyclage de boites de conserve et de canettes"
},
"4": {
"question": "Recyclage de vêtements"
},
"5": {
"question": "Recyclage des huiles de friture"
},
"6": {
"question": "Recyclage des huiles de moteur"
},
"7": {
"question": "Recyclage des lampes fluorescentes"
},
"8": {
"question": "Recyclage des déchets verts"
},
"9": {
"question": "Recyclage des bouteilles en verre et des bocaux"
},
"10": {
"question": "Recyclage de tout type de verre"
},
@ -5284,35 +5308,11 @@
"19": {
"question": "Recyclage des autres déchets"
},
"2": {
"question": "Recyclage d'emballage de boissons"
},
"20": {
"question": "Recyclage des cartouches d'imprimante"
},
"21": {
"question": "Recyclage des vélos"
},
"3": {
"question": "Recyclage de boites de conserve et de canettes"
},
"4": {
"question": "Recyclage de vêtements"
},
"5": {
"question": "Recyclage des huiles de friture"
},
"6": {
"question": "Recyclage des huiles de moteur"
},
"7": {
"question": "Recyclage des lampes fluorescentes"
},
"8": {
"question": "Recyclage des déchets verts"
},
"9": {
"question": "Recyclage des bouteilles en verre et des bocaux"
}
}
},
@ -5375,6 +5375,30 @@
"1": {
"then": "Les briques alimentaires en carton peuvent être recyclées ici"
},
"2": {
"then": "Les boites de conserve et canettes peuvent être recyclées ici"
},
"3": {
"then": "Les vêtements peuvent être recyclés ici"
},
"4": {
"then": "Les huiles de friture peuvent être recyclées ici"
},
"5": {
"then": "Les huiles de moteur peuvent être recyclées ici"
},
"6": {
"then": "Les lampes fluorescentes peuvent être recyclées ici"
},
"7": {
"then": "Les déchets verts peuvent être recyclés ici"
},
"8": {
"then": "Les déchets organiques peuvent être recyclés ici"
},
"9": {
"then": "Les bouteilles en verre et bocaux peuvent être recyclés ici"
},
"10": {
"then": "Tout type de verre peut être recyclé ici"
},
@ -5402,9 +5426,6 @@
"19": {
"then": "La ferraille peut être recyclée ici"
},
"2": {
"then": "Les boites de conserve et canettes peuvent être recyclées ici"
},
"20": {
"then": "Les chaussures peuvent être recyclées ici"
},
@ -5422,27 +5443,6 @@
},
"25": {
"then": "Les vélos peuvent être recyclés ici"
},
"3": {
"then": "Les vêtements peuvent être recyclés ici"
},
"4": {
"then": "Les huiles de friture peuvent être recyclées ici"
},
"5": {
"then": "Les huiles de moteur peuvent être recyclées ici"
},
"6": {
"then": "Les lampes fluorescentes peuvent être recyclées ici"
},
"7": {
"then": "Les déchets verts peuvent être recyclés ici"
},
"8": {
"then": "Les déchets organiques peuvent être recyclés ici"
},
"9": {
"then": "Les bouteilles en verre et bocaux peuvent être recyclés ici"
}
},
"question": "Que peut-on recycler ici ?"
@ -6891,27 +6891,6 @@
"1": {
"question": "Vente de boissons"
},
"10": {
"question": "Vente de lait"
},
"11": {
"question": "Vente de pain"
},
"12": {
"question": "Vente d'œufs"
},
"13": {
"question": "Vente de fromage"
},
"14": {
"question": "Vente de miel"
},
"15": {
"question": "Vente de pommes de terre"
},
"19": {
"question": "Vente de fleurs"
},
"2": {
"question": "Ventre de confiseries"
},
@ -6935,6 +6914,27 @@
},
"9": {
"question": "Vente de chambres à air pour vélo"
},
"10": {
"question": "Vente de lait"
},
"11": {
"question": "Vente de pain"
},
"12": {
"question": "Vente d'œufs"
},
"13": {
"question": "Vente de fromage"
},
"14": {
"question": "Vente de miel"
},
"15": {
"question": "Vente de pommes de terre"
},
"19": {
"question": "Vente de fleurs"
}
}
}
@ -6992,24 +6992,6 @@
"1": {
"then": "Vent des confiseries"
},
"10": {
"then": "Vent du pain"
},
"11": {
"then": "Vent des œufs"
},
"12": {
"then": "Vent du fromage"
},
"13": {
"then": "Vent du miel"
},
"14": {
"then": "Vent des pommes de terre"
},
"18": {
"then": "Vent des fleurs"
},
"2": {
"then": "Vent de la nourriture"
},
@ -7033,6 +7015,24 @@
},
"9": {
"then": "Vent du lait"
},
"10": {
"then": "Vent du pain"
},
"11": {
"then": "Vent des œufs"
},
"12": {
"then": "Vent du fromage"
},
"13": {
"then": "Vent du miel"
},
"14": {
"then": "Vent des pommes de terre"
},
"18": {
"then": "Vent des fleurs"
}
},
"question": "Que vent ce distributeur ?",
@ -7235,4 +7235,4 @@
"render": "éolienne"
}
}
}
}

View file

@ -820,33 +820,6 @@
"onwheels": {
"description": "På dette kort vises steder, der er offentligt tilgængelige for kørestolsbrugere, og de kan nemt tilføjes",
"layers": {
"19": {
"override": {
"=title": {
"render": "Statistikker"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importere"
}
}
},
"1": {
"render": {
"special": {
"message": "Tilføj alle de foreslåede tags"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -889,6 +862,33 @@
"override": {
"name": "Handikapparkeringspladser"
}
},
"19": {
"override": {
"=title": {
"render": "Statistikker"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importere"
}
}
},
"1": {
"render": {
"special": {
"message": "Tilføj alle de foreslåede tags"
}
}
}
}
}
}
}
},
@ -1041,6 +1041,9 @@
},
"stations": {
"layers": {
"3": {
"name": "Togstationer"
},
"16": {
"name": "Afgangstavler",
"presets": {
@ -1056,9 +1059,6 @@
"title": {
"render": "Afgangstavle"
}
},
"3": {
"name": "Togstationer"
}
},
"title": "Togstationer"
@ -1153,4 +1153,4 @@
"shortDescription": "Et kort over skraldespande",
"title": "Skraldespande"
}
}
}

View file

@ -868,33 +868,6 @@
"onwheels": {
"description": "Sur cette carte nous pouvons voir et ajouter les différents endroits publiques accessibles aux chaises roulantes",
"layers": {
"19": {
"override": {
"=title": {
"render": "Statistiques"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importation"
}
}
},
"1": {
"render": {
"special": {
"message": "Ajouter tous les attributs suggérés"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -937,6 +910,33 @@
"override": {
"name": "Places de stationnement pour personnes handicapées"
}
},
"19": {
"override": {
"=title": {
"render": "Statistiques"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importation"
}
}
},
"1": {
"render": {
"special": {
"message": "Ajouter tous les attributs suggérés"
}
}
}
}
}
}
},
"title": "OnWheels"
@ -1100,6 +1100,10 @@
"stations": {
"description": "Voir, modifier et ajouter des détails à une gare ferroviaire",
"layers": {
"3": {
"description": "Couche montrant les gares",
"name": "Gares ferroviaires"
},
"16": {
"description": "Panneau affichant les trains au départ depuis cette gare",
"name": "Panneaux des départs",
@ -1131,10 +1135,6 @@
"title": {
"render": "Tableau des départs"
}
},
"3": {
"description": "Couche montrant les gares",
"name": "Gares ferroviaires"
}
},
"title": "Gares ferroviaires"
@ -1256,4 +1256,4 @@
"shortDescription": "Une carte des poubelles",
"title": "Poubelles"
}
}
}

View file

@ -4,24 +4,25 @@ export interface Handler {
mustMatch: string | RegExp
mimetype: string
addHeaders?: Record<string, string>
handle: (path: string, queryParams: URLSearchParams, req: http.IncomingMessage) => Promise<string>
handle: (
path: string,
queryParams: URLSearchParams,
req: http.IncomingMessage
) => Promise<string>
}
class ServerUtils {
public static getBody(req: http.IncomingMessage): Promise<string> {
return new Promise<string>((resolve) => {
let body = '';
req.on('data', (chunk) => {
body += chunk;
});
req.on('end', () => {
let body = ""
req.on("data", (chunk) => {
body += chunk
})
req.on("end", () => {
resolve(body)
});
})
})
}
}
export class Server {

View file

@ -17,25 +17,34 @@ class ServerErrorReport extends Script {
console.log("Created this directory")
}
let errorReport = 0
new Server(2348, {},
[<Handler>{
new Server(2348, {}, [
<Handler>{
mustMatch: "report",
mimetype: "application/json",
handle: async (_, queryParams, req, body) => {
if (!body) {
throw "{\"error\": \"No body; use a post request\"}"
throw '{"error": "No body; use a post request"}'
}
console.log(body)
const ip = <string>req.headers["x-forwarded-for"]
const d = new Date()
const date = d.toISOString()
const file = logDirectory + "/" + d.getUTCFullYear() + "_" + d.getUTCMonth() + "_" + d.getUTCDay() + ".lines.json"
try{
const file =
logDirectory +
"/" +
d.getUTCFullYear() +
"_" +
d.getUTCMonth() +
"_" +
d.getUTCDay() +
".lines.json"
try {
body = JSON.parse(body)
}catch (e) {
} catch (e) {
// could not parse, we'll save it as is
}
const contents = "\n"+JSON.stringify({ ip, index: errorReport, date, message: body })
const contents =
"\n" + JSON.stringify({ ip, index: errorReport, date, message: body })
if (!existsSync(file)) {
writeFileSync(file, contents)
} else {
@ -44,8 +53,8 @@ class ServerErrorReport extends Script {
errorReport++
return `{"status":"ok", "nr": ${errorReport}}`
},
}])
},
])
}
}

View file

@ -174,7 +174,7 @@ export default class DetermineLayout {
layerConfig.pointRendering
.flatMap((pr) => pr.marker)
.map((iconSpec) => {
if(!iconSpec){
if (!iconSpec) {
return undefined
}
const icon = new TagRenderingConfig(<TagRenderingConfigJson>iconSpec.icon)
@ -192,7 +192,7 @@ export default class DetermineLayout {
})
).join(";")
if(!icon){
if (!icon) {
icon = "./assets/svg/bug.svg"
}

View file

@ -72,7 +72,7 @@ export class LastClickFeatureSource implements FeatureSource {
first_preset: this.renderings[0],
mouse_button: mode ?? "none",
_usermode: this._usermode?.data,
_addNewEnabled: (this._enabledAddMorePoints?.data ?? true) ? "yes" : "no"
_addNewEnabled: this._enabledAddMorePoints?.data ?? true ? "yes" : "no",
}
this.i++

View file

@ -118,7 +118,7 @@ export default class MetaTagging {
}
const state = this.state
const layer = state.layout.getMatchingLayer(feature.properties)
if(!layer){
if (!layer) {
return
}
// Force update if the tags of the element changed

View file

@ -55,7 +55,7 @@ export class Changes {
featureSwitches?: FeatureSwitchState
},
leftRightSensitive: boolean = false,
reportError?: (string: string | Error) => void,
reportError?: (string: string | Error) => void
) {
this._leftRightSensitive = leftRightSensitive
// We keep track of all changes just as well
@ -70,7 +70,7 @@ export class Changes {
state.osmConnection,
state.featurePropertiesStore,
this,
e => this._reportError(e)
(e) => this._reportError(e)
)
this.historicalUserLocations = state.historicalUserLocations
@ -523,9 +523,13 @@ export class Changes {
const osmObj = await downloader.DownloadObjectAsync(id, 0)
return { id, osmObj }
} catch (e) {
this._reportError( "Could not download OSM-object"+
id+
" dropping it from the changes (" + e + ")")
this._reportError(
"Could not download OSM-object" +
id +
" dropping it from the changes (" +
e +
")"
)
console.error(
"Could not download OSM-object",
id,

View file

@ -26,7 +26,7 @@ export class ChangesetHandler {
* @private
*/
private readonly _remappings = new Map<string, string>()
private readonly _reportError: (e: (string | Error)) => void
private readonly _reportError: (e: string | Error) => void
constructor(
dryRun: Store<boolean>,
@ -151,10 +151,10 @@ export class ChangesetHandler {
await this.UpdateTags(csId, extraMetaTags)
}
} catch (e) {
if(this._reportError){
if (this._reportError) {
this._reportError(e)
}
console.warn("Could not open/upload changeset due to ", e,"trying t")
console.warn("Could not open/upload changeset due to ", e, "trying t")
openChangeset.setData(undefined)
throw e
@ -186,7 +186,7 @@ export class ChangesetHandler {
)
await this.UpdateTags(csId, rewrittenTags)
} catch (e) {
if(this._reportError){
if (this._reportError) {
this._reportError(e)
}
console.warn("Could not upload, changeset is probably closed: ", e)

View file

@ -18,14 +18,14 @@ class FeatureSwitchUtils {
key,
"" + defaultValue,
documentation,
{ stackOffset: -1 },
{ stackOffset: -1 }
)
// It takes the current layout, extracts the default value for this query parameter. A query parameter event source is then retrieved and flattened
return queryParam.sync(
(str) => (str === undefined ? defaultValue : str !== "false"),
[],
(b) => (b == defaultValue ? undefined : "" + b),
(b) => (b == defaultValue ? undefined : "" + b)
)
}
}
@ -37,7 +37,7 @@ export class OsmConnectionFeatureSwitches {
this.featureSwitchFakeUser = QueryParameters.GetBooleanQueryParameter(
"fake-user",
false,
"If true, 'dryrun' mode is activated and a fake user account is loaded",
"If true, 'dryrun' mode is activated and a fake user account is loaded"
)
}
}
@ -73,11 +73,9 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches {
super()
this.layoutToUse = layoutToUse
const legacyRewrite: Record<string, string | string[]> = {
"fs-userbadge": "fs-enable-login",
"fs-layers": ["fs-filter", "fs-background"],
}
for (const key in legacyRewrite) {
@ -100,14 +98,14 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches {
this.featureSwitchEnableLogin = FeatureSwitchUtils.initSwitch(
"fs-enable-login",
layoutToUse?.enableUserBadge ?? true,
"Disables/Enables logging in and thus disables editing all together. This effectively puts MapComplete into read-only mode.",
"Disables/Enables logging in and thus disables editing all together. This effectively puts MapComplete into read-only mode."
)
{
if (QueryParameters.wasInitialized("fs-userbadge")) {
// userbadge is the legacy name for 'enable-login'
this.featureSwitchEnableLogin.setData(
QueryParameters.GetBooleanQueryParameter("fs-userbadge", undefined, "Legacy")
.data,
.data
)
}
}
@ -115,60 +113,60 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches {
this.featureSwitchSearch = FeatureSwitchUtils.initSwitch(
"fs-search",
layoutToUse?.enableSearch ?? true,
"Disables/Enables the search bar",
"Disables/Enables the search bar"
)
this.featureSwitchBackgroundSelection = FeatureSwitchUtils.initSwitch(
"fs-background",
layoutToUse?.enableBackgroundLayerSelection ?? true,
"Disables/Enables the background layer control where a user can enable e.g. aerial imagery",
"Disables/Enables the background layer control where a user can enable e.g. aerial imagery"
)
this.featureSwitchFilter = FeatureSwitchUtils.initSwitch(
"fs-filter",
layoutToUse?.enableLayers ?? true,
"Disables/Enables the filter view where a user can enable/disable MapComplete-layers or filter for certain properties",
"Disables/Enables the filter view where a user can enable/disable MapComplete-layers or filter for certain properties"
)
this.featureSwitchWelcomeMessage = FeatureSwitchUtils.initSwitch(
"fs-welcome-message",
true,
"Disables/enables the help menu or welcome message",
"Disables/enables the help menu or welcome message"
)
this.featureSwitchCommunityIndex = FeatureSwitchUtils.initSwitch(
"fs-community-index",
this.featureSwitchEnableLogin.data,
"Disables/enables the button to get in touch with the community",
"Disables/enables the button to get in touch with the community"
)
this.featureSwitchExtraLinkEnabled = FeatureSwitchUtils.initSwitch(
"fs-iframe-popout",
true,
"Disables/Enables the extraLink button. By default, if in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch or another extraLink button is enabled)",
"Disables/Enables the extraLink button. By default, if in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch or another extraLink button is enabled)"
)
this.featureSwitchBackToThemeOverview = FeatureSwitchUtils.initSwitch(
"fs-homepage-link",
layoutToUse?.enableMoreQuests ?? true,
"Disables/Enables the various links which go back to the index page with the theme overview",
"Disables/Enables the various links which go back to the index page with the theme overview"
)
this.featureSwitchShareScreen = FeatureSwitchUtils.initSwitch(
"fs-share-screen",
layoutToUse?.enableShareScreen ?? true,
"Disables/Enables the 'Share-screen'-tab in the welcome message",
"Disables/Enables the 'Share-screen'-tab in the welcome message"
)
this.featureSwitchGeolocation = FeatureSwitchUtils.initSwitch(
"fs-geolocation",
layoutToUse?.enableGeolocation ?? true,
"Disables/Enables the geolocation button",
"Disables/Enables the geolocation button"
)
this.featureSwitchShowAllQuestions = FeatureSwitchUtils.initSwitch(
"fs-all-questions",
layoutToUse?.enableShowAllQuestions ?? false,
"Always show all questions",
"Always show all questions"
)
this.featureSwitchEnableExport = FeatureSwitchUtils.initSwitch(
"fs-export",
layoutToUse?.enableExportButton ?? true,
"Enable the export as GeoJSON and CSV button",
"Enable the export as GeoJSON and CSV button"
)
let testingDefaultValue = false
@ -182,59 +180,59 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches {
this.featureSwitchIsTesting = QueryParameters.GetBooleanQueryParameter(
"test",
testingDefaultValue,
"If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org",
"If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org"
)
this.featureSwitchIsDebugging = QueryParameters.GetBooleanQueryParameter(
"debug",
false,
"If true, shows some extra debugging help such as all the available tags on every object",
"If true, shows some extra debugging help such as all the available tags on every object"
)
this.featureSwitchMorePrivacy = QueryParameters.GetBooleanQueryParameter(
"moreprivacy",
layoutToUse.enableMorePrivacy,
"If true, the location distance indication will not be written to the changeset and other privacy enhancing measures might be taken.",
"If true, the location distance indication will not be written to the changeset and other privacy enhancing measures might be taken."
)
this.overpassUrl = QueryParameters.GetQueryParameter(
"overpassUrl",
(layoutToUse?.overpassUrl ?? Constants.defaultOverpassUrls).join(","),
"Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter",
"Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter"
).sync(
(param) => param?.split(","),
[],
(urls) => urls?.join(","),
(urls) => urls?.join(",")
)
this.overpassTimeout = UIEventSource.asInt(
QueryParameters.GetQueryParameter(
"overpassTimeout",
"" + layoutToUse?.overpassTimeout,
"Set a different timeout (in seconds) for queries in overpass",
),
"Set a different timeout (in seconds) for queries in overpass"
)
)
this.overpassMaxZoom = UIEventSource.asFloat(
QueryParameters.GetQueryParameter(
"overpassMaxZoom",
"" + layoutToUse?.overpassMaxZoom,
" point to switch between OSM-api and overpass",
),
" point to switch between OSM-api and overpass"
)
)
this.osmApiTileSize = UIEventSource.asInt(
QueryParameters.GetQueryParameter(
"osmApiTileSize",
"" + layoutToUse?.osmApiTileSize,
"Tilesize when the OSM-API is used to fetch data within a BBOX",
),
"Tilesize when the OSM-API is used to fetch data within a BBOX"
)
)
this.backgroundLayerId = QueryParameters.GetQueryParameter(
"background",
layoutToUse?.defaultBackgroundId,
"The id of the background layer to start with",
"The id of the background layer to start with"
)
}
}

View file

@ -62,7 +62,9 @@ export default class UserRelatedState {
"gps_location_retention"
)
public readonly addNewFeatureMode = new UIEventSource<"button" | "button_click_right" | "button_click" | "click" | "click_right">("button_click_right")
public readonly addNewFeatureMode = new UIEventSource<
"button" | "button_click_right" | "button_click" | "click" | "click_right"
>("button_click_right")
/**
* Preferences as tags exposes many preferences and state properties as record.
@ -134,7 +136,7 @@ export default class UserRelatedState {
"preferences-add-new-mode",
"button_click_right",
{
documentation: "How adding a new feature is done"
documentation: "How adding a new feature is done",
}
)
@ -297,7 +299,7 @@ export default class UserRelatedState {
_applicationOpened: new Date().toISOString(),
_supports_sharing:
typeof window === "undefined" ? "no" : window.navigator.share ? "yes" : "no",
_iframe: Utils.isIframe ? "yes" : "no"
_iframe: Utils.isIframe ? "yes" : "no",
})
for (const key in Constants.userJourney) {

View file

@ -1,14 +1,42 @@
import { Utils } from "../../Utils"
/** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */
export class ThemeMetaTagging {
public static readonly themeName = "usersettings"
public static readonly themeName = "usersettings"
public metaTaggging_for_usersettings(feat: {properties: Record<string, string>}) {
Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_md', () => feat.properties._description.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)?.at(1) )
Utils.AddLazyProperty(feat.properties, '_d', () => feat.properties._description?.replace(/&lt;/g,'<')?.replace(/&gt;/g,'>') ?? '' )
Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) )
Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) )
Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a )
feat.properties['__current_backgroun'] = 'initial_value'
}
}
public metaTaggging_for_usersettings(feat: { properties: Record<string, string> }) {
Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_md", () =>
feat.properties._description
.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)
?.at(1)
)
Utils.AddLazyProperty(
feat.properties,
"_d",
() => feat.properties._description?.replace(/&lt;/g, "<")?.replace(/&gt;/g, ">") ?? ""
)
Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_a", () =>
((feat) => {
const e = document.createElement("div")
e.innerHTML = feat.properties._d
return Array.from(e.getElementsByTagName("a")).filter(
(a) => a.href.match(/mastodon|en.osm.town/) !== null
)[0]?.href
})(feat)
)
Utils.AddLazyProperty(feat.properties, "_mastodon_link", () =>
((feat) => {
const e = document.createElement("div")
e.innerHTML = feat.properties._d
return Array.from(e.getElementsByTagName("a")).filter(
(a) => a.getAttribute("rel")?.indexOf("me") >= 0
)[0]?.href
})(feat)
)
Utils.AddLazyProperty(
feat.properties,
"_mastodon_candidate",
() => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a
)
feat.properties["__current_backgroun"] = "initial_value"
}
}

View file

@ -2,7 +2,11 @@ import LayoutConfig from "./ThemeConfig/LayoutConfig"
import { SpecialVisualizationState } from "../UI/SpecialVisualization"
import { Changes } from "../Logic/Osm/Changes"
import { Store, UIEventSource } from "../Logic/UIEventSource"
import { FeatureSource, IndexedFeatureSource, WritableFeatureSource } from "../Logic/FeatureSource/FeatureSource"
import {
FeatureSource,
IndexedFeatureSource,
WritableFeatureSource,
} from "../Logic/FeatureSource/FeatureSource"
import { OsmConnection } from "../Logic/Osm/OsmConnection"
import { ExportableMap, MapProperties } from "./MapProperties"
import LayerState from "../Logic/State/LayerState"
@ -46,7 +50,9 @@ import BackgroundLayerResetter from "../Logic/Actors/BackgroundLayerResetter"
import SaveFeatureSourceToLocalStorage from "../Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage"
import BBoxFeatureSource from "../Logic/FeatureSource/Sources/TouchesBboxFeatureSource"
import ThemeViewStateHashActor from "../Logic/Web/ThemeViewStateHashActor"
import NoElementsInViewDetector, { FeatureViewState } from "../Logic/Actors/NoElementsInViewDetector"
import NoElementsInViewDetector, {
FeatureViewState,
} from "../Logic/Actors/NoElementsInViewDetector"
import FilteredLayer from "./FilteredLayer"
import { PreferredRasterLayerSelector } from "../Logic/Actors/PreferredRasterLayerSelector"
import { ImageUploadManager } from "../Logic/ImageProviders/ImageUploadManager"
@ -152,7 +158,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
this.featureSwitches = new FeatureSwitchState(layout)
this.guistate = new MenuState(
this.featureSwitches.featureSwitchWelcomeMessage.data,
layout.id,
layout.id
)
this.map = new UIEventSource<MlMap>(undefined)
const geolocationState = new GeoLocationState()
@ -168,14 +174,14 @@ export default class ThemeViewState implements SpecialVisualizationState {
oauth_token: QueryParameters.GetQueryParameter(
"oauth_token",
undefined,
"Used to complete the login",
"Used to complete the login"
),
})
this.userRelatedState = new UserRelatedState(
this.osmConnection,
layout,
this.featureSwitches,
this.mapProperties,
this.mapProperties
)
this.userRelatedState.fixateNorth.addCallbackAndRunD((fixated) => {
this.mapProperties.allowRotating.setData(fixated !== "yes")
@ -186,13 +192,13 @@ export default class ThemeViewState implements SpecialVisualizationState {
geolocationState,
this.selectedElement,
this.mapProperties,
this.userRelatedState.gpsLocationHistoryRetentionTime,
this.userRelatedState.gpsLocationHistoryRetentionTime
)
this.geolocationControl = new GeolocationControlState(this.geolocation, this.mapProperties)
this.availableLayers = AvailableRasterLayers.layersAvailableAt(
this.mapProperties.location,
this.osmConnection.isLoggedIn,
this.osmConnection.isLoggedIn
)
const self = this
@ -204,7 +210,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
const isDisplayed = QueryParameters.GetBooleanQueryParameter(
"overlay-" + rasterInfo.id,
rasterInfo.defaultState ?? true,
"Wether or not overlayer layer " + rasterInfo.id + " is shown",
"Wether or not overlayer layer " + rasterInfo.id + " is shown"
)
const state = { isDisplayed }
overlayLayerStates.set(rasterInfo.id, state)
@ -229,7 +235,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
this.osmConnection.Backend(),
(id) => self.layerState.filteredLayers.get(id).isDisplayed,
mvtAvailableLayers,
this.fullNodeDatabase,
this.fullNodeDatabase
)
let currentViewIndex = 0
@ -247,7 +253,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
id: "current_view_" + currentViewIndex,
}),
]
}),
})
)
this.featuresInView = new BBoxFeatureSource(layoutSource, this.mapProperties.bounds)
@ -265,19 +271,19 @@ export default class ThemeViewState implements SpecialVisualizationState {
featureSwitches: this.featureSwitches,
},
layout?.isLeftRightSensitive() ?? false,
e => this.reportError(e),
(e) => this.reportError(e)
)
this.historicalUserLocations = this.geolocation.historicalUserLocations
this.newFeatures = new NewGeometryFromChangesFeatureSource(
this.changes,
layoutSource,
this.featureProperties,
this.featureProperties
)
layoutSource.addSource(this.newFeatures)
const perLayer = new PerLayerFeatureSourceSplitter(
Array.from(this.layerState.filteredLayers.values()).filter(
(l) => l.layerDef?.source !== null,
(l) => l.layerDef?.source !== null
),
new ChangeGeometryApplicator(this.indexedFeatures, this.changes),
{
@ -288,10 +294,10 @@ export default class ThemeViewState implements SpecialVisualizationState {
"Got ",
features.length,
"leftover features, such as",
features[0].properties,
features[0].properties
)
},
},
}
)
this.perLayer = perLayer.perLayer
}
@ -336,7 +342,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
this.osmObjectDownloader = new OsmObjectDownloader(
this.osmConnection.Backend(),
this.changes,
this.changes
)
this.perLayerFiltered = this.showNormalDataOn(this.map)
@ -347,7 +353,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
currentZoom: this.mapProperties.zoom,
layerState: this.layerState,
bounds: this.visualFeedbackViewportBounds,
},
}
)
this.hasDataInView = new NoElementsInViewDetector(this).hasFeatureInView
this.imageUploadManager = new ImageUploadManager(
@ -355,7 +361,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
Imgur.singleton,
this.featureProperties,
this.osmConnection,
this.changes,
this.changes
)
this.favourites = new FavouritesFeatureSource(this)
@ -398,7 +404,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
LayoutSource.fromCacheZoomLevel,
fs,
this.featureProperties,
fs.layer.layerDef.maxAgeOfCache,
fs.layer.layerDef.maxAgeOfCache
)
toLocalStorage.set(layerId, storage)
})
@ -411,7 +417,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
const doShowLayer = this.mapProperties.zoom.map(
(z) =>
(fs.layer.isDisplayed?.data ?? true) && z >= (fs.layer.layerDef?.minzoom ?? 0),
[fs.layer.isDisplayed],
[fs.layer.isDisplayed]
)
if (!doShowLayer.data && this.featureSwitches.featureSwitchFilter.data === false) {
@ -428,7 +434,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
fs.layer,
fs,
(id) => this.featureProperties.getStore(id),
this.layerState.globalFilters,
this.layerState.globalFilters
)
filteringFeatureSource.set(layerName, filtered)
@ -569,7 +575,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
return
}
this.selectClosestAtCenter(0)
},
}
)
for (let i = 1; i < 9; i++) {
@ -587,7 +593,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
onUp: true,
},
doc,
() => this.selectClosestAtCenter(i - 1),
() => this.selectClosestAtCenter(i - 1)
)
}
@ -604,7 +610,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
if (this.featureSwitches.featureSwitchBackgroundSelection.data) {
this.guistate.backgroundLayerSelectionIsOpened.setData(true)
}
},
}
)
Hotkeys.RegisterHotkey(
{
@ -616,14 +622,14 @@ export default class ThemeViewState implements SpecialVisualizationState {
if (this.featureSwitches.featureSwitchFilter.data) {
this.guistate.openFilterView()
}
},
}
)
Hotkeys.RegisterHotkey(
{ shift: "O" },
Translations.t.hotkeyDocumentation.selectMapnik,
() => {
this.mapProperties.rasterLayer.setData(AvailableRasterLayers.osmCarto)
},
}
)
const setLayerCategory = (category: EliCategory) => {
const available = this.availableLayers.data
@ -631,7 +637,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
const best = RasterLayerUtils.SelectBestLayerAccordingTo(
available,
category,
current.data,
current.data
)
console.log("Best layer for category", category, "is", best.properties.id)
current.setData(best)
@ -640,26 +646,26 @@ export default class ThemeViewState implements SpecialVisualizationState {
Hotkeys.RegisterHotkey(
{ nomod: "O" },
Translations.t.hotkeyDocumentation.selectOsmbasedmap,
() => setLayerCategory("osmbasedmap"),
() => setLayerCategory("osmbasedmap")
)
Hotkeys.RegisterHotkey(
{ nomod: "M" },
Translations.t.hotkeyDocumentation.selectMap,
() => setLayerCategory("map"),
() => setLayerCategory("map")
)
Hotkeys.RegisterHotkey(
{ nomod: "P" },
Translations.t.hotkeyDocumentation.selectAerial,
() => setLayerCategory("photo"),
() => setLayerCategory("photo")
)
Hotkeys.RegisterHotkey(
{ nomod: "L" },
Translations.t.hotkeyDocumentation.geolocate,
() => {
this.geolocationControl.handleClick()
},
}
)
return true
})
@ -671,7 +677,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
Translations.t.hotkeyDocumentation.translationMode,
() => {
Locale.showLinkToWeblate.setData(!Locale.showLinkToWeblate.data)
},
}
)
}
@ -682,7 +688,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
const normalLayers = this.layout.layers.filter(
(l) =>
Constants.priviliged_layers.indexOf(<any>l.id) < 0 &&
!l.id.startsWith("note_import"),
!l.id.startsWith("note_import")
)
const maxzoom = Math.min(...normalLayers.map((l) => l.minzoom))
@ -690,7 +696,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
(l) =>
Constants.priviliged_layers.indexOf(<any>l.id) < 0 &&
l.source.geojsonSource === undefined &&
l.doCount,
l.doCount
)
const summaryTileSource = new SummaryTileSource(
Constants.SummaryServer,
@ -699,7 +705,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
this.mapProperties,
{
isActive: this.mapProperties.zoom.map((z) => z <= maxzoom),
},
}
)
return new SummaryTileSourceRewriter(summaryTileSource, this.layerState.filteredLayers)
}
@ -719,12 +725,12 @@ export default class ThemeViewState implements SpecialVisualizationState {
gps_location_history: this.geolocation.historicalUserLocations,
gps_track: this.geolocation.historicalUserLocationsTrack,
selected_element: new StaticFeatureSource(
this.selectedElement.map((f) => (f === undefined ? empty : [f])),
this.selectedElement.map((f) => (f === undefined ? empty : [f]))
),
range: new StaticFeatureSource(
this.mapProperties.maxbounds.map((bbox) =>
bbox === undefined ? empty : <Feature[]>[bbox.asGeoJson({ id: "range" })],
),
bbox === undefined ? empty : <Feature[]>[bbox.asGeoJson({ id: "range" })]
)
),
current_view: this.currentView,
favourite: this.favourites,
@ -739,7 +745,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
ShowDataLayer.showRange(
this.map,
new StaticFeatureSource([bbox.asGeoJson({ id: "range" })]),
this.featureSwitches.featureSwitchIsTesting,
this.featureSwitches.featureSwitchIsTesting
)
}
const currentViewLayer = this.layout.layers.find((l) => l.id === "current_view")
@ -753,7 +759,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
currentViewLayer,
this.layout,
this.osmObjectDownloader,
this.featureProperties,
this.featureProperties
)
})
}
@ -797,20 +803,20 @@ export default class ThemeViewState implements SpecialVisualizationState {
const lastClickLayerConfig = new LayerConfig(
<LayerConfigJson>last_click_layerconfig,
"last_click",
"last_click"
)
const lastClickFiltered =
lastClickLayerConfig.isShown === undefined
? specialLayers.last_click
: specialLayers.last_click.features.mapD((fs) =>
fs.filter((f) => {
const matches = lastClickLayerConfig.isShown.matchesProperties(
f.properties,
)
console.log("LastClick ", f, "matches", matches)
return matches
}),
)
fs.filter((f) => {
const matches = lastClickLayerConfig.isShown.matchesProperties(
f.properties
)
console.log("LastClick ", f, "matches", matches)
return matches
})
)
new ShowDataLayer(this.map, {
features: new StaticFeatureSource(lastClickFiltered),
layer: lastClickLayerConfig,
@ -855,7 +861,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
this.mapProperties.rasterLayer,
this.availableLayers,
this.featureSwitches.backgroundLayerId,
this.userRelatedState.preferredBackgroundLayer,
this.userRelatedState.preferredBackgroundLayer
)
}
@ -865,14 +871,14 @@ export default class ThemeViewState implements SpecialVisualizationState {
}
public async reportError(message: string | Error) {
console.log(">>> Reporting error to",Constants.ErrorReportServer, message)
console.log(">>> Reporting error to", Constants.ErrorReportServer, message)
let stacktrace: string = new Error().stack
await fetch(Constants.ErrorReportServer, {
method: "POST",
body: JSON.stringify({
stacktrace,
message: ""+message,
message: "" + message,
layout: this.layout.id,
version: Constants.vNumber,
language: this.userRelatedState.language.data,

View file

@ -149,14 +149,13 @@
</LoginToggle>
<a
class="flex button"
class="button flex"
href={window.location.protocol + "//" + window.location.host + "/studio.html"}
>
<Pencil class="mr-2 h-6 w-6" />
<Tr t={Translations.t.general.morescreen.createYourOwnTheme} />
</a>
<h3 id="about">
<Tr t={Translations.t.index.about} />
</h3>
@ -173,8 +172,8 @@
</a>
<a class="flex" href={Utils.OsmChaLinkFor(7)} target="_blank">
<ArrowTrendingUp class="mr-2 h-6 w-6"/>
<Tr t={Translations.t.general.attribution.openOsmchaLastWeek}/>
<ArrowTrendingUp class="mr-2 h-6 w-6" />
<Tr t={Translations.t.general.attribution.openOsmchaLastWeek} />
</a>
<a class="flex" href="https://en.osm.town/@MapComplete" target="_blank">

View file

@ -41,14 +41,14 @@
</slot>
{:else if !silentFail && $loadingStatus === "error"}
<slot name="error">
<div class="alert flex items-center flex-col">
<div class="max-w-64 flex items-center ">
<Invalid class="m-2 h-8 w-8 shrink-0" />
<Tr t={offlineModes[$apiState] ?? t.loginFailedUnreachableMode} />
</div>
<div class="alert flex flex-col items-center">
<div class="max-w-64 flex items-center">
<Invalid class="m-2 h-8 w-8 shrink-0" />
<Tr t={offlineModes[$apiState] ?? t.loginFailedUnreachableMode} />
</div>
<button class="h-fit" on:click={() => state.osmConnection.AttemptLogin()}>
<ArrowPath class="w-6 h-6"/>
<Tr t={t.retry}/>
<ArrowPath class="h-6 w-6" />
<Tr t={t.retry} />
</button>
</div>
</slot>

View file

@ -40,9 +40,9 @@ export default class CopyrightPanel extends Combine {
const t = Translations.t.general.attribution
const layoutToUse = state.layout
const iconAttributions: BaseUIElement[] = Utils.Dedup(layoutToUse
.getUsedImages())
.map(CopyrightPanel.IconAttribution)
const iconAttributions: BaseUIElement[] = Utils.Dedup(layoutToUse.getUsedImages()).map(
CopyrightPanel.IconAttribution
)
let maintainer: BaseUIElement = undefined
if (layoutToUse.credits !== undefined && layoutToUse.credits !== "") {

View file

@ -151,10 +151,10 @@
</div>
{#if Utils.isIframe}
<div class="flex justify-end link-underline">
<a href="https://mapcomplete.org" target="_blank">
<Tr t={Translations.t.general.poweredByMapComplete}/>
</a>
<div class="link-underline flex justify-end">
<a href="https://mapcomplete.org" target="_blank">
<Tr t={Translations.t.general.poweredByMapComplete} />
</a>
</div>
{:else}
<If condition={state.featureSwitches.featureSwitchBackToThemeOverview}>

View file

@ -42,7 +42,7 @@
let knownImages = comparisonState.bindD((ct) => ct.knownImages)
let propertyKeysExternal = comparisonState.mapD((ct) => ct.propertyKeysExternal)
let hasDifferencesAtStart = comparisonState.mapD((ct) => ct.hasDifferencesAtStart)
let enableLogin= state.featureSwitches.featureSwitchEnableLogin
let enableLogin = state.featureSwitches.featureSwitchEnableLogin
</script>
{#if !$sourceUrl || !$enableLogin}

View file

@ -29,10 +29,10 @@
</script>
{#if enableLogin.data}
<AccordionSingle>
<span slot="header" class="p-2 text-base">
<Tr t={t.seeNearby} />
</span>
<NearbyImages {tags} {state} {lon} {lat} {feature} {linkable} {layer} />
</AccordionSingle>
{/if}
<AccordionSingle>
<span slot="header" class="p-2 text-base">
<Tr t={t.seeNearby} />
</span>
<NearbyImages {tags} {state} {lon} {lat} {feature} {linkable} {layer} />
</AccordionSingle>
{/if}

View file

@ -58,7 +58,7 @@
<LoginButton clss="small w-full" osmConnection={state.osmConnection} slot="not-logged-in">
<Tr t={Translations.t.image.pleaseLogin} />
</LoginButton>
<div class="flex flex-col my-4">
<div class="my-4 flex flex-col">
<UploadingImageCounter {state} {tags} />
{#each $errors as error}
<Tr t={error} cls="alert" />

View file

@ -934,7 +934,7 @@ export class ToTextualDescription {
ranges: OpeningRange[][]
): Translation | undefined {
const t = Translations.t.general.opening_hours
if(!ranges){
if (!ranges) {
return undefined
}
if (!ranges?.some((r) => r.length > 0)) {

View file

@ -79,7 +79,7 @@ export default class OpeningHoursVisualization extends Toggle {
// The normal case: we have items for the coming days
return OpeningHoursVisualization.ConstructVizTable(oh, ranges, lastMonday)
}
// The special case that range is completely empty
// The special case that range is completely empty
return OpeningHoursVisualization.ShowSpecialCase(oh)
}
@ -303,6 +303,8 @@ export default class OpeningHoursVisualization extends Toggle {
opensAtDate.getHours(),
opensAtDate.getMinutes()
)}`
return Translations.t.general.opening_hours.closed_until.Subs({ date: opensAtDate.toLocaleString() })
return Translations.t.general.opening_hours.closed_until.Subs({
date: opensAtDate.toLocaleString(),
})
}
}

View file

@ -64,7 +64,9 @@ export class CloseNoteButton implements SpecialVisualization {
zoomButton: string
} = <any>Utils.ParseVisArgs(this.args, args)
let icon: BaseUIElement = new SvelteUIElement(Icon, {icon: params.icon ?? "checkmark.svg"})
let icon: BaseUIElement = new SvelteUIElement(Icon, {
icon: params.icon ?? "checkmark.svg",
})
let textToShow = t.closeNote
if ((params.text ?? "") !== "") {
textToShow = Translations.T(args[0])

View file

@ -110,7 +110,10 @@
</SubtleButton>
</div>
{:else}
<form class="low-interaction rounded-sm p-2 flex flex-col" on:submit|preventDefault={uploadNote}>
<form
class="low-interaction flex flex-col rounded-sm p-2"
on:submit|preventDefault={uploadNote}
>
<label class="neutral-label">
<Tr t={Translations.t.notes.createNoteIntro} />
<div class="w-full p-1">

View file

@ -49,7 +49,7 @@ export default class NoteCommentElement extends Combine {
}
const userinfo = Stores.FromPromise(
Utils.downloadJsonCached<{user: { img: { href: string } }}>(
Utils.downloadJsonCached<{ user: { img: { href: string } } }>(
"https://api.openstreetmap.org/api/0.6/user/" + comment.uid,
24 * 60 * 60 * 1000
)
@ -122,7 +122,7 @@ export default class NoteCommentElement extends Combine {
public static addCommentTo(
txt: string,
tags: UIEventSource<any>,
state: { osmConnection: {userDetails: Store<{ name: string, uid: number }>} }
state: { osmConnection: { userDetails: Store<{ name: string; uid: number }> } }
) {
const comments: any[] = JSON.parse(tags.data["comments"])
const username = state.osmConnection.userDetails.data.name

View file

@ -111,93 +111,97 @@
</script>
{#if $loginEnabled}
<div
bind:this={questionboxElem}
aria-live="polite"
class="marker-questionbox-root"
class:hidden={$questionsToAsk.length === 0 && skipped === 0 && answered === 0}
>
{#if $allQuestionsToAsk.length === 0}
{#if skipped + answered > 0}
<div class="thanks">
<Tr t={Translations.t.general.questionBox.done} />
</div>
{#if answered === 0}
{#if skipped === 1}
<Tr t={Translations.t.general.questionBox.skippedOne} />
{:else}
<Tr t={Translations.t.general.questionBox.skippedMultiple.Subs({ skipped })} />
{/if}
{:else if answered === 1}
{#if skipped === 0}
<Tr t={Translations.t.general.questionBox.answeredOne} />
{:else if skipped === 1}
<Tr t={Translations.t.general.questionBox.answeredOneSkippedOne} />
{:else}
<Tr t={Translations.t.general.questionBox.answeredOneSkippedMultiple.Subs({ skipped })} />
{/if}
{:else if skipped === 0}
<Tr t={Translations.t.general.questionBox.answeredMultiple.Subs({ answered })} />
{:else if skipped === 1}
<Tr t={Translations.t.general.questionBox.answeredMultipleSkippedOne.Subs({ answered })} />
{:else}
<Tr
t={Translations.t.general.questionBox.answeredMultipleSkippedMultiple.Subs({
answered,
skipped,
})}
/>
{/if}
{#if skipped > 0}
<button
class="w-full"
on:click={() => {
skippedQuestions.setData(new Set())
skipped = 0
}}
>
<Tr t={Translations.t.general.questionBox.reactivate} />
</button>
{/if}
{/if}
{:else}
<div>
{#if $showAllQuestionsAtOnce}
<div class="flex flex-col gap-y-1">
{#each $allQuestionsToAsk as question (question.id)}
<TagRenderingQuestionDynamic
config={question}
{tags}
{selectedElement}
{state}
{layer}
/>
{/each}
<div
bind:this={questionboxElem}
aria-live="polite"
class="marker-questionbox-root"
class:hidden={$questionsToAsk.length === 0 && skipped === 0 && answered === 0}
>
{#if $allQuestionsToAsk.length === 0}
{#if skipped + answered > 0}
<div class="thanks">
<Tr t={Translations.t.general.questionBox.done} />
</div>
{:else if $firstQuestion !== undefined}
<TagRenderingQuestionDynamic
config={$firstQuestion}
{layer}
{selectedElement}
{state}
{tags}
on:saved={() => {
skip($firstQuestion, true)
}}
>
{#if answered === 0}
{#if skipped === 1}
<Tr t={Translations.t.general.questionBox.skippedOne} />
{:else}
<Tr t={Translations.t.general.questionBox.skippedMultiple.Subs({ skipped })} />
{/if}
{:else if answered === 1}
{#if skipped === 0}
<Tr t={Translations.t.general.questionBox.answeredOne} />
{:else if skipped === 1}
<Tr t={Translations.t.general.questionBox.answeredOneSkippedOne} />
{:else}
<Tr
t={Translations.t.general.questionBox.answeredOneSkippedMultiple.Subs({ skipped })}
/>
{/if}
{:else if skipped === 0}
<Tr t={Translations.t.general.questionBox.answeredMultiple.Subs({ answered })} />
{:else if skipped === 1}
<Tr
t={Translations.t.general.questionBox.answeredMultipleSkippedOne.Subs({ answered })}
/>
{:else}
<Tr
t={Translations.t.general.questionBox.answeredMultipleSkippedMultiple.Subs({
answered,
skipped,
})}
/>
{/if}
{#if skipped > 0}
<button
class="secondary"
class="w-full"
on:click={() => {
skip($firstQuestion)
skippedQuestions.setData(new Set())
skipped = 0
}}
slot="cancel"
>
<Tr t={Translations.t.general.skip} />
<Tr t={Translations.t.general.questionBox.reactivate} />
</button>
</TagRenderingQuestionDynamic>
{/if}
{/if}
</div>
{/if}
</div>
{/if}
{:else}
<div>
{#if $showAllQuestionsAtOnce}
<div class="flex flex-col gap-y-1">
{#each $allQuestionsToAsk as question (question.id)}
<TagRenderingQuestionDynamic
config={question}
{tags}
{selectedElement}
{state}
{layer}
/>
{/each}
</div>
{:else if $firstQuestion !== undefined}
<TagRenderingQuestionDynamic
config={$firstQuestion}
{layer}
{selectedElement}
{state}
{tags}
on:saved={() => {
skip($firstQuestion, true)
}}
>
<button
class="secondary"
on:click={() => {
skip($firstQuestion)
}}
slot="cancel"
>
<Tr t={Translations.t.general.skip} />
</button>
</TagRenderingQuestionDynamic>
{/if}
</div>
{/if}
</div>
{/if}

View file

@ -28,7 +28,7 @@
</script>
{#if config !== undefined && (config?.condition === undefined || config.condition.matchesProperties($tags))}
<div {id} class={twMerge("link-underline flex w-full h-full flex-col", extraClasses)}>
<div {id} class={twMerge("link-underline flex h-full w-full flex-col", extraClasses)}>
{#if $trs.length === 1}
<TagRenderingMapping
mapping={$trs[0]}

View file

@ -106,8 +106,16 @@
</TagRenderingQuestion>
{:else}
<div class="low-interaction flex items-center justify-between overflow-hidden rounded pl-2">
<TagRenderingAnswer id={answerId} {config} {tags} {selectedElement} {state} {layer} extraClasses="my-2"/>
{#if (!editingEnabled || $editingEnabled)}
<TagRenderingAnswer
id={answerId}
{config}
{tags}
{selectedElement}
{state}
{layer}
extraClasses="my-2"
/>
{#if !editingEnabled || $editingEnabled}
<EditButton
arialabel={config.editButtonAriaLabel}
ariaLabelledBy={answerId}

View file

@ -1,5 +1,4 @@
<script lang="ts">
</script>
<main >
</main>
<main />

View file

@ -124,11 +124,11 @@
state.mapProperties.installCustomKeyboardHandler(viewport)
let canZoomIn = mapproperties.maxzoom.map(
(mz) => mapproperties.zoom.data < mz,
[mapproperties.zoom],
[mapproperties.zoom]
)
let canZoomOut = mapproperties.minzoom.map(
(mz) => mapproperties.zoom.data > mz,
[mapproperties.zoom],
[mapproperties.zoom]
)
function updateViewport() {
@ -165,7 +165,7 @@
onDestroy(
rasterLayer.addCallbackAndRunD((l) => {
rasterLayerName = l.properties.name
}),
})
)
let previewedImage = state.previewedImage
@ -196,7 +196,7 @@
let openMapButton: UIEventSource<HTMLElement> = new UIEventSource<HTMLElement>(undefined)
let openMenuButton: UIEventSource<HTMLElement> = new UIEventSource<HTMLElement>(undefined)
let openCurrentViewLayerButton: UIEventSource<HTMLElement> = new UIEventSource<HTMLElement>(
undefined,
undefined
)
let _openNewElementButton: HTMLButtonElement
let openNewElementButton: UIEventSource<HTMLElement> = new UIEventSource<HTMLElement>(undefined)
@ -572,7 +572,6 @@
<div class="link-underline links-w-full m-2 flex flex-col gap-y-1" slot="content0">
<Tr t={Translations.t.general.aboutMapComplete.intro} />
<a class="flex" href={Utils.HomepageLink()}>
<Add class="h-6 w-6" />
{#if Utils.isIframe}

View file

@ -146,7 +146,6 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
public static readonly isIframe = !Utils.runningFromConsole && window !== window.top
public static initDomPurify() {
if (Utils.runningFromConsole) {
return

View file

@ -1,7 +1,7 @@
{
"contributors": [
{
"commits": 7596,
"commits": 7612,
"contributor": "Pieter Vander Vennet"
},
{

View file

@ -5,7 +5,7 @@
"contributor": "Pieter Vander Vennet"
},
{
"commits": 347,
"commits": 351,
"contributor": "kjon"
},
{
@ -21,7 +21,7 @@
"contributor": "Robin van der Linde"
},
{
"commits": 67,
"commits": 69,
"contributor": "mcliquid"
},
{
@ -112,6 +112,10 @@
"commits": 13,
"contributor": "Joost"
},
{
"commits": 12,
"contributor": "Patchanka64"
},
{
"commits": 12,
"contributor": "Ettore Atalan"
@ -152,10 +156,6 @@
"commits": 10,
"contributor": "Irina"
},
{
"commits": 9,
"contributor": "Patchanka64"
},
{
"commits": 9,
"contributor": "Manuel Tassi"
@ -256,6 +256,10 @@
"commits": 6,
"contributor": "lvgx"
},
{
"commits": 5,
"contributor": "Christian Schmidt"
},
{
"commits": 5,
"contributor": "Emory Shaw"