From c91d691a365a2be0f7e1bc9ef574619243404a7c Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 9 Jul 2024 13:39:36 +0200 Subject: [PATCH 01/28] Better error handling, see #2009 --- src/Logic/Osm/Changes.ts | 153 ++++++++++++++++++------------ src/Logic/Osm/ChangesetHandler.ts | 4 +- 2 files changed, 95 insertions(+), 62 deletions(-) diff --git a/src/Logic/Osm/Changes.ts b/src/Logic/Osm/Changes.ts index 2d66b1369..b703cde2b 100644 --- a/src/Logic/Osm/Changes.ts +++ b/src/Logic/Osm/Changes.ts @@ -55,7 +55,7 @@ export class Changes { featureSwitches?: FeatureSwitchState }, leftRightSensitive: boolean = false, - reportError?: (string: string | Error) => void + reportError?: (string: string | Error) => void, ) { this._leftRightSensitive = leftRightSensitive // We keep track of all changes just as well @@ -70,7 +70,7 @@ export class Changes { state.osmConnection, state.featurePropertiesStore, this, - (e) => this._reportError(e) + (e) => this._reportError(e), ) this.historicalUserLocations = state.historicalUserLocations @@ -84,7 +84,7 @@ export class Changes { modifiedObjects: OsmObject[] newObjects: OsmObject[] deletedObjects: OsmObject[] - } + }, ): string { const changedElements = allChanges.modifiedObjects ?? [] const newElements = allChanges.newObjects ?? [] @@ -173,7 +173,7 @@ export class Changes { docs: "The identifier of the used background layer, this will probably be an identifier from the [editor layer index](https://github.com/osmlab/editor-layer-index)", }, ], - "default" + "default", ), ...addSource(ChangeTagAction.metatags, "ChangeTag"), ...addSource(ChangeLocationAction.metatags, "ChangeLocation"), @@ -201,7 +201,7 @@ export class Changes { : "", ]), source, - ]) + ]), ), ]) } @@ -250,7 +250,7 @@ export class Changes { const changeDescriptions = await action.Perform(this) changeDescriptions[0].meta.distanceToObject = this.calculateDistanceToChanges( action, - changeDescriptions + changeDescriptions, ) this.applyChanges(changeDescriptions) } @@ -264,7 +264,7 @@ export class Changes { public CreateChangesetObjects( changes: ChangeDescription[], - downloadedOsmObjects: OsmObject[] + downloadedOsmObjects: OsmObject[], ): { newObjects: OsmObject[] modifiedObjects: OsmObject[] @@ -316,6 +316,8 @@ export class Changes { r.members = change.changes["members"] osmObj = r break + default: + throw "Got an invalid change.type: " + change.type } if (osmObj === undefined) { throw "Hmm? This is a bug" @@ -424,14 +426,14 @@ export class Changes { result.modifiedObjects.length, "modified;", result.deletedObjects, - "deleted" + "deleted", ) return result } private calculateDistanceToChanges( change: OsmChangeAction, - changeDescriptions: ChangeDescription[] + changeDescriptions: ChangeDescription[], ) { const locations = this.historicalUserLocations?.features?.data if (locations === undefined) { @@ -451,7 +453,7 @@ export class Changes { .filter((feat) => feat.geometry.type === "Point") .filter((feat) => { const visitTime = new Date( - ((feat.properties)).date + ((feat.properties)).date, ) // In seconds const diff = (now.getTime() - visitTime.getTime()) / 1000 @@ -498,42 +500,59 @@ export class Changes { ...recentLocationPoints.map((gpsPoint) => { const otherCoor = GeoOperations.centerpointCoordinates(gpsPoint) return GeoOperations.distanceBetween(coor, otherCoor) - }) - ) - ) + }), + ), + ), ) } /** - * Upload the selected changes to OSM. - * Returns 'true' if successful and if they can be removed + * Gets a single, fresh version of the requested osmObject with some error handling + */ + private async getOsmObject(id: string, downloader: OsmObjectDownloader) { + try { + try { + + // Important: we do **not** cache this request, we _always_ need a fresh version! + const osmObj = await downloader.DownloadObjectAsync(id, 0) + return { id, osmObj } + } catch (e) { + const msg = "Could not download OSM-object" + + id + + " trying again before dropping it from the changes (" + + e + + ")" + this._reportError(msg) + const osmObj = await downloader.DownloadObjectAsync(id, 0) + return { id, osmObj } + } + } catch (e) { + const msg = "Could not download OSM-object" + + id + + " dropping it from the changes (" + + e + + ")" + this._reportError(msg) + this.errors.data.push(e) + this.errors.ping() + return undefined + } + } + + /** + * Upload the selected changes to OSM. This is typically called with changes for a single theme + * @return pending changes which could not be uploaded for some reason; undefined or empty array if successful */ private async flushSelectChanges( pending: ChangeDescription[], - openChangeset: UIEventSource - ): Promise { + openChangeset: UIEventSource, + ): Promise { const self = this const neededIds = Changes.GetNeededIds(pending) // We _do not_ pass in the Changes object itself - we want the data from OSM directly in order to apply the changes const downloader = new OsmObjectDownloader(this.backend, undefined) let osmObjects = await Promise.all<{ id: string; osmObj: OsmObject | "deleted" }>( - neededIds.map(async (id) => { - try { - // Important: we do **not** cache this request, we _always_ need a fresh version! - const osmObj = await downloader.DownloadObjectAsync(id, 0) - return { id, osmObj } - } catch (e) { - const msg = "Could not download OSM-object" + - id + - " dropping it from the changes (" + - e + - ")" - this._reportError(msg) - this.errors.data.push(e) - this.errors.ping() - return undefined - } - }) + neededIds.map(id => this.getOsmObject(id, downloader)), ) osmObjects = Utils.NoNull(osmObjects) @@ -554,7 +573,7 @@ export class Changes { if (pending.length == 0) { console.log("No pending changes...") - return true + return undefined } const perType = Array.from( @@ -562,15 +581,15 @@ export class Changes { pending .filter( (descr) => - descr.meta.changeType !== undefined && descr.meta.changeType !== null + descr.meta.changeType !== undefined && descr.meta.changeType !== null, ) - .map((descr) => descr.meta.changeType) + .map((descr) => descr.meta.changeType), ), ([key, count]) => ({ key: key, value: count, aggregate: true, - }) + }), ) const motivations = pending .filter((descr) => descr.meta.specialMotivation !== undefined) @@ -609,7 +628,7 @@ export class Changes { value: count, aggregate: true, } - }) + }), ) // This method is only called with changedescriptions for this theme @@ -633,26 +652,42 @@ export class Changes { ...perBinMessage, ] + const refused: ChangeDescription[] = [] + let toUpload: ChangeDescription[] = [] + + pending.forEach(c => { + if (c.id < 0) { + toUpload.push(c) + return + } + const matchFound = !!objects.find(o => o.id === c.id && o.type === c.type) + if (matchFound) { + toUpload.push(c) + } else { + refused.push(c) + } + }) + await this._changesetHandler.UploadChangeset( (csId, remappings) => { if (remappings.size > 0) { - pending = pending.map((ch) => ChangeDescriptionTools.rewriteIds(ch, remappings)) + toUpload = toUpload.map((ch) => ChangeDescriptionTools.rewriteIds(ch, remappings)) } const changes: { newObjects: OsmObject[] modifiedObjects: OsmObject[] deletedObjects: OsmObject[] - } = self.CreateChangesetObjects(pending, objects) + } = self.CreateChangesetObjects(toUpload, objects) return Changes.createChangesetFor("" + csId, changes) }, metatags, - openChangeset + openChangeset, ) - console.log("Upload successful!") - return true + console.log("Upload successful! Refused changes are",refused) + return refused } private async flushChangesAsync(): Promise { @@ -670,44 +705,42 @@ export class Changes { pendingPerTheme.get(theme).push(changeDescription) } - const successes = await Promise.all( + const refusedChanges: ChangeDescription[][] = await Promise.all( Array.from(pendingPerTheme, async ([theme, pendingChanges]) => { try { const openChangeset = UIEventSource.asInt( this.state.osmConnection.GetPreference( - "current-open-changeset-" + theme - ) + "current-open-changeset-" + theme, + ), ) console.log( "Using current-open-changeset-" + - theme + - " from the preferences, got " + - openChangeset.data + theme + + " from the preferences, got " + + openChangeset.data, ) - const result = await self.flushSelectChanges(pendingChanges, openChangeset) - if (result) { + const refused = await self.flushSelectChanges(pendingChanges, openChangeset) + if (!refused) { this.errors.setData([]) } - return result + return refused } catch (e) { this._reportError(e) console.error("Could not upload some changes:", e) this.errors.data.push(e) this.errors.ping() - return false + return pendingChanges } - }) + }), ) - if (!successes.some((s) => s == false)) { - // All changes successfull, we clear the data! - this.pendingChanges.setData([]) - } + // We keep all the refused changes to try them again + this.pendingChanges.setData(refusedChanges.flatMap(c => c)) } catch (e) { console.error( "Could not handle changes - probably an old, pending changeset in localstorage with an invalid format; erasing those", - e + e, ) this.errors.data.push(e) this.errors.ping() diff --git a/src/Logic/Osm/ChangesetHandler.ts b/src/Logic/Osm/ChangesetHandler.ts index f31f546ca..f11f9c0a5 100644 --- a/src/Logic/Osm/ChangesetHandler.ts +++ b/src/Logic/Osm/ChangesetHandler.ts @@ -154,7 +154,7 @@ export class ChangesetHandler { if (this._reportError) { this._reportError(e) } - console.warn("Could not open/upload changeset due to ", e, "trying t") + console.warn("Could not open/upload changeset due to ", e, "trying again with a another fresh changeset ") openChangeset.setData(undefined) throw e @@ -187,7 +187,7 @@ export class ChangesetHandler { await this.UpdateTags(csId, rewrittenTags) } catch (e) { if (this._reportError) { - this._reportError(e) + this._reportError("Could not reuse changeset, might be closed: " + e.stacktrace ?? "" + e) } console.warn("Could not upload, changeset is probably closed: ", e) openChangeset.setData(undefined) From f1dcee2d39a6e5c9bfad32074b79d5cd08432ab6 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 9 Jul 2024 13:41:43 +0200 Subject: [PATCH 02/28] Documentation update --- src/Logic/Osm/Actions/ChangeLocationAction.ts | 2 +- src/Logic/Osm/Actions/DeleteAction.ts | 13 +++++++++++++ src/Logic/Osm/Changes.ts | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Logic/Osm/Actions/ChangeLocationAction.ts b/src/Logic/Osm/Actions/ChangeLocationAction.ts index be84fed48..9c774b839 100644 --- a/src/Logic/Osm/Actions/ChangeLocationAction.ts +++ b/src/Logic/Osm/Actions/ChangeLocationAction.ts @@ -14,7 +14,7 @@ export default class ChangeLocationAction extends OsmChangeAction { }[] = [ { value: "relocated|improve_accuraccy|...", - docs: "Will appear if the ", + docs: "Will appear if the point has been moved", changeType: ["move"], specialMotivation: true, }, diff --git a/src/Logic/Osm/Actions/DeleteAction.ts b/src/Logic/Osm/Actions/DeleteAction.ts index 084a66624..fde6e867d 100644 --- a/src/Logic/Osm/Actions/DeleteAction.ts +++ b/src/Logic/Osm/Actions/DeleteAction.ts @@ -20,6 +20,19 @@ export default class DeleteAction extends OsmChangeAction { private readonly _id: OsmId private readonly _hardDelete: boolean + static metatags: { + readonly key?: string + readonly value?: string + readonly docs: string + readonly changeType: string[] + readonly specialMotivation?: boolean + }[] = [ + { + docs: "Will appear if the object was deleted", + changeType: ["deletion"], + specialMotivation: true, + }, + ] constructor( id: OsmId, softDeletionTags: TagsFilter | undefined, diff --git a/src/Logic/Osm/Changes.ts b/src/Logic/Osm/Changes.ts index b703cde2b..69b818a03 100644 --- a/src/Logic/Osm/Changes.ts +++ b/src/Logic/Osm/Changes.ts @@ -20,6 +20,7 @@ import Table from "../../UI/Base/Table" import ChangeLocationAction from "./Actions/ChangeLocationAction" import ChangeTagAction from "./Actions/ChangeTagAction" import FeatureSwitchState from "../State/FeatureSwitchState" +import DeleteAction from "./Actions/DeleteAction" /** * Handles all changes made to OSM. @@ -177,6 +178,7 @@ export class Changes { ), ...addSource(ChangeTagAction.metatags, "ChangeTag"), ...addSource(ChangeLocationAction.metatags, "ChangeLocation"), + ...addSource(DeleteAction.metatags, "DeleteAction") // TODO /* ...DeleteAction.metatags, From f5580b61229f45ae9fa5cdd294433f2968385e93 Mon Sep 17 00:00:00 2001 From: hugoalh Date: Sun, 30 Jun 2024 08:25:49 +0000 Subject: [PATCH 03/28] Translated using Weblate (Chinese (Traditional)) Currently translated at 7.0% (250 of 3528 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/zh_Hant/ --- langs/layers/zh_Hant.json | 105 ++++++++++++++++++++++++++++++++++---- 1 file changed, 96 insertions(+), 9 deletions(-) diff --git a/langs/layers/zh_Hant.json b/langs/layers/zh_Hant.json index 4fe00ba3f..fbd88d294 100644 --- a/langs/layers/zh_Hant.json +++ b/langs/layers/zh_Hant.json @@ -16,8 +16,12 @@ "render": "門牌號碼是 {addr:housenumber}" }, "street": { - "question": "地址所在的道路是?" + "question": "地址所在的道路是?", + "render": "此地址位於街道 {addr:street}" } + }, + "title": { + "render": "已知的地址" } }, "advertising": { @@ -52,6 +56,12 @@ "1": { "then": "壁畫" }, + "10": { + "then": "Azulejo (西班牙雕塑作品名稱)" + }, + "11": { + "then": "瓷磚" + }, "2": { "then": "繪畫" }, @@ -75,12 +85,6 @@ }, "9": { "then": "寬慰" - }, - "10": { - "then": "Azulejo (西班牙雕塑作品名稱)" - }, - "11": { - "then": "瓷磚" } }, "question": "這是什麼類型的藝術品?", @@ -104,6 +108,9 @@ "render": "藝術品" } }, + "atm": { + "description": "自動櫃員機以提款" + }, "barrier": { "tagRenderings": { "bicycle=yes/no": { @@ -132,7 +139,7 @@ "then": "靠背:有" }, "2": { - "then": "靠背:無" + "then": "此長椅沒有靠背" } }, "question": "這個長椅是否有靠背?" @@ -576,6 +583,9 @@ } } }, + "maxspeed": { + "description": "顯示每條道路的允許速度" + }, "postboxes": { "description": "這圖層顯示郵筒。", "name": "郵筒", @@ -808,10 +818,84 @@ } } }, + "visitor_information_centre": { + "title": { + "mappings": { + "1": { + "then": "{name}" + } + }, + "render": "{name}" + } + }, "walls_and_buildings": { "description": "特殊的內建圖層顯示所有牆壁與建築。這個圖層對於規畫要靠牆的東西 (例如 AED、郵筒、入口、地址、監視器等) 相當實用。這個圖層預設顯示而且無法由使用者開關。" }, + "waste_basket": { + "filter": { + "0": { + "options": { + "0": { + "question": "所有類型" + } + } + } + } + }, + "waste_disposal": { + "presets": { + "0": { + "title": "廢棄物處理桶" + } + }, + "tagRenderings": { + "access": { + "mappings": { + "0": { + "then": "這個桶可以給任何人使用" + }, + "1": { + "then": "這個桶是私人的" + }, + "2": { + "then": "這個桶僅供居民使用" + } + }, + "question": "誰可以使用這個廢棄物處理桶?", + "render": "存取:{access}" + }, + "disposal-location": { + "mappings": { + "0": { + "then": "這是一個地下容器" + }, + "1": { + "then": "這個容器位於室內" + }, + "2": { + "then": "這個容器位於室外" + } + }, + "question": "這個容器位於哪裡?" + }, + "type": { + "mappings": { + "0": { + "then": "這是一個中型至大型的桶,用於處理(家庭)廢棄物" + }, + "1": { + "then": "這實際上是一個回收容器" + } + }, + "question": "這是甚麼種類的廢棄物處理箱?" + } + }, + "title": { + "render": "廢棄物處理" + } + }, "windturbine": { + "description": "現代風車產生電力", "name": "風機", "presets": { "0": { @@ -838,6 +922,9 @@ "turbine-start-date": { "question": "這個風機何時開始營運?", "render": "這個風機從 {start_date} 開始運轉。" + }, + "windturbine-fixme": { + "render": "為 OpenStreetMap 專家提供的額外資訊:{fixme}" } }, "title": { @@ -849,4 +936,4 @@ "render": "風機" } } -} \ No newline at end of file +} From 27b41be863b22ecd00c73106ff860f629c2c7133 Mon Sep 17 00:00:00 2001 From: mcliquid Date: Thu, 27 Jun 2024 19:36:50 +0000 Subject: [PATCH 04/28] Translated using Weblate (German) Currently translated at 100.0% (663 of 663 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/ --- langs/de.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/langs/de.json b/langs/de.json index 8042a9481..6ce9e0aa3 100644 --- a/langs/de.json +++ b/langs/de.json @@ -322,6 +322,7 @@ "openStreetMapIntro": "

Eine offene Karte

Eine Karte, die jeder frei nutzen und bearbeiten kann. Ein einziger Ort, um alle Geoinformationen zu speichern. Unterschiedliche, kleine, inkompatible und veraltete Karten werden nirgendwo gebraucht.

OpenStreetMap ist nicht die feindliche Karte. Die Kartendaten können frei verwendet werden (mit Benennung und Veröffentlichung von Änderungen an diesen Daten). Jeder kann neue Daten hinzufügen und Fehler korrigieren. Diese Webseite nutzt OpenStreetMap. Alle Daten stammen von dort, und Ihre Antworten und Korrekturen werden überall verwendet.

Viele Menschen und Anwendungen nutzen bereits OpenStreetMap: Organic Maps, OsmAnd; auch die Kartendaten von Facebook, Instagram, Apple-maps und Bing-maps stammen (teilweise) von OpenStreetMap.

", "openTheMap": "Karte öffnen", "openTheMapAtGeolocation": "Zum eigenen Standort zoomen", + "openTheMapReason": "zum anzeigen, bearbeiten und hinzufügen von informationen", "opening_hours": { "all_days_from": "Geöffnet täglich {ranges}", "closed_permanently": "Geschlossen auf unbestimmte Zeit", @@ -401,9 +402,15 @@ "copiedToClipboard": "Verknüpfung in Zwischenablage kopiert", "documentation": "Für weitere Informationen über verfügbare URL-Parameter, siehe Dokumentation", "embedIntro": "

Karte in Webseiten einbetten

Betten Sie diese Karte in Ihre Webseite ein.
Wir ermutigen Sie gern dazu - Sie müssen nicht mal um Erlaubnis fragen.
Die Karte ist kostenlos und wird es immer sein. Je mehr Leute die Karte benutzen, desto wertvoller wird sie.", - "fsUserbadge": "Anmeldefeld aktivieren", + "fsBackground": "Umschalten von Hintergründen aktivieren", + "fsFilter": "Aktiviere die Möglichkeit, Ebenen und Filter umzuschalten", + "fsGeolocation": "Geolokation aktivieren", + "fsUserbadge": "Aktiviere den Login-Button und damit die Möglichkeit, Änderungen vorzunehmen", "fsWelcomeMessage": "Begrüßung und Registerkarten anzeigen", "intro": "

Karte teilen

Mit dem folgenden Link können Sie diese Karte mit Freunden und Familie teilen:", + "openLayers": "Öffne das Ebenen- und Filter-Menü", + "options": "Optionen teilen", + "stateIsIncluded": "Der aktuelle Zustand der Ebenen und Filter ist im gemeinsamen Link und iFrame enthalten.", "thanksForSharing": "Danke für das Teilen!", "title": "Diese Karte teilen" }, From 1ada045beb7f2238342d925d0d0091adb1bbdac2 Mon Sep 17 00:00:00 2001 From: Franco Date: Thu, 27 Jun 2024 16:22:59 +0000 Subject: [PATCH 05/28] Translated using Weblate (Spanish) Currently translated at 62.1% (412 of 663 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/es/ --- langs/es.json | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/langs/es.json b/langs/es.json index 3b1e5d80c..c43ec9301 100644 --- a/langs/es.json +++ b/langs/es.json @@ -20,6 +20,7 @@ "cancel": "Cancelar", "cannotBeDeleted": "Esta función no puede ser eliminada", "delete": "Eliminar", + "deletedTitle": "Característica eliminada", "explanations": { "hardDelete": "Este elemento será eliminado en OpenStreetMap. Puede ser recuperado por un colaborador experimentado", "retagNoOtherThemes": "Esta característica será reclasificada y ocultada en esta aplicación", @@ -27,6 +28,7 @@ "selectReason": "Por favor, seleccione el motivo por el que esta característica debe ser eliminada", "softDelete": "Esta característica se actualizará y se ocultará de esta aplicación. {reason}" }, + "isChanged": "Esta característica ha sido cambiada y ya no coincide con esta capa", "isDeleted": "Esta función se ha eliminado", "isntAPoint": "Solo los nodos pueden ser eliminados, esta característica es una vía, área o relación.", "loading": "Inspeccionando las propiedades para comprobar si esta característica puede ser eliminada.", @@ -45,6 +47,18 @@ "useSomethingElse": "Utilice otro editor de OpenStreetMap para eliminarlo", "whyDelete": "¿Por qué debería eliminarse este elemento?" }, + "external": { + "allAreApplied": "Todos los valores externos desaparecidos han sido copiados en OpenStreetMap", + "allIncluded": "El dato cargado desde {source} está contenida en OpenStreetMap", + "apply": "Aplicar", + "applyAll": "Aplicar todos los valores perdidos", + "conflicting": { + "intro": "OpenStreetMap tiene un valor diferente al sitio web de origen para los siguientes valores.", + "title": "Elementos conflictivos" + }, + "currentInOsmIs": "Por el momento, OpenStreetMap tiene el siguiente valor registrado:", + "done": "Listo" + }, "favourite": { "loginNeeded": "

Entrar

El diseño personalizado sólo está disponible para los usuarios de OpenStreetMap", "panelIntro": "

Tu tema personal

Activa tus capas favoritas de todas los temas oficiales", @@ -136,7 +150,7 @@ "intro": "Has marcado un lugar del que no conocemos los datos.
", "layerNotEnabled": "La capa {layer} no está habilitada. Activa esta capa para poder añadir un elemento", "openLayerControl": "Abrir el control de capas", - "pleaseLogin": "Por favor inicia sesión para añadir un nuevo elemento", + "pleaseLogin": "Por favor inicia sesión con OpenStreetMap para añadir un nuevo elemento", "presetInfo": "El nuevo POI tendrá {tags}", "stillLoading": "Los datos se siguen cargando. Espera un poco antes de añadir una nueva función.", "title": "Añadir un elemento nuevo", @@ -242,7 +256,7 @@ "openTheMap": "Abrir el mapa", "opening_hours": { "closed_permanently": "Cerrado - sin día de apertura conocido", - "closed_until": "Cerrado hasta {date}", + "closed_until": "Abierto el {date}", "error_loading": "Error: no se han podido visualizar esos horarios de apertura.", "loadingCountry": "Determinando país…", "not_all_rules_parsed": "El horario de esta tienda es complejo. Las normas siguientes serán ignoradas en la entrada:", @@ -275,7 +289,7 @@ "removeLocationHistory": "Eliminar el historial de ubicaciones", "returnToTheMap": "Volver al mapa", "save": "Guardar", - "screenToSmall": "Abrir {theme} en una ventana nueva", + "screenToSmall": "Abrir {theme} en una ventana nueva", "search": { "error": "Alguna cosa no ha ido bien…", "nothing": "Nada encontrado…", @@ -285,7 +299,7 @@ "sharescreen": { "copiedToClipboard": "Enlace copiado en el portapapeles", "embedIntro": "

Inclúyelo en tu página web

Incluye este mapa en tu página web.
Te animamos a que lo hagas, no hace falta que pidas permiso.
Es gratis, y siempre lo será. A más gente que lo use más valioso será.", - "fsUserbadge": "Activar el botón de entrada", + "fsUserbadge": "Activa el botón de inicio de sesión y por lo tanto la posibilidad de hacer cambios", "fsWelcomeMessage": "Muestra el mensaje emergente de bienvenida y pestañas asociadas", "intro": "

Comparte este mapa

