Merge branch 'develop'

This commit is contained in:
Pieter Vander Vennet 2024-12-17 04:13:28 +01:00
commit 56efd11429
77 changed files with 4455 additions and 4046 deletions

View file

@ -1,7 +1,9 @@
name: Deploy develop on dev.mapcomplete.org
on:
- push
- pull_request
push:
branches-ignore:
- build/*
pull_request:
jobs:
deploy_on_hosted:
@ -42,13 +44,7 @@ jobs:
export NODE_OPTIONS="--max-old-space-size=8192"
npm run clean:tests
npm run generate:doctests 2>&1 | grep -v "No doctests found in"
if which vitest
then
vitest --run test
else
npm run test
fi
npm run clean:tests
shell: bash

View file

@ -0,0 +1,57 @@
name: Deploy develop on theme.mapcomplete.org
on:
push:
branches:
- build/*
jobs:
deploy_on_hetzner_single:
runs-on: [ ubuntu-latest, hetzner-access ]
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: "20"
cache: "npm"
cache-dependency-path: package-lock.json
- name: install deps
run: npm ci
shell: bash
- name: create generated dir
run: mkdir ./assets/generated
shell: bash
- name: create dependencies
run: npm run generate:licenses; npm run generate:images; npm run generate:charging-stations; npm run generate:service-worker; npm run download:editor-layer-index
shell: bash
- name: sync translations
run: npm run generate:translations
shell: bash
- name: Prepare build
run: |
BRANCH=${{ github.ref_name }}
THEME=${BRANCH:6}
npm run generate:service-worker && ./scripts/single_build.sh $THEME
shell: bash
- name: Zipping dist file
run: |
BRANCH=${{ github.ref_name }}
THEME=${BRANCH:6}
mv "dist_$THEME" ${{ github.ref_name }}
zip ${{ github.ref_name }}.zip -r ${{ github.ref_name }}/*
- name: uploading file
run: scp ${{ github.ref_name }}.zip hetzner:/root/staging/
- name: unzipping remote file
run: ssh hetzner "cd /root/staging && unzip ${{ github.ref_name }}.zip && rm -rf /root/single_theme_builds/${{ github.ref_name }} && mv /root/staging/${{ github.ref_name }}/ /root/single_theme_builds/ && rm ${{ github.ref_name }}.zip"

View file

@ -1,4 +1,4 @@
hosted.mapcomplete.org {
builds.mapcomplete.org {
root * public/
file_server
header {
@ -14,12 +14,29 @@ dev.mapcomplete.org {
}
}
single.mapcomplete.org {
root * single_theme_builds/
file_server
header {
+Permissions-Policy "interest-cohort=()"
}
}
velopark.mapcomplete.org {
root * single_theme_builds/velopark/
file_server
header {
+Permissions-Policy "interest-cohort=()"
}
}
countrycoder.mapcomplete.org {
root * tiles/
file_server
header {
+Permissions-Policy "interest-cohort=()"
+Access-Control-Allow-Origin https://hosted.mapcomplete.org https://dev.mapcomplete.org https://mapcomplete.org
+Access-Control-Allow-Origin *
}
}

View file

@ -67,8 +67,10 @@ pg_tileserv can be downloaded here: https://github.com/CrunchyData/pg_tileserv
In the directory where it is downloaded (e.g. `~/data`), run
First, look up the latest suitable database on https://mapcomplete.org/status
````
export DATABASE_URL=postgresql://user:password@localhost:5444/osm-poi
export DATABASE_URL=postgresql://user:password@localhost:5444/osm-poi.{date-of-suitable-database}
nohup ./pg_tileserv >> pg_tileserv.log &
````
@ -84,7 +86,19 @@ map.addSource("drinking_water", {
`npm run summary-server` in the git repo
# Connecting to the database
Setup the SSH-tunnel:
`ssh folky.me
ssh -L 5444:127.0.0.1:5444 lain`
Open a second terminal:
`ssh -L 5444:127.0.0.1:5444 folky.me` `
Connect pgAdmin
# Rebooting:
-> Restart the docker container
->

View file

@ -394,9 +394,9 @@
"es": "¿Cuántos parabolts tienen como máximo las vías en {title()}?"
},
"render": {
"en": "The sport climbing routes here have at most {climbing:bolts:max} bolts.<div class='subtle'>This is without relays and indicates how much quickdraws a climber needs</div>",
"en": "The sport climbing routes here have at most {climbing:bolts:max} bolts. <div class='subtle'>This is without belay stations and indicates how much quickdraws a climber needs.</div>",
"de": "Die Sportkletterrouten hier haben maximal {climbing:bolts:max} Haken.<div class='subtle'>Dies ist ohne Relais und gibt an, wie viel Schnellspanner ein Kletterer braucht</div>",
"nl": "De sportklimroutes hebben maximaal {climbing:bolts:max} bouten. <div class='subtle'>Hierbij worden relays niet meegteld. Dit geeft aan hoeveel klimsetjes een klimmer nodig heeft</div>",
"nl": "De sportklimroutes hebben maximum {climbing:bolts:max} haken. <div class='subtle'>Hierbij worden standplaatsen niet meegeteld. Dit geeft aan hoeveel setjes een klimmer nodig heeft.</div>",
"es": "Las vías de escalada deportiva aquí tienen como máximo {climbing:bolts:max} parabolts.<div class='subtle'>Esto es sin reuniones e indica cuántos cintas exprés necesita un escalador</div>"
},
"freeform": {

View file

@ -249,11 +249,11 @@
"es": "¿Cuántos parabolts tiene esta vía antes de llegar al anclaje?"
},
"render": {
"en": "This route has {climbing:bolts} bolts <div class='subtle'>This is without relays and indicates how much quickdraws a climber needs</div>",
"en": "This route has {climbing:bolts} bolts. <div class='subtle'>This is without belay stations and indicates how much quickdraws a climber needs.</div>",
"fr": "Cette voie a {climbing:bolts} prises <div class='subtle'>C'est sans relai et indique de combien de dégaine un grimpeur a besoin</div>",
"de": "Diese Route hat {climbing:bolts} Haken <div class='subtle'>Dies ist ohne Relais und gibt an, wie viel Schnellspanner ein Kletterer braucht</div>",
"it": "Questo percorso ha {climbing:bolts} bulloni <div class='subtle'>Questa è senza collettori e indica di quanti bloccaggi rapidi ha bisogno un arrampicatore</div>",
"nl": "Deze route heeft {climbing:bolts} klimbouten. <div class='subtle'>Dit is zonder het relay mee te tellen. Een klimmer heeft dus minstens {climbing:bolts} klimsetjes nodig om boven te raken</div>",
"nl": "Deze route heeft {climbing:bolts} haken. <div class='subtle'>Hierbij wordt de standplaats niet meegeteld. Een klimmer heeft normaal gezien dus minstens {climbing:bolts} setjes nodig.</div>",
"es": "Esta vía tiene {climbing:bolts} parabolts <div class='subtle'>Esto es sin reuniones e indica cuántos cintas exprés necesita un escalador</div>"
},
"freeform": {

View file

@ -17,7 +17,7 @@
"nl": "Een hulpmiddel om data van velopark.be in OpenStreetMap in te laden"
},
"descriptionTail": {
"*": "<h3>Maintainer tools</h3><ul class='link-underline'><li><a target='_blank' href='https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Themes/velopark.md'>See documentation and links to Overpass</a></li><li><a href='https://maproulette.org/api/v2/challenge/view/43282' download='Velopark_sync_2024-01-15.geojson'>Download the first sync results</a></li><li><a href='http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22amenity%22%3D%22bicycle_parking%22%5D%5B%22ref%3Avelopark%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%29%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B' target='_blank'>See all bicycle parkings with a velopark ref</a>To export: visit this link, click 'run' and then 'export'; 'export as geojson'</ul>"
"*": "<h3>Maintainer tools</h3><ul class='link-underline'><li><a target='_blank' href='https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Themes/velopark.md'>See documentation and links to Overpass</a></li><li><a href='https://maproulette.org/api/v2/challenge/view/43282' download='Velopark_sync_2024-01-15.geojson'>Download the first batch results</a></li><li><a href='https://maproulette.org/api/v2/challenge/view/50552'>Download the second batch results</a></li><li><a href='http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22amenity%22%3D%22bicycle_parking%22%5D%5B%22ref%3Avelopark%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%29%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B' target='_blank'>See all bicycle parkings with a velopark ref</a>To export: visit this link, click 'run' and then 'export'; 'export as geojson'</ul>"
},
"icon": "./assets/themes/velopark/velopark.svg",
"startZoom": 18,
@ -31,7 +31,7 @@
"description": "Maproulette challenge containing velopark data",
"source": {
"osmTags": "mr_taskId~*",
"geoJson": "https://maproulette.org/api/v2/challenge/view/43282",
"geoJson": "https://maproulette.org/api/v2/challenge/view/50552",
"idKey": "mr_taskId"
},
"title": {
@ -161,6 +161,7 @@
"en": "Create a new bicycle parking in OSM. This parking will have the link, you'll be able to copy the attributes in the next step",
"nl": "Maak een nieuwe parking aan in OSM. Deze parking zal gelinkt zijn met Velopark en je kan in de volgende stap de attributen overzetten"
},
"to_point": "yes",
"maproulette_id": "mr_taskId"
}
}
@ -238,7 +239,12 @@
}
}
],
"lineRendering": [],
"lineRendering": [
{
"color": "#bb9922",
"lineWidth": 2
}
],
"filter": [
{
"id": "created-only",

View file

@ -460,7 +460,8 @@
"activateButton": "Hjælp med at oversætte MapComplete",
"missing": "{count} uoversatte strenge"
},
"userinfo": {},
"userinfo": {
},
"validation": {
"color": {
"description": "En farve eller hex-kode"

View file

@ -1 +1,2 @@
{}
{
}

View file

@ -94,7 +94,8 @@
"question_opinion": "Kamusta ang iyong karanasan?",
"reviewPlaceholder": "Ilarawan ang iyong karanasan…"
},
"translations": {},
"translations": {
},
"unknown": {
"clear": "Tanggalin ang sagot"
},

View file

@ -1 +1,2 @@
{}
{
}

View file

@ -615,6 +615,9 @@
"logIn": "A korábban megnézett tematikus térképek megtekintéséhez be kell jelentkezned",
"title": "MapComplete"
},
"inspector": {
"menu": "Közreműködő megvizsgálása"
},
"move": {
"cancel": "Válassz másik okot",
"cannotBeMoved": "Ez az objektum nem mozdítható el.",
@ -848,8 +851,5 @@
"empty": "Adj meg néhány Wikidata-bejegyzést",
"startsWithQ": "A Wikidata-azonosító Q-val kezdődik, amelyet egy szám követ"
}
},
"inspector": {
"menu": "Közreműködő megvizsgálása"
}
}

View file

@ -150,7 +150,8 @@
"split": {
"cancel": "Batal"
},
"translations": {},
"translations": {
},
"validation": {
"date": {
"description": "Tanggal, dimulai dari tahun"

View file

@ -36,6 +36,26 @@
"description": "Una gran estructura publicitària exterior, que normalment es troba en zones de gran trànsit, com ara al costat de carreteres transitades muntades a una paret",
"title": "un cartell muntat a una paret"
},
"10": {
"title": "una pantalla muntada en una marquesina"
},
"11": {
"description": "Una peça de tèxtil impermeable amb un missatge imprès, fixada permanentment a una paret",
"title": "una lona"
},
"12": {
"title": "un tòtem"
},
"13": {
"description": "S'utilitza per a cartells publicitaris, rètols de neó, logotips i cartells en entrades institucionals",
"title": "un lletrer"
},
"14": {
"title": "una escupltura"
},
"15": {
"title": "una paret pintada"
},
"2": {
"title": "un mupi"
},
@ -61,26 +81,6 @@
},
"9": {
"title": "una patalla sobre una paret"
},
"10": {
"title": "una pantalla muntada en una marquesina"
},
"11": {
"description": "Una peça de tèxtil impermeable amb un missatge imprès, fixada permanentment a una paret",
"title": "una lona"
},
"12": {
"title": "un tòtem"
},
"13": {
"description": "S'utilitza per a cartells publicitaris, rètols de neó, logotips i cartells en entrades institucionals",
"title": "un lletrer"
},
"14": {
"title": "una escupltura"
},
"15": {
"title": "una paret pintada"
}
},
"tagRenderings": {
@ -175,6 +175,9 @@
"1": {
"then": "Açò és un tauló d'anuncis"
},
"10": {
"then": "Açò és una paret pintada"
},
"2": {
"then": "Açò és una columna"
},
@ -198,9 +201,6 @@
},
"9": {
"then": "Açò és un tòtem"
},
"10": {
"then": "Açò és una paret pintada"
}
},
"question": "Quin tipus d'element publicitari és aquest?",
@ -215,6 +215,9 @@
"1": {
"then": "Tauló d'anuncis"
},
"10": {
"then": "Paret Pintada"
},
"2": {
"then": "Mupi"
},
@ -238,9 +241,6 @@
},
"9": {
"then": "Tòtem"
},
"10": {
"then": "Paret Pintada"
}
}
}
@ -381,6 +381,15 @@
"1": {
"then": "Mural"
},
"10": {
"then": "Azulejo (Rajoles decoratives espanyoles i portugueses)"
},
"11": {
"then": "Enrajolat"
},
"12": {
"then": "Tallat a la fusta"
},
"2": {
"then": "Pintura"
},
@ -404,15 +413,6 @@
},
"9": {
"then": "Relleu"
},
"10": {
"then": "Azulejo (Rajoles decoratives espanyoles i portugueses)"
},
"11": {
"then": "Enrajolat"
},
"12": {
"then": "Tallat a la fusta"
}
},
"question": "Quin tipus d'obra és aquesta peça?",
@ -1911,14 +1911,14 @@
"1": {
"question": "Té un connector <div style='display: inline-block'><b><b>Schuko</b> sense pin de terra (CEE7/4 tipus F)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/CEE7_4F.svg'/></div>"
},
"10": {
"question": "Té un connector <div style='display: inline-block'><b><b>Tipus 2 amb cable</b> (mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div>"
},
"2": {
"question": "Té un connector <div style='display: inline-block'><b><b>endoll de paret Europeu</b> amb un pin de terra (CEE7/4 tipus F)</b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/TypeE.svg'/></div>"
},
"3": {
"question": "Té un connector <div style='display: inline-block'><b><b>Chademo</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Chademo_type4.svg'/></div>"
},
"10": {
"question": "Té un connector <div style='display: inline-block'><b><b>Tipus 2 amb cable</b> (mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div>"
}
}
}
@ -1965,30 +1965,6 @@
"1": {
"then": "<b>Endoll de paret Schuko</b> sense pin a terra (CEE7/4 tipus F)"
},
"2": {
"then": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)"
},
"3": {
"then": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)"
},
"4": {
"then": "<b>CHAdeMo</b>"
},
"5": {
"then": "<b>CHAdeMo</b>"
},
"6": {
"then": "<b>Tipus 1 amb cable</b>"
},
"7": {
"then": "<b>Tipus 1 amb cable</b>"
},
"8": {
"then": "<b>Tipus 1 <i>sense</i> cable</b>"
},
"9": {
"then": "<b>Tipus 1 <i>sense</i> cable</b>(J1772)"
},
"10": {
"then": "<b>CSS Tipus 1</b> (també conegut com a Tipus 1 Combo)"
},
@ -2012,6 +1988,30 @@
},
"17": {
"then": "<b>CSS Tipus 2</b> (mennekes)"
},
"2": {
"then": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)"
},
"3": {
"then": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)"
},
"4": {
"then": "<b>CHAdeMo</b>"
},
"5": {
"then": "<b>CHAdeMo</b>"
},
"6": {
"then": "<b>Tipus 1 amb cable</b>"
},
"7": {
"then": "<b>Tipus 1 amb cable</b>"
},
"8": {
"then": "<b>Tipus 1 <i>sense</i> cable</b>"
},
"9": {
"then": "<b>Tipus 1 <i>sense</i> cable</b>(J1772)"
}
}
},
@ -2667,6 +2667,9 @@
"1": {
"then": "Aquesta via ciclista està pavimentada"
},
"10": {
"then": "Aquesta via ciclista està feta de grava fina"
},
"2": {
"then": "Aquesta via ciclista està feta d'asfalt"
},
@ -2690,9 +2693,6 @@
},
"9": {
"then": "Aquesta via ciclista està feta de grava"
},
"10": {
"then": "Aquesta via ciclista està feta de grava fina"
}
},
"question": "De quina superfície està fet aquesta via ciclista?",
@ -2738,6 +2738,9 @@
"1": {
"then": "Aquest carril bici està pavimentat"
},
"10": {
"then": "Aquesta via ciclista està feta de gravilla"
},
"2": {
"then": "Aquest carril bici està fet d'asfalt"
},
@ -2749,9 +2752,6 @@
},
"9": {
"then": "Aquesta via ciclista està feta de grava"
},
"10": {
"then": "Aquesta via ciclista està feta de gravilla"
}
},
"question": "De què està feta la superfície d'aquest carrer?",
@ -3768,6 +3768,13 @@
}
}
},
"10": {
"options": {
"2": {
"question": "No s'admeten gossos"
}
}
},
"2": {
"options": {
"0": {
@ -3838,13 +3845,6 @@
"question": "Ús gratuït"
}
}
},
"10": {
"options": {
"2": {
"question": "No s'admeten gossos"
}
}
}
}
},
@ -3961,6 +3961,21 @@
"1": {
"then": "Aquesta estació de fitness té un cartell amb instruccions per a un exercici concret."
},
"10": {
"then": "Aquesta estació de gimnàs té esglaons."
},
"11": {
"then": "Aquesta estació de fitness disposa de cons per fer salts de granota."
},
"12": {
"then": "Aquesta estació de fitness té bigues per saltar."
},
"13": {
"then": "Aquesta estació de fitness té obstacles per a travesar."
},
"14": {
"then": "Aquesta estació de fitness té una paret per enfilar-se."
},
"2": {
"then": "Aquesta estació de fitness té una instal·lació per fer abdominals."
},
@ -3984,21 +3999,6 @@
},
"9": {
"then": "Aquesta estació de fitness té llocs per fer exercicis d'eslàlom."
},
"10": {
"then": "Aquesta estació de gimnàs té esglaons."
},
"11": {
"then": "Aquesta estació de fitness disposa de cons per fer salts de granota."
},
"12": {
"then": "Aquesta estació de fitness té bigues per saltar."
},
"13": {
"then": "Aquesta estació de fitness té obstacles per a travesar."
},
"14": {
"then": "Aquesta estació de fitness té una paret per enfilar-se."
}
}
}
@ -4117,6 +4117,21 @@
"1": {
"then": "Fregiduria"
},
"10": {
"then": "Xinés"
},
"11": {
"then": "Grec"
},
"12": {
"then": "Indi"
},
"13": {
"then": "Turc"
},
"14": {
"then": "Tailandés"
},
"2": {
"then": "Principalment serveix pasta"
},
@ -4140,21 +4155,6 @@
},
"9": {
"then": "Restaurant francés"
},
"10": {
"then": "Xinés"
},
"11": {
"then": "Grec"
},
"12": {
"then": "Indi"
},
"13": {
"then": "Turc"
},
"14": {
"then": "Tailandés"
}
},
"question": "Quin tipus de menjar es serveix aquí?",
@ -4708,9 +4708,24 @@
"1": {
"then": "Açò és un auditori"
},
"10": {
"then": "Açò és un laboratori"
},
"14": {
"then": "Açò és una oficina"
},
"17": {
"then": "Açò és un restaurant"
},
"2": {
"then": "Açò és un dormitori"
},
"20": {
"then": "Açò és un magatzem"
},
"23": {
"then": "Açò és una sala d'espera"
},
"3": {
"then": "Açò és una capella"
},
@ -4728,21 +4743,6 @@
},
"9": {
"then": "Açò és una cuina"
},
"10": {
"then": "Açò és un laboratori"
},
"14": {
"then": "Açò és una oficina"
},
"17": {
"then": "Açò és un restaurant"
},
"20": {
"then": "Açò és un magatzem"
},
"23": {
"then": "Açò és una sala d'espera"
}
},
"question": "Quin tipus d'habitació és aquesta?"
@ -5355,6 +5355,27 @@
}
}
},
"10": {
"options": {
"0": {
"question": "Editat per última vega pel contribuïdor {search}"
}
}
},
"12": {
"options": {
"0": {
"question": "Creada abans de {search}"
}
}
},
"13": {
"options": {
"0": {
"question": "Creada després de {search}"
}
}
},
"2": {
"options": {
"0": {
@ -5395,27 +5416,6 @@
"question": "<b>No</b> obert pel contribuïdor {search}"
}
}
},
"10": {
"options": {
"0": {
"question": "Editat per última vega pel contribuïdor {search}"
}
}
},
"12": {
"options": {
"0": {
"question": "Creada abans de {search}"
}
}
},
"13": {
"options": {
"0": {
"question": "Creada després de {search}"
}
}
}
},
"name": "Notes d'OpenStreetMap",
@ -5704,6 +5704,12 @@
"1": {
"then": "Aquesta és una plaça d'aparcament normal."
},
"10": {
"then": "Es tracta d'una plaça d'aparcament reservada al personal."
},
"11": {
"then": "Aquest espai d'aparcament està reservat per a taxi."
},
"2": {
"then": "Aquesta és una plaça d'aparcament per a minusvàlids."
},
@ -5721,12 +5727,6 @@
},
"9": {
"then": "Es tracta d'una plaça d'aparcament reservada per a pares amb fills."
},
"10": {
"then": "Es tracta d'una plaça d'aparcament reservada al personal."
},
"11": {
"then": "Aquest espai d'aparcament està reservat per a taxi."
}
},
"question": "Quin tipus d'espai d'aparcament és aquest?"
@ -6292,6 +6292,21 @@
"1": {
"then": "S'accepten monedes de 2 cèntims"
},
"10": {
"then": "S'accepten monedes de 20 cèntims"
},
"11": {
"then": "S'accepten monedes de ½ franc"
},
"12": {
"then": "S'accepten monedes d'1 franc"
},
"13": {
"then": "S'accepten monedes de 2 francs"
},
"14": {
"then": "S'accepten monedes de 5 francs"
},
"2": {
"then": "S'accepten monedes de 5 cèntims"
},
@ -6315,21 +6330,6 @@
},
"9": {
"then": "S'accepten monedes de 10 cèntims"
},
"10": {
"then": "S'accepten monedes de 20 cèntims"
},
"11": {
"then": "S'accepten monedes de ½ franc"
},
"12": {
"then": "S'accepten monedes d'1 franc"
},
"13": {
"then": "S'accepten monedes de 2 francs"
},
"14": {
"then": "S'accepten monedes de 5 francs"
}
},
"question": "Quines monedes es poden utilitzar per a pagar aquí?"
@ -6342,6 +6342,15 @@
"1": {
"then": "S'accepten bitllets de 10 euros"
},
"10": {
"then": "S'accepten bitllets de 100 francs"
},
"11": {
"then": "S'accepten bitllets de 200 francs"
},
"12": {
"then": "S'accepten bitllets de 1000 francs"
},
"2": {
"then": "S'accepten bitllets de 20 euros"
},
@ -6365,15 +6374,6 @@
},
"9": {
"then": "S'accepten bitllets de 50 francs"
},
"10": {
"then": "S'accepten bitllets de 100 francs"
},
"11": {
"then": "S'accepten bitllets de 200 francs"
},
"12": {
"then": "S'accepten bitllets de 1000 francs"
}
},
"question": "Amb quins bitllets pot pagar aquí?"
@ -6735,30 +6735,6 @@
"1": {
"question": "Reciclatge de piles"
},
"2": {
"question": "Reciclatge de cartrons de begudes"
},
"3": {
"question": "Reciclatge de llaunes"
},
"4": {
"question": "Reciclatge de roba"
},
"5": {
"question": "Reciclatge d'oli de cuina"
},
"6": {
"question": "Reciclatge d'oli de motor"
},
"7": {
"question": "Reciclatge de tubs fluorescents"
},
"8": {
"question": "Reciclatge de residus verds"
},
"9": {
"question": "Reciclatge d'ampolles de vidre"
},
"10": {
"question": "Reciclatge de vidre"
},
@ -6789,11 +6765,35 @@
"19": {
"question": "Reciclatge del rebuig"
},
"2": {
"question": "Reciclatge de cartrons de begudes"
},
"20": {
"question": "Reciclatge de cartutxos d'impressora"
},
"21": {
"question": "Reciclatge de bicicletes"
},
"3": {
"question": "Reciclatge de llaunes"
},
"4": {
"question": "Reciclatge de roba"
},
"5": {
"question": "Reciclatge d'oli de cuina"
},
"6": {
"question": "Reciclatge d'oli de motor"
},
"7": {
"question": "Reciclatge de tubs fluorescents"
},
"8": {
"question": "Reciclatge de residus verds"
},
"9": {
"question": "Reciclatge d'ampolles de vidre"
}
}
},
@ -6861,30 +6861,6 @@
"1": {
"then": "Aquí es poden reciclar els cartons de begudes"
},
"2": {
"then": "Aquí es poden reciclar llaunes"
},
"3": {
"then": "Aquí es pot reciclar roba"
},
"4": {
"then": "Aquí es pot reciclar oli de cuina"
},
"5": {
"then": "Aquí es pot reciclar oli de motor"
},
"6": {
"then": "Aquí es poden reciclar tub fluroescents"
},
"7": {
"then": "Aquí es poden reciclar residus verds"
},
"8": {
"then": "Ací es poden reciclar residus orgànics"
},
"9": {
"then": "Aquí es poden reciclar ampolles de vidre"
},
"10": {
"then": "Aquí es pot reciclar vidre"
},
@ -6912,6 +6888,9 @@
"19": {
"then": "Aquí es pot reciclar ferralla"
},
"2": {
"then": "Aquí es poden reciclar llaunes"
},
"20": {
"then": "Aquí es poden reciclar sabates"
},
@ -6929,6 +6908,27 @@
},
"25": {
"then": "Aquí es poden reciclar bicicletes"
},
"3": {
"then": "Aquí es pot reciclar roba"
},
"4": {
"then": "Aquí es pot reciclar oli de cuina"
},
"5": {
"then": "Aquí es pot reciclar oli de motor"
},
"6": {
"then": "Aquí es poden reciclar tub fluroescents"
},
"7": {
"then": "Aquí es poden reciclar residus verds"
},
"8": {
"then": "Ací es poden reciclar residus orgànics"
},
"9": {
"then": "Aquí es poden reciclar ampolles de vidre"
}
},
"question": "Què es pot reciclar aquí?"
@ -7751,6 +7751,12 @@
"1": {
"then": "Aquest fanal utilitza LED"
},
"10": {
"then": "Aquest fanal utilitza làmpades de sodi d'alta pressió (taronja amb blanc)"
},
"11": {
"then": "Aquest fanal s'il·lumina amb gas"
},
"2": {
"then": "Aquest fanal utilitza il·luminació incandescent"
},
@ -7774,12 +7780,6 @@
},
"9": {
"then": "Aquest fanal utilitza làmpades de sodi de baixa pressió (taronja monocroma)"
},
"10": {
"then": "Aquest fanal utilitza làmpades de sodi d'alta pressió (taronja amb blanc)"
},
"11": {
"then": "Aquest fanal s'il·lumina amb gas"
}
},
"question": "Quin tipus d'il·luminació utilitza aquest fanal?"
@ -9034,30 +9034,6 @@
"1": {
"question": "Venda de begudes"
},
"2": {
"question": "Venda de llaminadures"
},
"3": {
"question": "Venda de menjar"
},
"4": {
"question": "Venda de tabaco"
},
"5": {
"question": "Venda de preservatius"
},
"6": {
"question": "Venda de cafè"
},
"7": {
"question": "Venda d'aigua"
},
"8": {
"question": "Venda de diaris"
},
"9": {
"question": "Venda de càmeres interiors de bicicletes"
},
"10": {
"question": "Venda de llet"
},
@ -9085,6 +9061,9 @@
"19": {
"question": "Venda de maduixes"
},
"2": {
"question": "Venda de llaminadures"
},
"20": {
"question": "Venda de flors"
},
@ -9111,6 +9090,27 @@
},
"28": {
"question": "Venda de cadenat per a bicicletes"
},
"3": {
"question": "Venda de menjar"
},
"4": {
"question": "Venda de tabaco"
},
"5": {
"question": "Venda de preservatius"
},
"6": {
"question": "Venda de cafè"
},
"7": {
"question": "Venda d'aigua"
},
"8": {
"question": "Venda de diaris"
},
"9": {
"question": "Venda de càmeres interiors de bicicletes"
}
}
}
@ -9204,30 +9204,6 @@
"1": {
"then": "Es venen llaminadures"
},
"2": {
"then": "Es ven menjar"
},
"3": {
"then": "Es ven tabaco"
},
"4": {
"then": "Es venen preservatius"
},
"5": {
"then": "Es ven cafè"
},
"6": {
"then": "Es ven aigua"
},
"7": {
"then": "Es venen diaris"
},
"8": {
"then": "Es venen càmeres interiors de bicicletes"
},
"9": {
"then": "Es ven llet"
},
"10": {
"then": "Es ven pa"
},
@ -9255,6 +9231,9 @@
"19": {
"then": "Es venen flors"
},
"2": {
"then": "Es ven menjar"
},
"20": {
"then": "Es venen tiquets d'aparcament"
},
@ -9278,6 +9257,27 @@
},
"27": {
"then": "Es venen cadenats per a bicicletes"
},
"3": {
"then": "Es ven tabaco"
},
"4": {
"then": "Es venen preservatius"
},
"5": {
"then": "Es ven cafè"
},
"6": {
"then": "Es ven aigua"
},
"7": {
"then": "Es venen diaris"
},
"8": {
"then": "Es venen càmeres interiors de bicicletes"
},
"9": {
"then": "Es ven llet"
}
},
"question": "Que ven aquesta màquina expenedora?",

View file

@ -36,6 +36,26 @@
"description": "Velká venkovní reklamní konstrukce, která se obvykle nachází na frekventovaných místech, například podél frekventovaných silnic, umístěná na zdi",
"title": "billboard připevněný na stěnu"
},
"10": {
"title": "obrazovka namontovaná na dopravním přístřešku"
},
"11": {
"description": "Kus nepromokavého textilu s natištěným vzkazem, trvale připevněný na stěnu",
"title": "plachta"
},
"12": {
"title": "totem"
},
"13": {
"description": "Používá se pro reklamní nápisy, neonové nápisy, loga a vstupní nápisy institucí",
"title": "cedule"
},
"14": {
"title": "socha"
},
"15": {
"title": "nástěnná malba"
},
"2": {
"title": "volně stojící plakátovací skříň"
},
@ -61,26 +81,6 @@
},
"9": {
"title": "obrazovka připevněná na stěnu"
},
"10": {
"title": "obrazovka namontovaná na dopravním přístřešku"
},
"11": {
"description": "Kus nepromokavého textilu s natištěným vzkazem, trvale připevněný na stěnu",
"title": "plachta"
},
"12": {
"title": "totem"
},
"13": {
"description": "Používá se pro reklamní nápisy, neonové nápisy, loga a vstupní nápisy institucí",
"title": "cedule"
},
"14": {
"title": "socha"
},
"15": {
"title": "nástěnná malba"
}
},
"tagRenderings": {
@ -186,6 +186,15 @@
"1": {
"then": "Toto je deska"
},
"10": {
"then": "Toto je nástěnná malba"
},
"11": {
"then": "Jedná se o dlaždice - reklama je namalovaná na dlaždicích"
},
"12": {
"then": "Toto je reliéf"
},
"2": {
"then": "Toto je sloup"
},
@ -209,15 +218,6 @@
},
"9": {
"then": "Toto je totem"
},
"10": {
"then": "Toto je nástěnná malba"
},
"11": {
"then": "Jedná se o dlaždice - reklama je namalovaná na dlaždicích"
},
"12": {
"then": "Toto je reliéf"
}
},
"question": "O jaký typ reklamního prvku se jedná?",
@ -232,6 +232,9 @@
"1": {
"then": "Deska"
},
"10": {
"then": "Nástěnná malba"
},
"2": {
"then": "Skříň na plakáty"
},
@ -255,9 +258,6 @@
},
"9": {
"then": "Totem"
},
"10": {
"then": "Nástěnná malba"
}
}
}
@ -304,6 +304,9 @@
"1": {
"then": "Jedná se o gondolu, kde vozy jezdí v nepřetržitých kruzích"
},
"10": {
"then": "Lano na visuté dráze. (Turistická atrakce, kde se odvážlivci spouštějí vysokou rychlostí) "
},
"2": {
"then": "Otevřená lanovka se sedačkami k sezení na čerstvém vzduchu."
},
@ -327,9 +330,6 @@
},
"9": {
"then": "Kouzelný koberec (pásový dopravník na zemi)"
},
"10": {
"then": "Lano na visuté dráze. (Turistická atrakce, kde se odvážlivci spouštějí vysokou rychlostí) "
}
},
"question": "O jaký typ dráhy se jedná?"
@ -474,6 +474,15 @@
"1": {
"then": "Nástěnná malba"
},
"10": {
"then": "Azulejo (španělské dekorativní dlaždice)"
},
"11": {
"then": "Obklady a dlažba"
},
"12": {
"then": "Dřevořezba"
},
"2": {
"then": "Malba"
},
@ -497,15 +506,6 @@
},
"9": {
"then": "Reliéf"
},
"10": {
"then": "Azulejo (španělské dekorativní dlaždice)"
},
"11": {
"then": "Obklady a dlažba"
},
"12": {
"then": "Dřevořezba"
}
},
"question": "Jaký je typ tohoto uměleckého díla?",
@ -1583,6 +1583,9 @@
"1": {
"then": "Stojan s bočními smyčkami"
},
"10": {
"then": "Skloněný držák s možností použití zámku přes očko. Sedlovou trubku lze za stojan uchytit pomocí kotvy"
},
"2": {
"then": "Stojan na kola / smyčky"
},
@ -1606,9 +1609,6 @@
},
"9": {
"then": "Skříňka - kola jsou uzavřena zcela samostatně nebo s několika koly dohromady. Skříňka je příliš malá na to, aby se do ní vešla stojící osoba.."
},
"10": {
"then": "Skloněný držák s možností použití zámku přes očko. Sedlovou trubku lze za stojan uchytit pomocí kotvy"
}
},
"question": "Jaký je typ tohoto parkoviště pro jízdní kola?",
@ -2383,27 +2383,6 @@
"1": {
"then": "<b>Schuko zásuvka</b> bez zemnícího kolíku (CEE7/4 typ F)"
},
"2": {
"then": "<b>Evropská zásuvka</b> se zemnícím kolíkem (CEE7/4 typ E)"
},
"4": {
"then": "<b>Chademo</b>"
},
"5": {
"then": "<b>Chademo</b>"
},
"6": {
"then": "<b>Typ 1 s kabelem</b> (J1772)"
},
"7": {
"then": "<b>Typ 1 s kabelem</b> (J1772)"
},
"8": {
"then": "<b>Typ 1 <i>bez</i> kabelu</b> (J1772)"
},
"9": {
"then": "<b>Typ 1 <i>bez</i> kabelu</b> (J1772)"
},
"10": {
"then": "<b>CCS typu 1</b> (neboli kombinace typu 1)"
},
@ -2434,6 +2413,9 @@
"19": {
"then": "<b>Typ 2 s kabelem</b> (mennekes)"
},
"2": {
"then": "<b>Evropská zásuvka</b> se zemnícím kolíkem (CEE7/4 typ E)"
},
"20": {
"then": "<b>Tesla Supercharger CCS</b> (značkový typ2_css)"
},
@ -2467,11 +2449,29 @@
"39": {
"then": "<b>AS3112</b> (Typ I)"
},
"4": {
"then": "<b>Chademo</b>"
},
"40": {
"then": "<b>NEMA 5-20</b> (Typ B)"
},
"41": {
"then": "<b>NEMA 5-20</b> (Typ B)"
},
"5": {
"then": "<b>Chademo</b>"
},
"6": {
"then": "<b>Typ 1 s kabelem</b> (J1772)"
},
"7": {
"then": "<b>Typ 1 s kabelem</b> (J1772)"
},
"8": {
"then": "<b>Typ 1 <i>bez</i> kabelu</b> (J1772)"
},
"9": {
"then": "<b>Typ 1 <i>bez</i> kabelu</b> (J1772)"
}
},
"question": "Jaké nabíjecí přípojky jsou zde k dispozici?"
@ -3302,21 +3302,6 @@
"1": {
"then": "Tento přechod má označení zebra"
},
"2": {
"then": "Tento přejezd má značení neznámého typu"
},
"3": {
"then": "Tento přechod má čáry na obou stranách přechodu"
},
"4": {
"then": "Tento přechod má na obou stranách čáry a spojovací pruhy"
},
"5": {
"then": "Tento přechod má po obou stranách přerušované čáry"
},
"6": {
"then": "Tento přechod má tečkované čáry na obou stranách přechodu"
},
"10": {
"then": "Tento přechod má označení zebry ve střídavých barvách"
},
@ -3331,6 +3316,21 @@
},
"14": {
"then": "Tento přechod má dvojité čáry na obou stranách přechodu"
},
"2": {
"then": "Tento přejezd má značení neznámého typu"
},
"3": {
"then": "Tento přechod má čáry na obou stranách přechodu"
},
"4": {
"then": "Tento přechod má na obou stranách čáry a spojovací pruhy"
},
"5": {
"then": "Tento přechod má po obou stranách přerušované čáry"
},
"6": {
"then": "Tento přechod má tečkované čáry na obou stranách přechodu"
}
}
}
@ -3418,6 +3418,15 @@
"1": {
"then": "Tato cyklostezka je zpevněná"
},
"10": {
"then": "Tato cyklostezka je tvořena jemným štěrkem"
},
"11": {
"then": "Tato cyklostezka je z oblázkového kamene"
},
"12": {
"then": "Tato cyklostezka je vyrobena ze surové zeminy"
},
"2": {
"then": "Tato cyklostezka je z asfaltu"
},
@ -3441,15 +3450,6 @@
},
"9": {
"then": "Tato cyklostezka je štěrková"
},
"10": {
"then": "Tato cyklostezka je tvořena jemným štěrkem"
},
"11": {
"then": "Tato cyklostezka je z oblázkového kamene"
},
"12": {
"then": "Tato cyklostezka je vyrobena ze surové zeminy"
}
},
"question": "Jaký je povrch cyklostezky?",
@ -3498,6 +3498,15 @@
"1": {
"then": "Tato cyklostezka je zpevněná"
},
"10": {
"then": "Tato cyklostezka je vyrobena z jemného štěrku"
},
"11": {
"then": "Tato cyklostezka je z oblázků"
},
"12": {
"then": "Tato cyklostezka je vyrobena ze surové půdy"
},
"2": {
"then": "Tato cyklostezka je z asfaltu"
},
@ -3521,15 +3530,6 @@
},
"9": {
"then": "Tato cyklostezka je ze štěrku"
},
"10": {
"then": "Tato cyklostezka je vyrobena z jemného štěrku"
},
"11": {
"then": "Tato cyklostezka je z oblázků"
},
"12": {
"then": "Tato cyklostezka je vyrobena ze surové půdy"
}
},
"question": "Z čeho je povrch ulice vyroben?",
@ -4487,6 +4487,54 @@
}
}
},
"10": {
"options": {
"0": {
"question": "Bez preference psů"
},
"1": {
"question": "Psi povoleny"
},
"2": {
"question": "Psi nejsou povoleni"
}
}
},
"11": {
"options": {
"0": {
"question": "Nabízí internet"
}
}
},
"12": {
"options": {
"0": {
"question": "Nabízí elektřinu"
}
}
},
"13": {
"options": {
"0": {
"question": "Má nabídku bez cukru"
}
}
},
"14": {
"options": {
"0": {
"question": "Má bezlepkovou nabídku"
}
}
},
"15": {
"options": {
"0": {
"question": "Má nabídku bez laktózy"
}
}
},
"2": {
"options": {
"0": {
@ -4557,54 +4605,6 @@
"question": "Použití zdarma"
}
}
},
"10": {
"options": {
"0": {
"question": "Bez preference psů"
},
"1": {
"question": "Psi povoleny"
},
"2": {
"question": "Psi nejsou povoleni"
}
}
},
"11": {
"options": {
"0": {
"question": "Nabízí internet"
}
}
},
"12": {
"options": {
"0": {
"question": "Nabízí elektřinu"
}
}
},
"13": {
"options": {
"0": {
"question": "Má nabídku bez cukru"
}
}
},
"14": {
"options": {
"0": {
"question": "Má bezlepkovou nabídku"
}
}
},
"15": {
"options": {
"0": {
"question": "Má nabídku bez laktózy"
}
}
}
}
},
@ -4724,30 +4724,6 @@
"1": {
"then": "Tato fitness stanice má ceduli s pokyny pro konkrétní cvičení."
},
"2": {
"then": "Tato posilovna má zařízení pro sedy-lehy."
},
"3": {
"then": "Tato posilovna má zařízení pro kliky. Obvykle se skládá z jedné nebo více nízkých vodorovných tyčí."
},
"4": {
"then": "Tato posilovací stanice má tyče pro strečink."
},
"5": {
"then": "Tato fitness stanice má stanici pro vytváření hyperextenzí."
},
"6": {
"then": "Tato posilovací stanice má kruhy pro gymnastická cvičení."
},
"7": {
"then": "Tato fitness stanice má horizontální žebřík, známý také jako ručkovací žebřík."
},
"8": {
"then": "Tato fitness stanice má nástěnné tyče, na které lze lézt."
},
"9": {
"then": "Tato fitness stanice má sloupky pro provádění slalomových cvičení."
},
"10": {
"then": "Tato fitness stanice má odrazové můstky."
},
@ -4778,6 +4754,9 @@
"19": {
"then": "Tato fitness stanice má bojová lana."
},
"2": {
"then": "Tato posilovna má zařízení pro sedy-lehy."
},
"20": {
"then": "Tato posilovna má stacionární kolo."
},
@ -4792,6 +4771,27 @@
},
"24": {
"then": "Tato fitness stanice má slackline."
},
"3": {
"then": "Tato posilovna má zařízení pro kliky. Obvykle se skládá z jedné nebo více nízkých vodorovných tyčí."
},
"4": {
"then": "Tato posilovací stanice má tyče pro strečink."
},
"5": {
"then": "Tato fitness stanice má stanici pro vytváření hyperextenzí."
},
"6": {
"then": "Tato posilovací stanice má kruhy pro gymnastická cvičení."
},
"7": {
"then": "Tato fitness stanice má horizontální žebřík, známý také jako ručkovací žebřík."
},
"8": {
"then": "Tato fitness stanice má nástěnné tyče, na které lze lézt."
},
"9": {
"then": "Tato fitness stanice má sloupky pro provádění slalomových cvičení."
}
},
"question": "Jaké vybavení má tato fitness stanice?"
@ -4911,6 +4911,21 @@
"1": {
"then": "Hranolkárna"
},
"10": {
"then": "Podávají se zde čínské pokrmy"
},
"11": {
"then": "Podávají se zde řecká jídla"
},
"12": {
"then": "Podávají se zde indická jídla"
},
"13": {
"then": "Podávají se zde turecké pokrmy"
},
"14": {
"then": "Podávají se zde thajské pokrmy"
},
"2": {
"then": "Podávají hlavně těstoviny"
},
@ -4934,21 +4949,6 @@
},
"9": {
"then": "Podávají se zde francouzská jídla"
},
"10": {
"then": "Podávají se zde čínské pokrmy"
},
"11": {
"then": "Podávají se zde řecká jídla"
},
"12": {
"then": "Podávají se zde indická jídla"
},
"13": {
"then": "Podávají se zde turecké pokrmy"
},
"14": {
"then": "Podávají se zde thajské pokrmy"
}
},
"question": "Jaké jídlo se zde podává?",
@ -5562,30 +5562,6 @@
"1": {
"then": "Jedná se o posluchárnu"
},
"2": {
"then": "Jedná se o ložnici"
},
"3": {
"then": "Jedná se o kapli"
},
"4": {
"then": "Jedná se o učebnu"
},
"5": {
"then": "Jedná se o učebnu"
},
"6": {
"then": "Jedná se o počítačovou místnost"
},
"7": {
"then": "Jedná se o konferenční místnost"
},
"8": {
"then": "Jedná se o kryptu"
},
"9": {
"then": "Jedná se o kuchyň"
},
"10": {
"then": "Jedná se o laboratoř"
},
@ -5613,6 +5589,9 @@
"19": {
"then": "Jedná se o sportovní místnost"
},
"2": {
"then": "Jedná se o ložnici"
},
"20": {
"then": "Jedná se o skladovací místnost"
},
@ -5624,6 +5603,27 @@
},
"23": {
"then": "Jedná se o čekárnu"
},
"3": {
"then": "Jedná se o kapli"
},
"4": {
"then": "Jedná se o učebnu"
},
"5": {
"then": "Jedná se o učebnu"
},
"6": {
"then": "Jedná se o počítačovou místnost"
},
"7": {
"then": "Jedná se o konferenční místnost"
},
"8": {
"then": "Jedná se o kryptu"
},
"9": {
"then": "Jedná se o kuchyň"
}
},
"question": "O jaký typ pokoje se jedná?"
@ -6258,6 +6258,27 @@
}
}
},
"10": {
"options": {
"0": {
"question": "Naposledy upravil přispěvatel {search}"
}
}
},
"12": {
"options": {
"0": {
"question": "Vytvořeno před {search}"
}
}
},
"13": {
"options": {
"0": {
"question": "Vytvořeno po {search}"
}
}
},
"2": {
"options": {
"0": {
@ -6298,27 +6319,6 @@
"question": "<b>Není</b> otevřeno přispěvatelem {search}"
}
}
},
"10": {
"options": {
"0": {
"question": "Naposledy upravil přispěvatel {search}"
}
}
},
"12": {
"options": {
"0": {
"question": "Vytvořeno před {search}"
}
}
},
"13": {
"options": {
"0": {
"question": "Vytvořeno po {search}"
}
}
}
},
"name": "Poznámky OpenStreetMap",
@ -6629,6 +6629,18 @@
"1": {
"then": "To je normální parkovací místo."
},
"10": {
"then": "Jedná se o parkovací místo vyhrazené pro zaměstnance."
},
"11": {
"then": "Jedná se o parkovací místo vyhrazené pro taxíky."
},
"12": {
"then": "Jedná se o parkovací místo vyhrazené pro vozidla táhnoucí přívěs."
},
"13": {
"then": "Jedná se o parkovací místo vyhrazené pro sdílení automobilů."
},
"2": {
"then": "Jedná se o parkovací místo pro osoby se zdravotním postižením."
},
@ -6652,18 +6664,6 @@
},
"9": {
"then": "Jedná se o parkovací místo vyhrazené pro rodiče s dětmi."
},
"10": {
"then": "Jedná se o parkovací místo vyhrazené pro zaměstnance."
},
"11": {
"then": "Jedná se o parkovací místo vyhrazené pro taxíky."
},
"12": {
"then": "Jedná se o parkovací místo vyhrazené pro vozidla táhnoucí přívěs."
},
"13": {
"then": "Jedná se o parkovací místo vyhrazené pro sdílení automobilů."
}
},
"question": "Co je to za parkovací místo?"
@ -7709,30 +7709,6 @@
"1": {
"question": "Recyklace baterií"
},
"2": {
"question": "Recyklace nápojových kartonů"
},
"3": {
"question": "Recyklace plechovek"
},
"4": {
"question": "Recyklace oděvů"
},
"5": {
"question": "Recyklace kuchyňského oleje"
},
"6": {
"question": "Recyklace motorového oleje"
},
"7": {
"question": "Recyklace zářivek"
},
"8": {
"question": "Recyklace zeleného odpadu"
},
"9": {
"question": "Recyklace skleněných lahví"
},
"10": {
"question": "Recyklace skla"
},
@ -7763,11 +7739,35 @@
"19": {
"question": "Recyklace zbytkového odpadu"
},
"2": {
"question": "Recyklace nápojových kartonů"
},
"20": {
"question": "Recyklace náplní do tiskáren"
},
"21": {
"question": "Recyklace jízdních kol"
},
"3": {
"question": "Recyklace plechovek"
},
"4": {
"question": "Recyklace oděvů"
},
"5": {
"question": "Recyklace kuchyňského oleje"
},
"6": {
"question": "Recyklace motorového oleje"
},
"7": {
"question": "Recyklace zářivek"
},
"8": {
"question": "Recyklace zeleného odpadu"
},
"9": {
"question": "Recyklace skleněných lahví"
}
}
},
@ -7835,30 +7835,6 @@
"1": {
"then": "Nápojové kartony se zde dají recyklovat"
},
"2": {
"then": "Plechovky se zde dají recyklovat"
},
"3": {
"then": "Oblečení se zde dá recyklovat"
},
"4": {
"then": "Olej na vaření zde lze recyklovat"
},
"5": {
"then": "Motorový olej zde lze recyklovat"
},
"6": {
"then": "Zářivky se zde dají recyklovat"
},
"7": {
"then": "Zelený odpad se zde dá recyklovat"
},
"8": {
"then": "Organický odpad lze zde recyklovat"
},
"9": {
"then": "Skleněné lahve se zde dají recyklovat"
},
"10": {
"then": "Sklo se zde dá recyklovat"
},
@ -7886,6 +7862,9 @@
"19": {
"then": "Kovový šrot lze zde recyklovat"
},
"2": {
"then": "Plechovky se zde dají recyklovat"
},
"20": {
"then": "Boty se zde dají recyklovat"
},
@ -7903,6 +7882,27 @@
},
"25": {
"then": "Kola se zde dají recyklovat"
},
"3": {
"then": "Oblečení se zde dá recyklovat"
},
"4": {
"then": "Olej na vaření zde lze recyklovat"
},
"5": {
"then": "Motorový olej zde lze recyklovat"
},
"6": {
"then": "Zářivky se zde dají recyklovat"
},
"7": {
"then": "Zelený odpad se zde dá recyklovat"
},
"8": {
"then": "Organický odpad lze zde recyklovat"
},
"9": {
"then": "Skleněné lahve se zde dají recyklovat"
}
},
"question": "Co se zde dá recyklovat?"
@ -8897,6 +8897,12 @@
"1": {
"then": "Tato lampa používá LED diody"
},
"10": {
"then": "Tato lampa používá vysokotlaké sodíkové výbojky (oranžové s bílou)"
},
"11": {
"then": "Tato lampa svítí pomocí plynu"
},
"2": {
"then": "Tato lampa využívá žárovkové osvětlení"
},
@ -8920,12 +8926,6 @@
},
"9": {
"then": "Tato lampa používá nízkotlaké sodíkové výbojky (monochromatické oranžové)"
},
"10": {
"then": "Tato lampa používá vysokotlaké sodíkové výbojky (oranžové s bílou)"
},
"11": {
"then": "Tato lampa svítí pomocí plynu"
}
},
"question": "Jaké osvětlení používá tato lampa?"
@ -10179,30 +10179,6 @@
"1": {
"question": "Prodej nápojů"
},
"2": {
"question": "Prodej sladkostí"
},
"3": {
"question": "Prodej potravin"
},
"4": {
"question": "Prodej cigaret"
},
"5": {
"question": "Prodej kondomů"
},
"6": {
"question": "Prodej kávy"
},
"7": {
"question": "Prodej vody"
},
"8": {
"question": "Prodej novin"
},
"9": {
"question": "Prodej duší na jízdní kola"
},
"10": {
"question": "Prodej mléka"
},
@ -10230,6 +10206,9 @@
"19": {
"question": "Prodej jahod"
},
"2": {
"question": "Prodej sladkostí"
},
"20": {
"question": "Prodej květin"
},
@ -10256,6 +10235,27 @@
},
"28": {
"question": "Prodej zámků na kola"
},
"3": {
"question": "Prodej potravin"
},
"4": {
"question": "Prodej cigaret"
},
"5": {
"question": "Prodej kondomů"
},
"6": {
"question": "Prodej kávy"
},
"7": {
"question": "Prodej vody"
},
"8": {
"question": "Prodej novin"
},
"9": {
"question": "Prodej duší na jízdní kola"
}
}
}
@ -10349,30 +10349,6 @@
"1": {
"then": "Prodává sladkosti"
},
"2": {
"then": "Prodává jídlo"
},
"3": {
"then": "Prodává cigarety"
},
"4": {
"then": "Prodává kondomy"
},
"5": {
"then": "Prodává kafe"
},
"6": {
"then": "Prodává pitnou vodu"
},
"7": {
"then": "Prodává noviny"
},
"8": {
"then": "Prodává duše na kola"
},
"9": {
"then": "Prodává mléko"
},
"10": {
"then": "Prodává chléb"
},
@ -10400,6 +10376,9 @@
"19": {
"then": "Prodává květiny"
},
"2": {
"then": "Prodává jídlo"
},
"20": {
"then": "Prodává parkovací lístky"
},
@ -10423,6 +10402,27 @@
},
"27": {
"then": "Prodává zámky na kolo"
},
"3": {
"then": "Prodává cigarety"
},
"4": {
"then": "Prodává kondomy"
},
"5": {
"then": "Prodává kafe"
},
"6": {
"then": "Prodává pitnou vodu"
},
"7": {
"then": "Prodává noviny"
},
"8": {
"then": "Prodává duše na kola"
},
"9": {
"then": "Prodává mléko"
}
},
"question": "Co tento automat prodává?",

View file

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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -101,6 +101,12 @@
"1": {
"then": "Murala"
},
"11": {
"then": "Keramika"
},
"12": {
"then": "Egur taila"
},
"2": {
"then": "Margolana"
},
@ -124,12 +130,6 @@
},
"9": {
"then": "Erliebea"
},
"11": {
"then": "Keramika"
},
"12": {
"then": "Egur taila"
}
}
}

View file

@ -32,6 +32,26 @@
"description": "Un grand équipement extérieur, principalement disposé dans les zones à fort trafic comme une route",
"title": "un grand panneau"
},
"10": {
"title": "un écran fixé sur un abri de transport"
},
"11": {
"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"
},
"12": {
"title": "un totem"
},
"13": {
"description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées",
"title": "une enseigne"
},
"14": {
"title": "une sculpture"
},
"15": {
"title": "une peinture murale"
},
"2": {
"title": "un panneau à affiches scellé au sol"
},
@ -57,26 +77,6 @@
},
"9": {
"title": "un écran fixé au mur"
},
"10": {
"title": "un écran fixé sur un abri de transport"
},
"11": {
"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"
},
"12": {
"title": "un totem"
},
"13": {
"description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées",
"title": "une enseigne"
},
"14": {
"title": "une sculpture"
},
"15": {
"title": "une peinture murale"
}
},
"tagRenderings": {
@ -179,6 +179,9 @@
"1": {
"then": "C'est un petit panneau"
},
"10": {
"then": "C'est une peinture murale"
},
"2": {
"then": "C'est une colonne"
},
@ -202,9 +205,6 @@
},
"9": {
"then": "C'est un totem"
},
"10": {
"then": "C'est une peinture murale"
}
},
"question": "De quel type de dispositif publicitaire s'agit-il ?",
@ -216,6 +216,9 @@
"1": {
"then": "Petit panneau"
},
"10": {
"then": "Peinture murale"
},
"3": {
"then": "Colonne"
},
@ -236,9 +239,6 @@
},
"9": {
"then": "Totem"
},
"10": {
"then": "Peinture murale"
}
}
}
@ -369,6 +369,15 @@
"1": {
"then": "Peinture murale"
},
"10": {
"then": "Azulejo (faïence latine)"
},
"11": {
"then": "Carrelage"
},
"12": {
"then": "Sculpture sur bois"
},
"2": {
"then": "Peinture"
},
@ -392,15 +401,6 @@
},
"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?",
@ -2520,6 +2520,15 @@
"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"
},
@ -2543,15 +2552,6 @@
},
"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 ?",
@ -2600,6 +2600,15 @@
"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"
},
@ -2623,15 +2632,6 @@
},
"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 ?",
@ -3570,6 +3570,21 @@
"1": {
"then": "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"
},
@ -3593,21 +3608,6 @@
},
"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 ?",
@ -3973,11 +3973,11 @@
},
"room-type": {
"mappings": {
"4": {
"then": "C'est une salle de classe"
},
"14": {
"then": "C'est un bureau"
},
"4": {
"then": "C'est une salle de classe"
}
}
}
@ -4259,6 +4259,21 @@
"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"
},
"14": {
"then": "C'est une pierre tombale, une personne est enterrée ici"
},
"2": {
"then": "C'est un banc commémoratif"
},
@ -4282,21 +4297,6 @@
},
"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"
},
"14": {
"then": "C'est une pierre tombale, une personne est enterrée ici"
}
},
"question": "C'est un mémorial de guerre",
@ -4448,27 +4448,6 @@
}
}
},
"2": {
"options": {
"0": {
"question": "Toutes les notes"
}
}
},
"7": {
"options": {
"0": {
"question": "Ouverte par {search}"
}
}
},
"8": {
"options": {
"0": {
"question": "<b>Exclure</b>les notes ouvertes par {search}"
}
}
},
"10": {
"options": {
"0": {
@ -4489,6 +4468,27 @@
"question": "Créée après le {search}"
}
}
},
"2": {
"options": {
"0": {
"question": "Toutes les notes"
}
}
},
"7": {
"options": {
"0": {
"question": "Ouverte par {search}"
}
}
},
"8": {
"options": {
"0": {
"question": "<b>Exclure</b>les notes ouvertes par {search}"
}
}
}
},
"name": "Notes OpenStreetMap",
@ -5457,30 +5457,6 @@
"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"
},
@ -5511,11 +5487,35 @@
"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"
}
}
},
@ -5578,30 +5578,6 @@
"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"
},
@ -5629,6 +5605,9 @@
"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"
},
@ -5646,6 +5625,27 @@
},
"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 ?"
@ -7197,9 +7197,30 @@
"1": {
"question": "Vente de boissons"
},
"10": {
"question": "Vente de lait"
},
"11": {
"question": "Vente de pain"
},
"12": {
"question": "Vente d'œufs"
},
"14": {
"question": "Vente de fromage"
},
"15": {
"question": "Vente de miel"
},
"16": {
"question": "Vente de pommes de terre"
},
"2": {
"question": "Ventre de confiseries"
},
"20": {
"question": "Vente de fleurs"
},
"3": {
"question": "Ventre de nourriture"
},
@ -7220,27 +7241,6 @@
},
"9": {
"question": "Vente de chambres à air pour vélo"
},
"10": {
"question": "Vente de lait"
},
"11": {
"question": "Vente de pain"
},
"12": {
"question": "Vente d'œufs"
},
"14": {
"question": "Vente de fromage"
},
"15": {
"question": "Vente de miel"
},
"16": {
"question": "Vente de pommes de terre"
},
"20": {
"question": "Vente de fleurs"
}
}
}
@ -7298,6 +7298,24 @@
"1": {
"then": "Vent des confiseries"
},
"10": {
"then": "Vent du pain"
},
"11": {
"then": "Vent des œufs"
},
"13": {
"then": "Vent du fromage"
},
"14": {
"then": "Vent du miel"
},
"15": {
"then": "Vent des pommes de terre"
},
"19": {
"then": "Vent des fleurs"
},
"2": {
"then": "Vent de la nourriture"
},
@ -7321,24 +7339,6 @@
},
"9": {
"then": "Vent du lait"
},
"10": {
"then": "Vent du pain"
},
"11": {
"then": "Vent des œufs"
},
"13": {
"then": "Vent du fromage"
},
"14": {
"then": "Vent du miel"
},
"15": {
"then": "Vent des pommes de terre"
},
"19": {
"then": "Vent des fleurs"
}
},
"question": "Que vent ce distributeur ?",

View file

@ -153,6 +153,12 @@
"1": {
"then": "ציור קיר"
},
"11": {
"then": "יצירת פסיפס"
},
"12": {
"then": "גילוף בעץ"
},
"2": {
"then": "ציור"
},
@ -164,12 +170,6 @@
},
"6": {
"then": "אבן"
},
"11": {
"then": "יצירת פסיפס"
},
"12": {
"then": "גילוף בעץ"
}
},
"question": "מהו סוג היצירה הזו?",

View file

@ -94,6 +94,12 @@
"1": {
"then": "Falfestmény"
},
"10": {
"then": "Azulejo (portugál vagy spanyol dekoratív csempe)"
},
"11": {
"then": "Csempe"
},
"2": {
"then": "Festmény"
},
@ -117,12 +123,6 @@
},
"9": {
"then": "Dombormű"
},
"10": {
"then": "Azulejo (portugál vagy spanyol dekoratív csempe)"
},
"11": {
"then": "Csempe"
}
},
"question": "Milyen fajta műalkotás ez?",

View file

@ -54,6 +54,9 @@
"1": {
"then": "Mural"
},
"10": {
"then": "Azulejo (ubin dekoratif Spanyol)"
},
"2": {
"then": "Lukisan"
},
@ -71,9 +74,6 @@
},
"9": {
"then": "Relief"
},
"10": {
"then": "Azulejo (ubin dekoratif Spanyol)"
}
},
"question": "Apa jenis karya seni ini?",
@ -253,6 +253,15 @@
"1": {
"then": "Jalur sepeda ini diaspal"
},
"10": {
"then": "Jalur sepeda ini terbuat dari kerikil halus"
},
"11": {
"then": "Jalur sepeda ini terbuat dari batu kerikil"
},
"12": {
"then": "Jalur sepeda ini terbuat dari tanah alami"
},
"2": {
"then": "Jalur sepeda ini terbuat dari aspal"
},
@ -273,15 +282,6 @@
},
"9": {
"then": "Jalur sepeda ini terbuat dari kerikil"
},
"10": {
"then": "Jalur sepeda ini terbuat dari kerikil halus"
},
"11": {
"then": "Jalur sepeda ini terbuat dari batu kerikil"
},
"12": {
"then": "Jalur sepeda ini terbuat dari tanah alami"
}
},
"question": "Permukaan jalannya terbuat dari apa?",

View file

@ -32,6 +32,26 @@
"description": "Grande struttura pubblicitaria all'aperto, trovata normalmente in aree ad alto traffico come accanto a strade molto trafficate",
"title": "un cartellone"
},
"10": {
"title": "uno schermo montato su una pensilina del traporto pubblico"
},
"11": {
"description": "Un telo impermeabile con un messaggio stampato, fissato in modo permanente al muro",
"title": "un telone"
},
"12": {
"title": "un totem"
},
"13": {
"description": "Utilizzato per insegna pubblicitaria, un'insegna al neon, i loghi o le indicazioni d'entrata",
"title": "un'insegna"
},
"14": {
"title": "una scultura"
},
"15": {
"title": "un murales"
},
"2": {
"title": "un cartellone pubblicitario fissato a terra"
},
@ -57,26 +77,6 @@
},
"9": {
"title": "uno schermo fissato al muro"
},
"10": {
"title": "uno schermo montato su una pensilina del traporto pubblico"
},
"11": {
"description": "Un telo impermeabile con un messaggio stampato, fissato in modo permanente al muro",
"title": "un telone"
},
"12": {
"title": "un totem"
},
"13": {
"description": "Utilizzato per insegna pubblicitaria, un'insegna al neon, i loghi o le indicazioni d'entrata",
"title": "un'insegna"
},
"14": {
"title": "una scultura"
},
"15": {
"title": "un murales"
}
},
"tagRenderings": {
@ -159,6 +159,15 @@
"1": {
"then": "Murale"
},
"10": {
"then": "Azulejo (ornamento decorativo piastrellato spagnolo)"
},
"11": {
"then": "Mosaico di piastrelle"
},
"12": {
"then": "Scultura in legno"
},
"2": {
"then": "Dipinto"
},
@ -182,15 +191,6 @@
},
"9": {
"then": "Rilievo"
},
"10": {
"then": "Azulejo (ornamento decorativo piastrellato spagnolo)"
},
"11": {
"then": "Mosaico di piastrelle"
},
"12": {
"then": "Scultura in legno"
}
},
"question": "Che tipo di opera darte è questo?",
@ -2271,27 +2271,6 @@
"1": {
"question": "Riciclo di batterie"
},
"2": {
"question": "Riciclo di confezioni per bevande"
},
"3": {
"question": "Riciclo di lattine"
},
"4": {
"question": "Riciclo di abiti"
},
"5": {
"question": "Riciclo di olio da cucina"
},
"6": {
"question": "Riciclo di olio da motore"
},
"8": {
"question": "Riciclo di umido"
},
"9": {
"question": "Riciclo di bottiglie di vetro"
},
"10": {
"question": "Riciclo di vetro"
},
@ -2319,8 +2298,29 @@
"19": {
"question": "Riciclo di secco"
},
"2": {
"question": "Riciclo di confezioni per bevande"
},
"20": {
"question": "Riciclo di secco"
},
"3": {
"question": "Riciclo di lattine"
},
"4": {
"question": "Riciclo di abiti"
},
"5": {
"question": "Riciclo di olio da cucina"
},
"6": {
"question": "Riciclo di olio da motore"
},
"8": {
"question": "Riciclo di umido"
},
"9": {
"question": "Riciclo di bottiglie di vetro"
}
}
},
@ -2373,27 +2373,6 @@
"1": {
"then": "Cartoni per bevande"
},
"2": {
"then": "Lattine"
},
"3": {
"then": "Abiti"
},
"4": {
"then": "Olio da cucina"
},
"5": {
"then": "Olio di motore"
},
"7": {
"then": "Verde"
},
"8": {
"then": "Umido"
},
"9": {
"then": "Bottiglie di vetro"
},
"10": {
"then": "Vetro"
},
@ -2415,6 +2394,9 @@
"19": {
"then": "Rottami metallici"
},
"2": {
"then": "Lattine"
},
"20": {
"then": "Scarpe"
},
@ -2429,6 +2411,24 @@
},
"24": {
"then": "Secco"
},
"3": {
"then": "Abiti"
},
"4": {
"then": "Olio da cucina"
},
"5": {
"then": "Olio di motore"
},
"7": {
"then": "Verde"
},
"8": {
"then": "Umido"
},
"9": {
"then": "Bottiglie di vetro"
}
},
"question": "Cosa si può riciclare qui?"

View file

@ -69,6 +69,12 @@
"1": {
"then": "壁画"
},
"10": {
"then": "Azulejo (スペインの装飾タイル)"
},
"11": {
"then": "タイルワーク"
},
"2": {
"then": "絵画"
},
@ -92,12 +98,6 @@
},
"9": {
"then": "レリーフ"
},
"10": {
"then": "Azulejo (スペインの装飾タイル)"
},
"11": {
"then": "タイルワーク"
}
},
"question": "この作品の種類は何ですか?",

View file

@ -62,6 +62,15 @@
"1": {
"then": "Veggmaleri"
},
"10": {
"then": "Azulejo (Spansk dekorativt flisverk)"
},
"11": {
"then": "Flisarbeid"
},
"12": {
"then": "Treskjæring"
},
"2": {
"then": "Maleri"
},
@ -85,15 +94,6 @@
},
"9": {
"then": "Relieff"
},
"10": {
"then": "Azulejo (Spansk dekorativt flisverk)"
},
"11": {
"then": "Flisarbeid"
},
"12": {
"then": "Treskjæring"
}
},
"question": "Hvilken type kunstverk er dette?",

File diff suppressed because it is too large Load diff

View file

@ -35,6 +35,23 @@
"1": {
"description": "Duży obiekt reklamowy na zewnątrz, zazwyczaj znajduje się w obszarach z dużym ruchem, np. obok ruchliwych dróg na ścianie"
},
"11": {
"description": "Kawałek wodoodpornej tkaniny z nadrukowanym przesłaniem, trwale przymocowany do ściany",
"title": "plandeka"
},
"12": {
"title": "totem"
},
"13": {
"description": "Używany do znaków reklamowych, neonów, logo i znaków wejściowych do instytucji",
"title": "znak"
},
"14": {
"title": "rzeźba"
},
"15": {
"title": "mural ścienny"
},
"2": {
"title": "wolnostojąca skrzynka plakatowa"
},
@ -57,23 +74,6 @@
},
"9": {
"title": "ekran zamontowany na ścianie"
},
"11": {
"description": "Kawałek wodoodpornej tkaniny z nadrukowanym przesłaniem, trwale przymocowany do ściany",
"title": "plandeka"
},
"12": {
"title": "totem"
},
"13": {
"description": "Używany do znaków reklamowych, neonów, logo i znaków wejściowych do instytucji",
"title": "znak"
},
"14": {
"title": "rzeźba"
},
"15": {
"title": "mural ścienny"
}
},
"tagRenderings": {
@ -159,6 +159,9 @@
"1": {
"then": "To jest tablica"
},
"10": {
"then": "To jest mural ścienny"
},
"2": {
"then": "To jest kolumna"
},
@ -182,9 +185,6 @@
},
"9": {
"then": "To jest totem"
},
"10": {
"then": "To jest mural ścienny"
}
},
"question": "Jakiego rodzaju jest to obiekt reklamowy?",
@ -199,6 +199,9 @@
"1": {
"then": "Tablica"
},
"10": {
"then": "Mural ścienny"
},
"2": {
"then": "Pudełko plakatowe"
},
@ -222,9 +225,6 @@
},
"9": {
"then": "Totem"
},
"10": {
"then": "Mural ścienny"
}
}
}
@ -250,11 +250,11 @@
},
"type": {
"mappings": {
"4": {
"then": "Wyciąg orczykowy"
},
"10": {
"then": "Tyrolka. (Atrakcja turystyczna, która pozwala żądnym przygód zjechać z dużą szybkością) "
},
"4": {
"then": "Wyciąg orczykowy"
}
}
}
@ -384,6 +384,15 @@
"1": {
"then": "Mural"
},
"10": {
"then": "Azulejo (hiszpańskie płytka dekoracyjna)"
},
"11": {
"then": "Płyta ceramiczna (fliza)"
},
"12": {
"then": "Rzeźbienie w drewnie"
},
"2": {
"then": "Obraz"
},
@ -407,15 +416,6 @@
},
"9": {
"then": "Płaskorzeźba"
},
"10": {
"then": "Azulejo (hiszpańskie płytka dekoracyjna)"
},
"11": {
"then": "Płyta ceramiczna (fliza)"
},
"12": {
"then": "Rzeźbienie w drewnie"
}
},
"question": "Jakiego rodzaju jest to dzieło sztuki?",
@ -2229,27 +2229,6 @@
},
"room-type": {
"mappings": {
"2": {
"then": "To jest sypialnia"
},
"3": {
"then": "To jest kaplica"
},
"4": {
"then": "To jest sala klasowa"
},
"5": {
"then": "Jest to sala klasowa"
},
"6": {
"then": "To jest sala komputerowa"
},
"7": {
"then": "To jest sala konferencyjna"
},
"9": {
"then": "To jest kuchnia"
},
"10": {
"then": "To jest laboratorium"
},
@ -2268,6 +2247,9 @@
"18": {
"then": "To jest pomieszczenie do wykonywania kontroli bezpieczeństwa"
},
"2": {
"then": "To jest sypialnia"
},
"20": {
"then": "To jest magazyn"
},
@ -2279,6 +2261,24 @@
},
"23": {
"then": "To jest poczekalnia"
},
"3": {
"then": "To jest kaplica"
},
"4": {
"then": "To jest sala klasowa"
},
"5": {
"then": "Jest to sala klasowa"
},
"6": {
"then": "To jest sala komputerowa"
},
"7": {
"then": "To jest sala konferencyjna"
},
"9": {
"then": "To jest kuchnia"
}
},
"question": "Jakiego rodzaju jest to pomieszczenie?"
@ -2930,6 +2930,12 @@
"1": {
"then": "To jest zwykłe miejsce parkingowe."
},
"10": {
"then": "To jest miejsce parkingowe przeznaczone dla pracowników."
},
"11": {
"then": "To miejsce parkingowe jest przeznaczone dla taksówek."
},
"2": {
"then": "To jest miejsce parkingowe dla niepełnosprawnych."
},
@ -2947,12 +2953,6 @@
},
"9": {
"then": "To miejsce jest przeznaczone dla rodziców z dziećmi."
},
"10": {
"then": "To jest miejsce parkingowe przeznaczone dla pracowników."
},
"11": {
"then": "To miejsce parkingowe jest przeznaczone dla taksówek."
}
}
}
@ -3057,6 +3057,12 @@
"1": {
"then": "To jest struktura składająca się z wielu połączonych urządzeń"
},
"10": {
"then": "To jest tyrolka"
},
"15": {
"then": "To jest mapa"
},
"2": {
"then": "To jest zjeżdżalnia"
},
@ -3065,12 +3071,6 @@
},
"8": {
"then": "To jest rondo"
},
"10": {
"then": "To jest tyrolka"
},
"15": {
"then": "To jest mapa"
}
}
}

View file

@ -32,6 +32,23 @@
"description": "Uma grande estrutura de publicidade ao ar livre, normalmente encontrada em áreas de alto tráfego, como ao longo de estradas movimentadas",
"title": "um outdoor"
},
"11": {
"description": "Uma peça de tecido impermeável com uma mensagem impressa, permanentemente ancorada na parede",
"title": "uma lona"
},
"12": {
"title": "um totem"
},
"13": {
"description": "Usado para sinais publicitários, sinais de néon, logotipos e sinais de entrada institucionais",
"title": "um sinal"
},
"14": {
"title": "uma escultura"
},
"15": {
"title": "uma pintura de parede"
},
"2": {
"title": "uma caixa de pôster independente"
},
@ -54,23 +71,6 @@
},
"9": {
"title": "uma tela montada em uma parede"
},
"11": {
"description": "Uma peça de tecido impermeável com uma mensagem impressa, permanentemente ancorada na parede",
"title": "uma lona"
},
"12": {
"title": "um totem"
},
"13": {
"description": "Usado para sinais publicitários, sinais de néon, logotipos e sinais de entrada institucionais",
"title": "um sinal"
},
"14": {
"title": "uma escultura"
},
"15": {
"title": "uma pintura de parede"
}
},
"tagRenderings": {
@ -165,6 +165,9 @@
"1": {
"then": "Isso é uma placa"
},
"10": {
"then": "Isto é uma pintura mural"
},
"2": {
"then": "Isto é uma coluna"
},
@ -188,9 +191,6 @@
},
"9": {
"then": "Isto é um totem"
},
"10": {
"then": "Isto é uma pintura mural"
}
},
"question": "Que tipo de recurso de publicitário é este?",
@ -205,6 +205,9 @@
"1": {
"then": "Quadro"
},
"10": {
"then": "Pintura mural"
},
"2": {
"then": "Caixa de pôster"
},
@ -228,9 +231,6 @@
},
"9": {
"then": "Totem"
},
"10": {
"then": "Pintura mural"
}
}
}
@ -323,6 +323,15 @@
"1": {
"then": "Mural"
},
"10": {
"then": "Azulejo (azulejo decorativo espanhol e português)"
},
"11": {
"then": "Ladrilhos"
},
"12": {
"then": "Entalhe em madeira"
},
"2": {
"then": "Pintura"
},
@ -346,15 +355,6 @@
},
"9": {
"then": "Relevo"
},
"10": {
"then": "Azulejo (azulejo decorativo espanhol e português)"
},
"11": {
"then": "Ladrilhos"
},
"12": {
"then": "Entalhe em madeira"
}
},
"question": "Qual é o tipo desta obra de arte?",
@ -2005,9 +2005,6 @@
},
"vending": {
"mappings": {
"8": {
"then": "Câmaras de ar para bicicletas são vendidas aqui"
},
"23": {
"then": "Luzes para bicicleta são vendidas aqui"
},
@ -2022,6 +2019,9 @@
},
"27": {
"then": "Cadeados para bicicleta são vendidos aqui"
},
"8": {
"then": "Câmaras de ar para bicicletas são vendidas aqui"
}
}
}

View file

@ -32,6 +32,23 @@
"description": "Uma grande estrutura de publicidade outdoor, geralmente encontrada em áreas com alto tráfego, como ao longo de estradas movimentadas",
"title": "um outdoor"
},
"11": {
"description": "Um pedaço de tecido impermeável com uma mensagem impressa, permanentemente fixado a uma parede",
"title": "uma lona"
},
"12": {
"title": "um totem"
},
"13": {
"description": "Usado para placas de publicidade, letreiros de neon, logotipos e placas de entrada institucionais",
"title": "uma placa"
},
"14": {
"title": "uma escultura"
},
"15": {
"title": "uma pintura mural"
},
"2": {
"title": "uma caixa expositora independente"
},
@ -54,23 +71,6 @@
},
"9": {
"title": "uma tela montada em uma parede"
},
"11": {
"description": "Um pedaço de tecido impermeável com uma mensagem impressa, permanentemente fixado a uma parede",
"title": "uma lona"
},
"12": {
"title": "um totem"
},
"13": {
"description": "Usado para placas de publicidade, letreiros de neon, logotipos e placas de entrada institucionais",
"title": "uma placa"
},
"14": {
"title": "uma escultura"
},
"15": {
"title": "uma pintura mural"
}
},
"tagRenderings": {
@ -165,6 +165,9 @@
"1": {
"then": "Isso é uma placa"
},
"10": {
"then": "Isso é uma pintura mural"
},
"2": {
"then": "Isto é uma coluna"
},
@ -188,9 +191,6 @@
},
"9": {
"then": "Isso é um totem"
},
"10": {
"then": "Isso é uma pintura mural"
}
},
"question": "Que tipo de recurso de publicitário é este?",
@ -205,6 +205,9 @@
"1": {
"then": "Quadro"
},
"10": {
"then": "Pintura mural"
},
"2": {
"then": "Caixa de pôster"
},
@ -228,9 +231,6 @@
},
"9": {
"then": "Totem"
},
"10": {
"then": "Pintura mural"
}
}
}
@ -312,6 +312,15 @@
"1": {
"then": "Mural"
},
"10": {
"then": "Azulejo (Revestimento de azulejos decorativos espanhóis)"
},
"11": {
"then": "Azulejaria"
},
"12": {
"then": "Entalhe"
},
"2": {
"then": "Pintura"
},
@ -335,15 +344,6 @@
},
"9": {
"then": "Relevo"
},
"10": {
"then": "Azulejo (Revestimento de azulejos decorativos espanhóis)"
},
"11": {
"then": "Azulejaria"
},
"12": {
"then": "Entalhe"
}
},
"question": "Qual é o tipo dessa obra de arte?",
@ -1687,9 +1687,6 @@
},
"vending": {
"mappings": {
"8": {
"then": "Câmaras de ar para bicicletas são vendidas aqui"
},
"23": {
"then": "Luzes para bicicleta são vendidas aqui"
},
@ -1704,6 +1701,9 @@
},
"27": {
"then": "Cadeados para bicicleta são vendidos aqui"
},
"8": {
"then": "Câmaras de ar para bicicletas são vendidas aqui"
}
}
}

View file

@ -98,6 +98,12 @@
"1": {
"then": "Фреска"
},
"10": {
"then": "Азуле́жу (испанская роспись глазурованной керамической плитки)"
},
"11": {
"then": "Плитка (мозаика)"
},
"2": {
"then": "Живопись"
},
@ -121,12 +127,6 @@
},
"9": {
"then": "Рельеф"
},
"10": {
"then": "Азуле́жу (испанская роспись глазурованной керамической плитки)"
},
"11": {
"then": "Плитка (мозаика)"
}
},
"question": "К какому типу относится эта работа?",

View file

@ -152,18 +152,6 @@
"1": {
"then": "To je plošča"
},
"6": {
"then": "To je spominski kamen"
},
"7": {
"then": "To je doprsni kip"
},
"8": {
"then": "To je skulptura"
},
"9": {
"then": "To je obelisk"
},
"10": {
"then": "To je križ"
},
@ -175,6 +163,18 @@
},
"14": {
"then": "To je nagrobni kamen; oseba je pokopana tu"
},
"6": {
"then": "To je spominski kamen"
},
"7": {
"then": "To je doprsni kip"
},
"8": {
"then": "To je skulptura"
},
"9": {
"then": "To je obelisk"
}
},
"question": "Kakšne vrste spomenik je to?",

View file

@ -36,6 +36,26 @@
"description": "Велика зовнішня рекламна конструкція, зазвичай розташована в місцях з високим трафіком, наприклад, уздовж жвавих доріг, встановлена на стіні",
"title": "білборд, прикріплений до стіни"
},
"10": {
"title": "екран, встановлений на тимчасовому укритті"
},
"11": {
"description": "Шматок водонепроникного текстилю з надрукованим повідомленням, постійно закріплений на стіні",
"title": "брезент"
},
"12": {
"title": "тотем"
},
"13": {
"description": "Використовується для рекламних вивісок, неонових вивісок, логотипів та вхідних табличок установ",
"title": "знак"
},
"14": {
"title": "скульптура"
},
"15": {
"title": "настінний розпис"
},
"2": {
"title": "окремо стояча коробка для плакатів"
},
@ -61,26 +81,6 @@
},
"9": {
"title": "екран, встановлений на стіні"
},
"10": {
"title": "екран, встановлений на тимчасовому укритті"
},
"11": {
"description": "Шматок водонепроникного текстилю з надрукованим повідомленням, постійно закріплений на стіні",
"title": "брезент"
},
"12": {
"title": "тотем"
},
"13": {
"description": "Використовується для рекламних вивісок, неонових вивісок, логотипів та вхідних табличок установ",
"title": "знак"
},
"14": {
"title": "скульптура"
},
"15": {
"title": "настінний розпис"
}
},
"tagRenderings": {
@ -186,6 +186,12 @@
"1": {
"then": "Це дошка"
},
"10": {
"then": "Це настінний розпис"
},
"11": {
"then": "Це кахельна плитка - реклама намальована на плитці"
},
"2": {
"then": "Це стовпчик"
},
@ -209,12 +215,6 @@
},
"9": {
"then": "Це тотем"
},
"10": {
"then": "Це настінний розпис"
},
"11": {
"then": "Це кахельна плитка - реклама намальована на плитці"
}
},
"question": "Який це тип рекламного об'єкту?",
@ -229,11 +229,11 @@
"1": {
"then": "Дошка оголошень"
},
"2": {
"then": "Поштова скринька"
},
"10": {
"then": "Настінний розпис"
},
"2": {
"then": "Поштова скринька"
}
}
}
@ -262,6 +262,15 @@
"1": {
"then": "Мурал"
},
"10": {
"then": "Азулехо (іспанська декоративна плитка)"
},
"11": {
"then": "Кахельна плитка"
},
"12": {
"then": "Різьба по дереву"
},
"2": {
"then": "Живопис"
},
@ -285,15 +294,6 @@
},
"9": {
"then": "Рельєф"
},
"10": {
"then": "Азулехо (іспанська декоративна плитка)"
},
"11": {
"then": "Кахельна плитка"
},
"12": {
"then": "Різьба по дереву"
}
}
},
@ -508,6 +508,9 @@
"1": {
"then": "Стійка з бічними петлями"
},
"10": {
"then": "Кронштейн з можливістю використання замка через вушко. Підсідельна труба може утримуватися на стійці за допомогою анкера"
},
"3": {
"then": "Тримач керма"
},
@ -528,9 +531,6 @@
},
"9": {
"then": "Шафка - велосипеди зачиняються повністю індивідуально або разом з кількома велосипедами. Шафка замала, щоб у ній могла поміститися людина стоячи."
},
"10": {
"then": "Кронштейн з можливістю використання замка через вушко. Підсідельна труба може утримуватися на стійці за допомогою анкера"
}
},
"question": "Що це за тип велопарковки?",
@ -1292,6 +1292,9 @@
"1": {
"then": "Поверхня - <b>пісок</b>"
},
"10": {
"then": "Поверхня - <b>дрібний гравій</b> (менше 2 см на камінь)"
},
"2": {
"then": "Поверхня складається з <b>деревної стружки</b>"
},
@ -1315,9 +1318,6 @@
},
"9": {
"then": "Поверхня зроблена з гуми, наприклад, гумова плитка, гумова мульча або велика гумова площа"
},
"10": {
"then": "Поверхня - <b>дрібний гравій</b> (менше 2 см на камінь)"
}
},
"question": "Яка поверхня цього дитячого майданчика?",
@ -1588,27 +1588,6 @@
"1": {
"then": "Коробки з-під напоїв"
},
"2": {
"then": "Бляшанки"
},
"3": {
"then": "Одяг"
},
"4": {
"then": "Олія для приготування їжі"
},
"5": {
"then": "Моторна олива"
},
"6": {
"then": "Флуоресцентні лампи"
},
"7": {
"then": "Зелені відходи"
},
"9": {
"then": "Скляні пляшки"
},
"10": {
"then": "Скло"
},
@ -1639,6 +1618,9 @@
"19": {
"then": "Металобрухт"
},
"2": {
"then": "Бляшанки"
},
"20": {
"then": "Взуття"
},
@ -1653,6 +1635,24 @@
},
"25": {
"then": "Велосипеди"
},
"3": {
"then": "Одяг"
},
"4": {
"then": "Олія для приготування їжі"
},
"5": {
"then": "Моторна олива"
},
"6": {
"then": "Флуоресцентні лампи"
},
"7": {
"then": "Зелені відходи"
},
"9": {
"then": "Скляні пляшки"
}
},
"question": "Що тут можна переробити?"
@ -2337,30 +2337,6 @@
"1": {
"then": "Солодощі"
},
"2": {
"then": "Продукти харчування"
},
"3": {
"then": "Сигарети"
},
"4": {
"then": "Презервативи"
},
"5": {
"then": "Кава"
},
"6": {
"then": "Питна вода"
},
"7": {
"then": "Газети"
},
"8": {
"then": "Велосипедні внутрішні трубки"
},
"9": {
"then": "Молоко"
},
"10": {
"then": "Хліб"
},
@ -2391,6 +2367,9 @@
"19": {
"then": "Квіти"
},
"2": {
"then": "Продукти харчування"
},
"20": {
"then": "Паркувальні талони"
},
@ -2414,6 +2393,27 @@
},
"27": {
"then": "Велосипедні замки"
},
"3": {
"then": "Сигарети"
},
"4": {
"then": "Презервативи"
},
"5": {
"then": "Кава"
},
"6": {
"then": "Питна вода"
},
"7": {
"then": "Газети"
},
"8": {
"then": "Велосипедні внутрішні трубки"
},
"9": {
"then": "Молоко"
}
},
"question": "Що продає цей автомат?",

View file

@ -30,18 +30,6 @@
"0": {
"title": "一块广告牌"
},
"3": {
"title": "安装在墙上的海报盒子"
},
"7": {
"title": "一个旗子"
},
"8": {
"title": "一块屏幕"
},
"9": {
"title": "一块挂在墙上的屏幕"
},
"11": {
"title": "防水布"
},
@ -56,6 +44,18 @@
},
"15": {
"title": "墙上的画"
},
"3": {
"title": "安装在墙上的海报盒子"
},
"7": {
"title": "一个旗子"
},
"8": {
"title": "一块屏幕"
},
"9": {
"title": "一块挂在墙上的屏幕"
}
},
"tagRenderings": {
@ -150,6 +150,9 @@
"1": {
"then": "这是一块板"
},
"10": {
"then": "这是一幅壁画"
},
"2": {
"then": "这是一个专栏"
},
@ -173,9 +176,6 @@
},
"9": {
"then": "这是一个图腾"
},
"10": {
"then": "这是一幅壁画"
}
},
"question": "这是哪种类型的广告功能?",
@ -190,6 +190,9 @@
"1": {
"then": "木板"
},
"10": {
"then": "墙上的画"
},
"2": {
"then": "海报盒"
},
@ -210,9 +213,6 @@
},
"9": {
"then": "图腾"
},
"10": {
"then": "墙上的画"
}
}
}
@ -331,6 +331,9 @@
"1": {
"then": "壁画"
},
"10": {
"then": "Azulejo西班牙装饰瓷砖"
},
"2": {
"then": "喷绘"
},
@ -351,9 +354,6 @@
},
"8": {
"then": "涂鸦/粗糙雕刻"
},
"10": {
"then": "Azulejo西班牙装饰瓷砖"
}
}
}

View file

@ -56,6 +56,12 @@
"1": {
"then": "壁畫"
},
"10": {
"then": "Azulejo (西班牙雕塑作品名稱)"
},
"11": {
"then": "瓷磚"
},
"2": {
"then": "繪畫"
},
@ -79,12 +85,6 @@
},
"9": {
"then": "寬慰"
},
"10": {
"then": "Azulejo (西班牙雕塑作品名稱)"
},
"11": {
"then": "瓷磚"
}
},
"question": "這是什麼類型的藝術品?",

View file

@ -274,7 +274,8 @@
"importInspector": {
"title": "Inspiser og håndter importnotater"
},
"importLayer": {},
"importLayer": {
},
"index": {
"intro": "MapComplete er en OpenStreetMap-viser og redigerer, som viser deg info om funksjoner for et gitt tema og tillater oppdatering av det.",
"logIn": "Logg inn for å vise tema du har besøkt tidligere",
@ -369,7 +370,8 @@
"activateButton": "Bistå oversettelsen av MapComplete",
"missing": "{count} uoversatte strenger"
},
"userinfo": {},
"userinfo": {
},
"validation": {
"color": {
"description": "En farge eller heksadesimal kode"

View file

@ -53,7 +53,8 @@
"search": "ستھتیاں وچ کھوجو",
"searching": "کھوجیا جا رہا اے۔ ۔ ۔"
},
"sharescreen": {},
"sharescreen": {
},
"weekdays": {
"abbreviations": {
"friday": "جـ",

View file

@ -1 +1,2 @@
{}
{
}

View file

@ -731,6 +731,33 @@
"onwheels": {
"description": "En aquest mapa, es mostren llocs públics accessibles per a cadira de rodes i es poden afegir fàcilment",
"layers": {
"19": {
"override": {
"=title": {
"render": "Estadístiques"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importar"
}
}
},
"1": {
"render": {
"special": {
"message": "Afegiu totes les etiquetes suggerides"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -773,33 +800,6 @@
"override": {
"name": "Places d'aparcament per a minusvàlids"
}
},
"19": {
"override": {
"=title": {
"render": "Estadístiques"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importar"
}
}
},
"1": {
"render": {
"special": {
"message": "Afegiu totes les etiquetes suggerides"
}
}
}
}
}
}
},
"title": "Sobre rodes"
@ -919,10 +919,6 @@
"stations": {
"description": "Veure, editar i afegir detalls a una estació de tren",
"layers": {
"3": {
"description": "Capa que mostra les estacions de tren",
"name": "Estació de tren"
},
"16": {
"description": "Pantalles que mostren els trens que sortiran de l'estació",
"name": "Taulers de sortides",
@ -954,6 +950,10 @@
"title": {
"render": "Tauler de sortides"
}
},
"3": {
"description": "Capa que mostra les estacions de tren",
"name": "Estació de tren"
}
},
"title": "Estacions de tren"

View file

@ -769,6 +769,13 @@
}
}
},
"10": {
"options": {
"0": {
"question": "Vyloučit etymologii tématu"
}
}
},
"2": {
"options": {
"0": {
@ -824,13 +831,6 @@
"question": "Vyloučit motiv GRB"
}
}
},
"10": {
"options": {
"0": {
"question": "Vyloučit etymologii tématu"
}
}
}
},
"name": "Changeset centra",
@ -911,6 +911,33 @@
"onwheels": {
"description": "Na této mapě jsou zobrazena veřejně přístupná místa pro vozíčkáře, a lze je také snadno přidat",
"layers": {
"19": {
"override": {
"=title": {
"render": "Statistiky"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Dovoz"
}
}
},
"1": {
"render": {
"special": {
"message": "Přidat všechny navrhované značky"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -953,33 +980,6 @@
"override": {
"name": "Parkovací místa pro osoby se zdravotním postižením"
}
},
"19": {
"override": {
"=title": {
"render": "Statistiky"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Dovoz"
}
}
},
"1": {
"render": {
"special": {
"message": "Přidat všechny navrhované značky"
}
}
}
}
}
}
},
"title": "Na kolečkách"
@ -1202,10 +1202,6 @@
"stations": {
"description": "Zobrazení, úprava a přidání podrobností o vlakovém nádraží",
"layers": {
"3": {
"description": "Vrstva zobrazující vlaková nádraží",
"name": "Vlaková nádraží"
},
"16": {
"description": "Zobrazuje vlaky odjíždějící z této stanice",
"name": "Odjezdové tabule",
@ -1237,6 +1233,10 @@
"title": {
"render": "Odjezdová tabule"
}
},
"3": {
"description": "Vrstva zobrazující vlaková nádraží",
"name": "Vlaková nádraží"
}
},
"title": "Vlaková nádraží"

View file

@ -554,6 +554,33 @@
"onwheels": {
"description": "På dette kort vises steder, der er offentligt tilgængelige for kørestolsbrugere, og de kan nemt tilføjes",
"layers": {
"19": {
"override": {
"=title": {
"render": "Statistikker"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importere"
}
}
},
"1": {
"render": {
"special": {
"message": "Tilføj alle de foreslåede tags"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -596,33 +623,6 @@
"override": {
"name": "Handikapparkeringspladser"
}
},
"19": {
"override": {
"=title": {
"render": "Statistikker"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importere"
}
}
},
"1": {
"render": {
"special": {
"message": "Tilføj alle de foreslåede tags"
}
}
}
}
}
}
}
},
@ -734,9 +734,6 @@
},
"stations": {
"layers": {
"3": {
"name": "Togstationer"
},
"16": {
"name": "Afgangstavler",
"presets": {
@ -752,6 +749,9 @@
"title": {
"render": "Afgangstavle"
}
},
"3": {
"name": "Togstationer"
}
},
"title": "Togstationer"

View file

@ -769,6 +769,13 @@
}
}
},
"10": {
"options": {
"0": {
"question": "Etymologie-Thema ausschließen"
}
}
},
"2": {
"options": {
"0": {
@ -824,13 +831,6 @@
"question": "GRB-Thema ausschließen"
}
}
},
"10": {
"options": {
"0": {
"question": "Etymologie-Thema ausschließen"
}
}
}
},
"name": "Changeset-Zentren",
@ -911,6 +911,33 @@
"onwheels": {
"description": "Auf dieser Karte können Sie öffentlich zugängliche Orte für Rollstuhlfahrer ansehen, bearbeiten oder hinzufügen",
"layers": {
"19": {
"override": {
"=title": {
"render": "Statistik"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Alle vorgeschlagenen Tags hinzufügen"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -953,33 +980,6 @@
"override": {
"name": "Barrierefreie Parkplätze"
}
},
"19": {
"override": {
"=title": {
"render": "Statistik"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Alle vorgeschlagenen Tags hinzufügen"
}
}
}
}
}
}
},
"title": "Auf Rädern"
@ -1202,10 +1202,6 @@
"stations": {
"description": "Bahnhofsdetails ansehen, bearbeiten und hinzufügen",
"layers": {
"3": {
"description": "Ebene mit Bahnhöfen",
"name": "Bahnhöfe"
},
"16": {
"description": "Anzeigen der Züge, die von diesem Bahnhof abfahren",
"name": "Abfahrtstafeln",
@ -1237,6 +1233,10 @@
"title": {
"render": "Abfahrtstafel"
}
},
"3": {
"description": "Ebene mit Bahnhöfen",
"name": "Bahnhöfe"
}
},
"title": "Bahnhöfe"

View file

@ -778,6 +778,13 @@
}
}
},
"10": {
"options": {
"0": {
"question": "Exclude etymology theme"
}
}
},
"2": {
"options": {
"0": {
@ -833,13 +840,6 @@
"question": "Exclude GRB theme"
}
}
},
"10": {
"options": {
"0": {
"question": "Exclude etymology theme"
}
}
}
},
"name": "Changeset centers",
@ -920,6 +920,33 @@
"onwheels": {
"description": "On this map, publicly weelchair accessible places are shown and can be easily added",
"layers": {
"19": {
"override": {
"=title": {
"render": "Statistics"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Add all the suggested tags"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -962,33 +989,6 @@
"override": {
"name": "Disabled parking spaces"
}
},
"19": {
"override": {
"=title": {
"render": "Statistics"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Add all the suggested tags"
}
}
}
}
}
}
},
"title": "OnWheels"
@ -1211,10 +1211,6 @@
"stations": {
"description": "View, edit and add details to a train station",
"layers": {
"3": {
"description": "Layer showing train stations",
"name": "Train Stations"
},
"16": {
"description": "Displays showing the trains that will leave from this station",
"name": "Departures boards",
@ -1246,6 +1242,10 @@
"title": {
"render": "Departures board"
}
},
"3": {
"description": "Layer showing train stations",
"name": "Train Stations"
}
},
"title": "Train Stations"

View file

@ -769,6 +769,13 @@
}
}
},
"10": {
"options": {
"0": {
"question": "Excluir el tema de etimología"
}
}
},
"2": {
"options": {
"0": {
@ -824,13 +831,6 @@
"question": "Excluir el tema GRB"
}
}
},
"10": {
"options": {
"0": {
"question": "Excluir el tema de etimología"
}
}
}
},
"name": "Centros de conjuntos de cambios",
@ -911,6 +911,33 @@
"onwheels": {
"description": "En este mapa, se muestran y se pueden agregar fácilmente lugares accesibles para sillas de ruedas",
"layers": {
"19": {
"override": {
"=title": {
"render": "Estadísticas"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importar"
}
}
},
"1": {
"render": {
"special": {
"message": "Agregar todas las etiquetas sugeridas"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -953,33 +980,6 @@
"override": {
"name": "Plazas de estacionamiento para discapacitados"
}
},
"19": {
"override": {
"=title": {
"render": "Estadísticas"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importar"
}
}
},
"1": {
"render": {
"special": {
"message": "Agregar todas las etiquetas sugeridas"
}
}
}
}
}
}
},
"title": "Sobre ruedas"
@ -1202,10 +1202,6 @@
"stations": {
"description": "Ver, editar y agregar detalles a una estación de tren",
"layers": {
"3": {
"description": "Capa que muestra las estaciones de tren",
"name": "Estaciones de tren"
},
"16": {
"description": "Pantallas que muestran los trenes que saldrán de esta estación",
"name": "Tableros de salidas",
@ -1237,6 +1233,10 @@
"title": {
"render": "Tablero de salidas"
}
},
"3": {
"description": "Capa que muestra las estaciones de tren",
"name": "Estaciones de tren"
}
},
"title": "Estaciones de tren"

View file

@ -790,6 +790,33 @@
"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": {
@ -832,33 +859,6 @@
"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"
@ -1025,10 +1025,6 @@
"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",
@ -1060,6 +1056,10 @@
"title": {
"render": "Tableau des départs"
}
},
"3": {
"description": "Couche montrant les gares",
"name": "Gares ferroviaires"
}
},
"title": "Gares ferroviaires"

View file

@ -488,17 +488,17 @@
"onwheels": {
"description": "Su questa mappa sono indicati i luoghi pubblici accessibili con sedia a rotelle e possono essere facilmente aggiunti",
"layers": {
"8": {
"override": {
"name": "Parcheggi per disabili"
}
},
"19": {
"override": {
"=title": {
"render": "Statistiche"
}
}
},
"8": {
"override": {
"name": "Parcheggi per disabili"
}
}
}
},

View file

@ -355,19 +355,6 @@
},
"onwheels": {
"layers": {
"4": {
"override": {
"filter": {
"0": {
"options": {
"1": {
"question": "Uten breddeinfo"
}
}
}
}
}
},
"19": {
"override": {
"=title": {
@ -394,6 +381,19 @@
}
}
}
},
"4": {
"override": {
"filter": {
"0": {
"options": {
"1": {
"question": "Uten breddeinfo"
}
}
}
}
}
}
},
"title": "På hjul"
@ -473,10 +473,6 @@
},
"stations": {
"layers": {
"3": {
"description": "Lag som viser togstasjoner",
"name": "Togstasjoner"
},
"16": {
"tagRenderings": {
"type": {
@ -487,6 +483,10 @@
}
}
}
},
"3": {
"description": "Lag som viser togstasjoner",
"name": "Togstasjoner"
}
},
"title": "Togstasjoner"

View file

@ -653,8 +653,37 @@
"building type": {
"question": "Wat voor soort gebouw is dit?"
},
"grb-fixme": {
"mappings": {
"0": {
"then": "Geen fixme"
}
},
"question": "Wat zegt de fixme?",
"render": "De fixme is <b>{fixme}</b>"
},
"grb-housenumber": {
"mappings": {
"0": {
"then": "Geen huisnummer"
}
},
"question": "Wat is het huisnummer?",
"render": "Het huisnummer is <b>{addr:housenumber}</b>"
},
"grb-min-level": {
"question": "Hoeveel verdiepingen ontbreken?",
"render": "Dit gebouw begint maar op de {building:min_level} verdieping"
},
"grb-reference": {
"render": "Werd geïmporteerd vanuit GRB, het referentienummer is {source:geometry:ref}"
},
"grb-street": {
"question": "Wat is de straat?",
"render": "De straat is <b>{addr:street}</b>"
},
"grb-unit": {
"render": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
}
}
},
@ -671,9 +700,36 @@
}
}
}
},
"5": {
"override": {
"tagRenderings+": {
"0": {
"mappings": {
"0": {
"then": "Geen omliggend OSM-gebouw gevonden"
}
}
},
"3": {
"mappings": {
"0": {
"then": "Geen omliggend OSM-gebouw gevonden. Een omliggend gebouw is nodig om dit punt als adres punt toe te voegen. <div class=subtle>Importeer eerst de gebouwen. Vernieuw dan de pagina om losse adressen toe te voegen</div>"
}
},
"render": {
"special": {
"text": "Voeg dit adres als een nieuw adrespunt toe"
}
}
}
}
}
}
},
"shortDescription": "Grb import helper tool",
"title": "GRB import helper"
},
"guideposts": {
"description": "Wegwijzers (ook wel handwijzer genoemd) zijn vaak te vinden langs officiële wandel-, fiets-, ski- of paardrijroutes om de richtingen naar verschillende bestemmingen aan te geven. Vaak zijn ze vernoemd naar een regio of plaats en geven ze de hoogte aan.\n\nDe positie van een wegwijzer kan door een wandelaar/fietser/renner/skiër worden gebruikt als bevestiging van de huidige positie, vooral als ze een gedrukte kaart zonder GPS-ontvanger gebruiken. ",
"title": "Wegwijzers"
@ -773,6 +829,13 @@
}
}
},
"10": {
"options": {
"0": {
"question": "Thema etymologie uitsluiten"
}
}
},
"2": {
"options": {
"0": {
@ -828,13 +891,6 @@
"question": "GRB-thema uitsluiten"
}
}
},
"10": {
"options": {
"0": {
"question": "Thema etymologie uitsluiten"
}
}
}
},
"name": "Changeset centra",
@ -915,6 +971,33 @@
"onwheels": {
"description": "Op deze kaart kan je rolstoeltoegankelijke plaatsen vinden en toevoegen",
"layers": {
"19": {
"override": {
"=title": {
"render": "Statistieken"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importeren"
}
}
},
"1": {
"render": {
"special": {
"message": "Voeg alle gesuggereerde tags toe"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -957,33 +1040,6 @@
"override": {
"name": "Parkeerplaatsen voor personen met een beperking"
}
},
"19": {
"override": {
"=title": {
"render": "Statistieken"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importeren"
}
}
},
"1": {
"render": {
"special": {
"message": "Voeg alle gesuggereerde tags toe"
}
}
}
}
}
}
},
"title": "OnWheels"
@ -1108,6 +1164,11 @@
},
"title": "Dierenartsen, hondenloopzones en andere huisdiervriendelijke plaatsen"
},
"play_forests": {
"description": "Een speelbos is een zone in een bos die vrij toegankelijk is voor spelende kinderen. Deze wordt in bossen van het Agentschap Natuur en bos altijd aangeduid met het overeenkomstige bord.",
"shortDescription": "Deze kaart toont speelbossen",
"title": "Speelbossen"
},
"playgrounds": {
"description": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen",
"shortDescription": "Een kaart met speeltuinen",
@ -1181,6 +1242,47 @@
"description": "Alles om te skiën",
"title": "Skipistes en kabelbanen"
},
"speelplekken": {
"description": "<h3>Welkom bij de Groendoener!</h3>De Zuidrand dat is spelen, ravotten, chillen, wandelen,… in het groen. Meer dan <b>200 grote en kleine speelplekken</b> liggen er in parken, in bossen en op pleintjes te wachten om ontdekt te worden. De verschillende speelplekken werden getest én goedgekeurd door kinder- en jongerenreporters uit de Zuidrand. Met leuke challenges dagen de reporters jou uit om ook op ontdekking te gaan. Klik op een speelplek op de kaart, bekijk het filmpje en ga op verkenning!<br/><br/>Het project groendoener kadert binnen het strategisch project <a href='https://www.provincieantwerpen.be/aanbod/dlm/samenwerkingsverbanden/zuidrand/projecten/strategisch-project-beleefbare-open-ruimte.html' target='_blank'>Beleefbare Open Ruimte in de Antwerpse Zuidrand</a> en is een samenwerking tussen het departement Leefmilieu van provincie Antwerpen, Sportpret vzw, een OpenStreetMap-België Consultent en Createlli vzw. Het project kwam tot stand met steun van Departement Omgeving van de Vlaamse Overheid.<br/><img class='w-full md:w-1/2' src='./assets/themes/speelplekken/provincie_antwerpen.jpg'/><img class='w-full md:w-1/2' src='./assets/themes/speelplekken/Departement_Omgeving_Vlaanderen.png'/>",
"layers": {
"6": {
"name": "Wandelroutes van provincie Antwerpen",
"tagRenderings": {
"walk-description": {
"render": "<h3>Korte beschrijving:</h3>{description}"
},
"walk-length": {
"render": "Deze wandeling is <b>{_length:km}km</b> lang"
},
"walk-operator": {
"question": "Wie beheert deze wandeling en plaatst dus de signalisatiebordjes?"
},
"walk-operator-email": {
"question": "Naar wie kan men emailen bij problemen rond signalisatie?",
"render": "Bij problemen met signalisatie kan men emailen naar <a href='mailto:{operator:email}'>{operator:email}</a>"
},
"walk-type": {
"mappings": {
"0": {
"then": "Dit is een internationale wandelroute"
},
"1": {
"then": "Dit is een nationale wandelroute"
},
"2": {
"then": "Dit is een regionale wandelroute"
},
"3": {
"then": "Dit is een lokale wandelroute"
}
}
}
}
}
},
"shortDescription": "Speelplekken in de Antwerpse Zuidrand",
"title": "Welkom bij de groendoener!"
},
"sport_pitches": {
"description": "Een sportveld is een ingerichte plaats met infrastructuur om een sport te beoefenen",
"shortDescription": "Deze kaart toont sportvelden",
@ -1206,10 +1308,6 @@
"stations": {
"description": "Bekijk, bewerk en voeg details to aan een treinstation",
"layers": {
"3": {
"description": "Laag met treinstations",
"name": "Treinstations"
},
"16": {
"description": "Schermen die treinen tonen die van dit station vertrekken",
"name": "Vertrektijdenborden",
@ -1241,6 +1339,10 @@
"title": {
"render": "Vertrektijdenbord"
}
},
"3": {
"description": "Laag met treinstations",
"name": "Treinstations"
}
},
"title": "Treinstations"
@ -1301,6 +1403,10 @@
},
"title": "Straatverlichting"
},
"street_lighting_assen": {
"description": "Op deze kaart vind je alles over straatlantaarns + een dataset van Assen",
"title": "Straatverlichting - Assen"
},
"surveillance": {
"description": "Op deze open kaart kan je bewakingscamera's vinden.",
"shortDescription": "Bewakingscameras en dergelijke",
@ -1414,6 +1520,10 @@
"description": "Kaart met afvalbakken en recyclingfaciliteiten.",
"title": "Afval"
},
"waste_assen": {
"description": "Kaart met afvalbakken en recyclingfaciliteiten + een dataset voor Assen.",
"title": "Afval - Assen"
},
"waste_basket": {
"description": "Op deze kaart vind je afvalbakken bij jou in de buurt. Als er een afvalbak ontbreekt op deze kaart, kun je deze zelf toevoegen",
"shortDescription": "Een kaart met vuilnisbakken",

View file

@ -710,6 +710,33 @@
"onwheels": {
"description": "Na tej mapie pokazane są miejsca publicznie dostępne dla wózków inwalidzkich, które można łatwo dodać",
"layers": {
"19": {
"override": {
"=title": {
"render": "Statystyki"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Dodaj wszystkie sugerowane znaczniki"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -752,33 +779,6 @@
"override": {
"name": "Miejsca parkingowe dla niepełnosprawnych"
}
},
"19": {
"override": {
"=title": {
"render": "Statystyki"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Dodaj wszystkie sugerowane znaczniki"
}
}
}
}
}
}
},
"title": "Na kółkach"
@ -898,10 +898,6 @@
"stations": {
"description": "Przeglądaj, edytuj i dodawaj szczegóły do stacji kolejowej",
"layers": {
"3": {
"description": "Warstwa pokazująca stacje kolejowe",
"name": "Stacje Kolejowe"
},
"16": {
"description": "Ekrany wyświetlające pokazujące pociągi, które odjadą z tej stacji",
"name": "Tablice odjazdów",
@ -933,6 +929,10 @@
"title": {
"render": "Tablica odjazdów"
}
},
"3": {
"description": "Warstwa pokazująca stacje kolejowe",
"name": "Stacje Kolejowe"
}
},
"title": "Stacje Kolejowe"

View file

@ -366,10 +366,6 @@
},
"stations": {
"layers": {
"3": {
"description": "顯示火車站的圖層",
"name": "火車站"
},
"16": {
"name": "出發板",
"presets": {
@ -390,6 +386,10 @@
"title": {
"render": "時刻表"
}
},
"3": {
"description": "顯示火車站的圖層",
"name": "火車站"
}
},
"title": "火車站"

View file

@ -532,7 +532,8 @@
}
}
},
"importLayer": {},
"importLayer": {
},
"index": {
"about": "Про MapComplete",
"intro": "Тематичні мапи, до створення яких ви можете долучитися",
@ -591,7 +592,8 @@
"removedKeys": "Наступні ключі будуть видалені:",
"title": "Позначити як невідомий?"
},
"userinfo": {},
"userinfo": {
},
"validation": {
"opening_hours": {
"description": "Години роботи"

View file

@ -175,6 +175,7 @@
"donate": "財務上支援 MapComplete",
"editId": "開啟開放街圖線上編輯器",
"editJosm": "採用 JOSM 編輯",
"emailCreators": "寄 email 給創作者",
"followOnMastodon": "在 Mastodon 追蹤 MapComplete",
"gotoSourceCode": "檢視原始碼",
"iconAttribution": {
@ -182,6 +183,7 @@
},
"josmNotOpened": "無法連到 JOSM請確認 JOSM 已經開啟並且啟用遠端控制選項",
"josmOpened": "已經開啟 JOSM",
"madeBy": "由<b>{author}</b>製作",
"mapContributionsBy": "目前檢視的資料由 {contributors} 貢獻編輯",
"mapContributionsByAndHidden": "目前顯到的資料是由 {contributors} 和其他 {hiddenCount} 位貢獻者編輯貢獻",
"mapillaryHelp": "線上服務 <b>Mapillary</b> 能夠以開放授權提供收集到的街景照片。貢獻者能夠採用 Mapillary 照片來改進開放街圖",
@ -189,14 +191,12 @@
"openMapillary": "開啟 Mapillary",
"openOsmcha": "請見 {theme} 的最新編輯",
"openOsmchaLastWeek": "檢視最近 7 天的編輯",
"openPanoramax": "在這邊開啟 Panoramax",
"openThemeDocumentation": "開啟專題地圖 {name} 的文件",
"seeOnMapillary": "在 Mapillary 觀看這張影像",
"themeBy": "由 {author} 維護主題",
"title": "版權與署名",
"translatedBy": "MapComplete 由 {contributors} 翻譯,而且還有 <a href=\"https://github.com/pietervdvn/MapComplete/graphs/contributors\" target=\"_blank\">{hiddenCount} 更多貢獻者</a>",
"emailCreators": "寄 email 給創作者",
"madeBy": "由<b>{author}</b>製作",
"openPanoramax": "在這邊開啟 Panoramax"
"translatedBy": "MapComplete 由 {contributors} 翻譯,而且還有 <a href=\"https://github.com/pietervdvn/MapComplete/graphs/contributors\" target=\"_blank\">{hiddenCount} 更多貢獻者</a>"
},
"back": "返回",
"backToIndex": "回到所有主題地圖的總覽頁面",

View file

@ -1324,20 +1324,20 @@ input[type="range"].range-lg::-moz-range-thumb {
margin: 0px;
}
.m-8 {
margin: 2rem;
.m-1 {
margin: 0.25rem;
}
.m-2 {
margin: 0.5rem;
}
.m-0\.5 {
margin: 0.125rem;
.m-8 {
margin: 2rem;
}
.m-1 {
margin: 0.25rem;
.m-0\.5 {
margin: 0.125rem;
}
.m-11 {
@ -1698,14 +1698,14 @@ input[type="range"].range-lg::-moz-range-thumb {
height: 6rem;
}
.h-screen {
height: 100vh;
}
.h-full {
height: 100%;
}
.h-screen {
height: 100vh;
}
.h-fit {
height: -webkit-fit-content;
height: -moz-fit-content;
@ -2028,6 +2028,10 @@ input[type="range"].range-lg::-moz-range-thumb {
width: max-content;
}
.w-48 {
width: 12rem;
}
.w-auto {
width: auto;
}
@ -2121,10 +2125,6 @@ input[type="range"].range-lg::-moz-range-thumb {
width: 0.25rem;
}
.w-48 {
width: 12rem;
}
.w-9\/12 {
width: 75%;
}
@ -2244,14 +2244,14 @@ input[type="range"].range-lg::-moz-range-thumb {
flex: 1 1 0%;
}
.flex-shrink {
flex-shrink: 1;
}
.flex-shrink-0 {
flex-shrink: 0;
}
.flex-shrink {
flex-shrink: 1;
}
.shrink-0 {
flex-shrink: 0;
}
@ -2509,6 +2509,10 @@ input[type="range"].range-lg::-moz-range-thumb {
row-gap: 0.25rem;
}
.gap-x-2 {
column-gap: 0.5rem;
}
.gap-y-2 {
row-gap: 0.5rem;
}
@ -2517,10 +2521,6 @@ input[type="range"].range-lg::-moz-range-thumb {
row-gap: 1rem;
}
.gap-x-2 {
column-gap: 0.5rem;
}
.gap-x-1 {
column-gap: 0.25rem;
}
@ -3045,11 +3045,6 @@ input[type="range"].range-lg::-moz-range-thumb {
border-color: rgb(107 114 128 / var(--tw-border-opacity));
}
.border-subtle {
--tw-border-opacity: 1;
border-color: rgb(219 234 254 / var(--tw-border-opacity));
}
.border-black {
--tw-border-opacity: 1;
border-color: rgb(0 0 0 / var(--tw-border-opacity));
@ -3065,6 +3060,11 @@ input[type="range"].range-lg::-moz-range-thumb {
border-color: rgb(209 213 219 / var(--tw-border-opacity));
}
.border-gray-600 {
--tw-border-opacity: 1;
border-color: rgb(75 85 99 / var(--tw-border-opacity));
}
.border-gray-800 {
--tw-border-opacity: 1;
border-color: rgb(31 41 55 / var(--tw-border-opacity));
@ -4045,18 +4045,14 @@ input[type="range"].range-lg::-moz-range-thumb {
padding-bottom: 0.75rem;
}
.pl-4 {
padding-left: 1rem;
.pt-2 {
padding-top: 0.5rem;
}
.pr-4 {
padding-right: 1rem;
}
.pt-2 {
padding-top: 0.5rem;
}
.pl-1 {
padding-left: 0.25rem;
}
@ -5067,6 +5063,8 @@ input[type="range"].range-lg::-moz-range-thumb {
@font-face {
font-family: "Source Sans Pro";
/*This path might seem incorrect. However, 'index.css' will be compiled and placed in 'public/css', from where this path _is_ correct*/
src: url("../assets/fonts/source-sans-pro.regular.ttf") format("woff");
}

