From c78866c6126e42f4c40dca826f53db03825b87f5 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 3 Aug 2025 13:05:11 +0000 Subject: [PATCH 1/7] 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 | 39 ++------------------------------------- 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/langs/layers/nl.json b/langs/layers/nl.json index 46a9ad167a..b3403f91e3 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -2151,9 +2151,6 @@ }, "title": { "mappings": { - "0": { - "then": "{name}" - }, "1": { "then": "Vogelkijkhut {name}" }, @@ -6910,11 +6907,6 @@ } }, "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, "render": "Natuurgebied" } }, @@ -7449,21 +7441,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": { @@ -9255,9 +9232,6 @@ }, "title": { "mappings": { - "0": { - "then": "{name}" - }, "1": { "then": "Voetpad" }, @@ -11518,16 +11492,7 @@ } }, "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.", @@ -11739,4 +11704,4 @@ "render": "windturbine" } } -} \ No newline at end of file +} From 4cade18ac0bea7033acca0cf955c9152993d65da Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 3 Aug 2025 13:05:30 +0000 Subject: [PATCH 2/7] 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 07a8ffb058..7cb74ff9cc 100644 --- a/langs/themes/nl.json +++ b/langs/themes/nl.json @@ -634,37 +634,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} " } } }, @@ -706,9 +677,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. ", @@ -1107,11 +1076,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", @@ -1185,47 +1149,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", @@ -1344,10 +1267,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", @@ -1461,13 +1380,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 3b68cfbbead7eee3882403696110e0ede15296c5 Mon Sep 17 00:00:00 2001 From: ERyPTION Date: Mon, 4 Aug 2025 09:45:10 +0000 Subject: [PATCH 3/7] Translated using Weblate (Danish) Currently translated at 25.5% (1185 of 4639 strings) Translation: MapComplete/layers Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/layers/da/ --- langs/layers/da.json | 78 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 7 deletions(-) diff --git a/langs/layers/da.json b/langs/layers/da.json index a069da640b..73fa39767f 100644 --- a/langs/layers/da.json +++ b/langs/layers/da.json @@ -320,13 +320,20 @@ "mappings": { "1": { "then": "Dette kunstværk fungerer ikke som en bænk" + }, + "0": { + "then": "Dette kunstværk fungerer også som en bænk" } - } + }, + "question": "Fungerer dette kunstværk som en bænk?" }, "doubles_as_memorial": { "mappings": { "1": { "then": "Dette kunstværk fungerer ikke som et mindesmærke" + }, + "0": { + "then": "Dette kunstværk fungerer også som et mindesmærke" } } }, @@ -336,6 +343,9 @@ "then": "Dette kunstværk fungerer ikke som en helligdom i vejkanten" } } + }, + "artwork-artist-wikidata": { + "question": "Hvem lavede dette kunstværk?" } }, "title": { @@ -703,7 +713,7 @@ "presets": { "0": { "description": "En bemandet butik, der fokuserer på cykeludlejning", - "title": "en cykeludlejningsforretning" + "title": "en cykeludlejningsbutik" }, "1": { "title": "cykeludlejning" @@ -1888,7 +1898,30 @@ } }, "drinking_water": { - "name": "Drikkevand" + "name": "Drikkevand", + "tagRenderings": { + "Still in use?": { + "mappings": { + "0": { + "then": "Denne drikkevand fungerer" + } + } + }, + "fee": { + "mappings": { + "1": { + "then": "Man skal betale for at bruge dette drikkevandssted" + }, + "0": { + "then": "Gratis at bruge" + } + }, + "question": "Er det gratis at benytte dette drikkevandssted?" + }, + "render-closest-drinking-water": { + "render": "Der er endnu en drikkevandsfontæne {_closest_other_drinking_water_distance} meter væk" + } + } }, "dumpstations": { "description": "Sanitære afleveringspladser", @@ -2003,7 +2036,8 @@ } }, "question": "Hvad er dette objekt opkaldt efter?", - "render": "Opkaldt efter {name:etymology}" + "render": "Opkaldt efter {name:etymology}", + "questionHint": "Dette kan være skrevet på et gadenavnskilt" }, "streetsign-upload": { "render": { @@ -2110,7 +2144,14 @@ } } }, - "name": "Restauranter og fastfood" + "name": "Restauranter og fastfood", + "deletion": { + "extraDeleteReasons": { + "0": { + "explanation": "{title()} er lukket permanent" + } + } + } }, "ghostsign": { "presets": { @@ -2877,7 +2918,30 @@ "question": "Sælger denne butik cykler?" }, "shops-name": { - "render": "Denne butik hedder {name}" + "render": "Denne butik hedder {name}", + "question": "Hvad er navnet på denne butik?" + }, + "id_presets.shop_types": { + "override": { + "question": "Hvilken slags butik er dette?", + "+mappings": { + "0": { + "then": "Cykeludlejningsbutik" + } + } + } + } + }, + "deletion": { + "nonDeleteMappings": { + "0": { + "then": "{title()} er lukket permanent" + } + } + }, + "presets": { + "0": { + "title": "en butik" } } }, @@ -4078,4 +4142,4 @@ "render": "vindmølle" } } -} \ No newline at end of file +} From b04967ec0488002605097019c270d11f018dac42 Mon Sep 17 00:00:00 2001 From: Weblate Admin Date: Mon, 4 Aug 2025 18:14:06 +0000 Subject: [PATCH 4/7] Translated using Weblate (Dutch) Currently translated at 89.2% (654 of 733 strings) Translation: MapComplete/core Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/core/nl/ --- langs/nl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/langs/nl.json b/langs/nl.json index bfbc57e125..a1f1ede1a2 100644 --- a/langs/nl.json +++ b/langs/nl.json @@ -666,7 +666,7 @@ "loginToClose": "Login om deze kaartnota te sluiten", "noteLayerDoEnable": "Schakel de laag met kaartnota's in", "noteLayerHasFilters": "Sommige kaartnota's kunnen verborgen zijn door een filter", - "noteLayerNotEnabled": "De laat met kaartnota's staat af. Zet deze aan om een nieuwe kaartnota toe te voegen", + "noteLayerNotEnabled": "De laag met kaartnota's staat af. Zet deze aan om een nieuwe kaartnota toe te voegen", "reopenNote": "Heropen de kaartnota", "reopenNoteAndComment": "Heropen de kaartnota en voeg commentaar toe", "textNeeded": "Geef een beschrijvende tekst om een kaartnota te maken", @@ -856,4 +856,4 @@ "startsWithQ": "Een wikidata-identificator begint met Q gevolgd door een nummer" } } -} \ No newline at end of file +} From 1755e21df3921888ae6404e93d99fa4b6af7ef52 Mon Sep 17 00:00:00 2001 From: Robin van der Linde Date: Thu, 7 Aug 2025 11:12:04 +0000 Subject: [PATCH 5/7] Translated using Weblate (Dutch) Currently translated at 76.5% (3553 of 4639 strings) Translation: MapComplete/layers Translate-URL: https://translate.mapcomplete.org/projects/mapcomplete/layers/nl/ --- langs/layers/nl.json | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/langs/layers/nl.json b/langs/layers/nl.json index b3403f91e3..bef0010bdc 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -25,7 +25,8 @@ }, "street": { "question": "In welke straat bevindt dit adres zich?", - "render": "Dit adres bevindt zich in de straat {addr:street}" + "render": "Dit adres bevindt zich in de straat {addr:street}", + "questionHint": "Vermeld het huisnummer niet" }, "unit": { "mappings": { @@ -1707,7 +1708,7 @@ }, "Capacity": { "question": "Hoeveel fietsen kunnen in deze fietsparking?", - "questionHint": "Dit is het totaal aantal gewone fietsen, bakfietsen, elektrische fietsen, ...", + "questionHint": "Dit is het totaal aantal gewone fietsen, bakfietsen, elektrische fietsen, …", "render": "Plaats voor {capacity} fietsen" }, "Cargo bike capacity?": { @@ -2352,6 +2353,20 @@ "Name": { "question": "Wat is de naam van deze zaak?", "render": "De naam van deze zaak is {name}" + }, + "pub_reusable_packaging": { + "mappings": { + "1": { + "then": "Accepteert geen herbruikbare bekers" + }, + "0": { + "then": "Accepteert herbruikbare bekers" + }, + "2": { + "then": "Accepteert alleen mensen die een herbruikbare beker meenemen" + } + }, + "question": "Accepteert {title()} het meebrengen van eigen herbruikbare bekers?" } }, "title": { @@ -11703,5 +11718,29 @@ }, "render": "windturbine" } + }, + "beehive": { + "name": "Bijenkorven", + "presets": { + "0": { + "title": "een bijenkorf" + } + }, + "tagRenderings": { + "capacity": { + "freeform": { + "placeholder": "Aantal bijenkorven" + }, + "mappings": { + "0": { + "then": "Er is 1 bijenkorf" + } + }, + "render": "Er zijn {capacity} bijenkorven", + "question": "Hoeveel bijenkorven zijn er?" + } + }, + "title": "Bijenkorf", + "description": "Laag met bijenkorven" } } From 8b1873479d7c96904724678ec5459824ec9bd8dd Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 7 Aug 2025 23:16:18 +0200 Subject: [PATCH 6/7] Themes(trolley_bay): add images --- assets/layers/trolley_bay/trolley_bay.json | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/layers/trolley_bay/trolley_bay.json b/assets/layers/trolley_bay/trolley_bay.json index 004f316a5f..f24a9f5c1e 100644 --- a/assets/layers/trolley_bay/trolley_bay.json +++ b/assets/layers/trolley_bay/trolley_bay.json @@ -65,6 +65,7 @@ } ], "tagRenderings": [ + "images", { "id": "covered", "question": { From 8fc31fcd9dcbd6d6ce1f5dfc3739ac4c20460732 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 8 Aug 2025 00:42:11 +0200 Subject: [PATCH 7/7] Fix: fix translation links --- scripts/generateLayerOverview.ts | 21 ++++++----- .../Conversion/AddContextToTranslations.ts | 36 ++++++++++--------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index d8543e4659..d753ea001f 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -37,10 +37,8 @@ import { Translatable } from "../src/Models/ThemeConfig/Json/Translatable" import { ValidateThemeAndLayers } from "../src/Models/ThemeConfig/Conversion/ValidateThemeAndLayers" import { ExtractImages } from "../src/Models/ThemeConfig/Conversion/FixImages" import { TagRenderingConfigJson } from "../src/Models/ThemeConfig/Json/TagRenderingConfigJson" -import { - LayerConfigDependencyGraph, - LevelInfo, -} from "../src/Models/ThemeConfig/LayerConfigDependencyGraph" +import { LayerConfigDependencyGraph, LevelInfo } from "../src/Models/ThemeConfig/LayerConfigDependencyGraph" +import { AddContextToTranslations } from "../src/Models/ThemeConfig/Conversion/AddContextToTranslations" // This scripts scans 'src/assets/layers/*.json' for layer definition files and 'src/assets/themes/*.json' for theme definition files. // It spits out an overview of those to be used to load them @@ -224,9 +222,16 @@ class LayerBuilder extends Conversion> { context.err("Invalid ID: expected", id, "but got", id) } const prepped = this.prepareLayer.convert(config, context) + const withContext = new AddContextToTranslations("layers:").convertStrict( + prepped, + ConversionContext.construct( + [prepped.id], + ["AddContextToTranslations"] + ) + ) this._loadedIds.add(id) - this._desugaringState.sharedLayers.set(id, prepped) - return prepped + this._desugaringState.sharedLayers.set(id, withContext) + return withContext } private buildLooping(ids: string[], context: ConversionContext) { @@ -690,8 +695,8 @@ class LayerOverviewUtils extends Script { ) const path = "assets/layers/questions/questions.json" - const sharedQuestions = this.parseLayer(doesImageExist, prepareLayer, path).raw - + const sharedQuestionsRaw = this.parseLayer(doesImageExist, prepareLayer, path).raw + const sharedQuestions = new AddContextToTranslations("").convertStrict(sharedQuestionsRaw, ConversionContext.construct(["layers:questions"], [])) const dict = new Map() for (const tr of sharedQuestions.tagRenderings) { diff --git a/src/Models/ThemeConfig/Conversion/AddContextToTranslations.ts b/src/Models/ThemeConfig/Conversion/AddContextToTranslations.ts index 8c5b1de517..4db97ef002 100644 --- a/src/Models/ThemeConfig/Conversion/AddContextToTranslations.ts +++ b/src/Models/ThemeConfig/Conversion/AddContextToTranslations.ts @@ -128,24 +128,28 @@ export class AddContextToTranslations extends DesugaringStep { if (leaf === undefined || leaf === null) { return leaf } - if (typeof leaf === "object") { - // follow the path. If we encounter a number, check that there is no ID we can use instead - let breadcrumb = json - for (let i = 0; i < path.length; i++) { - const pointer = path[i] - breadcrumb = breadcrumb[pointer] - if (pointer.match("[0-9]+") && breadcrumb["id"] !== undefined) { - path[i] = breadcrumb["id"] - } - } - - return { - ...leaf, - _context: this._prefix + context.path.concat(path).join("."), - } - } else { + if (typeof leaf !== "object") { return leaf } + if(leaf["_context"] !== undefined){ + // Context is already set + return leaf + } + // follow the path. If we encounter a number, check that there is no ID we can use instead + let breadcrumb = json + for (let i = 0; i < path.length; i++) { + const pointer = path[i] + breadcrumb = breadcrumb[pointer] + if (pointer.match("[0-9]+") && breadcrumb["id"] !== undefined) { + path[i] = breadcrumb["id"] + } + } + const pth = this._prefix + Utils.NoEmpty(context.path.concat(path).map(x => "" + x)).join(".") + console.log("Setting _context to: ",pth) + return { + ...leaf, + _context: pth, + } }, (obj) => obj === undefined || obj === null || Translations.isProbablyATranslation(obj) )