Comparte este mapa copiando el enlace de debajo y enviándolo a amigos y familia:", "thanksForSharing": "Gracias por compartir!", @@ -318,7 +332,7 @@ }, "welcomeBack": "¡Bienvenido de nuevo!", "welcomeExplanation": { - "addNew": "Toque el mapa para añadir un nuevo POI.", + "addNew": "¿Un artículo falta? Utilice el botón en la parte inferior izquierda para añadir un nuevo punto de interés.", "general": "En este mapa, puedes ver, editar y agregar puntos de interés. Haz zoom para ver los POI, toca uno para ver o editar la información. Todos los datos proceden y se guardan en OpenStreetMap, que puede reutilizarse libremente." }, "wikipedia": { @@ -370,13 +384,13 @@ "index": { "#": "Estos textos son mostrados sobre los botones del tema cuando no hay un tema cargado", "featuredThemeTitle": "Esta semana destacamos", - "intro": "MapComplete a un visor y editor de OpenStreetMap, que te muestra información sobre un tema específico.", + "intro": "Mapas sobre diversos temas a los que contribuye", "logIn": "Inicia sesión para ver otros temas que visitaste anteriormente", "pickTheme": "Elige un tema de abajo para empezar.", - "title": "Le damos la bienvenida a MapComplete" + "title": "MapComplete" }, "move": { - "cancel": "Cancelar movimiento", + "cancel": "Elige una razón diferente", "cannotBeMoved": "Esta característica no se puede mover.", "confirmMove": "Mover aquí", "inviteToMove": { @@ -393,7 +407,7 @@ "partOfRelation": "Esta característica es parte de una relación. Utiliza otro editor para moverla.", "pointIsMoved": "Este punto ha sido eliminado", "reasons": { - "reasonInaccurate": "La localización de este objeto no es precisa y debe de ser movida algunos metros", + "reasonInaccurate": "La ubicación es inexacta por unos pocos metros", "reasonRelocation": "El objeto a sido relocalizado a una localización completamente diferente" }, "selectReason": "¿Por qué has movido este objeto?", @@ -441,7 +455,7 @@ "geodataTitle": "Tu geoubicación", "intro": "La privacidad es importante - tanto para el individual como para la sociedad. MapComplete intenta respetar tu privacidad tanto como sea posible - hasta el punto de que no se necesita ningún banner de cookies molesto es necesario. De todas formas, nos gustaría informarte de qué información se recolecta y se comparte, bajo que circunstancias y por qué se hacen estos compromisos.", "items": { - "changesYouMake": " Los cambios que has hecho", + "changesYouMake": "Los cambios que has hecho", "date": "Cuándo se efectuó el cambio", "distanceIndicator": "Una indicación de como de cerca estabas a los objetos cambiados. Otros mapeadores pueden utilizar esta información para determina si un cambio se hizo basándose en un sondeo o en una investigación remota", "language": "El idioma de la interfaz de usuario", @@ -459,7 +473,7 @@ "reviews": { "affiliated_reviewer_warning": "(Revisión afiliada)", "name_required": "Se requiere un nombre para mostrar y crear comentarios", - "no_reviews_yet": "Aún no hay reseñas. ¡Sé el primero en escribir una y ayuda a los datos abiertos y a los negocios!", + "no_reviews_yet": "Todavía no hay comentarios. ¡Sé el primero!", "saved": "Reseña guardada. ¡Gracias por compartir!", "saving_review": "Guardando…", "title": "{count} comentarios", From c6503de12e6b67e97c35e15c3f7c05a86fb6a464 Mon Sep 17 00:00:00 2001 From: Patchanka64 Date: Thu, 4 Jul 2024 17:46:59 +0000 Subject: [PATCH 06/28] Translated using Weblate (French) Currently translated at 61.4% (2168 of 3528 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/fr/ --- langs/layers/fr.json | 474 ++++++++++++++++++++++++++++--------------- 1 file changed, 306 insertions(+), 168 deletions(-) diff --git a/langs/layers/fr.json b/langs/layers/fr.json index 500c65d54..707444a8e 100644 --- a/langs/layers/fr.json +++ b/langs/layers/fr.json @@ -35,6 +35,23 @@ "1": { "title": "un panneau à affiches scellé au sol" }, + "10": { + "description": "Une pièce de textile imperméable avec un message imprimé, ancrée de façon permanente sur un mur.", + "title": "une bâche" + }, + "11": { + "title": "un totem" + }, + "12": { + "description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées", + "title": "une enseigne" + }, + "13": { + "title": "une sculpture" + }, + "14": { + "title": "une peinture murale" + }, "2": { "title": "un panneau à affiches monté sur un mur" }, @@ -60,23 +77,6 @@ }, "9": { "title": "un écran fixé sur un abri de transport" - }, - "10": { - "description": "Une pièce de textile imperméable avec un message imprimé, ancrée de façon permanente sur un mur.", - "title": "une bâche" - }, - "11": { - "title": "un totem" - }, - "12": { - "description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées", - "title": "une enseigne" - }, - "13": { - "title": "une sculpture" - }, - "14": { - "title": "une peinture murale" } }, "tagRenderings": { @@ -168,6 +168,9 @@ "1": { "then": "C'est un petit panneau" }, + "10": { + "then": "C'est une peinture murale" + }, "2": { "then": "C'est une colonne" }, @@ -191,9 +194,6 @@ }, "9": { "then": "C'est un totem" - }, - "10": { - "then": "C'est une peinture murale" } }, "question": "De quel type de dispositif publicitaire s'agit-il ?", @@ -205,6 +205,9 @@ "1": { "then": "Petit panneau" }, + "10": { + "then": "Peinture murale" + }, "3": { "then": "Colonne" }, @@ -225,9 +228,6 @@ }, "9": { "then": "Totem" - }, - "10": { - "then": "Peinture murale" } } } @@ -300,6 +300,36 @@ "render": "Station d’ambulances" } }, + "animal_shelter": { + "name": "Abri pour animaux", + "presets": { + "0": { + "title": "refuge animalier" + } + }, + "tagRenderings": { + "2": { + "question": "Quel est le nom de ce refuge animalier ?", + "render": "Ce refuge s'appelle {name}" + }, + "6": { + "mappings": { + "0": { + "then": "Les animaux sont gardés jusqu'à ce qu'ils soient adoptés par un nouveau maître" + }, + "1": { + "then": "Les animaux sont recueillis pour le reste de leur vie" + }, + "2": { + "then": "Les animaux blessés sont soignés jusqu'à ce qu'ils soient en état d'être relâchés dans la nature " + } + } + } + }, + "title": { + "render": "Un refuge animalier" + } + }, "artwork": { "description": "Une carte ouverte de statues, bustes, graffitis et autres œuvres d'art de par le monde", "name": "Œuvres d'art", @@ -328,6 +358,15 @@ "1": { "then": "Peinture murale" }, + "10": { + "then": "Azulejo (faïence latine)" + }, + "11": { + "then": "Carrelage" + }, + "12": { + "then": "Sculpture sur bois" + }, "2": { "then": "Peinture" }, @@ -351,15 +390,6 @@ }, "9": { "then": "Relief" - }, - "10": { - "then": "Azulejo (faïence latine)" - }, - "11": { - "then": "Carrelage" - }, - "12": { - "then": "Sculpture sur bois" } }, "question": "Quel est le type de cette œuvre d'art ?", @@ -1757,6 +1787,31 @@ } } } + }, + "tagRenderings": { + "Authentication": { + "mappings": { + "0": { + "then": "Authentification par carte de membre" + }, + "1": { + "then": "Authentification par une application" + }, + "2": { + "then": "Authentification possible par appel téléphonique" + }, + "3": { + "then": "Authentification possible par SMS" + } + } + }, + "Operational status": { + "mappings": { + "0": { + "then": "Cette station de recharge fonctionne" + } + } + } } }, "climbing": { @@ -2451,6 +2506,15 @@ "1": { "then": "Cette piste cyclable est goudronée" }, + "10": { + "then": "Cette piste cyclable est faite en graviers fins" + }, + "11": { + "then": "Cette piste cyclable est en cailloux" + }, + "12": { + "then": "Cette piste cyclable est faite en sol brut" + }, "2": { "then": "Cette piste cyclable est asphaltée" }, @@ -2474,15 +2538,6 @@ }, "9": { "then": "Cette piste cyclable est faite en graviers" - }, - "10": { - "then": "Cette piste cyclable est faite en graviers fins" - }, - "11": { - "then": "Cette piste cyclable est en cailloux" - }, - "12": { - "then": "Cette piste cyclable est faite en sol brut" } }, "question": "De quoi est faite la surface de la piste cyclable ?", @@ -2531,6 +2586,15 @@ "1": { "then": "Cette piste cyclable est pavée" }, + "10": { + "then": "Cette piste cyclable est faite en graviers fins" + }, + "11": { + "then": "Cette piste cyclable est en cailloux" + }, + "12": { + "then": "Cette piste cyclable est faite en sol brut" + }, "2": { "then": "Cette piste cyclable est asphaltée" }, @@ -2554,15 +2618,6 @@ }, "9": { "then": "Cette piste cyclable est faite en graviers" - }, - "10": { - "then": "Cette piste cyclable est faite en graviers fins" - }, - "11": { - "then": "Cette piste cyclable est en cailloux" - }, - "12": { - "then": "Cette piste cyclable est faite en sol brut" } }, "question": "De quel materiel est faite cette rue ?", @@ -3412,6 +3467,21 @@ "1": { "then": "C'est une friterie" }, + "10": { + "then": "Des plats chinois sont servis ici" + }, + "11": { + "then": "Des plats grecs sont servis ici" + }, + "12": { + "then": "Des plats indiens sont servis ici" + }, + "13": { + "then": "Des plats turcs sont servis ici" + }, + "14": { + "then": "Des plats thaïlandais sont servis ici" + }, "2": { "then": "Restaurant Italien" }, @@ -3435,21 +3505,6 @@ }, "9": { "then": "Des plats français sont servis ici" - }, - "10": { - "then": "Des plats chinois sont servis ici" - }, - "11": { - "then": "Des plats grecs sont servis ici" - }, - "12": { - "then": "Des plats indiens sont servis ici" - }, - "13": { - "then": "Des plats turcs sont servis ici" - }, - "14": { - "then": "Des plats thaïlandais sont servis ici" } }, "question": "Quelle type de nourriture est servie ici ?", @@ -3843,11 +3898,11 @@ }, "room-type": { "mappings": { - "4": { - "then": "C'est une salle de classe" - }, "14": { "then": "C'est un bureau" + }, + "4": { + "then": "C'est une salle de classe" } } } @@ -4128,6 +4183,18 @@ "1": { "then": "C'est une plaque" }, + "10": { + "then": "C'est une croix" + }, + "11": { + "then": "C'est une plaque bleue (spécifique aux pays anglo-saxons)" + }, + "12": { + "then": "C'est un char historique, placé de manière permanente dans l'espace public comme mémorial" + }, + "13": { + "then": "C'est un arbre du souvenir" + }, "2": { "then": "C'est un banc commémoratif" }, @@ -4151,18 +4218,6 @@ }, "9": { "then": "C'est un obélisque" - }, - "10": { - "then": "C'est une croix" - }, - "11": { - "then": "C'est une plaque bleue (spécifique aux pays anglo-saxons)" - }, - "12": { - "then": "C'est un char historique, placé de manière permanente dans l'espace public comme mémorial" - }, - "13": { - "then": "C'est un arbre du souvenir" } }, "question": "C'est un mémorial de guerre", @@ -4300,12 +4355,95 @@ }, "note": { "filter": { + "10": { + "options": { + "0": { + "question": "Toutes les notes" + } + } + }, "2": { "options": { "0": { "question": "Ouverte par {search}" } } + }, + "3": { + "options": { + "0": { + "question": "Exclureles notes ouvertes par {search}" + } + } + }, + "4": { + "options": { + "0": { + "question": "Dernière modification par {search}" + } + } + }, + "5": { + "options": { + "0": { + "question": "Ouverte après le {search}" + } + } + }, + "6": { + "options": { + "0": { + "question": "Créée avant le {search}" + } + } + }, + "7": { + "options": { + "0": { + "question": "Créée après le {search}" + } + } + }, + "8": { + "options": { + "0": { + "question": "Montrer uniquement les notes ouvertes par un contributeur anonyme" + } + } + }, + "9": { + "options": { + "0": { + "question": "Montrer uniquement les notes ouvertes" + } + } + } + }, + "name": "Notes OpenStreetMap", + "tagRenderings": { + "nearby-images": { + "render": { + "before": "

Images à proximité

Les images suivantes sont dans les environs de cette note et pourraient aider à sa résolution." + } + }, + "report-contributor": { + "render": "Signaler {_first_user} pour du spam ou des messages inapropriés" + }, + "report-note": { + "render": "Signaler cette note comme spam ou contenu inapproprié" + } + }, + "title": { + "mappings": { + "0": { + "then": "Note fermée" + } + }, + "render": "Note" + }, + "titleIcons": { + "0": { + "ariaLabel": "Voir sur OpenStreetMap.org" } } }, @@ -5254,30 +5392,6 @@ "1": { "question": "Recyclage de piles et batteries domestiques" }, - "2": { - "question": "Recyclage d'emballage de boissons" - }, - "3": { - "question": "Recyclage de boites de conserve et de canettes" - }, - "4": { - "question": "Recyclage de vêtements" - }, - "5": { - "question": "Recyclage des huiles de friture" - }, - "6": { - "question": "Recyclage des huiles de moteur" - }, - "7": { - "question": "Recyclage des lampes fluorescentes" - }, - "8": { - "question": "Recyclage des déchets verts" - }, - "9": { - "question": "Recyclage des bouteilles en verre et des bocaux" - }, "10": { "question": "Recyclage de tout type de verre" }, @@ -5308,11 +5422,35 @@ "19": { "question": "Recyclage des autres déchets" }, + "2": { + "question": "Recyclage d'emballage de boissons" + }, "20": { "question": "Recyclage des cartouches d'imprimante" }, "21": { "question": "Recyclage des vélos" + }, + "3": { + "question": "Recyclage de boites de conserve et de canettes" + }, + "4": { + "question": "Recyclage de vêtements" + }, + "5": { + "question": "Recyclage des huiles de friture" + }, + "6": { + "question": "Recyclage des huiles de moteur" + }, + "7": { + "question": "Recyclage des lampes fluorescentes" + }, + "8": { + "question": "Recyclage des déchets verts" + }, + "9": { + "question": "Recyclage des bouteilles en verre et des bocaux" } } }, @@ -5375,30 +5513,6 @@ "1": { "then": "Les briques alimentaires en carton peuvent être recyclées ici" }, - "2": { - "then": "Les boites de conserve et canettes peuvent être recyclées ici" - }, - "3": { - "then": "Les vêtements peuvent être recyclés ici" - }, - "4": { - "then": "Les huiles de friture peuvent être recyclées ici" - }, - "5": { - "then": "Les huiles de moteur peuvent être recyclées ici" - }, - "6": { - "then": "Les lampes fluorescentes peuvent être recyclées ici" - }, - "7": { - "then": "Les déchets verts peuvent être recyclés ici" - }, - "8": { - "then": "Les déchets organiques peuvent être recyclés ici" - }, - "9": { - "then": "Les bouteilles en verre et bocaux peuvent être recyclés ici" - }, "10": { "then": "Tout type de verre peut être recyclé ici" }, @@ -5426,6 +5540,9 @@ "19": { "then": "La ferraille peut être recyclée ici" }, + "2": { + "then": "Les boites de conserve et canettes peuvent être recyclées ici" + }, "20": { "then": "Les chaussures peuvent être recyclées ici" }, @@ -5443,6 +5560,27 @@ }, "25": { "then": "Les vélos peuvent être recyclés ici" + }, + "3": { + "then": "Les vêtements peuvent être recyclés ici" + }, + "4": { + "then": "Les huiles de friture peuvent être recyclées ici" + }, + "5": { + "then": "Les huiles de moteur peuvent être recyclées ici" + }, + "6": { + "then": "Les lampes fluorescentes peuvent être recyclées ici" + }, + "7": { + "then": "Les déchets verts peuvent être recyclés ici" + }, + "8": { + "then": "Les déchets organiques peuvent être recyclés ici" + }, + "9": { + "then": "Les bouteilles en verre et bocaux peuvent être recyclés ici" } }, "question": "Que peut-on recycler ici ?" @@ -6891,6 +7029,27 @@ "1": { "question": "Vente de boissons" }, + "10": { + "question": "Vente de lait" + }, + "11": { + "question": "Vente de pain" + }, + "12": { + "question": "Vente d'œufs" + }, + "13": { + "question": "Vente de fromage" + }, + "14": { + "question": "Vente de miel" + }, + "15": { + "question": "Vente de pommes de terre" + }, + "19": { + "question": "Vente de fleurs" + }, "2": { "question": "Ventre de confiseries" }, @@ -6914,27 +7073,6 @@ }, "9": { "question": "Vente de chambres à air pour vélo" - }, - "10": { - "question": "Vente de lait" - }, - "11": { - "question": "Vente de pain" - }, - "12": { - "question": "Vente d'œufs" - }, - "13": { - "question": "Vente de fromage" - }, - "14": { - "question": "Vente de miel" - }, - "15": { - "question": "Vente de pommes de terre" - }, - "19": { - "question": "Vente de fleurs" } } } @@ -6992,6 +7130,24 @@ "1": { "then": "Vent des confiseries" }, + "10": { + "then": "Vent du pain" + }, + "11": { + "then": "Vent des œufs" + }, + "12": { + "then": "Vent du fromage" + }, + "13": { + "then": "Vent du miel" + }, + "14": { + "then": "Vent des pommes de terre" + }, + "18": { + "then": "Vent des fleurs" + }, "2": { "then": "Vent de la nourriture" }, @@ -7015,24 +7171,6 @@ }, "9": { "then": "Vent du lait" - }, - "10": { - "then": "Vent du pain" - }, - "11": { - "then": "Vent des œufs" - }, - "12": { - "then": "Vent du fromage" - }, - "13": { - "then": "Vent du miel" - }, - "14": { - "then": "Vent des pommes de terre" - }, - "18": { - "then": "Vent des fleurs" } }, "question": "Que vent ce distributeur ?", @@ -7235,4 +7373,4 @@ "render": "éolienne" } } -} \ No newline at end of file +} From 54558c4518fece980522c9fc62ed10f624c7465f Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 27 Jun 2024 21:06:41 +0000 Subject: [PATCH 07/28] Translated using Weblate (Dutch) Currently translated at 78.8% (523 of 663 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/nl/ --- langs/nl.json | 1 + 1 file changed, 1 insertion(+) diff --git a/langs/nl.json b/langs/nl.json index 5c12f6c0e..883c5f165 100644 --- a/langs/nl.json +++ b/langs/nl.json @@ -259,6 +259,7 @@ "openStreetMapIntro": "

Een open kaart

Zou het niet fantastisch zijn als er een open kaart zou zijn die door iedereen aangepast én gebruikt kan worden? Een kaart waar iedereen zijn interesses aan zou kunnen toevoegen? Dan zouden er geen duizend-en-één verschillende kleine kaartjes, websites, ... meer nodig zijn

OpenStreetMap is deze open kaart. Je mag de kaartdata gratis gebruiken (mits bronvermelding en herpublicatie van aanpassingen). Daarenboven mag je de kaart ook gratis aanpassen als je een account maakt. Ook deze website is gebaseerd op OpenStreetMap. Als je hier een vraag beantwoord, gaat het antwoord daar ook naartoe

Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Organic Maps, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram,...
;Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!

Kortom, als je hier een punt toevoegd of een vraag beantwoord, zal dat na een tijdje ook in al dié applicaties te zien zijn.

", "openTheMap": "Raadpleeg de kaart", "openTheMapAtGeolocation": "Ga naar jouw locatie", + "openTheMapReason": "om informatie te zien, te wijzigen en toe te voegen", "opening_hours": { "all_days_from": "Elke dag geopend {ranges}", "closed_permanently": "Gesloten voor onbepaalde tijd", From 4274cdf32daf8e8ab4a566fb0c233526c2a88027 Mon Sep 17 00:00:00 2001 From: Franco Date: Thu, 27 Jun 2024 16:29:16 +0000 Subject: [PATCH 08/28] Translated using Weblate (Spanish) Currently translated at 88.3% (453 of 513 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/es/ --- langs/themes/es.json | 66 ++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/langs/themes/es.json b/langs/themes/es.json index 9110808f3..7e7471c97 100644 --- a/langs/themes/es.json +++ b/langs/themes/es.json @@ -440,7 +440,7 @@ "title": "Gimnasios de escalada, clubes y lugares" }, "clock": { - "description": "Mapa con todos los relojes públicos", + "description": "Mapa mostrando todos los relojes públicos", "title": "Relojes" }, "cycle_highways": { @@ -956,6 +956,33 @@ "onwheels": { "description": "En este mapa se muestran los lugares accesibles al público en silla de ruedas, que pueden añadirse fácilmente", "layers": { + "19": { + "override": { + "=title": { + "render": "Estadísticas" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "Importar" + } + } + }, + "1": { + "render": { + "special": { + "message": "Añadir todas las etiquetas sugeridas" + } + } + } + } + } + }, "4": { "override": { "filter": { @@ -998,33 +1025,6 @@ "override": { "name": "Plazas de aparcamiento para discapacitados" } - }, - "19": { - "override": { - "=title": { - "render": "Estadísticas" - } - } - }, - "20": { - "override": { - "+tagRenderings": { - "0": { - "render": { - "special": { - "text": "Importar" - } - } - }, - "1": { - "render": { - "special": { - "message": "Añadir todas las etiquetas sugeridas" - } - } - } - } - } } }, "title": "Sobre ruedas" @@ -1240,10 +1240,6 @@ "stations": { "description": "Ver, editar y añadir detalles a una estación de tren", "layers": { - "3": { - "description": "Capa que muestra las estaciones de tren", - "name": "Estación de Tren" - }, "16": { "description": "Pantallas que muestran los trenes que saldrán de esta estación", "name": "Tableros de salidas", @@ -1275,6 +1271,10 @@ "title": { "render": "Tablero de salidas" } + }, + "3": { + "description": "Capa que muestra las estaciones de tren", + "name": "Estación de Tren" } }, "title": "Estaciones de tren" @@ -1453,4 +1453,4 @@ "shortDescription": "Un mapa con papeleras", "title": "Papeleras" } -} \ No newline at end of file +} From fe096a35fcd05257a621e054ccd7a70c9ad09299 Mon Sep 17 00:00:00 2001 From: Manuel Tassi Date: Sun, 30 Jun 2024 14:09:41 +0000 Subject: [PATCH 09/28] Translated using Weblate (Italian) Currently translated at 45.4% (233 of 513 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/it/ --- langs/themes/it.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/langs/themes/it.json b/langs/themes/it.json index bfed7edfa..ed7032dba 100644 --- a/langs/themes/it.json +++ b/langs/themes/it.json @@ -698,7 +698,7 @@ }, "toilets": { "description": "Una cartina dei servizi igienici pubblici", - "title": "Mappa libera delle toilet" + "title": "Servizi igienici pubblici" }, "trees": { "description": "Mappa tutti gli alberi!", @@ -714,4 +714,4 @@ "shortDescription": "Una cartina dei cestini dei rifiuti", "title": "Cestino dei rifiuti" } -} \ No newline at end of file +} From 458a31136f104b790b0fdeed88806614c4a303de Mon Sep 17 00:00:00 2001 From: hugoalh Date: Sun, 30 Jun 2024 08:05:58 +0000 Subject: [PATCH 10/28] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (663 of 663 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/zh_Hant/ --- langs/zh_Hant.json | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/langs/zh_Hant.json b/langs/zh_Hant.json index 98891e76d..01527a2f1 100644 --- a/langs/zh_Hant.json +++ b/langs/zh_Hant.json @@ -58,14 +58,16 @@ }, "currentInOsmIs": "目前,OpenStreetMap 記錄了以下值:", "done": "完成", - "error": "錯誤", + "error": "無法從網站載入已連結的資料", + "lastModified": "外部資料已經最近修改於 {date}", "loadedFrom": "下列資料透過內嵌 JSON-LD 由 {source} 載入", "missing": { "intro": "開放街圖沒有下列屬性的資訊", "title": "遺失的物件" }, "noDataLoaded": "外部網站沒有可以載入的已連結資料", - "overwrite": "在 OpenStreetMap 中覆寫" + "overwrite": "在 OpenStreetMap 中覆寫", + "title": "已從外部網站載入結構化資料" }, "favourite": { "loginNeeded": "

登入

只有開放街圖使用者才有個人化樣式", @@ -185,6 +187,7 @@ "editId": "開啟開放街圖線上編輯器", "editJosm": "採用 JOSM 編輯", "followOnMastodon": "在 Mastodon 追蹤 MapComplete", + "gotoSourceCode": "檢視原始碼", "iconAttribution": { "title": "使用的圖示" }, @@ -197,6 +200,8 @@ "openIssueTracker": "提出臭蟲報告", "openMapillary": "開啟 Mapillary", "openOsmcha": "請見 {theme} 的最新編輯", + "openOsmchaLastWeek": "檢視最近 7 天的編輯", + "openThemeDocumentation": "開啟專題地圖 {name} 的文件", "seeOnMapillary": "在 Mapillary 觀看這張影像", "themeBy": "由 {author} 維護主題", "title": "版權與署名", @@ -317,10 +322,11 @@ "openStreetMapIntro": "

開放的地圖

如果有一份地圖,任何人都能使用與自由編輯,單一的地圖能夠儲存所有地理相關資訊。不同的、範圍小的,不相容甚至過時不再被需要的地圖。

開放街圖不是敵人的地圖,人人都能自由使用這些圖資, (只要署名與公開變動這資料)。任何人都能新增新資料與修正錯誤,這些網站也用開放街圖,資料也都來自開放街圖,你的答案與修正也會加被用到/p>

許多人與應用程式已經採用開放街圖了:Organic MapsOsmAnd,還有 Facebook、Instagram,蘋果地圖、Bing 地圖(部分)採用開放街圖。

", "openTheMap": "開啟地圖", "openTheMapAtGeolocation": "縮放到你的位置", + "openTheMapReason": "以檢視、編輯和增加資訊", "opening_hours": { "all_days_from": "每天都有營業 {ranges}", "closed_permanently": "不清楚關閉多久了", - "closed_until": "{date} 起關閉", + "closed_until": "開放於 {date}", "error": "無法解析營業時間", "error_loading": "錯誤:無法視覺化開放時間。", "friday": "星期五時 {ranges}", @@ -354,6 +360,7 @@ "versionInfo": "v{version} - {date} 產生的" }, "pickLanguage": "選擇語言", + "poweredByMapComplete": "由 MapComplete 提供支援—群眾外包,OpenStreetMap 的專題地圖", "poweredByOsm": "由開放街圖資料驅動", "questionBox": { "answeredMultiple": "你回答 {answered} 問題", @@ -377,9 +384,10 @@ }, "readYourMessages": "請先閱讀開放街圖訊息之前再來新增新圖徵。", "removeLocationHistory": "刪除位置歷史", + "retry": "重試", "returnToTheMap": "回到地圖", "save": "儲存", - "screenToSmall": "在新視窗開啟 {theme}", + "screenToSmall": "在新視窗中開啟 {theme}", "search": { "error": "有狀況發生了…", "nothing": "沒有找到…", @@ -388,14 +396,21 @@ "searching": "搜尋中…" }, "searchAnswer": "搜尋選項…", + "seeIndex": "查看所有專題地圖的概覽", "share": "分享", "sharescreen": { "copiedToClipboard": "複製連結到簡貼簿", "documentation": "要知道更多可以用的網址參數,參考這份文章", "embedIntro": "

嵌入到你的網站