View file

@ -1,16 +1,26 @@
#! /bin/bash
# Creates the build for just a single theme
export NODE_OPTIONS="--max-old-space-size=12000"
THEME=$1
npm run generate:layouts
if [ $# -eq 0 ]
then
echo "No arguments given. Expected a themename"
fi
pwd
if [ -f "$THEME.html" ]
npm run prep:layeroverview
npm run refresh:layeroverview
npm run generate:layeroverview
npm run test
npm run generate:layouts
if [[ -f "$THEME.html" ]]
then
echo "$THEME.html found."
else
echo "Theme '$THEME' not found. Did you run 'npm run generate:layouts'?"
pwd
ls
echo "Theme '$THEME' not found. Did you run 'npm run generate:layouts'? Is the theme name correct?"
exit 1
fi
@ -33,14 +43,10 @@ sed -i "s/input,/input: {index:\".\/index.html\", land: \".\/land.html\"}/" vite
sed -i "s/\/\/ LAYOUT.ADD_CONFIG/layout.enableMoreQuests = false/" index_"$THEME".ts
export NODE_OPTIONS=--max-old-space-size=20000
vite build --sourcemap --config vite_single.config.js || { echo 'Vite build failed' ; exit 1; }
cp -r assets/layers/ dist/assets/layers/
cp -r assets/themes/ dist/assets/themes/
cp -r assets/svg/ dist/assets/svg/
@ -69,7 +75,6 @@ pwd
ls .
for f in *
do
# echo ">>>" $f
case "$f" in
*$THEME* )
echo "Keeping $f"
@ -91,38 +96,9 @@ then
fi
npm run clean
echo "BUILD COMPLETED"
if [ $# -eq 2 ]
then
echo "DEPLOY TO $2"
if [ -f "$2"/CNAME ]
then
CNAME=$(cat "$2"/CNAME)
echo "Found a CNAME"
fi
echo "Assuming github pages, add \".nojekyll\""
touch $2/.nojekyll
echo $CNAME > $2/CNAME
rm -r "$2/assets/*"
echo " ! Don't forget to add `https://$CNAME/land.html` to the Redirect URIs on https://www.openstreetmap.org/oauth2/applications/"
cp -r "dist_$THEME/"* "$2"/
if [ -d "$2"/.git ]
then
cd $2
git add *
git commit -m "Add new version of MapComplete with single-page build of $THEME"
git push
cd -
fi
rm -r "dist_$THEME"
else
echo "BUILD COMPLETED"
echo "On what domain will you deploy?"
echo " ! Don't forget to add `https://yourdomain.tld/land.html` to the Redirect URIs on https://www.openstreetmap.org/oauth2/applications/"
echo "Deploying on github pages?"
echo " 1. Don't forget to add a CNAME file (containing your domain name verbatim, without protocol)"
echo " 2 .nojekyll file (which is empty)"
fi

View file

@ -2,17 +2,18 @@ import Script from "../Script"
import fs from "fs"
import LinkedDataLoader from "../../src/Logic/Web/LinkedDataLoader"
import { Utils } from "../../src/Utils"
import { Feature } from "geojson"
import { Feature, FeatureCollection, Point } from "geojson"
import { BBox } from "../../src/Logic/BBox"
import { Overpass } from "../../src/Logic/Osm/Overpass"
import { RegexTag } from "../../src/Logic/Tags/RegexTag"
import { ImmutableStore } from "../../src/Logic/UIEventSource"
import Constants from "../../src/Models/Constants"
import { MaprouletteStatus } from "../../src/Logic/Maproulette"
class VeloParkToGeojson extends Script {
constructor() {
super(
"Downloads the latest Velopark data and converts it to a geojson, which will be saved at the current directory"
"Downloads the latest Velopark data and converts it to a geojson, which will be saved at the current directory",
)
}
@ -28,8 +29,8 @@ class VeloParkToGeojson extends Script {
}
: features,
null,
" "
)
" ",
),
)
console.log("Written", file, "(" + features.length, " features)")
}
@ -44,12 +45,15 @@ class VeloParkToGeojson extends Script {
const linkedData = await LinkedDataLoader.fetchVeloparkEntry(url)
const allVelopark: Feature[] = []
if (linkedData.length > 1) {
console.log("Detected multiple sections in:", url)
}
for (const sectionId in linkedData) {
const sectionInfo = linkedData[sectionId]
if (Object.keys(sectionInfo).length === 0) {
console.warn("No result for", url)
}
if (!sectionInfo.geometry?.coordinates) {
if (!sectionInfo.geometry?.["coordinates"]) {
throw "Invalid properties!"
}
allVelopark.push(sectionInfo)
@ -62,8 +66,8 @@ class VeloParkToGeojson extends Script {
console.log("Downloading velopark data")
// Download data for NIS-code 1000. 1000 means: all of belgium
const url = "https://www.velopark.be/api/parkings/1000"
const allVeloparkRaw: { url: string }[] = <{ url: string }[]>await Utils.downloadJson(url)
const allVeloparkRaw= (await Utils.downloadJson<{ url: string }[]>(url))
// Example multi-entry: https://data.velopark.be/data/Stad-Izegem_IZE_015
let failed = 0
console.log("Got", allVeloparkRaw.length, "items")
const allVelopark: Feature[] = []
@ -82,14 +86,15 @@ class VeloParkToGeojson extends Script {
console.error("Loading ", f.url, " failed due to", e)
failed++
}
})
}),
)
console.log("Batch complete:", i)
}
console.log(
"Fetching data done, got ",
allVelopark.length + "/" + allVeloparkRaw.length,
"failed:",
failed
failed,
)
VeloParkToGeojson.exportGeojsonTo("velopark_all", allVelopark)
@ -135,7 +140,37 @@ class VeloParkToGeojson extends Script {
}
}
private static async fetchMapRouletteClosedItems() {
const challenges = ["https://maproulette.org/api/v2/challenge/view/43282"]
const solvedRefs: Set<string> = new Set<string>();
for (const url of challenges) {
const data = await Utils.downloadJson<FeatureCollection<Point, {
"mr_taskId": string,
"ref:velopark": string,
mr_taskStatus: MaprouletteStatus,
mr_responses: string | undefined
}>>(url)
for (const challenge of data.features) {
const status = challenge.properties.mr_taskStatus
const isClosed = status === "Fixed" || status === "False_positive" || status === "Already fixed" || status === "Too_Hard" || status === "Deleted"
if(isClosed){
const ref = challenge.properties["ref:velopark"]
solvedRefs .add(ref)
}
}
}
console.log("Detected", solvedRefs,"as closed on mapRoulette")
return solvedRefs
}
/**
* Creates an extra version where all bicycle parkings which are already linked are removed.
* Fetches the latest OSM-data from overpass
* @param allVelopark
* @private
*/
private static async createDiff(allVelopark: Feature[]) {
console.log("Creating diff...")
const bboxBelgium = new BBox([
[2.51357303225, 49.5294835476],
[6.15665815596, 51.4750237087],
@ -146,42 +181,71 @@ class VeloParkToGeojson extends Script {
[],
Constants.defaultOverpassUrls[0],
new ImmutableStore(60 * 5),
false
false,
)
const alreadyLinkedFeatures = (await alreadyLinkedQuery.queryGeoJson(bboxBelgium))[0]
const seenIds = new Set<string>(
alreadyLinkedFeatures.features.map((f) => f.properties?.["ref:velopark"])
alreadyLinkedFeatures.features.map((f) => f.properties?.["ref:velopark"]),
)
this.exportGeojsonTo("osm_with_velopark_link", <Feature[]>alreadyLinkedFeatures.features)
console.log("OpenStreetMap contains", seenIds.size, "bicycle parkings with a velopark ref")
const features: Feature[] = allVelopark.filter(
(f) => !seenIds.has(f.properties["ref:velopark"])
(f) => !seenIds.has(f.properties["ref:velopark"]),
)
VeloParkToGeojson.exportGeojsonTo("velopark_nonsynced", features)
const synced =await this.fetchMapRouletteClosedItems()
const featuresMoreFiltered = features.filter(
(f) => !synced.has(f.properties["ref:velopark"])
)
VeloParkToGeojson.exportGeojsonTo("velopark_nonsynced_nonclosed", featuresMoreFiltered)
const featuresMoreFilteredFailed = features.filter(
(f) => synced.has(f.properties["ref:velopark"])
)
VeloParkToGeojson.exportGeojsonTo("velopark_nonsynced_human_import_failed", featuresMoreFilteredFailed)
const allProperties = new Set<string>()
for (const feature of features) {
Object.keys(feature).forEach((k) => allProperties.add(k))
for (const feature of featuresMoreFiltered) {
Object.keys(feature.properties).forEach((k) => allProperties.add(k))
}
allProperties.delete("ref:velopark")
for (const feature of features) {
for (const feature of featuresMoreFiltered) {
allProperties.forEach((k) => {
delete feature[k]
if(k === "ref:velopark"){
return
}
delete feature.properties[k]
})
}
this.exportGeojsonTo("velopark_nonsynced_id_only", features)
this.exportGeojsonTo("velopark_nonsynced_nonclosed_id_only", featuresMoreFiltered)
}
public static async findMultiSection(): Promise<string[]> {
const url = "https://www.velopark.be/api/parkings/1000"
const raw = await Utils.downloadJson<{"@graph": {}[], url: string}[]>(url)
const multiEntries: string[] = []
for (const entry of raw) {
if(entry["@graph"].length > 1){
multiEntries.push(entry.url)
}
}
return multiEntries
}
async main(): Promise<void> {
// const multiEntries = new Set(await VeloParkToGeojson.findMultiSection())
const allVelopark =
VeloParkToGeojson.loadFromFile() ?? (await VeloParkToGeojson.downloadData())
console.log("Got", allVelopark.length, " items")
VeloParkToGeojson.exportExtraAmenities(allVelopark)
await VeloParkToGeojson.createDiff(allVelopark)
console.log(
"Use vite-node scripts/velopark/compare.ts to compare the results and generate a diff file"
"Use vite-node scripts/velopark/compare.ts to compare the results and generate a diff file",
)
}
}

View file

@ -8,10 +8,11 @@ import { FeatureSource, WritableFeatureSource } from "../FeatureSource/FeatureSo
import { LocalStorageSource } from "../Web/LocalStorageSource"
import { GeoOperations } from "../GeoOperations"
import { OsmTags } from "../../Models/OsmFeature"
import StaticFeatureSource from "../FeatureSource/Sources/StaticFeatureSource"
import StaticFeatureSource, { WritableStaticFeatureSource } from "../FeatureSource/Sources/StaticFeatureSource"
import { MapProperties } from "../../Models/MapProperties"
import { Orientation } from "../../Sensors/Orientation"
"use strict"
/**
* The geolocation-handler takes a map-location and a geolocation state.
* It'll move the map as appropriate given the state of the geolocation-API
@ -43,13 +44,13 @@ export default class GeoLocationHandler {
public readonly mapHasMoved: UIEventSource<Date | undefined> = new UIEventSource<
Date | undefined
>(undefined)
private readonly selectedElement: UIEventSource<any>
private readonly selectedElement: UIEventSource<Feature>
private readonly mapProperties?: MapProperties
private readonly gpsLocationHistoryRetentionTime?: UIEventSource<number>
constructor(
geolocationState: GeoLocationState,
selectedElement: UIEventSource<any>,
selectedElement: UIEventSource<Feature>,
mapProperties?: MapProperties,
gpsLocationHistoryRetentionTime?: UIEventSource<number>
) {
@ -59,13 +60,12 @@ export default class GeoLocationHandler {
this.mapProperties = mapProperties
this.gpsLocationHistoryRetentionTime = gpsLocationHistoryRetentionTime
// Did an interaction move the map?
let self = this
let initTime = new Date()
mapLocation.addCallbackD((_) => {
const initTime = new Date()
mapLocation.addCallbackD(() => {
if (new Date().getTime() - initTime.getTime() < 250) {
return
}
self.mapHasMoved.setData(new Date())
this.mapHasMoved.setData(new Date())
return true // Unsubscribe
})
@ -76,12 +76,12 @@ export default class GeoLocationHandler {
this.mapHasMoved.setData(new Date())
}
this.geolocationState.currentGPSLocation.addCallbackAndRunD((_) => {
this.geolocationState.currentGPSLocation.addCallbackAndRunD(() => {
const timeSinceLastRequest =
(new Date().getTime() - geolocationState.requestMoment.data?.getTime() ?? 0) / 1000
if (!this.mapHasMoved.data) {
// The map hasn't moved yet; we received our first coordinates, so let's move there!
self.MoveMapToCurrentLocation()
this.MoveMapToCurrentLocation()
}
if (
timeSinceLastRequest < Constants.zoomToLocationTimeout &&
@ -90,12 +90,12 @@ export default class GeoLocationHandler {
geolocationState.requestMoment.data?.getTime())
) {
// still within request time and the map hasn't moved since requesting to jump to the current location
self.MoveMapToCurrentLocation()
this.MoveMapToCurrentLocation()
}
if (!this.geolocationState.allowMoving.data) {
// Jup, the map is locked to the bound location: move automatically
self.MoveMapToCurrentLocation(0)
this.MoveMapToCurrentLocation(0)
return
}
})
@ -183,7 +183,7 @@ export default class GeoLocationHandler {
}
private initUserLocationTrail() {
const features = LocalStorageSource.getParsed<Feature[]>("gps_location_history", [])
const features = LocalStorageSource.getParsed<Feature<Point>[]>("gps_location_history", [])
const now = new Date().getTime()
features.data = features.data.filter((ff) => {
if (ff.properties === undefined) {
@ -230,7 +230,7 @@ export default class GeoLocationHandler {
features.ping()
})
this.historicalUserLocations = <any>new StaticFeatureSource(features)
this.historicalUserLocations = new WritableStaticFeatureSource<Feature<Point>>(features)
const asLine = features.map((allPoints) => {
if (allPoints === undefined || allPoints.length < 2) {

View file

@ -4,10 +4,12 @@ import { LocalStorageSource } from "../Web/LocalStorageSource"
import { QueryParameters } from "../Web/QueryParameters"
import Hash from "../Web/Hash"
import OsmObjectDownloader from "../Osm/OsmObjectDownloader"
import { OsmObject } from "../Osm/OsmObject"
import Constants from "../../Models/Constants"
import { Utils } from "../../Utils"
import { GeoLocationState } from "../State/GeoLocationState"
import { OsmConnection } from "../Osm/OsmConnection"
"use strict"
/**
* This actor is responsible to set the map location.
@ -25,7 +27,7 @@ export default class InitialMapPositioning {
public location: UIEventSource<{ lon: number; lat: number }>
public useTerrain: Store<boolean>
constructor(layoutToUse: ThemeConfig, geolocationState: GeoLocationState) {
constructor(layoutToUse: ThemeConfig, geolocationState: GeoLocationState, osmConnection: OsmConnection) {
function localStorageSynced(
key: string,
deflt: number,
@ -47,7 +49,6 @@ export default class InitialMapPositioning {
return src
}
const initialHash = Hash.hash.data
// -- Location control initialization
this.zoom = localStorageSynced(
@ -72,6 +73,7 @@ export default class InitialMapPositioning {
})
this.useTerrain = new ImmutableStore<boolean>(layoutToUse.enableTerrain)
const initialHash = Hash.hash.data
if (initialHash?.match(/^(node|way|relation)\/[0-9]+$/)) {
// We pan to the selected element
const [type, id] = initialHash.split("/")
@ -88,6 +90,17 @@ export default class InitialMapPositioning {
const [lat, lon] = osmObject.centerpoint()
this.location.setData({ lon, lat })
})
} else if (layoutToUse.id === "notes" && initialHash?.match(/[0-9]+/)) {
console.log("Loading note", initialHash)
const noteId = Number(initialHash)
if (osmConnection.isLoggedIn.data) {
osmConnection.getNote(noteId).then(note => {
const [lon, lat] = note.geometry.coordinates
console.log("Got note:", note)
this.location.set({ lon, lat })
}
)
}
} else if (
Constants.GeoIpServer &&
lat.data === defaultLat &&

View file

@ -1,7 +1,8 @@
import { FeatureSource } from "../FeatureSource"
import { ImmutableStore, Store } from "../../UIEventSource"
import { FeatureSource, WritableFeatureSource } from "../FeatureSource"
import { ImmutableStore, Store, UIEventSource } from "../../UIEventSource"
import { Feature } from "geojson"
"use strict"
/**
* A simple, read only feature store.
*/
@ -30,3 +31,28 @@ export default class StaticFeatureSource<T extends Feature = Feature> implements
return new StaticFeatureSource(geojson)
}
}
export class WritableStaticFeatureSource<T extends Feature = Feature> implements WritableFeatureSource<T> {
public readonly features: UIEventSource<T[]> = undefined
constructor(features: UIEventSource<T[]> | T[] | { features: T[] } | { features: Store<T[]> }) {
if (features === undefined) {
throw "Static feature source received undefined as source"
}
let feats: T[] | UIEventSource<T[]>
if (features["features"]) {
feats = features["features"]
} else {
feats = <T[] | UIEventSource<T[]>>features
}
if (Array.isArray(feats)) {
this.features = new UIEventSource<T[]>(feats)
} else {
this.features = feats
}
}
}

View file

@ -6,6 +6,17 @@ export interface MaprouletteTask {
description: string
instruction: string
}
export const maprouletteStatus = ["Open",
"Fixed",
"False_positive",
"Skipped",
"Deleted",
"Already fixed",
"Too_Hard",
"Disabled",
] as const
export type MaprouletteStatus = typeof maprouletteStatus[number]
export default class Maproulette {
public static readonly defaultEndpoint = "https://maproulette.org/api/v2"
@ -19,16 +30,7 @@ export default class Maproulette {
public static readonly STATUS_TOO_HARD = 6
public static readonly STATUS_DISABLED = 9
public static readonly STATUS_MEANING = {
0: "Open",
1: "Fixed",
2: "False_positive",
3: "Skipped",
4: "Deleted",
5: "Already fixed",
6: "Too_Hard",
9: "Disabled"
}
public static singleton = new Maproulette()
/*
* The API endpoint to use
@ -62,13 +64,12 @@ export default class Maproulette {
if (code === "Created") {
return Maproulette.STATUS_OPEN
}
for (let i = 0; i < 9; i++) {
if (Maproulette.STATUS_MEANING["" + i] === code) {
return i
}
}
const i = maprouletteStatus.findIndex(<any> code)
if(i < 0){
return undefined
}
return i
}
/**
* Close a task; might throw an error
@ -87,7 +88,7 @@ export default class Maproulette {
tags?: string
requestReview?: boolean
completionResponses?: Record<string, string>
}
},
): Promise<void> {
console.log("Maproulette: setting", `${this.endpoint}/task/${taskId}/${status}`, options)
options ??= {}
@ -97,9 +98,9 @@ export default class Maproulette {
method: "PUT",
headers: {
"Content-Type": "application/json",
apiKey: this.apiKey
apiKey: this.apiKey,
},
body: JSON.stringify(options)
body: JSON.stringify(options),
})
if (response.status !== 204) {
console.log(`Failed to close task: ${response.status}`)

View file

@ -600,7 +600,7 @@ export class Changes {
" trying again before dropping it from the changes (" +
e +
")"
this._reportError(msg)
// this._reportError(msg) // We don't report this yet, might be a temporary fluke
const osmObj = await downloader.DownloadObjectAsync(id, 0)
return { id, osmObj }
}

View file

@ -5,6 +5,7 @@ import { Utils } from "../../Utils"
import { LocalStorageSource } from "../Web/LocalStorageSource"
import { AuthConfig } from "./AuthConfig"
import Constants from "../../Models/Constants"
import { Feature, Point } from "geojson"
interface OsmUserInfo {
id: number
@ -248,7 +249,7 @@ export class OsmConnection {
this.auth.xhr(
{
method: "GET",
path: "/api/0.6/user/details",
path: "/api/0.6/user/details"
},
(err, details: XMLDocument) => {
if (err != null) {
@ -360,7 +361,7 @@ export class OsmConnection {
method,
headers: header,
content,
path: `/api/0.6/${path}`,
path: `/api/0.6/${path}`
},
function(err, response) {
if (err !== null) {
@ -442,7 +443,7 @@ export class OsmConnection {
"notes.json",
content,
{
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
},
true,
)
@ -453,6 +454,12 @@ export class OsmConnection {
return id
}
public async getNote(id: number): Promise<Feature<Point>> {
return JSON.parse(await this.get(
"notes/" + id + ".json"
))
}
public static GpxTrackVisibility = ["private", "public", "trackable", "identifiable"] as const
public async uploadGpxTrack(
@ -483,7 +490,7 @@ export class OsmConnection {
file: gpx,
description: options.description,
tags: options.labels?.join(",") ?? "",
visibility: options.visibility,
visibility: options.visibility
}
if (!contents.description) {
@ -493,9 +500,9 @@ export class OsmConnection {
file:
"; filename=\"" +
(options.filename ?? "gpx_track_mapcomplete_" + new Date().toISOString()) +
"\"\r\nContent-Type: application/gpx+xml",
'"\r\nContent-Type: application/gpx+xml',
}
user
const boundary = "987654"
let body = ""
@ -512,7 +519,7 @@ export class OsmConnection {
const response = await this.post("gpx/create", body, {
"Content-Type": "multipart/form-data; boundary=" + boundary,
"Content-Length": "" + body.length,
"Content-Length": "" + body.length
})
const parsed = JSON.parse(response)
console.log("Uploaded GPX track", parsed)
@ -533,7 +540,7 @@ export class OsmConnection {
{
method: "POST",
path: `/api/0.6/notes/${id}/comment?text=${encodeURIComponent(text)}`,
path: `/api/0.6/notes/${id}/comment?text=${encodeURIComponent(text)}`
},
function(err) {
if (err !== null) {
@ -571,7 +578,7 @@ export class OsmConnection {
*/
singlepage: !this._iframeMode,
auto: true,
apiUrl: this._oauth_config.api_url ?? this._oauth_config.url,
apiUrl: this._oauth_config.api_url ?? this._oauth_config.url
})
}

