From 3f799398d7508f054aa95165e9dba135be9d7809 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 11 Jun 2024 02:18:16 +0200 Subject: [PATCH 01/43] Try to use direct url --- assets/themes/grb/grb.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/themes/grb/grb.json b/assets/themes/grb/grb.json index 564602dcf..52dad43ab 100644 --- a/assets/themes/grb/grb.json +++ b/assets/themes/grb/grb.json @@ -286,7 +286,7 @@ "man_made!=mast" ] }, - "geoJson": "https://proxy.mapcomplete.org/json?url=https://betadata.byteless.net/grb?bbox={x_min},{y_min},{x_max},{y_max}", + "geoJson": "https://betadata.byteless.net/grb?bbox={x_min},{y_min},{x_max},{y_max}", "geoJsonZoomLevel": 18, "mercatorCrs": true, "idKey": "osm_id" From aea2a356093e39ef65748e89f9283c423c9945f6 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 11 Jun 2024 15:05:53 +0200 Subject: [PATCH 02/43] Chore: add some docs, tests and clearer variable names --- src/Logic/BBox.ts | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/Logic/BBox.ts b/src/Logic/BBox.ts index fd5ef5e5b..b54928418 100644 --- a/src/Logic/BBox.ts +++ b/src/Logic/BBox.ts @@ -16,6 +16,18 @@ export class BBox { /*** * Coordinates should be [[lon, lat],[lon, lat]] * @param coordinates + * + * const bb = new BBox([[5,6]]) + * bb.minLat // => 6 + * bb.minLon // => 5 + * bb.maxLat // => 6 + * bb.maxLon // => 5 + * + * const bb = new BBox([[-100,-100]]) + * bb.minLat // => -90 + * bb.minLon // => -100 + * bb.maxLat // => -90 + * bb.maxLon // => -100 */ constructor(coordinates: [number, number][]) { this.maxLat = -90 @@ -45,13 +57,24 @@ export class BBox { ]) } + /** + * Gets the bbox from a feature and caches it (by monkeypatching) the relevant feature + * + * + * const f = {type:"Feature",properties: {}, geometry: {type: "Point", coordinates: [-100,45]}} + * const bb = BBox.get(f) + * bb.minLat // => 45 + * bb.minLon // => -100 + * + */ static get(feature: Feature): BBox { const f = feature if (f.bbox?.overlapsWith === undefined) { - const turfBbox: number[] = turf.bbox(feature) + const [minX, minY, maxX, maxY]: number[] = turf.bbox(feature) + // Note: x is longitude f["bbox"] = new BBox([ - [turfBbox[0], turfBbox[1]], - [turfBbox[2], turfBbox[3]], + [minX, minY], + [maxX, maxY], ]) } return f["bbox"] From f0a5f6223795aa7b3aabf13a16c6f8510f5ce742 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 11 Jun 2024 15:06:06 +0200 Subject: [PATCH 03/43] Chore: remove obsolete log --- src/Logic/GeoOperations.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Logic/GeoOperations.ts b/src/Logic/GeoOperations.ts index 74ee7aaa4..7c3dabb6c 100644 --- a/src/Logic/GeoOperations.ts +++ b/src/Logic/GeoOperations.ts @@ -734,7 +734,6 @@ export class GeoOperations { const splitted: Feature[] = [].concat(...lines) const kept: Feature[] = [] for (const f of splitted) { - console.log("Checking", f) if (!GeoOperations.inside(GeoOperations.centerpointCoordinates(f), boundary)) { continue } From a753727559737a68e3c357a6b0b2c2478ad12758 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 11 Jun 2024 15:06:45 +0200 Subject: [PATCH 04/43] Chore: update token, some code style improvements --- scripts/GenerateSeries.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/scripts/GenerateSeries.ts b/scripts/GenerateSeries.ts index 12727606b..d93067d08 100644 --- a/scripts/GenerateSeries.ts +++ b/scripts/GenerateSeries.ts @@ -123,7 +123,7 @@ class StatsDownloader { Referer: "https://osmcha.org/?filters=%7B%22date__gte%22%3A%5B%7B%22label%22%3A%222020-07-05%22%2C%22value%22%3A%222020-07-05%22%7D%5D%2C%22editor%22%3A%5B%7B%22label%22%3A%22mapcomplete%22%2C%22value%22%3A%22mapcomplete%22%7D%5D%7D", "Content-Type": "application/json", - Authorization: "Token 6e422e2afedb79ef66573982012000281f03dc91", + Authorization: "Token 9cc11ad2868778272eadbb1a423ebb507184bc04", DNT: "1", Connection: "keep-alive", TE: "Trailers", @@ -135,7 +135,7 @@ class StatsDownloader { ScriptUtils.erasableLog( `Downloading stats for ${year}-${month}-${day}, page ${page} ${url}` ) - const result = await Utils.downloadJson(url, headers) + const result = await Utils.downloadJson<{features: [], next: string}>(url, headers) page++ allFeatures.push(...result.features) if (result.features === undefined) { @@ -201,11 +201,11 @@ class GenerateSeries extends Script { const targetDir = args[0] ?? "../../git/MapComplete-data" await this.downloadStatistics(targetDir + "/changeset-metadata") - await this.generateCenterPoints( + this.generateCenterPoints( targetDir + "/changeset-metadata", targetDir + "/mapcomplete-changes/", { - zoomlevel: 8, + zoomlevel: 8 } ) } @@ -248,10 +248,8 @@ class GenerateSeries extends Script { const allPaths = readdirSync(sourceDir).filter( (p) => p.startsWith("stats.") && p.endsWith(".json") ) - let allFeatures: ChangeSetData[] = [].concat( - ...allPaths.map( + let allFeatures: ChangeSetData[] = allPaths.flatMap( (path) => JSON.parse(readFileSync(sourceDir + "/" + path, "utf-8")).features - ) ) allFeatures = allFeatures.filter( (f) => @@ -270,7 +268,7 @@ class GenerateSeries extends Script { f.properties.editor.toLowerCase().startsWith("mapcomplete")) ) - allFeatures = allFeatures.filter((f) => f.properties.metadata?.theme !== "EMPTY CS") + allFeatures = allFeatures.filter((f) => f.properties.metadata?.theme !== "EMPTY CS" && f.geometry.coordinates.length > 0) const centerpoints = allFeatures.map((f) => GeoOperations.centerpoint(f)) console.log("Found", centerpoints.length, " changesets in total") From dcf3aed2aeeccd7e6f7b717ddcea1c009a141fda Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 11 Jun 2024 22:26:04 +0200 Subject: [PATCH 05/43] Server config --- Docs/ServerConfig/cache/Caddyfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Docs/ServerConfig/cache/Caddyfile b/Docs/ServerConfig/cache/Caddyfile index b818fae82..9bddec411 100644 --- a/Docs/ServerConfig/cache/Caddyfile +++ b/Docs/ServerConfig/cache/Caddyfile @@ -3,10 +3,6 @@ cache.mapcomplete.org { to http://127.0.0.1:2345 } - reverse_proxy /extractgraph { - to http://127.0.0.1:2346 - } - reverse_proxy /* { to http://127.0.0.1:7800 } From 3a7d62e5fc60f9bb39470c2192e55bda7de56dd7 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 12 Jun 2024 14:43:19 +0200 Subject: [PATCH 06/43] Update server documentation --- Docs/ServerConfig/cache/{cache.txt => cache.md} | 2 +- Docs/SettingUpPSQL.md | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) rename Docs/ServerConfig/cache/{cache.txt => cache.md} (89%) diff --git a/Docs/ServerConfig/cache/cache.txt b/Docs/ServerConfig/cache/cache.md similarity index 89% rename from Docs/ServerConfig/cache/cache.txt rename to Docs/ServerConfig/cache/cache.md index ddda8f29a..df11db46d 100644 --- a/Docs/ServerConfig/cache/cache.txt +++ b/Docs/ServerConfig/cache/cache.md @@ -10,6 +10,6 @@ https://dynamicdns.park-your-domain.com/update?host=cache&domain=mapcomplete.org ## Setup -See SettingUpPSQL.md +See [SettingUpPSQL.md](../SettingUpPSQL.md) diff --git a/Docs/SettingUpPSQL.md b/Docs/SettingUpPSQL.md index 7b19dccad..b615129bb 100644 --- a/Docs/SettingUpPSQL.md +++ b/Docs/SettingUpPSQL.md @@ -59,11 +59,13 @@ HP ProLiant DL360 G7 (1U): 2Rx4 DDR3-memory (PC3) ## Deploying a tile server -pg_tileserv kan hier gedownload worden: https://github.com/CrunchyData/pg_tileserv +pg_tileserv can be downloaded here: https://github.com/CrunchyData/pg_tileserv + +In the directory where it is downloaded (e.g. `~/data`), run ```` export DATABASE_URL=postgresql://user:password@localhost:5444/osm-poi -nohup ./pg_tileserv & +nohup ./pg_tileserv > pg_tileserv.log & ```` Tiles are available at: @@ -74,6 +76,10 @@ map.addSource("drinking_water", { }) ```` +# Starting the summary server + +`npm run summary-server` in the git repo + # Rebooting: -> Restart the docker container From d434ed0492caa4e6853ee8ddc1e3287eea97bbfc Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 12 Jun 2024 14:45:51 +0200 Subject: [PATCH 07/43] Add workaround to have GenerateSeries.ts working --- scripts/GenerateSeries.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/scripts/GenerateSeries.ts b/scripts/GenerateSeries.ts index d93067d08..9ed02a215 100644 --- a/scripts/GenerateSeries.ts +++ b/scripts/GenerateSeries.ts @@ -5,6 +5,7 @@ import Script from "./Script" import { GeoOperations } from "../src/Logic/GeoOperations" import { Feature, Polygon } from "geojson" import { Tiles } from "../src/Models/TileRange" +import { BBox } from "../src/Logic/BBox" class StatsDownloader { private readonly urlTemplate = @@ -269,7 +270,22 @@ class GenerateSeries extends Script { ) allFeatures = allFeatures.filter((f) => f.properties.metadata?.theme !== "EMPTY CS" && f.geometry.coordinates.length > 0) - const centerpoints = allFeatures.map((f) => GeoOperations.centerpoint(f)) + const centerpointsAll = allFeatures.map((f) => { + const centerpoint = GeoOperations.centerpoint(f) + // OsmCha doesn't adhere to the Geojson standard and uses `lat` `lon` as coordinates instead of `lon`, `lat` + centerpoint.geometry.coordinates.reverse() + return centerpoint + }) + const centerpoints = centerpointsAll.filter(p => { + const bbox= BBox.get(p) + if(bbox.minLat === -90 && bbox.maxLat === -90){ + // Due to some bug somewhere, those invalid bboxes might appear if the latitude is < 90 + // This crashes the 'spreadIntoBBoxes + // As workaround, we simply ignore them for now + return false + } + return true + }) console.log("Found", centerpoints.length, " changesets in total") const perBbox = GeoOperations.spreadIntoBboxes(centerpoints, options.zoomlevel) From 8f5be4f7421a1422d6c4c327a4e5ed0d914b2042 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 12 Jun 2024 15:03:10 +0200 Subject: [PATCH 08/43] Split summary-server constant --- package.json | 2 ++ src/Models/Constants.ts | 1 + src/Models/ThemeViewState.ts | 3 +-- src/index.ts | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b5020986c..9ef566671 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,8 @@ "url": "https://www.openstreetmap.org" }, "mvt_layer_server": "https://cache.mapcomplete.org/public.{type}_{layer}/{z}/{x}/{y}.pbf", + "#summary_server": "Should be the endpoint; appending status.json should work", + "summary_server": "https://cache.mapcomplete.org/", "disabled:oauth_credentials": { "##": "DEV", "#": "This client-id is registered by 'MapComplete' on https://master.apis.dev.openstreetmap.org/", diff --git a/src/Models/Constants.ts b/src/Models/Constants.ts index d13b6f75d..4f9894c40 100644 --- a/src/Models/Constants.ts +++ b/src/Models/Constants.ts @@ -164,6 +164,7 @@ export default class Constants { */ public static VectorTileServer: string | undefined = Constants.config.mvt_layer_server public static readonly maptilerApiKey = "GvoVAJgu46I5rZapJuAy" + public static readonly SummaryServer: string = Constants.config.summary_server private static isRetina(): boolean { if (Utils.runningFromConsole) { diff --git a/src/Models/ThemeViewState.ts b/src/Models/ThemeViewState.ts index 9ae12e26c..d76c84318 100644 --- a/src/Models/ThemeViewState.ts +++ b/src/Models/ThemeViewState.ts @@ -690,9 +690,8 @@ export default class ThemeViewState implements SpecialVisualizationState { l.source.geojsonSource === undefined && l.doCount ) - const url = new URL(Constants.VectorTileServer) const summaryTileSource = new SummaryTileSource( - url.protocol + "//" + url.host + "/summary", + Constants.SummaryServer, layers.map((l) => l.id), this.mapProperties.zoom.map((z) => Math.max(Math.floor(z), 0)), this.mapProperties, diff --git a/src/index.ts b/src/index.ts index 2d5a1a03a..10e28cc55 100644 --- a/src/index.ts +++ b/src/index.ts @@ -28,7 +28,7 @@ async function timeout(timeMS: number): Promise<{ layers: string[] }> { async function getAvailableLayers(): Promise> { try { - const host = new URL(Constants.VectorTileServer).host + const host = new URL(Constants.SummaryServer).host const status: { layers: string[] } = await Promise.any([ Utils.downloadJson<{layers}>("https://" + host + "/summary/status.json"), timeout(2500), From 1575a41c3248f37d1248411f214c395d6b96f561 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 13 Jun 2024 13:10:26 +0200 Subject: [PATCH 09/43] Cleanup of caddyfile --- Docs/ServerConfig/hetzner/Caddyfile | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Docs/ServerConfig/hetzner/Caddyfile b/Docs/ServerConfig/hetzner/Caddyfile index 7888c8f7b..e18870f7f 100644 --- a/Docs/ServerConfig/hetzner/Caddyfile +++ b/Docs/ServerConfig/hetzner/Caddyfile @@ -41,14 +41,4 @@ proxy.mapcomplete.org { } } -bounce.mapcomplete.org { - reverse_proxy { - to http://127.0.0.1:1236 - } -} -cache.mapcomplete.org { - reverse_proxy /summary/* { - to http://127.0.0.1:2345 - } -} From d5ab55ccf7681d9681b9ebe8e5533f09f0336ee3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 11:12:10 +0000 Subject: [PATCH 10/43] Bump braces from 3.0.2 to 3.0.3 Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 56 ++++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index ada348b2b..ffad3919f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mapcomplete", - "version": "0.42.6", + "version": "0.43.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mapcomplete", - "version": "0.42.6", + "version": "0.43.1", "license": "GPL-3.0-or-later", "dependencies": { "@comunica/core": "^3.0.1", @@ -7682,10 +7682,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "license": "MIT", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -9756,8 +9757,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "license": "MIT", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -10770,6 +10772,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "dev": true, @@ -17710,7 +17720,8 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { "is-number": "^7.0.0" }, @@ -17718,13 +17729,6 @@ "node": ">=8.0" } }, - "node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/topojson-client": { "version": "3.1.0", "license": "ISC", @@ -24931,9 +24935,11 @@ } }, "braces": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "brorand": { @@ -26246,7 +26252,9 @@ } }, "fill-range": { - "version": "7.0.1", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "requires": { "to-regex-range": "^5.0.1" } @@ -26866,6 +26874,11 @@ "define-properties": "^1.1.3" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, "is-path-inside": { "version": "3.0.3", "dev": true @@ -31326,13 +31339,10 @@ }, "to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { "is-number": "^7.0.0" - }, - "dependencies": { - "is-number": { - "version": "7.0.0" - } } }, "topojson-client": { From 2baddeb23191bd54b704f6d6a0744a8930c69931 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 13 Jun 2024 19:46:00 +0200 Subject: [PATCH 11/43] Allow deletion of playground equipment --- assets/layers/playground_equipment/playground_equipment.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assets/layers/playground_equipment/playground_equipment.json b/assets/layers/playground_equipment/playground_equipment.json index 67b06456c..da7ad93eb 100644 --- a/assets/layers/playground_equipment/playground_equipment.json +++ b/assets/layers/playground_equipment/playground_equipment.json @@ -364,5 +364,8 @@ } } ], - "allowMove": true + "allowMove": true, + "deletion": { + "neededChangesets": 0 + } } From 7ef1628d87f32240746251b3e7b4bfdfdbebf6cb Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 13 Jun 2024 20:59:52 +0200 Subject: [PATCH 12/43] Fix: don't show duplicate entry of default baselayer if already added --- src/Models/RasterLayers.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Models/RasterLayers.ts b/src/Models/RasterLayers.ts index 850a87967..da0cdfc3f 100644 --- a/src/Models/RasterLayers.ts +++ b/src/Models/RasterLayers.ts @@ -80,11 +80,14 @@ export class AvailableRasterLayers { return GeoOperations.inside(lonlat, eliPolygon) }) matching.unshift(AvailableRasterLayers.osmCarto) - matching.push(AvailableRasterLayers.defaultBackgroundLayer) + if (enableBing?.data) { matching.push(AvailableRasterLayers.bing) } matching.push(...AvailableRasterLayers.globalLayers) + if(!matching.some(l => l.id === AvailableRasterLayers.defaultBackgroundLayer.properties.id)){ + matching.push(AvailableRasterLayers.defaultBackgroundLayer) + } return matching }, [enableBing] From aad31f649e733d108c63297aa6d25bf87ac73c34 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 13 Jun 2024 21:02:36 +0200 Subject: [PATCH 13/43] Fix: show add new point fullscreen again --- .../TagRendering/SpecialTranslation.svelte | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/UI/Popup/TagRendering/SpecialTranslation.svelte b/src/UI/Popup/TagRendering/SpecialTranslation.svelte index 12765bc37..3149a721f 100644 --- a/src/UI/Popup/TagRendering/SpecialTranslation.svelte +++ b/src/UI/Popup/TagRendering/SpecialTranslation.svelte @@ -63,7 +63,7 @@ } - +{#if lang === "*"} {#each specs as specpart} {#if typeof specpart === "string"} @@ -74,4 +74,17 @@ createVisualisation(specpart)} /> {/if} {/each} - +{:else} + + {#each specs as specpart} + {#if typeof specpart === "string"} + + {@html Utils.purify(Utils.SubstituteKeys(specpart, $tags)) } + + + {:else if $tags !== undefined} + createVisualisation(specpart)} /> + {/if} + {/each} + +{/if} From 996a08e8d8cf79409f273ff4f9885428ca1c7379 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 01:00:59 +0200 Subject: [PATCH 14/43] UX: don't hide nearby images if logging in stalls --- src/UI/Base/LoginToggle.svelte | 10 ++++-- src/UI/Image/LinkableImage.svelte | 3 ++ src/UI/Image/NearbyImages.svelte | 40 +++++++++++------------ src/UI/Image/NearbyImagesCollapsed.svelte | 2 -- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/UI/Base/LoginToggle.svelte b/src/UI/Base/LoginToggle.svelte index 12d0e4ea9..65b07b81d 100644 --- a/src/UI/Base/LoginToggle.svelte +++ b/src/UI/Base/LoginToggle.svelte @@ -16,6 +16,10 @@ * If set, 'loading' will act as if we are already logged in. */ export let ignoreLoading: boolean = false + /** + * Only show the 'successful' state, don't show loading or error messages + */ + export let silentFail : boolean = false let loadingStatus = state?.osmConnection?.loadingStatus ?? new ImmutableStore("logged-in") let badge = state?.featureSwitches?.featureSwitchEnableLogin ?? new ImmutableStore(true) const t = Translations.t.general @@ -30,11 +34,11 @@ {#if $badge} - {#if !ignoreLoading && $loadingStatus === "loading"} + {#if !ignoreLoading && !silentFail && $loadingStatus === "loading"} - {:else if $loadingStatus === "error"} + {:else if !silentFail && $loadingStatus === "error"}
@@ -43,7 +47,7 @@ {:else if $loadingStatus === "logged-in"} - {:else if $loadingStatus === "not-attempted"} + {:else if !silentFail && $loadingStatus === "not-attempted"} {/if} {/if} diff --git a/src/UI/Image/LinkableImage.svelte b/src/UI/Image/LinkableImage.svelte index 12f488308..287c9866a 100644 --- a/src/UI/Image/LinkableImage.svelte +++ b/src/UI/Image/LinkableImage.svelte @@ -13,6 +13,7 @@ import type { ProvidedImage } from "../../Logic/ImageProviders/ImageProvider" import AttributedImage from "./AttributedImage.svelte" import SpecialTranslation from "../Popup/TagRendering/SpecialTranslation.svelte" + import LoginToggle from "../Base/LoginToggle.svelte" export let tags: UIEventSource export let state: SpecialVisualizationState @@ -68,10 +69,12 @@ previewedImage={state.previewedImage} />
+ {#if linkable} {/if} + diff --git a/src/UI/Image/NearbyImages.svelte b/src/UI/Image/NearbyImages.svelte index 11e5c4d0c..c28e004d6 100644 --- a/src/UI/Image/NearbyImages.svelte +++ b/src/UI/Image/NearbyImages.svelte @@ -30,7 +30,7 @@ lon, lat, allowSpherical: new UIEventSource(false), - blacklist: AllImageProviders.LoadImagesFor(tags), + blacklist: AllImageProviders.LoadImagesFor(tags) }, state.indexedFeatures ) @@ -39,26 +39,24 @@ let allDone = imagesProvider.allDone - -
-
-

- -

- -
- {#if !$allDone} - - {:else if $images.length === 0} - - {:else} -
- {#each $images as image (image.pictureUrl)} +
+
+

+ +

+ +
+ {#if !$allDone} + + {:else if $images.length === 0} + + {:else} +
+ {#each $images as image (image.pictureUrl)} - {/each} -
- {/if} -
- + {/each} +
+ {/if} +
diff --git a/src/UI/Image/NearbyImagesCollapsed.svelte b/src/UI/Image/NearbyImagesCollapsed.svelte index 4129fbcc1..6cbc37bd9 100644 --- a/src/UI/Image/NearbyImagesCollapsed.svelte +++ b/src/UI/Image/NearbyImagesCollapsed.svelte @@ -25,7 +25,6 @@ let expanded = false -
{#if expanded} @@ -54,4 +53,3 @@ {/if}
-
From 48b35f56163bce4422d0f5a410a0c2722172dc48 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 01:01:41 +0200 Subject: [PATCH 15/43] Velopark: some improvements to the scripts --- scripts/velopark/compare.ts | 5 ++ scripts/velopark/diffToCsv.ts | 63 ++++++++++++++++++++ scripts/velopark/veloParkToGeojson.ts | 82 +++++++++++---------------- src/Logic/Web/LinkedDataLoader.ts | 7 ++- 4 files changed, 104 insertions(+), 53 deletions(-) create mode 100644 scripts/velopark/diffToCsv.ts diff --git a/scripts/velopark/compare.ts b/scripts/velopark/compare.ts index 947e9b580..cea83eb63 100644 --- a/scripts/velopark/compare.ts +++ b/scripts/velopark/compare.ts @@ -65,6 +65,10 @@ class Compare extends Script { async main(args: string[]): Promise { let [velopark, osm, key] = args + if(velopark === undefined || osm === undefined){ + console.log("Needed argument: velopark.geojson osm.geojson [key]\nThe key is optional and will be `ref:velopark` by default\nUse overpass to get a geojson with ref:velopark") + return + } key ??= "ref:velopark" const veloparkData: FeatureCollection = JSON.parse(fs.readFileSync(velopark, "utf-8")) const osmData: FeatureCollection = JSON.parse(fs.readFileSync(osm, "utf-8")) @@ -82,6 +86,7 @@ class Compare extends Script { console.error("No velopark entry found for", veloId) continue } + console.log("Veloparking is", veloparking) diffs.push(this.compare(veloId, parking, veloparking)) } console.log( diff --git a/scripts/velopark/diffToCsv.ts b/scripts/velopark/diffToCsv.ts new file mode 100644 index 000000000..d0031ae8f --- /dev/null +++ b/scripts/velopark/diffToCsv.ts @@ -0,0 +1,63 @@ +import Script from "../Script" +import { readFileSync, writeFileSync } from "fs" +import { OsmId } from "../../src/Models/OsmFeature" +import { Utils } from "../../src/Utils" + +interface DiffItem { + /** + * Velopark-id + */ + "ref": string, + "osmid": OsmId, + "distance": number, + "diffs": { + key: string, + /** + * The value in OpenStreetMap + * Might be undefined if OSM doesn't have an appropriate value + */ + osm?: string, + velopark: string | number } [] +} + +export class DiffToCsv extends Script { + constructor() { + super("Converts a 'report.diff' to a CSV file for people who prefer LibreOffice Calc (or other Spreadsheet Software)") + } + + async main(args: string[]): Promise { + const file = args[0] ?? "report_diff.json" + const json = <{diffs:DiffItem[], distanceBinds: number[]}> JSON.parse(readFileSync(file, "utf8")) + const diffs = json.diffs + const allKeys = Utils.Dedup(diffs.flatMap(item => item.diffs.map(d => d.key))) + allKeys.sort() + + const header = ["osm_id","velopark_id", "distance",...allKeys.flatMap(k => ["osm:"+k, "velopark:"+k])] + const lines = [header] + for (const diffItem of diffs) { + const line = [] + lines.push(line) + line.push(diffItem.osmid) + line.push(diffItem.ref) + line.push(diffItem.distance) + + const d = diffItem.diffs + for (const k of allKeys) { + const found = d.find(i => i.key === k) + if(!found){ + line.push("","") + continue + } + line.push(found.osm, found.velopark) + } + + } + const path = "report_diff.csv" + writeFileSync(path, + lines.map(l => l.join(",")).join("\n") + ,"utf8") + console.log("Written", path) + } +} + +new DiffToCsv().run() diff --git a/scripts/velopark/veloParkToGeojson.ts b/scripts/velopark/veloParkToGeojson.ts index acbc6d0eb..839155079 100644 --- a/scripts/velopark/veloParkToGeojson.ts +++ b/scripts/velopark/veloParkToGeojson.ts @@ -23,9 +23,9 @@ class VeloParkToGeojson extends Script { JSON.stringify( extension === ".geojson" ? { - type: "FeatureCollection", - features, - } + type: "FeatureCollection", + features + } : features, null, " " @@ -34,34 +34,14 @@ class VeloParkToGeojson extends Script { console.log("Written", file, "(" + features.length, " features)") } - public static sumProperties(data: object, addTo: Record>) { - delete data["@context"] - for (const k in data) { - if (k === "@graph") { - for (const obj of data["@graph"]) { - this.sumProperties(obj, addTo) - } - continue - } - if (addTo[k] === undefined) { - addTo[k] = new Set() - } - addTo[k].add(data[k]) - } - } - private static async downloadDataFor( - url: string, - allProperties: Record> + url: string ): Promise { - const cachePath = "/home/pietervdvn/data/velopark_cache/" + url.replace(/[/:.]/g, "_") - if (!fs.existsSync(cachePath)) { - const data = await Utils.downloadJson(url) - fs.writeFileSync(cachePath, JSON.stringify(data), "utf-8") - console.log("Saved a backup to", cachePath) + const cachePath = "/home/pietervdvn/data/velopark_cache_refined/" + url.replace(/[/:.]/g, "_") + if (fs.existsSync(cachePath)) { + return JSON.parse(fs.readFileSync(cachePath, "utf8")) } - - this.sumProperties(JSON.parse(fs.readFileSync(cachePath, "utf-8")), allProperties) + console.log("Fetching data for", url) const linkedData = await LinkedDataLoader.fetchVeloparkEntry(url) const allVelopark: Feature[] = [] @@ -70,9 +50,12 @@ class VeloParkToGeojson extends Script { if (Object.keys(sectionInfo).length === 0) { console.warn("No result for", url) } - sectionInfo["ref:velopark"] = [sectionId ?? url] + if(!sectionInfo.geometry?.coordinates){ + throw "Invalid properties!" + } allVelopark.push(sectionInfo) } + fs.writeFileSync(cachePath, JSON.stringify(allVelopark), "utf8") return allVelopark } @@ -85,20 +68,24 @@ class VeloParkToGeojson extends Script { let failed = 0 console.log("Got", allVeloparkRaw.length, "items") const allVelopark: Feature[] = [] - const allProperties = {} - for (let i = 0; i < allVeloparkRaw.length; i++) { - const f = allVeloparkRaw[i] - console.log("Handling", i + "/" + allVeloparkRaw.length) - try { - const sections: Feature[] = await VeloParkToGeojson.downloadDataFor( - f.url, - allProperties - ) - allVelopark.push(...sections) - } catch (e) { - console.error("Loading ", f.url, " failed due to", e) - failed++ - } + const batchSize = 50 + for (let i = 0; i < allVeloparkRaw.length; i += batchSize) { + await Promise.all(Utils.TimesT(batchSize, j => j).map( + async j => { + const f = allVeloparkRaw[i + j] + if (!f) { + return + } + try { + const sections: Feature[] = await VeloParkToGeojson.downloadDataFor(f.url) + allVelopark.push(...sections) + } catch (e) { + console.error("Loading ", f.url, " failed due to", e) + failed++ + } + } + )) + } console.log( "Fetching data done, got ", @@ -107,11 +94,6 @@ class VeloParkToGeojson extends Script { failed ) VeloParkToGeojson.exportGeojsonTo("velopark_all", allVelopark) - for (const k in allProperties) { - allProperties[k] = Array.from(allProperties[k]) - } - - fs.writeFileSync("all_properties_mashup.json", JSON.stringify(allProperties, null, " ")) return allVelopark } @@ -158,7 +140,7 @@ class VeloParkToGeojson extends Script { private static async createDiff(allVelopark: Feature[]) { const bboxBelgium = new BBox([ [2.51357303225, 49.5294835476], - [6.15665815596, 51.4750237087], + [6.15665815596, 51.4750237087] ]) const alreadyLinkedQuery = new Overpass( @@ -201,7 +183,7 @@ class VeloParkToGeojson extends Script { VeloParkToGeojson.exportExtraAmenities(allVelopark) await VeloParkToGeojson.createDiff(allVelopark) console.log( - "Use vite-node script/velopark/compare 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" ) } } diff --git a/src/Logic/Web/LinkedDataLoader.ts b/src/Logic/Web/LinkedDataLoader.ts index 7bf03953e..97636ec3b 100644 --- a/src/Logic/Web/LinkedDataLoader.ts +++ b/src/Logic/Web/LinkedDataLoader.ts @@ -316,14 +316,16 @@ export default class LinkedDataLoader { input: Record> ): Record { const output: Record = {} - console.log("Input for patchVelopark:", input) for (const k in input) { output[k] = Array.from(input[k]) } - if (output["type"][0] === "https://data.velopark.be/openvelopark/terms#BicycleLocker") { + if (output["type"]?.[0] === "https://data.velopark.be/openvelopark/terms#BicycleLocker") { output["bicycle_parking"] = ["lockers"] } + if(output["type"] === undefined){ + console.error("No type given for", output) + } delete output["type"] function on(key: string, applyF: (s: string) => string) { @@ -506,7 +508,6 @@ export default class LinkedDataLoader { " ?parking a ", "?parking " + property + " " + (variable ?? "") ) - console.log("Fetching a velopark property gave", property, results) return results } From 0027299a3e373e9cd19deec0b93dd7a7599ff78a Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 01:02:45 +0200 Subject: [PATCH 16/43] Fix: effectively show `contact:website` in title icons --- assets/layers/icons/icons.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/layers/icons/icons.json b/assets/layers/icons/icons.json index 8b290c036..11553fe28 100644 --- a/assets/layers/icons/icons.json +++ b/assets/layers/icons/icons.json @@ -201,7 +201,7 @@ }, { "#": "ignore-image-in-then", - "if": "context:website~*", + "if": "contact:website~*", "then": "website" } ] From 05ef268deb96e6853e51110e3f4d032a1567b41e Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 01:23:50 +0200 Subject: [PATCH 17/43] Chore: remove unused domain, formatting --- Docs/ServerConfig/hetzner/Caddyfile | 34 +++++++++++++---------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/Docs/ServerConfig/hetzner/Caddyfile b/Docs/ServerConfig/hetzner/Caddyfile index e18870f7f..5f1789fc8 100644 --- a/Docs/ServerConfig/hetzner/Caddyfile +++ b/Docs/ServerConfig/hetzner/Caddyfile @@ -1,22 +1,26 @@ hosted.mapcomplete.org { - root * public/ file_server + root * public/ + header { +Permissions-Policy "interest-cohort=()" - +Report-To `\{"group":"csp-endpoint", "max_age": 86400,"endpoints": [\{"url": "https://report.mapcomplete.org/csp"}], "include_subdomains": true}` - } + +Report-To `\{"group":"csp-endpoint", "max_age": 86400,"endpoints": [\{"url": "https://report.mapcomplete.org/csp" + } ], "include_subdomains": true +} + +` +} } countrycoder.mapcomplete.org { - root * tiles/ file_server + root * tiles/ header { - +Permissions-Policy "interest-cohort=()" - +Access-Control-Allow-Origin https://hosted.mapcomplete.org https://dev.mapcomplete.org https://mapcomplete.org - } + +Permissions-Policy "interest-cohort=()" + +Access-Control-Allow-Origin https://hosted.mapcomplete.org https://dev.mapcomplete.org https://mapcomplete.org + } } - report.mapcomplete.org { reverse_proxy { to http://127.0.0.1:2600 @@ -30,15 +34,7 @@ studio.mapcomplete.org { } lod.mapcomplete.org { - reverse_proxy /extractgraph { - to http://127.0.0.1:2346 - } + reverse_proxy /extractgraph { + to http://127.0.0.1:2346 + } } - -proxy.mapcomplete.org { - reverse_proxy { - to http://127.0.0.1:1237 - } -} - - From ad2aaa059f70a15fb95cdfdccd0e1d51250f8df5 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 01:27:34 +0200 Subject: [PATCH 18/43] Chore: fix bug by formatting --- Docs/ServerConfig/hetzner/Caddyfile | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Docs/ServerConfig/hetzner/Caddyfile b/Docs/ServerConfig/hetzner/Caddyfile index 5f1789fc8..dc8a899cc 100644 --- a/Docs/ServerConfig/hetzner/Caddyfile +++ b/Docs/ServerConfig/hetzner/Caddyfile @@ -1,11 +1,11 @@ hosted.mapcomplete.org { - file_server - root * public/ - - header { - +Permissions-Policy "interest-cohort=()" - +Report-To `\{"group":"csp-endpoint", "max_age": 86400,"endpoints": [\{"url": "https://report.mapcomplete.org/csp" - } ], "include_subdomains": true + file_server { + root * public/ + index index.html + header { + +Permissions-Policy "interest-cohort=()" + +Report-To `\{"group":"csp-endpoint", "max_age": 86400,"endpoints": [\{"url": "https://report.mapcomplete.org/csp"}], "include_subdomains": true}` + } } ` @@ -13,11 +13,12 @@ hosted.mapcomplete.org { } countrycoder.mapcomplete.org { - file_server - root * tiles/ - header { - +Permissions-Policy "interest-cohort=()" - +Access-Control-Allow-Origin https://hosted.mapcomplete.org https://dev.mapcomplete.org https://mapcomplete.org + file_server { + root * tiles/ + header { + +Permissions-Policy "interest-cohort=()" + +Access-Control-Allow-Origin https://hosted.mapcomplete.org https://dev.mapcomplete.org https://mapcomplete.org + } } } From b951585612dd967a2f93f8cf355c98f720f01f1b Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 01:28:51 +0200 Subject: [PATCH 19/43] Chore: fix bug by formatting --- Docs/ServerConfig/hetzner/Caddyfile | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Docs/ServerConfig/hetzner/Caddyfile b/Docs/ServerConfig/hetzner/Caddyfile index dc8a899cc..3ddcabbfe 100644 --- a/Docs/ServerConfig/hetzner/Caddyfile +++ b/Docs/ServerConfig/hetzner/Caddyfile @@ -1,15 +1,11 @@ hosted.mapcomplete.org { file_server { root * public/ - index index.html header { +Permissions-Policy "interest-cohort=()" +Report-To `\{"group":"csp-endpoint", "max_age": 86400,"endpoints": [\{"url": "https://report.mapcomplete.org/csp"}], "include_subdomains": true}` - } -} - -` -} + } + } } countrycoder.mapcomplete.org { From 230ea1e907dae81bc85b74aad7dd1813a4e9bc6e Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 01:30:11 +0200 Subject: [PATCH 20/43] Chore: remove header --- Docs/ServerConfig/hetzner/Caddyfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Docs/ServerConfig/hetzner/Caddyfile b/Docs/ServerConfig/hetzner/Caddyfile index 3ddcabbfe..7e7fbe92e 100644 --- a/Docs/ServerConfig/hetzner/Caddyfile +++ b/Docs/ServerConfig/hetzner/Caddyfile @@ -3,7 +3,6 @@ hosted.mapcomplete.org { root * public/ header { +Permissions-Policy "interest-cohort=()" - +Report-To `\{"group":"csp-endpoint", "max_age": 86400,"endpoints": [\{"url": "https://report.mapcomplete.org/csp"}], "include_subdomains": true}` } } } From 85cb90182b00f5d4b42fc77dfffed5976df28a10 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 09:45:04 +0200 Subject: [PATCH 21/43] Chore: formatting --- Docs/ServerConfig/hetzner/Caddyfile | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Docs/ServerConfig/hetzner/Caddyfile b/Docs/ServerConfig/hetzner/Caddyfile index 7e7fbe92e..b0beb86e1 100644 --- a/Docs/ServerConfig/hetzner/Caddyfile +++ b/Docs/ServerConfig/hetzner/Caddyfile @@ -1,19 +1,17 @@ hosted.mapcomplete.org { - file_server { - root * public/ - header { - +Permissions-Policy "interest-cohort=()" - } - } + root * public/ + file_server + header { + +Permissions-Policy "interest-cohort=()" + } } countrycoder.mapcomplete.org { - file_server { - root * tiles/ - header { - +Permissions-Policy "interest-cohort=()" - +Access-Control-Allow-Origin https://hosted.mapcomplete.org https://dev.mapcomplete.org https://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 } } From 7b72da8064b0b3ac4a868a0b9c65e3fdcfa472cf Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 09:45:51 +0200 Subject: [PATCH 22/43] Chore: don't use 'reverse', fix tests --- scripts/GenerateSeries.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/GenerateSeries.ts b/scripts/GenerateSeries.ts index 9ed02a215..a505c84a0 100644 --- a/scripts/GenerateSeries.ts +++ b/scripts/GenerateSeries.ts @@ -272,8 +272,9 @@ class GenerateSeries extends Script { allFeatures = allFeatures.filter((f) => f.properties.metadata?.theme !== "EMPTY CS" && f.geometry.coordinates.length > 0) const centerpointsAll = allFeatures.map((f) => { const centerpoint = GeoOperations.centerpoint(f) + const c = centerpoint.geometry.coordinates // OsmCha doesn't adhere to the Geojson standard and uses `lat` `lon` as coordinates instead of `lon`, `lat` - centerpoint.geometry.coordinates.reverse() + centerpoint.geometry.coordinates = [c[1], c[0]] return centerpoint }) const centerpoints = centerpointsAll.filter(p => { From 7b1ca43266f596c9b9b40a3a86c0f5cf6d213a3e Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 09:47:03 +0200 Subject: [PATCH 23/43] Themes: add 'binding'-service question to copyshops --- assets/layers/shops/shops.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/assets/layers/shops/shops.json b/assets/layers/shops/shops.json index a621c2bb1..892004764 100644 --- a/assets/layers/shops/shops.json +++ b/assets/layers/shops/shops.json @@ -426,6 +426,36 @@ } ] }, + { + "id": "copyshop-binding", + "condition": { + "or": [ + "shop~.*copyshop.*", + "shop~.*stationery.*", + "service:print=yes" + ] + }, + "question": { + "en": "Does this shop offer a binding service?" + }, + "questionHint": { + "en": "Does this shop bind a bundle of pages into a small book, e.g. with a comb, a spiral, wire or by gluing?" + }, + "mappings": [ + { + "if": "service:binding=yes", + "then": { + "en": "This shop binds papers into a booklet" + } + }, + { + "if": "service:binding=no", + "then": { + "en": "This shop does bind books" + } + } + ] + }, { "id": "key_cutter", "question": { From 8c1ddd90e1b043cc4329a8ae2125996a9aac20a3 Mon Sep 17 00:00:00 2001 From: Supaplex Date: Fri, 31 May 2024 03:39:15 +0000 Subject: [PATCH 24/43] Translated using Weblate (Chinese (Traditional)) Currently translated at 99.8% (644 of 645 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/zh_Hant/ --- langs/zh_Hant.json | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/langs/zh_Hant.json b/langs/zh_Hant.json index 9535c1c5a..4dd85ede7 100644 --- a/langs/zh_Hant.json +++ b/langs/zh_Hant.json @@ -47,6 +47,22 @@ "useSomethingElse": "請使用其他的開放街圖編輯器來刪除", "whyDelete": "為什麼這個圖徵要被刪除?" }, + "external": { + "allAreApplied": "所有遺失,外部數值已經複製到開放街圖了", + "allIncluded": "從 {source} 載入的資料已經在開放街圖了", + "apply": "套用", + "applyAll": "套用所有遺失數值", + "conflicting": { + "intro": "開放街圖與來源網站的數值不同。", + "title": "衝突物件" + }, + "error": "錯誤", + "loadedFrom": "下列資料透過內嵌 JSON-LD 由 {source} 載入", + "missing": { + "intro": "開放街圖沒有下列屬性的資訊", + "title": "遺失的物件" + } + }, "favourite": { "loginNeeded": "

登入

只有開放街圖使用者才有個人化樣式", "panelIntro": "

你的個人主題

從所有官方主題啟用你喜愛的圖層", @@ -192,6 +208,11 @@ "customThemeIntro": "這些是先前使用者創造的主題。", "customThemeTitle": "客製化主題", "download": { + "custom": { + "height": "圖片高度 (公釐):", + "title": "下載有專門寬度與高度的圖片", + "width": "圖片寬度 (公釐): " + }, "downloadAsPdf": "下載目前地圖的 PDF 檔", "downloadAsPdfHelper": "列印當前地圖相當理想", "downloadAsPng": "下載為圖片", @@ -263,6 +284,7 @@ "loginToStart": "登入之後來回答這問題", "loginWithOpenStreetMap": "用開放街圖帳號登入", "logout": "登出", + "mappingsAreHidden": "有些選項已經隱藏,搜尋來顯示更多選項。", "menu": { "aboutMapComplete": "關於 MapComplete", "filter": "篩選資料" @@ -466,7 +488,7 @@ }, "welcomeBack": "歡迎回來!", "welcomeExplanation": { - "addNew": "點一下地圖來新增新興趣點。", + "addNew": "有物件遺漏嗎?使用左下角的按鈕來新增新興趣點。", "general": "在這份地圖,你可以檢視、編輯與新增興趣點。在附近放大來檢視興趣點,點一個來檢視或是編輯資訊。所有資料來源以及儲存到開放街圖,能夠自由被再利用。" }, "wikipedia": { From 86dd542c373c2b18a972beb82dc843bb3d812541 Mon Sep 17 00:00:00 2001 From: hugoalh Date: Mon, 3 Jun 2024 07:20:52 +0000 Subject: [PATCH 25/43] Translated using Weblate (Chinese (Traditional)) Currently translated at 99.8% (644 of 645 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/zh_Hant/ --- langs/zh_Hant.json | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/langs/zh_Hant.json b/langs/zh_Hant.json index 4dd85ede7..a0d9df499 100644 --- a/langs/zh_Hant.json +++ b/langs/zh_Hant.json @@ -4,7 +4,7 @@ }, "centerMessage": { "allFilteredAway": "檢視畫面當中沒有滿足過瀘條件的圖徵", - "loadingData": "正在讀取資料…", + "loadingData": "載入資料中…", "noData": "目前檢視畫面沒有相關的圖徵", "ready": "完成!", "retrying": "無法讀取資料,請在 {count} 秒後再試一次…", @@ -56,12 +56,15 @@ "intro": "開放街圖與來源網站的數值不同。", "title": "衝突物件" }, + "currentInOsmIs": "目前,OpenStreetMap 記錄了以下值:", + "done": "完成", "error": "錯誤", "loadedFrom": "下列資料透過內嵌 JSON-LD 由 {source} 載入", "missing": { "intro": "開放街圖沒有下列屬性的資訊", "title": "遺失的物件" - } + }, + "overwrite": "在 OpenStreetMap 中覆寫" }, "favourite": { "loginNeeded": "

登入

只有開放街圖使用者才有個人化樣式", @@ -198,7 +201,7 @@ "title": "版權與署名", "translatedBy": "MapComplete 由 {contributors} 翻譯,而且還有 {hiddenCount} 更多貢獻者" }, - "back": "回去", + "back": "返回", "backToIndex": "回到所有主題地圖的總覽頁面", "backToMap": "回到地圖", "backgroundMap": "選擇背景圖層", @@ -209,6 +212,8 @@ "customThemeTitle": "客製化主題", "download": { "custom": { + "download": "下載 {width} 毫米寬 {height} 毫米高的 PNG", + "downloadHelper": "這是用於列印的", "height": "圖片高度 (公釐):", "title": "下載有專門寬度與高度的圖片", "width": "圖片寬度 (公釐): " @@ -229,7 +234,7 @@ "downloadGeojson": "下載可視資料為 GeoJSON", "downloadGpx": "下載為 GPX 檔案", "downloadGpxHelper": "GPX 檔案能被大部分導航裝置或 app 使用", - "exporting": "匯出…", + "exporting": "匯出中…", "includeMetaData": "包括 metadata (上次編輯者、計算數值等)", "licenseInfo": "

著作權聲明

提供的資料採用 ODbL 授權釋出。可以用任何目標再利用資料,但是需
  • 標明 © 開放街圖貢獻者
  • 任何變動必須相同方式授權
請閱讀完整的 著作權聲明。", "noDataLoaded": "還未載入資料,之後能夠下載", @@ -412,7 +417,7 @@ "modes": { "private": { "docs": "你軌跡的點會被分享出去,並且與其他軌跡整合。你能看到完整的軌跡,並且載入到其他編輯軟體。OpenStreetMap.org 保留你的軌跡", - "name": "暱名" + "name": "匿名" }, "public": { "docs": "你的軌跡會被所有人看到,在 openstreetmap.org 上包括你的使用者檔案與 GPS 軌跡列表", @@ -497,7 +502,7 @@ "doSearch": "搜尋來檢視結果", "failed": "無法載入維基百科頁面", "fromWikipedia": "從自由的百科全書維基百科來的", - "loading": "載入維基百科…", + "loading": "載入維基百科中…", "noResults": "{search}找不到結果", "noWikipediaPage": "這個 Wikidata 項目還沒有相對應的維基百科頁面。", "previewbox": { @@ -538,7 +543,7 @@ "currentLicense": "你的圖片會以 {license} 釋出", "doDelete": "移除圖片", "dontDelete": "取消", - "isDeleted": "已移除", + "isDeleted": "已刪除", "nearby": { "close": "以附近圖片收起面板", "link": "這個圖片顯示物物", @@ -593,9 +598,9 @@ "title": "歡迎使用 MapComplete" }, "move": { - "cancel": "取消動作", + "cancel": "取消移動", "cannotBeMoved": "這個圖徵無法移動。", - "confirmMove": "移動到這裡", + "confirmMove": "移動至這裏", "inviteToMove": { "generic": "移動這個點", "reasonInaccurate": "改進這個點的精確度", @@ -625,7 +630,7 @@ "addComment": "新增評論", "addCommentAndClose": "新增評論並且關閉", "addCommentPlaceholder": "新增評論…", - "anonymous": "暱名用戶", + "anonymous": "匿名用戶", "closeNote": "關閉註解", "createNote": "新增新註解", "createNoteIntro": "地圖有什麼錯誤或缺漏的嗎?這裡新增註解,之後會由志工來檢查。", @@ -711,7 +716,7 @@ "rated": "評分 {n} 顆星", "reviewPlaceholder": "描述你的經驗…", "reviewing_as": "以 {nickname} 評鑑", - "reviewing_as_anonymous": "暱名評鑑", + "reviewing_as_anonymous": "匿名評鑑", "reviews_bug": "預期更多評鑑嗎?有些評鑑因為臭蟲無法顯示。", "save": "儲存評鑑", "saved": "已經儲存評鑑,謝謝你的分享!", @@ -730,7 +735,7 @@ "hasBeenSplit": "這路徑已經分割", "inviteToSplit": "分割這道路比較小的片段,讓不同道路能有不同的屬性。", "loginToSplit": "你必須登入才能分割道路", - "split": "分開", + "split": "分割", "splitAgain": "再次切割道路", "splitTitle": "請在地圖選擇要在那裡變更道路屬性" }, From c18748c66ab5fa0b0d595d321ca9f2a473a15e93 Mon Sep 17 00:00:00 2001 From: yhr Date: Fri, 31 May 2024 14:37:45 +0000 Subject: [PATCH 26/43] Translated using Weblate (Chinese (Simplified)) Currently translated at 8.5% (55 of 645 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/zh_Hans/ --- langs/zh_Hans.json | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/langs/zh_Hans.json b/langs/zh_Hans.json index ed03f4a55..7fae10c4e 100644 --- a/langs/zh_Hans.json +++ b/langs/zh_Hans.json @@ -20,12 +20,19 @@ "cancel": "取消", "cannotBeDeleted": "此功能无法被删除", "delete": "删除", + "deletedTitle": "已删除的功能", "explanations": { "hardDelete": "此功能在 OpenStreetMap 中将被删除。它可以由有经验的贡献者进行恢复", - "retagNoOtherThemes": "此功能将被重新分类并从此应用中隐藏" + "retagNoOtherThemes": "此功能将被重新分类并从此应用中隐藏", + "retagOtherThemes": "此功能将在 {otherThemes} 中重新标记和可见", + "selectReason": "请选择应删除此功能的原因", + "softDelete": "此功能将在此应用程序中更新并隐藏。{reason}" }, + "isChanged": "此要素已更改,不再与此图层匹配", + "isDeleted": "此功能已删除", "isntAPoint": "只能删除节点,选择的特征是路径、区域或关系。", "loading": "检查属性以检查是否可以删除此功能。", + "loginToDelete": "您必须登录才能删除功能", "notEnoughExperience": "这个要素由其他人创建。", "onlyEditedByLoggedInUser": "这个要素仅被您所编辑,您可以安全的删除它。", "partOfOthers": "该节点是某种方式或关系的一部分,不能直接删除。", @@ -40,6 +47,24 @@ "useSomethingElse": "使用其他OpenStreetMap编辑器来删除它", "whyDelete": "为什么这个要素需要被删除?" }, + "external": { + "allAreApplied": "所有缺失的外部值都已复制到OpenStreetMap中", + "allIncluded": "从{source}加载的数据包含在OpenStreetMap中", + "apply": "应用", + "applyAll": "应用所有缺失值", + "conflicting": { + "intro": "OpenStreetMap的值与以下值的源网站不同。", + "title": "冲突项目" + }, + "currentInOsmIs": "目前,OpenStreetMap记录了以下值:", + "done": "做", + "error": "错误", + "loadedFrom": "以下数据是使用嵌入式 JSON-LD 从 {source} 加载的", + "missing": { + "intro": "OpenStreetMap没有关于以下属性的信息", + "title": "缺少的物品" + } + }, "favourite": { "reload": "重新加载数据" }, @@ -47,6 +72,16 @@ "add": { "disableFilters": "禁用所有过滤器", "hasBeenImported": "这个要素已经被导入过了" + }, + "attribution": { + "mapillaryHelp": "Mapillary 是一项在线服务,它收集街头图片并在免费许可下提供。贡献者可以使用这些图片来改进OpenStreetMap" } + }, + "image": { + "uploadFailed": "无法上传您的图片。您是否已连接到互联网,并允许第三方 API?Brave 浏览器或 uMatrix 插件可能会阻止它们。" + }, + "privacy": { + "editingOutro": "有关详细信息,请参阅 OpenStreetMap.org 上的隐私政策。我们想提醒您,您可以在注册时使用虚构的名字。", + "miscCookies": "MapComplete 与各种其他服务集成,特别是加载要素图像。图像托管在各种第三方服务器上,这些服务器可能会自行设置 cookie。" } } From 121cf6da89d15392730656dff1bf48b819f93c78 Mon Sep 17 00:00:00 2001 From: hugoalh Date: Tue, 4 Jun 2024 09:47:13 +0000 Subject: [PATCH 27/43] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (645 of 645 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/zh_Hant/ --- langs/zh_Hant.json | 1 + 1 file changed, 1 insertion(+) diff --git a/langs/zh_Hant.json b/langs/zh_Hant.json index a0d9df499..771b06ec8 100644 --- a/langs/zh_Hant.json +++ b/langs/zh_Hant.json @@ -64,6 +64,7 @@ "intro": "開放街圖沒有下列屬性的資訊", "title": "遺失的物件" }, + "noDataLoaded": "外部網站沒有可以載入的已連結資料", "overwrite": "在 OpenStreetMap 中覆寫" }, "favourite": { From 7ce2352ae7d3c0b77a4db95300e574e6203f4a9f Mon Sep 17 00:00:00 2001 From: hugoalh Date: Tue, 4 Jun 2024 09:41:15 +0000 Subject: [PATCH 28/43] Translated using Weblate (Chinese (Traditional)) Currently translated at 47.3% (242 of 511 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/zh_Hant/ --- langs/themes/zh_Hant.json | 128 +++++++++++++++++++++++++++++++++----- 1 file changed, 112 insertions(+), 16 deletions(-) diff --git a/langs/themes/zh_Hant.json b/langs/themes/zh_Hant.json index f209bca65..099f88b24 100644 --- a/langs/themes/zh_Hant.json +++ b/langs/themes/zh_Hant.json @@ -13,7 +13,7 @@ "title": "藝術品" }, "atm": { - "description": "這份地圖顯示領錢與存錢的 ATM", + "description": "此地圖顯示了提款或存款的 ATM", "layers": { "3": { "override": { @@ -53,7 +53,7 @@ }, "bookcases": { "description": "公共書架是街邊箱子、盒子、舊的電話亭或是其他存放書本的物件,每一個人都能放置或拿取書本。這份地圖收集所有類型的書架,你可以探索你附近新的書架,同時也能用免費的開放街圖帳號來快速新增你最愛的書架。", - "title": "開放書架地圖" + "title": "公共書櫃" }, "cafes_and_pubs": { "description": "咖啡廳、俱樂部與酒吧", @@ -123,10 +123,10 @@ "caravansites-long-term": { "mappings": { "0": { - "then": "有,這個地方有提供長期租用,但你也可以用天計算費用" + "then": "有些地方提供長期租用,但你也可以用天計算費用" }, "1": { - "then": "沒有,這裡沒有永久的客戶" + "then": "這裏沒有永久的客人" }, "2": { "then": "如果有長期租用合約才有可能待下來(如果你選擇這個地方則會在這份地圖消失)" @@ -283,13 +283,31 @@ "climbing": { "description": "在這份地圖上你會發現能夠攀爬機會,像是攀岩體育館、抱石大廳以及大自然當中的巨石。", "descriptionTail": "攀爬地圖最初由 Christian Neumann 製作。如果你有回饋意見或問題請到Please 這邊反應

這專案使用來自開放街圖專案的資料。

", - "title": "開放攀爬地圖" + "title": "攀岩館、俱樂部和場所" + }, + "cycle_highways": { + "layers": { + "0": { + "name": "單車高速公路", + "title": { + "render": "單車高速公路" + } + } + }, + "title": "單車高速公路" }, "cycle_infra": { "description": "可以檢視與編輯單車相關設施的地圖,在 #os0c21時製作。", "shortDescription": "檢視與編輯單車相關設施的地圖。", "title": "單車設施" }, + "cyclenodes": { + "layers": { + "1": { + "name": "節點" + } + } + }, "cyclestreets": { "description": "單車街道是機動車輛受限制,只允許單車通行的道路。通常會有路標顯示特別的交通指標。單車街道通常在荷蘭、比利時看到,但德國與法國也有。 ", "layers": { @@ -297,7 +315,16 @@ "name": "單車街道" }, "1": { - "name": "將來的單車街道" + "name": "將來的單車街道", + "title": { + "render": "將來的單車街道" + } + }, + "2": { + "name": "所有道路", + "title": { + "render": "街道" + } } }, "shortDescription": "單車街道的地圖", @@ -305,12 +332,15 @@ }, "cyclofix": { "description": "這份地圖的目的是為單車騎士能夠輕易顯示滿足他們需求的相關設施。

你可以追蹤你確切位置 (只有行動版),以及在左下角選擇相關的圖層。你可以使用這工具在地圖新增或編輯釘子,以及透過回答問題來提供更多資訊。

所有你的變動都會自動存在開放街圖這全球資料圖,並且能被任何人自由取用。

你可以到 cyclofix.osm.be 閱讀更多資訊。", - "title": "單車修正 - 單車騎士的開放地圖" + "title": "單車修正—單車騎士的地圖" }, "drinking_water": { "description": "在這份地圖上,公共可及的飲水點可以顯示出來,也能輕易的增加", "title": "飲用水" }, + "education": { + "title": "教育" + }, "etymology": { "description": "在這份地圖,你可以看到物件是以何命名,道路、 建築等的命名由來連到 Wikidata。在跳出選單,你可以看到物件命名由來的維基條目 (如果有的話),或是 Wikidata 框。如果物件本身有維基頁面,也會顯示。

你也可以貢獻!放大到夠大的層級,然後所有道路都會顯示。你可以點選一個之後 Wikidata 搜尋框會跳出來。只要點幾下,你可以新增詞源連結。注意你要有開放街圖帳號才能這麼做。", "layers": { @@ -364,12 +394,39 @@ "hackerspaces": { "description": "在這份地圖上你可以看到駭客空間,新增或直接更新資料", "shortDescription": "駭客空間的地圖", - "title": "駭客空間" + "title": "駭客空間與創客空間" }, "hailhydrant": { "description": "在這份地圖上面你可以在你喜愛的社區尋找與更新消防栓、消防隊、急救站與滅火器。\n\n你可以追蹤確切位置 (只有行動版) 以及在左下角選擇與你相關的圖層。你也可以使用這工具新增或編輯地圖上的釘子 (興趣點),以及透過回答一些問題提供額外的資訊。\n\n所有你做出的變動都會自動存到開放街圖這個全球資料庫,而且能自由讓其他人取用。", "shortDescription": "顯示消防栓、滅火器、消防隊與急救站的地圖。", - "title": "消防栓、滅火器、消防隊、以及急救站。" + "title": "消防栓、滅火器、消防局和救護站" + }, + "healthcare": { + "layers": { + "5": { + "override": { + "=presets": { + "2": { + "title": "配鏡師" + } + } + } + } + }, + "title": "醫療保健" + }, + "hotels": { + "title": "飯店" + }, + "indoors": { + "title": "室內" + }, + "mapcomplete-changes": { + "layers": { + "0": { + "name": "變更集中心" + } + } }, "maproulette": { "title": "MapRoulette 任務" @@ -398,9 +455,33 @@ "shortDescription": "開發可及能觀景的高塔", "title": "觀景塔" }, + "onwheels": { + "layers": { + "19": { + "override": { + "=title": { + "render": "統計數據" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "匯入" + } + } + } + } + } + } + } + }, "openwindpowermap": { "description": "顯示與編輯風機的地圖。", - "title": "開放風力地圖" + "title": "風力發電機" }, "parkings": { "description": "這地圖顯示不同的停車空間", @@ -469,7 +550,7 @@ "title": "郵遞區號" }, "postboxes": { - "description": "在這份地圖你能找到與新增有關郵局與郵筒的資料,你可以用這份地圖找到寄送您下張明信片的地方!:)
發現錯誤或是有郵筒遺漏嗎?你可以用免費的開放街圖帳號來編輯。 ", + "description": "在這份地圖你能找到與新增有關郵局與郵筒的資料,你可以用這份地圖找到寄送您下張明信片的地方!:)
發現錯誤或是有郵筒遺漏嗎?你可以用免費的開放街圖帳號來編輯。", "shortDescription": "顯示郵筒與郵局的地圖", "title": "郵筒與郵局地圖" }, @@ -486,7 +567,10 @@ "layers": { "0": { "description": "顯示道路的人行穿越道的圖層", - "name": "人行道" + "name": "人行道", + "title": { + "render": "{name}" + } } }, "title": "人行道" @@ -513,10 +597,8 @@ }, "stations": { "layers": { - "3": { - "description": "顯示火車站的圖層" - }, "16": { + "name": "出發板", "presets": { "0": { "title": "時刻表" @@ -535,6 +617,10 @@ "title": { "render": "時刻表" } + }, + "3": { + "description": "顯示火車站的圖層", + "name": "火車站" } }, "title": "火車站" @@ -613,6 +699,16 @@ "shortDescription": "所有樹木的地圖", "title": "樹木" }, + "vending_machine": { + "title": "自動販賣機" + }, + "walkingnodes": { + "layers": { + "1": { + "name": "節點" + } + } + }, "walls_and_buildings": { "description": "特殊的內建圖層顯示所有牆壁與建築。這個圖層對於規畫要靠牆的東西 (例如 AED、郵筒、入口、地址、監視器等) 相當實用。這個圖層預設顯示而且無法由使用者開關。", "title": "牆壁與建築" @@ -626,4 +722,4 @@ "shortDescription": "垃圾筒的地圖", "title": "垃圾筒" } -} \ No newline at end of file +} From ed074812bf142e63478440558236dac93b458ba5 Mon Sep 17 00:00:00 2001 From: Krzysztof Chorzempa Date: Wed, 5 Jun 2024 14:05:58 +0000 Subject: [PATCH 29/43] Translated using Weblate (Polish) Currently translated at 78.6% (402 of 511 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/pl/ --- langs/themes/pl.json | 91 ++++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 32 deletions(-) diff --git a/langs/themes/pl.json b/langs/themes/pl.json index d744ef078..ace47a10b 100644 --- a/langs/themes/pl.json +++ b/langs/themes/pl.json @@ -96,6 +96,9 @@ "shortDescription": "Mapa ławek", "title": "Ławki" }, + "bicycle_parkings": { + "title": "Parkingi dla rowerów" + }, "bicycle_rental": { "description": "Na tej mapie znajdziesz wiele stacji wynajmu rowerów, znanych w OpenStreetMap", "shortDescription": "Mapa ze stacjami wypożyczania rowerów i wypożyczalniami rowerów", @@ -486,9 +489,17 @@ "name": "węzły", "tagRenderings": { "node-expected_rcn_route_relations": { + "freeform": { + "placeholder": "np. 3" + }, "question": "Z iloma innymi węzłami rowerowymi łączy się ten węzeł?", "render": "Ten węzeł łączy się z innymi węzłami rowerowymi {expected_rcn_route_relations}." }, + "node-rxn_ref": { + "freeform": { + "placeholder": "np. 1" + } + }, "node-survey:date": { "override": { "question": "Kiedy ostatni raz badano ten węzeł rowerowy?", @@ -844,6 +855,22 @@ }, "title": "Krawężniki i przejścia" }, + "mapcomplete-changes": { + "description": "Ta mapa pokazuje wszystkie zmiany wprowadzone za pomocą MapComplete", + "layers": { + "0": { + "filter": { + "0": { + "options": { + "0": { + "question": "Nazwa tematu zawiera {search}" + } + } + } + } + } + } + }, "maproulette": { "description": "Temat pokazujący zadania MapRoulette, umożliwiający ich wyszukiwanie, filtrowanie i naprawianie.", "title": "Zadania MapRoulette" @@ -875,6 +902,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": { @@ -917,33 +971,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" @@ -1104,10 +1131,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", @@ -1139,6 +1162,10 @@ "title": { "render": "Tablica odjazdów" } + }, + "3": { + "description": "Warstwa pokazująca stacje kolejowe", + "name": "Stacje Kolejowe" } }, "title": "Stacje Kolejowe" @@ -1260,4 +1287,4 @@ "shortDescription": "Mapa koszy na śmieci", "title": "Kosz na śmieci" } -} \ No newline at end of file +} From 2e3d861239f9c0bd938d72d4f919a3bb83bd5f21 Mon Sep 17 00:00:00 2001 From: SC Date: Fri, 7 Jun 2024 21:17:29 +0000 Subject: [PATCH 30/43] Translated using Weblate (Portuguese) Currently translated at 100.0% (645 of 645 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/pt/ --- langs/pt.json | 122 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 114 insertions(+), 8 deletions(-) diff --git a/langs/pt.json b/langs/pt.json index ee94cb297..9fbf8256b 100644 --- a/langs/pt.json +++ b/langs/pt.json @@ -492,7 +492,7 @@ "tuesday": "Terça-feira", "wednesday": "Quarta-feira" }, - "welcomeBack": "Iniciou a sessão, bem-vindo de volta!", + "welcomeBack": "Bem-vindo de volta!", "welcomeExplanation": { "addNew": "Está a faltar um item? Utilize o botão no canto inferior esquerdo para adicionar um novo ponto de interesse.", "general": "Neste mapa, pode ver, editar e adicionar pontos de interesse. Aproxime a visualização para ver o POI, toque num para ver ou editar a informação. Todos os dados são obtidos e guardados no OpenStreetMap, que podem ser livremente reutilizados." @@ -696,20 +696,40 @@ "miscCookies": "O MapComplete integra-se em vários outros serviços, nomeadamente para carregar imagens de elementos. As imagens são alojadas em vários servidores de terceiros, que poderão criar cookies por si próprios.", "miscCookiesTitle": "Outros cookies", "surveillance": "Como está a ler a política de privacidade, provavelmente preocupa-se com a privacidade - nós também! Até criámos um tema que mostra câmaras de vigilância. Não hesite em mapeá-las todas!", - "title": "Política de privacidade" + "title": "Política de privacidade", + "tracking": "Para obter informações sobre quem visita o nosso sítio web, são recolhidas algumas informações técnicas. Estas incluem o país a partir do qual visitou a página web, o sítio web que o encaminhou para a MapComplete, o tipo de dispositivo e o tamanho do ecrã. É colocado um cookie no seu dispositivo para indicar que visitou o MapComplete hoje. Estes dados não são suficientemente pormenorizados para o identificar pessoalmente. Estas estatísticas só são disponibilizadas a qualquer pessoa de forma agregada e são acessíveis ao público", + "trackingTitle": "Dados estatísticos", + "whileYoureHere": "Preocupa-se com a privacidade?" }, "reviews": { "affiliated_reviewer_warning": "(avaliação de afiliado)", "attribution": "As avaliações são fornecidas por Mangrove Reviews e estão disponíveis sob a licença CC-BY 4.0.", - "i_am_affiliated": "Eu sou afiliado a este objeto

Marque isto se for proprietário, criador, funcionário…
", + "averageRating": "Classificação média de {n} estrelas", + "i_am_affiliated": "Estou associado a este objeto", + "i_am_affiliated_explanation": "Marque caso seja proprietário, criador, empregado…", "name_required": "É necessário um nome para mostrar e criar avaliações", "no_reviews_yet": "Ainda não existem avaliações. Seja o primeiro a escrever uma e ajude a abrir os dados e os negócios!", - "saved": "Avaliação guardada. Obrigado por partilhar!", + "non_place_review": "Uma avaliação não é sobre um local e não é mostrada aqui.", + "non_place_reviews": "{n} avaliações não são sobre um local e não são mostradas aqui.", + "question": "Como classificaria {title()}?", + "question_opinion": "Como foi a sua experiência?", + "rate": "Avaliar {n} estrelas", + "rated": "Avaliado com {n} estrelas", + "reviewPlaceholder": "Descreva a sua experiência…", + "reviewing_as": "A avaliar como {nickname}", + "reviewing_as_anonymous": "Avaliar como anónimo", + "reviews_bug": "Esperava mais avaliações? Algumas avaliações não são apresentadas devido a um erro.", + "save": "Guardar avaliação", + "saved": "Avaliação guardada. Obrigado por partilhar!", "saving_review": "A guardar…", + "see_all": "Ver todas as avaliações em mangrove.reviews", "title": "{count} avaliações", "title_singular": "Uma avaliação", + "too_long": "São permitidos no máximo {max} caracteres. A sua avaliação tem {amount} caracteres.", "tos": "Se criar uma avaliação, concorda com os termos do serviço e a política de privacidade de Mangrove.reviews", - "write_a_comment": "Deixar uma avaliação…" + "write_a_comment": "Deixar uma avaliação…", + "your_reviews": "As suas avaliações anteriores", + "your_reviews_empty": "Não encontrámos nenhuma das suas avaliações anteriores" }, "split": { "cancel": "Cancelar", @@ -717,13 +737,99 @@ "inviteToSplit": "Dividir esta estrada em segmentos mais pequenos. Isto permite atribuir propriedades diferentes a várias partes da estrada.", "loginToSplit": "Tem de estar autenticado para dividir uma estrada", "split": "Dividir", - "splitTitle": "Escolha no mapa onde dividir esta estrada" + "splitAgain": "Dividir esta estrada novamente", + "splitTitle": "Seccione no mapa onde as propriedades desta estrada mudam" }, "translations": { - "activateButton": "Ajude a traduzir MapComplete" + "activateButton": "Ajude a traduzir MapComplete", + "allMissing": "Ainda não há traduções", + "missing": "{count} cadeias de caracteres não traduzidas", + "notImmediate": "As traduções não são atualizadas diretamente. Normalmente, isto demora alguns dias" }, "userinfo": { + "editDescription": "Editar a descrição do seu perfil", "gotoInbox": "Abra sua caixa de entrada", - "gotoSettings": "Vá para suas configurações no OpenStreetMap.org" + "gotoSettings": "Vá para suas configurações no OpenStreetMap.org", + "noDescription": "Ainda não tem uma descrição no seu perfil", + "noDescriptionCallToAction": "Adicionar uma descrição do perfil", + "notLoggedIn": "Terminou a sessão" + }, + "validation": { + "color": { + "description": "Uma cor ou código hexadecimal" + }, + "date": { + "description": "Uma data, começando pelo ano" + }, + "direction": { + "description": "Uma orientação" + }, + "distance": { + "description": "Uma distância em metros" + }, + "email": { + "description": "endereço de e-mail", + "feedback": "Isto não é um endereço de e-mail válido", + "noAt": "Um e-mail deve conter um @" + }, + "fediverse": { + "description": "Um identificador fediverse, frequentemente @username@server.tld", + "feedback": "Um identificador fediverse consiste em @username@server.tld ou é uma hiperligação a um perfil", + "invalidHost": "{host} não é um nome de hospedeiro válido", + "onYourServer": "Ver e seguir no seu servidor" + }, + "float": { + "description": "um número", + "feedback": "Isto não é um número" + }, + "id": { + "description": "um identificador", + "invalidCharacter": "Um identificador só pode conter letras, dígitos e sublinhados", + "shouldBeLonger": "Um identificador deve ter pelo menos 3 caracteres" + }, + "int": { + "description": "um número inteiro" + }, + "nat": { + "description": "um número inteiro positivo ou zero", + "mustBePositive": "Este número deve ser positivo", + "mustBeWhole": "Só são permitidos números inteiros", + "notANumber": "Introduzir um número" + }, + "opening_hours": { + "description": "Horário de funcionamento" + }, + "pfloat": { + "description": "um número positivo" + }, + "phone": { + "description": "um número de telefone", + "feedback": "Este não é um número de telefone válido", + "feedbackCountry": "Este não é um número de telefone válido (para o país {country})" + }, + "pnat": { + "description": "um número inteiro positivo", + "noZero": "O zero não é permitido" + }, + "slope": { + "inputExplanation": "Coloque o telemóvel no chão com a parte superior do telemóvel a apontar para o topo da inclinação.", + "inputIncorrect": "Para obter medições corretas, certifique-se de que a seta está dentro da área verde." + }, + "string": { + "description": "um pedaço de texto" + }, + "text": { + "description": "um pedaço de texto" + }, + "tooLong": "O texto é demasiado longo, são permitidos no máximo 255 caracteres. Tem agora {count} caracteres.", + "url": { + "description": "hiperligação a um sítio web", + "feedback": "Isto não é um endereço web válido" + }, + "wikidata": { + "description": "Um identificador Wikidata", + "empty": "Por favor, introduza algumas entradas wikidata", + "startsWithQ": "Um identificador wikidata começa por Q e é seguido de um número" + } } } From dbf274e85e01eeef4d2297ccfc1739757cfdbab7 Mon Sep 17 00:00:00 2001 From: kjon Date: Mon, 10 Jun 2024 19:49:31 +0000 Subject: [PATCH 31/43] Translated using Weblate (German) Currently translated at 100.0% (513 of 513 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/de/ --- langs/themes/de.json | 82 +++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/langs/themes/de.json b/langs/themes/de.json index a11cd1341..c8238035b 100644 --- a/langs/themes/de.json +++ b/langs/themes/de.json @@ -975,6 +975,10 @@ }, "title": "Bordsteine und Überwege" }, + "lighthouses": { + "description": "Leuchttürme sind hohe Gebäude mit einem Licht an der Spitze, das den Schiffsverkehr leitet.", + "title": "Leuchttürme" + }, "mapcomplete-changes": { "description": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen", "layers": { @@ -995,6 +999,13 @@ } } }, + "10": { + "options": { + "0": { + "question": "Etymologie-Thema ausschließen" + } + } + }, "2": { "options": { "0": { @@ -1050,13 +1061,6 @@ "question": "GRB-Thema ausschließen" } } - }, - "10": { - "options": { - "0": { - "question": "Etymologie-Thema ausschließen" - } - } } }, "name": "Zentrum der Änderungssätze", @@ -1137,6 +1141,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": { @@ -1179,33 +1210,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" @@ -1447,10 +1451,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", @@ -1482,6 +1482,10 @@ "title": { "render": "Abfahrtstafel" } + }, + "3": { + "description": "Ebene mit Bahnhöfen", + "name": "Bahnhöfe" } }, "title": "Bahnhöfe" @@ -1660,4 +1664,4 @@ "shortDescription": "Eine Karte mit Abfalleimern", "title": "Abfalleimer" } -} \ No newline at end of file +} From 80dcac1ce314df2452ac3223b5868e70a116e0e4 Mon Sep 17 00:00:00 2001 From: Krzysztof Chorzempa Date: Tue, 4 Jun 2024 22:17:33 +0000 Subject: [PATCH 32/43] Translated using Weblate (Polish) Currently translated at 26.5% (933 of 3509 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/pl/ --- langs/layers/pl.json | 798 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 758 insertions(+), 40 deletions(-) diff --git a/langs/layers/pl.json b/langs/layers/pl.json index 30dba7181..7480a33c1 100644 --- a/langs/layers/pl.json +++ b/langs/layers/pl.json @@ -35,6 +35,23 @@ "1": { "title": "wolnostojąca skrzynka plakatowa" }, + "10": { + "description": "Kawałek wodoodpornej tkaniny z nadrukowanym przesłaniem, trwale przymocowany do ściany", + "title": "plandeka" + }, + "11": { + "title": "totem" + }, + "12": { + "description": "Używany do znaków reklamowych, neonów, logo i znaków wejściowych do instytucji", + "title": "znak" + }, + "13": { + "title": "rzeźba" + }, + "14": { + "title": "mural ścienny" + }, "2": { "title": "skrzynka plakatowa montowana na ścianie" }, @@ -54,23 +71,6 @@ }, "8": { "title": "ekran zamontowany na ścianie" - }, - "10": { - "description": "Kawałek wodoodpornej tkaniny z nadrukowanym przesłaniem, trwale przymocowany do ściany", - "title": "plandeka" - }, - "11": { - "title": "totem" - }, - "12": { - "description": "Używany do znaków reklamowych, neonów, logo i znaków wejściowych do instytucji", - "title": "znak" - }, - "13": { - "title": "rzeźba" - }, - "14": { - "title": "mural ścienny" } }, "tagRenderings": { @@ -156,6 +156,9 @@ "1": { "then": "To jest tablica" }, + "10": { + "then": "To jest mural ścienny" + }, "2": { "then": "To jest kolumna" }, @@ -179,9 +182,6 @@ }, "9": { "then": "To jest totem" - }, - "10": { - "then": "To jest mural ścienny" } }, "question": "Jakiego rodzaju jest to obiekt reklamowy?", @@ -196,6 +196,9 @@ "1": { "then": "Tablica" }, + "10": { + "then": "Mural ścienny" + }, "2": { "then": "Pudełko plakatowe" }, @@ -219,9 +222,37 @@ }, "9": { "then": "Totem" - }, - "10": { - "then": "Mural ścienny" + } + } + } + }, + "aerialway": { + "description": "Różne formy transportu dla pasażerów i dóbr, które używają lin, w tym kolejki gondolowe, wyciągi krzesełkowe i orczykowe oraz tyrolki. ", + "pointRendering": { + "1": { + "label": { + "render": "{name}" + } + } + }, + "tagRenderings": { + "duration": { + "question": "Jak długo trwa pojedynczy przejazd tą windą?", + "questionHint": "To nie włącza czasu oczekiwania.", + "render": "Pojedynczy przejazd trwa {duration} minut" + }, + "occupancy": { + "question": "Ile osób może pomieścić jeden wagon?", + "render": "{aerialway:occupancy} osób mieści się w jednym wagonie" + }, + "type": { + "mappings": { + "10": { + "then": "Tyrolka. (Atrakcja turystyczna, która pozwala żądnym przygód zjechać z dużą szybkością) " + }, + "4": { + "then": "Wyciąg orczykowy" + } } } } @@ -269,6 +300,59 @@ "render": "Stacja pogotowia ratunkowego" } }, + "animal_shelter": { + "name": "Schroniska dla zwierząt", + "presets": { + "0": { + "title": "schronisko dla zwierząt" + } + }, + "tagRenderings": { + "2": { + "question": "Jak nazywa się to schronisko dla zwierząt?", + "render": "To schronisko dla zwierząt nazywa się {name}" + }, + "6": { + "mappings": { + "0": { + "then": "Zwierzęta są tutaj dopóki nie znajdą nowego właściciela" + }, + "2": { + "then": "Ranne zwierzęta przechodzą tutaj rehabilitację do momentu, kiedy mogą zostać wypuszczone na wolność " + } + }, + "question": "Jaki jest cel tego schroniska dla zwierząt?" + }, + "boarded_animals": { + "mappings": { + "0": { + "then": "Są tutaj trzymane psy" + }, + "1": { + "then": "Są tutaj trzymane koty" + }, + "2": { + "then": "Są tutaj trzymane konie" + }, + "3": { + "then": "Są tutaj trzymane ptaki" + }, + "4": { + "then": "Są tutaj trzymane dzikie zwierzęta" + } + }, + "question": "Jakie zwierzęta są tutaj przyjmowane?" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Schronisko dla zwierząt" + } + }, "artwork": { "description": "Otwarta mapa posągów, popiersi, graffiti i innych dzieł sztuki z całego świata", "name": "Dzieła sztuki", @@ -297,6 +381,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" }, @@ -320,15 +413,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?", @@ -370,6 +454,36 @@ "render": "Dzieło sztuki" } }, + "assembly_point": { + "description": "Ta warstwa zawiera punkty zbiórki oraz miejsca oczekiwania, gdzie wszyscy pracownicy, pasażerowie lub duży tłum gromadzą się w przypadku zagrożenia.", + "presets": { + "0": { + "title": "punkt zbiórki" + } + }, + "tagRenderings": { + "assembly_point_name": { + "question": "Jak nazywa się ten punkt zbiórki?", + "render": "Ten punkt zbiórki nazywa się {name}" + }, + "disaster_type": { + "mappings": { + "0": { + "then": "Trzęsienie ziemi" + }, + "1": { + "then": "Powódź" + }, + "2": { + "then": "Pożar" + }, + "3": { + "then": "Osuwisko" + } + } + } + } + }, "atm": { "description": "Bankomaty do wypłacania pieniędzy", "name": "Bankomaty", @@ -383,7 +497,8 @@ "freeform": { "placeholder": "Nazwa handlowa" }, - "question": "Jakiej marki jest ten bankomat?" + "question": "Jakiej marki jest ten bankomat?", + "render": "Marka tego bankomatu to {brand}" }, "cash_in": { "mappings": { @@ -453,7 +568,12 @@ } }, "barrier": { - "name": "Barierki" + "name": "Barierki", + "tagRenderings": { + "MaxWidth": { + "render": "Maksymalna szerokość: {maxwidth:physical} m" + } + } }, "bench": { "filter": { @@ -621,6 +741,29 @@ "bicycle_rental": { "description": "Stacje wypożyczania rowerów", "tagRenderings": { + "bicycle-types": { + "mappings": { + "1": { + "then": "Można tutaj wypożyczyć rowery elektryczne" + }, + "3": { + "then": "Można tutaj wypożyczyć rowery górskie" + }, + "4": { + "then": "Można tutaj wypożyczyć rowery dla dzieci" + }, + "5": { + "then": "Można tutaj wypożyczyć tandemy" + }, + "7": { + "then": "Można tutaj wypożyczyć kaski rowerowe" + } + }, + "question": "Jakiego rodzaju rowery i akcesoria są tutaj wypożyczane?" + }, + "bicycle_rental_type": { + "question": "Jakiego rodzaju jest to wypożyczalnia rowerów?" + }, "rental_types": { "rewrite": { "into": { @@ -639,6 +782,9 @@ "4": { "1": "rowery górskie" }, + "5": { + "1": "sakwy rowerowe" + }, "6": { "1": "tandem" } @@ -655,7 +801,44 @@ "render": "Wypożyczalnia rowerów" } }, + "bicycle_tube_vending_machine": { + "tagRenderings": { + "other-items-vending": { + "mappings": { + "1": { + "then": "Są tutaj sprzedawane lampki rowerowe" + }, + "2": { + "then": "Są tutaj sprzedawane rękawiczki" + }, + "4": { + "then": "Są tutaj sprzedawane pompki rowerowe" + } + }, + "question": "Czy są tutaj sprzedawane inne akcesoria rowerowe?" + } + } + }, + "bike_cleaning": { + "description": "Warstwa pokazująca obiekty, gdzie można wyczyścić swój rower", + "name": "Usługa czyszczenia rowerów", + "presets": { + "0": { + "title": "usługa czyszczenia rowerów" + } + }, + "tagRenderings": { + "bike_cleaning-service:bicycle:cleaning:charge": { + "mappings": { + "1": { + "then": "Darmowa" + } + } + } + } + }, "bike_parking": { + "description": "Warstwa pokazująca gdzie można zaparkować rower", "name": "Parking dla rowerów", "presets": { "0": { @@ -673,10 +856,20 @@ "render": "{access}" }, "Bicycle parking type": { + "mappings": { + "0": { + "then": "Stojaki" + }, + "5": { + "then": "Wiata" + } + }, "question": "Jaki jest typ tego parkingu dla rowerów?", "render": "Jest to parking rowerowy typu: {bicycle_parking}" }, "Capacity": { + "question": "Ile rowerów mieści się na tym parkingu rowerowym?", + "questionHint": "To obejmuje zwykłe rowery, do transportu dóbr, elektryczne, ...", "render": "Miejsce na {capacity} rowerów" }, "Underground?": { @@ -867,6 +1060,93 @@ "render": "Wypożyczalnia samochodów" } }, + "charging_station": { + "tagRenderings": { + "Network": { + "mappings": { + "1": { + "then": "Nie jest częścią większej sieci" + } + }, + "question": "Czy ta stacja ładowania jest częścią sieci?", + "render": "Część sieci {network}" + }, + "OH": { + "override": { + "question": "Kiedy jest otwarta ta stacja ładowania?" + } + }, + "Operational status": { + "mappings": { + "0": { + "then": "Ta stacja ładowania działa" + }, + "1": { + "then": "Ta stacja ładowania jest zepsuta" + }, + "2": { + "then": "Planowana jest tutaj stacja ładowania" + }, + "3": { + "then": "Budowana jest tutaj stacja ładowania" + } + } + }, + "Operator": { + "render": "Ta stacja ładowania jest obsługiwana przez {operator}" + }, + "Type": { + "mappings": { + "0": { + "then": "Mogą tutaj być ładowane rowery" + }, + "1": { + "then": "Mogą tutaj być ładowane samochody" + }, + "2": { + "then": "Mogą być tutaj ładowane hulajnogi" + }, + "4": { + "then": "Mogą być tutaj ładowane autobusy" + } + }, + "question": "Jakie pojazdy mogą być tutaj ładowane?" + }, + "access": { + "mappings": { + "0": { + "then": "Każdy może używać tej stacji ładowania (opłata może być wymagana)" + }, + "1": { + "then": "Każdy może używać tej stacji ładowania (opłata może być wymagana)" + } + }, + "question": "Kto może używać tej stacji ładowania?" + }, + "capacity": { + "question": "Ile pojazdów może być tutaj ładowanych jednocześnie?", + "render": "{capacity} pojazdów może być tutaj ładowanych jednocześnie" + }, + "email": { + "render": "W przypadku problemów, wyślij emaila do {email}" + }, + "fee": { + "mappings": { + "2": { + "then": "Darmowa" + } + } + }, + "phone": { + "question": "Na jaki numer można zadzwonić w przypadku problemów z tą stacją ładowania?", + "render": "W przypadku problemów zadzwoń na {phone}" + }, + "ref": { + "question": "Jaki jest numer referencyjny tej stacji ładowania?", + "render": "Numer referencyjny to {ref}" + } + } + }, "climbing_gym": { "tagRenderings": { "shoe_rental": { @@ -1201,6 +1481,7 @@ } }, "elevator": { + "description": "Ta warstwa pokazuje windy i zadaje pytania o ich status i wymiary. Przydatne do informacji o dostępności dla wózków", "name": "Winda", "presets": { "0": { @@ -1212,6 +1493,17 @@ "question": "Jaka jest szerokość drzwi windy?", "render": "Drzwi tej windy mają szerokość {canonical(door:width)}" }, + "elevator-shape": { + "mappings": { + "0": { + "then": "Ta winda ma prostokątny kształt" + }, + "1": { + "then": "Ta winda ma okrągły kształt" + } + }, + "question": "Jaki kształt ma ta winda?" + }, "elevator-width": { "question": "Jaka jest szerokość tej windy?", "render": "Szerokość tej windy to {canonical(width)}" @@ -1232,6 +1524,9 @@ } }, "question": "Czy ta winda działa?" + }, + "speech_output_available": { + "questionHint": "Np. informuje o aktualnym piętrze" } }, "title": { @@ -1594,12 +1889,212 @@ "render": "Duch roweru" } }, + "hospital": { + "tagRenderings": { + "name": { + "question": "Jak nazywa się ten szpital?", + "render": "Nazwa tego szpitala to {name}" + } + }, + "title": { + "render": "Szpital" + } + }, + "hotel": { + "description": "Warstwa pokazująca wszystkie hotele", + "name": "Hotele", + "presets": { + "0": { + "title": "hotel" + } + }, + "tagRenderings": { + "name": { + "freeform": { + "placeholder": "Nazwa hotelu" + }, + "question": "Jak nazywa się ten hotel?", + "render": "Nazwa tego hotelu to {name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Hotel {name}" + } + }, + "render": "Hotel" + } + }, + "hydrant": { + "description": "Warstwa mapy pokazująca hydranty.", + "name": "Mapa hydrantów", + "presets": { + "0": { + "title": "hydrant" + } + }, + "tagRenderings": { + "hydrant-color": { + "mappings": { + "0": { + "then": "Ten hydrant ma żółty kolor." + }, + "1": { + "then": "Ten hydrant ma czerwony kolor." + } + }, + "question": "Jakiego koloru jest ten hydrant?", + "render": "Kolor tego hydrantu to {colour}" + }, + "hydrant-diameter": { + "freeform": { + "placeholder": "Średnica rury" + } + }, + "hydrant-state": { + "mappings": { + "0": { + "then": "Ten hydrant (w pełni lub częściowo) działa" + }, + "1": { + "then": "Ten hydrant jest niedostępny" + }, + "2": { + "then": "Ten hydrant został usunięty" + } + }, + "question": "Czy ten hydrant dalej działa?" + }, + "hydrant-type": { + "question": "Jakiego rodzaju jest to hydrant?" + } + }, + "title": { + "render": "Hydrant" + } + }, + "ice_cream": { + "title": { + "mappings": { + "0": { + "then": "{name}" + } + } + } + }, + "icons": { + "tagRenderings": { + "osmlink": { + "mappings": { + "1": { + "then": { + "special": { + "arialabel": "Otwórz na openstreetmap.org" + } + } + } + }, + "render": { + "special": { + "arialabel": "Otwórz na openstreetmap.org" + } + } + }, + "phonelink": { + "mappings": { + "0": { + "then": { + "special": { + "arialabel": "telefon" + } + } + } + }, + "render": { + "special": { + "arialabel": "telefon" + } + } + } + } + }, "indoors": { "description": "Podstawowe mapowanie wnętrz: pokazuje kontury pomieszczeń", "tagRenderings": { + "name": { + "freeform": { + "placeholder": "Nazwa pomieszczenia" + }, + "question": "Jaka jest nazwa tego pomieszczenia?", + "render": "Nazwa tego pomieszczenia to {name}" + }, "ref": { + "freeform": { + "placeholder": "Numer referencyjny tego pomieszczenia (np. \"1.1\" lub \"A1\")" + }, "question": "Jaki jest numer referencyjny tego pomieszczenia?", "render": "To pomieszczenie ma numer referencyjny {ref}" + }, + "room-capacity": { + "question": "Ile osób może pomieścić to pomieszczenie?", + "render": "To pomieszczenie może pomieścić maksymalnie {capacity} osób" + }, + "room-type": { + "mappings": { + "10": { + "then": "To jest laboratorium" + }, + "11": { + "then": "To jest biblioteka" + }, + "14": { + "then": "To jest biuro" + }, + "15": { + "then": "To jest cela więzienna" + }, + "16": { + "then": "To jest restauracja" + }, + "17": { + "then": "To jest pomieszczenie do wykonywania kontroli bezpieczeństwa" + }, + "19": { + "then": "To jest magazyn" + }, + "2": { + "then": "To jest sypialnia" + }, + "20": { + "then": "To jest pomieszczenie techniczne" + }, + "21": { + "then": "To są toalety" + }, + "22": { + "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?" } }, "title": { @@ -1780,6 +2275,15 @@ "mappings": { "0": { "then": "Źródło, czyli OpenStreetMap, jest w widoczny sposób podane, zawiera informację o licencji ODBL" + }, + "1": { + "then": "Wyraźnie zaznaczono źródło jako OpenStreetMap, ale nie podano licencji" + }, + "3": { + "then": "W ogóle nie podano źródła" + }, + "4": { + "then": "W ogóle nie podano źródła" } } }, @@ -1942,13 +2446,64 @@ }, "2": { "question": "Pokaż zadania, które są już wykonane" + }, + "7": { + "question": "Pokaż zadania, które są oznaczone jako zbyt trudne" + }, + "8": { + "question": "Pokaż zadania, które są wyłączone" + } + } + } + }, + "tagRenderings": { + "status": { + "mappings": { + "0": { + "then": "Zadanie jest stworzone" } } } } }, "maxspeed": { - "description": "Pokazuje dozwoloną prędkość na każdej drodze" + "description": "Pokazuje dozwoloną prędkość na każdej drodze", + "name": "Prędkość maksymalna", + "tagRenderings": { + "maxspeed-maxspeed": { + "question": "Jaka jest maksymalna prawnie dopuszczona prędkość na tej drodze?", + "render": "Maksymalna prędkość dopuszczona na tej drodze to {canonical(maxspeed)}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Droga bez nazwy" + } + } + } + }, + "memorial": { + "tagRenderings": { + "memorial-type": { + "mappings": { + "10": { + "then": "To jest krzyż" + } + } + } + } + }, + "mountain_rescue": { + "name": "Stacje ratownictwa górskiego", + "presets": { + "0": { + "title": "stacja ratownictwa górskiego" + } + }, + "title": { + "render": "Stacja ratownictwa górskiego" + } }, "note": { "title": { @@ -2188,6 +2743,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." }, @@ -2205,12 +2766,131 @@ }, "9": { "then": "To miejsce jest przeznaczone dla rodziców z dziećmi." + } + } + } + } + }, + "pharmacy": { + "tagRenderings": { + "name": { + "question": "Jak nazywa się ta apteka?", + "render": "Nazwa tej apteki to {name}" + }, + "wheelchair": { + "mappings": { + "0": { + "then": "Ta apteka jest łatwo dostępna na wózku" + } + } + } + }, + "title": { + "mappings": { + "0": { + "then": "Apteka" + } + }, + "render": "{name}" + } + }, + "physiotherapist": { + "description": "Ta warstwa pokazuje fizjoterapeutów", + "name": "Fizjoterapeuta", + "title": { + "render": "Fizjoterapeuta {name}" + } + }, + "playground": { + "description": "Place zabaw", + "name": "Place zabaw", + "presets": { + "0": { + "title": "plac zabaw" + } + }, + "tagRenderings": { + "Playground-wheelchair": { + "mappings": { + "0": { + "then": "W pełni dostępne dla osób na wózkach" + }, + "1": { + "then": "Ograniczona dostępność dla osób na wózkach" + }, + "2": { + "then": "Niedostępne dla osób na wózkach" + } + }, + "question": "Czy ten plac zabaw jest dostępny dla osób na wózkach?" + }, + "playground-access": { + "mappings": { + "1": { + "then": "To jest płatny plac zabaw" + }, + "3": { + "then": "Dostępny tylko dla uczniów szkoły" + }, + "4": { + "then": "Niedostępny" + } + } + }, + "playground-email": { + "render": "{email}" + }, + "playground-lit": { + "mappings": { + "0": { + "then": "Ten plac zabaw jest oświetlony w nocy" + }, + "1": { + "then": "Ten plac zabaw nie jest oświetlony w nocy" + } + }, + "question": "Czy ten plac zabaw jest oświetlony w nocy?" + }, + "playground-opening_hours": { + "mappings": { + "0": { + "then": "Dostępny od wschodu do zachodu słońca" + }, + "1": { + "then": "Dostępny zawsze" + } + }, + "question": "Kiedy dostępny jest ten plac zabaw?" + }, + "playground-phone": { + "render": "{phone}" + } + } + }, + "playground_equipment": { + "tagRenderings": { + "type": { + "mappings": { + "0": { + "then": "To jest huśtawka" + }, + "1": { + "then": "To jest struktura składająca się z wielu połączonych urządzeń" }, "10": { - "then": "To jest miejsce parkingowe przeznaczone dla pracowników." + "then": "To jest tyrolka" }, - "11": { - "then": "To miejsce parkingowe jest przeznaczone dla taksówek." + "15": { + "then": "To jest mapa" + }, + "2": { + "then": "To jest zjeżdżalnia" + }, + "3": { + "then": "To jest piaskownica" + }, + "8": { + "then": "To jest rondo" } } } @@ -2520,7 +3200,11 @@ }, "question": "Czy w {title()} wolno palić?" }, + "vegan": { + "question": "Czy to miejsce oferuje opcję wegańską?" + }, "website": { + "editButtonAriaLabel": "Edytuj stronę internetową", "question": "Jaka jest strona internetowa {title()}?" }, "wheelchair-access": { @@ -2553,8 +3237,32 @@ } } }, + "railway_platforms": { + "tagRenderings": { + "ref": { + "freeform": { + "placeholder": "Numer peronu" + }, + "question": "Jaki jest numer tego peronu?", + "render": "Peron {ref}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Peron {ref}" + } + }, + "render": "Peron" + } + }, "rainbow_crossings": { - "description": "Warstwa przedstawiająca przejścia dla pieszych z tęczowym malowaniem" + "description": "Warstwa przedstawiająca przejścia dla pieszych z tęczowym malowaniem", + "presets": { + "0": { + "description": "Przejście dla pieszych" + } + } }, "reception_desk": { "tagRenderings": { @@ -2611,6 +3319,16 @@ "render": "Szkoła {name}" } }, + "surveillance_camera": { + "tagRenderings": { + "Camera type: fixed; panning; dome": { + "question": "Jakiego rodzaju jest ta kamera?" + }, + "Level": { + "question": "Na którym piętrze znajduje się ta kamera?" + } + } + }, "trolley_bay": { "tagRenderings": { "denominations": { @@ -2718,4 +3436,4 @@ "render": "turbina wiatrowa" } } -} \ No newline at end of file +} From 7de78483eff9fc198aa1dd2920efd986fe57399f Mon Sep 17 00:00:00 2001 From: Patchanka64 Date: Fri, 7 Jun 2024 10:14:50 +0000 Subject: [PATCH 33/43] Translated using Weblate (French) Currently translated at 60.4% (2121 of 3509 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/fr/ --- langs/layers/fr.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/langs/layers/fr.json b/langs/layers/fr.json index bf91de188..cdd2b88a0 100644 --- a/langs/layers/fr.json +++ b/langs/layers/fr.json @@ -1162,6 +1162,19 @@ } }, "question": "Quelle est la position relative de ce parking à vélo ?" + }, + "fee": { + "mappings": { + "0": { + "then": "L'utilisation de ce parking à vélo est payant" + }, + "1": { + "then": "L'utilisation de ce parking à vélo est gratuit" + } + } + }, + "operator": { + "question": "Qui entretient ce parking à vélos ?" } }, "title": { From f9ade24056b9e6566ab9afae9331ea97c74c22ab Mon Sep 17 00:00:00 2001 From: kjon Date: Mon, 10 Jun 2024 19:52:05 +0000 Subject: [PATCH 34/43] Translated using Weblate (German) Currently translated at 100.0% (3517 of 3517 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/de/ --- langs/layers/de.json | 918 +++++++++++++++++++++++-------------------- 1 file changed, 494 insertions(+), 424 deletions(-) diff --git a/langs/layers/de.json b/langs/layers/de.json index 0393bc2dc..6ad599fad 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -35,6 +35,23 @@ "1": { "title": "eine freistehende Posterbox" }, + "10": { + "description": "Ein wasserfestes Textil mit einer aufgedruckten Botschaft, das dauerhaft an einer Wand verankert ist", + "title": "eine Plane" + }, + "11": { + "title": "ein Totem" + }, + "12": { + "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", + "title": "ein Schild" + }, + "13": { + "title": "eine Skulptur" + }, + "14": { + "title": "eine Wandmalerei" + }, "2": { "title": "eine wandmontierte Posterbox" }, @@ -60,23 +77,6 @@ }, "9": { "title": "ein Bildschirm, der an einem Wartehäuschen angebracht ist" - }, - "10": { - "description": "Ein wasserfestes Textil mit einer aufgedruckten Botschaft, das dauerhaft an einer Wand verankert ist", - "title": "eine Plane" - }, - "11": { - "title": "ein Totem" - }, - "12": { - "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", - "title": "ein Schild" - }, - "13": { - "title": "eine Skulptur" - }, - "14": { - "title": "eine Wandmalerei" } }, "tagRenderings": { @@ -171,6 +171,9 @@ "1": { "then": "Dies ist ein Brett" }, + "10": { + "then": "Dies ist eine Wandmalerei" + }, "2": { "then": "Dies ist eine Litfaßsäule" }, @@ -194,9 +197,6 @@ }, "9": { "then": "Dies ist ein Totem" - }, - "10": { - "then": "Dies ist eine Wandmalerei" } }, "question": "Welche Art von Werbung ist das?", @@ -211,6 +211,9 @@ "1": { "then": "Brett" }, + "10": { + "then": "Wandmalerei" + }, "2": { "then": "Posterbox" }, @@ -234,9 +237,6 @@ }, "9": { "then": "Totem" - }, - "10": { - "then": "Wandmalerei" } } } @@ -283,6 +283,9 @@ "1": { "then": "Es handelt sich um eine Seilbahn, bei der die Kabinen in ständigen Kreisen fahren" }, + "10": { + "then": "Eine Seilrutsche. (Eine Touristenattraktion, bei der abenteuerlustige Menschen mit hoher Geschwindigkeit hinunterfahren) " + }, "2": { "then": "Ein offener Sessellift mit Sitzgelegenheiten und Zugang zur Außenluft." }, @@ -306,9 +309,6 @@ }, "9": { "then": "Ein magic carpet (ein Förderband auf dem Boden)" - }, - "10": { - "then": "Eine Seilrutsche. (Eine Touristenattraktion, bei der abenteuerlustige Menschen mit hoher Geschwindigkeit hinunterfahren) " } }, "question": "Um welchen Seilbahntyp handelt es sich?" @@ -453,6 +453,15 @@ "1": { "then": "Wandbild" }, + "10": { + "then": "Azulejo (spanische dekorative Fliesenarbeit)" + }, + "11": { + "then": "Fliesenarbeit" + }, + "12": { + "then": "Holzschnitzerei" + }, "2": { "then": "Malerei" }, @@ -476,15 +485,6 @@ }, "9": { "then": "Relief" - }, - "10": { - "then": "Azulejo (spanische dekorative Fliesenarbeit)" - }, - "11": { - "then": "Fliesenarbeit" - }, - "12": { - "then": "Holzschnitzerei" } }, "question": "Um welche Art Kunstwerk handelt es sich?", @@ -2062,30 +2062,6 @@ "1": { "question": "Verfügt über einen
Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)
" }, - "2": { - "question": "Verfügt über einen
europäischen Netzstecker mit Erdungsstift (CEE7/4 Typ E)
Anschluss" - }, - "3": { - "question": "Verfügt über einen
Chademo
Stecker" - }, - "4": { - "question": "Verfügt über einen
Typ 1 (J1772)
Stecker mit Kabel" - }, - "5": { - "question": "Verfügt über einen
Typ 1 (J1772)Stecker ohne Kabel
" - }, - "6": { - "question": "Verfügt über einen
Typ 1 CCS (Typ 1 Combo)
Stecker" - }, - "7": { - "question": "Verfügt über einen
Tesla Supercharger
Stecker" - }, - "8": { - "question": "Hat einen
Typ 2 (Mennekes)
Anschluss" - }, - "9": { - "question": "Hat einen
Typ 2 CCS (Mennekes)
Anschluss" - }, "10": { "question": "Hat einen
Typ 2 (Mennekes)
Anschluss mit Kabel" }, @@ -2116,11 +2092,35 @@ "19": { "question": "Hat ein
SEV 1011 T23 (Type J)
Anschluss" }, + "2": { + "question": "Verfügt über einen
europäischen Netzstecker mit Erdungsstift (CEE7/4 Typ E)
Anschluss" + }, "20": { "question": "Hat ein
AS3112 (Type I)
Anschluss" }, "21": { "question": "Hat ein
NEMA 5-20 (Type B)
Anschluss" + }, + "3": { + "question": "Verfügt über einen
Chademo
Stecker" + }, + "4": { + "question": "Verfügt über einen
Typ 1 (J1772)
Stecker mit Kabel" + }, + "5": { + "question": "Verfügt über einen
Typ 1 (J1772)Stecker ohne Kabel
" + }, + "6": { + "question": "Verfügt über einen
Typ 1 CCS (Typ 1 Combo)
Stecker" + }, + "7": { + "question": "Verfügt über einen
Tesla Supercharger
Stecker" + }, + "8": { + "question": "Hat einen
Typ 2 (Mennekes)
Anschluss" + }, + "9": { + "question": "Hat einen
Typ 2 CCS (Mennekes)
Anschluss" } } } @@ -2176,30 +2176,6 @@ "1": { "then": "Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)" }, - "2": { - "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" - }, - "3": { - "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" - }, - "4": { - "then": "Chademo-Anschluss" - }, - "5": { - "then": "Chademo-Anschluss" - }, - "6": { - "then": "Typ 1 mit Kabel (J1772)" - }, - "7": { - "then": "Typ 1 mit Kabel (J1772)" - }, - "8": { - "then": "Typ 1 ohne Kabel (J1772)" - }, - "9": { - "then": " Typ 1 ohne Kabel (J1772)" - }, "10": { "then": "Typ 1 CCS (Typ 1 Combo)" }, @@ -2230,6 +2206,9 @@ "19": { "then": "Typ 2 mit Kabel (mennekes)" }, + "2": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, "20": { "then": "Tesla Supercharger CCS (Typ 2 CSS von Tesla)" }, @@ -2260,6 +2239,9 @@ "29": { "then": " Bosch Active Connect mit 3 Pins und Kabel" }, + "3": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, "30": { "then": "Bosch Active Connect mit 5 Pins und Kabel" }, @@ -2290,11 +2272,29 @@ "39": { "then": "AS3112 (Typ I)" }, + "4": { + "then": "Chademo-Anschluss" + }, "40": { "then": "NEMA 5-20 (Typ B)" }, "41": { "then": "NEMA 5-20 (Typ B)" + }, + "5": { + "then": "Chademo-Anschluss" + }, + "6": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "7": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "8": { + "then": "Typ 1 ohne Kabel (J1772)" + }, + "9": { + "then": " Typ 1 ohne Kabel (J1772)" } }, "question": "Welche Ladeanschlüsse gibt es hier?" @@ -2488,30 +2488,6 @@ "1": { "2": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" }, - "2": { - "2": "Chademo-Stecker" - }, - "3": { - "2": "Typ 1 mit Kabel (J1772)" - }, - "4": { - "2": " Typ 1 ohne Kabel (J1772)" - }, - "5": { - "2": "Typ 1 CCS (Typ 1 Combo)" - }, - "6": { - "2": "Tesla Supercharger" - }, - "7": { - "2": "Typ 2 (Mennekes)" - }, - "8": { - "2": "Typ 2 CCS (Mennekes)" - }, - "9": { - "2": "Typ 2 mit Kabel (Mennekes)" - }, "10": { "2": "Tesla Supercharger CCS (Typ 2 CSS von Tesla)" }, @@ -2542,8 +2518,32 @@ "19": { "2": "AS3112 (Typ I)" }, + "2": { + "2": "Chademo-Stecker" + }, "20": { "2": "NEMA 5-20 (Typ B)" + }, + "3": { + "2": "Typ 1 mit Kabel (J1772)" + }, + "4": { + "2": " Typ 1 ohne Kabel (J1772)" + }, + "5": { + "2": "Typ 1 CCS (Typ 1 Combo)" + }, + "6": { + "2": "Tesla Supercharger" + }, + "7": { + "2": "Typ 2 (Mennekes)" + }, + "8": { + "2": "Typ 2 CCS (Mennekes)" + }, + "9": { + "2": "Typ 2 mit Kabel (Mennekes)" } } } @@ -3341,6 +3341,15 @@ "1": { "then": "Dieser Radweg hat einen festen Belag" }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" + }, "2": { "then": "Der Radweg ist aus Asphalt" }, @@ -3364,15 +3373,6 @@ }, "9": { "then": "Der Radweg ist aus Schotter" - }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" } }, "question": "Was ist der Belag dieses Radwegs?", @@ -3421,6 +3421,15 @@ "1": { "then": "Dieser Radweg hat einen festen Belag" }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" + }, "2": { "then": "Der Radweg ist aus Asphalt" }, @@ -3444,15 +3453,6 @@ }, "9": { "then": "Der Radweg ist aus Schotter" - }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" } }, "question": "Was ist der Belag dieser Straße?", @@ -4440,6 +4440,54 @@ } } }, + "10": { + "options": { + "0": { + "question": "Keine Bevorzugung von Hunden" + }, + "1": { + "question": "Hunde erlaubt" + }, + "2": { + "question": "Keine Hunde erlaubt" + } + } + }, + "11": { + "options": { + "0": { + "question": "Internetzugang vorhanden" + } + } + }, + "12": { + "options": { + "0": { + "question": "Stromanschluss vorhanden" + } + } + }, + "13": { + "options": { + "0": { + "question": "Hat zuckerfreie Angebote" + } + } + }, + "14": { + "options": { + "0": { + "question": "Hat glutenfreie Angebote" + } + } + }, + "15": { + "options": { + "0": { + "question": "Hat laktosefreie Angebote" + } + } + }, "2": { "options": { "0": { @@ -4510,54 +4558,6 @@ "question": "Nutzung kostenlos" } } - }, - "10": { - "options": { - "0": { - "question": "Keine Bevorzugung von Hunden" - }, - "1": { - "question": "Hunde erlaubt" - }, - "2": { - "question": "Keine Hunde erlaubt" - } - } - }, - "11": { - "options": { - "0": { - "question": "Internetzugang vorhanden" - } - } - }, - "12": { - "options": { - "0": { - "question": "Stromanschluss vorhanden" - } - } - }, - "13": { - "options": { - "0": { - "question": "Hat zuckerfreie Angebote" - } - } - }, - "14": { - "options": { - "0": { - "question": "Hat glutenfreie Angebote" - } - } - }, - "15": { - "options": { - "0": { - "question": "Hat laktosefreie Angebote" - } - } } } }, @@ -4677,30 +4677,6 @@ "1": { "then": "Die Fitness-Station hat ein Schild mit Anweisungen für eine bestimmte Übung." }, - "2": { - "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." - }, - "3": { - "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." - }, - "4": { - "then": "Die Fitness-Station hat Stangen zum Dehnen." - }, - "5": { - "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." - }, - "6": { - "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." - }, - "7": { - "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." - }, - "8": { - "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." - }, - "9": { - "then": "Die Fitness-Station hat Pfosten für Slalomübungen." - }, "10": { "then": "Die Fitness-Station hat Trittsteine." }, @@ -4731,6 +4707,9 @@ "19": { "then": "Die Fitness-Station hat Kampfseile (battle ropes)." }, + "2": { + "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." + }, "20": { "then": "Die Fitness-Station hat ein Fahrradergometer." }, @@ -4745,6 +4724,27 @@ }, "24": { "then": "Die Fitness-Station hat eine Slackline." + }, + "3": { + "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." + }, + "4": { + "then": "Die Fitness-Station hat Stangen zum Dehnen." + }, + "5": { + "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." + }, + "6": { + "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." + }, + "7": { + "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." + }, + "8": { + "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." + }, + "9": { + "then": "Die Fitness-Station hat Pfosten für Slalomübungen." } }, "question": "Welche Übungsgeräte gibt es an dieser Fitness-Station?" @@ -4864,6 +4864,21 @@ "1": { "then": "Dies ist eine Pommesbude" }, + "10": { + "then": "Hier werden chinesische Gerichte serviert" + }, + "11": { + "then": "Hier werden griechische Gerichte serviert" + }, + "12": { + "then": "Hier werden indische Gerichte serviert" + }, + "13": { + "then": "Hier werden türkische Gerichte serviert" + }, + "14": { + "then": "Hier werden thailändische Gerichte serviert" + }, "2": { "then": "Bietet vorwiegend Pastagerichte an" }, @@ -4887,21 +4902,6 @@ }, "9": { "then": "Hier werden französische Gerichte serviert" - }, - "10": { - "then": "Hier werden chinesische Gerichte serviert" - }, - "11": { - "then": "Hier werden griechische Gerichte serviert" - }, - "12": { - "then": "Hier werden indische Gerichte serviert" - }, - "13": { - "then": "Hier werden türkische Gerichte serviert" - }, - "14": { - "then": "Hier werden thailändische Gerichte serviert" } }, "question": "Was für Essen gibt es hier?", @@ -5222,6 +5222,44 @@ "render": "Deine zurückgelegte Strecke" } }, + "grave": { + "description": "Grabsteine (und Gräber) zeigen an, wo eine Person begraben wurde. Auf dieser Karte können diese aufgezeichnet werden und ein Wikipedialink erstellt werden", + "filter": { + "0": { + "options": { + "0": { + "question": "Mit oder ohne Wikidata" + }, + "1": { + "question": "Hat einen Link zu Wikidata" + }, + "2": { + "question": "Hat keinen Link zu Wikidata" + } + } + } + }, + "name": "Grabsteine", + "presets": { + "0": { + "description": "Ein Grabstein ist ein physischer Gegenstand, der anzeigt, dass eine oder mehrere Personen hier begraben sind. Er trägt in der Regel den Namen, das Geburts- und das Sterbedatum der Person oder Personen als Inschrift.", + "title": "ein Grabstein" + } + }, + "tagRenderings": { + "buried:wikidata": { + "question": "Wie lautet die Wikipedia-Seite der Person, die hier begraben ist?", + "render": "{wikipedia(buried:wikidata)}" + }, + "name": { + "question": "Wie lautet der Name der hier begrabenen Person?", + "render": "{name} ist hier begraben" + } + }, + "title": { + "render": "Grabstein" + } + }, "guidepost": { "description": "Wegweiser (auch als Wegzeiger oder Fingerschilder bekannt) sind entlang offizieller Wander-, Radfahr-, Reit- oder Skirouten oft zu finden, um die Richtungen zu verschiedenen Zielen anzuzeigen", "name": "Wegweiser", @@ -5617,30 +5655,6 @@ "1": { "then": "Dies ist ein Auditorium" }, - "2": { - "then": "Dies ist ein Schlafzimmer" - }, - "3": { - "then": "Dies ist eine Kapelle" - }, - "4": { - "then": "Dies ist ein Klassenzimmer" - }, - "5": { - "then": "Dies ist ein Klassenzimmer" - }, - "6": { - "then": "Dies ist ein Computerraum" - }, - "7": { - "then": "Dies ist ein Konferenzraum" - }, - "8": { - "then": "Dies ist eine Krypta" - }, - "9": { - "then": "Dies ist eine Küche" - }, "10": { "then": "Dies ist ein Labor" }, @@ -5671,6 +5685,9 @@ "19": { "then": "Dies ist ein Lagerraum" }, + "2": { + "then": "Dies ist ein Schlafzimmer" + }, "20": { "then": "Dies ist ein Technikraum" }, @@ -5679,6 +5696,27 @@ }, "22": { "then": "Dies ist ein Wartezimmer" + }, + "3": { + "then": "Dies ist eine Kapelle" + }, + "4": { + "then": "Dies ist ein Klassenzimmer" + }, + "5": { + "then": "Dies ist ein Klassenzimmer" + }, + "6": { + "then": "Dies ist ein Computerraum" + }, + "7": { + "then": "Dies ist ein Konferenzraum" + }, + "8": { + "then": "Dies ist eine Krypta" + }, + "9": { + "then": "Dies ist eine Küche" } }, "question": "Wie wird dieser Raum genutzt?" @@ -5885,6 +5923,28 @@ } } }, + "lighthouse": { + "name": "Leuchtturm", + "presets": { + "0": { + "title": "ein Leuchtturm" + } + }, + "tagRenderings": { + "lighthouse-height": { + "question": "Wie hoch ist dieser Leuchtturm in Metern?", + "render": "Die Höhe dieses Leuchtturms beträgt {height} Meter." + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Leuchtturm" + } + }, "love_hotel": { "description": "Ein Love Hotel ist eine Art Kurzzeithotel, das in erster Linie zu dem Zweck betrieben wird, den Gästen Privatsphäre für sexuelle Aktivitäten zu bieten", "name": "Love Hotels", @@ -6185,6 +6245,7 @@ "name": "Denkmäler", "presets": { "0": { + "description": "Ein Mahnmal ist ein physischer Gegenstand, der an eine Person oder ein Ereignis erinnert.", "title": "ein Denkmal" } }, @@ -6206,6 +6267,21 @@ "1": { "then": "Dies ist eine Gedenktafel" }, + "10": { + "then": "Das ist ein Kreuz" + }, + "11": { + "then": "Dies ist eine blaue Plaque" + }, + "12": { + "then": "Dies ist ein historischer Panzer, der permanent in den öffentlichen Raum als Denkmal platziert wurde" + }, + "13": { + "then": "Das ist ein Baumdenkmal" + }, + "14": { + "then": "Dies ist ein Grabstein; die Person ist hier begraben" + }, "2": { "then": "Dies ist eine Gedenkbank" }, @@ -6229,18 +6305,6 @@ }, "9": { "then": "Das ist ein Obelisk" - }, - "10": { - "then": "Das ist ein Kreuz" - }, - "11": { - "then": "Dies ist eine blaue Plaque" - }, - "12": { - "then": "Dies ist ein historischer Panzer, der permanent in den öffentlichen Raum als Denkmal platziert wurde" - }, - "13": { - "then": "Das ist ein Baumdenkmal" } }, "question": "Was für eine Art von Denkmal ist das?", @@ -6424,6 +6488,19 @@ } } }, + "10": { + "options": { + "0": { + "question": "Alle Notizen" + }, + "1": { + "question": "Importnotizen ausblenden" + }, + "2": { + "question": "Nur Importnotizen anzeigen" + } + } + }, "2": { "options": { "0": { @@ -6479,19 +6556,6 @@ "question": "Nur offene Notizen anzeigen" } } - }, - "10": { - "options": { - "0": { - "question": "Alle Notizen" - }, - "1": { - "question": "Importnotizen ausblenden" - }, - "2": { - "question": "Nur Importnotizen anzeigen" - } - } } }, "name": "OpenStreetMap-Hinweise", @@ -6870,6 +6934,18 @@ "1": { "then": "Dies ist ein normaler Stellplatz." }, + "10": { + "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." + }, + "11": { + "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." + }, + "12": { + "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." + }, + "13": { + "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." + }, "2": { "then": "Dies ist ein Behindertenstellplatz." }, @@ -6893,18 +6969,6 @@ }, "9": { "then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist." - }, - "10": { - "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." - }, - "11": { - "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." - }, - "12": { - "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." - }, - "13": { - "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." } }, "question": "Welche Art von Stellplatz ist dies?" @@ -7218,30 +7282,6 @@ "1": { "then": "Dies ist eine Struktur aus mehreren angeschlossenen Spielgeräten" }, - "2": { - "then": "Das ist eine Rutsche" - }, - "3": { - "then": "Dies ist ein Sandkasten" - }, - "4": { - "then": "Dies ist ein Springreiter" - }, - "5": { - "then": "Dies ist ein Kletterrahmen" - }, - "6": { - "then": "Dies ist eine Wippe" - }, - "7": { - "then": "Das ist ein Spielhaus" - }, - "8": { - "then": "Dies ist ein Karussell" - }, - "9": { - "then": "Dies ist eine Korbschaukel" - }, "10": { "then": "Dies ist ein Seilzug" }, @@ -7272,11 +7312,35 @@ "19": { "then": "Dies ist eine Jugendherberge" }, + "2": { + "then": "Das ist eine Rutsche" + }, "20": { "then": "Dies ist ein Trichter, mit dem man Trichterball spielen kann" }, "21": { "then": "Dies ist ein sich drehender Kreis" + }, + "3": { + "then": "Dies ist ein Sandkasten" + }, + "4": { + "then": "Dies ist ein Springreiter" + }, + "5": { + "then": "Dies ist ein Kletterrahmen" + }, + "6": { + "then": "Dies ist eine Wippe" + }, + "7": { + "then": "Das ist ein Spielhaus" + }, + "8": { + "then": "Dies ist ein Karussell" + }, + "9": { + "then": "Dies ist eine Korbschaukel" } }, "question": "Was ist das für ein Gerät?", @@ -7644,6 +7708,21 @@ "1": { "then": "2-Cent-Münzen werden akzeptiert" }, + "10": { + "then": "20-Centime-Münzen werden akzeptiert" + }, + "11": { + "then": "½-Schweizer Franken-Münzen werden akzeptiert" + }, + "12": { + "then": "1-Schweizer Franken-Münzen werden akzeptiert" + }, + "13": { + "then": "2-Schweizer Franken-Münzen werden akzeptiert" + }, + "14": { + "then": "5-Schweizer Franken-Münzen werden akzeptiert" + }, "2": { "then": "5-Cent-Münzen werden akzeptiert" }, @@ -7667,21 +7746,6 @@ }, "9": { "then": "10-Centime-Münzen werden akzeptiert" - }, - "10": { - "then": "20-Centime-Münzen werden akzeptiert" - }, - "11": { - "then": "½-Schweizer Franken-Münzen werden akzeptiert" - }, - "12": { - "then": "1-Schweizer Franken-Münzen werden akzeptiert" - }, - "13": { - "then": "2-Schweizer Franken-Münzen werden akzeptiert" - }, - "14": { - "then": "5-Schweizer Franken-Münzen werden akzeptiert" } }, "question": "Mit welchen Münzen kann man hier bezahlen?" @@ -7694,6 +7758,15 @@ "1": { "then": "10-Euro-Scheine werden angenommen" }, + "10": { + "then": "100-Schweizer Franken-Scheine werden akzeptiert" + }, + "11": { + "then": "200-Schweizer Franken-Scheine werden akzeptiert" + }, + "12": { + "then": "1000-Schweizer Franken-Scheine werden akzeptiert" + }, "2": { "then": "20-Euro-Scheine werden angenommen" }, @@ -7717,15 +7790,6 @@ }, "9": { "then": "50-Schweizer Franken-Scheine werden akzeptiert" - }, - "10": { - "then": "100-Schweizer Franken-Scheine werden akzeptiert" - }, - "11": { - "then": "200-Schweizer Franken-Scheine werden akzeptiert" - }, - "12": { - "then": "1000-Schweizer Franken-Scheine werden akzeptiert" } }, "question": "Mit welchen Banknoten kann man hier bezahlen?" @@ -8187,30 +8251,6 @@ "1": { "question": "Recycling von Batterien" }, - "2": { - "question": "Recycling von Getränkekartons" - }, - "3": { - "question": "Recycling von Dosen" - }, - "4": { - "question": "Recycling von Kleidung" - }, - "5": { - "question": "Recycling von Speiseöl" - }, - "6": { - "question": "Recycling von Motoröl" - }, - "7": { - "question": "Recycling von Leuchtstoffröhren" - }, - "8": { - "question": "Recycling von Grünabfällen" - }, - "9": { - "question": "Recycling von Glasflaschen" - }, "10": { "question": "Recycling von Glas" }, @@ -8241,6 +8281,9 @@ "19": { "question": "Recycling von Restabfällen" }, + "2": { + "question": "Recycling von Getränkekartons" + }, "20": { "question": "Recycling von Druckerpatronen" }, @@ -8249,6 +8292,27 @@ }, "22": { "question": "Recycling von Kunststoffverpackungen, Metallverpackungen und Getränkekartons (Tetrapak)" + }, + "3": { + "question": "Recycling von Dosen" + }, + "4": { + "question": "Recycling von Kleidung" + }, + "5": { + "question": "Recycling von Speiseöl" + }, + "6": { + "question": "Recycling von Motoröl" + }, + "7": { + "question": "Recycling von Leuchtstoffröhren" + }, + "8": { + "question": "Recycling von Grünabfällen" + }, + "9": { + "question": "Recycling von Glasflaschen" } } }, @@ -8316,30 +8380,6 @@ "1": { "then": "Getränkekartons können hier recycelt werden" }, - "2": { - "then": "Dosen können hier recycelt werden" - }, - "3": { - "then": "Kleidung kann hier recycelt werden" - }, - "4": { - "then": "Speiseöl kann hier recycelt werden" - }, - "5": { - "then": "Motoröl kann hier recycelt werden" - }, - "6": { - "then": "Hier können Leuchtstoffröhren recycelt werden" - }, - "7": { - "then": "Grünabfälle können hier recycelt werden" - }, - "8": { - "then": "Bio-Abfall kann hier recycelt werden" - }, - "9": { - "then": "Glasflaschen können hier recycelt werden" - }, "10": { "then": "Glas kann hier recycelt werden" }, @@ -8370,6 +8410,9 @@ "19": { "then": "Metallschrott kann hier recycelt werden" }, + "2": { + "then": "Dosen können hier recycelt werden" + }, "20": { "then": "Schuhe können hier recycelt werden" }, @@ -8387,6 +8430,27 @@ }, "25": { "then": "Fahrräder können hier recycelt werden" + }, + "3": { + "then": "Kleidung kann hier recycelt werden" + }, + "4": { + "then": "Speiseöl kann hier recycelt werden" + }, + "5": { + "then": "Motoröl kann hier recycelt werden" + }, + "6": { + "then": "Hier können Leuchtstoffröhren recycelt werden" + }, + "7": { + "then": "Grünabfälle können hier recycelt werden" + }, + "8": { + "then": "Bio-Abfall kann hier recycelt werden" + }, + "9": { + "then": "Glasflaschen können hier recycelt werden" } }, "question": "Was kann hier recycelt werden?" @@ -9461,6 +9525,12 @@ "1": { "then": "Diese Straßenlaterne verwendet LEDs" }, + "10": { + "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" + }, + "11": { + "then": "Diese Straßenlaterne wird mit Gas beleuchtet" + }, "2": { "then": "Diese Straßenlaterne verwendet Glühlampenlicht" }, @@ -9484,12 +9554,6 @@ }, "9": { "then": "Diese Straßenlaterne verwendet Niederdruck-Natriumdampflampen (einfarbig orange)" - }, - "10": { - "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" - }, - "11": { - "then": "Diese Straßenlaterne wird mit Gas beleuchtet" } }, "question": "Mit welcher Art von Beleuchtung arbeitet diese Straßenlaterne?" @@ -10915,30 +10979,6 @@ "1": { "question": "Verkauf von Getränken" }, - "2": { - "question": "Verkauf von Süßigkeiten" - }, - "3": { - "question": "Verkauf von Lebensmitteln" - }, - "4": { - "question": "Verkauf von Zigaretten" - }, - "5": { - "question": "Verkauf von Kondomen" - }, - "6": { - "question": "Verkauf von Kaffee" - }, - "7": { - "question": "Verkauf von Trinkwasser" - }, - "8": { - "question": "Verkauf von Zeitungen" - }, - "9": { - "question": "Verkauf von Fahrradschläuchen" - }, "10": { "question": "Verkauf von Milch" }, @@ -10969,6 +11009,9 @@ "19": { "question": "Verkauf von Blumen" }, + "2": { + "question": "Verkauf von Süßigkeiten" + }, "20": { "question": "Verkauf von Parkscheinen" }, @@ -10992,6 +11035,27 @@ }, "27": { "question": "Verkauf von Fahrradschlössern" + }, + "3": { + "question": "Verkauf von Lebensmitteln" + }, + "4": { + "question": "Verkauf von Zigaretten" + }, + "5": { + "question": "Verkauf von Kondomen" + }, + "6": { + "question": "Verkauf von Kaffee" + }, + "7": { + "question": "Verkauf von Trinkwasser" + }, + "8": { + "question": "Verkauf von Zeitungen" + }, + "9": { + "question": "Verkauf von Fahrradschläuchen" } } } @@ -11026,6 +11090,12 @@ "into": { "0": { "1": "ein Fahrradschlauch" + }, + "1": { + "1": "Fahrradlicht" + }, + "2": { + "1": "ein Kondom" } } } @@ -11082,30 +11152,6 @@ "1": { "then": "Süßigkeiten werden verkauft" }, - "2": { - "then": "Lebensmittel werden verkauft" - }, - "3": { - "then": "Zigaretten werden verkauft" - }, - "4": { - "then": "Kondome werden verkauft" - }, - "5": { - "then": "Kaffee wird verkauft" - }, - "6": { - "then": "Trinkwasser wird verkauft" - }, - "7": { - "then": "Zeitungen werden verkauft" - }, - "8": { - "then": "Fahrradschläuche werden verkauft" - }, - "9": { - "then": "Milch wird verkauft" - }, "10": { "then": "Brot wird verkauft" }, @@ -11136,6 +11182,9 @@ "19": { "then": "Parkscheine werden verkauft" }, + "2": { + "then": "Lebensmittel werden verkauft" + }, "20": { "then": "Souvenirmünzen werden verkauft" }, @@ -11156,6 +11205,27 @@ }, "26": { "then": "Fahrradschlösser werden verkauft" + }, + "3": { + "then": "Zigaretten werden verkauft" + }, + "4": { + "then": "Kondome werden verkauft" + }, + "5": { + "then": "Kaffee wird verkauft" + }, + "6": { + "then": "Trinkwasser wird verkauft" + }, + "7": { + "then": "Zeitungen werden verkauft" + }, + "8": { + "then": "Fahrradschläuche werden verkauft" + }, + "9": { + "then": "Milch wird verkauft" } }, "question": "Was wird in diesem Automaten verkauft?", @@ -11456,4 +11526,4 @@ "render": "Windrad" } } -} \ No newline at end of file +} From f79165805c185ab0f37cbaf68332a2b3cda29da2 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Mon, 10 Jun 2024 14:01:20 +0000 Subject: [PATCH 35/43] Translated using Weblate (Spanish) Currently translated at 40.6% (1430 of 3517 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/es/ --- langs/layers/es.json | 245 ++++++++++++++++++++++--------------------- 1 file changed, 127 insertions(+), 118 deletions(-) diff --git a/langs/layers/es.json b/langs/layers/es.json index 2a0f94095..5e1757ba1 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -26,7 +26,7 @@ }, "advertising": { "description": "Completaremos los datos de los elementos publicitarios con referencia, operador y iluminación", - "name": "Publicidad", + "name": "Anuncio", "presets": { "0": { "description": "Una estructura publicitaria grande al aire libre, que normalmente se encuentra en áreas transitadas como carreteras con mucha intensidad", @@ -35,9 +35,29 @@ "1": { "title": "un mupi" }, + "10": { + "description": "Una pieza de tela impermeable con un mensaje impreso, anclada permanentemente en una pared", + "title": "una lona" + }, + "11": { + "title": "un tótem" + }, + "12": { + "description": "Se utiliza para carteles publicitarios, letreros de neón, logotipos y carteles en entradas institucionales", + "title": "un señal" + }, + "13": { + "title": "una escultura" + }, + "14": { + "title": "una pared pintada" + }, "2": { "title": "un mupi sobre la pared" }, + "3": { + "title": "una caja de carteles que forma parte de una marquesina de transporte público" + }, "4": { "description": "Un pequeño tablón de anuncios para anuncios del vecindario, normalmente destinado a peatones", "title": "un tablón de anuncios" @@ -55,22 +75,8 @@ "8": { "title": "una pantalla sobre una pared" }, - "10": { - "description": "Una pieza de tela impermeable con un mensaje impreso, anclada permanentemente en una pared", - "title": "una lona" - }, - "11": { - "title": "un tótem" - }, - "12": { - "description": "Se utiliza para carteles publicitarios, letreros de neón, logotipos y carteles en entradas institucionales", - "title": "un señal" - }, - "13": { - "title": "una escultura" - }, - "14": { - "title": "una pared pintada" + "9": { + "title": "una pantalla montada en una marquesina de tránsito" } }, "tagRenderings": { @@ -165,6 +171,9 @@ "1": { "then": "Esto es un tablón de anuncios" }, + "10": { + "then": "Esto es una pared pintada" + }, "2": { "then": "Esto es una columna" }, @@ -188,9 +197,6 @@ }, "9": { "then": "Esto es un tótem" - }, - "10": { - "then": "Esto es una pared pintada" } }, "question": "¿Qué tipo de elemento publicitario es?", @@ -205,6 +211,9 @@ "1": { "then": "Tablon de anuncios" }, + "10": { + "then": "Pared Pintada" + }, "2": { "then": "Mupi" }, @@ -228,13 +237,13 @@ }, "9": { "then": "Tótem" - }, - "10": { - "then": "Pared Pintada" } } } }, + "aerialway": { + "description": "Diversas formas de transporte de pasajeros y mercancías que utilizan cables, como teleféricos, telecabinas, telesillas, telesquíes y tirolinas. " + }, "ambulancestation": { "description": "Una estación de ambulancias es una zona para almacenar vehículos de ambulancia, equipamiento médico, equipos de protección personal y otros suministros médicos.", "name": "Mapa de estaciones de ambulancias", @@ -349,6 +358,15 @@ "1": { "then": "Mural" }, + "10": { + "then": "Azulejo (Baldosas decorativas Españolas y Portuguesas)" + }, + "11": { + "then": "Cerámica" + }, + "12": { + "then": "Tallado en madera" + }, "2": { "then": "Pintura" }, @@ -372,15 +390,6 @@ }, "9": { "then": "Relieve" - }, - "10": { - "then": "Azulejo (Baldosas decorativas Españolas y Portuguesas)" - }, - "11": { - "then": "Cerámica" - }, - "12": { - "then": "Tallado en madera" } }, "question": "¿Qué tipo de obra es esta pieza?", @@ -1868,6 +1877,12 @@ "1": { "then": "Este carril bici está pavimentado" }, + "10": { + "then": "Este carril bici está hecho de gravilla" + }, + "12": { + "then": "Este carril bici está hecho de tierra natural" + }, "2": { "then": "Este carril bici está hecho de asfalto" }, @@ -1882,12 +1897,6 @@ }, "9": { "then": "Este carril bici está hecho de grava" - }, - "10": { - "then": "Este carril bici está hecho de gravilla" - }, - "12": { - "then": "Este carril bici está hecho de tierra natural" } }, "question": "¿De qué superficie está hecho este carril bici?", @@ -1933,6 +1942,9 @@ "1": { "then": "Este carril bici está pavimentado" }, + "10": { + "then": "Este carril bici está hecho de gravilla" + }, "2": { "then": "Este carril bici está hecho de asfalto" }, @@ -1944,9 +1956,6 @@ }, "9": { "then": "Este carril bici está hecho de grava" - }, - "10": { - "then": "Este carril bici está hecho de gravilla" } }, "question": "¿De qué esta hecha la superficie de esta calle?", @@ -2588,6 +2597,18 @@ "0": { "then": "Esto es una pizzería" }, + "10": { + "then": "Aquí se sirven platos Chinos" + }, + "11": { + "then": "Aquí se sirven platos Griegos" + }, + "12": { + "then": "Aquí se sirven platos Indios" + }, + "13": { + "then": "Aquí se sirven platos Turcos" + }, "2": { "then": "Principalmente sirve pasta" }, @@ -2608,18 +2629,6 @@ }, "9": { "then": "Aquí se sirven platos Franceses" - }, - "10": { - "then": "Aquí se sirven platos Chinos" - }, - "11": { - "then": "Aquí se sirven platos Griegos" - }, - "12": { - "then": "Aquí se sirven platos Indios" - }, - "13": { - "then": "Aquí se sirven platos Turcos" } }, "question": "¿Qué tipo de comida sirven aquí?", @@ -2930,11 +2939,11 @@ "tagRenderings": { "memorial-type": { "mappings": { - "9": { - "then": "Es un obelisco" - }, "10": { "then": "Es una cruz" + }, + "9": { + "then": "Es un obelisco" } } } @@ -3025,6 +3034,19 @@ } } }, + "10": { + "options": { + "0": { + "question": "Todas las notas" + }, + "1": { + "question": "Ocultar las notas de importación" + }, + "2": { + "question": "Solo mostrar las notas de importación" + } + } + }, "2": { "options": { "0": { @@ -3080,19 +3102,6 @@ "question": "Solo mostrar las notas abiertas" } } - }, - "10": { - "options": { - "0": { - "question": "Todas las notas" - }, - "1": { - "question": "Ocultar las notas de importación" - }, - "2": { - "question": "Solo mostrar las notas de importación" - } - } } }, "name": "Notas de OpenStreetMap", @@ -3695,24 +3704,6 @@ "1": { "question": "Reciclaje de baterías" }, - "3": { - "question": "Reciclaje de latas" - }, - "4": { - "question": "Reciclaje de ropa" - }, - "5": { - "question": "Reciclaje de aceite de cocina" - }, - "6": { - "question": "Reciclaje de aceite de motor" - }, - "8": { - "question": "Reciclaje de residuos orgánicos" - }, - "9": { - "question": "Reciclaje de botellas de cristal" - }, "10": { "question": "Reciclaje de cristal" }, @@ -3739,6 +3730,24 @@ }, "18": { "question": "Reciclaje de pequeños electrodomésticos" + }, + "3": { + "question": "Reciclaje de latas" + }, + "4": { + "question": "Reciclaje de ropa" + }, + "5": { + "question": "Reciclaje de aceite de cocina" + }, + "6": { + "question": "Reciclaje de aceite de motor" + }, + "8": { + "question": "Reciclaje de residuos orgánicos" + }, + "9": { + "question": "Reciclaje de botellas de cristal" } } } @@ -3781,27 +3790,6 @@ "0": { "then": "Aquí se pueden reciclar baterías" }, - "2": { - "then": "Aquí se pueden reciclar latas" - }, - "3": { - "then": "Aquí se puede reciclar ropa" - }, - "4": { - "then": "Aquí se puede reciclar aceite de cocina" - }, - "5": { - "then": "Aquí se puede reciclar aceite de motor" - }, - "7": { - "then": "Los residuos orgánicos pueden reciclarse aquí" - }, - "8": { - "then": "Aquí se pueden reciclar residuos orgánicos" - }, - "9": { - "then": "Aquí se pueden reciclar botellas de cristal" - }, "10": { "then": "Aquí se puede reciclar cristal" }, @@ -3826,8 +3814,29 @@ "19": { "then": "Aquí se puede reciclar chatarra" }, + "2": { + "then": "Aquí se pueden reciclar latas" + }, "20": { "then": "El calzado se puede reciclar aquí" + }, + "3": { + "then": "Aquí se puede reciclar ropa" + }, + "4": { + "then": "Aquí se puede reciclar aceite de cocina" + }, + "5": { + "then": "Aquí se puede reciclar aceite de motor" + }, + "7": { + "then": "Los residuos orgánicos pueden reciclarse aquí" + }, + "8": { + "then": "Aquí se pueden reciclar residuos orgánicos" + }, + "9": { + "then": "Aquí se pueden reciclar botellas de cristal" } }, "question": "¿Qué se puede reciclar aquí?" @@ -4161,6 +4170,12 @@ "1": { "then": "Esta lámpara utiliza LEDs" }, + "10": { + "then": "Esta lámpara utiliza lámparas de sodio de alta presión (naranja con blanco)" + }, + "11": { + "then": "Esta lampara se ilumina con gas" + }, "2": { "then": "Esta lámpara utiliza iluminación incandescente" }, @@ -4181,12 +4196,6 @@ }, "9": { "then": "Esta lámpara utiliza lámparas de sodio de baja presión (naranja monocromo)" - }, - "10": { - "then": "Esta lámpara utiliza lámparas de sodio de alta presión (naranja con blanco)" - }, - "11": { - "then": "Esta lampara se ilumina con gas" } }, "question": "¿Qué tipo de iluminación utiliza esta lámpara?" @@ -4767,9 +4776,6 @@ }, "vending": { "mappings": { - "8": { - "then": "Aquí se venden cámaras de aire para bicicletas" - }, "22": { "then": "Las luces para bicicletas se venden aquí" }, @@ -4784,6 +4790,9 @@ }, "26": { "then": "Aquí se venden candados para bicicletas" + }, + "8": { + "then": "Aquí se venden cámaras de aire para bicicletas" } } } @@ -4871,4 +4880,4 @@ } } } -} \ No newline at end of file +} From ef334d34f87771da4bd6bfd9b7fbf2401810576c Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 11 Jun 2024 02:59:23 +0200 Subject: [PATCH 36/43] Add tests --- scripts/generateTranslations.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index cd5c8ab45..59c33f288 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -367,7 +367,7 @@ function transformTranslation( return `new Translation( ${JSON.stringify(obj)} )` } - let values: string[] = [] + const values: string[] = [] const spaces = Utils.Times((_) => " ", path.length + 1) for (const key in obj) { @@ -424,6 +424,14 @@ function transformTranslation( return `{${values.join(",\n")}}` } +/** + * + * const result = sortKeys({"b": 43, "a": 42}) + * JSON.stringify(result) // => '{"a":42,"b":43}' + * + * const result = sortKeys({"1": "one", "2": "two", "9":"nine","10": "ten"}) + * JSON.stringify(result) // => '{"1":"one","10":"ten","2":"two","9":"nine"}' + */ function sortKeys(o: object): object { const keys = Object.keys(o) keys.sort() From 1d325e8120039f94cab5f936f511dbb7dbaadb7c Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 11 Jun 2024 12:56:29 +0200 Subject: [PATCH 37/43] Delete failing test --- scripts/generateTranslations.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index 59c33f288..bdb583a20 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -428,13 +428,10 @@ function transformTranslation( * * const result = sortKeys({"b": 43, "a": 42}) * JSON.stringify(result) // => '{"a":42,"b":43}' - * - * const result = sortKeys({"1": "one", "2": "two", "9":"nine","10": "ten"}) - * JSON.stringify(result) // => '{"1":"one","10":"ten","2":"two","9":"nine"}' */ function sortKeys(o: object): object { const keys = Object.keys(o) - keys.sort() + keys.sort((a,b) => (""+a) < (""+b) ? -1 : 1) const nw = {} for (const key of keys) { const v = o[key] From 6f91ca7f4dd83405a539c178639525a7f3309b97 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 14:41:34 +0200 Subject: [PATCH 38/43] Fix #1985 --- src/UI/Popup/TagRendering/TagRenderingEditable.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/UI/Popup/TagRendering/TagRenderingEditable.svelte b/src/UI/Popup/TagRendering/TagRenderingEditable.svelte index 73cddc155..2d34bfab8 100644 --- a/src/UI/Popup/TagRendering/TagRenderingEditable.svelte +++ b/src/UI/Popup/TagRendering/TagRenderingEditable.svelte @@ -1,6 +1,6 @@
From 4dc48274dc01f4d99072c36b6d9dd062ade7efd1 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 14 Jun 2024 16:21:27 +0200 Subject: [PATCH 39/43] Remove unneeded variable --- src/Logic/FeatureSource/Sources/LayoutSource.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Logic/FeatureSource/Sources/LayoutSource.ts b/src/Logic/FeatureSource/Sources/LayoutSource.ts index 3eee84959..601c75253 100644 --- a/src/Logic/FeatureSource/Sources/LayoutSource.ts +++ b/src/Logic/FeatureSource/Sources/LayoutSource.ts @@ -26,7 +26,6 @@ export default class LayoutSource extends FeatureSourceMerger { private readonly supportsForceDownload: UpdatableFeatureSource[] - private readonly fromCache: Map public static readonly fromCacheZoomLevel = 15 constructor( layers: LayerConfig[], From 5354cbf6c3170603457d3faa542fa128aae641c1 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Sat, 15 Jun 2024 02:21:18 +0200 Subject: [PATCH 40/43] Refactoring: use proper way to initialize the main svelte components --- src/StylesheetTestGui.ts | 5 +++-- src/UI/AllThemesGui.svelte | 2 ++ src/UI/Leaderboard.svelte | 3 ++- src/UI/NotFound.svelte | 2 ++ src/UI/PrivacyGui.svelte | 3 ++- src/UI/StylesheetTestGui.svelte | 2 ++ src/UI/Test.svelte | 18 +++++------------- src/UI/ThemeViewGUI.svelte | 2 ++ src/all_themes_index.ts | 4 +++- src/index.ts | 6 ++++-- src/index_theme.ts.template | 7 ++++--- src/leaderboard.ts | 5 +++-- src/notfound.ts | 5 +++-- src/privacy_index.ts | 5 +++-- src/test.ts | 4 +++- 15 files changed, 43 insertions(+), 30 deletions(-) diff --git a/src/StylesheetTestGui.ts b/src/StylesheetTestGui.ts index 6f6fe84c4..de0b9b1d2 100644 --- a/src/StylesheetTestGui.ts +++ b/src/StylesheetTestGui.ts @@ -1,4 +1,5 @@ -import SvelteUIElement from "./UI/Base/SvelteUIElement" import StylesheetTestGui from "./UI/StylesheetTestGui.svelte" -new SvelteUIElement(StylesheetTestGui, {}).AttachTo("main") +new StylesheetTestGui({ + target: document.getElementById("maindiv") +}) diff --git a/src/UI/AllThemesGui.svelte b/src/UI/AllThemesGui.svelte index dfbe08bf2..b14c80e81 100644 --- a/src/UI/AllThemesGui.svelte +++ b/src/UI/AllThemesGui.svelte @@ -65,6 +65,7 @@ } +
+
diff --git a/src/UI/Leaderboard.svelte b/src/UI/Leaderboard.svelte index 4b6ffd21e..daf788383 100644 --- a/src/UI/Leaderboard.svelte +++ b/src/UI/Leaderboard.svelte @@ -30,7 +30,7 @@ } > = UIEventSource.FromPromise(Utils.downloadJsonCached(source)) - +

Contributed images with MapComplete: leaderboard

{#if $data} @@ -67,3 +67,4 @@
Logged in as {$loggedInContributor}
+
diff --git a/src/UI/NotFound.svelte b/src/UI/NotFound.svelte index d7e0534cf..ee7e9889b 100644 --- a/src/UI/NotFound.svelte +++ b/src/UI/NotFound.svelte @@ -5,6 +5,7 @@ console.log("???") +
+
diff --git a/src/UI/PrivacyGui.svelte b/src/UI/PrivacyGui.svelte index 1afdef92d..d92ca15c8 100644 --- a/src/UI/PrivacyGui.svelte +++ b/src/UI/PrivacyGui.svelte @@ -16,7 +16,7 @@ userRelatedState: new UserRelatedState(osmConnection) } - +

@@ -33,3 +33,4 @@

+
diff --git a/src/UI/StylesheetTestGui.svelte b/src/UI/StylesheetTestGui.svelte index 27aa90772..755b0b6c0 100644 --- a/src/UI/StylesheetTestGui.svelte +++ b/src/UI/StylesheetTestGui.svelte @@ -6,6 +6,7 @@ import { UIEventSource } from "../Logic/UIEventSource" +

Stylesheet testing grounds

@@ -167,3 +168,4 @@
+ diff --git a/src/UI/Test.svelte b/src/UI/Test.svelte index 4475d846c..f94b33a65 100644 --- a/src/UI/Test.svelte +++ b/src/UI/Test.svelte @@ -1,16 +1,8 @@ - -

Svelte native

- -

ToSvelte

- +
+ + +
diff --git a/src/UI/ThemeViewGUI.svelte b/src/UI/ThemeViewGUI.svelte index 48220206b..41d4a5984 100644 --- a/src/UI/ThemeViewGUI.svelte +++ b/src/UI/ThemeViewGUI.svelte @@ -203,6 +203,7 @@ +
@@ -688,3 +689,4 @@ sl !== undefined && sl?.properties?.id === LastClickFeatureSource.newPointElementId)} moveTo={openNewElementButton} debug="newElement"/> +
diff --git a/src/all_themes_index.ts b/src/all_themes_index.ts index 864457e3c..6cc03b2c6 100644 --- a/src/all_themes_index.ts +++ b/src/all_themes_index.ts @@ -28,4 +28,6 @@ if (layout !== "") { ) } -new SvelteUIElement(AllThemesGui, {}).AttachTo("main") +new AllThemesGui({ + target: document.getElementById("main") +}) diff --git a/src/index.ts b/src/index.ts index 10e28cc55..1cebb856f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -52,8 +52,10 @@ async function main() { ]) console.log("The available layers on server are", Array.from(availableLayers)) const state = new ThemeViewState(layout, availableLayers) - const main = new SvelteUIElement(ThemeViewGUI, { state }) - main.AttachTo("maindiv") + new ThemeViewGUI({ + target: document.getElementById("maindiv"), + props: {state} + }) Array.from(document.getElementsByClassName("delete-on-load")).forEach((el) => { el.parentElement.removeChild(el) }) diff --git a/src/index_theme.ts.template b/src/index_theme.ts.template index 6092f8453..048a54e12 100644 --- a/src/index_theme.ts.template +++ b/src/index_theme.ts.template @@ -1,5 +1,4 @@ import ThemeViewState from "./src/Models/ThemeViewState" -import SvelteUIElement from "./src/UI/Base/SvelteUIElement" import ThemeViewGUI from "./src/UI/ThemeViewGUI.svelte" import LayoutConfig from "./src/Models/ThemeConfig/LayoutConfig"; import MetaTagging from "./src/Logic/MetaTagging"; @@ -47,8 +46,10 @@ async function main() { MetaTagging.setThemeMetatagging(new ThemeMetaTagging()) // LAYOUT.ADD_LAYERS const state = new ThemeViewState(new LayoutConfig( layout), availableLayers) - const main = new SvelteUIElement(ThemeViewGUI, { state }) - main.AttachTo("maindiv") + new ThemeViewGUI({ + target: document.getElementById("maindiv"), + props: {state} + }) Array.from(document.getElementsByClassName("delete-on-load")).forEach(el => { el.parentElement.removeChild(el) }) diff --git a/src/leaderboard.ts b/src/leaderboard.ts index 3a15cf261..1d974d77e 100644 --- a/src/leaderboard.ts +++ b/src/leaderboard.ts @@ -1,4 +1,5 @@ -import SvelteUIElement from "./UI/Base/SvelteUIElement" import Leaderboard from "./UI/Leaderboard.svelte" -new SvelteUIElement(Leaderboard, {}).AttachTo("main") +new Leaderboard({ + target: document.getElementById("main") +}) diff --git a/src/notfound.ts b/src/notfound.ts index da596ea9d..1cb23811e 100644 --- a/src/notfound.ts +++ b/src/notfound.ts @@ -1,4 +1,5 @@ -import SvelteUIElement from "./UI/Base/SvelteUIElement" import NotFound from "./UI/NotFound.svelte" -new SvelteUIElement(NotFound, {}).AttachTo("maindiv") +new NotFound({ + target: document.getElementById("maindiv") +}) diff --git a/src/privacy_index.ts b/src/privacy_index.ts index c8da1465e..68587dfc4 100644 --- a/src/privacy_index.ts +++ b/src/privacy_index.ts @@ -1,3 +1,4 @@ -import SvelteUIElement from "./UI/Base/SvelteUIElement" import PrivacyGui from "./UI/PrivacyGui.svelte" -new SvelteUIElement(PrivacyGui, {}).AttachTo("main") +new PrivacyGui({ + target: document.getElementById("main") +}) diff --git a/src/test.ts b/src/test.ts index 52729071c..248e34073 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,4 +1,6 @@ import SvelteUIElement from "./UI/Base/SvelteUIElement" import Test from "./UI/Test.svelte" -new SvelteUIElement(Test).AttachTo("maindiv") +new Test({ + target: document.getElementById("maindiv") +}) From 00fd8588fabed0c919235872c229fea1a85a7ad0 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Sat, 15 Jun 2024 14:06:51 +0200 Subject: [PATCH 41/43] Chore: formatting of caddyfile --- Docs/ServerConfig/cache/Caddyfile | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Docs/ServerConfig/cache/Caddyfile b/Docs/ServerConfig/cache/Caddyfile index 9bddec411..e54c42d99 100644 --- a/Docs/ServerConfig/cache/Caddyfile +++ b/Docs/ServerConfig/cache/Caddyfile @@ -1,10 +1,4 @@ cache.mapcomplete.org { - reverse_proxy /summary/* { - to http://127.0.0.1:2345 - } - - reverse_proxy /* { - to http://127.0.0.1:7800 - } - + reverse_proxy /summary/* 127.0.0.1:2345 + reverse_proxy /* 127.0.0.1:7800 } From aeb9d7f71000f71193de3ab33db3644e48efba07 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Sat, 15 Jun 2024 18:52:47 +0200 Subject: [PATCH 42/43] Remove obsolete import, fix tests --- src/UI/Test.svelte | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/UI/Test.svelte b/src/UI/Test.svelte index f94b33a65..df2281134 100644 --- a/src/UI/Test.svelte +++ b/src/UI/Test.svelte @@ -1,8 +1,5 @@
- -
From 72d10863b8bfa854bb8d059fff46ee6e7ace35c9 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Sat, 15 Jun 2024 20:11:14 +0200 Subject: [PATCH 43/43] Attempt to fix #1988 --- scripts/generateLayouts.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/generateLayouts.ts b/scripts/generateLayouts.ts index f7e2aca01..709ffa0fc 100644 --- a/scripts/generateLayouts.ts +++ b/scripts/generateLayouts.ts @@ -392,6 +392,8 @@ class GenerateLayouts extends Script { } } + hosts.add("http://www.schema.org") // Schema.org is _not_ encrypted and thus needs an exception + if (hosts.has("*")) { throw "* is not allowed as connect-src" }