請考慮將這份地圖嵌入您的網站。
地圖毋須額外授權,非常歡迎您多加利用。
一切都是免費的,而且之後也是免費的,越有更多人使用,則越顯得它的價值。", - "fsUserbadge": "啟用登入按鈕", + "fsBackground": "啟用切換背景", + "fsFilter": "啟用切換圖層和過濾器的可能性", + "fsGeolocation": "啟用地理定位", + "fsUserbadge": "啟用登入按鈕,從而可以進行變更", "fsWelcomeMessage": "顯示歡迎訊息以及相關頁籤", "intro": "

分享這地圖

複製下面的連結來向朋友與家人分享這份地圖:", + "openLayers": "開啟圖層和過濾器選單", + "options": "分享選項", + "stateIsIncluded": "目前的圖層和過濾器狀態已包含在分享連結和 iframe 中。", "thanksForSharing": "感謝分享!", "title": "分享這份地圖" }, @@ -592,14 +607,16 @@ }, "index": { "#": "當沒有載入主題時,這些文字會在主題按鈕上面顯示", + "about": "關於 MapComplete", "featuredThemeTitle": "這週的焦點", "intro": "關於您貢獻的各種主題的地圖", + "learnMore": "瞭解更多", "logIn": "登入來看其他你先前查看的主題", "pickTheme": "請挑選主題來開始。", "title": "MapComplete" }, "move": { - "cancel": "取消移動", + "cancel": "選擇不同的原因", "cannotBeMoved": "這個圖徵無法移動。", "confirmMove": "移動至這裏", "inviteToMove": { @@ -616,7 +633,7 @@ "partOfRelation": "這個圖徵是關聯的一部分,請用其他編輯器來移動。", "pointIsMoved": "這個點已經被移動了", "reasons": { - "reasonInaccurate": "這個物件的位置並不準確,應該移動個幾公尺", + "reasonInaccurate": "位置不準確,誤差幾公尺", "reasonRelocation": "你的物件已經移動到完全不同的位置" }, "selectReason": "為什麼你移動這個物件?", @@ -709,7 +726,7 @@ "i_am_affiliated": "我是這物件的相關關係者", "i_am_affiliated_explanation": "檢查你是否是店主、創造者或是員工…", "name_required": "需要有名稱才能顯示和創造審核", - "no_reviews_yet": "還沒有審核,當第一個撰寫者來幫助開放資料與商家吧!", + "no_reviews_yet": "還沒有評論。成為第一個!", "non_place_review": "並未顯示一篇與地點無關的評論。", "non_place_reviews": "並未顯示 {n} 篇與地點無關的評論。", "question": "你會怎麼評分 {title()} ?", From 43634a4d959334ff6cf674c455f0d9a09b9a44df Mon Sep 17 00:00:00 2001 From: hugoalh Date: Sun, 30 Jun 2024 08:13:31 +0000 Subject: [PATCH 11/28] Translated using Weblate (Chinese (Traditional)) Currently translated at 47.1% (242 of 513 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/zh_Hant/ --- langs/themes/zh_Hant.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/langs/themes/zh_Hant.json b/langs/themes/zh_Hant.json index 41c9035dc..d1ef5380c 100644 --- a/langs/themes/zh_Hant.json +++ b/langs/themes/zh_Hant.json @@ -13,7 +13,7 @@ "title": "藝術品" }, "atm": { - "description": "此地圖顯示了提款或存款的 ATM", + "description": "此地圖顯示了提款或存款的自動櫃員機", "layers": { "3": { "override": { @@ -597,10 +597,6 @@ }, "stations": { "layers": { - "3": { - "description": "顯示火車站的圖層", - "name": "火車站" - }, "16": { "name": "出發板", "presets": { @@ -621,6 +617,10 @@ "title": { "render": "時刻表" } + }, + "3": { + "description": "顯示火車站的圖層", + "name": "火車站" } }, "title": "火車站" @@ -722,4 +722,4 @@ "shortDescription": "垃圾筒的地圖", "title": "垃圾筒" } -} \ No newline at end of file +} From b1a93d72422d138d254b7ef52ca40535e5555de2 Mon Sep 17 00:00:00 2001 From: Patchanka64 Date: Thu, 4 Jul 2024 17:33:37 +0000 Subject: [PATCH 12/28] Translated using Weblate (French) Currently translated at 55.8% (370 of 663 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/fr/ --- langs/fr.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/langs/fr.json b/langs/fr.json index fdd08e7de..dd0eb0824 100644 --- a/langs/fr.json +++ b/langs/fr.json @@ -232,6 +232,7 @@ "openStreetMapIntro": "

Une carte ouverte

Utilisable et éditable librement. Une seule et unique plateforme regroupant toutes les informations géographiques ? Toutes ces différentes cartes isolées, incompatibles et obsolètes ne sont plus utiles.

OpenStreetMap n’est pas un énième concurrent. Toutes les données de cette carte peuvent être utilisé librement (avec attribution et publication des changements de données). De plus tout le monde est libre d'ajouter de nouvelles données et corriger les erreurs. Ce site utilise également OpenStreetMap. Toutes les données en proviennent et tous les ajouts et modifications y seront également ajoutés.

De nombreux individus et applications utilisent déjà OpenStreetMap : Maps.me, OsmAnd, mais aussi les cartes de Facebook, Instagram, Apple Maps et Bing Maps sont (en partie) alimentées par OpenStreetMap

", "openTheMap": "Ouvrir la carte", "openTheMapAtGeolocation": "Zoom sur votre position", + "openTheMapReason": "pour la voir, l'éditer et modifier des informations", "opening_hours": { "closed_permanently": "Fermé", "closed_until": "Fermé jusqu'au {date}", @@ -368,6 +369,7 @@ "intro": "MapComplete autorise les raccourcis clavier suivants :", "key": "Combinaison de touches", "openLayersPanel": "Ouvre le panneau fond-de-plan, couches et filtres", + "selectFavourites": "Ouvrir la page des favoris", "selectMapnik": "Appliquer le fond de carte OpenStreetMap-carto", "selectSearch": "Sélectionner la barre de recherche de lieux", "title": "Raccourcis clavier", From c8da524bb8eee8610f40b7d944ab028e1477bc03 Mon Sep 17 00:00:00 2001 From: Patchanka64 Date: Thu, 4 Jul 2024 17:32:52 +0000 Subject: [PATCH 13/28] Translated using Weblate (French) Currently translated at 76.2% (391 of 513 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/fr/ --- langs/themes/fr.json | 67 +++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/langs/themes/fr.json b/langs/themes/fr.json index 330125093..6e00ca160 100644 --- a/langs/themes/fr.json +++ b/langs/themes/fr.json @@ -833,6 +833,9 @@ }, "title": "Ressauts et traversées" }, + "mapcomplete-changes": { + "title": "Modifications faites avec MapComplete" + }, "maproulette": { "description": "Thème MapRoulette permettant d’afficher, rechercher, filtrer et résoudre les tâches.", "title": "Tâches MapRoulette" @@ -868,6 +871,33 @@ "onwheels": { "description": "Sur cette carte nous pouvons voir et ajouter les différents endroits publiques accessibles aux chaises roulantes", "layers": { + "19": { + "override": { + "=title": { + "render": "Statistiques" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "Importation" + } + } + }, + "1": { + "render": { + "special": { + "message": "Ajouter tous les attributs suggérés" + } + } + } + } + } + }, "4": { "override": { "filter": { @@ -910,33 +940,6 @@ "override": { "name": "Places de stationnement pour personnes handicapées" } - }, - "19": { - "override": { - "=title": { - "render": "Statistiques" - } - } - }, - "20": { - "override": { - "+tagRenderings": { - "0": { - "render": { - "special": { - "text": "Importation" - } - } - }, - "1": { - "render": { - "special": { - "message": "Ajouter tous les attributs suggérés" - } - } - } - } - } } }, "title": "OnWheels" @@ -1100,10 +1103,6 @@ "stations": { "description": "Voir, modifier et ajouter des détails à une gare ferroviaire", "layers": { - "3": { - "description": "Couche montrant les gares", - "name": "Gares ferroviaires" - }, "16": { "description": "Panneau affichant les trains au départ depuis cette gare", "name": "Panneaux des départs", @@ -1135,6 +1134,10 @@ "title": { "render": "Tableau des départs" } + }, + "3": { + "description": "Couche montrant les gares", + "name": "Gares ferroviaires" } }, "title": "Gares ferroviaires" @@ -1256,4 +1259,4 @@ "shortDescription": "Une carte des poubelles", "title": "Poubelles" } -} \ No newline at end of file +} From a3a99286ce7c13e97e35c3d37ab374a105f1e314 Mon Sep 17 00:00:00 2001 From: hugoalh Date: Sun, 30 Jun 2024 08:25:49 +0000 Subject: [PATCH 14/28] Translated using Weblate (Chinese (Traditional)) Currently translated at 7.0% (250 of 3528 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/zh_Hant/ --- langs/layers/zh_Hant.json | 105 ++++++++++++++++++++++++++++++++++---- 1 file changed, 96 insertions(+), 9 deletions(-) diff --git a/langs/layers/zh_Hant.json b/langs/layers/zh_Hant.json index 4fe00ba3f..fbd88d294 100644 --- a/langs/layers/zh_Hant.json +++ b/langs/layers/zh_Hant.json @@ -16,8 +16,12 @@ "render": "門牌號碼是 {addr:housenumber}" }, "street": { - "question": "地址所在的道路是?" + "question": "地址所在的道路是?", + "render": "此地址位於街道 {addr:street}" } + }, + "title": { + "render": "已知的地址" } }, "advertising": { @@ -52,6 +56,12 @@ "1": { "then": "壁畫" }, + "10": { + "then": "Azulejo (西班牙雕塑作品名稱)" + }, + "11": { + "then": "瓷磚" + }, "2": { "then": "繪畫" }, @@ -75,12 +85,6 @@ }, "9": { "then": "寬慰" - }, - "10": { - "then": "Azulejo (西班牙雕塑作品名稱)" - }, - "11": { - "then": "瓷磚" } }, "question": "這是什麼類型的藝術品?", @@ -104,6 +108,9 @@ "render": "藝術品" } }, + "atm": { + "description": "自動櫃員機以提款" + }, "barrier": { "tagRenderings": { "bicycle=yes/no": { @@ -132,7 +139,7 @@ "then": "靠背:有" }, "2": { - "then": "靠背:無" + "then": "此長椅沒有靠背" } }, "question": "這個長椅是否有靠背?" @@ -576,6 +583,9 @@ } } }, + "maxspeed": { + "description": "顯示每條道路的允許速度" + }, "postboxes": { "description": "這圖層顯示郵筒。", "name": "郵筒", @@ -808,10 +818,84 @@ } } }, + "visitor_information_centre": { + "title": { + "mappings": { + "1": { + "then": "{name}" + } + }, + "render": "{name}" + } + }, "walls_and_buildings": { "description": "特殊的內建圖層顯示所有牆壁與建築。這個圖層對於規畫要靠牆的東西 (例如 AED、郵筒、入口、地址、監視器等) 相當實用。這個圖層預設顯示而且無法由使用者開關。" }, + "waste_basket": { + "filter": { + "0": { + "options": { + "0": { + "question": "所有類型" + } + } + } + } + }, + "waste_disposal": { + "presets": { + "0": { + "title": "廢棄物處理桶" + } + }, + "tagRenderings": { + "access": { + "mappings": { + "0": { + "then": "這個桶可以給任何人使用" + }, + "1": { + "then": "這個桶是私人的" + }, + "2": { + "then": "這個桶僅供居民使用" + } + }, + "question": "誰可以使用這個廢棄物處理桶?", + "render": "存取:{access}" + }, + "disposal-location": { + "mappings": { + "0": { + "then": "這是一個地下容器" + }, + "1": { + "then": "這個容器位於室內" + }, + "2": { + "then": "這個容器位於室外" + } + }, + "question": "這個容器位於哪裡?" + }, + "type": { + "mappings": { + "0": { + "then": "這是一個中型至大型的桶,用於處理(家庭)廢棄物" + }, + "1": { + "then": "這實際上是一個回收容器" + } + }, + "question": "這是甚麼種類的廢棄物處理箱?" + } + }, + "title": { + "render": "廢棄物處理" + } + }, "windturbine": { + "description": "現代風車產生電力", "name": "風機", "presets": { "0": { @@ -838,6 +922,9 @@ "turbine-start-date": { "question": "這個風機何時開始營運?", "render": "這個風機從 {start_date} 開始運轉。" + }, + "windturbine-fixme": { + "render": "為 OpenStreetMap 專家提供的額外資訊:{fixme}" } }, "title": { @@ -849,4 +936,4 @@ "render": "風機" } } -} \ No newline at end of file +} From 283cca7493ddbe35ee6b9718d49c4658cbbdb9d2 Mon Sep 17 00:00:00 2001 From: Patchanka64 Date: Thu, 4 Jul 2024 17:46:59 +0000 Subject: [PATCH 15/28] Translated using Weblate (French) Currently translated at 61.4% (2168 of 3528 strings) Translation: MapComplete/Layer translations Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layers/fr/ --- langs/layers/fr.json | 474 ++++++++++++++++++++++++++++--------------- 1 file changed, 306 insertions(+), 168 deletions(-) diff --git a/langs/layers/fr.json b/langs/layers/fr.json index 500c65d54..707444a8e 100644 --- a/langs/layers/fr.json +++ b/langs/layers/fr.json @@ -35,6 +35,23 @@ "1": { "title": "un panneau à affiches scellé au sol" }, + "10": { + "description": "Une pièce de textile imperméable avec un message imprimé, ancrée de façon permanente sur un mur.", + "title": "une bâche" + }, + "11": { + "title": "un totem" + }, + "12": { + "description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées", + "title": "une enseigne" + }, + "13": { + "title": "une sculpture" + }, + "14": { + "title": "une peinture murale" + }, "2": { "title": "un panneau à affiches monté sur un mur" }, @@ -60,23 +77,6 @@ }, "9": { "title": "un écran fixé sur un abri de transport" - }, - "10": { - "description": "Une pièce de textile imperméable avec un message imprimé, ancrée de façon permanente sur un mur.", - "title": "une bâche" - }, - "11": { - "title": "un totem" - }, - "12": { - "description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées", - "title": "une enseigne" - }, - "13": { - "title": "une sculpture" - }, - "14": { - "title": "une peinture murale" } }, "tagRenderings": { @@ -168,6 +168,9 @@ "1": { "then": "C'est un petit panneau" }, + "10": { + "then": "C'est une peinture murale" + }, "2": { "then": "C'est une colonne" }, @@ -191,9 +194,6 @@ }, "9": { "then": "C'est un totem" - }, - "10": { - "then": "C'est une peinture murale" } }, "question": "De quel type de dispositif publicitaire s'agit-il ?", @@ -205,6 +205,9 @@ "1": { "then": "Petit panneau" }, + "10": { + "then": "Peinture murale" + }, "3": { "then": "Colonne" }, @@ -225,9 +228,6 @@ }, "9": { "then": "Totem" - }, - "10": { - "then": "Peinture murale" } } } @@ -300,6 +300,36 @@ "render": "Station d’ambulances" } }, + "animal_shelter": { + "name": "Abri pour animaux", + "presets": { + "0": { + "title": "refuge animalier" + } + }, + "tagRenderings": { + "2": { + "question": "Quel est le nom de ce refuge animalier ?", + "render": "Ce refuge s'appelle {name}" + }, + "6": { + "mappings": { + "0": { + "then": "Les animaux sont gardés jusqu'à ce qu'ils soient adoptés par un nouveau maître" + }, + "1": { + "then": "Les animaux sont recueillis pour le reste de leur vie" + }, + "2": { + "then": "Les animaux blessés sont soignés jusqu'à ce qu'ils soient en état d'être relâchés dans la nature " + } + } + } + }, + "title": { + "render": "Un refuge animalier" + } + }, "artwork": { "description": "Une carte ouverte de statues, bustes, graffitis et autres œuvres d'art de par le monde", "name": "Œuvres d'art", @@ -328,6 +358,15 @@ "1": { "then": "Peinture murale" }, + "10": { + "then": "Azulejo (faïence latine)" + }, + "11": { + "then": "Carrelage" + }, + "12": { + "then": "Sculpture sur bois" + }, "2": { "then": "Peinture" }, @@ -351,15 +390,6 @@ }, "9": { "then": "Relief" - }, - "10": { - "then": "Azulejo (faïence latine)" - }, - "11": { - "then": "Carrelage" - }, - "12": { - "then": "Sculpture sur bois" } }, "question": "Quel est le type de cette œuvre d'art ?", @@ -1757,6 +1787,31 @@ } } } + }, + "tagRenderings": { + "Authentication": { + "mappings": { + "0": { + "then": "Authentification par carte de membre" + }, + "1": { + "then": "Authentification par une application" + }, + "2": { + "then": "Authentification possible par appel téléphonique" + }, + "3": { + "then": "Authentification possible par SMS" + } + } + }, + "Operational status": { + "mappings": { + "0": { + "then": "Cette station de recharge fonctionne" + } + } + } } }, "climbing": { @@ -2451,6 +2506,15 @@ "1": { "then": "Cette piste cyclable est goudronée" }, + "10": { + "then": "Cette piste cyclable est faite en graviers fins" + }, + "11": { + "then": "Cette piste cyclable est en cailloux" + }, + "12": { + "then": "Cette piste cyclable est faite en sol brut" + }, "2": { "then": "Cette piste cyclable est asphaltée" }, @@ -2474,15 +2538,6 @@ }, "9": { "then": "Cette piste cyclable est faite en graviers" - }, - "10": { - "then": "Cette piste cyclable est faite en graviers fins" - }, - "11": { - "then": "Cette piste cyclable est en cailloux" - }, - "12": { - "then": "Cette piste cyclable est faite en sol brut" } }, "question": "De quoi est faite la surface de la piste cyclable ?", @@ -2531,6 +2586,15 @@ "1": { "then": "Cette piste cyclable est pavée" }, + "10": { + "then": "Cette piste cyclable est faite en graviers fins" + }, + "11": { + "then": "Cette piste cyclable est en cailloux" + }, + "12": { + "then": "Cette piste cyclable est faite en sol brut" + }, "2": { "then": "Cette piste cyclable est asphaltée" }, @@ -2554,15 +2618,6 @@ }, "9": { "then": "Cette piste cyclable est faite en graviers" - }, - "10": { - "then": "Cette piste cyclable est faite en graviers fins" - }, - "11": { - "then": "Cette piste cyclable est en cailloux" - }, - "12": { - "then": "Cette piste cyclable est faite en sol brut" } }, "question": "De quel materiel est faite cette rue ?", @@ -3412,6 +3467,21 @@ "1": { "then": "C'est une friterie" }, + "10": { + "then": "Des plats chinois sont servis ici" + }, + "11": { + "then": "Des plats grecs sont servis ici" + }, + "12": { + "then": "Des plats indiens sont servis ici" + }, + "13": { + "then": "Des plats turcs sont servis ici" + }, + "14": { + "then": "Des plats thaïlandais sont servis ici" + }, "2": { "then": "Restaurant Italien" }, @@ -3435,21 +3505,6 @@ }, "9": { "then": "Des plats français sont servis ici" - }, - "10": { - "then": "Des plats chinois sont servis ici" - }, - "11": { - "then": "Des plats grecs sont servis ici" - }, - "12": { - "then": "Des plats indiens sont servis ici" - }, - "13": { - "then": "Des plats turcs sont servis ici" - }, - "14": { - "then": "Des plats thaïlandais sont servis ici" } }, "question": "Quelle type de nourriture est servie ici ?", @@ -3843,11 +3898,11 @@ }, "room-type": { "mappings": { - "4": { - "then": "C'est une salle de classe" - }, "14": { "then": "C'est un bureau" + }, + "4": { + "then": "C'est une salle de classe" } } } @@ -4128,6 +4183,18 @@ "1": { "then": "C'est une plaque" }, + "10": { + "then": "C'est une croix" + }, + "11": { + "then": "C'est une plaque bleue (spécifique aux pays anglo-saxons)" + }, + "12": { + "then": "C'est un char historique, placé de manière permanente dans l'espace public comme mémorial" + }, + "13": { + "then": "C'est un arbre du souvenir" + }, "2": { "then": "C'est un banc commémoratif" }, @@ -4151,18 +4218,6 @@ }, "9": { "then": "C'est un obélisque" - }, - "10": { - "then": "C'est une croix" - }, - "11": { - "then": "C'est une plaque bleue (spécifique aux pays anglo-saxons)" - }, - "12": { - "then": "C'est un char historique, placé de manière permanente dans l'espace public comme mémorial" - }, - "13": { - "then": "C'est un arbre du souvenir" } }, "question": "C'est un mémorial de guerre", @@ -4300,12 +4355,95 @@ }, "note": { "filter": { + "10": { + "options": { + "0": { + "question": "Toutes les notes" + } + } + }, "2": { "options": { "0": { "question": "Ouverte par {search}" } } + }, + "3": { + "options": { + "0": { + "question": "Exclureles notes ouvertes par {search}" + } + } + }, + "4": { + "options": { + "0": { + "question": "Dernière modification par {search}" + } + } + }, + "5": { + "options": { + "0": { + "question": "Ouverte après le {search}" + } + } + }, + "6": { + "options": { + "0": { + "question": "Créée avant le {search}" + } + } + }, + "7": { + "options": { + "0": { + "question": "Créée après le {search}" + } + } + }, + "8": { + "options": { + "0": { + "question": "Montrer uniquement les notes ouvertes par un contributeur anonyme" + } + } + }, + "9": { + "options": { + "0": { + "question": "Montrer uniquement les notes ouvertes" + } + } + } + }, + "name": "Notes OpenStreetMap", + "tagRenderings": { + "nearby-images": { + "render": { + "before": "

Images à proximité

Les images suivantes sont dans les environs de cette note et pourraient aider à sa résolution." + } + }, + "report-contributor": { + "render": "Signaler {_first_user} pour du spam ou des messages inapropriés" + }, + "report-note": { + "render": "Signaler cette note comme spam ou contenu inapproprié" + } + }, + "title": { + "mappings": { + "0": { + "then": "Note fermée" + } + }, + "render": "Note" + }, + "titleIcons": { + "0": { + "ariaLabel": "Voir sur OpenStreetMap.org" } } }, @@ -5254,30 +5392,6 @@ "1": { "question": "Recyclage de piles et batteries domestiques" }, - "2": { - "question": "Recyclage d'emballage de boissons" - }, - "3": { - "question": "Recyclage de boites de conserve et de canettes" - }, - "4": { - "question": "Recyclage de vêtements" - }, - "5": { - "question": "Recyclage des huiles de friture" - }, - "6": { - "question": "Recyclage des huiles de moteur" - }, - "7": { - "question": "Recyclage des lampes fluorescentes" - }, - "8": { - "question": "Recyclage des déchets verts" - }, - "9": { - "question": "Recyclage des bouteilles en verre et des bocaux" - }, "10": { "question": "Recyclage de tout type de verre" }, @@ -5308,11 +5422,35 @@ "19": { "question": "Recyclage des autres déchets" }, + "2": { + "question": "Recyclage d'emballage de boissons" + }, "20": { "question": "Recyclage des cartouches d'imprimante" }, "21": { "question": "Recyclage des vélos" + }, + "3": { + "question": "Recyclage de boites de conserve et de canettes" + }, + "4": { + "question": "Recyclage de vêtements" + }, + "5": { + "question": "Recyclage des huiles de friture" + }, + "6": { + "question": "Recyclage des huiles de moteur" + }, + "7": { + "question": "Recyclage des lampes fluorescentes" + }, + "8": { + "question": "Recyclage des déchets verts" + }, + "9": { + "question": "Recyclage des bouteilles en verre et des bocaux" } } }, @@ -5375,30 +5513,6 @@ "1": { "then": "Les briques alimentaires en carton peuvent être recyclées ici" }, - "2": { - "then": "Les boites de conserve et canettes peuvent être recyclées ici" - }, - "3": { - "then": "Les vêtements peuvent être recyclés ici" - }, - "4": { - "then": "Les huiles de friture peuvent être recyclées ici" - }, - "5": { - "then": "Les huiles de moteur peuvent être recyclées ici" - }, - "6": { - "then": "Les lampes fluorescentes peuvent être recyclées ici" - }, - "7": { - "then": "Les déchets verts peuvent être recyclés ici" - }, - "8": { - "then": "Les déchets organiques peuvent être recyclés ici" - }, - "9": { - "then": "Les bouteilles en verre et bocaux peuvent être recyclés ici" - }, "10": { "then": "Tout type de verre peut être recyclé ici" }, @@ -5426,6 +5540,9 @@ "19": { "then": "La ferraille peut être recyclée ici" }, + "2": { + "then": "Les boites de conserve et canettes peuvent être recyclées ici" + }, "20": { "then": "Les chaussures peuvent être recyclées ici" }, @@ -5443,6 +5560,27 @@ }, "25": { "then": "Les vélos peuvent être recyclés ici" + }, + "3": { + "then": "Les vêtements peuvent être recyclés ici" + }, + "4": { + "then": "Les huiles de friture peuvent être recyclées ici" + }, + "5": { + "then": "Les huiles de moteur peuvent être recyclées ici" + }, + "6": { + "then": "Les lampes fluorescentes peuvent être recyclées ici" + }, + "7": { + "then": "Les déchets verts peuvent être recyclés ici" + }, + "8": { + "then": "Les déchets organiques peuvent être recyclés ici" + }, + "9": { + "then": "Les bouteilles en verre et bocaux peuvent être recyclés ici" } }, "question": "Que peut-on recycler ici ?" @@ -6891,6 +7029,27 @@ "1": { "question": "Vente de boissons" }, + "10": { + "question": "Vente de lait" + }, + "11": { + "question": "Vente de pain" + }, + "12": { + "question": "Vente d'œufs" + }, + "13": { + "question": "Vente de fromage" + }, + "14": { + "question": "Vente de miel" + }, + "15": { + "question": "Vente de pommes de terre" + }, + "19": { + "question": "Vente de fleurs" + }, "2": { "question": "Ventre de confiseries" }, @@ -6914,27 +7073,6 @@ }, "9": { "question": "Vente de chambres à air pour vélo" - }, - "10": { - "question": "Vente de lait" - }, - "11": { - "question": "Vente de pain" - }, - "12": { - "question": "Vente d'œufs" - }, - "13": { - "question": "Vente de fromage" - }, - "14": { - "question": "Vente de miel" - }, - "15": { - "question": "Vente de pommes de terre" - }, - "19": { - "question": "Vente de fleurs" } } } @@ -6992,6 +7130,24 @@ "1": { "then": "Vent des confiseries" }, + "10": { + "then": "Vent du pain" + }, + "11": { + "then": "Vent des œufs" + }, + "12": { + "then": "Vent du fromage" + }, + "13": { + "then": "Vent du miel" + }, + "14": { + "then": "Vent des pommes de terre" + }, + "18": { + "then": "Vent des fleurs" + }, "2": { "then": "Vent de la nourriture" }, @@ -7015,24 +7171,6 @@ }, "9": { "then": "Vent du lait" - }, - "10": { - "then": "Vent du pain" - }, - "11": { - "then": "Vent des œufs" - }, - "12": { - "then": "Vent du fromage" - }, - "13": { - "then": "Vent du miel" - }, - "14": { - "then": "Vent des pommes de terre" - }, - "18": { - "then": "Vent des fleurs" } }, "question": "Que vent ce distributeur ?", @@ -7235,4 +7373,4 @@ "render": "éolienne" } } -} \ No newline at end of file +} From 1c6cf4dccbce693c8070f6321babcb6e3b370f42 Mon Sep 17 00:00:00 2001 From: mcliquid Date: Thu, 27 Jun 2024 19:36:50 +0000 Subject: [PATCH 16/28] Translated using Weblate (German) Currently translated at 100.0% (663 of 663 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/ --- langs/de.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/langs/de.json b/langs/de.json index 8042a9481..6ce9e0aa3 100644 --- a/langs/de.json +++ b/langs/de.json @@ -322,6 +322,7 @@ "openStreetMapIntro": "

