From 9452a7546b11a2bdb6587d13a1e789f563e72b4a Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 3 Jun 2025 17:46:05 +0000 Subject: [PATCH 01/17] Translated using Weblate (Catalan) Currently translated at 90.2% (4086 of 4528 strings) Translation: MapComplete/layers Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/layers/ca/ --- langs/layers/ca.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/langs/layers/ca.json b/langs/layers/ca.json index aad9665dd6..eefff3016f 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -13770,4 +13770,4 @@ "render": "Turbina eòlica" } } -} \ No newline at end of file +} From ccee409b073e61e688f2b973df9437f7386ef713 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 3 Jun 2025 17:46:14 +0000 Subject: [PATCH 02/17] Translated using Weblate (Czech) Currently translated at 80.1% (3631 of 4528 strings) Translation: MapComplete/layers Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/layers/cs/ --- langs/layers/cs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/langs/layers/cs.json b/langs/layers/cs.json index 79cdc8f2dd..e87979ccea 100644 --- a/langs/layers/cs.json +++ b/langs/layers/cs.json @@ -12050,4 +12050,4 @@ "render": "větrná turbína" } } -} \ No newline at end of file +} From a785eb47b6270bb4588ea7af470e85777f1c1dad Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 3 Jun 2025 17:46:36 +0000 Subject: [PATCH 03/17] Translated using Weblate (German) Currently translated at 92.5% (4191 of 4528 strings) Translation: MapComplete/layers Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/layers/de/ --- langs/layers/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/langs/layers/de.json b/langs/layers/de.json index deb382aa7a..668ce8b6e8 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -13701,4 +13701,4 @@ "render": "Windrad" } } -} \ No newline at end of file +} From 90e96ac1152fd0f745c9ea2ee046af63cbee2e66 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 3 Jun 2025 17:46:58 +0000 Subject: [PATCH 04/17] Translated using Weblate (Spanish) Currently translated at 84.0% (3805 of 4528 strings) Translation: MapComplete/layers Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/layers/es/ --- langs/layers/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/langs/layers/es.json b/langs/layers/es.json index dcd0f5b7c1..f83a82e294 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -12582,4 +12582,4 @@ "render": "aerogenerador" } } -} \ No newline at end of file +} From a5ffcc2c83280e064696d784ab39595d53837fef Mon Sep 17 00:00:00 2001 From: POG Date: Tue, 3 Jun 2025 22:36:34 +0000 Subject: [PATCH 05/17] Translated using Weblate (French) Currently translated at 50.1% (2270 of 4528 strings) Translation: MapComplete/layers Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/layers/fr/ --- langs/layers/fr.json | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/langs/layers/fr.json b/langs/layers/fr.json index 1221e21d21..c0ef2e4693 100644 --- a/langs/layers/fr.json +++ b/langs/layers/fr.json @@ -4287,7 +4287,7 @@ "then": "Une carte de village ou de petite ville" }, "3": { - "then": " Une carte de ville" + "then": "Une carte de ville" }, "4": { "then": "La carte d'une région entière, montrant de nombreuses villes et villages" @@ -7236,6 +7236,36 @@ "then": "Un lien vers votre profil Mastodon a été trouvé : {_mastodon_link}" } } + }, + "inbox": { + "mappings": { + "1": { + "then": { + "special": { + "text": "Vous avez {_unreadMessages} messages
Ouvrir votre boîte de réception" + } + } + }, + "0": { + "then": { + "special": { + "text": "Ouvrir votre boîte de réception" + } + } + } + } + }, + "mangrove-key-import": { + "render": { + "after": "Charger une clé privée écrasera votre clé privée actuelle. Si vous avez réalisé des vérifications avec votre clé privée actuelle, téléchargez la d'abord" + } + }, + "language_picker": { + "mappings": { + "0": { + "then": "La langue a été configurée via un paramètre d'URL et ne peut être configurée par l'utilisateur." + } + } } }, "title": { @@ -7597,4 +7627,4 @@ "render": "éolienne" } } -} \ No newline at end of file +} From 115d6986933c5ed9fe129f8c758f71d11ca9b33a Mon Sep 17 00:00:00 2001 From: Weblate Admin Date: Wed, 4 Jun 2025 10:37:46 +0000 Subject: [PATCH 06/17] Translated using Weblate (Dutch) Currently translated at 77.6% (3515 of 4528 strings) Translation: MapComplete/layers Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/layers/nl/ --- langs/layers/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/langs/layers/nl.json b/langs/layers/nl.json index 500333af25..8705c28973 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -8749,7 +8749,7 @@ "then": "Buitengewone (geattesteerde) leerlingen en leerlingen zonder extra zorgnood zitten samen in de klas." }, "3": { - "then": "Deze school biedt ad hoc, beperkte extra zorg aan maar telt niet als buitengwoon onderwij.s" + "then": "Deze school biedt ad hoc, beperkte extra zorg aan maar telt niet als buitengwoon onderwijs." }, "4": { "then": "Deze school heeft geen ondersteuning voor buitengewone leerlingen." From 56e4f51a94aeb850441d5ea98ce8c487d7b0d4d2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 3 Jun 2025 17:50:07 +0000 Subject: [PATCH 07/17] Translated using Weblate (Ukrainian) Currently translated at 17.6% (801 of 4528 strings) Translation: MapComplete/layers Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/layers/uk/ --- langs/layers/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/langs/layers/uk.json b/langs/layers/uk.json index b1165b7971..72e1f2dab3 100644 --- a/langs/layers/uk.json +++ b/langs/layers/uk.json @@ -3027,4 +3027,4 @@ "render": "Утилізація відходів" } } -} \ No newline at end of file +} From 80acd574637a151c988680a0d8f2be6c534a7c22 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 4 Jun 2025 17:48:09 +0000 Subject: [PATCH 08/17] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: MapComplete/layers Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/layers/ --- langs/layers/nl.json | 42 ++---------------------------------------- 1 file changed, 2 insertions(+), 40 deletions(-) diff --git a/langs/layers/nl.json b/langs/layers/nl.json index 8705c28973..f8e4b6f66c 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -2148,9 +2148,6 @@ }, "title": { "mappings": { - "0": { - "then": "{name}" - }, "1": { "then": "Vogelkijkhut {name}" }, @@ -6854,11 +6851,6 @@ } }, "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, "render": "Natuurgebied" } }, @@ -7393,21 +7385,6 @@ "render": "Picknicktafel" } }, - "play_forest": { - "description": "Een speelbos is een vrij toegankelijke zone in een bos", - "name": "Speelbossen", - "title": { - "mappings": { - "0": { - "then": "{name}" - }, - "1": { - "then": "Speelbos {name}" - } - }, - "render": "Speelbos" - } - }, "playground": { "deletion": { "nonDeleteMappings": { @@ -9156,9 +9133,6 @@ }, "title": { "mappings": { - "0": { - "then": "{name}" - }, "1": { "then": "Voetpad" }, @@ -11408,25 +11382,13 @@ } }, "village_green": { - "description": "Een laag die dorpsgroen toont (gemeenschapsgroen, maar niet echt een park)", - "name": "Speelweide", - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "Speelweide" - } + "description": "Een laag die dorpsgroen toont (gemeenschapsgroen, maar niet echt een park)" }, "visitor_information_centre": { "description": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd.", "name": "Bezoekerscentrum", "title": { "mappings": { - "0": { - "then": "{name:nl}" - }, "1": { "then": "{name}" } @@ -11640,4 +11602,4 @@ "render": "windturbine" } } -} \ No newline at end of file +} From 8dc0c886276c3ad7e6b64dd060b6429ba302a551 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 4 Jun 2025 01:20:02 +0200 Subject: [PATCH 09/17] UI: reverse top headers, make height smaller --- .../Visualisation/RegularOpeningHoursTable.svelte | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/UI/OpeningHours/Visualisation/RegularOpeningHoursTable.svelte b/src/UI/OpeningHours/Visualisation/RegularOpeningHoursTable.svelte index 77351216af..6a0fca6a54 100644 --- a/src/UI/OpeningHours/Visualisation/RegularOpeningHoursTable.svelte +++ b/src/UI/OpeningHours/Visualisation/RegularOpeningHoursTable.svelte @@ -41,6 +41,7 @@ changeHours: number[] changeTexts: string[] }[] = OH.partitionOHForDistance(changeHours, changeHourText) + weekdayHeaders.reverse(/* inplace reverse */) const weekendDayHeaders: { changeHours: number[] changeTexts: string[] @@ -91,7 +92,7 @@ {#each weekdayHeaders as weekdayHeader} - + - + Date: Wed, 4 Jun 2025 01:20:40 +0200 Subject: [PATCH 10/17] Scripts: fix runs-on --- .forgejo/workflows/daily_data_maintenance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/daily_data_maintenance.yml b/.forgejo/workflows/daily_data_maintenance.yml index b494d876e0..6ad98ffb40 100644 --- a/.forgejo/workflows/daily_data_maintenance.yml +++ b/.forgejo/workflows/daily_data_maintenance.yml @@ -22,7 +22,7 @@ jobs: ssh hetzner "cd data && rm -rf community-index/ && unzip community-index.zip && rm community-index.zip" update_statistics: - runs-on: [ ubuntu-latest, hetzner-access ] + runs-on: [ hetzner-access ] steps: - uses: https://source.mapcomplete.org/actions/checkout@v4 - uses: ./.forgejo/setup From 74e15527ef693c501cf76a8f9399929f629f0ab1 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 4 Jun 2025 18:39:15 +0200 Subject: [PATCH 11/17] Scripts: improve documentation and try to speed up things --- .forgejo/workflows/update_database.yml | 4 +- Docs/SettingUpPSQL.md | 10 ++- scripts/generateLayouts.ts | 91 ++++++++++++-------------- 3 files changed, 53 insertions(+), 52 deletions(-) diff --git a/.forgejo/workflows/update_database.yml b/.forgejo/workflows/update_database.yml index 360c0d7f3f..39ed860920 100644 --- a/.forgejo/workflows/update_database.yml +++ b/.forgejo/workflows/update_database.yml @@ -5,7 +5,7 @@ on: jobs: - daily_data_maintenance: + update_database: runs-on: [ osm-cache ] steps: - uses: https://source.mapcomplete.org/actions/checkout@v4 @@ -20,7 +20,7 @@ jobs: run: npm run build:dbscript # output: build_db.lua - - name: Print planet file date + - name: Create and fill database shell: bash run: | # LAIN has a weekly updated planet file in /data/planet-latest.osm.pbf diff --git a/Docs/SettingUpPSQL.md b/Docs/SettingUpPSQL.md index e30bfead2d..7aaafb89f0 100644 --- a/Docs/SettingUpPSQL.md +++ b/Docs/SettingUpPSQL.md @@ -1,13 +1,19 @@ # Setting up a synced OSM-server for quick layer access +## Requirements + +Debian machine (e.g. Ubuntu) + +`apt install osmium-tool docker.io osm2pgsql` + ## Setting up the SQL-server (only once): `sudo docker run --name some-postgis -e POSTGRES_PASSWORD=password -e POSTGRES_USER=user -d -p 5444:5432 -v ~/data/pgsql/:/var/lib/postgresql/data postgis/postgis` Increase the max number of connections. osm2pgsql needs connection one per table (and a few more), and since we are making one table per layer in MapComplete, this amounts to a lot. -- Open PGAdmin, open the PGSQL-tool (CLI-button at the top); alternativly: psql --host=172.17.0.1 --port=5444 - --user=user +- Open PGAdmin, open the PGSQL-tool (CLI-button at the top); alternativly: + `psql --host=172.17.0.1 --port=5444 --user=user` - Run `show config_file;` to get the config file location (in docker). This is probably `/var/lib/postgresql/data/postgresql.conf` - In a terminal, run `sudo docker exec -i bash` (run `sudo docker ps` to get the container id) diff --git a/scripts/generateLayouts.ts b/scripts/generateLayouts.ts index 522f86f790..cb34462412 100644 --- a/scripts/generateLayouts.ts +++ b/scripts/generateLayouts.ts @@ -40,7 +40,7 @@ class GenerateLayouts extends Script { private eliUrlsCached: string[] private date = new Date().toISOString() private branchName: string = undefined - + private alreadyWritten: Set = new Set() constructor() { super("Generates an '.html' and 'index_.ts' for every theme") } @@ -70,7 +70,7 @@ class GenerateLayouts extends Script { }) } - async createIcon(iconPath: string, size: number, alreadyWritten: string[]) { + async createIcon(iconPath: string, size: number) { let name = iconPath.split(".").slice(0, -1).join(".") // drop svg suffix if (name.startsWith("./")) { name = name.substring(2) @@ -78,10 +78,10 @@ class GenerateLayouts extends Script { const newname = `assets/generated/images/${name.replace(/\//g, "_")}${size}.png` const targetpath = `public/${newname}` - if (alreadyWritten.indexOf(newname) >= 0) { + if (this.alreadyWritten.has(newname)) { return newname } - alreadyWritten.push(newname) + this.alreadyWritten.add(newname) if (existsSync(targetpath)) { return newname } @@ -163,8 +163,7 @@ class GenerateLayouts extends Script { } async createManifest( - layout: ThemeConfig, - alreadyWritten: string[] + layout: ThemeConfig ): Promise<{ manifest: any whiteIcons: string[] @@ -199,8 +198,8 @@ class GenerateLayouts extends Script { const sizes = [72, 96, 120, 128, 144, 152, 180, 192, 384, 512] for (const size of sizes) { - const name = await this.createIcon(path, size, alreadyWritten) - const whiteIcon = await this.createIcon(whiteBackgroundPath, size, alreadyWritten) + const name = await this.createIcon(path, size) + const whiteIcon = await this.createIcon(whiteBackgroundPath, size) whiteIcons.push(whiteIcon) icons.push({ src: name, @@ -447,8 +446,7 @@ class GenerateLayouts extends Script { async createLandingPage( layout: ThemeConfig, layoutJson: ThemeConfigJson, - whiteIcons, - alreadyWritten + whiteIcons ) { Locale.language.setData(layout.language[0]) const targetLanguage = layout.language[0] @@ -471,7 +469,7 @@ class GenerateLayouts extends Script { if (twitterImage.endsWith(".svg")) { try { // svgs are badly supported as social image, we use a generated svg instead - twitterImage = await this.createIcon(twitterImage, 512, alreadyWritten) + twitterImage = await this.createIcon(twitterImage, 512) } catch (e) { console.error("Could not generate image:", e) } @@ -479,7 +477,7 @@ class GenerateLayouts extends Script { if (ogImage.endsWith(".svg")) { try { - ogImage = await this.createIcon(ogImage, 512, alreadyWritten) + ogImage = await this.createIcon(ogImage, 512) } catch (e) { console.error("Could not generate image:", e) } @@ -611,64 +609,62 @@ class GenerateLayouts extends Script { } } + private async createThemeFor(layoutConfigJson: ThemeConfigJson) { + const layout = new ThemeConfig(layoutConfigJson, true) + const layoutName = layout.id + + const err = (err) => { + if (err !== null) { + console.log("Could not write manifest for ", layoutName, " because ", err) + } + } + const { manifest, whiteIcons } = await this.createManifest(layout) + const manif = JSON.stringify(manifest, undefined, 2) + const manifestLocation = encodeURIComponent(layout.id.toLowerCase()) + ".webmanifest" + writeFile("public/" + manifestLocation, manif, err) + + // Create a landing page for the given theme + const landing = await this.createLandingPage( + layout, + layoutConfigJson, + whiteIcons + ) + + writeFile(this.enc(layout.id) + ".html", landing, err) + await this.createIndexFor(layout) + } + async main(): Promise { - const alreadyWritten = [] this.createDir("./public/assets/") this.createDir("./public/assets/generated") this.createDir("./public/assets/generated/images") - const blacklist = [ + const blacklist = new Set([ "", "test", ".", "..", "manifest", "index", + "inspector", "land", "preferences", "account", "openstreetmap", "custom", "theme", - ] + ]) const args = process.argv const theme = args[2] if (theme !== undefined) { console.warn("Only generating layout " + theme) } const paths = ScriptUtils.readDirRecSync("./public/assets/generated/themes/", 1) - for (const i in paths) { - const layoutConfigJson = JSON.parse(readFileSync(paths[i], "utf8")) - if (theme !== undefined && layoutConfigJson.id !== theme) { - continue - } - const layout = new ThemeConfig(layoutConfigJson, true) - const layoutName = layout.id - if (blacklist.indexOf(layoutName.toLowerCase()) >= 0) { - console.log(`Skipping a layout with name ${layoutName}, it is on the blacklist`) - continue - } - const err = (err) => { - if (err !== null) { - console.log("Could not write manifest for ", layoutName, " because ", err) - } - } - const { manifest, whiteIcons } = await this.createManifest(layout, alreadyWritten) - const manif = JSON.stringify(manifest, undefined, 2) - const manifestLocation = encodeURIComponent(layout.id.toLowerCase()) + ".webmanifest" - writeFile("public/" + manifestLocation, manif, err) + const configs = paths.map(path => JSON.parse(readFileSync(path, "utf8"))) + const configsFiltered = configs + .filter(config => (theme !== undefined && config.id === theme) || !blacklist.has(config.id)) - // Create a landing page for the given theme - const landing = await this.createLandingPage( - layout, - layoutConfigJson, - whiteIcons, - alreadyWritten - ) - - writeFile(this.enc(layout.id) + ".html", landing, err) - await this.createIndexFor(layout) - } + await Promise.all(configsFiltered.map(config => this.createThemeFor(config))) const { manifest } = await this.createManifest( new ThemeConfig({ @@ -681,8 +677,7 @@ class GenerateLayouts extends Script { startZoom: 0, title: { en: "MapComplete" }, description: { en: "A thematic map viewer and editor based on OpenStreetMap" }, - }), - alreadyWritten + }) ) const manif = JSON.stringify(manifest, undefined, 2) From a22946e34a9f00e90e2b4a1dbba49b2845de507b Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 4 Jun 2025 21:15:53 +0200 Subject: [PATCH 12/17] Fix: extract goatcounter to update hash --- 404.html | 4 +--- index.html | 4 +--- inspector.html | 4 +--- privacy.html | 4 +--- src/loadGoatcounter.js | 7 +++++++ statistics.html | 4 +--- status.html | 4 +--- studio.html | 4 +--- test/CodeQuality.spec.ts | 10 +++++++++- theme.html | 4 +--- 10 files changed, 24 insertions(+), 25 deletions(-) create mode 100644 src/loadGoatcounter.js diff --git a/404.html b/404.html index a7924c5298..f0273dc52e 100644 --- a/404.html +++ b/404.html @@ -41,9 +41,7 @@
- + diff --git a/index.html b/index.html index 0743235f0a..626628eda2 100644 --- a/index.html +++ b/index.html @@ -42,9 +42,7 @@
- + diff --git a/inspector.html b/inspector.html index 25d0712d7e..0c458e9444 100644 --- a/inspector.html +++ b/inspector.html @@ -12,9 +12,7 @@
Loading inspector...
- + diff --git a/privacy.html b/privacy.html index c6dc3b5bbd..0e8ab8bdc3 100644 --- a/privacy.html +++ b/privacy.html @@ -38,9 +38,7 @@
- + diff --git a/src/loadGoatcounter.js b/src/loadGoatcounter.js new file mode 100644 index 0000000000..314639453f --- /dev/null +++ b/src/loadGoatcounter.js @@ -0,0 +1,7 @@ +const script = document.createElement("script") +script.async = true +script.dataset.goatcounter = "https://pietervdvn.goatcounter.com/count" +script.src = "https://gc.zgo.at/count.js" +script.crossOrigin = "anonymous" +script.integrity = "sha384-atnOLvQb9t+jTSipvd75X2yginT4PjVbqDdlJAmxMm+wYElFmeR6EmLP5bYeoRVQ" +document.head.appendChild(script) diff --git a/statistics.html b/statistics.html index 0e65fa043f..935ad2a040 100644 --- a/statistics.html +++ b/statistics.html @@ -12,9 +12,7 @@
Loading statistics...
- + diff --git a/status.html b/status.html index b05d424fe4..0f1d127324 100644 --- a/status.html +++ b/status.html @@ -13,9 +13,7 @@
- + diff --git a/studio.html b/studio.html index d4f04e41aa..9624b3f0e4 100644 --- a/studio.html +++ b/studio.html @@ -19,9 +19,7 @@
- + diff --git a/test/CodeQuality.spec.ts b/test/CodeQuality.spec.ts index c2939ef0fe..2cafdcad71 100644 --- a/test/CodeQuality.spec.ts +++ b/test/CodeQuality.spec.ts @@ -158,6 +158,14 @@ describe("Code quality", () => { for (const htmlFile of htmlFiles) { await validateScriptIntegrityOf(htmlFile) } + const goatCounter = "https://gc.zgo.at/count.js" + const data: string = (await ScriptUtils.Download(goatCounter))["content"] + const hashed = await webcrypto.subtle.digest("SHA-384", new TextEncoder().encode(data)) + const hashedB64 = _arrayBufferToBase64(hashed) + const goatCounterScript = readFileSync("./src/loadGoatcounter.js", "utf-8") + if (goatCounterScript.indexOf(hashedB64) < 0) { + throw "Hash sha-384" + hashedB64 + " not found in 'loadGoatcounter.js'" + } }) /* itAsync( @@ -168,7 +176,7 @@ describe("Code quality", () => { ) ) /* - itAsync( + itAsync(int "should not contain '[\"default\"]'", detectInCode('\\[\\"default\\"\\]', "Possible leftover of faulty default import") )*/ diff --git a/theme.html b/theme.html index 05ceed9e71..1526f204b5 100644 --- a/theme.html +++ b/theme.html @@ -92,9 +92,7 @@ - + From 528a5e6c87d75247b61e7376c3989db7f126c17b Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 5 Jun 2025 00:51:34 +0200 Subject: [PATCH 13/17] UI: small tweaks, fix #2429 --- public/css/index-tailwind-output.css | 4 ++++ src/UI/Image/LinkableImage.svelte | 5 ++++- src/UI/Popup/QrCode.svelte | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/public/css/index-tailwind-output.css b/public/css/index-tailwind-output.css index 0c72f3f4d4..cc4a22991e 100644 --- a/public/css/index-tailwind-output.css +++ b/public/css/index-tailwind-output.css @@ -1530,6 +1530,10 @@ input[type="range"].range-lg::-moz-range-thumb { margin-left: 1rem; } +.ml-6 { + margin-left: 1.5rem; +} + .mr-0\.5 { margin-right: 0.125rem; } diff --git a/src/UI/Image/LinkableImage.svelte b/src/UI/Image/LinkableImage.svelte index cffa1dc024..e9971b2537 100644 --- a/src/UI/Image/LinkableImage.svelte +++ b/src/UI/Image/LinkableImage.svelte @@ -19,6 +19,8 @@ import ThemeViewState from "../../Models/ThemeViewState" import { MenuState } from "../../Models/MenuState" import { LicenseInfo } from "../../Logic/ImageProviders/LicenseInfo" + import Tr from "../Base/Tr.svelte" + import { ExternalLinkIcon } from "@rgossiaux/svelte-heroicons/solid" export let tags: UIEventSource export let state: ThemeViewState @@ -26,6 +28,7 @@ export let feature: Feature export let layer: LayerConfig + export let highlighted: UIEventSource = undefined export let nearbyFeatures: Feature[] | Store = [] export let linkable = true @@ -121,7 +124,7 @@ {#if linkable} {/if} diff --git a/src/UI/Popup/QrCode.svelte b/src/UI/Popup/QrCode.svelte index 8b2ff00981..9b8ee3963e 100644 --- a/src/UI/Popup/QrCode.svelte +++ b/src/UI/Popup/QrCode.svelte @@ -83,6 +83,6 @@
{$sideTextSub}
{/if} - {$url} + {$url} {/if} From 5e259b0af005b66b44e03840e6f4f415225d7923 Mon Sep 17 00:00:00 2001 From: Supaplex Date: Wed, 4 Jun 2025 04:47:34 +0000 Subject: [PATCH 14/17] Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 67.3% (303 of 450 strings) Translation: MapComplete/themes Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/themes/zh_Hant/ --- langs/themes/zh_Hant.json | 87 +++++++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 8 deletions(-) diff --git a/langs/themes/zh_Hant.json b/langs/themes/zh_Hant.json index 7f4a255e83..f7ea9b5585 100644 --- a/langs/themes/zh_Hant.json +++ b/langs/themes/zh_Hant.json @@ -486,8 +486,12 @@ }, "2": { "then": "這裡有灌木" + }, + "3": { + "then": "有遮蔭的植物" } - } + }, + "question": "這裡生長什麼類型的植物?" }, "facadegardens-rainbarrel": { "mappings": { @@ -515,7 +519,8 @@ "2": { "then": "花園有陰影遮蔭" } - } + }, + "question": "這個花園有遮蔭還是有日照?" } }, "title": { @@ -574,18 +579,22 @@ "1": { "then": "這個藝術不是歷史上的宣傳品" } - } + }, + "question": "這個藝術品是歷史廣告嗎?" } } } } - } + }, + "title": "有鬼標誌" }, "glutenfree": { - "title": "無麩質飲食" + "title": "無麩質飲食", + "description": "群眾共編無麩質標示地圖" }, "guideposts": { - "title": "指示牌" + "title": "指示牌", + "description": "指示牌 (又稱為指標) 常在官方登山、單車或是滑雪還是騎馬路線沿線,指示不同目的地的方向。除此之外,也常以當地名稱或是地點來顯示海拔高度。\n\n指示牌的位置常被登山客/單車騎士/騎馬騎士/滑雪者拿來參考,特別是採用紙本地圖而無GPS接受器的情形。 " }, "hackerspaces": { "description": "在這份地圖上你可以看到駭客空間,新增或直接更新資料", @@ -615,7 +624,8 @@ } } }, - "title": "醫療保健" + "title": "醫療保健", + "description": "在這份地圖上,不同的醫療設施會顯示在地圖上" }, "hotels": { "title": "飯店" @@ -872,5 +882,66 @@ "description": "在這份地圖當中,你可以找到你附近的垃圾筒。如果地圖有遺漏垃圾筒,你可以自己加上去", "shortDescription": "垃圾筒的地圖", "title": "垃圾筒" + }, + "grb": { + "layers": { + "1": { + "tagRenderings": { + "Import-button": { + "mappings": { + "0": { + "then": "還沒有計算中介標籤…再次開啟跳出視窗" + }, + "1": { + "then": "這棟建築有中庭而且用關聯繪製。如果是這樣,並沒有辦法整合,需要透過手動整合建築匯出站 {open_in_josm()}" + } + } + } + } + }, + "0": { + "tagRenderings": { + "building type": { + "question": "這邊是什麼類型的建築?" + }, + "grb-reference": { + "render": "已經從GRB匯入,編號是{source:geometry:ref}" + } + } + } + }, + "popup": { + "0": { + "body": { + "0": { + "render": { + "after": "要包括連結 https://wiki.openstreetmap.org/wiki/WikiProject_Belgium/Building_and_address_import", + "special": { + "text": "編輯你的個人檔案" + } + } + }, + "1": { + "render": { + "special": { + "message": "重新載入你的個人檔案" + } + } + } + }, + "title": { + "render": "個人檔案義務" + } + } + }, + "description": "這個主題是企圖自動化GRB匯入。" + }, + "fireplace": { + "description": "室外可以生火的地方或是正式場合的固定烤肉設施。", + "title": "火爐以及烤肉架" + }, + "historic_aircraft": { + "description": "顯示所有歷史物件,永久陳列的飛機。而飛機可以是博物館、藝術品或是紀念碑。", + "title": "歷史飛機" } -} \ No newline at end of file +} From 9668eaf54df5c844c7a924f431611376d2508c28 Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 5 Jun 2025 04:48:00 +0000 Subject: [PATCH 15/17] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: MapComplete/themes Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/themes/ --- langs/themes/nl.json | 89 +------------------------------------------- 1 file changed, 2 insertions(+), 87 deletions(-) diff --git a/langs/themes/nl.json b/langs/themes/nl.json index d9fee23dc2..6f49130c73 100644 --- a/langs/themes/nl.json +++ b/langs/themes/nl.json @@ -595,37 +595,8 @@ "building type": { "question": "Wat voor soort gebouw is dit?" }, - "grb-fixme": { - "mappings": { - "0": { - "then": "Geen fixme" - } - }, - "question": "Wat zegt de fixme?", - "render": "De fixme is {fixme}" - }, - "grb-housenumber": { - "mappings": { - "0": { - "then": "Geen huisnummer" - } - }, - "question": "Wat is het huisnummer?", - "render": "Het huisnummer is {addr:housenumber}" - }, - "grb-min-level": { - "question": "Hoeveel verdiepingen ontbreken?", - "render": "Dit gebouw begint maar op de {building:min_level} verdieping" - }, "grb-reference": { "render": "Werd geïmporteerd vanuit GRB, het referentienummer is {source:geometry:ref}" - }, - "grb-street": { - "question": "Wat is de straat?", - "render": "De straat is {addr:street}" - }, - "grb-unit": { - "render": "De wooneenheid-aanduiding is {addr:unit} " } } }, @@ -667,9 +638,7 @@ "render": "Link op profiel verplicht" } } - }, - "shortDescription": "Grb import helper tool", - "title": "GRB import helper" + } }, "guideposts": { "description": "Wegwijzers (ook wel handwijzer genoemd) zijn vaak te vinden langs officiële wandel-, fiets-, ski- of paardrijroutes om de richtingen naar verschillende bestemmingen aan te geven. Vaak zijn ze vernoemd naar een regio of plaats en geven ze de hoogte aan.\n\nDe positie van een wegwijzer kan door een wandelaar/fietser/renner/skiër worden gebruikt als bevestiging van de huidige positie, vooral als ze een gedrukte kaart zonder GPS-ontvanger gebruiken. ", @@ -1090,11 +1059,6 @@ }, "title": "Dierenartsen, hondenloopzones en andere huisdiervriendelijke plaatsen" }, - "play_forests": { - "description": "Een speelbos is een zone in een bos die vrij toegankelijk is voor spelende kinderen. Deze wordt in bossen van het Agentschap Natuur en bos altijd aangeduid met het overeenkomstige bord.", - "shortDescription": "Deze kaart toont speelbossen", - "title": "Speelbossen" - }, "playgrounds": { "description": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen", "shortDescription": "Een kaart met speeltuinen", @@ -1168,47 +1132,6 @@ "description": "Alles om te skiën", "title": "Skipistes en kabelbanen" }, - "speelplekken": { - "description": "

Welkom bij de Groendoener!

De Zuidrand dat is spelen, ravotten, chillen, wandelen,… in het groen. Meer dan 200 grote en kleine speelplekken liggen er in parken, in bossen en op pleintjes te wachten om ontdekt te worden. De verschillende speelplekken werden getest én goedgekeurd door kinder- en jongerenreporters uit de Zuidrand. Met leuke challenges dagen de reporters jou uit om ook op ontdekking te gaan. Klik op een speelplek op de kaart, bekijk het filmpje en ga op verkenning!

Het project groendoener kadert binnen het strategisch project Beleefbare Open Ruimte in de Antwerpse Zuidrand en is een samenwerking tussen het departement Leefmilieu van provincie Antwerpen, Sportpret vzw, een OpenStreetMap-België Consultent en Createlli vzw. Het project kwam tot stand met steun van Departement Omgeving van de Vlaamse Overheid.
", - "layers": { - "6": { - "name": "Wandelroutes van provincie Antwerpen", - "tagRenderings": { - "walk-description": { - "render": "

Korte beschrijving:

{description}" - }, - "walk-length": { - "render": "Deze wandeling is {_length:km}km lang" - }, - "walk-operator": { - "question": "Wie beheert deze wandeling en plaatst dus de signalisatiebordjes?" - }, - "walk-operator-email": { - "question": "Naar wie kan men emailen bij problemen rond signalisatie?", - "render": "Bij problemen met signalisatie kan men emailen naar {operator:email}" - }, - "walk-type": { - "mappings": { - "0": { - "then": "Dit is een internationale wandelroute" - }, - "1": { - "then": "Dit is een nationale wandelroute" - }, - "2": { - "then": "Dit is een regionale wandelroute" - }, - "3": { - "then": "Dit is een lokale wandelroute" - } - } - } - } - } - }, - "shortDescription": "Speelplekken in de Antwerpse Zuidrand", - "title": "Welkom bij de groendoener!" - }, "sport_pitches": { "description": "Een sportveld is een ingerichte plaats met infrastructuur om een sport te beoefenen", "shortDescription": "Deze kaart toont sportvelden", @@ -1327,10 +1250,6 @@ }, "title": "Straatverlichting" }, - "street_lighting_assen": { - "description": "Op deze kaart vind je alles over straatlantaarns + een dataset van Assen", - "title": "Straatverlichting - Assen" - }, "surveillance": { "description": "Op deze open kaart kan je bewakingscamera's vinden.", "shortDescription": "Bewakingscameras en dergelijke", @@ -1444,13 +1363,9 @@ "description": "Kaart met afvalbakken en recyclingfaciliteiten.", "title": "Afval" }, - "waste_assen": { - "description": "Kaart met afvalbakken en recyclingfaciliteiten + een dataset voor Assen.", - "title": "Afval - Assen" - }, "waste_basket": { "description": "Op deze kaart vind je afvalbakken bij jou in de buurt. Als er een afvalbak ontbreekt op deze kaart, kun je deze zelf toevoegen", "shortDescription": "Een kaart met vuilnisbakken", "title": "Vuilnisbakken" } -} \ No newline at end of file +} From c1986d701128dc321aa8d6109098339b8829df0d Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 5 Jun 2025 13:15:18 +0200 Subject: [PATCH 16/17] chore(release): 0.51.10 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e421a54b2a..688c18c8cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.51.10](https://source.mapcomplete.org/MapComplete/MapComplete/compare/v0.51.9...v0.51.10) (2025-06-05) + + +### Bug Fixes + +* extract goatcounter to update hash ([a22946e](https://source.mapcomplete.org/MapComplete/MapComplete/commits/a22946e34a9f00e90e2b4a1dbba49b2845de507b)) +* fix tests and wrong category ([f942529](https://source.mapcomplete.org/MapComplete/MapComplete/commits/f942529755c94457ff21d8cef2d4a1757fbeac09)) +* hotfix: projectiontype might be not defined, this crashes validation ([d2c6385](https://source.mapcomplete.org/MapComplete/MapComplete/commits/d2c63853d680d5ea666efabeca3bb5c5062a5d34)) +* update goatcounter links ([5981c95](https://source.mapcomplete.org/MapComplete/MapComplete/commits/5981c958c0d4922b999a6020019ef2c90b1cd2c1)) + ### [0.51.9](https://source.mapcomplete.org/MapComplete/MapComplete/compare/v0.51.7...v0.51.9) (2025-06-03) diff --git a/package-lock.json b/package-lock.json index ea8e7be3fe..38600ac60a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mapcomplete", - "version": "0.51.9", + "version": "0.51.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mapcomplete", - "version": "0.51.9", + "version": "0.51.10", "hasInstallScript": true, "license": "GPL-3.0-or-later", "dependencies": { diff --git a/package.json b/package.json index 88932f1162..b637a99f02 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapcomplete", - "version": "0.51.9", + "version": "0.51.10", "repository": "https://source.mapcomplete.org/MapComplete/MapComplete", "description": "A small website to edit OSM easily", "bugs": "hhttps://source.mapcomplete.org/MapComplete/MapComplete/issues", From 8d0eb840e903195f22ace3b3e10457b8cce291ea Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 5 Jun 2025 18:27:46 +0200 Subject: [PATCH 17/17] chore(release): 0.51.11 --- CHANGELOG.md | 21 +++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 688c18c8cc..798da3514e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,27 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.51.11](https://source.mapcomplete.org/MapComplete/MapComplete/compare/v0.51.9...v0.51.11) (2025-06-05) + + +### Features + +* add provider to photosphereview ([b269d21](https://source.mapcomplete.org/MapComplete/MapComplete/commits/b269d210bba5933b6e54b493eb9414d827eb5086)) +* photoSphereViewer exports the currently seen image ([236d4d8](https://source.mapcomplete.org/MapComplete/MapComplete/commits/236d4d87da0ba8941e14dd84451673077f6f3d2a)) + + +### Bug Fixes + +* actually apply namechange in layerfile ([e13a5a0](https://source.mapcomplete.org/MapComplete/MapComplete/commits/e13a5a07027004dc7ae7c3795db1e9e879f37fe6)) +* attempt to get android build working ([0c82fd5](https://source.mapcomplete.org/MapComplete/MapComplete/commits/0c82fd54385d5f23a3708d428d801d0189c21a2f)) +* attempt to get build working ([3736f8c](https://source.mapcomplete.org/MapComplete/MapComplete/commits/3736f8c0b74573d3785df105991787e5db07436a)) +* extract goatcounter to update hash ([a22946e](https://source.mapcomplete.org/MapComplete/MapComplete/commits/a22946e34a9f00e90e2b4a1dbba49b2845de507b)) +* extract goatcounter to update hash ([9725e98](https://source.mapcomplete.org/MapComplete/MapComplete/commits/9725e98e6f17c58aac07524371529e077917ee42)) +* fix tests and wrong category ([f942529](https://source.mapcomplete.org/MapComplete/MapComplete/commits/f942529755c94457ff21d8cef2d4a1757fbeac09)) +* hotfix: projectiontype might be not defined, this crashes validation ([d2c6385](https://source.mapcomplete.org/MapComplete/MapComplete/commits/d2c63853d680d5ea666efabeca3bb5c5062a5d34)) +* improve typing ([a55ae9d](https://source.mapcomplete.org/MapComplete/MapComplete/commits/a55ae9d3e8b36e7c6640b9fa9a3c503075c8addc)) +* update goatcounter links ([5981c95](https://source.mapcomplete.org/MapComplete/MapComplete/commits/5981c958c0d4922b999a6020019ef2c90b1cd2c1)) + ### [0.51.10](https://source.mapcomplete.org/MapComplete/MapComplete/compare/v0.51.9...v0.51.10) (2025-06-05) diff --git a/package-lock.json b/package-lock.json index 38600ac60a..bd753e6efe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mapcomplete", - "version": "0.51.10", + "version": "0.51.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mapcomplete", - "version": "0.51.10", + "version": "0.51.11", "hasInstallScript": true, "license": "GPL-3.0-or-later", "dependencies": { diff --git a/package.json b/package.json index b637a99f02..afa01aadd2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapcomplete", - "version": "0.51.10", + "version": "0.51.11", "repository": "https://source.mapcomplete.org/MapComplete/MapComplete", "description": "A small website to edit OSM easily", "bugs": "hhttps://source.mapcomplete.org/MapComplete/MapComplete/issues",