View file

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

View file

@ -68,7 +68,7 @@ export default class LinkedDataLoader {
coors
.trim()
.split(" ")
.map((n) => Number(n))
.map((n) => Number(n)),
),
],
}
@ -156,7 +156,7 @@ export default class LinkedDataLoader {
}
const compacted = await jsonld.compact(
openingHoursSpecification,
<any>LinkedDataLoader.COMPACTING_CONTEXT_OH
<any>LinkedDataLoader.COMPACTING_CONTEXT_OH,
)
const spec: object = compacted["@graph"]
if (!spec) {
@ -190,12 +190,12 @@ export default class LinkedDataLoader {
const compacted = await jsonld.compact(data, <any>LinkedDataLoader.COMPACTING_CONTEXT)
compacted["opening_hours"] = await LinkedDataLoader.ohToOsmFormat(
compacted["opening_hours"]
compacted["opening_hours"],
)
if (compacted["openingHours"]) {
const ohspec: string[] = <any>compacted["openingHours"]
compacted["opening_hours"] = OH.simplify(
ohspec.map((r) => LinkedDataLoader.ohStringToOsmFormat(r)).join("; ")
ohspec.map((r) => LinkedDataLoader.ohStringToOsmFormat(r)).join("; "),
)
delete compacted["openingHours"]
}
@ -236,7 +236,7 @@ export default class LinkedDataLoader {
static async fetchJsonLd(
url: string,
options?: JsonLdLoaderOptions,
mode?: "fetch-lod" | "fetch-raw" | "proxy"
mode?: "fetch-lod" | "fetch-raw" | "proxy",
): Promise<object> {
mode ??= "fetch-lod"
if (mode === "proxy") {
@ -251,7 +251,7 @@ export default class LinkedDataLoader {
const div = document.createElement("div")
div.innerHTML = htmlContent
const script = Array.from(div.getElementsByTagName("script")).find(
(script) => script.type === "application/ld+json"
(script) => script.type === "application/ld+json",
)
const snippet = JSON.parse(script.textContent)
@ -266,7 +266,7 @@ export default class LinkedDataLoader {
*/
static removeDuplicateData(
externalData: Record<string, string>,
currentData: Record<string, string>
currentData: Record<string, string>,
): Record<string, string> {
const d = { ...externalData }
delete d["@context"]
@ -332,7 +332,7 @@ export default class LinkedDataLoader {
}
private static patchVeloparkProperties(
input: Record<string, Set<string>>
input: Record<string, Set<string>>,
): Record<string, string[]> {
const output: Record<string, string[]> = {}
for (const k in input) {
@ -421,6 +421,7 @@ export default class LinkedDataLoader {
delete output["chargeEnd"]
delete output["chargeStart"]
delete output["timeUnit"]
delete output["id"]
asBoolean("covered")
asBoolean("fee", true)
@ -472,7 +473,7 @@ export default class LinkedDataLoader {
audience,
"for",
input["ref:velopark"],
" assuming yes"
" assuming yes",
)
return "yes"
})
@ -516,8 +517,11 @@ export default class LinkedDataLoader {
private static async fetchVeloparkProperty<T extends string, G extends T>(
url: string,
property: string,
variable?: string
variable?: string,
): Promise<SparqlResult<T, G>> {
if(property === "schema:photos"){
console.log(">> Getting photos")
}
const results = await new TypedSparql().typedSparql<T, G>(
{
schema: "http://schema.org/",
@ -529,17 +533,25 @@ export default class LinkedDataLoader {
[url],
undefined,
" ?parking a <http://schema.mobivoc.org/BicycleParkingStation>",
"?parking " + property + " " + (variable ?? "")
"?parking " + property + " " + (variable ?? ""),
)
return results
}
/**
*
* @param url
* @param property
* @param subExpr
* @private
*/
private static async fetchVeloparkGraphProperty<T extends string>(
url: string,
property: string,
subExpr?: string
subExpr?: string,
): Promise<SparqlResult<T, "g">> {
return await new TypedSparql().typedSparql<T, "g">(
const result = await new TypedSparql().typedSparql<T, "g">(
{
schema: "http://schema.org/",
mv: "http://schema.mobivoc.org/",
@ -551,8 +563,10 @@ export default class LinkedDataLoader {
"g",
" ?parking a <http://schema.mobivoc.org/BicycleParkingStation>",
S.graph("g", "?section " + property + " " + (subExpr ?? ""), "?section a ?type")
S.graph("g", "?section " + property + " " + (subExpr ?? ""), "?section a ?type", "BIND(STR(?section) AS ?id)"),
)
return result
}
/**
@ -569,26 +583,67 @@ export default class LinkedDataLoader {
continue
}
for (const sectionKey in subResult) {
if (!r[sectionKey]) {
r[sectionKey] = {}
}
const section = subResult[sectionKey]
if (sectionKey === "default") {
r["default"] ??= {}
const section = subResult["default"]
for (const key in section) {
r[sectionKey][key] ??= section[key]
r["default"][key] ??= section[key]
}
} else {
const section = subResult[sectionKey]
const actualId = Array.from(section["id"] ?? [])[0] ?? sectionKey
r[actualId] ??= {}
for (const key in section) {
r[actualId][key] ??= section[key]
}
}
}
}
if (r["default"] !== undefined && Object.keys(r).length > 1) {
/**
* Copy all values from the section with name "key" into the other sections,
* remove section "key" afterwards
* @param key
*/
function spreadSection(key: string){
for (const section in r) {
if (section === "default") {
if (section === key) {
continue
}
for (const k in r.default) {
r[section][k] ??= r.default[k]
for (const k in r[key]) {
r[section][k] ??= r[key][k]
}
}
delete r.default
delete r[key]
}
// The "default" part of the result contains all general info
// The other 'sections' need to get those copied! Then, we delete the "default"-section
if (r["default"] !== undefined && Object.keys(r).length > 1) {
spreadSection("default")
}
if (Object.keys(r).length > 1) {
// This result has multiple sections
// We should check that the naked URL got distributed and scrapped
const keys = Object.keys(r)
if (Object.keys(r).length > 2) {
console.log("Multiple sections detected: ", JSON.stringify(keys))
}
const shortestKeyLength: number = Math.min(...keys.map(k => k.length))
const key = keys.find(k => k.length === shortestKeyLength)
if (keys.some(k => !k.startsWith(key))) {
throw "Invalid multi-object: the shortest key is not the start of all the others: " + JSON.stringify(keys)
}
spreadSection(key)
}
if (Object.keys(r).length == 1) {
const key = Object.keys(r)[0]
if(key.indexOf("#")>0){
const newKey = key.split("#")[0]
r[newKey] = r[key]
delete r[key]
}
}
return r
}
@ -597,7 +652,7 @@ export default class LinkedDataLoader {
directUrl: string,
propertiesWithoutGraph: PropertiesSpec<T>,
propertiesInGraph: PropertiesSpec<T>,
extra?: string[]
extra?: string[],
): Promise<SparqlResult<T, string>> {
const allPartialResults: SparqlResult<T, string>[] = []
for (const propertyName in propertiesWithoutGraph) {
@ -607,7 +662,7 @@ export default class LinkedDataLoader {
const result = await this.fetchVeloparkProperty(
directUrl,
propertyName,
"?" + variableName
"?" + variableName,
)
allPartialResults.push(result)
} else {
@ -616,7 +671,7 @@ export default class LinkedDataLoader {
const result = await this.fetchVeloparkProperty(
directUrl,
propertyName,
`[${subProperty} ?${variableName}] `
`[${subProperty} ?${variableName}] `,
)
allPartialResults.push(result)
}
@ -634,7 +689,7 @@ export default class LinkedDataLoader {
const result = await this.fetchVeloparkGraphProperty(
directUrl,
propertyName,
variableName
variableName,
)
allPartialResults.push(result)
}
@ -646,7 +701,7 @@ export default class LinkedDataLoader {
const result = await this.fetchVeloparkGraphProperty(
directUrl,
propertyName,
variableName
variableName,
)
allPartialResults.push(result)
} else {
@ -655,7 +710,7 @@ export default class LinkedDataLoader {
const result = await this.fetchVeloparkGraphProperty(
directUrl,
propertyName,
`[${subProperty} ?${variableName}] `
`[${subProperty} ?${variableName}] `,
)
allPartialResults.push(result)
}
@ -675,16 +730,18 @@ export default class LinkedDataLoader {
/**
* Fetches all data relevant to velopark.
* The id will be saved as `ref:velopark`
* If the entry has multiple sections, this will return multiple items
* @param url
*/
public static async fetchVeloparkEntry(
url: string,
includeExtras: boolean = false
includeExtras: boolean = false,
): Promise<Feature[]> {
const cacheKey = includeExtras + url
if (this.veloparkCache[cacheKey]) {
return this.veloparkCache[cacheKey]
}
// Note: the proxy doesn't make any changes in this case
const withProxyUrl = Constants.linkedDataProxy.replace("{url}", encodeURIComponent(url))
const optionalPaths: Record<string, string | Record<string, string>> = {
"schema:interactionService": {
@ -697,6 +754,7 @@ export default class LinkedDataLoader {
"schema:email": "email",
"schema:telephone": "phone",
},
// "schema:photos": "images",
"schema:dateModified": "_last_edit_timestamp",
}
if (includeExtras) {
@ -738,11 +796,24 @@ export default class LinkedDataLoader {
withProxyUrl,
optionalPaths,
graphOptionalPaths,
extra
extra,
)
for (const unpatchedKey in unpatched) {
// Dirty hack
const rawData = await Utils.downloadJsonCached<object>(url, 1000*60*60)
const images = rawData["photos"]?.map(ph => <string> ph.image)
if(images){
unpatched[unpatchedKey].images = new Set<string>(images)
}
}
console.log("Got unpatched:", unpatched)
const patched: Feature[] = []
for (const section in unpatched) {
for (let section in unpatched) {
const p = LinkedDataLoader.patchVeloparkProperties(unpatched[section])
if(Object.keys(unpatched).length === 1 && section.endsWith("#section1")){
section = section.split("#")[0]
}
p["ref:velopark"] = [section]
patched.push(LinkedDataLoader.asGeojson(p))
}

View file

@ -67,13 +67,11 @@ export default class TypedSparql {
bindings.forEach((item) => {
const result = <Record<VARS | G, Set<string>>>{}
item.forEach((value, key) => {
if (!result[key.value]) {
result[key.value] = new Set()
}
result[key.value] ??= new Set()
result[key.value].add(value.value)
})
if (graphVariable && result[graphVariable]?.size > 0) {
const id = Array.from(result[graphVariable])?.[0] ?? "default"
const id: string = (<string> Array.from(result["id"] ?? [])?.[0] ?? Array.from(result[graphVariable] ?? [])?.[0]) ?? "default"
resultAllGraphs[id] = result
} else {
resultAllGraphs["default"] = result

View file

@ -2,11 +2,7 @@ import ThemeConfig from "./ThemeConfig/ThemeConfig"
import { SpecialVisualizationState } from "../UI/SpecialVisualization"
import { Changes } from "../Logic/Osm/Changes"
import { Store, UIEventSource } from "../Logic/UIEventSource"
import {
FeatureSource,
IndexedFeatureSource,
WritableFeatureSource,
} from "../Logic/FeatureSource/FeatureSource"
import { FeatureSource, IndexedFeatureSource, WritableFeatureSource } from "../Logic/FeatureSource/FeatureSource"
import { OsmConnection } from "../Logic/Osm/OsmConnection"
import { ExportableMap, MapProperties } from "./MapProperties"
import LayerState from "../Logic/State/LayerState"
@ -50,9 +46,7 @@ import BackgroundLayerResetter from "../Logic/Actors/BackgroundLayerResetter"
import SaveFeatureSourceToLocalStorage from "../Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage"
import BBoxFeatureSource from "../Logic/FeatureSource/Sources/TouchesBboxFeatureSource"
import ThemeViewStateHashActor from "../Logic/Web/ThemeViewStateHashActor"
import NoElementsInViewDetector, {
FeatureViewState,
} from "../Logic/Actors/NoElementsInViewDetector"
import NoElementsInViewDetector, { FeatureViewState } from "../Logic/Actors/NoElementsInViewDetector"
import FilteredLayer from "./FilteredLayer"
import { PreferredRasterLayerSelector } from "../Logic/Actors/PreferredRasterLayerSelector"
import { ImageUploadManager } from "../Logic/ImageProviders/ImageUploadManager"
@ -63,7 +57,7 @@ import { GeolocationControlState } from "../UI/BigComponents/GeolocationControl"
import Zoomcontrol from "../UI/Zoomcontrol"
import {
SummaryTileSource,
SummaryTileSourceRewriter,
SummaryTileSourceRewriter
} from "../Logic/FeatureSource/TiledFeatureSource/SummaryTileSource"
import summaryLayer from "../assets/generated/layers/summary.json"
import last_click_layerconfig from "../assets/generated/layers/last_click.json"
@ -177,12 +171,6 @@ export default class ThemeViewState implements SpecialVisualizationState {
)
this.map = new UIEventSource<MlMap>(undefined)
const geolocationState = new GeoLocationState()
const initial = new InitialMapPositioning(layout, geolocationState)
this.mapProperties = new MapLibreAdaptor(this.map, initial, { correctClick: 20 })
this.featureSwitchIsTesting = this.featureSwitches.featureSwitchIsTesting
this.featureSwitchUserbadge = this.featureSwitches.featureSwitchEnableLogin
this.osmConnection = new OsmConnection({
dryRun: this.featureSwitches.featureSwitchIsTesting,
fakeUser: this.featureSwitches.featureSwitchFakeUser.data,
@ -190,8 +178,15 @@ export default class ThemeViewState implements SpecialVisualizationState {
"oauth_token",
undefined,
"Used to complete the login"
),
)
})
const initial = new InitialMapPositioning(layout, geolocationState, this.osmConnection)
this.mapProperties = new MapLibreAdaptor(this.map, initial, { correctClick: 20 })
this.featureSwitchIsTesting = this.featureSwitches.featureSwitchIsTesting
this.featureSwitchUserbadge = this.featureSwitches.featureSwitchEnableLogin
this.userRelatedState = new UserRelatedState(
this.osmConnection,
layout,
@ -788,7 +783,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
const layers = this.theme.layers.filter(
(l) =>
Constants.priviliged_layers.indexOf(<any>l.id) < 0 &&
(<string[]><unknown>Constants.priviliged_layers).indexOf(l.id) < 0 &&
l.source.geojsonSource === undefined &&
l.doCount
)
@ -840,7 +835,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
this.closestFeatures.registerSource(specialLayers.favourite, "favourite")
if (this.theme?.lockLocation) {
const bbox = new BBox(<any>this.theme.lockLocation)
const bbox = new BBox(<[[number, number], [number, number]]>this.theme.lockLocation)
this.mapProperties.maxbounds.setData(bbox)
ShowDataLayer.showRange(
this.map,

View file

@ -53,6 +53,8 @@
fill: var(--button-background-hover);
transition: fill 350ms linear;
cursor: pointer;
stroke-width: 0.8;
stroke: white;
}
:global(.dots-menu:hover > path, .dots-menu-opened > path) {

View file

@ -128,17 +128,18 @@
{#if $unknownImages.length > 0}
{#if readonly}
<div class="w-full overflow-x-auto">
<div class="flex h-32 w-max gap-x-2">
<div class="flex w-full space-x-2 overflow-x-auto border border-gray-600 p-1"
style="scroll-snap-type: x proximity; border: 1px solid black">
{#each $unknownImages as image (image)}
<div class="relative flex w-fit items-center bg-gray-200">
<AttributedImage
{state}
imgClass="h-32 w-max shrink-0"
imgClass="h-32 shrink-0"
image={{ url: image }}
previewedImage={state.previewedImage}
/>
{/each}
</div>
{/each}
</div>
{:else}
{#each $unknownImages as image (image)}

View file

@ -42,7 +42,7 @@
if (previewedImage) {
onDestroy(
previewedImage.addCallbackAndRun((previewedImage) => {
showBigPreview.set(previewedImage?.id === image.id)
showBigPreview.set(previewedImage !== undefined && previewedImage?.id === image.id)
})
)
}

View file

@ -1,12 +1,12 @@
<script lang="ts">
import { Store } from "../../Logic/UIEventSource.js"
import { Store, UIEventSource } from "../../Logic/UIEventSource.js"
import type { ProvidedImage } from "../../Logic/ImageProviders/ImageProvider"
import type { SpecialVisualizationState } from "../SpecialVisualization"
import DeletableImage from "./DeletableImage.svelte"
export let images: Store<ProvidedImage[]>
export let state: SpecialVisualizationState
export let tags: Store<Record<string, string>>
export let tags: UIEventSource<Record<string, string>>
</script>
<div class="flex w-full space-x-2 overflow-x-auto" style="scroll-snap-type: x proximity">

View file

@ -5,7 +5,7 @@
import Tr from "../Base/Tr.svelte"
import Translations from "../i18n/Translations"
import Icon from "../Map/Icon.svelte"
import Maproulette from "../../Logic/Maproulette"
import Maproulette, { maprouletteStatus } from "../../Logic/Maproulette"
import LoginToggle from "../Base/LoginToggle.svelte"
/**
@ -38,10 +38,11 @@
async function apply() {
const maproulette_id = tags.data[maproulette_id_key] ?? tags.data.mr_taskId ?? tags.data.id
try {
await Maproulette.singleton.closeTask(Number(maproulette_id), Number(statusToSet), state, {
const statusIndex = Maproulette.codeToIndex(statusToSet) ?? Number(statusToSet)
await Maproulette.singleton.closeTask(Number(maproulette_id), statusIndex, state, {
comment: feedback,
})
tags.data["mr_taskStatus"] = Maproulette.STATUS_MEANING[Number(statusToSet)]
tags.data["mr_taskStatus"] = maprouletteStatus[statusIndex]
tags.data.status = statusToSet
tags.ping()
} catch (e) {

View file

@ -9,6 +9,7 @@ import { PointImportFlowArguments, PointImportFlowState } from "./PointImportFlo
import { Utils } from "../../../Utils"
import { ImportFlowUtils } from "./ImportFlow"
import Translations from "../../i18n/Translations"
import { GeoOperations } from "../../../Logic/GeoOperations"
/**
* The wrapper to make the special visualisation for the PointImportFlow
@ -44,6 +45,10 @@ export class PointImportButtonViz implements SpecialVisualization {
name: "maproulette_id",
doc: "The property name of the maproulette_id - this is probably `mr_taskId`. If given, the maproulette challenge will be marked as fixed. Only use this if part of a maproulette-layer.",
},
{
name: "to_point",
doc: "If set, a feature will be converted to a centerpoint",
},
]
}
@ -51,11 +56,18 @@ export class PointImportButtonViz implements SpecialVisualization {
state: SpecialVisualizationState,
tagSource: UIEventSource<Record<string, string>>,
argument: string[],
feature: Feature
feature: Feature,
): BaseUIElement {
const to_point_index = this.args.findIndex(arg => arg.name === "to_point")
const summarizePointArg = argument[to_point_index].toLowerCase()
if (feature.geometry.type !== "Point") {
if (summarizePointArg !== "no" && summarizePointArg !== "false") {
feature = GeoOperations.centerpoint(feature)
} else {
return Translations.t.general.add.import.wrongType.SetClass("alert")
}
}
const baseArgs: PointImportFlowArguments = <any>Utils.ParseVisArgs(this.args, argument)
const tagsToApply = ImportFlowUtils.getTagsToApply(tagSource, baseArgs)
const importFlow = new PointImportFlowState(
@ -63,7 +75,7 @@ export class PointImportButtonViz implements SpecialVisualization {
<Feature<Point>>feature,
baseArgs,
tagsToApply,
tagSource
tagSource,
)
return new SvelteUIElement(PointImportFlow, {

View file

@ -1,5 +1,5 @@
<script lang="ts">
import { Store, Stores, UIEventSource } from "../../Logic/UIEventSource"
import { ImmutableStore, Store, Stores, UIEventSource } from "../../Logic/UIEventSource"
import StatusIcon from "./StatusIcon.svelte"
import type { MCService } from "./MCService"
import ServiceIndicator from "./ServiceIndicator.svelte"
@ -203,6 +203,29 @@
})
}
{
const summaryTileServer = Constants.VectorTileServer
// "mvt_layer_server": "https://cache.mapcomplete.org/public.{type}_{layer}/{z}/{x}/{y}.pbf",
const status = testDownload(Utils.SubstituteKeys(summaryTileServer, {
type: "pois",
layer: "food",
z: 14,
x: 8848,
y: 5828
}))
services.push({
name: summaryTileServer,
status: status.mapD((s) => {
if (s["error"]) {
return "offline"
}
return "online"
}),
message: new ImmutableStore("See SettingUpPSQL.md to fix")
})
}
{
const s = Constants.countryCoderEndpoint
const status = testDownload(s + "/0.0.0.json")