Eine offene Karte

Eine Karte, die jeder frei nutzen und bearbeiten kann. Ein einziger Ort, um alle Geoinformationen zu speichern. Unterschiedliche, kleine, inkompatible und veraltete Karten werden nirgendwo gebraucht.

OpenStreetMap ist nicht die feindliche Karte. Die Kartendaten können frei verwendet werden (mit Benennung und Veröffentlichung von Änderungen an diesen Daten). Jeder kann neue Daten hinzufügen und Fehler korrigieren. Diese Webseite nutzt OpenStreetMap. Alle Daten stammen von dort, und Ihre Antworten und Korrekturen werden überall verwendet.

Viele Menschen und Anwendungen nutzen bereits OpenStreetMap: Organic Maps, OsmAnd; auch die Kartendaten von Facebook, Instagram, Apple-maps und Bing-maps stammen (teilweise) von OpenStreetMap.

", "openTheMap": "Karte öffnen", "openTheMapAtGeolocation": "Zum eigenen Standort zoomen", + "openTheMapReason": "zum anzeigen, bearbeiten und hinzufügen von informationen", "opening_hours": { "all_days_from": "Geöffnet täglich {ranges}", "closed_permanently": "Geschlossen auf unbestimmte Zeit", @@ -401,9 +402,15 @@ "copiedToClipboard": "Verknüpfung in Zwischenablage kopiert", "documentation": "Für weitere Informationen über verfügbare URL-Parameter, siehe Dokumentation", "embedIntro": "

Karte in Webseiten einbetten

Betten Sie diese Karte in Ihre Webseite ein.
Wir ermutigen Sie gern dazu - Sie müssen nicht mal um Erlaubnis fragen.
Die Karte ist kostenlos und wird es immer sein. Je mehr Leute die Karte benutzen, desto wertvoller wird sie.", - "fsUserbadge": "Anmeldefeld aktivieren", + "fsBackground": "Umschalten von Hintergründen aktivieren", + "fsFilter": "Aktiviere die Möglichkeit, Ebenen und Filter umzuschalten", + "fsGeolocation": "Geolokation aktivieren", + "fsUserbadge": "Aktiviere den Login-Button und damit die Möglichkeit, Änderungen vorzunehmen", "fsWelcomeMessage": "Begrüßung und Registerkarten anzeigen", "intro": "

Karte teilen

Mit dem folgenden Link können Sie diese Karte mit Freunden und Familie teilen:", + "openLayers": "Öffne das Ebenen- und Filter-Menü", + "options": "Optionen teilen", + "stateIsIncluded": "Der aktuelle Zustand der Ebenen und Filter ist im gemeinsamen Link und iFrame enthalten.", "thanksForSharing": "Danke für das Teilen!", "title": "Diese Karte teilen" }, From 4d21ff3c1c816c8a058efaf00d3e65728d57ef19 Mon Sep 17 00:00:00 2001 From: Franco Date: Thu, 27 Jun 2024 16:22:59 +0000 Subject: [PATCH 17/28] Translated using Weblate (Spanish) Currently translated at 62.1% (412 of 663 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/es/ --- langs/es.json | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/langs/es.json b/langs/es.json index 3b1e5d80c..c43ec9301 100644 --- a/langs/es.json +++ b/langs/es.json @@ -20,6 +20,7 @@ "cancel": "Cancelar", "cannotBeDeleted": "Esta función no puede ser eliminada", "delete": "Eliminar", + "deletedTitle": "Característica eliminada", "explanations": { "hardDelete": "Este elemento será eliminado en OpenStreetMap. Puede ser recuperado por un colaborador experimentado", "retagNoOtherThemes": "Esta característica será reclasificada y ocultada en esta aplicación", @@ -27,6 +28,7 @@ "selectReason": "Por favor, seleccione el motivo por el que esta característica debe ser eliminada", "softDelete": "Esta característica se actualizará y se ocultará de esta aplicación. {reason}" }, + "isChanged": "Esta característica ha sido cambiada y ya no coincide con esta capa", "isDeleted": "Esta función se ha eliminado", "isntAPoint": "Solo los nodos pueden ser eliminados, esta característica es una vía, área o relación.", "loading": "Inspeccionando las propiedades para comprobar si esta característica puede ser eliminada.", @@ -45,6 +47,18 @@ "useSomethingElse": "Utilice otro editor de OpenStreetMap para eliminarlo", "whyDelete": "¿Por qué debería eliminarse este elemento?" }, + "external": { + "allAreApplied": "Todos los valores externos desaparecidos han sido copiados en OpenStreetMap", + "allIncluded": "El dato cargado desde {source} está contenida en OpenStreetMap", + "apply": "Aplicar", + "applyAll": "Aplicar todos los valores perdidos", + "conflicting": { + "intro": "OpenStreetMap tiene un valor diferente al sitio web de origen para los siguientes valores.", + "title": "Elementos conflictivos" + }, + "currentInOsmIs": "Por el momento, OpenStreetMap tiene el siguiente valor registrado:", + "done": "Listo" + }, "favourite": { "loginNeeded": "

Entrar

El diseño personalizado sólo está disponible para los usuarios de OpenStreetMap", "panelIntro": "

Tu tema personal

Activa tus capas favoritas de todas los temas oficiales", @@ -136,7 +150,7 @@ "intro": "Has marcado un lugar del que no conocemos los datos.
", "layerNotEnabled": "La capa {layer} no está habilitada. Activa esta capa para poder añadir un elemento", "openLayerControl": "Abrir el control de capas", - "pleaseLogin": "Por favor inicia sesión para añadir un nuevo elemento", + "pleaseLogin": "Por favor inicia sesión con OpenStreetMap para añadir un nuevo elemento", "presetInfo": "El nuevo POI tendrá {tags}", "stillLoading": "Los datos se siguen cargando. Espera un poco antes de añadir una nueva función.", "title": "Añadir un elemento nuevo", @@ -242,7 +256,7 @@ "openTheMap": "Abrir el mapa", "opening_hours": { "closed_permanently": "Cerrado - sin día de apertura conocido", - "closed_until": "Cerrado hasta {date}", + "closed_until": "Abierto el {date}", "error_loading": "Error: no se han podido visualizar esos horarios de apertura.", "loadingCountry": "Determinando país…", "not_all_rules_parsed": "El horario de esta tienda es complejo. Las normas siguientes serán ignoradas en la entrada:", @@ -275,7 +289,7 @@ "removeLocationHistory": "Eliminar el historial de ubicaciones", "returnToTheMap": "Volver al mapa", "save": "Guardar", - "screenToSmall": "Abrir {theme} en una ventana nueva", + "screenToSmall": "Abrir {theme} en una ventana nueva", "search": { "error": "Alguna cosa no ha ido bien…", "nothing": "Nada encontrado…", @@ -285,7 +299,7 @@ "sharescreen": { "copiedToClipboard": "Enlace copiado en el portapapeles", "embedIntro": "

Inclúyelo en tu página web

Incluye este mapa en tu página web.
Te animamos a que lo hagas, no hace falta que pidas permiso.
Es gratis, y siempre lo será. A más gente que lo use más valioso será.", - "fsUserbadge": "Activar el botón de entrada", + "fsUserbadge": "Activa el botón de inicio de sesión y por lo tanto la posibilidad de hacer cambios", "fsWelcomeMessage": "Muestra el mensaje emergente de bienvenida y pestañas asociadas", "intro": "

Comparte este mapa

Comparte este mapa copiando el enlace de debajo y enviándolo a amigos y familia:", "thanksForSharing": "Gracias por compartir!", @@ -318,7 +332,7 @@ }, "welcomeBack": "¡Bienvenido de nuevo!", "welcomeExplanation": { - "addNew": "Toque el mapa para añadir un nuevo POI.", + "addNew": "¿Un artículo falta? Utilice el botón en la parte inferior izquierda para añadir un nuevo punto de interés.", "general": "En este mapa, puedes ver, editar y agregar puntos de interés. Haz zoom para ver los POI, toca uno para ver o editar la información. Todos los datos proceden y se guardan en OpenStreetMap, que puede reutilizarse libremente." }, "wikipedia": { @@ -370,13 +384,13 @@ "index": { "#": "Estos textos son mostrados sobre los botones del tema cuando no hay un tema cargado", "featuredThemeTitle": "Esta semana destacamos", - "intro": "MapComplete a un visor y editor de OpenStreetMap, que te muestra información sobre un tema específico.", + "intro": "Mapas sobre diversos temas a los que contribuye", "logIn": "Inicia sesión para ver otros temas que visitaste anteriormente", "pickTheme": "Elige un tema de abajo para empezar.", - "title": "Le damos la bienvenida a MapComplete" + "title": "MapComplete" }, "move": { - "cancel": "Cancelar movimiento", + "cancel": "Elige una razón diferente", "cannotBeMoved": "Esta característica no se puede mover.", "confirmMove": "Mover aquí", "inviteToMove": { @@ -393,7 +407,7 @@ "partOfRelation": "Esta característica es parte de una relación. Utiliza otro editor para moverla.", "pointIsMoved": "Este punto ha sido eliminado", "reasons": { - "reasonInaccurate": "La localización de este objeto no es precisa y debe de ser movida algunos metros", + "reasonInaccurate": "La ubicación es inexacta por unos pocos metros", "reasonRelocation": "El objeto a sido relocalizado a una localización completamente diferente" }, "selectReason": "¿Por qué has movido este objeto?", @@ -441,7 +455,7 @@ "geodataTitle": "Tu geoubicación", "intro": "La privacidad es importante - tanto para el individual como para la sociedad. MapComplete intenta respetar tu privacidad tanto como sea posible - hasta el punto de que no se necesita ningún banner de cookies molesto es necesario. De todas formas, nos gustaría informarte de qué información se recolecta y se comparte, bajo que circunstancias y por qué se hacen estos compromisos.", "items": { - "changesYouMake": " Los cambios que has hecho", + "changesYouMake": "Los cambios que has hecho", "date": "Cuándo se efectuó el cambio", "distanceIndicator": "Una indicación de como de cerca estabas a los objetos cambiados. Otros mapeadores pueden utilizar esta información para determina si un cambio se hizo basándose en un sondeo o en una investigación remota", "language": "El idioma de la interfaz de usuario", @@ -459,7 +473,7 @@ "reviews": { "affiliated_reviewer_warning": "(Revisión afiliada)", "name_required": "Se requiere un nombre para mostrar y crear comentarios", - "no_reviews_yet": "Aún no hay reseñas. ¡Sé el primero en escribir una y ayuda a los datos abiertos y a los negocios!", + "no_reviews_yet": "Todavía no hay comentarios. ¡Sé el primero!", "saved": "Reseña guardada. ¡Gracias por compartir!", "saving_review": "Guardando…", "title": "{count} comentarios", From bec6c2a0ac327936d0fbc2020cb24f2e8af701b9 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 27 Jun 2024 21:06:41 +0000 Subject: [PATCH 18/28] Translated using Weblate (Dutch) Currently translated at 78.8% (523 of 663 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/nl/ --- langs/nl.json | 1 + 1 file changed, 1 insertion(+) diff --git a/langs/nl.json b/langs/nl.json index 5c12f6c0e..883c5f165 100644 --- a/langs/nl.json +++ b/langs/nl.json @@ -259,6 +259,7 @@ "openStreetMapIntro": "

Een open kaart

Zou het niet fantastisch zijn als er een open kaart zou zijn die door iedereen aangepast én gebruikt kan worden? Een kaart waar iedereen zijn interesses aan zou kunnen toevoegen? Dan zouden er geen duizend-en-één verschillende kleine kaartjes, websites, ... meer nodig zijn

OpenStreetMap is deze open kaart. Je mag de kaartdata gratis gebruiken (mits bronvermelding en herpublicatie van aanpassingen). Daarenboven mag je de kaart ook gratis aanpassen als je een account maakt. Ook deze website is gebaseerd op OpenStreetMap. Als je hier een vraag beantwoord, gaat het antwoord daar ook naartoe

Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Organic Maps, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram,...
;Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!

Kortom, als je hier een punt toevoegd of een vraag beantwoord, zal dat na een tijdje ook in al dié applicaties te zien zijn.

", "openTheMap": "Raadpleeg de kaart", "openTheMapAtGeolocation": "Ga naar jouw locatie", + "openTheMapReason": "om informatie te zien, te wijzigen en toe te voegen", "opening_hours": { "all_days_from": "Elke dag geopend {ranges}", "closed_permanently": "Gesloten voor onbepaalde tijd", From 629fcb7c94c45e5ca5c585595ec6ad218ec2d03a Mon Sep 17 00:00:00 2001 From: Franco Date: Thu, 27 Jun 2024 16:29:16 +0000 Subject: [PATCH 19/28] Translated using Weblate (Spanish) Currently translated at 88.3% (453 of 513 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/es/ --- langs/themes/es.json | 66 ++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/langs/themes/es.json b/langs/themes/es.json index 9110808f3..7e7471c97 100644 --- a/langs/themes/es.json +++ b/langs/themes/es.json @@ -440,7 +440,7 @@ "title": "Gimnasios de escalada, clubes y lugares" }, "clock": { - "description": "Mapa con todos los relojes públicos", + "description": "Mapa mostrando todos los relojes públicos", "title": "Relojes" }, "cycle_highways": { @@ -956,6 +956,33 @@ "onwheels": { "description": "En este mapa se muestran los lugares accesibles al público en silla de ruedas, que pueden añadirse fácilmente", "layers": { + "19": { + "override": { + "=title": { + "render": "Estadísticas" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "Importar" + } + } + }, + "1": { + "render": { + "special": { + "message": "Añadir todas las etiquetas sugeridas" + } + } + } + } + } + }, "4": { "override": { "filter": { @@ -998,33 +1025,6 @@ "override": { "name": "Plazas de aparcamiento para discapacitados" } - }, - "19": { - "override": { - "=title": { - "render": "Estadísticas" - } - } - }, - "20": { - "override": { - "+tagRenderings": { - "0": { - "render": { - "special": { - "text": "Importar" - } - } - }, - "1": { - "render": { - "special": { - "message": "Añadir todas las etiquetas sugeridas" - } - } - } - } - } } }, "title": "Sobre ruedas" @@ -1240,10 +1240,6 @@ "stations": { "description": "Ver, editar y añadir detalles a una estación de tren", "layers": { - "3": { - "description": "Capa que muestra las estaciones de tren", - "name": "Estación de Tren" - }, "16": { "description": "Pantallas que muestran los trenes que saldrán de esta estación", "name": "Tableros de salidas", @@ -1275,6 +1271,10 @@ "title": { "render": "Tablero de salidas" } + }, + "3": { + "description": "Capa que muestra las estaciones de tren", + "name": "Estación de Tren" } }, "title": "Estaciones de tren" @@ -1453,4 +1453,4 @@ "shortDescription": "Un mapa con papeleras", "title": "Papeleras" } -} \ No newline at end of file +} From 7ec68d1662e6cf650a44e1a744d16ab449f707d5 Mon Sep 17 00:00:00 2001 From: Manuel Tassi Date: Sun, 30 Jun 2024 14:09:41 +0000 Subject: [PATCH 20/28] Translated using Weblate (Italian) Currently translated at 45.4% (233 of 513 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/it/ --- langs/themes/it.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/langs/themes/it.json b/langs/themes/it.json index bfed7edfa..ed7032dba 100644 --- a/langs/themes/it.json +++ b/langs/themes/it.json @@ -698,7 +698,7 @@ }, "toilets": { "description": "Una cartina dei servizi igienici pubblici", - "title": "Mappa libera delle toilet" + "title": "Servizi igienici pubblici" }, "trees": { "description": "Mappa tutti gli alberi!", @@ -714,4 +714,4 @@ "shortDescription": "Una cartina dei cestini dei rifiuti", "title": "Cestino dei rifiuti" } -} \ No newline at end of file +} From dc958f7c61df9bf0e82a23bca5916686568e785f Mon Sep 17 00:00:00 2001 From: hugoalh Date: Sun, 30 Jun 2024 08:05:58 +0000 Subject: [PATCH 21/28] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (663 of 663 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/zh_Hant/ --- langs/zh_Hant.json | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/langs/zh_Hant.json b/langs/zh_Hant.json index 98891e76d..01527a2f1 100644 --- a/langs/zh_Hant.json +++ b/langs/zh_Hant.json @@ -58,14 +58,16 @@ }, "currentInOsmIs": "目前,OpenStreetMap 記錄了以下值:", "done": "完成", - "error": "錯誤", + "error": "無法從網站載入已連結的資料", + "lastModified": "外部資料已經最近修改於 {date}", "loadedFrom": "下列資料透過內嵌 JSON-LD 由 {source} 載入", "missing": { "intro": "開放街圖沒有下列屬性的資訊", "title": "遺失的物件" }, "noDataLoaded": "外部網站沒有可以載入的已連結資料", - "overwrite": "在 OpenStreetMap 中覆寫" + "overwrite": "在 OpenStreetMap 中覆寫", + "title": "已從外部網站載入結構化資料" }, "favourite": { "loginNeeded": "

登入

只有開放街圖使用者才有個人化樣式", @@ -185,6 +187,7 @@ "editId": "開啟開放街圖線上編輯器", "editJosm": "採用 JOSM 編輯", "followOnMastodon": "在 Mastodon 追蹤 MapComplete", + "gotoSourceCode": "檢視原始碼", "iconAttribution": { "title": "使用的圖示" }, @@ -197,6 +200,8 @@ "openIssueTracker": "提出臭蟲報告", "openMapillary": "開啟 Mapillary", "openOsmcha": "請見 {theme} 的最新編輯", + "openOsmchaLastWeek": "檢視最近 7 天的編輯", + "openThemeDocumentation": "開啟專題地圖 {name} 的文件", "seeOnMapillary": "在 Mapillary 觀看這張影像", "themeBy": "由 {author} 維護主題", "title": "版權與署名", @@ -317,10 +322,11 @@ "openStreetMapIntro": "

開放的地圖

如果有一份地圖,任何人都能使用與自由編輯,單一的地圖能夠儲存所有地理相關資訊。不同的、範圍小的,不相容甚至過時不再被需要的地圖。

開放街圖不是敵人的地圖,人人都能自由使用這些圖資, (只要署名與公開變動這資料)。任何人都能新增新資料與修正錯誤,這些網站也用開放街圖,資料也都來自開放街圖,你的答案與修正也會加被用到/p>

許多人與應用程式已經採用開放街圖了:Organic MapsOsmAnd,還有 Facebook、Instagram,蘋果地圖、Bing 地圖(部分)採用開放街圖。

", "openTheMap": "開啟地圖", "openTheMapAtGeolocation": "縮放到你的位置", + "openTheMapReason": "以檢視、編輯和增加資訊", "opening_hours": { "all_days_from": "每天都有營業 {ranges}", "closed_permanently": "不清楚關閉多久了", - "closed_until": "{date} 起關閉", + "closed_until": "開放於 {date}", "error": "無法解析營業時間", "error_loading": "錯誤:無法視覺化開放時間。", "friday": "星期五時 {ranges}", @@ -354,6 +360,7 @@ "versionInfo": "v{version} - {date} 產生的" }, "pickLanguage": "選擇語言", + "poweredByMapComplete": "由 MapComplete 提供支援—群眾外包,OpenStreetMap 的專題地圖", "poweredByOsm": "由開放街圖資料驅動", "questionBox": { "answeredMultiple": "你回答 {answered} 問題", @@ -377,9 +384,10 @@ }, "readYourMessages": "請先閱讀開放街圖訊息之前再來新增新圖徵。", "removeLocationHistory": "刪除位置歷史", + "retry": "重試", "returnToTheMap": "回到地圖", "save": "儲存", - "screenToSmall": "在新視窗開啟 {theme}", + "screenToSmall": "在新視窗中開啟 {theme}", "search": { "error": "有狀況發生了…", "nothing": "沒有找到…", @@ -388,14 +396,21 @@ "searching": "搜尋中…" }, "searchAnswer": "搜尋選項…", + "seeIndex": "查看所有專題地圖的概覽", "share": "分享", "sharescreen": { "copiedToClipboard": "複製連結到簡貼簿", "documentation": "要知道更多可以用的網址參數,參考這份文章", "embedIntro": "

嵌入到你的網站

請考慮將這份地圖嵌入您的網站。
地圖毋須額外授權,非常歡迎您多加利用。
一切都是免費的,而且之後也是免費的,越有更多人使用,則越顯得它的價值。", - "fsUserbadge": "啟用登入按鈕", + "fsBackground": "啟用切換背景", + "fsFilter": "啟用切換圖層和過濾器的可能性", + "fsGeolocation": "啟用地理定位", + "fsUserbadge": "啟用登入按鈕,從而可以進行變更", "fsWelcomeMessage": "顯示歡迎訊息以及相關頁籤", "intro": "

分享這地圖

複製下面的連結來向朋友與家人分享這份地圖:", + "openLayers": "開啟圖層和過濾器選單", + "options": "分享選項", + "stateIsIncluded": "目前的圖層和過濾器狀態已包含在分享連結和 iframe 中。", "thanksForSharing": "感謝分享!", "title": "分享這份地圖" }, @@ -592,14 +607,16 @@ }, "index": { "#": "當沒有載入主題時,這些文字會在主題按鈕上面顯示", + "about": "關於 MapComplete", "featuredThemeTitle": "這週的焦點", "intro": "關於您貢獻的各種主題的地圖", + "learnMore": "瞭解更多", "logIn": "登入來看其他你先前查看的主題", "pickTheme": "請挑選主題來開始。", "title": "MapComplete" }, "move": { - "cancel": "取消移動", + "cancel": "選擇不同的原因", "cannotBeMoved": "這個圖徵無法移動。", "confirmMove": "移動至這裏", "inviteToMove": { @@ -616,7 +633,7 @@ "partOfRelation": "這個圖徵是關聯的一部分,請用其他編輯器來移動。", "pointIsMoved": "這個點已經被移動了", "reasons": { - "reasonInaccurate": "這個物件的位置並不準確,應該移動個幾公尺", + "reasonInaccurate": "位置不準確,誤差幾公尺", "reasonRelocation": "你的物件已經移動到完全不同的位置" }, "selectReason": "為什麼你移動這個物件?", @@ -709,7 +726,7 @@ "i_am_affiliated": "我是這物件的相關關係者", "i_am_affiliated_explanation": "檢查你是否是店主、創造者或是員工…", "name_required": "需要有名稱才能顯示和創造審核", - "no_reviews_yet": "還沒有審核,當第一個撰寫者來幫助開放資料與商家吧!", + "no_reviews_yet": "還沒有評論。成為第一個!", "non_place_review": "並未顯示一篇與地點無關的評論。", "non_place_reviews": "並未顯示 {n} 篇與地點無關的評論。", "question": "你會怎麼評分 {title()} ?", From 96541410c90982e8bc09a04f0f63ee338f24f201 Mon Sep 17 00:00:00 2001 From: hugoalh Date: Sun, 30 Jun 2024 08:13:31 +0000 Subject: [PATCH 22/28] Translated using Weblate (Chinese (Traditional)) Currently translated at 47.1% (242 of 513 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/zh_Hant/ --- langs/themes/zh_Hant.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/langs/themes/zh_Hant.json b/langs/themes/zh_Hant.json index 41c9035dc..d1ef5380c 100644 --- a/langs/themes/zh_Hant.json +++ b/langs/themes/zh_Hant.json @@ -13,7 +13,7 @@ "title": "藝術品" }, "atm": { - "description": "此地圖顯示了提款或存款的 ATM", + "description": "此地圖顯示了提款或存款的自動櫃員機", "layers": { "3": { "override": { @@ -597,10 +597,6 @@ }, "stations": { "layers": { - "3": { - "description": "顯示火車站的圖層", - "name": "火車站" - }, "16": { "name": "出發板", "presets": { @@ -621,6 +617,10 @@ "title": { "render": "時刻表" } + }, + "3": { + "description": "顯示火車站的圖層", + "name": "火車站" } }, "title": "火車站" @@ -722,4 +722,4 @@ "shortDescription": "垃圾筒的地圖", "title": "垃圾筒" } -} \ No newline at end of file +} From ba4490b48594017c7eb517ef5c4f9ce9602ef2b9 Mon Sep 17 00:00:00 2001 From: Patchanka64 Date: Thu, 4 Jul 2024 17:33:37 +0000 Subject: [PATCH 23/28] Translated using Weblate (French) Currently translated at 55.8% (370 of 663 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/fr/ --- langs/fr.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/langs/fr.json b/langs/fr.json index fdd08e7de..dd0eb0824 100644 --- a/langs/fr.json +++ b/langs/fr.json @@ -232,6 +232,7 @@ "openStreetMapIntro": "

Une carte ouverte

