Housekeeping
This commit is contained in:
parent
4ad1e67f6e
commit
da615acfb1
55 changed files with 1772 additions and 1455 deletions
|
@ -33,6 +33,7 @@ Available languages:
|
|||
- en
|
||||
- da
|
||||
- de
|
||||
- fr
|
||||
|
||||
|
||||
This document is autogenerated from [assets/themes/mapcomplete-changes/mapcomplete-changes.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/mapcomplete-changes/mapcomplete-changes.json)
|
||||
|
|
|
@ -27,17 +27,17 @@ This document gives an overview of which URL-parameters can be used to influence
|
|||
12. [ fs-homepage-link ](#-fs-homepage-link-)
|
||||
13. [ fs-share-screen ](#-fs-share-screen-)
|
||||
14. [ fs-geolocation ](#-fs-geolocation-)
|
||||
15. [ fs-all-questions ](#-fs-all-questions-)
|
||||
16. [ fs-export ](#-fs-export-)
|
||||
17. [ test ](#-test-)
|
||||
18. [ debug ](#-debug-)
|
||||
19. [ moreprivacy ](#-moreprivacy-)
|
||||
20. [ overpassUrl ](#-overpassurl-)
|
||||
21. [ overpassTimeout ](#-overpasstimeout-)
|
||||
22. [ overpassMaxZoom ](#-overpassmaxzoom-)
|
||||
23. [ osmApiTileSize ](#-osmapitilesize-)
|
||||
24. [ background ](#-background-)
|
||||
25. [ fs-layers-enabled ](#-fs-layers-enabled-)
|
||||
15. [ fs-layers-enabled ](#-fs-layers-enabled-)
|
||||
16. [ fs-all-questions ](#-fs-all-questions-)
|
||||
17. [ fs-export ](#-fs-export-)
|
||||
18. [ test ](#-test-)
|
||||
19. [ debug ](#-debug-)
|
||||
20. [ moreprivacy ](#-moreprivacy-)
|
||||
21. [ overpassUrl ](#-overpassurl-)
|
||||
22. [ overpassTimeout ](#-overpasstimeout-)
|
||||
23. [ overpassMaxZoom ](#-overpassmaxzoom-)
|
||||
24. [ osmApiTileSize ](#-osmapitilesize-)
|
||||
25. [ background ](#-background-)
|
||||
26. [ z ](#-z-)
|
||||
27. [ lat ](#-lat-)
|
||||
28. [ lon ](#-lon-)
|
||||
|
@ -251,12 +251,23 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
|
||||
|
||||
fs-layers-enabled
|
||||
-------------------
|
||||
|
||||
If set to false, all layers will be disabled - except the explicitly enabled layers
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L162)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
||||
|
||||
fs-all-questions
|
||||
------------------
|
||||
|
||||
Always show all questions
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L161)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L165)
|
||||
|
||||
The default value is _false_
|
||||
|
||||
|
@ -267,7 +278,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#L167)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L171)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -278,7 +289,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#L181)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L185)
|
||||
|
||||
The default value is _false_
|
||||
|
||||
|
@ -289,7 +300,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#L187)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L191)
|
||||
|
||||
The default value is _false_
|
||||
|
||||
|
@ -300,7 +311,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#L193)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L197)
|
||||
|
||||
The default value is _false_
|
||||
|
||||
|
@ -311,7 +322,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#L199)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L203)
|
||||
|
||||
The default value is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_
|
||||
|
||||
|
@ -322,7 +333,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#L210)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L214)
|
||||
|
||||
The default value is _30_
|
||||
|
||||
|
@ -333,7 +344,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#L218)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L222)
|
||||
|
||||
The default value is _16_
|
||||
|
||||
|
@ -344,7 +355,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#L226)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L230)
|
||||
|
||||
The default value is _17_
|
||||
|
||||
|
@ -355,23 +366,12 @@ 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#L233)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L237)
|
||||
|
||||
No default value set
|
||||
|
||||
|
||||
|
||||
fs-layers-enabled
|
||||
-------------------
|
||||
|
||||
If set to false, all layers will be disabled - except the explicitly enabled layers
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L239)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
||||
|
||||
z
|
||||
---
|
||||
|
||||
|
@ -487,7 +487,7 @@ This documentation is defined in the source code at [FilteredLayer.ts](/src/Mode
|
|||
|
||||
The mode the application starts in, e.g. 'map', 'dashboard' or 'statistics'
|
||||
|
||||
This documentation is defined in the source code at [generateDocs.ts](ervdvn/git/MapComplete/scripts/generateDocs.ts#L439)
|
||||
This documentation is defined in the source code at [generateDocs.ts](ervdvn/git2/MapComplete/scripts/generateDocs.ts#L439)
|
||||
|
||||
The default value is _map_
|
||||
|
||||
|
|
|
@ -84,7 +84,8 @@
|
|||
"pt_BR": "Endereço conhecido",
|
||||
"he": "כתובת ידועה",
|
||||
"eu": "Helbide ezaguna",
|
||||
"it": "Indirizzo conosciuto"
|
||||
"it": "Indirizzo conosciuto",
|
||||
"zh_Hant": "已知的地址"
|
||||
}
|
||||
},
|
||||
"pointRendering": [
|
||||
|
@ -255,7 +256,8 @@
|
|||
"pt_BR": "Este endereço fica na rua <b>{addr:street}</b>",
|
||||
"he": "כתובת זו נמצאת ברחוב <b>{addr:street}</b>",
|
||||
"eu": "Helbide hau <b>{addr:street}</b> kalean dago",
|
||||
"it": "L’indirizzo è in via <b>{addr:street}</b>"
|
||||
"it": "L’indirizzo è in via <b>{addr:street}</b>",
|
||||
"zh_Hant": "此地址位於街道 <b>{addr:street}</b>"
|
||||
},
|
||||
"question": {
|
||||
"en": "What street is this address located in?",
|
||||
|
|
|
@ -7,7 +7,8 @@
|
|||
"zh_Hans": "动物收容所",
|
||||
"pt": "Abrigo para animais",
|
||||
"ca": "Refugis d'animals",
|
||||
"pl": "Schroniska dla zwierząt"
|
||||
"pl": "Schroniska dla zwierząt",
|
||||
"fr": "Abri pour animaux"
|
||||
},
|
||||
"description": {
|
||||
"en": "An animal shelter is a facility where animals in trouble are brought and facility's staff (volunteers or not) feeds them and cares of them, rehabilitating and healing them if necessary. This definition includes kennels for abandoned dogs, catteries for abandoned cats, shelters for other abandoned pets and wildlife recovery centres. ",
|
||||
|
@ -26,7 +27,8 @@
|
|||
"zh_Hans": "动物收容所",
|
||||
"pt": "Abrigo para animais",
|
||||
"ca": "Refugi d'animals",
|
||||
"pl": "Schronisko dla zwierząt"
|
||||
"pl": "Schronisko dla zwierząt",
|
||||
"fr": "Un refuge animalier"
|
||||
},
|
||||
"mappings": [
|
||||
{
|
||||
|
@ -75,7 +77,8 @@
|
|||
"zh_Hans": "动物收容所",
|
||||
"pt": "um abrigo para animais",
|
||||
"ca": "un refugi d'animals",
|
||||
"pl": "schronisko dla zwierząt"
|
||||
"pl": "schronisko dla zwierząt",
|
||||
"fr": "refuge animalier"
|
||||
},
|
||||
"tags": [
|
||||
"amenity=animal_shelter"
|
||||
|
@ -96,14 +99,16 @@
|
|||
"es": "¿Cómo se llama este refugio de animales?",
|
||||
"zh_Hans": "这个动物收容所叫什么名字?",
|
||||
"ca": "Quin nom té aquest refugi d'animals?",
|
||||
"pl": "Jak nazywa się to schronisko dla zwierząt?"
|
||||
"pl": "Jak nazywa się to schronisko dla zwierząt?",
|
||||
"fr": "Quel est le nom de ce refuge animalier ?"
|
||||
},
|
||||
"render": {
|
||||
"en": "This animal shelter is named <b>{name}</b>",
|
||||
"de": "Der Name des Tierheims lautet <b>{name}</b>",
|
||||
"es": "Este refugio de animales se llama <b>{name}</b>",
|
||||
"zh_Hans": "这个动物收容所叫 <b>{name}</b>",
|
||||
"pl": "To schronisko dla zwierząt nazywa się <b>{name}</b>"
|
||||
"pl": "To schronisko dla zwierząt nazywa się <b>{name}</b>",
|
||||
"fr": "Ce refuge s'appelle <b>{name}</b>"
|
||||
}
|
||||
},
|
||||
"website",
|
||||
|
@ -127,7 +132,8 @@
|
|||
"es": "Los animales permanecen aquí hasta que son adoptados por un nuevo propietario",
|
||||
"zh_Hans": "动物被饲养在这里直到被新主人收养",
|
||||
"ca": "Els animals romanen ací fins que son adoptats per un nou propietari",
|
||||
"pl": "Zwierzęta są tutaj dopóki nie znajdą nowego właściciela"
|
||||
"pl": "Zwierzęta są tutaj dopóki nie znajdą nowego właściciela",
|
||||
"fr": "Les animaux sont gardés jusqu'à ce qu'ils soient adoptés par un nouveau maître"
|
||||
},
|
||||
"if": "purpose=adoption"
|
||||
},
|
||||
|
@ -137,7 +143,8 @@
|
|||
"de": "Tiere werden hier bis zum Ende Ihres Lebens untergebracht",
|
||||
"es": "Los animales reciben cuidados para el resto de su vida",
|
||||
"zh_Hans": "动物的余生都得到照顾",
|
||||
"ca": "Els animals reben cures per a la resta de la seva vida"
|
||||
"ca": "Els animals reben cures per a la resta de la seva vida",
|
||||
"fr": "Les animaux sont recueillis pour le reste de leur vie"
|
||||
},
|
||||
"if": "purpose=sanctuary"
|
||||
},
|
||||
|
@ -148,7 +155,8 @@
|
|||
"es": "Los animales heridos se rehabilitan aquí hasta que pueden ser liberados de nuevo en la naturaleza ",
|
||||
"zh_Hans": "受伤的动物在这里康复,直到它们可以再次被释放到大自然中 ",
|
||||
"ca": "Els animals ferits es rehabiliten aquí fins que puguen ser alliberats de nou a la natura ",
|
||||
"pl": "Ranne zwierzęta przechodzą tutaj rehabilitację do momentu, kiedy mogą zostać wypuszczone na wolność "
|
||||
"pl": "Ranne zwierzęta przechodzą tutaj rehabilitację do momentu, kiedy mogą zostać wypuszczone na wolność ",
|
||||
"fr": "Les animaux blessés sont soignés jusqu'à ce qu'ils soient en état d'être relâchés dans la nature "
|
||||
},
|
||||
"if": "purpose=release"
|
||||
}
|
||||
|
|
|
@ -29,7 +29,8 @@
|
|||
"pl": "Bankomaty do wypłacania pieniędzy",
|
||||
"pt_BR": "Caixas eletrônicos para sacar dinheiro",
|
||||
"pt": "Multibancos para levantar dinheiro",
|
||||
"it": "Sportelli Bancomat per prelevare denaro"
|
||||
"it": "Sportelli Bancomat per prelevare denaro",
|
||||
"zh_Hant": "自動櫃員機以提款"
|
||||
},
|
||||
"source": {
|
||||
"osmTags": "amenity=atm"
|
||||
|
|
|
@ -196,7 +196,7 @@
|
|||
"it": "Questa panchina <b>non</b> ha uno schienale",
|
||||
"ru": "Без спинки",
|
||||
"zh_Hans": "<b>没有</b>靠背",
|
||||
"zh_Hant": "靠背:無",
|
||||
"zh_Hant": "此長椅<b>沒有</b>靠背",
|
||||
"nb_NO": "Rygglene: Nei",
|
||||
"fi": "Selkänoja: ei",
|
||||
"pl": "<b>Nie</b> posiada oparcia",
|
||||
|
|
|
@ -2293,7 +2293,8 @@
|
|||
"then": {
|
||||
"en": "Authentication by a membership card",
|
||||
"nl": "Aanmelden met een lidkaart is mogelijk",
|
||||
"de": "Authentifizierung durch eine Mitgliedskarte"
|
||||
"de": "Authentifizierung durch eine Mitgliedskarte",
|
||||
"fr": "Authentification par carte de membre"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -2302,7 +2303,8 @@
|
|||
"then": {
|
||||
"en": "Authentication by an app",
|
||||
"nl": "Aanmelden via een applicatie is mogelijk",
|
||||
"de": "Authentifizierung per App"
|
||||
"de": "Authentifizierung per App",
|
||||
"fr": "Authentification par une application"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -2311,7 +2313,8 @@
|
|||
"then": {
|
||||
"en": "Authentication via phone call is available",
|
||||
"nl": "Aanmelden door te bellen naar een telefoonnummer is mogelijk",
|
||||
"de": "Authentifizierung per Anruf ist möglich"
|
||||
"de": "Authentifizierung per Anruf ist möglich",
|
||||
"fr": "Authentification possible par appel téléphonique"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -2320,7 +2323,8 @@
|
|||
"then": {
|
||||
"en": "Authentication via SMS is available",
|
||||
"nl": "Aanmelden via SMS is mogelijk",
|
||||
"de": "Authentifizierung per SMS ist möglich"
|
||||
"de": "Authentifizierung per SMS ist möglich",
|
||||
"fr": "Authentification possible par SMS"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -2650,6 +2654,7 @@
|
|||
"nl": "Dit oplaadpunt werkt",
|
||||
"ca": "Aquesta estació de càrrega funciona",
|
||||
"de": "Die Station ist in Betrieb",
|
||||
"fr": "Cette station de recharge fonctionne",
|
||||
"pl": "Ta stacja ładowania działa"
|
||||
}
|
||||
},
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
"ca": "Mostra la velocitat permesa per a cada carretera",
|
||||
"fr": "Affiche les vitesses autorisées sur toutes les routes",
|
||||
"pl": "Pokazuje dozwoloną prędkość na każdej drodze",
|
||||
"es": "Muestra la velocidad permitida para cada carretera"
|
||||
"es": "Muestra la velocidad permitida para cada carretera",
|
||||
"zh_Hant": "顯示每條道路的允許速度"
|
||||
},
|
||||
"source": {
|
||||
"osmTags": {
|
||||
|
|
|
@ -6,7 +6,8 @@
|
|||
"de": "OpenStreetMap-Hinweise",
|
||||
"es": "Notas de OpenStreetMap",
|
||||
"ca": "Notes d'OpenStreetMap",
|
||||
"cs": "Poznámky OpenStreetMap"
|
||||
"cs": "Poznámky OpenStreetMap",
|
||||
"fr": "Notes OpenStreetMap"
|
||||
},
|
||||
"description": "This layer shows notes on OpenStreetMap. Having this layer in your theme will trigger the 'add new note' functionality in the 'addNewPoint'-popup (or if your theme has no presets, it'll enable adding notes)",
|
||||
"source": {
|
||||
|
@ -33,7 +34,8 @@
|
|||
"es": "Nota",
|
||||
"pa_PK": "نوٹ",
|
||||
"pl": "Notatka",
|
||||
"cs": "Poznámka"
|
||||
"cs": "Poznámka",
|
||||
"fr": "Note"
|
||||
},
|
||||
"mappings": [
|
||||
{
|
||||
|
@ -45,7 +47,8 @@
|
|||
"es": "Nota cerrada",
|
||||
"pl": "Zamknięta notatka",
|
||||
"ca": "Nota tancada",
|
||||
"cs": "Uzavřená poznámka"
|
||||
"cs": "Uzavřená poznámka",
|
||||
"fr": "Note fermée"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -56,7 +59,8 @@
|
|||
"en": "See on OpenStreetMap.org",
|
||||
"nl": "Bekijk op OpenStreetMap.org",
|
||||
"de": "Auf OpenStreetMap.org ansehen",
|
||||
"da": "Se på OpenStreetMap.org"
|
||||
"da": "Se på OpenStreetMap.org",
|
||||
"fr": "Voir sur OpenStreetMap.org"
|
||||
},
|
||||
"render": "<a href='https://openstreetmap.org/note/{id}' target='_blank'><img src='./assets/svg/osm-logo-us.svg'></a>"
|
||||
}
|
||||
|
@ -118,7 +122,8 @@
|
|||
"es": "<h3>Imágenes cercanas</h3>Las imágenes de debajo son imágenes geoetiquetadas cercanas y pueden ser útiles para encargarse de esta nota.",
|
||||
"nl": "<h3>Afbeeldingen in de buurt</h3>Onderstaande afbeeldingen zijn afbeeldingen met geo-referentie en die in de buurt genomen zijn. Mogelijks zijn ze nuttig om deze kaartnota af te handelen.",
|
||||
"ca": "<h3>Imatges properes</h3>Les imatges de sota són imatges geoetiquetades properes i poden ser útils per a encarregar-se d'aquesta nota.",
|
||||
"cs": "<h3>Obrázky v okolí</h3>Obrázky níže jsou obrázky s geografickými značkami v okolí a mohou vám pomoci s touto poznámkou."
|
||||
"cs": "<h3>Obrázky v okolí</h3>Obrázky níže jsou obrázky s geografickými značkami v okolí a mohou vám pomoci s touto poznámkou.",
|
||||
"fr": "<h3>Images à proximité</h3>Les images suivantes sont dans les environs de cette note et pourraient aider à sa résolution."
|
||||
},
|
||||
"special": {
|
||||
"type": "nearby_images",
|
||||
|
@ -134,7 +139,8 @@
|
|||
"de": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={_first_user_id}&reportable_type=User' target='_blank' class='subtle' {_first_user} für Spam oder unangemessene Nachrichten melden</a>",
|
||||
"es": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={_first_user_id}&reportable_type=User' target='_blank' class='subtle'>Reportar {_first_user} por spam o mensajes inapropiados</a>",
|
||||
"ca": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={_first_user_id}&reportable_type=User' target='_blank' class='subtle'>Reporta {_first_user} per spam o missatges inapropiats</a>",
|
||||
"cs": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={_first_user_id}&reportable_type=User' target='_blank' class='subtle'>Nahlásit uživateli {_first_user} spam nebo nevhodné zprávy</ a>"
|
||||
"cs": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={_first_user_id}&reportable_type=User' target='_blank' class='subtle'>Nahlásit uživateli {_first_user} spam nebo nevhodné zprávy</ a>",
|
||||
"fr": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={_first_user_id}&reportable_type=User' target='_blank' class='subtle'>Signaler {_first_user} pour du spam ou des messages inapropriés</a>"
|
||||
},
|
||||
"condition": "_opened_by_anonymous_user=false"
|
||||
},
|
||||
|
@ -146,7 +152,8 @@
|
|||
"de": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={id}&reportable_type=Note' target='_blank'>Notiz als Spam oder unangemessen melden</a>",
|
||||
"es": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={id}&reportable_type=Note' target='_blank'>Reporta esta nota como spam o inapropiada</a>",
|
||||
"ca": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={id}&reportable_type=Note' target='_blank'>Reporta aquesta nota com spam o inapropiada</a>",
|
||||
"cs": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={id}&reportable_type=Note' target='_blank'>Nahlásit tuto poznámku jako spam nebo nevhodnou</a>"
|
||||
"cs": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={id}&reportable_type=Note' target='_blank'>Nahlásit tuto poznámku jako spam nebo nevhodnou</a>",
|
||||
"fr": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={id}&reportable_type=Note' target='_blank'>Signaler cette note comme spam ou contenu inapproprié</a>"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
@ -231,7 +238,8 @@
|
|||
"de": "<b>Nicht</b> erstellt von {search}",
|
||||
"es": "<b>No</b> abierto por el contributor {search}",
|
||||
"ca": "<b>No</b> obert pel contribuïdor {search}",
|
||||
"cs": "<b>Není</b> otevřeno přispěvatelem {search}"
|
||||
"cs": "<b>Není</b> otevřeno přispěvatelem {search}",
|
||||
"fr": "<b>Exclure</b>les notes ouvertes par {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -253,7 +261,8 @@
|
|||
"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}",
|
||||
"da": "Senest redigeret af bidragsyder {search}"
|
||||
"da": "Senest redigeret af bidragsyder {search}",
|
||||
"fr": "Dernière modification par {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -274,7 +283,8 @@
|
|||
"de": "Zuletzt bearbeitet nach dem {search}",
|
||||
"es": "Abierta después de {search}",
|
||||
"ca": "Oberta després de {search}",
|
||||
"cs": "Otevřeno po {search}"
|
||||
"cs": "Otevřeno po {search}",
|
||||
"fr": "Ouverte après le {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -296,7 +306,8 @@
|
|||
"de": "Erstellt vor dem {search}",
|
||||
"es": "Creada antes de {search}",
|
||||
"ca": "Creada abans de {search}",
|
||||
"cs": "Vytvořeno před {search}"
|
||||
"cs": "Vytvořeno před {search}",
|
||||
"fr": "Créée avant le {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -318,7 +329,8 @@
|
|||
"de": "Erstellt nach dem {search}",
|
||||
"es": "Creada después de {search}",
|
||||
"ca": "Creada després de {search}",
|
||||
"cs": "Vytvořeno po {search}"
|
||||
"cs": "Vytvořeno po {search}",
|
||||
"fr": "Créée après le {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -334,7 +346,8 @@
|
|||
"de": "Nur Notizen anzeigen, die anonym erstellt wurden",
|
||||
"es": "Solo mostrar las notas abiertas por contributores anómimos",
|
||||
"ca": "Sols mostrar les notes obertes per contribuïdors anònims",
|
||||
"cs": "Zobrazovat pouze poznámky otevřené anonymním přispěvatelem"
|
||||
"cs": "Zobrazovat pouze poznámky otevřené anonymním přispěvatelem",
|
||||
"fr": "Montrer uniquement les notes ouvertes par un contributeur anonyme"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -350,7 +363,8 @@
|
|||
"de": "Nur offene Notizen anzeigen",
|
||||
"es": "Solo mostrar las notas abiertas",
|
||||
"ca": "Sols mostra les notes obertes",
|
||||
"cs": "Zobrazit pouze otevřené poznámky"
|
||||
"cs": "Zobrazit pouze otevřené poznámky",
|
||||
"fr": "Montrer uniquement les notes ouvertes"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -365,7 +379,8 @@
|
|||
"de": "Alle Notizen",
|
||||
"es": "Todas las notas",
|
||||
"ca": "Totes les notes",
|
||||
"cs": "Všechny poznámky"
|
||||
"cs": "Všechny poznámky",
|
||||
"fr": "Toutes les notes"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -43,7 +43,8 @@
|
|||
"id": "{name}",
|
||||
"es": "{name}",
|
||||
"da": "{name}",
|
||||
"cs": "{name}"
|
||||
"cs": "{name}",
|
||||
"zh_Hant": "{name}"
|
||||
},
|
||||
"mappings": [
|
||||
{
|
||||
|
@ -73,7 +74,8 @@
|
|||
"id": "{name}",
|
||||
"es": "{name}",
|
||||
"da": "{name}",
|
||||
"cs": "{name}"
|
||||
"cs": "{name}",
|
||||
"zh_Hant": "{name}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
@ -321,7 +321,8 @@
|
|||
"da": "Alle typer",
|
||||
"ca": "Tots els tipus",
|
||||
"fr": "Tout type",
|
||||
"cs": "Všechny typy"
|
||||
"cs": "Všechny typy",
|
||||
"zh_Hant": "所有類型"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -35,7 +35,8 @@
|
|||
"id": "Pembuangan Limbah",
|
||||
"da": "Bortskaffelse af affald",
|
||||
"ca": "Contenidor de fem",
|
||||
"cs": "Nakládání s odpady"
|
||||
"cs": "Nakládání s odpady",
|
||||
"zh_Hant": "廢棄物處理"
|
||||
}
|
||||
},
|
||||
"pointRendering": [
|
||||
|
@ -68,7 +69,8 @@
|
|||
"da": "en affaldsbeholder",
|
||||
"ca": "un contenidor de basura",
|
||||
"cs": "koš na odpadky",
|
||||
"pl": "kosz na śmieci"
|
||||
"pl": "kosz na śmieci",
|
||||
"zh_Hant": "廢棄物處理桶"
|
||||
},
|
||||
"tags": [
|
||||
"amenity=waste_disposal"
|
||||
|
@ -95,7 +97,8 @@
|
|||
"de": "Was für ein Abfalleimer ist das?",
|
||||
"ca": "Quin tipus de contenidor de brossa és aquest?",
|
||||
"cs": "Co je to za odpadkový koš?",
|
||||
"pl": "Co to za pojemnik na śmieci?"
|
||||
"pl": "Co to za pojemnik na śmieci?",
|
||||
"zh_Hant": "這是甚麼種類的廢棄物處理箱?"
|
||||
},
|
||||
"mappings": [
|
||||
{
|
||||
|
@ -104,7 +107,8 @@
|
|||
"en": "This is a medium to large bin for disposal of (household) waste",
|
||||
"de": "Dies ist eine Mülltonne oder ein Müllcontainer für (Haushalts-)Abfälle",
|
||||
"ca": "Es tracta d'un contenidor mitjà o gran per a dipositar residus (domèstics)",
|
||||
"cs": "Jedná se o střední až velkou popelnici na (domovní) odpad"
|
||||
"cs": "Jedná se o střední až velkou popelnici na (domovní) odpad",
|
||||
"zh_Hant": "這是一個中型至大型的桶,用於處理(家庭)廢棄物"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -114,7 +118,8 @@
|
|||
"de": "Dies ist eigentlich ein Recyclingcontainer",
|
||||
"ca": "En realitat es tracta d'un contenidor de reciclatge",
|
||||
"cs": "To je vlastně recyklační kontejner",
|
||||
"pl": "W rzeczywistości jest to pojemnik do recyklingu"
|
||||
"pl": "W rzeczywistości jest to pojemnik do recyklingu",
|
||||
"zh_Hant": "這實際上是一個回收容器"
|
||||
},
|
||||
"addExtraTags": [
|
||||
"recycling_type=container"
|
||||
|
@ -132,7 +137,8 @@
|
|||
"id": "Akses: {access}",
|
||||
"da": "Adgang: {access}",
|
||||
"ca": "Accés: {access}",
|
||||
"cs": "Přístup: {access}"
|
||||
"cs": "Přístup: {access}",
|
||||
"zh_Hant": "存取:{access}"
|
||||
},
|
||||
"question": {
|
||||
"en": "Who can use this waste disposal bin?",
|
||||
|
@ -143,7 +149,8 @@
|
|||
"da": "Hvem kan bruge denne affaldsbeholder?",
|
||||
"ca": "Qui pot utilitzar aquest contenidor de brossa?",
|
||||
"cs": "Kdo může používat tento koš na odpadky?",
|
||||
"pl": "Kto może korzystać z tego pojemnika na odpady?"
|
||||
"pl": "Kto może korzystać z tego pojemnika na odpady?",
|
||||
"zh_Hant": "誰可以使用這個廢棄物處理桶?"
|
||||
},
|
||||
"freeform": {
|
||||
"key": "access",
|
||||
|
@ -161,7 +168,8 @@
|
|||
"da": "Denne skraldespand kan bruges af alle",
|
||||
"ca": "Aquest contenidor es pot utilitzat per qualsevol",
|
||||
"cs": "Tento koš může používat kdokoli",
|
||||
"pl": "Z tego pojemnika może korzystać każdy"
|
||||
"pl": "Z tego pojemnika może korzystać każdy",
|
||||
"zh_Hant": "這個桶可以給任何人使用"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -175,7 +183,8 @@
|
|||
"da": "Denne skraldespand er privat",
|
||||
"ca": "Aquest contenidor és privat",
|
||||
"cs": "Tento koš je soukromý",
|
||||
"pl": "Ten kosz jest prywatny"
|
||||
"pl": "Ten kosz jest prywatny",
|
||||
"zh_Hant": "這個桶是私人的"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -189,7 +198,8 @@
|
|||
"da": "Denne skraldespand er kun for beboere",
|
||||
"ca": "Aquest contenidor és només per als residents",
|
||||
"cs": "Tento koš je určen pouze pro obyvatele",
|
||||
"pl": "Ten kosz jest przeznaczony wyłącznie dla mieszkańców"
|
||||
"pl": "Ten kosz jest przeznaczony wyłącznie dla mieszkańców",
|
||||
"zh_Hant": "這個桶僅供居民使用"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -205,7 +215,8 @@
|
|||
"da": "Hvor er denne container placeret?",
|
||||
"ca": "On es troba aquest contenidor?",
|
||||
"cs": "Kde se nachází tento kontejner?",
|
||||
"pl": "Gdzie znajduje się ten kontener?"
|
||||
"pl": "Gdzie znajduje się ten kontener?",
|
||||
"zh_Hant": "這個容器位於哪裡?"
|
||||
},
|
||||
"mappings": [
|
||||
{
|
||||
|
@ -219,7 +230,8 @@
|
|||
"da": "Dette er en underjordisk container",
|
||||
"ca": "Aquest contenidor està soterrat",
|
||||
"cs": "Jedná se o podzemní kontejner",
|
||||
"pl": "To jest podziemny kontener"
|
||||
"pl": "To jest podziemny kontener",
|
||||
"zh_Hant": "這是一個地下容器"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -233,7 +245,8 @@
|
|||
"da": "Denne container er placeret indendørs",
|
||||
"ca": "Aquest contenidor està situat a l'interior",
|
||||
"cs": "Tento kontejner se nachází uvnitř",
|
||||
"pl": "Kontener ten znajduje się w pomieszczeniu zamkniętym"
|
||||
"pl": "Kontener ten znajduje się w pomieszczeniu zamkniętym",
|
||||
"zh_Hant": "這個容器位於室內"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -247,7 +260,8 @@
|
|||
"da": "Denne container er placeret udendørs",
|
||||
"ca": "Aquest contenidor està situat a l'aire lliure",
|
||||
"cs": "Tento kontejner se nachází venku",
|
||||
"pl": "Kontener ten znajduje się na zewnątrz"
|
||||
"pl": "Kontener ten znajduje się na zewnątrz",
|
||||
"zh_Hant": "這個容器位於室外"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
"da": "Moderne vindmøller til produktion af elektricitet",
|
||||
"ca": "Molins de vent moderns que generen electricitat",
|
||||
"cs": "Moderní větrné mlýny vyrábějící elektřinu",
|
||||
"pl": "Nowoczesne wiatraki wytwarzające energię elektryczną"
|
||||
"pl": "Nowoczesne wiatraki wytwarzające energię elektryczną",
|
||||
"zh_Hant": "現代風車產生電力"
|
||||
},
|
||||
"source": {
|
||||
"osmTags": "generator:source=wind"
|
||||
|
@ -281,7 +282,8 @@
|
|||
"sl": "Dodatne informacije za OpenStreetMap strokovnjake: {fixme}",
|
||||
"es": "Información extra para expertos en OpenStreetMap: {fixme}",
|
||||
"ca": "Informació addicional per als experts en OpenStreetMap: {fixme}",
|
||||
"cs": "Další informace pro odborníky na OpenStreetMap: {fixme}"
|
||||
"cs": "Další informace pro odborníky na OpenStreetMap: {fixme}",
|
||||
"zh_Hant": "為 OpenStreetMap 專家提供的額外資訊:{fixme}"
|
||||
},
|
||||
"question": {
|
||||
"en": "Is there something wrong with how this is mapped, that you weren't able to fix here? (leave a note to OpenStreetMap experts)",
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
"nb_NO": "Viser minibanker for å ta ut eller sette inn penger",
|
||||
"es": "Este mapa muestra los cajeros automáticos para retirar o ingresar dinero",
|
||||
"id": "Peta ini menunjukkan ATM untuk menarik atau menyetorkan uang",
|
||||
"zh_Hant": "此地圖顯示了提款或存款的 ATM",
|
||||
"zh_Hant": "此地圖顯示了提款或存款的自動櫃員機",
|
||||
"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",
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
"nl": "Kaart met alle openbare klokken",
|
||||
"ca": "Mapa amb tots els rellotges públics",
|
||||
"de": "Eine Karte mit öffentlichen Uhren",
|
||||
"es": "Mapa con todos los relojes públicos",
|
||||
"es": "Mapa mostrando 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",
|
||||
|
|
|
@ -1,20 +1,13 @@
|
|||
{
|
||||
"id": "mapcomplete-changes",
|
||||
"title": {
|
||||
"en": "Changes made with MapComplete",
|
||||
"da": "Ændringer lavet med MapComplete",
|
||||
"de": "Änderungen mit MapComplete"
|
||||
"en": "Changes made with MapComplete"
|
||||
},
|
||||
"shortDescription": {
|
||||
"en": "Shows changes made by MapComplete",
|
||||
"da": "Vis ændringer lavet med MapComplete",
|
||||
"de": "Änderungen von MapComplete anzeigen"
|
||||
"en": "Shows changes made by MapComplete"
|
||||
},
|
||||
"description": {
|
||||
"en": "This maps shows all the changes made with MapComplete",
|
||||
"da": "Dette kort viser alle ændringer foretaget med MapComplete",
|
||||
"de": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen",
|
||||
"pl": "Ta mapa pokazuje wszystkie zmiany wprowadzone za pomocą MapComplete"
|
||||
"en": "This maps shows all the changes made with MapComplete"
|
||||
},
|
||||
"icon": "./assets/svg/logo.svg",
|
||||
"hideFromOverview": true,
|
||||
|
@ -25,9 +18,7 @@
|
|||
{
|
||||
"id": "mapcomplete-changes",
|
||||
"name": {
|
||||
"en": "Changeset centers",
|
||||
"de": "Zentrum der Änderungssätze",
|
||||
"zh_Hant": "變更集中心"
|
||||
"en": "Changeset centers"
|
||||
},
|
||||
"minzoom": 0,
|
||||
"source": {
|
||||
|
@ -37,51 +28,41 @@
|
|||
},
|
||||
"title": {
|
||||
"render": {
|
||||
"en": "Changeset for {theme}",
|
||||
"de": "Änderungssatz für {theme}"
|
||||
"en": "Changeset for {theme}"
|
||||
}
|
||||
},
|
||||
"description": {
|
||||
"en": "Shows all MapComplete changes",
|
||||
"da": "Vis alle MapComplete-ændringer",
|
||||
"de": "Alle MapComplete-Änderungen anzeigen"
|
||||
"en": "Shows all MapComplete changes"
|
||||
},
|
||||
"tagRenderings": [
|
||||
{
|
||||
"id": "show_changeset_id",
|
||||
"render": {
|
||||
"en": "Changeset <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>",
|
||||
"de": "Änderungssatz <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
|
||||
"en": "Changeset <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "contributor",
|
||||
"question": {
|
||||
"en": "What contributor did make this change?",
|
||||
"da": "Hvilke bidragsydere lavede denne ændring?",
|
||||
"de": "Welcher Mitwirkende hat diese Änderung vorgenommen?"
|
||||
"en": "What contributor did make this change?"
|
||||
},
|
||||
"freeform": {
|
||||
"key": "user"
|
||||
},
|
||||
"render": {
|
||||
"en": "Change made by <a href='https://openstreetmap.org/user/{user}' target='_blank'>{user}</a>",
|
||||
"da": "Ændring lavet af <a href='https://openstreetmap.org/user/{user}' target='_blank'>{user}</a>",
|
||||
"de": "Änderung vorgenommen von <a href='https://openstreetmap.org/user/{user}' target='_blank'>{user}</a>"
|
||||
"en": "Change made by <a href='https://openstreetmap.org/user/{user}' target='_blank'>{user}</a>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "theme-id",
|
||||
"question": {
|
||||
"en": "What theme was used to make this change?",
|
||||
"de": "Welches Thema wurde für die Änderung verwendet?"
|
||||
"en": "What theme was used to make this change?"
|
||||
},
|
||||
"freeform": {
|
||||
"key": "theme"
|
||||
},
|
||||
"render": {
|
||||
"en": "Change with theme <a href='https://mapcomplete.org/{theme}'>{theme}</a>",
|
||||
"de": "Geändert mit Thema <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>"
|
||||
"en": "Change with theme <a href='https://mapcomplete.org/{theme}'>{theme}</a>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -90,23 +71,19 @@
|
|||
"key": "locale"
|
||||
},
|
||||
"question": {
|
||||
"en": "What locale (language) was this change made in?",
|
||||
"de": "In welcher Benutzersprache wurde die Änderung vorgenommen?"
|
||||
"en": "What locale (language) was this change made in?"
|
||||
},
|
||||
"render": {
|
||||
"en": "User locale is {locale}",
|
||||
"de": "Benutzersprache {locale}"
|
||||
"en": "User locale is {locale}"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "host",
|
||||
"render": {
|
||||
"en": "Change with with <a href='{host}'>{host}</a>",
|
||||
"de": "Änderung über <a href='{host}'>{host}</a>"
|
||||
"en": "Change with with <a href='{host}'>{host}</a>"
|
||||
},
|
||||
"question": {
|
||||
"en": "What host (website) was this change made with?",
|
||||
"de": "Über welchen Host (Webseite) wurde diese Änderung vorgenommen?"
|
||||
"en": "What host (website) was this change made with?"
|
||||
},
|
||||
"freeform": {
|
||||
"key": "host"
|
||||
|
@ -127,13 +104,10 @@
|
|||
{
|
||||
"id": "version",
|
||||
"question": {
|
||||
"en": "What version of MapComplete was used to make this change?",
|
||||
"de": "Mit welcher MapComplete Version wurde die Änderung vorgenommen?"
|
||||
"en": "What version of MapComplete was used to make this change?"
|
||||
},
|
||||
"render": {
|
||||
"en": "Made with {editor}",
|
||||
"da": "Lavet med {editor}",
|
||||
"de": "Erstellt mit {editor}"
|
||||
"en": "Made with {editor}"
|
||||
},
|
||||
"freeform": {
|
||||
"key": "editor"
|
||||
|
@ -519,10 +493,7 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Themename contains {search}",
|
||||
"da": "Temanavn indeholder {search}",
|
||||
"de": "Themenname enthält {search}",
|
||||
"pl": "Nazwa tematu zawiera {search}"
|
||||
"en": "Themename contains {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -538,9 +509,7 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Themename does <b>not</b> contain {search}",
|
||||
"da": "Temanavn indeholder <b>ikke</b> {search}",
|
||||
"de": "Themename enthält <b>not</b> {search}"
|
||||
"en": "Themename does <b>not</b> contain {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -556,9 +525,7 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Made by contributor {search}",
|
||||
"da": "Lavet af bidragsyder {search}",
|
||||
"de": "Erstellt vom Mitwirkenden {search}"
|
||||
"en": "Made by contributor {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -574,9 +541,7 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "<b>Not</b> made by contributor {search}",
|
||||
"da": "<b>Ikke</b> lavet af bidragsyder {search}",
|
||||
"de": "<b>Nicht</b> erstellt von Mitwirkendem {search}"
|
||||
"en": "<b>Not</b> made by contributor {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -593,9 +558,7 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Made before {search}",
|
||||
"da": "Lavet før {search}",
|
||||
"de": "Erstellt vor {search}"
|
||||
"en": "Made before {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -612,9 +575,7 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Made after {search}",
|
||||
"da": "Lavet efter {search}",
|
||||
"de": "Erstellt nach {search}"
|
||||
"en": "Made after {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -630,8 +591,7 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "User language (iso-code) {search}",
|
||||
"de": "Benutzersprache (ISO-Code) {search}"
|
||||
"en": "User language (iso-code) {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -647,8 +607,7 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Made with host {search}",
|
||||
"de": "Erstellt mit Host {search}"
|
||||
"en": "Made with host {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -659,8 +618,7 @@
|
|||
{
|
||||
"osmTags": "add-image>0",
|
||||
"question": {
|
||||
"en": "Changeset added at least one image",
|
||||
"de": "Änderungssatz hat mindestens ein Bild hinzugefügt"
|
||||
"en": "Changeset added at least one image"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -671,8 +629,7 @@
|
|||
{
|
||||
"osmTags": "theme!=grb",
|
||||
"question": {
|
||||
"en": "Exclude GRB theme",
|
||||
"de": "GRB-Thema ausschließen"
|
||||
"en": "Exclude GRB theme"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -683,8 +640,7 @@
|
|||
{
|
||||
"osmTags": "theme!=etymology",
|
||||
"question": {
|
||||
"en": "Exclude etymology theme",
|
||||
"de": "Etymologie-Thema ausschließen"
|
||||
"en": "Exclude etymology theme"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -699,8 +655,7 @@
|
|||
{
|
||||
"id": "link_to_more",
|
||||
"render": {
|
||||
"en": "More statistics can be found <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>here</a>",
|
||||
"de": "Weitere Statistiken gibt es <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>hier</a>"
|
||||
"en": "More statistics can be found <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>here</a>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
"ja": "オープントイレマップ",
|
||||
"zh_Hant": "公共廁所",
|
||||
"pl": "Publiczne toalety",
|
||||
"it": "Mappa libera delle toilet",
|
||||
"it": "Servizi igienici pubblici",
|
||||
"nb_NO": "Åpent toalettkart",
|
||||
"hu": "WC-térkép",
|
||||
"ca": "Lavabos públics",
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -358,15 +358,6 @@
|
|||
"1": {
|
||||
"then": "Peinture murale"
|
||||
},
|
||||
"10": {
|
||||
"then": "Azulejo (faïence latine)"
|
||||
},
|
||||
"11": {
|
||||
"then": "Carrelage"
|
||||
},
|
||||
"12": {
|
||||
"then": "Sculpture sur bois"
|
||||
},
|
||||
"2": {
|
||||
"then": "Peinture"
|
||||
},
|
||||
|
@ -390,6 +381,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 ?",
|
||||
|
@ -2506,15 +2506,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"
|
||||
},
|
||||
|
@ -2538,6 +2529,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 ?",
|
||||
|
@ -2586,15 +2586,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"
|
||||
},
|
||||
|
@ -2618,6 +2609,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 ?",
|
||||
|
@ -3467,21 +3467,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"
|
||||
},
|
||||
|
@ -3505,6 +3490,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 ?",
|
||||
|
@ -3898,11 +3898,11 @@
|
|||
},
|
||||
"room-type": {
|
||||
"mappings": {
|
||||
"14": {
|
||||
"then": "C'est un bureau"
|
||||
},
|
||||
"4": {
|
||||
"then": "C'est une salle de classe"
|
||||
},
|
||||
"14": {
|
||||
"then": "C'est un bureau"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4183,18 +4183,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"
|
||||
},
|
||||
|
@ -4218,6 +4206,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",
|
||||
|
@ -4355,13 +4355,6 @@
|
|||
},
|
||||
"note": {
|
||||
"filter": {
|
||||
"10": {
|
||||
"options": {
|
||||
"0": {
|
||||
"question": "Toutes les notes"
|
||||
}
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"options": {
|
||||
"0": {
|
||||
|
@ -4417,6 +4410,13 @@
|
|||
"question": "Montrer uniquement les notes ouvertes"
|
||||
}
|
||||
}
|
||||
},
|
||||
"10": {
|
||||
"options": {
|
||||
"0": {
|
||||
"question": "Toutes les notes"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Notes OpenStreetMap",
|
||||
|
@ -5392,6 +5392,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"
|
||||
},
|
||||
|
@ -5422,35 +5446,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"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -5513,6 +5513,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"
|
||||
},
|
||||
|
@ -5540,9 +5564,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"
|
||||
},
|
||||
|
@ -5560,27 +5581,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 ?"
|
||||
|
@ -7029,27 +7029,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"
|
||||
},
|
||||
|
@ -7073,6 +7052,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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7130,24 +7130,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"
|
||||
},
|
||||
|
@ -7171,6 +7153,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 ?",
|
||||
|
|
|
@ -56,12 +56,6 @@
|
|||
"1": {
|
||||
"then": "壁畫"
|
||||
},
|
||||
"10": {
|
||||
"then": "Azulejo (西班牙雕塑作品名稱)"
|
||||
},
|
||||
"11": {
|
||||
"then": "瓷磚"
|
||||
},
|
||||
"2": {
|
||||
"then": "繪畫"
|
||||
},
|
||||
|
@ -85,6 +79,12 @@
|
|||
},
|
||||
"9": {
|
||||
"then": "寬慰"
|
||||
},
|
||||
"10": {
|
||||
"then": "Azulejo (西班牙雕塑作品名稱)"
|
||||
},
|
||||
"11": {
|
||||
"then": "瓷磚"
|
||||
}
|
||||
},
|
||||
"question": "這是什麼類型的藝術品?",
|
||||
|
|
|
@ -956,33 +956,6 @@
|
|||
"onwheels": {
|
||||
"description": "En este mapa se muestran los lugares accesibles al público en silla de ruedas, que pueden añadirse fácilmente",
|
||||
"layers": {
|
||||
"19": {
|
||||
"override": {
|
||||
"=title": {
|
||||
"render": "Estadísticas"
|
||||
}
|
||||
}
|
||||
},
|
||||
"20": {
|
||||
"override": {
|
||||
"+tagRenderings": {
|
||||
"0": {
|
||||
"render": {
|
||||
"special": {
|
||||
"text": "Importar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"1": {
|
||||
"render": {
|
||||
"special": {
|
||||
"message": "Añadir todas las etiquetas sugeridas"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"4": {
|
||||
"override": {
|
||||
"filter": {
|
||||
|
@ -1025,6 +998,33 @@
|
|||
"override": {
|
||||
"name": "Plazas de aparcamiento para discapacitados"
|
||||
}
|
||||
},
|
||||
"19": {
|
||||
"override": {
|
||||
"=title": {
|
||||
"render": "Estadísticas"
|
||||
}
|
||||
}
|
||||
},
|
||||
"20": {
|
||||
"override": {
|
||||
"+tagRenderings": {
|
||||
"0": {
|
||||
"render": {
|
||||
"special": {
|
||||
"text": "Importar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"1": {
|
||||
"render": {
|
||||
"special": {
|
||||
"message": "Añadir todas las etiquetas sugeridas"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"title": "Sobre ruedas"
|
||||
|
@ -1240,6 +1240,10 @@
|
|||
"stations": {
|
||||
"description": "Ver, editar y añadir detalles a una estación de tren",
|
||||
"layers": {
|
||||
"3": {
|
||||
"description": "Capa que muestra las estaciones de tren",
|
||||
"name": "Estación de Tren"
|
||||
},
|
||||
"16": {
|
||||
"description": "Pantallas que muestran los trenes que saldrán de esta estación",
|
||||
"name": "Tableros de salidas",
|
||||
|
@ -1271,10 +1275,6 @@
|
|||
"title": {
|
||||
"render": "Tablero de salidas"
|
||||
}
|
||||
},
|
||||
"3": {
|
||||
"description": "Capa que muestra las estaciones de tren",
|
||||
"name": "Estación de Tren"
|
||||
}
|
||||
},
|
||||
"title": "Estaciones de tren"
|
||||
|
|
|
@ -871,33 +871,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": {
|
||||
|
@ -940,6 +913,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"
|
||||
|
@ -1103,6 +1103,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",
|
||||
|
@ -1134,10 +1138,6 @@
|
|||
"title": {
|
||||
"render": "Tableau des départs"
|
||||
}
|
||||
},
|
||||
"3": {
|
||||
"description": "Couche montrant les gares",
|
||||
"name": "Gares ferroviaires"
|
||||
}
|
||||
},
|
||||
"title": "Gares ferroviaires"
|
||||
|
|
|
@ -597,6 +597,10 @@
|
|||
},
|
||||
"stations": {
|
||||
"layers": {
|
||||
"3": {
|
||||
"description": "顯示火車站的圖層",
|
||||
"name": "火車站"
|
||||
},
|
||||
"16": {
|
||||
"name": "出發板",
|
||||
"presets": {
|
||||
|
@ -617,10 +621,6 @@
|
|||
"title": {
|
||||
"render": "時刻表"
|
||||
}
|
||||
},
|
||||
"3": {
|
||||
"description": "顯示火車站的圖層",
|
||||
"name": "火車站"
|
||||
}
|
||||
},
|
||||
"title": "火車站"
|
||||
|
|
16
package-lock.json
generated
16
package-lock.json
generated
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "mapcomplete",
|
||||
"version": "0.44.0",
|
||||
"version": "0.44.4",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "mapcomplete",
|
||||
"version": "0.44.0",
|
||||
"version": "0.44.4",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"dependencies": {
|
||||
"@comunica/core": "^3.0.1",
|
||||
|
@ -7893,9 +7893,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/caniuse-lite": {
|
||||
"version": "1.0.30001636",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz",
|
||||
"integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==",
|
||||
"version": "1.0.30001640",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz",
|
||||
"integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
|
@ -25250,9 +25250,9 @@
|
|||
"version": "2.0.1"
|
||||
},
|
||||
"caniuse-lite": {
|
||||
"version": "1.0.30001636",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz",
|
||||
"integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==",
|
||||
"version": "1.0.30001640",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz",
|
||||
"integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==",
|
||||
"dev": true
|
||||
},
|
||||
"canonicalize": {
|
||||
|
|
|
@ -105,12 +105,12 @@ class DownloadNsiLogos extends Script {
|
|||
)
|
||||
for (let j = 0; j < results.length; j++) {
|
||||
let didDownload = results[j]
|
||||
if(didDownload !== "error"){
|
||||
if (didDownload !== "error") {
|
||||
continue
|
||||
}
|
||||
console.log("Retrying", items[i + j].id, type)
|
||||
didDownload = await this.downloadLogo(items[i + j], type, basePath)
|
||||
if(didDownload === "error"){
|
||||
if (didDownload === "error") {
|
||||
console.log("Failed again:", items[i + j].id)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ class ParseLayer extends Conversion<
|
|||
|
||||
convert(
|
||||
path: string,
|
||||
context: ConversionContext,
|
||||
context: ConversionContext
|
||||
): {
|
||||
parsed: LayerConfig
|
||||
raw: LayerConfigJson
|
||||
|
@ -110,7 +110,7 @@ class AddIconSummary extends DesugaringStep<{ raw: LayerConfigJson; parsed: Laye
|
|||
const fixed = json.raw
|
||||
const layerConfig = json.parsed
|
||||
const pointRendering: PointRenderingConfig = layerConfig.mapRendering.find((pr) =>
|
||||
pr.location.has("point"),
|
||||
pr.location.has("point")
|
||||
)
|
||||
const defaultTags = layerConfig.GetBaseTags()
|
||||
fixed["_layerIcon"] = Utils.NoNull(
|
||||
|
@ -125,7 +125,7 @@ class AddIconSummary extends DesugaringStep<{ raw: LayerConfigJson; parsed: Laye
|
|||
result["color"] = c
|
||||
}
|
||||
return result
|
||||
}),
|
||||
})
|
||||
)
|
||||
return { raw: fixed, parsed: layerConfig }
|
||||
}
|
||||
|
@ -147,7 +147,7 @@ class LayerOverviewUtils extends Script {
|
|||
|
||||
private static extractLayerIdsFrom(
|
||||
themeFile: LayoutConfigJson,
|
||||
includeInlineLayers = true,
|
||||
includeInlineLayers = true
|
||||
): string[] {
|
||||
const publicLayerIds: string[] = []
|
||||
if (!Array.isArray(themeFile.layers)) {
|
||||
|
@ -214,10 +214,10 @@ class LayerOverviewUtils extends Script {
|
|||
| LayerConfigJson
|
||||
| string
|
||||
| {
|
||||
builtin
|
||||
}
|
||||
)[]
|
||||
}[],
|
||||
builtin
|
||||
}
|
||||
)[]
|
||||
}[]
|
||||
) {
|
||||
const perId = new Map<string, any>()
|
||||
for (const theme of themes) {
|
||||
|
@ -258,7 +258,7 @@ class LayerOverviewUtils extends Script {
|
|||
writeFileSync(
|
||||
"./src/assets/generated/theme_overview.json",
|
||||
JSON.stringify(sorted, null, " "),
|
||||
{ encoding: "utf8" },
|
||||
{ encoding: "utf8" }
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -270,7 +270,7 @@ class LayerOverviewUtils extends Script {
|
|||
writeFileSync(
|
||||
`${LayerOverviewUtils.themePath}${theme.id}.json`,
|
||||
JSON.stringify(theme, null, " "),
|
||||
{ encoding: "utf8" },
|
||||
{ encoding: "utf8" }
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -281,12 +281,12 @@ class LayerOverviewUtils extends Script {
|
|||
writeFileSync(
|
||||
`${LayerOverviewUtils.layerPath}${layer.id}.json`,
|
||||
JSON.stringify(layer, null, " "),
|
||||
{ encoding: "utf8" },
|
||||
{ encoding: "utf8" }
|
||||
)
|
||||
}
|
||||
|
||||
static asDict(
|
||||
trs: QuestionableTagRenderingConfigJson[],
|
||||
trs: QuestionableTagRenderingConfigJson[]
|
||||
): Map<string, QuestionableTagRenderingConfigJson> {
|
||||
const d = new Map<string, QuestionableTagRenderingConfigJson>()
|
||||
for (const tr of trs) {
|
||||
|
@ -299,12 +299,12 @@ class LayerOverviewUtils extends Script {
|
|||
getSharedTagRenderings(
|
||||
doesImageExist: DoesImageExist,
|
||||
bootstrapTagRenderings: Map<string, QuestionableTagRenderingConfigJson>,
|
||||
bootstrapTagRenderingsOrder: string[],
|
||||
bootstrapTagRenderingsOrder: string[]
|
||||
): QuestionableTagRenderingConfigJson[]
|
||||
getSharedTagRenderings(
|
||||
doesImageExist: DoesImageExist,
|
||||
bootstrapTagRenderings: Map<string, QuestionableTagRenderingConfigJson> = null,
|
||||
bootstrapTagRenderingsOrder: string[] = [],
|
||||
bootstrapTagRenderingsOrder: string[] = []
|
||||
): QuestionableTagRenderingConfigJson[] {
|
||||
const prepareLayer = new PrepareLayer(
|
||||
{
|
||||
|
@ -315,7 +315,7 @@ class LayerOverviewUtils extends Script {
|
|||
},
|
||||
{
|
||||
addTagRenderingsToContext: true,
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
const path = "assets/layers/questions/questions.json"
|
||||
|
@ -335,7 +335,7 @@ class LayerOverviewUtils extends Script {
|
|||
return this.getSharedTagRenderings(
|
||||
doesImageExist,
|
||||
dict,
|
||||
sharedQuestions.tagRenderings.map((tr) => tr["id"]),
|
||||
sharedQuestions.tagRenderings.map((tr) => tr["id"])
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -375,8 +375,8 @@ class LayerOverviewUtils extends Script {
|
|||
if (contents.indexOf("<text") > 0) {
|
||||
console.warn(
|
||||
"The SVG at " +
|
||||
path +
|
||||
" contains a `text`-tag. This is highly discouraged. Every machine viewing your theme has their own font libary, and the font you choose might not be present, resulting in a different font being rendered. Solution: open your .svg in inkscape (or another program), select the text and convert it to a path",
|
||||
path +
|
||||
" contains a `text`-tag. This is highly discouraged. Every machine viewing your theme has their own font libary, and the font you choose might not be present, resulting in a different font being rendered. Solution: open your .svg in inkscape (or another program), select the text and convert it to a path"
|
||||
)
|
||||
errCount++
|
||||
}
|
||||
|
@ -392,14 +392,14 @@ class LayerOverviewUtils extends Script {
|
|||
args
|
||||
.find((a) => a.startsWith("--themes="))
|
||||
?.substring("--themes=".length)
|
||||
?.split(",") ?? [],
|
||||
?.split(",") ?? []
|
||||
)
|
||||
|
||||
const layerWhitelist = new Set(
|
||||
args
|
||||
.find((a) => a.startsWith("--layers="))
|
||||
?.substring("--layers=".length)
|
||||
?.split(",") ?? [],
|
||||
?.split(",") ?? []
|
||||
)
|
||||
|
||||
const forceReload = args.some((a) => a == "--force")
|
||||
|
@ -428,11 +428,11 @@ class LayerOverviewUtils extends Script {
|
|||
sharedLayers,
|
||||
recompiledThemes,
|
||||
forceReload,
|
||||
themeWhitelist,
|
||||
themeWhitelist
|
||||
)
|
||||
|
||||
new ValidateThemeEnsemble().convertStrict(
|
||||
Array.from(sharedThemes.values()).map((th) => new LayoutConfig(th, true)),
|
||||
Array.from(sharedThemes.values()).map((th) => new LayoutConfig(th, true))
|
||||
)
|
||||
|
||||
if (recompiledThemes.length > 0) {
|
||||
|
@ -440,7 +440,7 @@ class LayerOverviewUtils extends Script {
|
|||
"./src/assets/generated/known_layers.json",
|
||||
JSON.stringify({
|
||||
layers: Array.from(sharedLayers.values()).filter((l) => l.id !== "favourite"),
|
||||
}),
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -461,7 +461,7 @@ class LayerOverviewUtils extends Script {
|
|||
const proto: LayoutConfigJson = JSON.parse(
|
||||
readFileSync("./assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json", {
|
||||
encoding: "utf8",
|
||||
}),
|
||||
})
|
||||
)
|
||||
const protolayer = <LayerConfigJson>(
|
||||
proto.layers.filter((l) => l["id"] === "mapcomplete-changes")[0]
|
||||
|
@ -478,12 +478,12 @@ class LayerOverviewUtils extends Script {
|
|||
layers: ScriptUtils.getLayerFiles().map((f) => f.parsed),
|
||||
themes: ScriptUtils.getThemeFiles().map((f) => f.parsed),
|
||||
},
|
||||
ConversionContext.construct([], []),
|
||||
ConversionContext.construct([], [])
|
||||
)
|
||||
|
||||
for (const [_, theme] of sharedThemes) {
|
||||
theme.layers = theme.layers.filter(
|
||||
(l) => Constants.added_by_default.indexOf(l["id"]) < 0,
|
||||
(l) => Constants.added_by_default.indexOf(l["id"]) < 0
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -492,7 +492,7 @@ class LayerOverviewUtils extends Script {
|
|||
"./src/assets/generated/known_themes.json",
|
||||
JSON.stringify({
|
||||
themes: Array.from(sharedThemes.values()),
|
||||
}),
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -504,7 +504,7 @@ class LayerOverviewUtils extends Script {
|
|||
private parseLayer(
|
||||
doesImageExist: DoesImageExist,
|
||||
prepLayer: PrepareLayer,
|
||||
sharedLayerPath: string,
|
||||
sharedLayerPath: string
|
||||
): {
|
||||
raw: LayerConfigJson
|
||||
parsed: LayerConfig
|
||||
|
@ -515,7 +515,7 @@ class LayerOverviewUtils extends Script {
|
|||
const parsed = parser.convertStrict(sharedLayerPath, context)
|
||||
const result = AddIconSummary.singleton.convertStrict(
|
||||
parsed,
|
||||
context.inOperation("AddIconSummary"),
|
||||
context.inOperation("AddIconSummary")
|
||||
)
|
||||
return { ...result, context }
|
||||
}
|
||||
|
@ -523,7 +523,7 @@ class LayerOverviewUtils extends Script {
|
|||
private buildLayerIndex(
|
||||
doesImageExist: DoesImageExist,
|
||||
forceReload: boolean,
|
||||
whitelist: Set<string>,
|
||||
whitelist: Set<string>
|
||||
): Map<string, LayerConfigJson> {
|
||||
// First, we expand and validate all builtin layers. These are written to src/assets/generated/layers
|
||||
// At the same time, an index of available layers is built.
|
||||
|
@ -578,17 +578,17 @@ class LayerOverviewUtils extends Script {
|
|||
|
||||
console.log(
|
||||
"Recompiled layers " +
|
||||
recompiledLayers.join(", ") +
|
||||
" and skipped " +
|
||||
skippedLayers.length +
|
||||
" layers. Detected " +
|
||||
warningCount +
|
||||
" warnings",
|
||||
recompiledLayers.join(", ") +
|
||||
" and skipped " +
|
||||
skippedLayers.length +
|
||||
" layers. Detected " +
|
||||
warningCount +
|
||||
" warnings"
|
||||
)
|
||||
// We always need the calculated tags of 'usersettings', so we export them separately
|
||||
this.extractJavascriptCodeForLayer(
|
||||
state.sharedLayers.get("usersettings"),
|
||||
"./src/Logic/State/UserSettingsMetaTagging.ts",
|
||||
"./src/Logic/State/UserSettingsMetaTagging.ts"
|
||||
)
|
||||
|
||||
return sharedLayers
|
||||
|
@ -605,8 +605,8 @@ class LayerOverviewUtils extends Script {
|
|||
private extractJavascriptCode(themeFile: LayoutConfigJson) {
|
||||
const allCode = [
|
||||
"import {Feature} from 'geojson'",
|
||||
"import { ExtraFuncType } from \"../../../Logic/ExtraFunctions\";",
|
||||
"import { Utils } from \"../../../Utils\"",
|
||||
'import { ExtraFuncType } from "../../../Logic/ExtraFunctions";',
|
||||
'import { Utils } from "../../../Utils"',
|
||||
"export class ThemeMetaTagging {",
|
||||
" public static readonly themeName = " + JSON.stringify(themeFile.id),
|
||||
"",
|
||||
|
@ -618,8 +618,8 @@ class LayerOverviewUtils extends Script {
|
|||
|
||||
allCode.push(
|
||||
" public metaTaggging_for_" +
|
||||
id +
|
||||
"(feat: Feature, helperFunctions: Record<ExtraFuncType, (feature: Feature) => Function>) {",
|
||||
id +
|
||||
"(feat: Feature, helperFunctions: Record<ExtraFuncType, (feature: Feature) => Function>) {"
|
||||
)
|
||||
allCode.push(" const {" + ExtraFunctions.types.join(", ") + "} = helperFunctions")
|
||||
for (const line of code) {
|
||||
|
@ -630,10 +630,10 @@ class LayerOverviewUtils extends Script {
|
|||
if (!isStrict) {
|
||||
allCode.push(
|
||||
" Utils.AddLazyProperty(feat.properties, '" +
|
||||
attributeName +
|
||||
"', () => " +
|
||||
expression +
|
||||
" ) ",
|
||||
attributeName +
|
||||
"', () => " +
|
||||
expression +
|
||||
" ) "
|
||||
)
|
||||
} else {
|
||||
attributeName = attributeName.substring(0, attributeName.length - 1).trim()
|
||||
|
@ -678,7 +678,7 @@ class LayerOverviewUtils extends Script {
|
|||
const code = l.calculatedTags ?? []
|
||||
|
||||
allCode.push(
|
||||
" public metaTaggging_for_" + l.id + "(feat: {properties: Record<string, string>}) {",
|
||||
" public metaTaggging_for_" + l.id + "(feat: {properties: Record<string, string>}) {"
|
||||
)
|
||||
for (const line of code) {
|
||||
const firstEq = line.indexOf("=")
|
||||
|
@ -688,10 +688,10 @@ class LayerOverviewUtils extends Script {
|
|||
if (!isStrict) {
|
||||
allCode.push(
|
||||
" Utils.AddLazyProperty(feat.properties, '" +
|
||||
attributeName +
|
||||
"', () => " +
|
||||
expression +
|
||||
" ) ",
|
||||
attributeName +
|
||||
"', () => " +
|
||||
expression +
|
||||
" ) "
|
||||
)
|
||||
} else {
|
||||
attributeName = attributeName.substring(0, attributeName.length - 2).trim()
|
||||
|
@ -716,14 +716,14 @@ class LayerOverviewUtils extends Script {
|
|||
sharedLayers: Map<string, LayerConfigJson>,
|
||||
recompiledThemes: string[],
|
||||
forceReload: boolean,
|
||||
whitelist: Set<string>,
|
||||
whitelist: Set<string>
|
||||
): Map<string, LayoutConfigJson> {
|
||||
console.log(" ---------- VALIDATING BUILTIN THEMES ---------")
|
||||
const themeFiles = ScriptUtils.getThemeFiles()
|
||||
const fixed = new Map<string, LayoutConfigJson>()
|
||||
|
||||
const publicLayers = LayerOverviewUtils.publicLayerIdsFrom(
|
||||
themeFiles.map((th) => th.parsed),
|
||||
themeFiles.map((th) => th.parsed)
|
||||
)
|
||||
|
||||
const trs = this.getSharedTagRenderings(new DoesImageExist(licensePaths, existsSync))
|
||||
|
@ -763,15 +763,15 @@ class LayerOverviewUtils extends Script {
|
|||
LayerOverviewUtils.themePath + "/" + themePath.substring(themePath.lastIndexOf("/"))
|
||||
|
||||
const usedLayers = Array.from(
|
||||
LayerOverviewUtils.extractLayerIdsFrom(themeFile, false),
|
||||
LayerOverviewUtils.extractLayerIdsFrom(themeFile, false)
|
||||
).map((id) => LayerOverviewUtils.layerPath + id + ".json")
|
||||
|
||||
if (!forceReload && !this.shouldBeUpdated([themePath, ...usedLayers], targetPath)) {
|
||||
fixed.set(
|
||||
themeFile.id,
|
||||
JSON.parse(
|
||||
readFileSync(LayerOverviewUtils.themePath + themeFile.id + ".json", "utf8"),
|
||||
),
|
||||
readFileSync(LayerOverviewUtils.themePath + themeFile.id + ".json", "utf8")
|
||||
)
|
||||
)
|
||||
ScriptUtils.erasableLog("Skipping", themeFile.id)
|
||||
skippedThemes.push(themeFile.id)
|
||||
|
@ -782,23 +782,23 @@ class LayerOverviewUtils extends Script {
|
|||
|
||||
new PrevalidateTheme().convertStrict(
|
||||
themeFile,
|
||||
ConversionContext.construct([themePath], ["PrepareLayer"]),
|
||||
ConversionContext.construct([themePath], ["PrepareLayer"])
|
||||
)
|
||||
try {
|
||||
themeFile = new PrepareTheme(convertState, {
|
||||
skipDefaultLayers: true,
|
||||
}).convertStrict(
|
||||
themeFile,
|
||||
ConversionContext.construct([themePath], ["PrepareLayer"]),
|
||||
ConversionContext.construct([themePath], ["PrepareLayer"])
|
||||
)
|
||||
new ValidateThemeAndLayers(
|
||||
new DoesImageExist(licensePaths, existsSync, knownTagRenderings),
|
||||
themePath,
|
||||
true,
|
||||
knownTagRenderings,
|
||||
knownTagRenderings
|
||||
).convertStrict(
|
||||
themeFile,
|
||||
ConversionContext.construct([themePath], ["PrepareLayer"]),
|
||||
ConversionContext.construct([themePath], ["PrepareLayer"])
|
||||
)
|
||||
|
||||
if (themeFile.icon.endsWith(".svg")) {
|
||||
|
@ -850,16 +850,16 @@ class LayerOverviewUtils extends Script {
|
|||
t.shortDescription ?? new Translation(t.description).FirstSentence(),
|
||||
mustHaveLanguage: t.mustHaveLanguage?.length > 0,
|
||||
}
|
||||
}),
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
console.log(
|
||||
"Recompiled themes " +
|
||||
recompiledThemes.join(", ") +
|
||||
" and skipped " +
|
||||
skippedThemes.length +
|
||||
" themes",
|
||||
recompiledThemes.join(", ") +
|
||||
" and skipped " +
|
||||
skippedThemes.length +
|
||||
" themes"
|
||||
)
|
||||
|
||||
return fixed
|
||||
|
|
|
@ -19,9 +19,16 @@ class GenerateSummaryTileCache extends Script {
|
|||
}
|
||||
}
|
||||
|
||||
async fetchTile(z: number, x: number, y: number, layersSummed: string): Promise<Feature<Point>> {
|
||||
async fetchTile(
|
||||
z: number,
|
||||
x: number,
|
||||
y: number,
|
||||
layersSummed: string
|
||||
): Promise<Feature<Point>> {
|
||||
const index = Tiles.tile_index(z, x, y)
|
||||
let feature: Feature<Point> | any = (await SummaryTileSource.downloadTile(index, this.url, layersSummed).AsPromise())[0]
|
||||
let feature: Feature<Point> | any = (
|
||||
await SummaryTileSource.downloadTile(index, this.url, layersSummed).AsPromise()
|
||||
)[0]
|
||||
if (!feature) {
|
||||
feature = { properties: { total: 0 } }
|
||||
}
|
||||
|
@ -34,7 +41,13 @@ class GenerateSummaryTileCache extends Script {
|
|||
return feature
|
||||
}
|
||||
|
||||
async fetchTileRecursive(z: number, x: number, y: number, layersSummed: string, sleepMs = 0): Promise<Feature<Point>> {
|
||||
async fetchTileRecursive(
|
||||
z: number,
|
||||
x: number,
|
||||
y: number,
|
||||
layersSummed: string,
|
||||
sleepMs = 0
|
||||
): Promise<Feature<Point>> {
|
||||
const index = Tiles.tile_index(z, x, y)
|
||||
const path = this.cacheDir + "tile_" + z + "_" + x + "_" + y + ".json"
|
||||
if (existsSync(path)) {
|
||||
|
@ -48,11 +61,12 @@ class GenerateSummaryTileCache extends Script {
|
|||
feature = await this.fetchTile(z, x, y, layersSummed)
|
||||
} else {
|
||||
const parts = [
|
||||
await this.fetchTileRecursive(z + 1, x * 2, y * 2, layersSummed),
|
||||
await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2, layersSummed),
|
||||
await this.fetchTileRecursive(z + 1, x * 2, y * 2 + 1, layersSummed),
|
||||
await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2 + 1, layersSummed)]
|
||||
const sum = this.sumTotals(parts.map(f => f.properties))
|
||||
await this.fetchTileRecursive(z + 1, x * 2, y * 2, layersSummed),
|
||||
await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2, layersSummed),
|
||||
await this.fetchTileRecursive(z + 1, x * 2, y * 2 + 1, layersSummed),
|
||||
await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2 + 1, layersSummed),
|
||||
]
|
||||
const sum = this.sumTotals(parts.map((f) => f.properties))
|
||||
feature = <Feature<Point>>{
|
||||
type: "Feature",
|
||||
properties: sum,
|
||||
|
@ -77,14 +91,13 @@ class GenerateSummaryTileCache extends Script {
|
|||
return sum
|
||||
}
|
||||
|
||||
|
||||
async main(args: string[]): Promise<void> {
|
||||
|
||||
const layers = await Utils.downloadJson<{ layers: string[], meta: object }>(this.url + "/status.json")
|
||||
const layersSummed = layers.layers.map(l => encodeURIComponent(l)).join("+")
|
||||
const layers = await Utils.downloadJson<{ layers: string[]; meta: object }>(
|
||||
this.url + "/status.json"
|
||||
)
|
||||
const layersSummed = layers.layers.map((l) => encodeURIComponent(l)).join("+")
|
||||
const r = await this.fetchTileRecursive(0, 0, 0, layersSummed)
|
||||
console.log(r)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -84,7 +84,11 @@ export class SummaryTileSource extends DynamicTileSource {
|
|||
zoomRounded,
|
||||
0, // minzoom
|
||||
(tileIndex) => {
|
||||
const features = SummaryTileSource.downloadTile(tileIndex, cacheserver, layersSummed)
|
||||
const features = SummaryTileSource.downloadTile(
|
||||
tileIndex,
|
||||
cacheserver,
|
||||
layersSummed
|
||||
)
|
||||
const [z] = Tiles.tile_from_index(tileIndex)
|
||||
return new StaticFeatureSource(
|
||||
features.map(
|
||||
|
@ -103,7 +107,11 @@ export class SummaryTileSource extends DynamicTileSource {
|
|||
)
|
||||
}
|
||||
|
||||
public static downloadTile(tileIndex: number, cacheserver: string, layersSummed: string): Store<Feature<Point>[]>{
|
||||
public static downloadTile(
|
||||
tileIndex: number,
|
||||
cacheserver: string,
|
||||
layersSummed: string
|
||||
): Store<Feature<Point>[]> {
|
||||
const [z, x, y] = Tiles.tile_from_index(tileIndex)
|
||||
let coordinates = Tiles.centerPointOf(z, x, y)
|
||||
const url = `${cacheserver}/${layersSummed}/${z}/${x}/${y}.json`
|
||||
|
|
|
@ -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"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -99,14 +99,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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -114,64 +114,66 @@ 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.featureSwitchLayerDefault = QueryParameters.GetBooleanQueryParameter("fs-layers-enabled", true,
|
||||
"If set to false, all layers will be disabled - except the explicitly enabled layers",
|
||||
this.featureSwitchLayerDefault = QueryParameters.GetBooleanQueryParameter(
|
||||
"fs-layers-enabled",
|
||||
true,
|
||||
"If set to false, all layers will be disabled - except the explicitly enabled layers"
|
||||
)
|
||||
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
|
||||
|
@ -185,60 +187,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"
|
||||
)
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,13 +35,23 @@ export default class LayerState {
|
|||
* @param context
|
||||
* @param layersEnabledByDefault
|
||||
*/
|
||||
constructor(osmConnection: OsmConnection, layers: LayerConfig[], context: string, layersEnabledByDefault: Store<boolean>) {
|
||||
constructor(
|
||||
osmConnection: OsmConnection,
|
||||
layers: LayerConfig[],
|
||||
context: string,
|
||||
layersEnabledByDefault: Store<boolean>
|
||||
) {
|
||||
this.osmConnection = osmConnection
|
||||
const filteredLayers = new Map()
|
||||
for (const layer of layers) {
|
||||
filteredLayers.set(
|
||||
layer.id,
|
||||
FilteredLayer.initLinkedState(layer, context, this.osmConnection, layersEnabledByDefault)
|
||||
FilteredLayer.initLinkedState(
|
||||
layer,
|
||||
context,
|
||||
this.osmConnection,
|
||||
layersEnabledByDefault
|
||||
)
|
||||
)
|
||||
}
|
||||
this.filteredLayers = filteredLayers
|
||||
|
|
|
@ -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(/</g,'<')?.replace(/>/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(/</g, "<")?.replace(/>/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"
|
||||
}
|
||||
}
|
|
@ -169,7 +169,17 @@ export default class Constants {
|
|||
public static readonly maptilerApiKey = "GvoVAJgu46I5rZapJuAy"
|
||||
public static readonly SummaryServer: string = Constants.config.summary_server
|
||||
|
||||
public static allServers: string[] = [Constants.SummaryServer, Constants.VectorTileServer, Constants.GeoIpServer, Constants.ErrorReportServer, Constants.countryCoderEndpoint, Constants.osmAuthConfig.url, Constants.nominatimEndpoint, Constants.linkedDataProxy, ...Constants.defaultOverpassUrls]
|
||||
public static allServers: string[] = [
|
||||
Constants.SummaryServer,
|
||||
Constants.VectorTileServer,
|
||||
Constants.GeoIpServer,
|
||||
Constants.ErrorReportServer,
|
||||
Constants.countryCoderEndpoint,
|
||||
Constants.osmAuthConfig.url,
|
||||
Constants.nominatimEndpoint,
|
||||
Constants.linkedDataProxy,
|
||||
...Constants.defaultOverpassUrls,
|
||||
]
|
||||
|
||||
private static isRetina(): boolean {
|
||||
if (Utils.runningFromConsole) {
|
||||
|
|
|
@ -104,12 +104,12 @@ export default class FilteredLayer {
|
|||
)
|
||||
} else {
|
||||
let isShown = layer.shownByDefault
|
||||
if(enabledByDefault !== undefined && enabledByDefault.data === false){
|
||||
if (enabledByDefault !== undefined && enabledByDefault.data === false) {
|
||||
isShown = false
|
||||
}
|
||||
isDisplayed = QueryParameters.GetBooleanQueryParameter(
|
||||
FilteredLayer.queryParameterKey(layer),
|
||||
isShown ,
|
||||
isShown,
|
||||
"Whether or not layer " + layer.id + " is shown"
|
||||
)
|
||||
}
|
||||
|
|
|
@ -39,7 +39,9 @@ export class MenuState {
|
|||
/**
|
||||
* Standalone copyright panel
|
||||
*/
|
||||
public readonly copyrightPanelIsOpened: UIEventSource<boolean> = new UIEventSource<boolean>(false)
|
||||
public readonly copyrightPanelIsOpened: UIEventSource<boolean> = new UIEventSource<boolean>(
|
||||
false
|
||||
)
|
||||
|
||||
public readonly communityIndexPanelIsOpened: UIEventSource<boolean> = new UIEventSource(false)
|
||||
public readonly allToggles: {
|
||||
|
@ -140,7 +142,6 @@ export class MenuState {
|
|||
name: "background",
|
||||
showOverOthers: true,
|
||||
},
|
||||
|
||||
]
|
||||
for (const toggle of this.allToggles) {
|
||||
toggle.toggle.addCallback((isOpen) => {
|
||||
|
|
|
@ -336,13 +336,12 @@ export default class LayoutConfig implements LayoutInformation {
|
|||
...json,
|
||||
layers: json.layers.filter((l) => l["id"] !== "favourite"),
|
||||
}
|
||||
const usedImages =
|
||||
new ExtractImages(this.official, undefined)
|
||||
.convertStrict(
|
||||
jsonNoFavourites,
|
||||
ConversionContext.construct([json.id], ["ExtractImages"])
|
||||
)
|
||||
.flatMap((i) => i.path)
|
||||
const usedImages = new ExtractImages(this.official, undefined)
|
||||
.convertStrict(
|
||||
jsonNoFavourites,
|
||||
ConversionContext.construct([json.id], ["ExtractImages"])
|
||||
)
|
||||
.flatMap((i) => i.path)
|
||||
usedImages.sort()
|
||||
|
||||
this.usedImages = Utils.Dedup(usedImages)
|
||||
|
|
|
@ -158,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()
|
||||
|
@ -174,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")
|
||||
|
@ -192,17 +192,22 @@ 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
|
||||
this.layerState = new LayerState(this.osmConnection, layout.layers, layout.id, this.featureSwitches.featureSwitchLayerDefault)
|
||||
this.layerState = new LayerState(
|
||||
this.osmConnection,
|
||||
layout.layers,
|
||||
layout.id,
|
||||
this.featureSwitches.featureSwitchLayerDefault
|
||||
)
|
||||
|
||||
{
|
||||
const overlayLayerStates = new Map<string, { isDisplayed: UIEventSource<boolean> }>()
|
||||
|
@ -210,7 +215,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
const isDisplayed = QueryParameters.GetBooleanQueryParameter(
|
||||
"overlay-" + rasterInfo.id,
|
||||
rasterInfo.defaultState ?? true,
|
||||
"Whether or not overlay layer " + rasterInfo.id + " is shown",
|
||||
"Whether or not overlay layer " + rasterInfo.id + " is shown"
|
||||
)
|
||||
const state = { isDisplayed }
|
||||
overlayLayerStates.set(rasterInfo.id, state)
|
||||
|
@ -235,7 +240,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
|
||||
|
@ -253,7 +258,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
id: "current_view_" + currentViewIndex,
|
||||
}),
|
||||
]
|
||||
}),
|
||||
})
|
||||
)
|
||||
this.featuresInView = new BBoxFeatureSource(layoutSource, this.mapProperties.bounds)
|
||||
|
||||
|
@ -271,19 +276,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),
|
||||
{
|
||||
|
@ -294,10 +299,10 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
"Got ",
|
||||
features.length,
|
||||
"leftover features, such as",
|
||||
features[0].properties,
|
||||
features[0].properties
|
||||
)
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
this.perLayer = perLayer.perLayer
|
||||
}
|
||||
|
@ -337,12 +342,12 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
this.lastClickObject = new LastClickFeatureSource(
|
||||
this.layout,
|
||||
this.mapProperties.lastClickLocation,
|
||||
this.userRelatedState.addNewFeatureMode,
|
||||
this.userRelatedState.addNewFeatureMode
|
||||
)
|
||||
|
||||
this.osmObjectDownloader = new OsmObjectDownloader(
|
||||
this.osmConnection.Backend(),
|
||||
this.changes,
|
||||
this.changes
|
||||
)
|
||||
|
||||
this.perLayerFiltered = this.showNormalDataOn(this.map)
|
||||
|
@ -353,7 +358,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(
|
||||
|
@ -361,11 +366,13 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
Imgur.singleton,
|
||||
this.featureProperties,
|
||||
this.osmConnection,
|
||||
this.changes,
|
||||
this.changes
|
||||
)
|
||||
this.favourites = new FavouritesFeatureSource(this)
|
||||
|
||||
this.featureSummary = this.setupSummaryLayer(new LayerConfig(<LayerConfigJson>summaryLayer, "summaryLayer", true))
|
||||
this.featureSummary = this.setupSummaryLayer(
|
||||
new LayerConfig(<LayerConfigJson>summaryLayer, "summaryLayer", true)
|
||||
)
|
||||
this.toCacheSavers = this.initSaveToLocalStorage()
|
||||
this.initActors()
|
||||
this.drawSpecialLayers()
|
||||
|
@ -404,7 +411,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
LayoutSource.fromCacheZoomLevel,
|
||||
fs,
|
||||
this.featureProperties,
|
||||
fs.layer.layerDef.maxAgeOfCache,
|
||||
fs.layer.layerDef.maxAgeOfCache
|
||||
)
|
||||
toLocalStorage.set(layerId, storage)
|
||||
})
|
||||
|
@ -417,7 +424,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) {
|
||||
|
@ -434,7 +441,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)
|
||||
|
||||
|
@ -575,7 +582,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
return
|
||||
}
|
||||
this.selectClosestAtCenter(0)
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
for (let i = 1; i < 9; i++) {
|
||||
|
@ -593,7 +600,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
onUp: true,
|
||||
},
|
||||
doc,
|
||||
() => this.selectClosestAtCenter(i - 1),
|
||||
() => this.selectClosestAtCenter(i - 1)
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -610,7 +617,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
if (this.featureSwitches.featureSwitchBackgroundSelection.data) {
|
||||
this.guistate.backgroundLayerSelectionIsOpened.setData(true)
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
Hotkeys.RegisterHotkey(
|
||||
{
|
||||
|
@ -622,14 +629,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
|
||||
|
@ -637,7 +644,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)
|
||||
|
@ -646,26 +653,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
|
||||
})
|
||||
|
@ -677,7 +684,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
Translations.t.hotkeyDocumentation.translationMode,
|
||||
() => {
|
||||
Locale.showLinkToWeblate.setData(!Locale.showLinkToWeblate.data)
|
||||
},
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -688,7 +695,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))
|
||||
|
||||
|
@ -696,7 +703,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,
|
||||
|
@ -705,7 +712,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
this.mapProperties,
|
||||
{
|
||||
isActive: this.mapProperties.zoom.map((z) => z < maxzoom),
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
const src = new SummaryTileSourceRewriter(summaryTileSource, this.layerState.filteredLayers)
|
||||
|
@ -727,12 +734,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,
|
||||
|
@ -747,7 +754,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")
|
||||
|
@ -761,7 +768,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
currentViewLayer,
|
||||
this.layout,
|
||||
this.osmObjectDownloader,
|
||||
this.featureProperties,
|
||||
this.featureProperties
|
||||
)
|
||||
})
|
||||
}
|
||||
|
@ -805,20 +812,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.debug("LastClick ", f, "matches", matches)
|
||||
return matches
|
||||
}),
|
||||
)
|
||||
fs.filter((f) => {
|
||||
const matches = lastClickLayerConfig.isShown.matchesProperties(
|
||||
f.properties
|
||||
)
|
||||
console.debug("LastClick ", f, "matches", matches)
|
||||
return matches
|
||||
})
|
||||
)
|
||||
new ShowDataLayer(this.map, {
|
||||
features: new StaticFeatureSource(lastClickFiltered),
|
||||
layer: lastClickLayerConfig,
|
||||
|
@ -863,7 +870,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
this.mapProperties.rasterLayer,
|
||||
this.availableLayers,
|
||||
this.featureSwitches.backgroundLayerId,
|
||||
this.userRelatedState.preferredBackgroundLayer,
|
||||
this.userRelatedState.preferredBackgroundLayer
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
<script lang="ts">
|
||||
|
||||
import { Utils } from "../../Utils"
|
||||
import Share from "@babeard/svelte-heroicons/solid/Share"
|
||||
import { DocumentDuplicateIcon } from "@rgossiaux/svelte-heroicons/outline"
|
||||
|
@ -30,8 +29,7 @@
|
|||
}
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col w-full">
|
||||
|
||||
<div class="flex w-full flex-col">
|
||||
<div class="flex w-full">
|
||||
<div class="literal-code w-full" on:click={(e) => Utils.selectTextIn(e.target)}>
|
||||
{text}
|
||||
|
@ -48,11 +46,8 @@
|
|||
</button>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex justify-center">
|
||||
{#if isCopied}
|
||||
<Tr t={tr.copiedToClipboard} cls="thanks m-2" />
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
<script lang="ts">
|
||||
|
||||
import Translations from "../i18n/Translations"
|
||||
import { Utils } from "../../Utils"
|
||||
import Hotkeys from "../Base/Hotkeys"
|
||||
|
@ -24,7 +23,6 @@
|
|||
|
||||
let layout = state.layout
|
||||
let featureSwitches = state.featureSwitches
|
||||
|
||||
</script>
|
||||
|
||||
<div class="link-underline links-w-full m-2 flex flex-col gap-y-1">
|
||||
|
@ -51,16 +49,14 @@
|
|||
|
||||
<a
|
||||
class="flex"
|
||||
href={"https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Themes/" +
|
||||
layout.id +
|
||||
".md"}
|
||||
href={"https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Themes/" + layout.id + ".md"}
|
||||
target="_blank"
|
||||
>
|
||||
<DocumentChartBar class="h-6 w-6" />
|
||||
<Tr
|
||||
t={Translations.t.general.attribution.openThemeDocumentation.Subs({
|
||||
name: layout.title,
|
||||
})}
|
||||
name: layout.title,
|
||||
})}
|
||||
/>
|
||||
</a>
|
||||
|
||||
|
@ -74,10 +70,7 @@
|
|||
<Tr t={Translations.t.general.attribution.donate} />
|
||||
</a>
|
||||
|
||||
<button
|
||||
class="as-link"
|
||||
on:click={() => state.guistate.communityIndexPanelIsOpened.setData(true)}
|
||||
>
|
||||
<button class="as-link" on:click={() => state.guistate.communityIndexPanelIsOpened.setData(true)}>
|
||||
<Community class="h-6 w-6" />
|
||||
<Tr t={Translations.t.communityIndex.title} />
|
||||
</button>
|
||||
|
@ -88,10 +81,7 @@
|
|||
<MapillaryLink large={false} mapProperties={state.mapProperties} />
|
||||
</If>
|
||||
|
||||
<button
|
||||
class="as-link"
|
||||
on:click={() => state.guistate.privacyPanelIsOpened.setData(true)}
|
||||
>
|
||||
<button class="as-link" on:click={() => state.guistate.privacyPanelIsOpened.setData(true)}>
|
||||
<EyeIcon class="h-6 w-6 pr-1" />
|
||||
<Tr t={Translations.t.privacy.title} />
|
||||
</button>
|
||||
|
|
|
@ -40,9 +40,9 @@ export default class CopyrightPanel extends Combine {
|
|||
const t = Translations.t.general.attribution
|
||||
const layoutToUse = state.layout
|
||||
|
||||
const iconAttributions: BaseUIElement[] =layoutToUse.getUsedImages().map(
|
||||
CopyrightPanel.IconAttribution
|
||||
)
|
||||
const iconAttributions: BaseUIElement[] = layoutToUse
|
||||
.getUsedImages()
|
||||
.map(CopyrightPanel.IconAttribution)
|
||||
|
||||
let maintainer: BaseUIElement = undefined
|
||||
if (layoutToUse.credits !== undefined && layoutToUse.credits !== "") {
|
||||
|
|
|
@ -31,8 +31,7 @@
|
|||
*/
|
||||
let needsThemeRedirect = url.port !== "" || url.hostname.match(/^[0-9]/) || !state.layout.official
|
||||
let layoutId = state.layout.id
|
||||
let baseLink =
|
||||
`${url.protocol}//${url.host}/${needsThemeRedirect ? "theme.html" : layoutId}?`
|
||||
let baseLink = `${url.protocol}//${url.host}/${needsThemeRedirect ? "theme.html" : layoutId}?`
|
||||
|
||||
let showWelcomeMessage = true
|
||||
let enableLogin = true
|
||||
|
@ -45,7 +44,8 @@
|
|||
enableLogin: boolean,
|
||||
enableFilters: boolean,
|
||||
enableBackground: boolean,
|
||||
enableGeolocation: boolean) {
|
||||
enableGeolocation: boolean
|
||||
) {
|
||||
const layout = state.layout
|
||||
let excluded = Utils.NoNull([
|
||||
showWelcomeMessage ? undefined : "fs-welcome-message",
|
||||
|
@ -53,7 +53,6 @@
|
|||
enableFilters ? undefined : "fs-filter",
|
||||
enableBackground ? undefined : "fs-background",
|
||||
enableGeolocation ? undefined : "fs-geolocation",
|
||||
|
||||
])
|
||||
const layerParamsWhitelist: string[] = ["fs-layers-enabled=false"]
|
||||
const layerParamsBlacklist: string[] = []
|
||||
|
@ -79,9 +78,10 @@
|
|||
|
||||
const layersBlack = layerParamsBlacklist.join("&")
|
||||
const layersWhite = layerParamsWhitelist.join("&")
|
||||
const layers = layersBlack.length < layersWhite.length ? layerParamsBlacklist : layerParamsWhitelist
|
||||
const layers =
|
||||
layersBlack.length < layersWhite.length ? layerParamsBlacklist : layerParamsWhitelist
|
||||
const params = QueryParameters.GetParts(new Set(excluded))
|
||||
.filter(part => !part.startsWith("layer-"))
|
||||
.filter((part) => !part.startsWith("layer-"))
|
||||
.concat(...layers)
|
||||
.concat(excluded.map((k) => k + "=" + false))
|
||||
linkToShare = baseLink + Utils.Dedup(params).join("&")
|
||||
|
@ -91,30 +91,42 @@
|
|||
}
|
||||
}
|
||||
|
||||
$: calculateLinkToShare(showWelcomeMessage, enableLogin, enableFilters, enableBackground, enableGeolocation)
|
||||
$: calculateLinkToShare(
|
||||
showWelcomeMessage,
|
||||
enableLogin,
|
||||
enableFilters,
|
||||
enableBackground,
|
||||
enableGeolocation
|
||||
)
|
||||
|
||||
let iframeCode: string
|
||||
$: iframeCode = `<iframe src="${linkToShare}"
|
||||
${enableGeolocation ? 'allow="geolocation"' : ""} width="100%" height="100%" style="min-width: 250px; min-height: 250px"
|
||||
${
|
||||
enableGeolocation ? 'allow="geolocation"' : ""
|
||||
} width="100%" height="100%" style="min-width: 250px; min-height: 250px"
|
||||
title="${state.layout.title?.txt ?? "MapComplete"} with MapComplete">
|
||||
</iframe>`
|
||||
|
||||
Array.from(state.layerState.filteredLayers.values()).forEach(flayer => flayer.isDisplayed.addCallbackAndRunD(_ => {
|
||||
calculateLinkToShare(showWelcomeMessage, enableLogin, enableFilters, enableBackground, enableGeolocation)
|
||||
}))
|
||||
|
||||
Array.from(state.layerState.filteredLayers.values()).forEach((flayer) =>
|
||||
flayer.isDisplayed.addCallbackAndRunD((_) => {
|
||||
calculateLinkToShare(
|
||||
showWelcomeMessage,
|
||||
enableLogin,
|
||||
enableFilters,
|
||||
enableBackground,
|
||||
enableGeolocation
|
||||
)
|
||||
})
|
||||
)
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col">
|
||||
<div class="flex flex-col">
|
||||
<Tr t={tr.intro} />
|
||||
|
||||
<Copyable {state} text={linkToShare}/>
|
||||
|
||||
|
||||
<Copyable {state} text={linkToShare} />
|
||||
</div>
|
||||
<div class="flex justify-center">
|
||||
|
||||
<ToSvelte
|
||||
construct={() => new Img(new Qr(linkToShare).toImageElement(125)).SetStyle("width: 125px")}
|
||||
/>
|
||||
|
@ -122,11 +134,11 @@
|
|||
|
||||
<Tr t={tr.embedIntro} />
|
||||
|
||||
<Copyable text={iframeCode}/>
|
||||
<Copyable text={iframeCode} />
|
||||
|
||||
<AccordionSingle>
|
||||
<div slot="header">
|
||||
<Tr t={tr.options}/>
|
||||
<Tr t={tr.options} />
|
||||
</div>
|
||||
<div class="link-underline my-1 flex flex-col">
|
||||
<label>
|
||||
|
@ -139,13 +151,11 @@
|
|||
<Tr t={tr.fsUserbadge} />
|
||||
</label>
|
||||
|
||||
|
||||
<label>
|
||||
<input bind:checked={enableFilters} type="checkbox" id="share_enable_filter" />
|
||||
<Tr t={tr.fsFilter} />
|
||||
</label>
|
||||
|
||||
|
||||
<label>
|
||||
<input bind:checked={enableBackground} type="checkbox" id="share_enable_background" />
|
||||
<Tr t={tr.fsBackground} />
|
||||
|
@ -157,15 +167,16 @@
|
|||
</label>
|
||||
|
||||
<span>
|
||||
|
||||
<Tr t={tr.stateIsIncluded}/>
|
||||
<a class="inline-block w-fit cursor-pointer" on:click={() => state.guistate.filtersPanelIsOpened.set(true)}>
|
||||
<Tr t={tr.openLayers}/>
|
||||
</a>
|
||||
<Tr t={tr.stateIsIncluded} />
|
||||
<a
|
||||
class="inline-block w-fit cursor-pointer"
|
||||
on:click={() => state.guistate.filtersPanelIsOpened.set(true)}
|
||||
>
|
||||
<Tr t={tr.openLayers} />
|
||||
</a>
|
||||
</span>
|
||||
|
||||
<Tr cls="link-underline" t={tr.documentation} />
|
||||
|
||||
</div>
|
||||
</AccordionSingle>
|
||||
</div>
|
||||
|
|
|
@ -86,7 +86,7 @@
|
|||
</script>
|
||||
|
||||
{#if theme.id !== personal.id || $unlockedPersonal}
|
||||
<a class="my-1 flex w-full items-center text-ellipsis rounded low-interaction p-1" href={$href}>
|
||||
<a class="low-interaction my-1 flex w-full items-center text-ellipsis rounded p-1" href={$href}>
|
||||
<Marker icons={theme.icon} size="block h-8 w-8 sm:h-11 sm:w-11 m-1 sm:mx-2 md:mx-4 shrink-0" />
|
||||
|
||||
<span class="flex flex-col overflow-hidden text-ellipsis text-xl font-bold">
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
|
||||
<!-- Buttons: open map, go to location, search -->
|
||||
<NextButton clss="primary w-full" on:click={() => state.guistate.themeIsOpened.setData(false)}>
|
||||
<div class="flex flex-col w-full items-center">
|
||||
<div class="flex w-full flex-col items-center">
|
||||
<div class="flex w-full justify-center text-2xl">
|
||||
<Tr t={Translations.t.general.openTheMap} />
|
||||
</div>
|
||||
|
|
|
@ -57,7 +57,6 @@
|
|||
tags.data["closed_at"] = new Date().toISOString()
|
||||
NoteCommentElement.addCommentTo(txt.data, tags, state)
|
||||
tags.ping()
|
||||
|
||||
}
|
||||
|
||||
async function reopenNote() {
|
||||
|
@ -67,7 +66,6 @@
|
|||
NoteCommentElement.addCommentTo(txt.data, tags, state)
|
||||
tags.ping()
|
||||
isProcessing.set(false)
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
|
@ -89,43 +87,43 @@
|
|||
</label>
|
||||
|
||||
{#if $isProcessing}
|
||||
<Loading/>
|
||||
{:else}
|
||||
<div class="flex flex-col">
|
||||
{#if $txt?.length > 0}
|
||||
<button class="primary flex" on:click|preventDefault={() => addComment()}>
|
||||
<!-- Add a comment -->
|
||||
<Speech_bubble class="h-7 w-7 pr-2" />
|
||||
<Tr t={t.addCommentPlaceholder} />
|
||||
</button>
|
||||
{:else}
|
||||
<div class="alert w-full">
|
||||
<Tr t={t.typeText} />
|
||||
</div>
|
||||
{/if}
|
||||
<Loading />
|
||||
{:else}
|
||||
<div class="flex flex-col">
|
||||
{#if $txt?.length > 0}
|
||||
<button class="primary flex" on:click|preventDefault={() => addComment()}>
|
||||
<!-- Add a comment -->
|
||||
<Speech_bubble class="h-7 w-7 pr-2" />
|
||||
<Tr t={t.addCommentPlaceholder} />
|
||||
</button>
|
||||
{:else}
|
||||
<div class="alert w-full">
|
||||
<Tr t={t.typeText} />
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if !$isClosed}
|
||||
<button class="flex items-center" on:click|preventDefault={() => closeNote()}>
|
||||
<Resolved class="h-8 w-8 pr-2" />
|
||||
<!-- Close note -->
|
||||
{#if $txt === undefined || $txt === ""}
|
||||
<Tr t={t.closeNote} />
|
||||
{:else}
|
||||
<Tr t={t.addCommentAndClose} />
|
||||
{/if}
|
||||
</button>
|
||||
{:else}
|
||||
<button class="flex items-center" on:click|preventDefault={() => reopenNote()}>
|
||||
<!-- Reopen -->
|
||||
<Note class="h-7 w-7 pr-2" />
|
||||
{#if $txt === undefined || $txt === ""}
|
||||
<Tr t={t.reopenNote} />
|
||||
{:else}
|
||||
<Tr t={t.reopenNoteAndComment} />
|
||||
{/if}
|
||||
</button>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
{#if !$isClosed}
|
||||
<button class="flex items-center" on:click|preventDefault={() => closeNote()}>
|
||||
<Resolved class="h-8 w-8 pr-2" />
|
||||
<!-- Close note -->
|
||||
{#if $txt === undefined || $txt === ""}
|
||||
<Tr t={t.closeNote} />
|
||||
{:else}
|
||||
<Tr t={t.addCommentAndClose} />
|
||||
{/if}
|
||||
</button>
|
||||
{:else}
|
||||
<button class="flex items-center" on:click|preventDefault={() => reopenNote()}>
|
||||
<!-- Reopen -->
|
||||
<Note class="h-7 w-7 pr-2" />
|
||||
{#if $txt === undefined || $txt === ""}
|
||||
<Tr t={t.reopenNote} />
|
||||
{:else}
|
||||
<Tr t={t.reopenNoteAndComment} />
|
||||
{/if}
|
||||
</button>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</form>
|
||||
</LoginToggle>
|
||||
|
|
|
@ -66,7 +66,6 @@
|
|||
|
||||
<div class="flex">
|
||||
<div class="m-4 flex w-full flex-col">
|
||||
|
||||
<NextButton clss="primary" on:click={() => state.highlightedItem.setData({ path, schema })}>
|
||||
{#if schema.hints.question}
|
||||
{schema.hints.question}
|
||||
|
|
|
@ -104,7 +104,9 @@
|
|||
return `${singular} ${i}`
|
||||
}
|
||||
|
||||
let genIconF: (x: any) => ({ icon: string, color: string }) = <any>Function("value", "return " + schema.hints.icon)
|
||||
let genIconF: (x: any) => { icon: string; color: string } = <any>(
|
||||
Function("value", "return " + schema.hints.icon)
|
||||
)
|
||||
console.log("Icon lambda is", schema.hints.icon, path, genIconF("test"))
|
||||
|
||||
function genIcon(value: any): string {
|
||||
|
@ -117,7 +119,6 @@
|
|||
}
|
||||
return genIconF(value)?.color
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<div class="pl-2">
|
||||
|
@ -160,13 +161,14 @@
|
|||
{#if schema.hints.icon}
|
||||
<Icon clss="w-6 h-6" icon={genIcon(value)} color={genColor(value)} />
|
||||
{/if}
|
||||
{singular} {i}
|
||||
{singular}
|
||||
{i}
|
||||
|
||||
{#if schema.hints.title}
|
||||
<div class="subtle ml-2">
|
||||
<Tr t={Translations.T(genTitle(value, singular, i))}/>
|
||||
<Tr t={Translations.T(genTitle(value, singular, i))} />
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
</h3>
|
||||
<button
|
||||
class="h-fit w-fit rounded-full border border-black p-1"
|
||||
|
@ -177,10 +179,10 @@
|
|||
<TrashIcon class="h-4 w-4" />
|
||||
</button>
|
||||
</div>
|
||||
{:else if typeof value === "string"}
|
||||
{:else if typeof value === "string"}
|
||||
Builtin: <b>{value}</b>
|
||||
{:else}
|
||||
<Tr cls="font-bold" t={Translations.T(value.question ?? value.render)}/>
|
||||
{:else}
|
||||
<Tr cls="font-bold" t={Translations.T(value.question ?? value.render)} />
|
||||
{/if}
|
||||
</span>
|
||||
<div class="normal-background p-2">
|
||||
|
|
|
@ -128,8 +128,11 @@
|
|||
on:submit
|
||||
/>
|
||||
</div>
|
||||
<a target="_blank" href="https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md">
|
||||
<QuestionMarkCircle class="w-6 h-6"/>
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md"
|
||||
>
|
||||
<QuestionMarkCircle class="h-6 w-6" />
|
||||
</a>
|
||||
|
||||
{#if $feedbackKey}
|
||||
|
|
|
@ -23,7 +23,7 @@ export interface ConfigMeta {
|
|||
typesdefault?: string
|
||||
suggestions?: []
|
||||
title?: string
|
||||
multianswer?: "true" | string,
|
||||
multianswer?: "true" | string
|
||||
icon?: string
|
||||
}
|
||||
required: boolean
|
||||
|
|
|
@ -203,9 +203,7 @@
|
|||
state.selectedTab.setData(Number(tab))
|
||||
}
|
||||
|
||||
uid.AsPromise().then(
|
||||
uid => selectStateBasedOnHash(uid)
|
||||
)
|
||||
uid.AsPromise().then((uid) => selectStateBasedOnHash(uid))
|
||||
|
||||
function backToStudio() {
|
||||
console.log("Back to studio")
|
||||
|
|
|
@ -104,7 +104,7 @@
|
|||
if (id.startsWith("current_view")) {
|
||||
return currentViewLayer
|
||||
}
|
||||
if(id.startsWith("summary_")){
|
||||
if (id.startsWith("summary_")) {
|
||||
console.log("Not selecting a summary object. The summary object is", element)
|
||||
return undefined
|
||||
}
|
||||
|
@ -125,11 +125,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() {
|
||||
|
@ -166,7 +166,7 @@
|
|||
onDestroy(
|
||||
rasterLayer.addCallbackAndRunD((l) => {
|
||||
rasterLayerName = l.properties.name
|
||||
}),
|
||||
})
|
||||
)
|
||||
let previewedImage = state.previewedImage
|
||||
|
||||
|
@ -197,7 +197,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)
|
||||
|
@ -257,7 +257,9 @@
|
|||
on:keydown={forwardEventToMap}
|
||||
htmlElem={openMapButton}
|
||||
>
|
||||
<div class="m-0.5 mx-1 flex cursor-pointer items-center max-[480px]:w-full sm:mx-1 md:mx-2">
|
||||
<div
|
||||
class="m-0.5 mx-1 flex cursor-pointer items-center max-[480px]:w-full sm:mx-1 md:mx-2"
|
||||
>
|
||||
<Marker icons={layout.icon} size="h-4 w-4 md:h-8 md:w-8 mr-0.5 sm:mr-1 md:mr-2" />
|
||||
<b class="mr-1">
|
||||
<Tr t={layout.title} />
|
||||
|
@ -354,10 +356,10 @@
|
|||
<a
|
||||
class="bg-black-transparent pointer-events-auto ml-1 h-fit max-h-12 cursor-pointer self-end self-center overflow-hidden rounded-2xl px-1 text-white opacity-50 hover:opacity-100"
|
||||
on:click={() => {
|
||||
if(featureSwitches.featureSwitchWelcomeMessage.data){
|
||||
state.guistate.themeViewTab.setData("copyright")
|
||||
state.guistate.themeIsOpened.setData(true)
|
||||
}else{
|
||||
if (featureSwitches.featureSwitchWelcomeMessage.data) {
|
||||
state.guistate.themeViewTab.setData("copyright")
|
||||
state.guistate.themeIsOpened.setData(true)
|
||||
} else {
|
||||
state.guistate.copyrightPanelIsOpened.setData(true)
|
||||
}
|
||||
}}
|
||||
|
@ -520,11 +522,10 @@
|
|||
<Tr t={Translations.t.general.attribution.title} />
|
||||
</div>
|
||||
|
||||
<div slot="content2" class="flex flex-col m-2">
|
||||
<div slot="content2" class="m-2 flex flex-col">
|
||||
<ToSvelte construct={() => new CopyrightPanel(state)} />
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex" slot="title3">
|
||||
<Share class="h-4 w-4" />
|
||||
<Tr t={Translations.t.general.sharescreen.title} />
|
||||
|
@ -650,15 +651,14 @@
|
|||
<FloatOver on:close={() => state.guistate.privacyPanelIsOpened.setData(false)}>
|
||||
<div class="flex h-full flex-col overflow-hidden">
|
||||
<h1 class="low-interaction m-0 flex items-center p-4 drop-shadow-md">
|
||||
<Tr t= {Translations.t.general.attribution.title}/>
|
||||
<Tr t={Translations.t.general.attribution.title} />
|
||||
</h1>
|
||||
<div class="overflow-auto p-4">
|
||||
<h2>
|
||||
|
||||
<Tr t={Translations.t.general.menu.aboutMapComplete} />
|
||||
<Tr t={Translations.t.general.menu.aboutMapComplete} />
|
||||
</h2>
|
||||
<AboutMapComplete {state} />
|
||||
<ToSvelte construct={() => new CopyrightPanel(state)} />
|
||||
<AboutMapComplete {state} />
|
||||
<ToSvelte construct={() => new CopyrightPanel(state)} />
|
||||
</div>
|
||||
</div>
|
||||
</FloatOver>
|
||||
|
|
13
src/Utils.ts
13
src/Utils.ts
|
@ -976,7 +976,16 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
|
|||
}
|
||||
}
|
||||
xhr.send(content)
|
||||
xhr.onerror = (ev: ProgressEvent<EventTarget>) => reject("Could not get "+url+", xhr status code is "+xhr.status+" ("+xhr.statusText+")")
|
||||
xhr.onerror = (ev: ProgressEvent<EventTarget>) =>
|
||||
reject(
|
||||
"Could not get " +
|
||||
url +
|
||||
", xhr status code is " +
|
||||
xhr.status +
|
||||
" (" +
|
||||
xhr.statusText +
|
||||
")"
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -1070,7 +1079,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
|
|||
const injected = Utils.injectedDownloads[url]
|
||||
if (injected !== undefined) {
|
||||
console.debug("Using injected resource for test for URL", url)
|
||||
return {content: injected}
|
||||
return { content: injected }
|
||||
}
|
||||
const result = await Utils.downloadAdvanced(
|
||||
url,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"contributors": [
|
||||
{
|
||||
"commits": 7612,
|
||||
"commits": 7646,
|
||||
"contributor": "Pieter Vander Vennet"
|
||||
},
|
||||
{
|
||||
|
|
|
@ -469,9 +469,9 @@
|
|||
"na"
|
||||
],
|
||||
"NZ": [
|
||||
"en",
|
||||
"en",
|
||||
"mi",
|
||||
"en",
|
||||
"mi"
|
||||
],
|
||||
"OM": [
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
{
|
||||
"ca": "català",
|
||||
"cs": "čeština",
|
||||
"da": "dansk",
|
||||
"de": "Deutsch",
|
||||
"en": "English",
|
||||
|
@ -12,7 +11,7 @@
|
|||
"gl": "lingua galega",
|
||||
"he": "עברית",
|
||||
"hu": "magyar",
|
||||
"id": "bahasa Indonesia",
|
||||
"id": "Indonesia",
|
||||
"it": "italiano",
|
||||
"ja": "日本語",
|
||||
"nb_NO": "bokmål",
|
||||
|
@ -23,6 +22,7 @@
|
|||
"ru": "русский язык",
|
||||
"sl": "slovenščina",
|
||||
"sv": "svenska",
|
||||
"zgh": "ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ ⵜⴰⵎⵖⵔⵉⴱⵉⵜ",
|
||||
"zh_Hans": "简体中文",
|
||||
"zh_Hant": "繁體中文"
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"contributors": [
|
||||
{
|
||||
"commits": 378,
|
||||
"commits": 382,
|
||||
"contributor": "Pieter Vander Vennet"
|
||||
},
|
||||
{
|
||||
"commits": 351,
|
||||
"commits": 352,
|
||||
"contributor": "kjon"
|
||||
},
|
||||
{
|
||||
|
@ -21,7 +21,7 @@
|
|||
"contributor": "Robin van der Linde"
|
||||
},
|
||||
{
|
||||
"commits": 69,
|
||||
"commits": 70,
|
||||
"contributor": "mcliquid"
|
||||
},
|
||||
{
|
||||
|
@ -84,6 +84,10 @@
|
|||
"commits": 18,
|
||||
"contributor": "el_libre como el chaval"
|
||||
},
|
||||
{
|
||||
"commits": 15,
|
||||
"contributor": "Patchanka64"
|
||||
},
|
||||
{
|
||||
"commits": 15,
|
||||
"contributor": "macpac"
|
||||
|
@ -112,10 +116,6 @@
|
|||
"commits": 13,
|
||||
"contributor": "Joost"
|
||||
},
|
||||
{
|
||||
"commits": 12,
|
||||
"contributor": "Patchanka64"
|
||||
},
|
||||
{
|
||||
"commits": 12,
|
||||
"contributor": "Ettore Atalan"
|
||||
|
@ -132,6 +132,10 @@
|
|||
"commits": 11,
|
||||
"contributor": "Túllio Franca"
|
||||
},
|
||||
{
|
||||
"commits": 10,
|
||||
"contributor": "Manuel Tassi"
|
||||
},
|
||||
{
|
||||
"commits": 10,
|
||||
"contributor": "brunnerpaul"
|
||||
|
@ -158,7 +162,7 @@
|
|||
},
|
||||
{
|
||||
"commits": 9,
|
||||
"contributor": "Manuel Tassi"
|
||||
"contributor": "hugoalh"
|
||||
},
|
||||
{
|
||||
"commits": 9,
|
||||
|
@ -212,10 +216,6 @@
|
|||
"commits": 7,
|
||||
"contributor": "Niels Elgaard Larsen"
|
||||
},
|
||||
{
|
||||
"commits": 6,
|
||||
"contributor": "hugoalh"
|
||||
},
|
||||
{
|
||||
"commits": 6,
|
||||
"contributor": "Juele juele"
|
||||
|
@ -256,6 +256,10 @@
|
|||
"commits": 6,
|
||||
"contributor": "lvgx"
|
||||
},
|
||||
{
|
||||
"commits": 5,
|
||||
"contributor": "Franco"
|
||||
},
|
||||
{
|
||||
"commits": 5,
|
||||
"contributor": "Christian Schmidt"
|
||||
|
@ -328,10 +332,6 @@
|
|||
"commits": 3,
|
||||
"contributor": "Paolo Mauri"
|
||||
},
|
||||
{
|
||||
"commits": 3,
|
||||
"contributor": "Franco"
|
||||
},
|
||||
{
|
||||
"commits": 3,
|
||||
"contributor": "Peter Brodersen"
|
||||
|
|
Loading…
Reference in a new issue