Utilisable et éditable librement. Une seule et unique plateforme regroupant toutes les informations géographiques ? Toutes ces différentes cartes isolées, incompatibles et obsolètes ne sont plus utiles.

OpenStreetMap n’est pas un énième concurrent. Toutes les données de cette carte peuvent être utilisé librement (avec attribution et publication des changements de données). De plus tout le monde est libre d'ajouter de nouvelles données et corriger les erreurs. Ce site utilise également OpenStreetMap. Toutes les données en proviennent et tous les ajouts et modifications y seront également ajoutés.

De nombreux individus et applications utilisent déjà OpenStreetMap : Maps.me, OsmAnd, mais aussi les cartes de Facebook, Instagram, Apple Maps et Bing Maps sont (en partie) alimentées par OpenStreetMap

", "openTheMap": "Ouvrir la carte", "openTheMapAtGeolocation": "Zoom sur votre position", + "openTheMapReason": "pour la voir, l'éditer et modifier des informations", "opening_hours": { "closed_permanently": "Fermé", "closed_until": "Fermé jusqu'au {date}", @@ -368,6 +369,7 @@ "intro": "MapComplete autorise les raccourcis clavier suivants :", "key": "Combinaison de touches", "openLayersPanel": "Ouvre le panneau fond-de-plan, couches et filtres", + "selectFavourites": "Ouvrir la page des favoris", "selectMapnik": "Appliquer le fond de carte OpenStreetMap-carto", "selectSearch": "Sélectionner la barre de recherche de lieux", "title": "Raccourcis clavier", From 4ad1e67f6ea38504ccca13166bb981bf2cec2dcd Mon Sep 17 00:00:00 2001 From: Patchanka64 Date: Thu, 4 Jul 2024 17:32:52 +0000 Subject: [PATCH 24/28] Translated using Weblate (French) Currently translated at 76.2% (391 of 513 strings) Translation: MapComplete/themes Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/fr/ --- langs/themes/fr.json | 67 +++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/langs/themes/fr.json b/langs/themes/fr.json index 330125093..6e00ca160 100644 --- a/langs/themes/fr.json +++ b/langs/themes/fr.json @@ -833,6 +833,9 @@ }, "title": "Ressauts et traversées" }, + "mapcomplete-changes": { + "title": "Modifications faites avec MapComplete" + }, "maproulette": { "description": "Thème MapRoulette permettant d’afficher, rechercher, filtrer et résoudre les tâches.", "title": "Tâches MapRoulette" @@ -868,6 +871,33 @@ "onwheels": { "description": "Sur cette carte nous pouvons voir et ajouter les différents endroits publiques accessibles aux chaises roulantes", "layers": { + "19": { + "override": { + "=title": { + "render": "Statistiques" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "Importation" + } + } + }, + "1": { + "render": { + "special": { + "message": "Ajouter tous les attributs suggérés" + } + } + } + } + } + }, "4": { "override": { "filter": { @@ -910,33 +940,6 @@ "override": { "name": "Places de stationnement pour personnes handicapées" } - }, - "19": { - "override": { - "=title": { - "render": "Statistiques" - } - } - }, - "20": { - "override": { - "+tagRenderings": { - "0": { - "render": { - "special": { - "text": "Importation" - } - } - }, - "1": { - "render": { - "special": { - "message": "Ajouter tous les attributs suggérés" - } - } - } - } - } } }, "title": "OnWheels" @@ -1100,10 +1103,6 @@ "stations": { "description": "Voir, modifier et ajouter des détails à une gare ferroviaire", "layers": { - "3": { - "description": "Couche montrant les gares", - "name": "Gares ferroviaires" - }, "16": { "description": "Panneau affichant les trains au départ depuis cette gare", "name": "Panneaux des départs", @@ -1135,6 +1134,10 @@ "title": { "render": "Tableau des départs" } + }, + "3": { + "description": "Couche montrant les gares", + "name": "Gares ferroviaires" } }, "title": "Gares ferroviaires" @@ -1256,4 +1259,4 @@ "shortDescription": "Une carte des poubelles", "title": "Poubelles" } -} \ No newline at end of file +} From da615acfb1be034f7cf95b577af6826ac23d5df7 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 9 Jul 2024 13:42:08 +0200 Subject: [PATCH 25/28] Housekeeping --- Docs/Themes/mapcomplete-changes.md | 1 + Docs/URL_Parameters.md | 66 +- assets/layers/address/address.json | 6 +- .../layers/animal_shelter/animal_shelter.json | 24 +- assets/layers/atm/atm.json | 3 +- assets/layers/bench/bench.json | 2 +- .../charging_station/charging_station.json | 13 +- assets/layers/maxspeed/maxspeed.json | 3 +- assets/layers/note/note.json | 45 +- .../visitor_information_centre.json | 6 +- assets/layers/waste_basket/waste_basket.json | 3 +- .../layers/waste_disposal/waste_disposal.json | 42 +- assets/layers/windturbine/windturbine.json | 6 +- assets/themes/atm/atm.json | 2 +- assets/themes/clock/clock.json | 2 +- .../mapcomplete-changes.json | 103 +- assets/themes/toilets/toilets.json | 2 +- langs/layers/fr.json | 350 ++-- langs/layers/zh_Hant.json | 14 +- langs/themes/es.json | 64 +- langs/themes/fr.json | 64 +- langs/themes/it.json | 2 +- langs/themes/zh_Hant.json | 10 +- package-lock.json | 16 +- scripts/downloadNsiLogos.ts | 4 +- scripts/generateLayerOverview.ts | 128 +- scripts/generateSummaryTileCache.ts | 39 +- .../TiledFeatureSource/SummaryTileSource.ts | 12 +- src/Logic/State/FeatureSwitchState.ts | 63 +- src/Logic/State/LayerState.ts | 14 +- src/Logic/State/UserSettingsMetaTagging.ts | 48 +- src/Models/Constants.ts | 12 +- src/Models/FilteredLayer.ts | 4 +- src/Models/MenuState.ts | 5 +- src/Models/ThemeConfig/LayoutConfig.ts | 13 +- src/Models/ThemeViewState.ts | 109 +- src/UI/Base/Copyable.svelte | 7 +- src/UI/BigComponents/AboutMapComplete.svelte | 20 +- src/UI/BigComponents/CopyrightPanel.ts | 6 +- src/UI/BigComponents/ShareScreen.svelte | 63 +- src/UI/BigComponents/ThemeButton.svelte | 2 +- src/UI/BigComponents/ThemeIntroPanel.svelte | 2 +- src/UI/Popup/Notes/AddNoteComment.svelte | 76 +- src/UI/Studio/QuestionPreview.svelte | 1 - src/UI/Studio/SchemaBasedArray.svelte | 18 +- src/UI/Studio/TagInput/BasicTagInput.svelte | 7 +- src/UI/Studio/configMeta.ts | 2 +- src/UI/StudioGUI.svelte | 4 +- src/UI/ThemeViewGUI.svelte | 34 +- src/Utils.ts | 13 +- src/assets/contributors.json | 2 +- src/assets/language_in_country.json | 2 +- src/assets/language_native.json | 4 +- src/assets/language_translations.json | 1632 ++++++++++------- src/assets/translators.json | 32 +- 55 files changed, 1772 insertions(+), 1455 deletions(-) diff --git a/Docs/Themes/mapcomplete-changes.md b/Docs/Themes/mapcomplete-changes.md index 27e1e08b5..c11942912 100644 --- a/Docs/Themes/mapcomplete-changes.md +++ b/Docs/Themes/mapcomplete-changes.md @@ -33,6 +33,7 @@ Available languages: - en - da - de + - fr This document is autogenerated from [assets/themes/mapcomplete-changes/mapcomplete-changes.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/mapcomplete-changes/mapcomplete-changes.json) diff --git a/Docs/URL_Parameters.md b/Docs/URL_Parameters.md index 5dc4dbf5b..7d08ed73c 100644 --- a/Docs/URL_Parameters.md +++ b/Docs/URL_Parameters.md @@ -27,17 +27,17 @@ This document gives an overview of which URL-parameters can be used to influence 12. [ fs-homepage-link ](#-fs-homepage-link-) 13. [ fs-share-screen ](#-fs-share-screen-) 14. [ fs-geolocation ](#-fs-geolocation-) -15. [ fs-all-questions ](#-fs-all-questions-) -16. [ fs-export ](#-fs-export-) -17. [ test ](#-test-) -18. [ debug ](#-debug-) -19. [ moreprivacy ](#-moreprivacy-) -20. [ overpassUrl ](#-overpassurl-) -21. [ overpassTimeout ](#-overpasstimeout-) -22. [ overpassMaxZoom ](#-overpassmaxzoom-) -23. [ osmApiTileSize ](#-osmapitilesize-) -24. [ background ](#-background-) -25. [ fs-layers-enabled ](#-fs-layers-enabled-) +15. [ fs-layers-enabled ](#-fs-layers-enabled-) +16. [ fs-all-questions ](#-fs-all-questions-) +17. [ fs-export ](#-fs-export-) +18. [ test ](#-test-) +19. [ debug ](#-debug-) +20. [ moreprivacy ](#-moreprivacy-) +21. [ overpassUrl ](#-overpassurl-) +22. [ overpassTimeout ](#-overpasstimeout-) +23. [ overpassMaxZoom ](#-overpassmaxzoom-) +24. [ osmApiTileSize ](#-osmapitilesize-) +25. [ background ](#-background-) 26. [ z ](#-z-) 27. [ lat ](#-lat-) 28. [ lon ](#-lon-) @@ -251,12 +251,23 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src + fs-layers-enabled +------------------- + + If set to false, all layers will be disabled - except the explicitly enabled layers + +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L162) + + The default value is _true_ + + + fs-all-questions ------------------ Always show all questions -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L161) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L165) The default value is _false_ @@ -267,7 +278,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Enable the export as GeoJSON and CSV button -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L167) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L171) The default value is _true_ @@ -278,7 +289,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L181) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L185) The default value is _false_ @@ -289,7 +300,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src If true, shows some extra debugging help such as all the available tags on every object -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L187) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L191) The default value is _false_ @@ -300,7 +311,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src If true, the location distance indication will not be written to the changeset and other privacy enhancing measures might be taken. -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L193) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L197) The default value is _false_ @@ -311,7 +322,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L199) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L203) The default value is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_ @@ -322,7 +333,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Set a different timeout (in seconds) for queries in overpass -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L210) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L214) The default value is _30_ @@ -333,7 +344,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src point to switch between OSM-api and overpass -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L218) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L222) The default value is _16_ @@ -344,7 +355,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Tilesize when the OSM-API is used to fetch data within a BBOX -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L226) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L230) The default value is _17_ @@ -355,23 +366,12 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src The id of the background layer to start with -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L233) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L237) No default value set - fs-layers-enabled -------------------- - - If set to false, all layers will be disabled - except the explicitly enabled layers - -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L239) - - The default value is _true_ - - - z --- @@ -487,7 +487,7 @@ This documentation is defined in the source code at [FilteredLayer.ts](/src/Mode The mode the application starts in, e.g. 'map', 'dashboard' or 'statistics' -This documentation is defined in the source code at [generateDocs.ts](ervdvn/git/MapComplete/scripts/generateDocs.ts#L439) +This documentation is defined in the source code at [generateDocs.ts](ervdvn/git2/MapComplete/scripts/generateDocs.ts#L439) The default value is _map_ diff --git a/assets/layers/address/address.json b/assets/layers/address/address.json index 2afad5a08..c44d9d672 100644 --- a/assets/layers/address/address.json +++ b/assets/layers/address/address.json @@ -84,7 +84,8 @@ "pt_BR": "Endereço conhecido", "he": "כתובת ידועה", "eu": "Helbide ezaguna", - "it": "Indirizzo conosciuto" + "it": "Indirizzo conosciuto", + "zh_Hant": "已知的地址" } }, "pointRendering": [ @@ -255,7 +256,8 @@ "pt_BR": "Este endereço fica na rua {addr:street}", "he": "כתובת זו נמצאת ברחוב {addr:street}", "eu": "Helbide hau {addr:street} kalean dago", - "it": "L’indirizzo è in via {addr:street}" + "it": "L’indirizzo è in via {addr:street}", + "zh_Hant": "此地址位於街道 {addr:street}" }, "question": { "en": "What street is this address located in?", diff --git a/assets/layers/animal_shelter/animal_shelter.json b/assets/layers/animal_shelter/animal_shelter.json index 050e9f78f..08ea466dd 100644 --- a/assets/layers/animal_shelter/animal_shelter.json +++ b/assets/layers/animal_shelter/animal_shelter.json @@ -7,7 +7,8 @@ "zh_Hans": "动物收容所", "pt": "Abrigo para animais", "ca": "Refugis d'animals", - "pl": "Schroniska dla zwierząt" + "pl": "Schroniska dla zwierząt", + "fr": "Abri pour animaux" }, "description": { "en": "An animal shelter is a facility where animals in trouble are brought and facility's staff (volunteers or not) feeds them and cares of them, rehabilitating and healing them if necessary. This definition includes kennels for abandoned dogs, catteries for abandoned cats, shelters for other abandoned pets and wildlife recovery centres. ", @@ -26,7 +27,8 @@ "zh_Hans": "动物收容所", "pt": "Abrigo para animais", "ca": "Refugi d'animals", - "pl": "Schronisko dla zwierząt" + "pl": "Schronisko dla zwierząt", + "fr": "Un refuge animalier" }, "mappings": [ { @@ -75,7 +77,8 @@ "zh_Hans": "动物收容所", "pt": "um abrigo para animais", "ca": "un refugi d'animals", - "pl": "schronisko dla zwierząt" + "pl": "schronisko dla zwierząt", + "fr": "refuge animalier" }, "tags": [ "amenity=animal_shelter" @@ -96,14 +99,16 @@ "es": "¿Cómo se llama este refugio de animales?", "zh_Hans": "这个动物收容所叫什么名字?", "ca": "Quin nom té aquest refugi d'animals?", - "pl": "Jak nazywa się to schronisko dla zwierząt?" + "pl": "Jak nazywa się to schronisko dla zwierząt?", + "fr": "Quel est le nom de ce refuge animalier ?" }, "render": { "en": "This animal shelter is named {name}", "de": "Der Name des Tierheims lautet {name}", "es": "Este refugio de animales se llama {name}", "zh_Hans": "这个动物收容所叫 {name}", - "pl": "To schronisko dla zwierząt nazywa się {name}" + "pl": "To schronisko dla zwierząt nazywa się {name}", + "fr": "Ce refuge s'appelle {name}" } }, "website", @@ -127,7 +132,8 @@ "es": "Los animales permanecen aquí hasta que son adoptados por un nuevo propietario", "zh_Hans": "动物被饲养在这里直到被新主人收养", "ca": "Els animals romanen ací fins que son adoptats per un nou propietari", - "pl": "Zwierzęta są tutaj dopóki nie znajdą nowego właściciela" + "pl": "Zwierzęta są tutaj dopóki nie znajdą nowego właściciela", + "fr": "Les animaux sont gardés jusqu'à ce qu'ils soient adoptés par un nouveau maître" }, "if": "purpose=adoption" }, @@ -137,7 +143,8 @@ "de": "Tiere werden hier bis zum Ende Ihres Lebens untergebracht", "es": "Los animales reciben cuidados para el resto de su vida", "zh_Hans": "动物的余生都得到照顾", - "ca": "Els animals reben cures per a la resta de la seva vida" + "ca": "Els animals reben cures per a la resta de la seva vida", + "fr": "Les animaux sont recueillis pour le reste de leur vie" }, "if": "purpose=sanctuary" }, @@ -148,7 +155,8 @@ "es": "Los animales heridos se rehabilitan aquí hasta que pueden ser liberados de nuevo en la naturaleza ", "zh_Hans": "受伤的动物在这里康复,直到它们可以再次被释放到大自然中 ", "ca": "Els animals ferits es rehabiliten aquí fins que puguen ser alliberats de nou a la natura ", - "pl": "Ranne zwierzęta przechodzą tutaj rehabilitację do momentu, kiedy mogą zostać wypuszczone na wolność " + "pl": "Ranne zwierzęta przechodzą tutaj rehabilitację do momentu, kiedy mogą zostać wypuszczone na wolność ", + "fr": "Les animaux blessés sont soignés jusqu'à ce qu'ils soient en état d'être relâchés dans la nature " }, "if": "purpose=release" } diff --git a/assets/layers/atm/atm.json b/assets/layers/atm/atm.json index 46c265815..c9f3bb753 100644 --- a/assets/layers/atm/atm.json +++ b/assets/layers/atm/atm.json @@ -29,7 +29,8 @@ "pl": "Bankomaty do wypłacania pieniędzy", "pt_BR": "Caixas eletrônicos para sacar dinheiro", "pt": "Multibancos para levantar dinheiro", - "it": "Sportelli Bancomat per prelevare denaro" + "it": "Sportelli Bancomat per prelevare denaro", + "zh_Hant": "自動櫃員機以提款" }, "source": { "osmTags": "amenity=atm" diff --git a/assets/layers/bench/bench.json b/assets/layers/bench/bench.json index 8b23caf05..ede50afd2 100644 --- a/assets/layers/bench/bench.json +++ b/assets/layers/bench/bench.json @@ -196,7 +196,7 @@ "it": "Questa panchina non ha uno schienale", "ru": "Без спинки", "zh_Hans": "没有靠背", - "zh_Hant": "靠背:無", + "zh_Hant": "此長椅沒有靠背", "nb_NO": "Rygglene: Nei", "fi": "Selkänoja: ei", "pl": "Nie posiada oparcia", diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json index 2e9fee250..a48e6502a 100644 --- a/assets/layers/charging_station/charging_station.json +++ b/assets/layers/charging_station/charging_station.json @@ -2293,7 +2293,8 @@ "then": { "en": "Authentication by a membership card", "nl": "Aanmelden met een lidkaart is mogelijk", - "de": "Authentifizierung durch eine Mitgliedskarte" + "de": "Authentifizierung durch eine Mitgliedskarte", + "fr": "Authentification par carte de membre" } }, { @@ -2302,7 +2303,8 @@ "then": { "en": "Authentication by an app", "nl": "Aanmelden via een applicatie is mogelijk", - "de": "Authentifizierung per App" + "de": "Authentifizierung per App", + "fr": "Authentification par une application" } }, { @@ -2311,7 +2313,8 @@ "then": { "en": "Authentication via phone call is available", "nl": "Aanmelden door te bellen naar een telefoonnummer is mogelijk", - "de": "Authentifizierung per Anruf ist möglich" + "de": "Authentifizierung per Anruf ist möglich", + "fr": "Authentification possible par appel téléphonique" } }, { @@ -2320,7 +2323,8 @@ "then": { "en": "Authentication via SMS is available", "nl": "Aanmelden via SMS is mogelijk", - "de": "Authentifizierung per SMS ist möglich" + "de": "Authentifizierung per SMS ist möglich", + "fr": "Authentification possible par SMS" } }, { @@ -2650,6 +2654,7 @@ "nl": "Dit oplaadpunt werkt", "ca": "Aquesta estació de càrrega funciona", "de": "Die Station ist in Betrieb", + "fr": "Cette station de recharge fonctionne", "pl": "Ta stacja ładowania działa" } }, diff --git a/assets/layers/maxspeed/maxspeed.json b/assets/layers/maxspeed/maxspeed.json index 4353221d0..364a05be5 100644 --- a/assets/layers/maxspeed/maxspeed.json +++ b/assets/layers/maxspeed/maxspeed.json @@ -19,7 +19,8 @@ "ca": "Mostra la velocitat permesa per a cada carretera", "fr": "Affiche les vitesses autorisées sur toutes les routes", "pl": "Pokazuje dozwoloną prędkość na każdej drodze", - "es": "Muestra la velocidad permitida para cada carretera" + "es": "Muestra la velocidad permitida para cada carretera", + "zh_Hant": "顯示每條道路的允許速度" }, "source": { "osmTags": { diff --git a/assets/layers/note/note.json b/assets/layers/note/note.json index 9d542c8b8..05e5d942d 100644 --- a/assets/layers/note/note.json +++ b/assets/layers/note/note.json @@ -6,7 +6,8 @@ "de": "OpenStreetMap-Hinweise", "es": "Notas de OpenStreetMap", "ca": "Notes d'OpenStreetMap", - "cs": "Poznámky OpenStreetMap" + "cs": "Poznámky OpenStreetMap", + "fr": "Notes OpenStreetMap" }, "description": "This layer shows notes on OpenStreetMap. Having this layer in your theme will trigger the 'add new note' functionality in the 'addNewPoint'-popup (or if your theme has no presets, it'll enable adding notes)", "source": { @@ -33,7 +34,8 @@ "es": "Nota", "pa_PK": "نوٹ", "pl": "Notatka", - "cs": "Poznámka" + "cs": "Poznámka", + "fr": "Note" }, "mappings": [ { @@ -45,7 +47,8 @@ "es": "Nota cerrada", "pl": "Zamknięta notatka", "ca": "Nota tancada", - "cs": "Uzavřená poznámka" + "cs": "Uzavřená poznámka", + "fr": "Note fermée" } } ] @@ -56,7 +59,8 @@ "en": "See on OpenStreetMap.org", "nl": "Bekijk op OpenStreetMap.org", "de": "Auf OpenStreetMap.org ansehen", - "da": "Se på OpenStreetMap.org" + "da": "Se på OpenStreetMap.org", + "fr": "Voir sur OpenStreetMap.org" }, "render": "" } @@ -118,7 +122,8 @@ "es": "

Imágenes cercanas

Las imágenes de debajo son imágenes geoetiquetadas cercanas y pueden ser útiles para encargarse de esta nota.", "nl": "

Afbeeldingen in de buurt

Onderstaande afbeeldingen zijn afbeeldingen met geo-referentie en die in de buurt genomen zijn. Mogelijks zijn ze nuttig om deze kaartnota af te handelen.", "ca": "

Imatges properes

Les imatges de sota són imatges geoetiquetades properes i poden ser útils per a encarregar-se d'aquesta nota.", - "cs": "

Obrázky v okolí

Obrázky níže jsou obrázky s geografickými značkami v okolí a mohou vám pomoci s touto poznámkou." + "cs": "

Obrázky v okolí

Obrázky níže jsou obrázky s geografickými značkami v okolí a mohou vám pomoci s touto poznámkou.", + "fr": "

Images à proximité

Les images suivantes sont dans les environs de cette note et pourraient aider à sa résolution." }, "special": { "type": "nearby_images", @@ -134,7 +139,8 @@ "de": "", "es": "Reportar {_first_user} por spam o mensajes inapropiados", "ca": "Reporta {_first_user} per spam o missatges inapropiats", - "cs": "Nahlásit uživateli {_first_user} spam nebo nevhodné zprávy" + "cs": "Nahlásit uživateli {_first_user} spam nebo nevhodné zprávy", + "fr": "Signaler {_first_user} pour du spam ou des messages inapropriés" }, "condition": "_opened_by_anonymous_user=false" }, @@ -146,7 +152,8 @@ "de": "Notiz als Spam oder unangemessen melden", "es": "Reporta esta nota como spam o inapropiada", "ca": "Reporta aquesta nota com spam o inapropiada", - "cs": "Nahlásit tuto poznámku jako spam nebo nevhodnou" + "cs": "Nahlásit tuto poznámku jako spam nebo nevhodnou", + "fr": "Signaler cette note comme spam ou contenu inapproprié" } } ], @@ -231,7 +238,8 @@ "de": "Nicht erstellt von {search}", "es": "No abierto por el contributor {search}", "ca": "No obert pel contribuïdor {search}", - "cs": "Není otevřeno přispěvatelem {search}" + "cs": "Není otevřeno přispěvatelem {search}", + "fr": "Exclureles notes ouvertes par {search}" } } ] @@ -253,7 +261,8 @@ "es": "Editada por última vez por el contributor {search}", "ca": "Editat per última vega pel contribuïdor {search}", "cs": "Naposledy upravil přispěvatel {search}", - "da": "Senest redigeret af bidragsyder {search}" + "da": "Senest redigeret af bidragsyder {search}", + "fr": "Dernière modification par {search}" } } ] @@ -274,7 +283,8 @@ "de": "Zuletzt bearbeitet nach dem {search}", "es": "Abierta después de {search}", "ca": "Oberta després de {search}", - "cs": "Otevřeno po {search}" + "cs": "Otevřeno po {search}", + "fr": "Ouverte après le {search}" } } ] @@ -296,7 +306,8 @@ "de": "Erstellt vor dem {search}", "es": "Creada antes de {search}", "ca": "Creada abans de {search}", - "cs": "Vytvořeno před {search}" + "cs": "Vytvořeno před {search}", + "fr": "Créée avant le {search}" } } ] @@ -318,7 +329,8 @@ "de": "Erstellt nach dem {search}", "es": "Creada después de {search}", "ca": "Creada després de {search}", - "cs": "Vytvořeno po {search}" + "cs": "Vytvořeno po {search}", + "fr": "Créée après le {search}" } } ] @@ -334,7 +346,8 @@ "de": "Nur Notizen anzeigen, die anonym erstellt wurden", "es": "Solo mostrar las notas abiertas por contributores anómimos", "ca": "Sols mostrar les notes obertes per contribuïdors anònims", - "cs": "Zobrazovat pouze poznámky otevřené anonymním přispěvatelem" + "cs": "Zobrazovat pouze poznámky otevřené anonymním přispěvatelem", + "fr": "Montrer uniquement les notes ouvertes par un contributeur anonyme" } } ] @@ -350,7 +363,8 @@ "de": "Nur offene Notizen anzeigen", "es": "Solo mostrar las notas abiertas", "ca": "Sols mostra les notes obertes", - "cs": "Zobrazit pouze otevřené poznámky" + "cs": "Zobrazit pouze otevřené poznámky", + "fr": "Montrer uniquement les notes ouvertes" } } ] @@ -365,7 +379,8 @@ "de": "Alle Notizen", "es": "Todas las notas", "ca": "Totes les notes", - "cs": "Všechny poznámky" + "cs": "Všechny poznámky", + "fr": "Toutes les notes" } }, { diff --git a/assets/layers/visitor_information_centre/visitor_information_centre.json b/assets/layers/visitor_information_centre/visitor_information_centre.json index a68f472c7..3d02ab61d 100644 --- a/assets/layers/visitor_information_centre/visitor_information_centre.json +++ b/assets/layers/visitor_information_centre/visitor_information_centre.json @@ -43,7 +43,8 @@ "id": "{name}", "es": "{name}", "da": "{name}", - "cs": "{name}" + "cs": "{name}", + "zh_Hant": "{name}" }, "mappings": [ { @@ -73,7 +74,8 @@ "id": "{name}", "es": "{name}", "da": "{name}", - "cs": "{name}" + "cs": "{name}", + "zh_Hant": "{name}" } } ] diff --git a/assets/layers/waste_basket/waste_basket.json b/assets/layers/waste_basket/waste_basket.json index fe732b1da..a3892b548 100644 --- a/assets/layers/waste_basket/waste_basket.json +++ b/assets/layers/waste_basket/waste_basket.json @@ -321,7 +321,8 @@ "da": "Alle typer", "ca": "Tots els tipus", "fr": "Tout type", - "cs": "Všechny typy" + "cs": "Všechny typy", + "zh_Hant": "所有類型" } }, { diff --git a/assets/layers/waste_disposal/waste_disposal.json b/assets/layers/waste_disposal/waste_disposal.json index a088f949a..ef29ef7fa 100644 --- a/assets/layers/waste_disposal/waste_disposal.json +++ b/assets/layers/waste_disposal/waste_disposal.json @@ -35,7 +35,8 @@ "id": "Pembuangan Limbah", "da": "Bortskaffelse af affald", "ca": "Contenidor de fem", - "cs": "Nakládání s odpady" + "cs": "Nakládání s odpady", + "zh_Hant": "廢棄物處理" } }, "pointRendering": [ @@ -68,7 +69,8 @@ "da": "en affaldsbeholder", "ca": "un contenidor de basura", "cs": "koš na odpadky", - "pl": "kosz na śmieci" + "pl": "kosz na śmieci", + "zh_Hant": "廢棄物處理桶" }, "tags": [ "amenity=waste_disposal" @@ -95,7 +97,8 @@ "de": "Was für ein Abfalleimer ist das?", "ca": "Quin tipus de contenidor de brossa és aquest?", "cs": "Co je to za odpadkový koš?", - "pl": "Co to za pojemnik na śmieci?" + "pl": "Co to za pojemnik na śmieci?", + "zh_Hant": "這是甚麼種類的廢棄物處理箱?" }, "mappings": [ { @@ -104,7 +107,8 @@ "en": "This is a medium to large bin for disposal of (household) waste", "de": "Dies ist eine Mülltonne oder ein Müllcontainer für (Haushalts-)Abfälle", "ca": "Es tracta d'un contenidor mitjà o gran per a dipositar residus (domèstics)", - "cs": "Jedná se o střední až velkou popelnici na (domovní) odpad" + "cs": "Jedná se o střední až velkou popelnici na (domovní) odpad", + "zh_Hant": "這是一個中型至大型的桶,用於處理(家庭)廢棄物" } }, { @@ -114,7 +118,8 @@ "de": "Dies ist eigentlich ein Recyclingcontainer", "ca": "En realitat es tracta d'un contenidor de reciclatge", "cs": "To je vlastně recyklační kontejner", - "pl": "W rzeczywistości jest to pojemnik do recyklingu" + "pl": "W rzeczywistości jest to pojemnik do recyklingu", + "zh_Hant": "這實際上是一個回收容器" }, "addExtraTags": [ "recycling_type=container" @@ -132,7 +137,8 @@ "id": "Akses: {access}", "da": "Adgang: {access}", "ca": "Accés: {access}", - "cs": "Přístup: {access}" + "cs": "Přístup: {access}", + "zh_Hant": "存取:{access}" }, "question": { "en": "Who can use this waste disposal bin?", @@ -143,7 +149,8 @@ "da": "Hvem kan bruge denne affaldsbeholder?", "ca": "Qui pot utilitzar aquest contenidor de brossa?", "cs": "Kdo může používat tento koš na odpadky?", - "pl": "Kto może korzystać z tego pojemnika na odpady?" + "pl": "Kto może korzystać z tego pojemnika na odpady?", + "zh_Hant": "誰可以使用這個廢棄物處理桶?" }, "freeform": { "key": "access", @@ -161,7 +168,8 @@ "da": "Denne skraldespand kan bruges af alle", "ca": "Aquest contenidor es pot utilitzat per qualsevol", "cs": "Tento koš může používat kdokoli", - "pl": "Z tego pojemnika może korzystać każdy" + "pl": "Z tego pojemnika może korzystać każdy", + "zh_Hant": "這個桶可以給任何人使用" } }, { @@ -175,7 +183,8 @@ "da": "Denne skraldespand er privat", "ca": "Aquest contenidor és privat", "cs": "Tento koš je soukromý", - "pl": "Ten kosz jest prywatny" + "pl": "Ten kosz jest prywatny", + "zh_Hant": "這個桶是私人的" } }, { @@ -189,7 +198,8 @@ "da": "Denne skraldespand er kun for beboere", "ca": "Aquest contenidor és només per als residents", "cs": "Tento koš je určen pouze pro obyvatele", - "pl": "Ten kosz jest przeznaczony wyłącznie dla mieszkańców" + "pl": "Ten kosz jest przeznaczony wyłącznie dla mieszkańców", + "zh_Hant": "這個桶僅供居民使用" } } ] @@ -205,7 +215,8 @@ "da": "Hvor er denne container placeret?", "ca": "On es troba aquest contenidor?", "cs": "Kde se nachází tento kontejner?", - "pl": "Gdzie znajduje się ten kontener?" + "pl": "Gdzie znajduje się ten kontener?", + "zh_Hant": "這個容器位於哪裡?" }, "mappings": [ { @@ -219,7 +230,8 @@ "da": "Dette er en underjordisk container", "ca": "Aquest contenidor està soterrat", "cs": "Jedná se o podzemní kontejner", - "pl": "To jest podziemny kontener" + "pl": "To jest podziemny kontener", + "zh_Hant": "這是一個地下容器" } }, { @@ -233,7 +245,8 @@ "da": "Denne container er placeret indendørs", "ca": "Aquest contenidor està situat a l'interior", "cs": "Tento kontejner se nachází uvnitř", - "pl": "Kontener ten znajduje się w pomieszczeniu zamkniętym" + "pl": "Kontener ten znajduje się w pomieszczeniu zamkniętym", + "zh_Hant": "這個容器位於室內" } }, { @@ -247,7 +260,8 @@ "da": "Denne container er placeret udendørs", "ca": "Aquest contenidor està situat a l'aire lliure", "cs": "Tento kontejner se nachází venku", - "pl": "Kontener ten znajduje się na zewnątrz" + "pl": "Kontener ten znajduje się na zewnątrz", + "zh_Hant": "這個容器位於室外" } } ] diff --git a/assets/layers/windturbine/windturbine.json b/assets/layers/windturbine/windturbine.json index 427ba82f1..9d4144743 100644 --- a/assets/layers/windturbine/windturbine.json +++ b/assets/layers/windturbine/windturbine.json @@ -19,7 +19,8 @@ "da": "Moderne vindmøller til produktion af elektricitet", "ca": "Molins de vent moderns que generen electricitat", "cs": "Moderní větrné mlýny vyrábějící elektřinu", - "pl": "Nowoczesne wiatraki wytwarzające energię elektryczną" + "pl": "Nowoczesne wiatraki wytwarzające energię elektryczną", + "zh_Hant": "現代風車產生電力" }, "source": { "osmTags": "generator:source=wind" @@ -281,7 +282,8 @@ "sl": "Dodatne informacije za OpenStreetMap strokovnjake: {fixme}", "es": "Información extra para expertos en OpenStreetMap: {fixme}", "ca": "Informació addicional per als experts en OpenStreetMap: {fixme}", - "cs": "Další informace pro odborníky na OpenStreetMap: {fixme}" + "cs": "Další informace pro odborníky na OpenStreetMap: {fixme}", + "zh_Hant": "為 OpenStreetMap 專家提供的額外資訊:{fixme}" }, "question": { "en": "Is there something wrong with how this is mapped, that you weren't able to fix here? (leave a note to OpenStreetMap experts)", diff --git a/assets/themes/atm/atm.json b/assets/themes/atm/atm.json index cd6fee3ae..853e60a45 100644 --- a/assets/themes/atm/atm.json +++ b/assets/themes/atm/atm.json @@ -27,7 +27,7 @@ "nb_NO": "Viser minibanker for å ta ut eller sette inn penger", "es": "Este mapa muestra los cajeros automáticos para retirar o ingresar dinero", "id": "Peta ini menunjukkan ATM untuk menarik atau menyetorkan uang", - "zh_Hant": "此地圖顯示了提款或存款的 ATM", + "zh_Hant": "此地圖顯示了提款或存款的自動櫃員機", "eu": "Mapa honek dirua atera edo sartzeko kutxazain automatikoak erakusten ditu", "it": "Questa mappa mostra gli sportelli Bancomat per ritirare o depositare del denaro", "pl": "Ta mapa pokazuje bankomaty, w których można wypłacać lub wpłacać pieniądze", diff --git a/assets/themes/clock/clock.json b/assets/themes/clock/clock.json index faad831aa..958d664cf 100644 --- a/assets/themes/clock/clock.json +++ b/assets/themes/clock/clock.json @@ -17,7 +17,7 @@ "nl": "Kaart met alle openbare klokken", "ca": "Mapa amb tots els rellotges públics", "de": "Eine Karte mit öffentlichen Uhren", - "es": "Mapa con todos los relojes públicos", + "es": "Mapa mostrando todos los relojes públicos", "cs": "Mapa zobrazující veřejné hodiny", "fr": "Carte affichant toutes les horloges publiques", "pl": "Mapa pokazująca wszystkie zegary publiczne", diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json index 609aa246a..71a45eb7f 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json @@ -1,20 +1,13 @@ { "id": "mapcomplete-changes", "title": { - "en": "Changes made with MapComplete", - "da": "Ændringer lavet med MapComplete", - "de": "Änderungen mit MapComplete" + "en": "Changes made with MapComplete" }, "shortDescription": { - "en": "Shows changes made by MapComplete", - "da": "Vis ændringer lavet med MapComplete", - "de": "Änderungen von MapComplete anzeigen" + "en": "Shows changes made by MapComplete" }, "description": { - "en": "This maps shows all the changes made with MapComplete", - "da": "Dette kort viser alle ændringer foretaget med MapComplete", - "de": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen", - "pl": "Ta mapa pokazuje wszystkie zmiany wprowadzone za pomocą MapComplete" + "en": "This maps shows all the changes made with MapComplete" }, "icon": "./assets/svg/logo.svg", "hideFromOverview": true, @@ -25,9 +18,7 @@ { "id": "mapcomplete-changes", "name": { - "en": "Changeset centers", - "de": "Zentrum der Änderungssätze", - "zh_Hant": "變更集中心" + "en": "Changeset centers" }, "minzoom": 0, "source": { @@ -37,51 +28,41 @@ }, "title": { "render": { - "en": "Changeset for {theme}", - "de": "Änderungssatz für {theme}" + "en": "Changeset for {theme}" } }, "description": { - "en": "Shows all MapComplete changes", - "da": "Vis alle MapComplete-ændringer", - "de": "Alle MapComplete-Änderungen anzeigen" + "en": "Shows all MapComplete changes" }, "tagRenderings": [ { "id": "show_changeset_id", "render": { - "en": "Changeset {id}", - "de": "Änderungssatz {id}" + "en": "Changeset {id}" } }, { "id": "contributor", "question": { - "en": "What contributor did make this change?", - "da": "Hvilke bidragsydere lavede denne ændring?", - "de": "Welcher Mitwirkende hat diese Änderung vorgenommen?" + "en": "What contributor did make this change?" }, "freeform": { "key": "user" }, "render": { - "en": "Change made by {user}", - "da": "Ændring lavet af {user}", - "de": "Änderung vorgenommen von {user}" + "en": "Change made by {user}" } }, { "id": "theme-id", "question": { - "en": "What theme was used to make this change?", - "de": "Welches Thema wurde für die Änderung verwendet?" + "en": "What theme was used to make this change?" }, "freeform": { "key": "theme" }, "render": { - "en": "Change with theme {theme}", - "de": "Geändert mit Thema {theme}" + "en": "Change with theme {theme}" } }, { @@ -90,23 +71,19 @@ "key": "locale" }, "question": { - "en": "What locale (language) was this change made in?", - "de": "In welcher Benutzersprache wurde die Änderung vorgenommen?" + "en": "What locale (language) was this change made in?" }, "render": { - "en": "User locale is {locale}", - "de": "Benutzersprache {locale}" + "en": "User locale is {locale}" } }, { "id": "host", "render": { - "en": "Change with with {host}", - "de": "Änderung über {host}" + "en": "Change with with {host}" }, "question": { - "en": "What host (website) was this change made with?", - "de": "Über welchen Host (Webseite) wurde diese Änderung vorgenommen?" + "en": "What host (website) was this change made with?" }, "freeform": { "key": "host" @@ -127,13 +104,10 @@ { "id": "version", "question": { - "en": "What version of MapComplete was used to make this change?", - "de": "Mit welcher MapComplete Version wurde die Änderung vorgenommen?" + "en": "What version of MapComplete was used to make this change?" }, "render": { - "en": "Made with {editor}", - "da": "Lavet med {editor}", - "de": "Erstellt mit {editor}" + "en": "Made with {editor}" }, "freeform": { "key": "editor" @@ -519,10 +493,7 @@ } ], "question": { - "en": "Themename contains {search}", - "da": "Temanavn indeholder {search}", - "de": "Themenname enthält {search}", - "pl": "Nazwa tematu zawiera {search}" + "en": "Themename contains {search}" } } ] @@ -538,9 +509,7 @@ } ], "question": { - "en": "Themename does not contain {search}", - "da": "Temanavn indeholder ikke {search}", - "de": "Themename enthält not {search}" + "en": "Themename does not contain {search}" } } ] @@ -556,9 +525,7 @@ } ], "question": { - "en": "Made by contributor {search}", - "da": "Lavet af bidragsyder {search}", - "de": "Erstellt vom Mitwirkenden {search}" + "en": "Made by contributor {search}" } } ] @@ -574,9 +541,7 @@ } ], "question": { - "en": "Not made by contributor {search}", - "da": "Ikke lavet af bidragsyder {search}", - "de": "Nicht erstellt von Mitwirkendem {search}" + "en": "Not made by contributor {search}" } } ] @@ -593,9 +558,7 @@ } ], "question": { - "en": "Made before {search}", - "da": "Lavet før {search}", - "de": "Erstellt vor {search}" + "en": "Made before {search}" } } ] @@ -612,9 +575,7 @@ } ], "question": { - "en": "Made after {search}", - "da": "Lavet efter {search}", - "de": "Erstellt nach {search}" + "en": "Made after {search}" } } ] @@ -630,8 +591,7 @@ } ], "question": { - "en": "User language (iso-code) {search}", - "de": "Benutzersprache (ISO-Code) {search}" + "en": "User language (iso-code) {search}" } } ] @@ -647,8 +607,7 @@ } ], "question": { - "en": "Made with host {search}", - "de": "Erstellt mit Host {search}" + "en": "Made with host {search}" } } ] @@ -659,8 +618,7 @@ { "osmTags": "add-image>0", "question": { - "en": "Changeset added at least one image", - "de": "Änderungssatz hat mindestens ein Bild hinzugefügt" + "en": "Changeset added at least one image" } } ] @@ -671,8 +629,7 @@ { "osmTags": "theme!=grb", "question": { - "en": "Exclude GRB theme", - "de": "GRB-Thema ausschließen" + "en": "Exclude GRB theme" } } ] @@ -683,8 +640,7 @@ { "osmTags": "theme!=etymology", "question": { - "en": "Exclude etymology theme", - "de": "Etymologie-Thema ausschließen" + "en": "Exclude etymology theme" } } ] @@ -699,8 +655,7 @@ { "id": "link_to_more", "render": { - "en": "More statistics can be found here", - "de": "Weitere Statistiken gibt es hier" + "en": "More statistics can be found here" } }, { diff --git a/assets/themes/toilets/toilets.json b/assets/themes/toilets/toilets.json index b8614b72e..eedfb97e1 100644 --- a/assets/themes/toilets/toilets.json +++ b/assets/themes/toilets/toilets.json @@ -9,7 +9,7 @@ "ja": "オープントイレマップ", "zh_Hant": "公共廁所", "pl": "Publiczne toalety", - "it": "Mappa libera delle toilet", + "it": "Servizi igienici pubblici", "nb_NO": "Åpent toalettkart", "hu": "WC-térkép", "ca": "Lavabos públics", diff --git a/langs/layers/fr.json b/langs/layers/fr.json index 707444a8e..b7f5addd5 100644 --- a/langs/layers/fr.json +++ b/langs/layers/fr.json @@ -35,23 +35,6 @@ "1": { "title": "un panneau à affiches scellé au sol" }, - "10": { - "description": "Une pièce de textile imperméable avec un message imprimé, ancrée de façon permanente sur un mur.", - "title": "une bâche" - }, - "11": { - "title": "un totem" - }, - "12": { - "description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées", - "title": "une enseigne" - }, - "13": { - "title": "une sculpture" - }, - "14": { - "title": "une peinture murale" - }, "2": { "title": "un panneau à affiches monté sur un mur" }, @@ -77,6 +60,23 @@ }, "9": { "title": "un écran fixé sur un abri de transport" + }, + "10": { + "description": "Une pièce de textile imperméable avec un message imprimé, ancrée de façon permanente sur un mur.", + "title": "une bâche" + }, + "11": { + "title": "un totem" + }, + "12": { + "description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées", + "title": "une enseigne" + }, + "13": { + "title": "une sculpture" + }, + "14": { + "title": "une peinture murale" } }, "tagRenderings": { @@ -168,9 +168,6 @@ "1": { "then": "C'est un petit panneau" }, - "10": { - "then": "C'est une peinture murale" - }, "2": { "then": "C'est une colonne" }, @@ -194,6 +191,9 @@ }, "9": { "then": "C'est un totem" + }, + "10": { + "then": "C'est une peinture murale" } }, "question": "De quel type de dispositif publicitaire s'agit-il ?", @@ -205,9 +205,6 @@ "1": { "then": "Petit panneau" }, - "10": { - "then": "Peinture murale" - }, "3": { "then": "Colonne" }, @@ -228,6 +225,9 @@ }, "9": { "then": "Totem" + }, + "10": { + "then": "Peinture murale" } } } @@ -358,15 +358,6 @@ "1": { "then": "Peinture murale" }, - "10": { - "then": "Azulejo (faïence latine)" - }, - "11": { - "then": "Carrelage" - }, - "12": { - "then": "Sculpture sur bois" - }, "2": { "then": "Peinture" }, @@ -390,6 +381,15 @@ }, "9": { "then": "Relief" + }, + "10": { + "then": "Azulejo (faïence latine)" + }, + "11": { + "then": "Carrelage" + }, + "12": { + "then": "Sculpture sur bois" } }, "question": "Quel est le type de cette œuvre d'art ?", @@ -2506,15 +2506,6 @@ "1": { "then": "Cette piste cyclable est goudronée" }, - "10": { - "then": "Cette piste cyclable est faite en graviers fins" - }, - "11": { - "then": "Cette piste cyclable est en cailloux" - }, - "12": { - "then": "Cette piste cyclable est faite en sol brut" - }, "2": { "then": "Cette piste cyclable est asphaltée" }, @@ -2538,6 +2529,15 @@ }, "9": { "then": "Cette piste cyclable est faite en graviers" + }, + "10": { + "then": "Cette piste cyclable est faite en graviers fins" + }, + "11": { + "then": "Cette piste cyclable est en cailloux" + }, + "12": { + "then": "Cette piste cyclable est faite en sol brut" } }, "question": "De quoi est faite la surface de la piste cyclable ?", @@ -2586,15 +2586,6 @@ "1": { "then": "Cette piste cyclable est pavée" }, - "10": { - "then": "Cette piste cyclable est faite en graviers fins" - }, - "11": { - "then": "Cette piste cyclable est en cailloux" - }, - "12": { - "then": "Cette piste cyclable est faite en sol brut" - }, "2": { "then": "Cette piste cyclable est asphaltée" }, @@ -2618,6 +2609,15 @@ }, "9": { "then": "Cette piste cyclable est faite en graviers" + }, + "10": { + "then": "Cette piste cyclable est faite en graviers fins" + }, + "11": { + "then": "Cette piste cyclable est en cailloux" + }, + "12": { + "then": "Cette piste cyclable est faite en sol brut" } }, "question": "De quel materiel est faite cette rue ?", @@ -3467,21 +3467,6 @@ "1": { "then": "C'est une friterie" }, - "10": { - "then": "Des plats chinois sont servis ici" - }, - "11": { - "then": "Des plats grecs sont servis ici" - }, - "12": { - "then": "Des plats indiens sont servis ici" - }, - "13": { - "then": "Des plats turcs sont servis ici" - }, - "14": { - "then": "Des plats thaïlandais sont servis ici" - }, "2": { "then": "Restaurant Italien" }, @@ -3505,6 +3490,21 @@ }, "9": { "then": "Des plats français sont servis ici" + }, + "10": { + "then": "Des plats chinois sont servis ici" + }, + "11": { + "then": "Des plats grecs sont servis ici" + }, + "12": { + "then": "Des plats indiens sont servis ici" + }, + "13": { + "then": "Des plats turcs sont servis ici" + }, + "14": { + "then": "Des plats thaïlandais sont servis ici" } }, "question": "Quelle type de nourriture est servie ici ?", @@ -3898,11 +3898,11 @@ }, "room-type": { "mappings": { - "14": { - "then": "C'est un bureau" - }, "4": { "then": "C'est une salle de classe" + }, + "14": { + "then": "C'est un bureau" } } } @@ -4183,18 +4183,6 @@ "1": { "then": "C'est une plaque" }, - "10": { - "then": "C'est une croix" - }, - "11": { - "then": "C'est une plaque bleue (spécifique aux pays anglo-saxons)" - }, - "12": { - "then": "C'est un char historique, placé de manière permanente dans l'espace public comme mémorial" - }, - "13": { - "then": "C'est un arbre du souvenir" - }, "2": { "then": "C'est un banc commémoratif" }, @@ -4218,6 +4206,18 @@ }, "9": { "then": "C'est un obélisque" + }, + "10": { + "then": "C'est une croix" + }, + "11": { + "then": "C'est une plaque bleue (spécifique aux pays anglo-saxons)" + }, + "12": { + "then": "C'est un char historique, placé de manière permanente dans l'espace public comme mémorial" + }, + "13": { + "then": "C'est un arbre du souvenir" } }, "question": "C'est un mémorial de guerre", @@ -4355,13 +4355,6 @@ }, "note": { "filter": { - "10": { - "options": { - "0": { - "question": "Toutes les notes" - } - } - }, "2": { "options": { "0": { @@ -4417,6 +4410,13 @@ "question": "Montrer uniquement les notes ouvertes" } } + }, + "10": { + "options": { + "0": { + "question": "Toutes les notes" + } + } } }, "name": "Notes OpenStreetMap", @@ -5392,6 +5392,30 @@ "1": { "question": "Recyclage de piles et batteries domestiques" }, + "2": { + "question": "Recyclage d'emballage de boissons" + }, + "3": { + "question": "Recyclage de boites de conserve et de canettes" + }, + "4": { + "question": "Recyclage de vêtements" + }, + "5": { + "question": "Recyclage des huiles de friture" + }, + "6": { + "question": "Recyclage des huiles de moteur" + }, + "7": { + "question": "Recyclage des lampes fluorescentes" + }, + "8": { + "question": "Recyclage des déchets verts" + }, + "9": { + "question": "Recyclage des bouteilles en verre et des bocaux" + }, "10": { "question": "Recyclage de tout type de verre" }, @@ -5422,35 +5446,11 @@ "19": { "question": "Recyclage des autres déchets" }, - "2": { - "question": "Recyclage d'emballage de boissons" - }, "20": { "question": "Recyclage des cartouches d'imprimante" }, "21": { "question": "Recyclage des vélos" - }, - "3": { - "question": "Recyclage de boites de conserve et de canettes" - }, - "4": { - "question": "Recyclage de vêtements" - }, - "5": { - "question": "Recyclage des huiles de friture" - }, - "6": { - "question": "Recyclage des huiles de moteur" - }, - "7": { - "question": "Recyclage des lampes fluorescentes" - }, - "8": { - "question": "Recyclage des déchets verts" - }, - "9": { - "question": "Recyclage des bouteilles en verre et des bocaux" } } }, @@ -5513,6 +5513,30 @@ "1": { "then": "Les briques alimentaires en carton peuvent être recyclées ici" }, + "2": { + "then": "Les boites de conserve et canettes peuvent être recyclées ici" + }, + "3": { + "then": "Les vêtements peuvent être recyclés ici" + }, + "4": { + "then": "Les huiles de friture peuvent être recyclées ici" + }, + "5": { + "then": "Les huiles de moteur peuvent être recyclées ici" + }, + "6": { + "then": "Les lampes fluorescentes peuvent être recyclées ici" + }, + "7": { + "then": "Les déchets verts peuvent être recyclés ici" + }, + "8": { + "then": "Les déchets organiques peuvent être recyclés ici" + }, + "9": { + "then": "Les bouteilles en verre et bocaux peuvent être recyclés ici" + }, "10": { "then": "Tout type de verre peut être recyclé ici" }, @@ -5540,9 +5564,6 @@ "19": { "then": "La ferraille peut être recyclée ici" }, - "2": { - "then": "Les boites de conserve et canettes peuvent être recyclées ici" - }, "20": { "then": "Les chaussures peuvent être recyclées ici" }, @@ -5560,27 +5581,6 @@ }, "25": { "then": "Les vélos peuvent être recyclés ici" - }, - "3": { - "then": "Les vêtements peuvent être recyclés ici" - }, - "4": { - "then": "Les huiles de friture peuvent être recyclées ici" - }, - "5": { - "then": "Les huiles de moteur peuvent être recyclées ici" - }, - "6": { - "then": "Les lampes fluorescentes peuvent être recyclées ici" - }, - "7": { - "then": "Les déchets verts peuvent être recyclés ici" - }, - "8": { - "then": "Les déchets organiques peuvent être recyclés ici" - }, - "9": { - "then": "Les bouteilles en verre et bocaux peuvent être recyclés ici" } }, "question": "Que peut-on recycler ici ?" @@ -7029,27 +7029,6 @@ "1": { "question": "Vente de boissons" }, - "10": { - "question": "Vente de lait" - }, - "11": { - "question": "Vente de pain" - }, - "12": { - "question": "Vente d'œufs" - }, - "13": { - "question": "Vente de fromage" - }, - "14": { - "question": "Vente de miel" - }, - "15": { - "question": "Vente de pommes de terre" - }, - "19": { - "question": "Vente de fleurs" - }, "2": { "question": "Ventre de confiseries" }, @@ -7073,6 +7052,27 @@ }, "9": { "question": "Vente de chambres à air pour vélo" + }, + "10": { + "question": "Vente de lait" + }, + "11": { + "question": "Vente de pain" + }, + "12": { + "question": "Vente d'œufs" + }, + "13": { + "question": "Vente de fromage" + }, + "14": { + "question": "Vente de miel" + }, + "15": { + "question": "Vente de pommes de terre" + }, + "19": { + "question": "Vente de fleurs" } } } @@ -7130,24 +7130,6 @@ "1": { "then": "Vent des confiseries" }, - "10": { - "then": "Vent du pain" - }, - "11": { - "then": "Vent des œufs" - }, - "12": { - "then": "Vent du fromage" - }, - "13": { - "then": "Vent du miel" - }, - "14": { - "then": "Vent des pommes de terre" - }, - "18": { - "then": "Vent des fleurs" - }, "2": { "then": "Vent de la nourriture" }, @@ -7171,6 +7153,24 @@ }, "9": { "then": "Vent du lait" + }, + "10": { + "then": "Vent du pain" + }, + "11": { + "then": "Vent des œufs" + }, + "12": { + "then": "Vent du fromage" + }, + "13": { + "then": "Vent du miel" + }, + "14": { + "then": "Vent des pommes de terre" + }, + "18": { + "then": "Vent des fleurs" } }, "question": "Que vent ce distributeur ?", @@ -7373,4 +7373,4 @@ "render": "éolienne" } } -} +} \ No newline at end of file diff --git a/langs/layers/zh_Hant.json b/langs/layers/zh_Hant.json index fbd88d294..615b0e8fd 100644 --- a/langs/layers/zh_Hant.json +++ b/langs/layers/zh_Hant.json @@ -56,12 +56,6 @@ "1": { "then": "壁畫" }, - "10": { - "then": "Azulejo (西班牙雕塑作品名稱)" - }, - "11": { - "then": "瓷磚" - }, "2": { "then": "繪畫" }, @@ -85,6 +79,12 @@ }, "9": { "then": "寬慰" + }, + "10": { + "then": "Azulejo (西班牙雕塑作品名稱)" + }, + "11": { + "then": "瓷磚" } }, "question": "這是什麼類型的藝術品?", @@ -936,4 +936,4 @@ "render": "風機" } } -} +} \ No newline at end of file diff --git a/langs/themes/es.json b/langs/themes/es.json index 7e7471c97..77077116c 100644 --- a/langs/themes/es.json +++ b/langs/themes/es.json @@ -956,33 +956,6 @@ "onwheels": { "description": "En este mapa se muestran los lugares accesibles al público en silla de ruedas, que pueden añadirse fácilmente", "layers": { - "19": { - "override": { - "=title": { - "render": "Estadísticas" - } - } - }, - "20": { - "override": { - "+tagRenderings": { - "0": { - "render": { - "special": { - "text": "Importar" - } - } - }, - "1": { - "render": { - "special": { - "message": "Añadir todas las etiquetas sugeridas" - } - } - } - } - } - }, "4": { "override": { "filter": { @@ -1025,6 +998,33 @@ "override": { "name": "Plazas de aparcamiento para discapacitados" } + }, + "19": { + "override": { + "=title": { + "render": "Estadísticas" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "Importar" + } + } + }, + "1": { + "render": { + "special": { + "message": "Añadir todas las etiquetas sugeridas" + } + } + } + } + } } }, "title": "Sobre ruedas" @@ -1240,6 +1240,10 @@ "stations": { "description": "Ver, editar y añadir detalles a una estación de tren", "layers": { + "3": { + "description": "Capa que muestra las estaciones de tren", + "name": "Estación de Tren" + }, "16": { "description": "Pantallas que muestran los trenes que saldrán de esta estación", "name": "Tableros de salidas", @@ -1271,10 +1275,6 @@ "title": { "render": "Tablero de salidas" } - }, - "3": { - "description": "Capa que muestra las estaciones de tren", - "name": "Estación de Tren" } }, "title": "Estaciones de tren" @@ -1453,4 +1453,4 @@ "shortDescription": "Un mapa con papeleras", "title": "Papeleras" } -} +} \ No newline at end of file diff --git a/langs/themes/fr.json b/langs/themes/fr.json index 6e00ca160..5c0444b2b 100644 --- a/langs/themes/fr.json +++ b/langs/themes/fr.json @@ -871,33 +871,6 @@ "onwheels": { "description": "Sur cette carte nous pouvons voir et ajouter les différents endroits publiques accessibles aux chaises roulantes", "layers": { - "19": { - "override": { - "=title": { - "render": "Statistiques" - } - } - }, - "20": { - "override": { - "+tagRenderings": { - "0": { - "render": { - "special": { - "text": "Importation" - } - } - }, - "1": { - "render": { - "special": { - "message": "Ajouter tous les attributs suggérés" - } - } - } - } - } - }, "4": { "override": { "filter": { @@ -940,6 +913,33 @@ "override": { "name": "Places de stationnement pour personnes handicapées" } + }, + "19": { + "override": { + "=title": { + "render": "Statistiques" + } + } + }, + "20": { + "override": { + "+tagRenderings": { + "0": { + "render": { + "special": { + "text": "Importation" + } + } + }, + "1": { + "render": { + "special": { + "message": "Ajouter tous les attributs suggérés" + } + } + } + } + } } }, "title": "OnWheels" @@ -1103,6 +1103,10 @@ "stations": { "description": "Voir, modifier et ajouter des détails à une gare ferroviaire", "layers": { + "3": { + "description": "Couche montrant les gares", + "name": "Gares ferroviaires" + }, "16": { "description": "Panneau affichant les trains au départ depuis cette gare", "name": "Panneaux des départs", @@ -1134,10 +1138,6 @@ "title": { "render": "Tableau des départs" } - }, - "3": { - "description": "Couche montrant les gares", - "name": "Gares ferroviaires" } }, "title": "Gares ferroviaires" @@ -1259,4 +1259,4 @@ "shortDescription": "Une carte des poubelles", "title": "Poubelles" } -} +} \ No newline at end of file diff --git a/langs/themes/it.json b/langs/themes/it.json index ed7032dba..8df4205ae 100644 --- a/langs/themes/it.json +++ b/langs/themes/it.json @@ -714,4 +714,4 @@ "shortDescription": "Una cartina dei cestini dei rifiuti", "title": "Cestino dei rifiuti" } -} +} \ No newline at end of file diff --git a/langs/themes/zh_Hant.json b/langs/themes/zh_Hant.json index d1ef5380c..d1f951abc 100644 --- a/langs/themes/zh_Hant.json +++ b/langs/themes/zh_Hant.json @@ -597,6 +597,10 @@ }, "stations": { "layers": { + "3": { + "description": "顯示火車站的圖層", + "name": "火車站" + }, "16": { "name": "出發板", "presets": { @@ -617,10 +621,6 @@ "title": { "render": "時刻表" } - }, - "3": { - "description": "顯示火車站的圖層", - "name": "火車站" } }, "title": "火車站" @@ -722,4 +722,4 @@ "shortDescription": "垃圾筒的地圖", "title": "垃圾筒" } -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fb9d51d68..710d9868a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mapcomplete", - "version": "0.44.0", + "version": "0.44.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mapcomplete", - "version": "0.44.0", + "version": "0.44.4", "license": "GPL-3.0-or-later", "dependencies": { "@comunica/core": "^3.0.1", @@ -7893,9 +7893,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", "dev": true, "funding": [ { @@ -25250,9 +25250,9 @@ "version": "2.0.1" }, "caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", "dev": true }, "canonicalize": { diff --git a/scripts/downloadNsiLogos.ts b/scripts/downloadNsiLogos.ts index 7413039cd..bc81c7ee5 100644 --- a/scripts/downloadNsiLogos.ts +++ b/scripts/downloadNsiLogos.ts @@ -105,12 +105,12 @@ class DownloadNsiLogos extends Script { ) for (let j = 0; j < results.length; j++) { let didDownload = results[j] - if(didDownload !== "error"){ + if (didDownload !== "error") { continue } console.log("Retrying", items[i + j].id, type) didDownload = await this.downloadLogo(items[i + j], type, basePath) - if(didDownload === "error"){ + if (didDownload === "error") { console.log("Failed again:", items[i + j].id) } } diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index 659e49a53..cc496437a 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -55,7 +55,7 @@ class ParseLayer extends Conversion< convert( path: string, - context: ConversionContext, + context: ConversionContext ): { parsed: LayerConfig raw: LayerConfigJson @@ -110,7 +110,7 @@ class AddIconSummary extends DesugaringStep<{ raw: LayerConfigJson; parsed: Laye const fixed = json.raw const layerConfig = json.parsed const pointRendering: PointRenderingConfig = layerConfig.mapRendering.find((pr) => - pr.location.has("point"), + pr.location.has("point") ) const defaultTags = layerConfig.GetBaseTags() fixed["_layerIcon"] = Utils.NoNull( @@ -125,7 +125,7 @@ class AddIconSummary extends DesugaringStep<{ raw: LayerConfigJson; parsed: Laye result["color"] = c } return result - }), + }) ) return { raw: fixed, parsed: layerConfig } } @@ -147,7 +147,7 @@ class LayerOverviewUtils extends Script { private static extractLayerIdsFrom( themeFile: LayoutConfigJson, - includeInlineLayers = true, + includeInlineLayers = true ): string[] { const publicLayerIds: string[] = [] if (!Array.isArray(themeFile.layers)) { @@ -214,10 +214,10 @@ class LayerOverviewUtils extends Script { | LayerConfigJson | string | { - builtin - } - )[] - }[], + builtin + } + )[] + }[] ) { const perId = new Map() for (const theme of themes) { @@ -258,7 +258,7 @@ class LayerOverviewUtils extends Script { writeFileSync( "./src/assets/generated/theme_overview.json", JSON.stringify(sorted, null, " "), - { encoding: "utf8" }, + { encoding: "utf8" } ) } @@ -270,7 +270,7 @@ class LayerOverviewUtils extends Script { writeFileSync( `${LayerOverviewUtils.themePath}${theme.id}.json`, JSON.stringify(theme, null, " "), - { encoding: "utf8" }, + { encoding: "utf8" } ) } @@ -281,12 +281,12 @@ class LayerOverviewUtils extends Script { writeFileSync( `${LayerOverviewUtils.layerPath}${layer.id}.json`, JSON.stringify(layer, null, " "), - { encoding: "utf8" }, + { encoding: "utf8" } ) } static asDict( - trs: QuestionableTagRenderingConfigJson[], + trs: QuestionableTagRenderingConfigJson[] ): Map { const d = new Map() for (const tr of trs) { @@ -299,12 +299,12 @@ class LayerOverviewUtils extends Script { getSharedTagRenderings( doesImageExist: DoesImageExist, bootstrapTagRenderings: Map, - bootstrapTagRenderingsOrder: string[], + bootstrapTagRenderingsOrder: string[] ): QuestionableTagRenderingConfigJson[] getSharedTagRenderings( doesImageExist: DoesImageExist, bootstrapTagRenderings: Map = null, - bootstrapTagRenderingsOrder: string[] = [], + bootstrapTagRenderingsOrder: string[] = [] ): QuestionableTagRenderingConfigJson[] { const prepareLayer = new PrepareLayer( { @@ -315,7 +315,7 @@ class LayerOverviewUtils extends Script { }, { addTagRenderingsToContext: true, - }, + } ) const path = "assets/layers/questions/questions.json" @@ -335,7 +335,7 @@ class LayerOverviewUtils extends Script { return this.getSharedTagRenderings( doesImageExist, dict, - sharedQuestions.tagRenderings.map((tr) => tr["id"]), + sharedQuestions.tagRenderings.map((tr) => tr["id"]) ) } @@ -375,8 +375,8 @@ class LayerOverviewUtils extends Script { if (contents.indexOf(" 0) { console.warn( "The SVG at " + - path + - " contains a `text`-tag. This is highly discouraged. Every machine viewing your theme has their own font libary, and the font you choose might not be present, resulting in a different font being rendered. Solution: open your .svg in inkscape (or another program), select the text and convert it to a path", + path + + " contains a `text`-tag. This is highly discouraged. Every machine viewing your theme has their own font libary, and the font you choose might not be present, resulting in a different font being rendered. Solution: open your .svg in inkscape (or another program), select the text and convert it to a path" ) errCount++ } @@ -392,14 +392,14 @@ class LayerOverviewUtils extends Script { args .find((a) => a.startsWith("--themes=")) ?.substring("--themes=".length) - ?.split(",") ?? [], + ?.split(",") ?? [] ) const layerWhitelist = new Set( args .find((a) => a.startsWith("--layers=")) ?.substring("--layers=".length) - ?.split(",") ?? [], + ?.split(",") ?? [] ) const forceReload = args.some((a) => a == "--force") @@ -428,11 +428,11 @@ class LayerOverviewUtils extends Script { sharedLayers, recompiledThemes, forceReload, - themeWhitelist, + themeWhitelist ) new ValidateThemeEnsemble().convertStrict( - Array.from(sharedThemes.values()).map((th) => new LayoutConfig(th, true)), + Array.from(sharedThemes.values()).map((th) => new LayoutConfig(th, true)) ) if (recompiledThemes.length > 0) { @@ -440,7 +440,7 @@ class LayerOverviewUtils extends Script { "./src/assets/generated/known_layers.json", JSON.stringify({ layers: Array.from(sharedLayers.values()).filter((l) => l.id !== "favourite"), - }), + }) ) } @@ -461,7 +461,7 @@ class LayerOverviewUtils extends Script { const proto: LayoutConfigJson = JSON.parse( readFileSync("./assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json", { encoding: "utf8", - }), + }) ) const protolayer = ( proto.layers.filter((l) => l["id"] === "mapcomplete-changes")[0] @@ -478,12 +478,12 @@ class LayerOverviewUtils extends Script { layers: ScriptUtils.getLayerFiles().map((f) => f.parsed), themes: ScriptUtils.getThemeFiles().map((f) => f.parsed), }, - ConversionContext.construct([], []), + ConversionContext.construct([], []) ) for (const [_, theme] of sharedThemes) { theme.layers = theme.layers.filter( - (l) => Constants.added_by_default.indexOf(l["id"]) < 0, + (l) => Constants.added_by_default.indexOf(l["id"]) < 0 ) } @@ -492,7 +492,7 @@ class LayerOverviewUtils extends Script { "./src/assets/generated/known_themes.json", JSON.stringify({ themes: Array.from(sharedThemes.values()), - }), + }) ) } @@ -504,7 +504,7 @@ class LayerOverviewUtils extends Script { private parseLayer( doesImageExist: DoesImageExist, prepLayer: PrepareLayer, - sharedLayerPath: string, + sharedLayerPath: string ): { raw: LayerConfigJson parsed: LayerConfig @@ -515,7 +515,7 @@ class LayerOverviewUtils extends Script { const parsed = parser.convertStrict(sharedLayerPath, context) const result = AddIconSummary.singleton.convertStrict( parsed, - context.inOperation("AddIconSummary"), + context.inOperation("AddIconSummary") ) return { ...result, context } } @@ -523,7 +523,7 @@ class LayerOverviewUtils extends Script { private buildLayerIndex( doesImageExist: DoesImageExist, forceReload: boolean, - whitelist: Set, + whitelist: Set ): Map { // First, we expand and validate all builtin layers. These are written to src/assets/generated/layers // At the same time, an index of available layers is built. @@ -578,17 +578,17 @@ class LayerOverviewUtils extends Script { console.log( "Recompiled layers " + - recompiledLayers.join(", ") + - " and skipped " + - skippedLayers.length + - " layers. Detected " + - warningCount + - " warnings", + recompiledLayers.join(", ") + + " and skipped " + + skippedLayers.length + + " layers. Detected " + + warningCount + + " warnings" ) // We always need the calculated tags of 'usersettings', so we export them separately this.extractJavascriptCodeForLayer( state.sharedLayers.get("usersettings"), - "./src/Logic/State/UserSettingsMetaTagging.ts", + "./src/Logic/State/UserSettingsMetaTagging.ts" ) return sharedLayers @@ -605,8 +605,8 @@ class LayerOverviewUtils extends Script { private extractJavascriptCode(themeFile: LayoutConfigJson) { const allCode = [ "import {Feature} from 'geojson'", - "import { ExtraFuncType } from \"../../../Logic/ExtraFunctions\";", - "import { Utils } from \"../../../Utils\"", + 'import { ExtraFuncType } from "../../../Logic/ExtraFunctions";', + 'import { Utils } from "../../../Utils"', "export class ThemeMetaTagging {", " public static readonly themeName = " + JSON.stringify(themeFile.id), "", @@ -618,8 +618,8 @@ class LayerOverviewUtils extends Script { allCode.push( " public metaTaggging_for_" + - id + - "(feat: Feature, helperFunctions: Record Function>) {", + id + + "(feat: Feature, helperFunctions: Record Function>) {" ) allCode.push(" const {" + ExtraFunctions.types.join(", ") + "} = helperFunctions") for (const line of code) { @@ -630,10 +630,10 @@ class LayerOverviewUtils extends Script { if (!isStrict) { allCode.push( " Utils.AddLazyProperty(feat.properties, '" + - attributeName + - "', () => " + - expression + - " ) ", + attributeName + + "', () => " + + expression + + " ) " ) } else { attributeName = attributeName.substring(0, attributeName.length - 1).trim() @@ -678,7 +678,7 @@ class LayerOverviewUtils extends Script { const code = l.calculatedTags ?? [] allCode.push( - " public metaTaggging_for_" + l.id + "(feat: {properties: Record}) {", + " public metaTaggging_for_" + l.id + "(feat: {properties: Record}) {" ) for (const line of code) { const firstEq = line.indexOf("=") @@ -688,10 +688,10 @@ class LayerOverviewUtils extends Script { if (!isStrict) { allCode.push( " Utils.AddLazyProperty(feat.properties, '" + - attributeName + - "', () => " + - expression + - " ) ", + attributeName + + "', () => " + + expression + + " ) " ) } else { attributeName = attributeName.substring(0, attributeName.length - 2).trim() @@ -716,14 +716,14 @@ class LayerOverviewUtils extends Script { sharedLayers: Map, recompiledThemes: string[], forceReload: boolean, - whitelist: Set, + whitelist: Set ): Map { console.log(" ---------- VALIDATING BUILTIN THEMES ---------") const themeFiles = ScriptUtils.getThemeFiles() const fixed = new Map() const publicLayers = LayerOverviewUtils.publicLayerIdsFrom( - themeFiles.map((th) => th.parsed), + themeFiles.map((th) => th.parsed) ) const trs = this.getSharedTagRenderings(new DoesImageExist(licensePaths, existsSync)) @@ -763,15 +763,15 @@ class LayerOverviewUtils extends Script { LayerOverviewUtils.themePath + "/" + themePath.substring(themePath.lastIndexOf("/")) const usedLayers = Array.from( - LayerOverviewUtils.extractLayerIdsFrom(themeFile, false), + LayerOverviewUtils.extractLayerIdsFrom(themeFile, false) ).map((id) => LayerOverviewUtils.layerPath + id + ".json") if (!forceReload && !this.shouldBeUpdated([themePath, ...usedLayers], targetPath)) { fixed.set( themeFile.id, JSON.parse( - readFileSync(LayerOverviewUtils.themePath + themeFile.id + ".json", "utf8"), - ), + readFileSync(LayerOverviewUtils.themePath + themeFile.id + ".json", "utf8") + ) ) ScriptUtils.erasableLog("Skipping", themeFile.id) skippedThemes.push(themeFile.id) @@ -782,23 +782,23 @@ class LayerOverviewUtils extends Script { new PrevalidateTheme().convertStrict( themeFile, - ConversionContext.construct([themePath], ["PrepareLayer"]), + ConversionContext.construct([themePath], ["PrepareLayer"]) ) try { themeFile = new PrepareTheme(convertState, { skipDefaultLayers: true, }).convertStrict( themeFile, - ConversionContext.construct([themePath], ["PrepareLayer"]), + ConversionContext.construct([themePath], ["PrepareLayer"]) ) new ValidateThemeAndLayers( new DoesImageExist(licensePaths, existsSync, knownTagRenderings), themePath, true, - knownTagRenderings, + knownTagRenderings ).convertStrict( themeFile, - ConversionContext.construct([themePath], ["PrepareLayer"]), + ConversionContext.construct([themePath], ["PrepareLayer"]) ) if (themeFile.icon.endsWith(".svg")) { @@ -850,16 +850,16 @@ class LayerOverviewUtils extends Script { t.shortDescription ?? new Translation(t.description).FirstSentence(), mustHaveLanguage: t.mustHaveLanguage?.length > 0, } - }), + }) ) } console.log( "Recompiled themes " + - recompiledThemes.join(", ") + - " and skipped " + - skippedThemes.length + - " themes", + recompiledThemes.join(", ") + + " and skipped " + + skippedThemes.length + + " themes" ) return fixed diff --git a/scripts/generateSummaryTileCache.ts b/scripts/generateSummaryTileCache.ts index 8f332333c..15879ee7e 100644 --- a/scripts/generateSummaryTileCache.ts +++ b/scripts/generateSummaryTileCache.ts @@ -19,9 +19,16 @@ class GenerateSummaryTileCache extends Script { } } - async fetchTile(z: number, x: number, y: number, layersSummed: string): Promise> { + async fetchTile( + z: number, + x: number, + y: number, + layersSummed: string + ): Promise> { const index = Tiles.tile_index(z, x, y) - let feature: Feature | any = (await SummaryTileSource.downloadTile(index, this.url, layersSummed).AsPromise())[0] + let feature: Feature | any = ( + await SummaryTileSource.downloadTile(index, this.url, layersSummed).AsPromise() + )[0] if (!feature) { feature = { properties: { total: 0 } } } @@ -34,7 +41,13 @@ class GenerateSummaryTileCache extends Script { return feature } - async fetchTileRecursive(z: number, x: number, y: number, layersSummed: string, sleepMs = 0): Promise> { + async fetchTileRecursive( + z: number, + x: number, + y: number, + layersSummed: string, + sleepMs = 0 + ): Promise> { const index = Tiles.tile_index(z, x, y) const path = this.cacheDir + "tile_" + z + "_" + x + "_" + y + ".json" if (existsSync(path)) { @@ -48,11 +61,12 @@ class GenerateSummaryTileCache extends Script { feature = await this.fetchTile(z, x, y, layersSummed) } else { const parts = [ - await this.fetchTileRecursive(z + 1, x * 2, y * 2, layersSummed), - await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2, layersSummed), - await this.fetchTileRecursive(z + 1, x * 2, y * 2 + 1, layersSummed), - await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2 + 1, layersSummed)] - const sum = this.sumTotals(parts.map(f => f.properties)) + await this.fetchTileRecursive(z + 1, x * 2, y * 2, layersSummed), + await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2, layersSummed), + await this.fetchTileRecursive(z + 1, x * 2, y * 2 + 1, layersSummed), + await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2 + 1, layersSummed), + ] + const sum = this.sumTotals(parts.map((f) => f.properties)) feature = >{ type: "Feature", properties: sum, @@ -77,14 +91,13 @@ class GenerateSummaryTileCache extends Script { return sum } - async main(args: string[]): Promise { - - const layers = await Utils.downloadJson<{ layers: string[], meta: object }>(this.url + "/status.json") - const layersSummed = layers.layers.map(l => encodeURIComponent(l)).join("+") + const layers = await Utils.downloadJson<{ layers: string[]; meta: object }>( + this.url + "/status.json" + ) + const layersSummed = layers.layers.map((l) => encodeURIComponent(l)).join("+") const r = await this.fetchTileRecursive(0, 0, 0, layersSummed) console.log(r) - } } diff --git a/src/Logic/FeatureSource/TiledFeatureSource/SummaryTileSource.ts b/src/Logic/FeatureSource/TiledFeatureSource/SummaryTileSource.ts index 7e1643e47..150b7ed9a 100644 --- a/src/Logic/FeatureSource/TiledFeatureSource/SummaryTileSource.ts +++ b/src/Logic/FeatureSource/TiledFeatureSource/SummaryTileSource.ts @@ -84,7 +84,11 @@ export class SummaryTileSource extends DynamicTileSource { zoomRounded, 0, // minzoom (tileIndex) => { - const features = SummaryTileSource.downloadTile(tileIndex, cacheserver, layersSummed) + const features = SummaryTileSource.downloadTile( + tileIndex, + cacheserver, + layersSummed + ) const [z] = Tiles.tile_from_index(tileIndex) return new StaticFeatureSource( features.map( @@ -103,7 +107,11 @@ export class SummaryTileSource extends DynamicTileSource { ) } - public static downloadTile(tileIndex: number, cacheserver: string, layersSummed: string): Store[]>{ + public static downloadTile( + tileIndex: number, + cacheserver: string, + layersSummed: string + ): Store[]> { const [z, x, y] = Tiles.tile_from_index(tileIndex) let coordinates = Tiles.centerPointOf(z, x, y) const url = `${cacheserver}/${layersSummed}/${z}/${x}/${y}.json` diff --git a/src/Logic/State/FeatureSwitchState.ts b/src/Logic/State/FeatureSwitchState.ts index 0eedc2576..ec0dedbd1 100644 --- a/src/Logic/State/FeatureSwitchState.ts +++ b/src/Logic/State/FeatureSwitchState.ts @@ -18,14 +18,14 @@ class FeatureSwitchUtils { key, "" + defaultValue, documentation, - { stackOffset: -1 }, + { stackOffset: -1 } ) // It takes the current layout, extracts the default value for this query parameter. A query parameter event source is then retrieved and flattened return queryParam.sync( (str) => (str === undefined ? defaultValue : str !== "false"), [], - (b) => (b == defaultValue ? undefined : "" + b), + (b) => (b == defaultValue ? undefined : "" + b) ) } } @@ -37,7 +37,7 @@ export class OsmConnectionFeatureSwitches { this.featureSwitchFakeUser = QueryParameters.GetBooleanQueryParameter( "fake-user", false, - "If true, 'dryrun' mode is activated and a fake user account is loaded", + "If true, 'dryrun' mode is activated and a fake user account is loaded" ) } } @@ -99,14 +99,14 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches { this.featureSwitchEnableLogin = FeatureSwitchUtils.initSwitch( "fs-enable-login", layoutToUse?.enableUserBadge ?? true, - "Disables/Enables logging in and thus disables editing all together. This effectively puts MapComplete into read-only mode.", + "Disables/Enables logging in and thus disables editing all together. This effectively puts MapComplete into read-only mode." ) { if (QueryParameters.wasInitialized("fs-userbadge")) { // userbadge is the legacy name for 'enable-login' this.featureSwitchEnableLogin.setData( QueryParameters.GetBooleanQueryParameter("fs-userbadge", undefined, "Legacy") - .data, + .data ) } } @@ -114,64 +114,66 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches { this.featureSwitchSearch = FeatureSwitchUtils.initSwitch( "fs-search", layoutToUse?.enableSearch ?? true, - "Disables/Enables the search bar", + "Disables/Enables the search bar" ) this.featureSwitchBackgroundSelection = FeatureSwitchUtils.initSwitch( "fs-background", layoutToUse?.enableBackgroundLayerSelection ?? true, - "Disables/Enables the background layer control where a user can enable e.g. aerial imagery", + "Disables/Enables the background layer control where a user can enable e.g. aerial imagery" ) this.featureSwitchFilter = FeatureSwitchUtils.initSwitch( "fs-filter", layoutToUse?.enableLayers ?? true, - "Disables/Enables the filter view where a user can enable/disable MapComplete-layers or filter for certain properties", + "Disables/Enables the filter view where a user can enable/disable MapComplete-layers or filter for certain properties" ) this.featureSwitchWelcomeMessage = FeatureSwitchUtils.initSwitch( "fs-welcome-message", true, - "Disables/enables the help menu or welcome message", + "Disables/enables the help menu or welcome message" ) this.featureSwitchCommunityIndex = FeatureSwitchUtils.initSwitch( "fs-community-index", this.featureSwitchEnableLogin.data, - "Disables/enables the button to get in touch with the community", + "Disables/enables the button to get in touch with the community" ) this.featureSwitchExtraLinkEnabled = FeatureSwitchUtils.initSwitch( "fs-iframe-popout", true, - "Disables/Enables the extraLink button. By default, if in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch or another extraLink button is enabled)", + "Disables/Enables the extraLink button. By default, if in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch or another extraLink button is enabled)" ) this.featureSwitchBackToThemeOverview = FeatureSwitchUtils.initSwitch( "fs-homepage-link", layoutToUse?.enableMoreQuests ?? true, - "Disables/Enables the various links which go back to the index page with the theme overview", + "Disables/Enables the various links which go back to the index page with the theme overview" ) this.featureSwitchShareScreen = FeatureSwitchUtils.initSwitch( "fs-share-screen", layoutToUse?.enableShareScreen ?? true, - "Disables/Enables the 'Share-screen'-tab in the welcome message", + "Disables/Enables the 'Share-screen'-tab in the welcome message" ) this.featureSwitchGeolocation = FeatureSwitchUtils.initSwitch( "fs-geolocation", layoutToUse?.enableGeolocation ?? true, - "Disables/Enables the geolocation button", + "Disables/Enables the geolocation button" ) - this.featureSwitchLayerDefault = QueryParameters.GetBooleanQueryParameter("fs-layers-enabled", true, - "If set to false, all layers will be disabled - except the explicitly enabled layers", + this.featureSwitchLayerDefault = QueryParameters.GetBooleanQueryParameter( + "fs-layers-enabled", + true, + "If set to false, all layers will be disabled - except the explicitly enabled layers" ) this.featureSwitchShowAllQuestions = FeatureSwitchUtils.initSwitch( "fs-all-questions", layoutToUse?.enableShowAllQuestions ?? false, - "Always show all questions", + "Always show all questions" ) this.featureSwitchEnableExport = FeatureSwitchUtils.initSwitch( "fs-export", layoutToUse?.enableExportButton ?? true, - "Enable the export as GeoJSON and CSV button", + "Enable the export as GeoJSON and CSV button" ) let testingDefaultValue = false @@ -185,60 +187,59 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches { this.featureSwitchIsTesting = QueryParameters.GetBooleanQueryParameter( "test", testingDefaultValue, - "If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org", + "If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org" ) this.featureSwitchIsDebugging = QueryParameters.GetBooleanQueryParameter( "debug", false, - "If true, shows some extra debugging help such as all the available tags on every object", + "If true, shows some extra debugging help such as all the available tags on every object" ) this.featureSwitchMorePrivacy = QueryParameters.GetBooleanQueryParameter( "moreprivacy", layoutToUse.enableMorePrivacy, - "If true, the location distance indication will not be written to the changeset and other privacy enhancing measures might be taken.", + "If true, the location distance indication will not be written to the changeset and other privacy enhancing measures might be taken." ) this.overpassUrl = QueryParameters.GetQueryParameter( "overpassUrl", (layoutToUse?.overpassUrl ?? Constants.defaultOverpassUrls).join(","), - "Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter", + "Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter" ).sync( (param) => param?.split(","), [], - (urls) => urls?.join(","), + (urls) => urls?.join(",") ) this.overpassTimeout = UIEventSource.asInt( QueryParameters.GetQueryParameter( "overpassTimeout", "" + layoutToUse?.overpassTimeout, - "Set a different timeout (in seconds) for queries in overpass", - ), + "Set a different timeout (in seconds) for queries in overpass" + ) ) this.overpassMaxZoom = UIEventSource.asFloat( QueryParameters.GetQueryParameter( "overpassMaxZoom", "" + layoutToUse?.overpassMaxZoom, - " point to switch between OSM-api and overpass", - ), + " point to switch between OSM-api and overpass" + ) ) this.osmApiTileSize = UIEventSource.asInt( QueryParameters.GetQueryParameter( "osmApiTileSize", "" + layoutToUse?.osmApiTileSize, - "Tilesize when the OSM-API is used to fetch data within a BBOX", - ), + "Tilesize when the OSM-API is used to fetch data within a BBOX" + ) ) this.backgroundLayerId = QueryParameters.GetQueryParameter( "background", layoutToUse?.defaultBackgroundId, - "The id of the background layer to start with", + "The id of the background layer to start with" ) - } } diff --git a/src/Logic/State/LayerState.ts b/src/Logic/State/LayerState.ts index d90b2d9ac..a9ddba4bb 100644 --- a/src/Logic/State/LayerState.ts +++ b/src/Logic/State/LayerState.ts @@ -35,13 +35,23 @@ export default class LayerState { * @param context * @param layersEnabledByDefault */ - constructor(osmConnection: OsmConnection, layers: LayerConfig[], context: string, layersEnabledByDefault: Store) { + constructor( + osmConnection: OsmConnection, + layers: LayerConfig[], + context: string, + layersEnabledByDefault: Store + ) { this.osmConnection = osmConnection const filteredLayers = new Map() for (const layer of layers) { filteredLayers.set( layer.id, - FilteredLayer.initLinkedState(layer, context, this.osmConnection, layersEnabledByDefault) + FilteredLayer.initLinkedState( + layer, + context, + this.osmConnection, + layersEnabledByDefault + ) ) } this.filteredLayers = filteredLayers diff --git a/src/Logic/State/UserSettingsMetaTagging.ts b/src/Logic/State/UserSettingsMetaTagging.ts index 33a5ae85b..6e568c5c3 100644 --- a/src/Logic/State/UserSettingsMetaTagging.ts +++ b/src/Logic/State/UserSettingsMetaTagging.ts @@ -1,14 +1,42 @@ import { Utils } from "../../Utils" /** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */ export class ThemeMetaTagging { - public static readonly themeName = "usersettings" + public static readonly themeName = "usersettings" - public metaTaggging_for_usersettings(feat: {properties: Record}) { - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_md', () => feat.properties._description.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)?.at(1) ) - Utils.AddLazyProperty(feat.properties, '_d', () => feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? '' ) - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ) - Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) ) - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a ) - feat.properties['__current_backgroun'] = 'initial_value' - } -} \ No newline at end of file + public metaTaggging_for_usersettings(feat: { properties: Record }) { + Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_md", () => + feat.properties._description + .match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/) + ?.at(1) + ) + Utils.AddLazyProperty( + feat.properties, + "_d", + () => feat.properties._description?.replace(/</g, "<")?.replace(/>/g, ">") ?? "" + ) + Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_a", () => + ((feat) => { + const e = document.createElement("div") + e.innerHTML = feat.properties._d + return Array.from(e.getElementsByTagName("a")).filter( + (a) => a.href.match(/mastodon|en.osm.town/) !== null + )[0]?.href + })(feat) + ) + Utils.AddLazyProperty(feat.properties, "_mastodon_link", () => + ((feat) => { + const e = document.createElement("div") + e.innerHTML = feat.properties._d + return Array.from(e.getElementsByTagName("a")).filter( + (a) => a.getAttribute("rel")?.indexOf("me") >= 0 + )[0]?.href + })(feat) + ) + Utils.AddLazyProperty( + feat.properties, + "_mastodon_candidate", + () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a + ) + feat.properties["__current_backgroun"] = "initial_value" + } +} diff --git a/src/Models/Constants.ts b/src/Models/Constants.ts index cf66d8e47..067159fa8 100644 --- a/src/Models/Constants.ts +++ b/src/Models/Constants.ts @@ -169,7 +169,17 @@ export default class Constants { public static readonly maptilerApiKey = "GvoVAJgu46I5rZapJuAy" public static readonly SummaryServer: string = Constants.config.summary_server - public static allServers: string[] = [Constants.SummaryServer, Constants.VectorTileServer, Constants.GeoIpServer, Constants.ErrorReportServer, Constants.countryCoderEndpoint, Constants.osmAuthConfig.url, Constants.nominatimEndpoint, Constants.linkedDataProxy, ...Constants.defaultOverpassUrls] + public static allServers: string[] = [ + Constants.SummaryServer, + Constants.VectorTileServer, + Constants.GeoIpServer, + Constants.ErrorReportServer, + Constants.countryCoderEndpoint, + Constants.osmAuthConfig.url, + Constants.nominatimEndpoint, + Constants.linkedDataProxy, + ...Constants.defaultOverpassUrls, + ] private static isRetina(): boolean { if (Utils.runningFromConsole) { diff --git a/src/Models/FilteredLayer.ts b/src/Models/FilteredLayer.ts index a9dccff3e..2ced53af5 100644 --- a/src/Models/FilteredLayer.ts +++ b/src/Models/FilteredLayer.ts @@ -104,12 +104,12 @@ export default class FilteredLayer { ) } else { let isShown = layer.shownByDefault - if(enabledByDefault !== undefined && enabledByDefault.data === false){ + if (enabledByDefault !== undefined && enabledByDefault.data === false) { isShown = false } isDisplayed = QueryParameters.GetBooleanQueryParameter( FilteredLayer.queryParameterKey(layer), - isShown , + isShown, "Whether or not layer " + layer.id + " is shown" ) } diff --git a/src/Models/MenuState.ts b/src/Models/MenuState.ts index 64b0084f7..ae48ae6fe 100644 --- a/src/Models/MenuState.ts +++ b/src/Models/MenuState.ts @@ -39,7 +39,9 @@ export class MenuState { /** * Standalone copyright panel */ - public readonly copyrightPanelIsOpened: UIEventSource = new UIEventSource(false) + public readonly copyrightPanelIsOpened: UIEventSource = new UIEventSource( + false + ) public readonly communityIndexPanelIsOpened: UIEventSource = new UIEventSource(false) public readonly allToggles: { @@ -140,7 +142,6 @@ export class MenuState { name: "background", showOverOthers: true, }, - ] for (const toggle of this.allToggles) { toggle.toggle.addCallback((isOpen) => { diff --git a/src/Models/ThemeConfig/LayoutConfig.ts b/src/Models/ThemeConfig/LayoutConfig.ts index d9869f238..936d50f17 100644 --- a/src/Models/ThemeConfig/LayoutConfig.ts +++ b/src/Models/ThemeConfig/LayoutConfig.ts @@ -336,13 +336,12 @@ export default class LayoutConfig implements LayoutInformation { ...json, layers: json.layers.filter((l) => l["id"] !== "favourite"), } - const usedImages = - new ExtractImages(this.official, undefined) - .convertStrict( - jsonNoFavourites, - ConversionContext.construct([json.id], ["ExtractImages"]) - ) - .flatMap((i) => i.path) + const usedImages = new ExtractImages(this.official, undefined) + .convertStrict( + jsonNoFavourites, + ConversionContext.construct([json.id], ["ExtractImages"]) + ) + .flatMap((i) => i.path) usedImages.sort() this.usedImages = Utils.Dedup(usedImages) diff --git a/src/Models/ThemeViewState.ts b/src/Models/ThemeViewState.ts index f93d07cf6..156f59b7b 100644 --- a/src/Models/ThemeViewState.ts +++ b/src/Models/ThemeViewState.ts @@ -158,7 +158,7 @@ export default class ThemeViewState implements SpecialVisualizationState { this.featureSwitches = new FeatureSwitchState(layout) this.guistate = new MenuState( this.featureSwitches.featureSwitchWelcomeMessage.data, - layout.id, + layout.id ) this.map = new UIEventSource(undefined) const geolocationState = new GeoLocationState() @@ -174,14 +174,14 @@ export default class ThemeViewState implements SpecialVisualizationState { oauth_token: QueryParameters.GetQueryParameter( "oauth_token", undefined, - "Used to complete the login", + "Used to complete the login" ), }) this.userRelatedState = new UserRelatedState( this.osmConnection, layout, this.featureSwitches, - this.mapProperties, + this.mapProperties ) this.userRelatedState.fixateNorth.addCallbackAndRunD((fixated) => { this.mapProperties.allowRotating.setData(fixated !== "yes") @@ -192,17 +192,22 @@ export default class ThemeViewState implements SpecialVisualizationState { geolocationState, this.selectedElement, this.mapProperties, - this.userRelatedState.gpsLocationHistoryRetentionTime, + this.userRelatedState.gpsLocationHistoryRetentionTime ) this.geolocationControl = new GeolocationControlState(this.geolocation, this.mapProperties) this.availableLayers = AvailableRasterLayers.layersAvailableAt( this.mapProperties.location, - this.osmConnection.isLoggedIn, + this.osmConnection.isLoggedIn ) const self = this - this.layerState = new LayerState(this.osmConnection, layout.layers, layout.id, this.featureSwitches.featureSwitchLayerDefault) + this.layerState = new LayerState( + this.osmConnection, + layout.layers, + layout.id, + this.featureSwitches.featureSwitchLayerDefault + ) { const overlayLayerStates = new Map }>() @@ -210,7 +215,7 @@ export default class ThemeViewState implements SpecialVisualizationState { const isDisplayed = QueryParameters.GetBooleanQueryParameter( "overlay-" + rasterInfo.id, rasterInfo.defaultState ?? true, - "Whether or not overlay layer " + rasterInfo.id + " is shown", + "Whether or not overlay layer " + rasterInfo.id + " is shown" ) const state = { isDisplayed } overlayLayerStates.set(rasterInfo.id, state) @@ -235,7 +240,7 @@ export default class ThemeViewState implements SpecialVisualizationState { this.osmConnection.Backend(), (id) => self.layerState.filteredLayers.get(id).isDisplayed, mvtAvailableLayers, - this.fullNodeDatabase, + this.fullNodeDatabase ) let currentViewIndex = 0 @@ -253,7 +258,7 @@ export default class ThemeViewState implements SpecialVisualizationState { id: "current_view_" + currentViewIndex, }), ] - }), + }) ) this.featuresInView = new BBoxFeatureSource(layoutSource, this.mapProperties.bounds) @@ -271,19 +276,19 @@ export default class ThemeViewState implements SpecialVisualizationState { featureSwitches: this.featureSwitches, }, layout?.isLeftRightSensitive() ?? false, - (e) => this.reportError(e), + (e) => this.reportError(e) ) this.historicalUserLocations = this.geolocation.historicalUserLocations this.newFeatures = new NewGeometryFromChangesFeatureSource( this.changes, layoutSource, - this.featureProperties, + this.featureProperties ) layoutSource.addSource(this.newFeatures) const perLayer = new PerLayerFeatureSourceSplitter( Array.from(this.layerState.filteredLayers.values()).filter( - (l) => l.layerDef?.source !== null, + (l) => l.layerDef?.source !== null ), new ChangeGeometryApplicator(this.indexedFeatures, this.changes), { @@ -294,10 +299,10 @@ export default class ThemeViewState implements SpecialVisualizationState { "Got ", features.length, "leftover features, such as", - features[0].properties, + features[0].properties ) }, - }, + } ) this.perLayer = perLayer.perLayer } @@ -337,12 +342,12 @@ export default class ThemeViewState implements SpecialVisualizationState { this.lastClickObject = new LastClickFeatureSource( this.layout, this.mapProperties.lastClickLocation, - this.userRelatedState.addNewFeatureMode, + this.userRelatedState.addNewFeatureMode ) this.osmObjectDownloader = new OsmObjectDownloader( this.osmConnection.Backend(), - this.changes, + this.changes ) this.perLayerFiltered = this.showNormalDataOn(this.map) @@ -353,7 +358,7 @@ export default class ThemeViewState implements SpecialVisualizationState { currentZoom: this.mapProperties.zoom, layerState: this.layerState, bounds: this.visualFeedbackViewportBounds, - }, + } ) this.hasDataInView = new NoElementsInViewDetector(this).hasFeatureInView this.imageUploadManager = new ImageUploadManager( @@ -361,11 +366,13 @@ export default class ThemeViewState implements SpecialVisualizationState { Imgur.singleton, this.featureProperties, this.osmConnection, - this.changes, + this.changes ) this.favourites = new FavouritesFeatureSource(this) - this.featureSummary = this.setupSummaryLayer(new LayerConfig(summaryLayer, "summaryLayer", true)) + this.featureSummary = this.setupSummaryLayer( + new LayerConfig(summaryLayer, "summaryLayer", true) + ) this.toCacheSavers = this.initSaveToLocalStorage() this.initActors() this.drawSpecialLayers() @@ -404,7 +411,7 @@ export default class ThemeViewState implements SpecialVisualizationState { LayoutSource.fromCacheZoomLevel, fs, this.featureProperties, - fs.layer.layerDef.maxAgeOfCache, + fs.layer.layerDef.maxAgeOfCache ) toLocalStorage.set(layerId, storage) }) @@ -417,7 +424,7 @@ export default class ThemeViewState implements SpecialVisualizationState { const doShowLayer = this.mapProperties.zoom.map( (z) => (fs.layer.isDisplayed?.data ?? true) && z >= (fs.layer.layerDef?.minzoom ?? 0), - [fs.layer.isDisplayed], + [fs.layer.isDisplayed] ) if (!doShowLayer.data && this.featureSwitches.featureSwitchFilter.data === false) { @@ -434,7 +441,7 @@ export default class ThemeViewState implements SpecialVisualizationState { fs.layer, fs, (id) => this.featureProperties.getStore(id), - this.layerState.globalFilters, + this.layerState.globalFilters ) filteringFeatureSource.set(layerName, filtered) @@ -575,7 +582,7 @@ export default class ThemeViewState implements SpecialVisualizationState { return } this.selectClosestAtCenter(0) - }, + } ) for (let i = 1; i < 9; i++) { @@ -593,7 +600,7 @@ export default class ThemeViewState implements SpecialVisualizationState { onUp: true, }, doc, - () => this.selectClosestAtCenter(i - 1), + () => this.selectClosestAtCenter(i - 1) ) } @@ -610,7 +617,7 @@ export default class ThemeViewState implements SpecialVisualizationState { if (this.featureSwitches.featureSwitchBackgroundSelection.data) { this.guistate.backgroundLayerSelectionIsOpened.setData(true) } - }, + } ) Hotkeys.RegisterHotkey( { @@ -622,14 +629,14 @@ export default class ThemeViewState implements SpecialVisualizationState { if (this.featureSwitches.featureSwitchFilter.data) { this.guistate.openFilterView() } - }, + } ) Hotkeys.RegisterHotkey( { shift: "O" }, Translations.t.hotkeyDocumentation.selectMapnik, () => { this.mapProperties.rasterLayer.setData(AvailableRasterLayers.osmCarto) - }, + } ) const setLayerCategory = (category: EliCategory) => { const available = this.availableLayers.data @@ -637,7 +644,7 @@ export default class ThemeViewState implements SpecialVisualizationState { const best = RasterLayerUtils.SelectBestLayerAccordingTo( available, category, - current.data, + current.data ) console.log("Best layer for category", category, "is", best.properties.id) current.setData(best) @@ -646,26 +653,26 @@ export default class ThemeViewState implements SpecialVisualizationState { Hotkeys.RegisterHotkey( { nomod: "O" }, Translations.t.hotkeyDocumentation.selectOsmbasedmap, - () => setLayerCategory("osmbasedmap"), + () => setLayerCategory("osmbasedmap") ) Hotkeys.RegisterHotkey( { nomod: "M" }, Translations.t.hotkeyDocumentation.selectMap, - () => setLayerCategory("map"), + () => setLayerCategory("map") ) Hotkeys.RegisterHotkey( { nomod: "P" }, Translations.t.hotkeyDocumentation.selectAerial, - () => setLayerCategory("photo"), + () => setLayerCategory("photo") ) Hotkeys.RegisterHotkey( { nomod: "L" }, Translations.t.hotkeyDocumentation.geolocate, () => { this.geolocationControl.handleClick() - }, + } ) return true }) @@ -677,7 +684,7 @@ export default class ThemeViewState implements SpecialVisualizationState { Translations.t.hotkeyDocumentation.translationMode, () => { Locale.showLinkToWeblate.setData(!Locale.showLinkToWeblate.data) - }, + } ) } @@ -688,7 +695,7 @@ export default class ThemeViewState implements SpecialVisualizationState { const normalLayers = this.layout.layers.filter( (l) => Constants.priviliged_layers.indexOf(l.id) < 0 && - !l.id.startsWith("note_import"), + !l.id.startsWith("note_import") ) const maxzoom = Math.min(...normalLayers.map((l) => l.minzoom)) @@ -696,7 +703,7 @@ export default class ThemeViewState implements SpecialVisualizationState { (l) => Constants.priviliged_layers.indexOf(l.id) < 0 && l.source.geojsonSource === undefined && - l.doCount, + l.doCount ) const summaryTileSource = new SummaryTileSource( Constants.SummaryServer, @@ -705,7 +712,7 @@ export default class ThemeViewState implements SpecialVisualizationState { this.mapProperties, { isActive: this.mapProperties.zoom.map((z) => z < maxzoom), - }, + } ) const src = new SummaryTileSourceRewriter(summaryTileSource, this.layerState.filteredLayers) @@ -727,12 +734,12 @@ export default class ThemeViewState implements SpecialVisualizationState { gps_location_history: this.geolocation.historicalUserLocations, gps_track: this.geolocation.historicalUserLocationsTrack, selected_element: new StaticFeatureSource( - this.selectedElement.map((f) => (f === undefined ? empty : [f])), + this.selectedElement.map((f) => (f === undefined ? empty : [f])) ), range: new StaticFeatureSource( this.mapProperties.maxbounds.map((bbox) => - bbox === undefined ? empty : [bbox.asGeoJson({ id: "range" })], - ), + bbox === undefined ? empty : [bbox.asGeoJson({ id: "range" })] + ) ), current_view: this.currentView, favourite: this.favourites, @@ -747,7 +754,7 @@ export default class ThemeViewState implements SpecialVisualizationState { ShowDataLayer.showRange( this.map, new StaticFeatureSource([bbox.asGeoJson({ id: "range" })]), - this.featureSwitches.featureSwitchIsTesting, + this.featureSwitches.featureSwitchIsTesting ) } const currentViewLayer = this.layout.layers.find((l) => l.id === "current_view") @@ -761,7 +768,7 @@ export default class ThemeViewState implements SpecialVisualizationState { currentViewLayer, this.layout, this.osmObjectDownloader, - this.featureProperties, + this.featureProperties ) }) } @@ -805,20 +812,20 @@ export default class ThemeViewState implements SpecialVisualizationState { const lastClickLayerConfig = new LayerConfig( last_click_layerconfig, - "last_click", + "last_click" ) const lastClickFiltered = lastClickLayerConfig.isShown === undefined ? specialLayers.last_click : specialLayers.last_click.features.mapD((fs) => - fs.filter((f) => { - const matches = lastClickLayerConfig.isShown.matchesProperties( - f.properties, - ) - console.debug("LastClick ", f, "matches", matches) - return matches - }), - ) + fs.filter((f) => { + const matches = lastClickLayerConfig.isShown.matchesProperties( + f.properties + ) + console.debug("LastClick ", f, "matches", matches) + return matches + }) + ) new ShowDataLayer(this.map, { features: new StaticFeatureSource(lastClickFiltered), layer: lastClickLayerConfig, @@ -863,7 +870,7 @@ export default class ThemeViewState implements SpecialVisualizationState { this.mapProperties.rasterLayer, this.availableLayers, this.featureSwitches.backgroundLayerId, - this.userRelatedState.preferredBackgroundLayer, + this.userRelatedState.preferredBackgroundLayer ) } diff --git a/src/UI/Base/Copyable.svelte b/src/UI/Base/Copyable.svelte index cdc9747ad..a31b1afa9 100644 --- a/src/UI/Base/Copyable.svelte +++ b/src/UI/Base/Copyable.svelte @@ -1,5 +1,4 @@ -
- +
Utils.selectTextIn(e.target)}> {text} @@ -48,11 +46,8 @@ {/if}
- -
-
{#if isCopied} diff --git a/src/UI/BigComponents/AboutMapComplete.svelte b/src/UI/BigComponents/AboutMapComplete.svelte index 98000af1c..06f663a85 100644 --- a/src/UI/BigComponents/AboutMapComplete.svelte +++ b/src/UI/BigComponents/AboutMapComplete.svelte @@ -1,5 +1,4 @@