diff --git a/.github/workflows/theme_validation_and_deploy.yml b/.github/workflows/theme_validation_and_deploy.yml index 9e32dd808..32b593381 100644 --- a/.github/workflows/theme_validation_and_deploy.yml +++ b/.github/workflows/theme_validation_and_deploy.yml @@ -52,33 +52,29 @@ jobs: echo "Cloning destination repo" git config --global user.email "pietervdvn@posteo.net" git config --global user.name "pietervdvn" - git clone --depth 1 --single-branch --branch master "https://x-access-token:$DEPLOY_KEY_PIETERVDVN@github.com/pietervdvn/pietervdvn.github.io.git" + git clone --depth 1 --single-branch --branch main "https://x-access-token:$DEPLOY_KEY_PIETERVDVN@github.com/MapComplete/mapcomplete.github.io.git" echo "Destination repo is cloned" - name: Sync repo env: DEPLOY_KEY_PIETERVDVN: ${{ secrets.DEPLOY_KEY_PIETERVDVN }} run: | - cd pietervdvn.github.io + cd mapcomplete.github.io git pull - - name: get branch name - run: echo TARGET_BRANCH=${GITHUB_REF:11} >> $GITHUB_ENV - - name: "Copying files" run: | echo "Deploying" - rm -rf pietervdvn.github.io/mc/${{ env.TARGET_BRANCH }}/* - mkdir -p pietervdvn.github.io/mc/${{ env.TARGET_BRANCH }}/ - cp -r dist/* pietervdvn.github.io/mc/${{ env.TARGET_BRANCH }}/ - cd pietervdvn.github.io/ + rm -rf mapcomplete.github.io/* + cp -r dist/* mapcomplete.github.io/ + cd mapcomplete.github.io/ + echo "mapcomplete.osm.be" > CNAME git add * if git status | grep -q "Changes to be committed" then - git commit -am "Deploying a new version of mapcomplete" + git commit -am "Deploying a new version" git push else echo "No changes to commit" fi - env: - TARGET_BRANCH: ${{ env.TARGET_BRANCH }} + diff --git a/Docs/BuiltinQuestions.md b/Docs/BuiltinQuestions.md index aa7daa342..ccbfca14a 100644 --- a/Docs/BuiltinQuestions.md +++ b/Docs/BuiltinQuestions.md @@ -233,7 +233,7 @@ Are dogs allowed in this business? {description} -Is there still something relevant you couldn't give in the previous questions? Add it here. +Is there still some relevant info that the previous questions did not cover? Feel free to add it here. diff --git a/Docs/Layers/advertising.md b/Docs/Layers/advertising.md index 9e716e0df..749cd262a 100644 --- a/Docs/Layers/advertising.md +++ b/Docs/Layers/advertising.md @@ -191,7 +191,7 @@ The question is *What kind of message is shown?* - Unselecting this answer will add - *Electoral advertising* corresponds with `message=political` - Unselecting this answer will add - - *Inormation related to theatre, concerts, ...* corresponds with `message=showbiz` + - *Information related to theatre, concerts, …* corresponds with `message=showbiz` - Unselecting this answer will add - *Message from non-profit organizations* corresponds with `message=non_profit` - Unselecting this answer will add diff --git a/Docs/Layers/bicycle_library.md b/Docs/Layers/bicycle_library.md index 06a7087c9..fff4eecf6 100644 --- a/Docs/Layers/bicycle_library.md +++ b/Docs/Layers/bicycle_library.md @@ -226,7 +226,7 @@ The question is *Who can loan bicycles here?* -The question is *Is there still something relevant you couldn't give in the previous questions? Add it here.* +The question is *Is there still some relevant info that the previous questions did not cover? Feel free to add it here.* This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) diff --git a/Docs/Layers/bike_cleaning.md b/Docs/Layers/bike_cleaning.md index 22ad6baf2..1edfd3cb4 100644 --- a/Docs/Layers/bike_cleaning.md +++ b/Docs/Layers/bike_cleaning.md @@ -120,7 +120,7 @@ This is rendered with `Using the cleaning service costs {charge}` - *This cleaning service is free to use* corresponds with `fee=no` - - *This cleaning service is paid* corresponds with `fee=yes` + - *There is a fee to use this cleaning service* corresponds with `fee=yes` This tagrendering is only visible in the popup if the following condition is met: `amenity=bike_wash|amenity=bicycle_wash` diff --git a/Docs/Layers/bike_shop.md b/Docs/Layers/bike_shop.md index cc22ed596..2aa996d07 100644 --- a/Docs/Layers/bike_shop.md +++ b/Docs/Layers/bike_shop.md @@ -530,7 +530,7 @@ This is rendered with `Using the cleaning service costs {service:bicycle:cleani -The question is *Is there still something relevant you couldn't give in the previous questions? Add it here.* +The question is *Is there still some relevant info that the previous questions did not cover? Feel free to add it here.* This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) diff --git a/Docs/Layers/bike_themed_object.md b/Docs/Layers/bike_themed_object.md index 648e6b5d8..8a66060f8 100644 --- a/Docs/Layers/bike_themed_object.md +++ b/Docs/Layers/bike_themed_object.md @@ -91,7 +91,7 @@ This tagrendering has no question and is thus read-only -The question is *Is there still something relevant you couldn't give in the previous questions? Add it here.* +The question is *Is there still some relevant info that the previous questions did not cover? Feel free to add it here.* This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) diff --git a/Docs/Layers/climbing_route.md b/Docs/Layers/climbing_route.md index 668898b8b..12e079584 100644 --- a/Docs/Layers/climbing_route.md +++ b/Docs/Layers/climbing_route.md @@ -159,7 +159,7 @@ This is rendered with `This route has {climbing:bolts} bolts
Constants.priviliged_layers.indexOf(l.id) < 0) + .filter((l) => !l.id.startsWith("note_import")) .map((l) => l.minzoom) ) const mapProperties = themeViewState.mapProperties @@ -24,28 +25,33 @@ export default class NoElementsInViewDetector { this.hasFeatureInView = state.mapProperties.bounds.stabilized(100).map( (bbox) => { + if (!bbox) { + return undefined + } if (mapProperties.zoom.data < minZoom) { // Not a single layer will display anything as the zoom is to low return "zoom-to-low" } + let minzoomWithData = 9999 + for (const [layerName, source] of themeViewState.perLayerFiltered) { if (priviliged.has(layerName)) { continue } - if ( - mapProperties.zoom.data < themeViewState.layout.getLayer(layerName).minzoom - ) { - continue - } - if (!state.layerState.filteredLayers.get(layerName).isDisplayed.data) { - continue - } const feats = source.features.data if (!(feats?.length > 0)) { // Nope, no data loaded continue } + const layer = themeViewState.layout.getLayer(layerName) + if (mapProperties.zoom.data < layer.minzoom) { + minzoomWithData = Math.min(layer.minzoom) + continue + } + if (!state.layerState.filteredLayers.get(layerName).isDisplayed.data) { + continue + } for (const feat of feats) { if (BBox.get(feat).overlapsWith(bbox)) { @@ -56,13 +62,14 @@ export default class NoElementsInViewDetector { } // If we arrive here, data might have been filtered away - for (const [layerName, source] of themeViewState.perLayer) { + + for (const [layerName, source] of themeViewState.perLayerFiltered) { if (priviliged.has(layerName)) { continue } - if ( - mapProperties.zoom.data < themeViewState.layout.getLayer(layerName).minzoom - ) { + + const layer = themeViewState.layout.getLayer(layerName) + if (mapProperties.zoom.data < layer.minzoom) { continue } const feats = source.features.data diff --git a/Logic/DetermineLayout.ts b/Logic/DetermineLayout.ts index f1f28ee14..78fa92130 100644 --- a/Logic/DetermineLayout.ts +++ b/Logic/DetermineLayout.ts @@ -11,7 +11,6 @@ import { LocalStorageSource } from "./Web/LocalStorageSource" import LZString from "lz-string" import { FixLegacyTheme } from "../Models/ThemeConfig/Conversion/LegacyJsonConvert" import { LayerConfigJson } from "../Models/ThemeConfig/Json/LayerConfigJson" -import SharedTagRenderings from "../Customizations/SharedTagRenderings" import known_layers from "../assets/generated/known_layers.json" import { PrepareTheme } from "../Models/ThemeConfig/Conversion/PrepareTheme" import licenses from "../assets/generated/license_info.json" @@ -24,9 +23,8 @@ import { ValidateTagRenderings, ValidateThemeAndLayers, } from "../Models/ThemeConfig/Conversion/Validation" -import { DesugaringContext, Each, On } from "../Models/ThemeConfig/Conversion/Conversion" -import { PrepareLayer, RewriteSpecial } from "../Models/ThemeConfig/Conversion/PrepareLayer" -import { AllSharedLayers } from "../Customizations/AllSharedLayers" +import { DesugaringContext } from "../Models/ThemeConfig/Conversion/Conversion" +import { RewriteSpecial } from "../Models/ThemeConfig/Conversion/PrepareLayer" import { TagRenderingConfigJson } from "../Models/ThemeConfig/Json/TagRenderingConfigJson" import questions from "../assets/tagRenderings/questions.json" @@ -79,55 +77,33 @@ export default class DetermineLayout { let hash = location.hash.substr(1) let json: any - try { - // layoutFromBase64 contains the name of the theme. This is partly to do tracking with goat counter - const dedicatedHashFromLocalStorage = LocalStorageSource.Get( - "user-layout-" + userLayoutParam.data?.replace(" ", "_") - ) - if (dedicatedHashFromLocalStorage.data?.length < 10) { - dedicatedHashFromLocalStorage.setData(undefined) - } - - const hashFromLocalStorage = LocalStorageSource.Get("last-loaded-user-layout") - if (hash.length < 10) { - hash = dedicatedHashFromLocalStorage.data ?? hashFromLocalStorage.data - } else { - console.log("Saving hash to local storage") - hashFromLocalStorage.setData(hash) - dedicatedHashFromLocalStorage.setData(hash) - } - - try { - json = JSON.parse(atob(hash)) - } catch (e) { - // We try to decode with lz-string - try { - json = JSON.parse(Utils.UnMinify(LZString.decompressFromBase64(hash))) - } catch (e) { - console.error(e) - DetermineLayout.ShowErrorOnCustomTheme( - "Could not decode the hash", - new FixedUiElement("Not a valid (LZ-compressed) JSON") - ) - return null - } - } - - const layoutToUse = DetermineLayout.prepCustomTheme(json) - userLayoutParam.setData(layoutToUse.id) - return layoutToUse - } catch (e) { - console.error(e) - if (hash === undefined || hash.length < 10) { - DetermineLayout.ShowErrorOnCustomTheme( - "Could not load a theme from the hash", - new FixedUiElement("Hash does not contain data"), - json - ) - } - this.ShowErrorOnCustomTheme("Could not parse the hash", new FixedUiElement(e), json) - return null + // layoutFromBase64 contains the name of the theme. This is partly to do tracking with goat counter + const dedicatedHashFromLocalStorage = LocalStorageSource.Get( + "user-layout-" + userLayoutParam.data?.replace(" ", "_") + ) + if (dedicatedHashFromLocalStorage.data?.length < 10) { + dedicatedHashFromLocalStorage.setData(undefined) } + + const hashFromLocalStorage = LocalStorageSource.Get("last-loaded-user-layout") + if (hash.length < 10) { + hash = dedicatedHashFromLocalStorage.data ?? hashFromLocalStorage.data + } else { + console.log("Saving hash to local storage") + hashFromLocalStorage.setData(hash) + dedicatedHashFromLocalStorage.setData(hash) + } + + try { + json = JSON.parse(atob(hash)) + } catch (e) { + // We try to decode with lz-string + json = JSON.parse(Utils.UnMinify(LZString.decompressFromBase64(hash))) + } + + const layoutToUse = DetermineLayout.prepCustomTheme(json) + userLayoutParam.setData(layoutToUse.id) + return layoutToUse } public static ShowErrorOnCustomTheme( @@ -187,6 +163,7 @@ export default class DetermineLayout { return dict } + private static prepCustomTheme(json: any, sourceUrl?: string, forceId?: string): LayoutConfig { if (json.layers === undefined && json.tagRenderings !== undefined) { const iconTr = json.mapRendering.map((mr) => mr.icon).find((icon) => icon !== undefined) @@ -255,32 +232,13 @@ export default class DetermineLayout { "maindiv" ) - try { - let parsed = await Utils.downloadJson(link) - try { - let forcedId = parsed.id - const url = new URL(link) - if (!(url.hostname === "localhost" || url.hostname === "127.0.0.1")) { - forcedId = link - } - console.log("Loaded remote link:", link) - return DetermineLayout.prepCustomTheme(parsed, link, forcedId) - } catch (e) { - console.error(e) - DetermineLayout.ShowErrorOnCustomTheme( - `${link} is invalid:`, - new FixedUiElement(e), - parsed - ) - return null - } - } catch (e) { - console.error(e) - DetermineLayout.ShowErrorOnCustomTheme( - `${link} is invalid - probably not found or invalid JSON:`, - new FixedUiElement(e) - ) - return null + let parsed = await Utils.downloadJson(link) + let forcedId = parsed.id + const url = new URL(link) + if (!(url.hostname === "localhost" || url.hostname === "127.0.0.1")) { + forcedId = link } + console.log("Loaded remote link:", link) + return DetermineLayout.prepCustomTheme(parsed, link, forcedId) } } diff --git a/Models/ThemeConfig/Conversion/Validation.ts b/Models/ThemeConfig/Conversion/Validation.ts index c61f06e45..f386244be 100644 --- a/Models/ThemeConfig/Conversion/Validation.ts +++ b/Models/ThemeConfig/Conversion/Validation.ts @@ -29,8 +29,12 @@ class ValidateLanguageCompleteness extends DesugaringStep { this._languages = languages ?? ["en"] } - convert(obj: any, context: string): { result: LayerConfig; errors: string[] } { + convert( + obj: any, + context: string + ): { result: LayerConfig; errors: string[]; warnings: string[] } { const errors = [] + const warnings: string[] = [] const translations = Translation.ExtractAllTranslationsFrom(obj) for (const neededLanguage of this._languages) { translations @@ -55,6 +59,7 @@ class ValidateLanguageCompleteness extends DesugaringStep { return { result: obj, errors, + warnings, } } } @@ -248,6 +253,7 @@ class ValidateTheme extends DesugaringStep { const checked = new ValidateLanguageCompleteness( ...json["mustHaveLanguage"] ).convert(theme, theme.id) + errors.push(...checked.errors) } if (!json.hideFromOverview && theme.id !== "personal" && this._isBuiltin) { diff --git a/UI/Base/LeftIndex.ts b/UI/Base/LeftIndex.ts deleted file mode 100644 index 989483ffc..000000000 --- a/UI/Base/LeftIndex.ts +++ /dev/null @@ -1,25 +0,0 @@ -import BaseUIElement from "../BaseUIElement" -import Combine from "./Combine" -import BackToIndex from "../BigComponents/BackToIndex" - -export default class LeftIndex extends Combine { - constructor( - leftContents: BaseUIElement[], - mainContent: BaseUIElement, - options?: { - hideBackButton: false | boolean - } - ) { - let back: BaseUIElement = undefined - if (options?.hideBackButton ?? true) { - back = new BackToIndex() - } - super([ - new Combine([new Combine([back, ...leftContents]).SetClass("sticky top-4")]).SetClass( - "ml-4 block w-full md:w-2/6 lg:w-1/6" - ), - mainContent.SetClass("m-8 w-full mb-24"), - ]) - this.SetClass("h-full block md:flex") - } -} diff --git a/UI/BigComponents/BackToIndex.ts b/UI/BigComponents/BackToIndex.ts deleted file mode 100644 index dc35f2139..000000000 --- a/UI/BigComponents/BackToIndex.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { SubtleButton } from "../Base/SubtleButton" -import Svg from "../../Svg" -import Translations from "../i18n/Translations" -import BaseUIElement from "../BaseUIElement" - -export default class BackToIndex extends SubtleButton { - constructor(message?: string | BaseUIElement) { - super( - Svg.back_svg().SetStyle("height: 1.5rem;"), - message ?? Translations.t.general.backToMapcomplete, - { - url: "index.html", - } - ) - } -} diff --git a/UI/Map/MapLibreAdaptor.ts b/UI/Map/MapLibreAdaptor.ts index 443d099b3..565d12abb 100644 --- a/UI/Map/MapLibreAdaptor.ts +++ b/UI/Map/MapLibreAdaptor.ts @@ -1,7 +1,7 @@ import { Store, UIEventSource } from "../../Logic/UIEventSource" import type { Map as MLMap } from "maplibre-gl" import { Map as MlMap, SourceSpecification } from "maplibre-gl" -import { RasterLayerPolygon } from "../../Models/RasterLayers" +import { AvailableRasterLayers, RasterLayerPolygon } from "../../Models/RasterLayers" import { Utils } from "../../Utils" import { BBox } from "../../Logic/BBox" import { ExportableMap, MapProperties } from "../../Models/MapProperties" @@ -370,8 +370,17 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { private removeCurrentLayer(map: MLMap): void { if (this._currentRasterLayer) { // hide the previous layer - map.removeLayer(this._currentRasterLayer) - map.removeSource(this._currentRasterLayer) + try { + if (map.getLayer(this._currentRasterLayer)) { + map.removeLayer(this._currentRasterLayer) + } + if (map.getSource(this._currentRasterLayer)) { + map.removeSource(this._currentRasterLayer) + } + this._currentRasterLayer = undefined + } catch (e) { + console.warn("Could not remove the previous layer") + } } } @@ -381,56 +390,68 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { return } const background: RasterLayerProperties = this.rasterLayer?.data?.properties - if (background !== undefined && this._currentRasterLayer === background.id) { + console.log("Setting background to", background) + if (!background) { + console.error( + "Attempting to 'setBackground', but the background is", + background, + "for", + map.getCanvas() + ) + return + } + if (this._currentRasterLayer === background.id) { // already the correct background layer, nothing to do return } - // await this.awaitStyleIsLoaded() - if (background !== this.rasterLayer?.data?.properties) { - // User selected another background in the meantime... abort - return - } - - if (background !== undefined && this._currentRasterLayer === background.id) { - // already the correct background layer, nothing to do - return - } if (!background?.url) { // no background to set this.removeCurrentLayer(map) - this._currentRasterLayer = undefined return } if (background.type === "vector") { - console.log("Background layer is vector") + console.log("Background layer is vector", background.id) + this.removeCurrentLayer(map) map.setStyle(background.url) return } - map.addSource(background.id, MapLibreAdaptor.prepareWmsSource(background)) - - map.resize() - let addLayerBeforeId = "aeroway_fill" // this is the first non-landuse item in the stylesheet, we add the raster layer before the roads but above the landuse if (background.category === "osmbasedmap" || background.category === "map") { // The background layer is already an OSM-based map or another map, so we don't want anything from the baselayer - let layers = map.getStyle().layers - // THe last index of the maptiler layers - let lastIndex = layers.findIndex((layer) => layer.id === "housenumber") - addLayerBeforeId = layers[lastIndex + 1]?.id ?? "housenumber" + addLayerBeforeId = undefined + this.removeCurrentLayer(map) + } else { + // Make sure that the default maptiler style is loaded as it gives an overlay with roads + const maptiler = AvailableRasterLayers.maplibre.properties + if (!map.getSource(maptiler.id)) { + this.removeCurrentLayer(map) + map.addSource(maptiler.id, MapLibreAdaptor.prepareWmsSource(maptiler)) + map.setStyle(maptiler.url) + await this.awaitStyleIsLoaded() + } } - map.addLayer( - { - id: background.id, - type: "raster", - source: background.id, - paint: {}, - }, - addLayerBeforeId - ) + if (!map.getLayer(addLayerBeforeId)) { + addLayerBeforeId = undefined + } + if (!map.getSource(background.id)) { + map.addSource(background.id, MapLibreAdaptor.prepareWmsSource(background)) + } + map.resize() + if (!map.getLayer(background.id)) { + map.addLayer( + { + id: background.id, + type: "raster", + source: background.id, + paint: {}, + }, + addLayerBeforeId + ) + } await this.awaitStyleIsLoaded() this.removeCurrentLayer(map) this._currentRasterLayer = background?.id diff --git a/UI/Map/ShowDataLayer.ts b/UI/Map/ShowDataLayer.ts index a99b14953..7be7c036a 100644 --- a/UI/Map/ShowDataLayer.ts +++ b/UI/Map/ShowDataLayer.ts @@ -380,6 +380,9 @@ class LineRenderingLayer { if (this._listenerInstalledOn.has(id)) { continue } + if (!map.getSource(this._layername)) { + continue + } if (this._fetchStore === undefined) { map.setFeatureState( { source: this._layername, id }, diff --git a/UI/NotFound.svelte b/UI/NotFound.svelte new file mode 100644 index 000000000..34c6ab212 --- /dev/null +++ b/UI/NotFound.svelte @@ -0,0 +1,14 @@ + +
+ + {window.location = "index.html"}}> +
+ +
+
+
diff --git a/UI/Popup/MoveWizard.ts b/UI/Popup/MoveWizard.ts index 4247a6360..6d1de64eb 100644 --- a/UI/Popup/MoveWizard.ts +++ b/UI/Popup/MoveWizard.ts @@ -73,7 +73,7 @@ export default class MoveWizard extends Toggle { lockBounds: true, includeSearch: false, background: "photo", - startZoom: 17, + startZoom: 18, minZoom: 16, eraseAddressFields: false, }) @@ -139,6 +139,7 @@ export default class MoveWizard extends Toggle { new SvelteUIElement(LocationInput, { mapProperties, value, + initialCoordinate: { lon, lat }, }).SetClass("w-full h-full"), new SvelteUIElement(OpenBackgroundSelectorButton, { state }).SetClass( "absolute bottom-0 left-0" diff --git a/assets/layers/advertising/advertising.json b/assets/layers/advertising/advertising.json index d22aeb101..c3e560709 100644 --- a/assets/layers/advertising/advertising.json +++ b/assets/layers/advertising/advertising.json @@ -686,7 +686,7 @@ "then": { "ca": "Informació sobre teatres, concerts, ...", "es": "Información sobre teatros, conciertos, ...", - "en": "Inormation related to theatre, concerts, ...", + "en": "Information related to theatre, concerts, …", "de": "Informationen über Theater, Konzerte, ...", "cs": "Informace týkající se divadla, koncertů, ...", "fr": "Informations liées au théâtre, à des concerts, …", diff --git a/assets/layers/artwork/artwork.json b/assets/layers/artwork/artwork.json index 0f5476ec4..78d3140d0 100644 --- a/assets/layers/artwork/artwork.json +++ b/assets/layers/artwork/artwork.json @@ -86,7 +86,7 @@ "ru": "Разнообразные произведения искусства", "es": "Un mapa abierto de Estatuas, bustos, Graffitis y otras Obras de Arte en todo el mundo", "ja": "多様な作品", - "zh_Hant": "不同類型的藝術品", + "zh_Hant": "顯示全世界的雕像、半身像、塗鴉以及其他類型的藝術品的地圖", "id": "Peta terbuka patung, grafiti, dan karya seni lainnya di seluruh dunia", "pt": "Diversas obras de arte", "hu": "Szobrok, mellszobrok, graffitik és egyéb műalkotások nyílt világtérképe", diff --git a/assets/layers/bench/bench.json b/assets/layers/bench/bench.json index 8e8a6ca44..afab53a87 100644 --- a/assets/layers/bench/bench.json +++ b/assets/layers/bench/bench.json @@ -789,7 +789,7 @@ "question": { "en": "Does this bench have an inscription?", "nl": "Heeft deze bank een inscriptie?", - "de": "Hat diese Bank eine Inschrift? ", + "de": "Hat diese Bank eine Inschrift?", "fr": "Est-ce que ce banc possède une inscription ?", "ca": "Aquest banc té una inscripció?", "cs": "Má tato lavička nápis?", @@ -833,9 +833,9 @@ } ], "questionHint": { - "en": "E.g. on a mounted plaque, in the backrest, ...", + "en": "E.g. on a mounted plaque, in the backrest, …", "nl": "Bijvoorbeeld op een aangebracht plakkaat, ingesneden in de rugleuning, ...", - "de": "Z.B. auf einer angebrachten Plakette, in der Rückenlehne, ... ", + "de": "Z.B. auf einer angebrachten Plakette, in der Rückenlehne, ...", "fr": "Par exemple, sur une plaque accrochée, sur le dossier, ...", "ca": "P. ex. en una placa, al respatller, ...", "cs": "Např. na připevněné desce, v opěradle, ...", @@ -847,7 +847,7 @@ "question": { "en": "Does this bench have an artistic element?", "nl": "Heeft deze bank een geïntegreerd kunstwerk?", - "de": "Hat diese Bank ein künstlerisches Element? ", + "de": "Hat diese Bank ein künstlerisches Element?", "ca": "Aquest banc té algun element artístic?", "cs": "Má tato lavička umělecké prvky?" }, diff --git a/assets/layers/bike_cleaning/bike_cleaning.json b/assets/layers/bike_cleaning/bike_cleaning.json index a027fe09b..31970232e 100644 --- a/assets/layers/bike_cleaning/bike_cleaning.json +++ b/assets/layers/bike_cleaning/bike_cleaning.json @@ -212,7 +212,7 @@ { "if": "fee=yes", "then": { - "en": "This cleaning service is paid", + "en": "There is a fee to use this cleaning service", "nl": "Dit fietsschoonmaakpunt is betalend", "es": "Este servicio de limpieza es de pago", "ca": "Aquest servei de neteja és de pagament", diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json index 811d99f04..cb97d2134 100644 --- a/assets/layers/charging_station/charging_station.json +++ b/assets/layers/charging_station/charging_station.json @@ -243,7 +243,8 @@ "if": "access=permissive", "then": { "en": "This charging station is accessible to the public during certain hours or conditions. Restrictions might apply, but general use is allowed.", - "nl": "Dit oplaadstation is publiek toegankelijk onder voorwaarden (bv. enkel tijdens bepaalde uren). " + "nl": "Dit oplaadstation is publiek toegankelijk onder voorwaarden (bv. enkel tijdens bepaalde uren). ", + "de": "Diese Ladestation ist zu gewissen Öffnungszeiten oder Bedingungen öffentlich zugänglich. Einschränkungen sind möglich, aber generelle Nutzung ist erlaubt." } } ] @@ -4639,7 +4640,8 @@ "id": "questions-technical", "render": { "en": "

Technical questions

The questions below are very technical. Feel free to ignore them
{questions(technical)}", - "nl": "

Technische vragen

De vragen hieronder zijn erg technisch - sla deze over indien je hier geen tijd voor hebt
{questions(technical)}" + "nl": "

Technische vragen

De vragen hieronder zijn erg technisch - sla deze over indien je hier geen tijd voor hebt
{questions(technical)}", + "de": "

Technische Frage

Die nächsten Fragen sind sehr technisch. Du kannst diese auch überspringen.
{questions(technical)}" } } ], diff --git a/assets/layers/dentist/dentist.json b/assets/layers/dentist/dentist.json index 801dfcd98..8759429f7 100644 --- a/assets/layers/dentist/dentist.json +++ b/assets/layers/dentist/dentist.json @@ -18,7 +18,7 @@ "title": { "render": { "en": "Dentist Office {name}", - "de": "Arztpraxis {name}", + "de": "Zahnarztpraxis {name}", "nl": "Tandartspraktijk {name}", "fr": "Cabinet medical {name}" } diff --git a/assets/layers/fixme/fixme.json b/assets/layers/fixme/fixme.json index 8dbeb1656..b957ee3aa 100644 --- a/assets/layers/fixme/fixme.json +++ b/assets/layers/fixme/fixme.json @@ -32,13 +32,15 @@ "type": "text" }, "question": { - "en": "What is wrong with this feature?" + "en": "What is wrong with this feature?", + "de": "Was stimmt mit diesem Objekt nicht?" }, "mappings": [ { "if": "fixme=", "then": { - "en": "This issue has been resolved" + "en": "This issue has been resolved", + "de": "Dieses Problem wurde behoben" } } ], diff --git a/assets/layers/gps_track/gps_track.json b/assets/layers/gps_track/gps_track.json index e70233149..38bc7a2fb 100644 --- a/assets/layers/gps_track/gps_track.json +++ b/assets/layers/gps_track/gps_track.json @@ -6,7 +6,8 @@ "title": { "render": { "en": "Your travelled path", - "nl": "Jouw traject" + "nl": "Jouw traject", + "de": "Deine zurückgelegte Strecke" } }, "shownByDefault": false, diff --git a/assets/layers/last_click/last_click.json b/assets/layers/last_click/last_click.json index db747228b..47f44a454 100644 --- a/assets/layers/last_click/last_click.json +++ b/assets/layers/last_click/last_click.json @@ -22,21 +22,24 @@ }, "then": { "en": "Add a new point or add a note", - "nl": "Voeg een nieuw punt of een nieuwe kaartnota toe" + "nl": "Voeg een nieuw punt of een nieuwe kaartnota toe", + "de": "Objekt oder Hinweis auf der Karte hinzufügen" } }, { "if": "has_note_layer=yes", "then": { "en": "Add a new note", - "nl": "Voeg een nieuwe kaartnota toe" + "nl": "Voeg een nieuwe kaartnota toe", + "de": "Hinweis hinzufügen" } }, { "if": "has_presets=yes", "then": { "en": "Add a new point", - "nl": "Voeg een nieuw punt toe" + "nl": "Voeg een nieuw punt toe", + "de": "Objekt hinzufügen" } } ] @@ -107,7 +110,8 @@ }, "then": { "en": "Create a new map note", - "nl": "Maak een nieuwe kaartnotitie" + "nl": "Maak een nieuwe kaartnotitie", + "de": "Hinweis auf der Karte hinzufügen" } } ] diff --git a/assets/layers/public_bookcase/public_bookcase.json b/assets/layers/public_bookcase/public_bookcase.json index 6e9aa9666..3faca922a 100644 --- a/assets/layers/public_bookcase/public_bookcase.json +++ b/assets/layers/public_bookcase/public_bookcase.json @@ -22,7 +22,7 @@ "source": { "osmTags": "amenity=public_bookcase" }, - "minzoom": 10, + "minzoom": 7, "title": { "render": { "en": "Bookcase", @@ -478,7 +478,10 @@ "id": "kid-books", "options": [ { - "question": "Kinderboeken aanwezig?", + "question": { + "en": "Has children books", + "nl": "Kinderboeken aanwezig" + }, "osmTags": "books~i~.*children.*" } ] @@ -487,7 +490,10 @@ "id": "adult-books", "options": [ { - "question": "Boeken voor volwassenen aanwezig?", + "question": { + "en": "Has books for adults", + "nl": "Boeken voor volwassenen aanwezig" + }, "osmTags": "books~i~.*adults.*" } ] @@ -505,11 +511,17 @@ } }, { - "question": "Binnen?", + "question": { + "en": "Located indoors", + "nl": "Bevindt zich binnen" + }, "osmTags": "indoor=yes" }, { - "question": "Buiten?", + "question": { + "nl": "Bevindt zich buiten", + "en": "Located outdoors" + }, "osmTags": { "or": [ "indoor=no", @@ -518,7 +530,8 @@ } } ] - } + }, + "has_image" ], "mapRendering": [ { diff --git a/assets/layers/usersettings/usersettings.json b/assets/layers/usersettings/usersettings.json index 38073cf30..988294429 100644 --- a/assets/layers/usersettings/usersettings.json +++ b/assets/layers/usersettings/usersettings.json @@ -9,7 +9,8 @@ "title": { "render": { "en": "Settings", - "nl": "Instellingen" + "nl": "Instellingen", + "de": "Einstellungen" } }, "source": "special", @@ -44,7 +45,8 @@ "href": "{_backend}/messages/inbox", "text": { "en": "Open your inbox", - "nl": "Ga naar je inbox" + "nl": "Ga naar je inbox", + "de": "Deinen Posteingang öffnen" } } } @@ -55,7 +57,8 @@ "special": { "type": "link", "text": { - "en": "You have {_unreadMessages}
Open your inbox" + "en": "You have {_unreadMessages}
Open your inbox", + "de": "Du hast {_unreadMessages}
Öffne Deinen Posteingang" }, "href": "{_backend}/messages/inbox" } @@ -69,7 +72,8 @@ "special": { "type": "link", "text": { - "en": "Open your settings on OpenStreetMap.org" + "en": "Open your settings on OpenStreetMap.org", + "de": "Öffne Deine Einstellungen auf OpenStreetMap.org" }, "href": "{_backend}/account/edit" } @@ -145,34 +149,40 @@ { "id": "show_tags", "question": { - "en": "Show the raw OpenStreetMap-tags?" + "en": "Show the raw OpenStreetMap-tags?", + "de": "Rohe OpenStreetMap-Tags anzeigen?" }, "questionHint": { - "en": "Tags are attributes that every element has. This is the technical data that is stored in the database. You don't need this information to edit with MapComplete, but advanced users might want to use this as reference." + "en": "Tags are attributes that every element has. This is the technical data that is stored in the database. You don't need this information to edit with MapComplete, but advanced users might want to use this as reference.", + "de": "Tags sind die Eigenschaften, die jedes Objekt hat. Das sind die technischen Daten, die in der Datenbank gespeichert werden. Du brauchst diese Informationen nicht, um mit MapComplete Änderungen zu machen, aber fortgeschrittenen Nutzer*innen kann es als Referenz dienen." }, "mappings": [ { "if": "mapcomplete-show_tags=no", "then": { - "en": "Never show the tags." + "en": "Never show the tags.", + "de": "Tags nie anzeigen." } }, { "if": "mapcomplete-show_tags=", "then": { - "en": "Show the tags that will be applied once I have made {__userjourney_tagsVisibleAt} changesets" + "en": "Show the tags that will be applied once I have made {__userjourney_tagsVisibleAt} changesets", + "de": "Tags anzeigen sobald ich {__userjourney_tagsVisibleAt} Changesets erstellt habe" } }, { "if": "mapcomplete-show_tags=yes", "then": { - "en": "Show the tags that will be applied when making a change" + "en": "Show the tags that will be applied when making a change", + "de": "Tags anzeigen, die bei der Änderung hinzugefügt werden" } }, { "if": "mapcomplete-show_tags=full", "then": { - "en": "Show the tags that will be applied when making a change and show the tags table on every feature" + "en": "Show the tags that will be applied when making a change and show the tags table on every feature", + "de": "Tags anzeigen, die bei der Änderung hinzugefügt werden, und Tag-Tabelle bei jedem Objekt anzeigen" } } ] diff --git a/assets/layers/walls_and_buildings/walls_and_buildings.json b/assets/layers/walls_and_buildings/walls_and_buildings.json index 5a649036a..e391929b4 100644 --- a/assets/layers/walls_and_buildings/walls_and_buildings.json +++ b/assets/layers/walls_and_buildings/walls_and_buildings.json @@ -20,7 +20,8 @@ "da": "Specielt indbygget lag giver alle vægge og bygninger. Dette lag er nyttigt i forudindstillinger til objekter, der kan placeres mod vægge (f.eks. AED'er, postkasser, indgange, adresser, overvågningskameraer, …). Dette lag er usynligt som standard og kan ikke skiftes af brugeren.", "ca": "Capa construïda especial que proporciona totes les parets i edificis. Aquesta capa és útil als predefinits per a objectes que es poden col·locar a les parets (p. ex. DEA, bústies de correus, entrades, adreces, càmeres de vigilància, ...). Aquesta capa és invisible per defecte i no es pot activar per l'usuari.", "es": "Capa especial incorporada que proporciona todas las paredes y edificios. Esta capa es útil en los preajustes para objetos que pueden colocarse contra las paredes (por ejemplo: AEDs, buzones de correos, entradas, direcciones, cámaras de vigilancia, ...). Esta capa es invisible por defecto y no puede ser activada por el usuario.", - "cs": "Speciální zabudovaná vrstva poskytující všechny stěny a budovy. Tato vrstva je užitečná v předvolbách pro objekty, které lze umístit ke stěnám (např. AED, poštovní schránky, vchody, adresy, bezpečnostní kamery, …). Tato vrstva je ve výchozím nastavení neviditelná a uživatel ji nemůže přepínat." + "cs": "Speciální zabudovaná vrstva poskytující všechny stěny a budovy. Tato vrstva je užitečná v předvolbách pro objekty, které lze umístit ke stěnám (např. AED, poštovní schránky, vchody, adresy, bezpečnostní kamery, …). Tato vrstva je ve výchozím nastavení neviditelná a uživatel ji nemůže přepínat.", + "zh_Hant": "特殊的內建圖層顯示所有牆壁與建築。這個圖層對於規畫要靠牆的東西 (例如 AED、郵筒、入口、地址、監視器等) 相當實用。這個圖層預設顯示而且無法由使用者開關。" }, "source": { "osmTags": { diff --git a/assets/tagRenderings/questions.json b/assets/tagRenderings/questions.json index 31ef35a1b..7040d80a0 100644 --- a/assets/tagRenderings/questions.json +++ b/assets/tagRenderings/questions.json @@ -558,7 +558,7 @@ "question": { "nl": "Zijn er nog andere relevante zaken die je niet in de bovenstaande vragen kwijt kon? Vul ze hier in.", "fr": "Y a-t-il quelque chose de pertinent que vous n'avez pas pu donner à la dernière question ? Ajoutez-le ici.", - "en": "Is there still something relevant you couldn't give in the previous questions? Add it here.", + "en": "Is there still some relevant info that the previous questions did not cover? Feel free to add it here.", "nb_NO": "Er det noe mer som er relevant du ikke kunne opplyse om i tidligere svar? Legg det til her.", "ru": "Есть ли ещё что-то важное, о чём вы не смогли рассказать в предыдущих вопросах? Добавьте это здесь.", "zh_Hant": "有什麼相關的資訊你無法在先前的問題回應的嗎?請加在這邊吧。", @@ -587,12 +587,12 @@ "questionHint": { "nl": "Herhaal geen antwoorden die je reeds gaf", "fr": "Ne répétez pas des réponses déjà données", - "en": "Don't repeat already stated facts", + "en": "Please don't repeat already stated facts", "nb_NO": "Ikke gjenta fakta som allerede er nevnt", "ru": "Не повторяйте уже изложенные факты", "zh_Hant": "不要重覆答覆已經知道的事情", "it": "Non ripetere informazioni già fornite", - "de": "Bitte keine bereits erhobenen Informationen.", + "de": "Bitte keine bereits erhobenen Informationen wiederholen", "pl": "Nie powtarzaj już podanych faktów", "pt_BR": " Não repita fatos já declarados", "pt": "Não repita factos já declarados", @@ -1412,7 +1412,8 @@ "href": "{_backend}/changeset/{_last_edit:changeset}", "text": { "en": "Last edited on {_last_edit:timestamp} by {_last_edit:contributor}", - "nl": "Laatst gewijzigd op {_last_edit:timestamp} door {_last_edit:contributor} " + "nl": "Laatst gewijzigd op {_last_edit:timestamp} door {_last_edit:contributor} ", + "de": "Zuletzt bearbeitet am {_last_edit:timestamp} von {_last_edit:contributor}" }, "class": "subtle font-small" } diff --git a/assets/themes/advertising/advertising.json b/assets/themes/advertising/advertising.json index d7ad409dc..e2ca043f4 100644 --- a/assets/themes/advertising/advertising.json +++ b/assets/themes/advertising/advertising.json @@ -8,7 +8,8 @@ "de": "Werbung", "cs": "Otevřít reklamní mapu", "fr": "Open Advertising Map", - "nl": "Reclame" + "nl": "Reclame", + "zh_Hant": "廣告物件" }, "shortDescription": { "ca": "On puc trobar elements publicitaris?", @@ -17,7 +18,8 @@ "de": "Wo finde ich Werbeträger?", "cs": "Kde najdu reklamní objekty?", "fr": "Où puis-je trouver des dispositifs publicitaires ?", - "nl": "Waar zijn er reclameborden?" + "nl": "Waar zijn er reclameborden?", + "zh_Hant": "我能夠在那裡找到廣告物件?" }, "description": { "ca": "Alguna vegada t'has preguntat quanta publictat hi ha als nostres carrers i carreteres? Amb aquest mapa podràs trobar i afegir informació de tots els elements publictaris que t'hi trobes pel carrer", @@ -27,7 +29,8 @@ "cs": "Přemýšleli jste někdy o tom, kolik je v našich ulicích a na silnicích reklam? Pomocí této mapy můžete najít a doplnit informace o všech reklamních prvcích, které můžete na ulici najít", "fr": "Vous êtes-vous déjà demandé combien de publicité il y a dans nos rue ou sur nos routes ? Avec cette carte vous pouvez trouver et ajouter des informations sur tous les dispositifs publicitaires que vous pouvez trouver dans la rue", "nl": "Heb je je ooit afgevraagd hoeveel reclameborden er zijn in onze straten? Met deze kaart kan je deze vinden en informatie toevoegen", - "pt_BR": "Você já se perguntou quantas propagandas existem em nossas ruas e estradas? Com este mapa você pode encontrar e adicionar informações sobre todos os recursos de publicidade que você pode encontrar na rua" + "pt_BR": "Você já se perguntou quantas propagandas existem em nossas ruas e estradas? Com este mapa você pode encontrar e adicionar informações sobre todos os recursos de publicidade que você pode encontrar na rua", + "zh_Hant": "你曾經好奇路上有多少廣告物件?有了這份地圖,你可以找到所有路上能夠看到的廣告物件" }, "maintainer": "Offsel", "icon": "./assets/themes/advertising/icon.svg", diff --git a/assets/themes/aed/aed.json b/assets/themes/aed/aed.json index cfb4f8531..4ad04fb45 100644 --- a/assets/themes/aed/aed.json +++ b/assets/themes/aed/aed.json @@ -12,7 +12,7 @@ "it": "Mappa dei defibrillatori (DAE)", "ru": "Открытая карта АВД (Автоматизированных внешних дефибрилляторов)", "ja": "オープンAEDマップ", - "zh_Hant": "開放AED地圖", + "zh_Hant": "除顫器", "nb_NO": "Åpne AED-kart", "sv": "Öppna AED-karta", "pl": "Otwórz mapę AED", diff --git a/assets/themes/artwork/artwork.json b/assets/themes/artwork/artwork.json index 60461c60f..5204bf56e 100644 --- a/assets/themes/artwork/artwork.json +++ b/assets/themes/artwork/artwork.json @@ -10,7 +10,7 @@ "it": "Mappa libera delle opere d'arte", "ru": "Открытая карта произведений искусства", "ja": "オープン アートワーク マップ", - "zh_Hant": "開放藝術品地圖", + "zh_Hant": "藝術品", "sv": "Öppen konstverkskarta", "pl": "Otwórz mapę dzieł sztuki", "nb_NO": "Kunstkort", @@ -33,7 +33,7 @@ "ru": "Добро пожаловать на открытую карта произведений искусства - карту статуй, бюстов, граффити и других произведений искусства по всему миру", "es": "Un mapa abierto de Estatuas, bustos, Graffitis y otras Obras de Arte en todo el mundo", "ja": "オープン アートワーク マップへようこそ。世界中の銅像や胸像、壁の落書きなどのアートワークの地図です", - "zh_Hant": "歡迎來到開放藝術品地圖,這份地圖會顯示全世界的雕像、半身像、塗鴉以及其他類型的藝術品", + "zh_Hant": "顯示全世界的雕像、半身像、塗鴉以及其他類型的藝術品的地圖", "nb_NO": "Statuer, byster, graffiti, og andre kunstverk verden over", "hu": "Szobrok, mellszobrok, graffitik és egyéb műalkotások nyílt világtérképe", "pl": "Witaj w Open Artwork Map, mapie pomników, popierś, graffitti i innych dzieł sztuki z całego świata", diff --git a/assets/themes/atm/atm.json b/assets/themes/atm/atm.json index a19bb9692..af18997e4 100644 --- a/assets/themes/atm/atm.json +++ b/assets/themes/atm/atm.json @@ -10,7 +10,8 @@ "cs": "Bankomaty", "nb_NO": "Minibanker", "zgh": "ⴰⵍⵍⴰⵍⵏ ⵏ ⵓⵙⴽⵙⵍ ⴰⵡⵓⵔⵎⴰⵏ", - "id": "Mesin ATM" + "id": "Mesin ATM", + "zh_Hant": "自動櫃員機" }, "description": { "en": "This map shows ATMs to withdraw or deposit money", @@ -21,7 +22,8 @@ "cs": "Tato mapa zobrazuje bankomaty pro výběr nebo vklad peněz", "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" + "id": "Peta ini menunjukkan ATM untuk menarik atau menyetorkan uang", + "zh_Hant": "這份地圖顯示領錢與存錢的 ATM" }, "icon": "./assets/themes/atm/logo.svg", "startLat": 0, @@ -80,7 +82,9 @@ "tags": "tags", "maproulette_id": "mr_taskId", "text": { - "en": "Import this ATM" + "en": "Import this ATM", + "de": "Diesen Geldautomaten importieren", + "zh_Hant": "匯入這座 ATM" }, "icon": "./assets/svg/addSmall.svg" } @@ -90,7 +94,8 @@ "id": "closeness-indicator", "condition": "_has_closeby_feature=yes", "render": { - "en": "OpenStreetMap knows about an ATM which is {_closest_osm_poi_distance} meter away. " + "en": "OpenStreetMap knows about an ATM which is {_closest_osm_poi_distance} meter away. ", + "de": "OpenStreetMap kennt einen Geldautomaten, der {_closest_osm_poi_distance} Meter entfernt ist. " } }, { @@ -102,7 +107,8 @@ "tags_to_apply": "$tags", "id_of_object_to_apply_this_one": "_closest_osm_poi", "message": { - "en": "Add all the suggested tags to the closest ATM" + "en": "Add all the suggested tags to the closest ATM", + "de": "Füge alle vorgeschlagenen Tags zum nächstgelegenen Geldautomaten hinzu" }, "image": "./assets/svg/addSmall.svg", "maproulette_task_id": "mr_taskId" diff --git a/assets/themes/bag/bag.json b/assets/themes/bag/bag.json index 7d1205322..89de76cd5 100644 --- a/assets/themes/bag/bag.json +++ b/assets/themes/bag/bag.json @@ -8,7 +8,8 @@ "nb_NO": "BAG-importhjelper", "ca": "Assistent d'importació del BAG", "es": "Ayudante de importación BAG", - "cs": "Pomocník pro import BAG" + "cs": "Pomocník pro import BAG", + "zh_Hant": "BAG 匯入助手" }, "shortDescription": { "nl": "BAG import helper tool", diff --git a/assets/themes/benches/benches.json b/assets/themes/benches/benches.json index 5b67b00b5..aae697754 100644 --- a/assets/themes/benches/benches.json +++ b/assets/themes/benches/benches.json @@ -47,7 +47,7 @@ "it": "Questa mappa mostra tutte le panchine che sono state aggiunte su OpenStreetMap: panchine individuali e quelle alle fermate del trasporto pubblico o nei ripari. Se disponi di un account OpenStreetMap puoi mappare delle nuove panchine o modificare i dettagli di quelle esistenti.", "ru": "На этой карте показаны все скамейки, записанные в OpenStreetMap: отдельные скамейки, а также скамейки, относящиеся к остановкам общественного транспорта или навесам. Имея учётную запись OpenStreetMap, вы можете наносить на карту новые скамейки или редактировать информацию о существующих скамейках.", "ja": "このマップには、OpenStreetMapに記録されているすべてのベンチが表示されます。個々のベンチ、および公共交通機関の停留所または避難場所に属するベンチです。OpenStreetMapアカウントを使用すると、新しいベンチをマップしたり、既存のベンチの詳細を編集したりできます。", - "zh_Hant": "這份地圖顯示開放街圖上所有記錄的長椅:單獨的長椅,屬於大眾運輸站點或涼亭的長椅。只要有開放街圖帳號,你可以新增長椅或是編輯既有長椅的詳細內容。", + "zh_Hant": "這份地圖顯示開放街圖上所有記錄的長椅:單獨的長椅,屬於大眾運輸站點或涼亭的長椅。", "hu": "Ez a térkép megjeleníti az OpenStreetMap-en rögzített összes padot: egyes padokat, valamint tömegközlekedési megállókban vagy menedékhelyeken található padokat. OpenStreetMap-fiókkal Ön is felrajzolhat új padokat, vagy szerkesztheti a meglévő padok részleteit.", "ca": "Aquest mapa mostra tots els bancs que hi ha a OpenStreetMap: bancs individuals i els bancs que hi ha a parades o refugis de transport públic.", "es": "Este mapa muestra todos los bancos que están registrados en OpenStreetMap: Bancos individuales, bancos que pertenecen a paradas o marquesinas del transporte público.", diff --git a/assets/themes/bicycle_rental/bicycle_rental.json b/assets/themes/bicycle_rental/bicycle_rental.json index 8e5337b12..204594d81 100644 --- a/assets/themes/bicycle_rental/bicycle_rental.json +++ b/assets/themes/bicycle_rental/bicycle_rental.json @@ -11,7 +11,8 @@ "nb_NO": "Sykkelutleie", "da": "Cykeludlejning", "pa_PK": "سائیکل کرایا", - "cs": "Půjčovna kol" + "cs": "Půjčovna kol", + "zh_Hant": "單車租借站" }, "shortDescription": { "en": "A map with bicycle rental stations and bicycle rental shops", diff --git a/assets/themes/cafes_and_pubs/cafes_and_pubs.json b/assets/themes/cafes_and_pubs/cafes_and_pubs.json index f46087abd..4a16d5a3c 100644 --- a/assets/themes/cafes_and_pubs/cafes_and_pubs.json +++ b/assets/themes/cafes_and_pubs/cafes_and_pubs.json @@ -28,7 +28,8 @@ "nb_NO": "Kneiper og barer", "pa_PK": "پب (بار)", "cs": "Kavárny, hospody a bary", - "it": "Pub e bar" + "it": "Pub e bar", + "zh_Hant": "咖啡廳、俱樂部與酒吧" }, "icon": "./assets/layers/cafe_pub/pub.svg", "startLat": 0, diff --git a/assets/themes/campersite/campersite.json b/assets/themes/campersite/campersite.json index e8e477b8d..64dc9a020 100644 --- a/assets/themes/campersite/campersite.json +++ b/assets/themes/campersite/campersite.json @@ -38,7 +38,7 @@ "it": "Questo sito raccoglie tutti i luoghi ufficiali dove sostare con il camper e aree dove è possibile scaricare acque grigie e nere. Puoi aggiungere dettagli riguardanti i servizi forniti e il loro costo. Aggiungi foto e recensioni. Questo è al contempo un sito web e una web app. I dati sono memorizzati su OpenStreetMap in modo tale che siano per sempre liberi e riutilizzabili da qualsiasi app.", "ru": "На этом сайте собраны все официальные места остановки кемперов и места, где можно сбросить серую и черную воду. Вы можете добавить подробную информацию о предоставляемых услугах и их стоимости. Добавлять фотографии и отзывы. Это веб-сайт и веб-приложение. Данные хранятся в OpenStreetMap, поэтому они будут бесплатными всегда и могут быть повторно использованы любым приложением.", "ja": "このWebサイトでは、すべてのキャンピングカーの公式停車場所と、汚水を捨てることができる場所を収集します。提供されるサービスとコストに関する詳細を追加できます。写真とレビューを追加します。これはウェブサイトとウェブアプリです。データはOpenStreetMapに保存されるので、永遠に無料で、どんなアプリからでも再利用できます。", - "zh_Hant": "這個網站收集所有官方露營地點,以及那邊能排放廢水。你可以加上詳細的服務項目與價格,加上圖片以及評價。這是網站與網路 app,資料則是存在開放街圖,因此會永遠免費,而且可以被所有 app 再利用。", + "zh_Hant": "這個網站收集所有官方露營地點,以及那邊能排放廢水。你可以加上詳細的服務項目與價格,加上圖片以及評價。", "nl": "Deze website verzamelt en toont alle officiële plaatsen waar een camper mag overnachten en afvalwater kan lozen. Ook jij kan extra gegevens toevoegen, zoals welke services er geboden worden en hoeveel dit kot, ook afbeeldingen en reviews kan je toevoegen. De data wordt op OpenStreetMap opgeslagen en is dus altijd gratis te hergebruiken, ook door andere applicaties.", "fr": "Ce site collecte les zones de camping officielles ainsi que les aires de vidange. Il est possible d’ajouter des détails à propos des services proposés ainsi que leurs coûts. Ajoutez vos images et avis. C’est un site et une application. Les données sont stockées sur OpenStreetMap, elles seront toujours gratuites et peuvent être réutilisées par n’importe quelle application.", "de": "Eine Karte für offizielle Wohnmobilstellplätze und Orte zur Entsorgung von Schmutzwasser. Sie können Details über die angebotenen Dienstleistungen und die Kosten hinzufügen, oder Bilder und Bewertungen ergänzen.", diff --git a/assets/themes/grb/grb.json b/assets/themes/grb/grb.json index 16442efbf..d7fb198de 100644 --- a/assets/themes/grb/grb.json +++ b/assets/themes/grb/grb.json @@ -202,7 +202,8 @@ { "id": "grb-reference", "render": { - "en": "Has been imported from GRB, reference number is {source:geometry:ref}" + "en": "Has been imported from GRB, reference number is {source:geometry:ref}", + "de": "Wurde von GRB importiert, Referenznummer ist {source:geometry:ref}" }, "condition": "source:geometry:ref~*" }, diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json index 610733fa1..f4667f718 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json @@ -1,13 +1,19 @@ { "id": "mapcomplete-changes", "title": { - "en": "Changes made with MapComplete" + "en": "Changes made with MapComplete", + "de": "Mit MapComplete erstellte Änderungen", + "nl": "Wijzigingen gemaakt met MapComplete" }, "shortDescription": { - "en": "Shows changes made by MapComplete" + "en": "Show changes made with MapComplete", + "de": "Mit MapComplete erstellte Änderungen anzeigen", + "nl": "Toon wijzigingen gemaakt met MapComplete" }, "description": { - "en": "This maps shows all the changes made with MapComplete" + "en": "This maps shows all the changes made with MapComplete", + "de": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen", + "nl": "Deze kaart toont alle wijzigingen die met MapComplete gemaakt werden" }, "icon": "./assets/svg/logo.svg", "hideFromOverview": true, @@ -20,7 +26,9 @@ { "id": "mapcomplete-changes", "name": { - "en": "Changeset centers" + "en": "Changeset centers", + "de": "Zentrum der Änderungssätze", + "nl": "Centerpunt van changeset" }, "minzoom": 0, "source": { @@ -31,41 +39,51 @@ }, "title": { "render": { - "en": "Changeset for {theme}" + "en": "Changeset for {theme}", + "de": "Änderungssatz für {theme}" } }, "description": { - "en": "Shows all MapComplete changes" + "en": "Show all MapComplete changes", + "de": "Alle MapComplete-Änderungen anzeigen", + "nl": "Toon alle MapComplete wijzigingen" }, "tagRenderings": [ { "id": "show_changeset_id", "render": { - "en": "Changeset {id}" + "en": "Changeset {id}", + "de": "Änderungssatz {id}" } }, { "id": "contributor", "question": { - "en": "What contributor did make this change?" + "en": "Which contributor made this change?", + "de": "Welcher Mitwirkende hat diese Änderung vorgenommen?", + "nl": "Welke bijdrager maakte deze wijziging?" }, "freeform": { "key": "user" }, "render": { - "en": "Change made by {user}" + "en": "Change made by {user}", + "de": "Änderung gemacht von {user}", + "nl": "Wijziging gemaakt door {user}" } }, { "id": "theme-id", "question": { - "en": "What theme was used to make this change?" + "en": "What theme was used to make this change?", + "de": "Welches Thema wurde für diese Änderung verwendet?\"" }, "freeform": { "key": "theme" }, "render": { - "en": "Change with theme {theme}" + "en": "Change with theme {theme}", + "de": "Geändert mit Thema {theme}" } }, { @@ -74,19 +92,27 @@ "key": "locale" }, "question": { - "en": "What locale (language) was this change made in?" + "en": "What locale (language) was this change made in?", + "de": "In welcher Sprache wurde diese Änderung vorgenommen?", + "nl": "In welke locale (taal) werd deze wijziging gemaakt?" }, "render": { - "en": "User locale is {locale}" + "en": "User locale is {locale}", + "de": "Usersprache ist {locale}", + "nl": "De gebruikerstaal is {locale}" } }, { "id": "host", "render": { - "en": "Change with with {host}" + "en": "Change made with {host}", + "de": "Änderung vorgenommen mit {host}", + "nl": "Wijziging gemaakt met {host}" }, "question": { - "en": "What host (website) was this change made with?" + "en": "What host (website) was this change made with?", + "de": "Mit welchem Host / welcher Website wurde diese Änderung gemacht?", + "nl": "Met welke host (website) werd deze wijziging gemaakt?" }, "freeform": { "key": "host" @@ -107,10 +133,12 @@ { "id": "version", "question": { - "en": "What version of MapComplete was used to make this change?" + "en": "What version of MapComplete was used to make this change?", + "de": "Mit welcher Version von MapComplete wurde diese Änderung gemacht?" }, "render": { - "en": "Made with {editor}" + "en": "Made with {editor}", + "de": "Erstellt mit {editor}" }, "freeform": { "key": "editor" @@ -448,7 +476,9 @@ } ], "question": { - "en": "Themename contains {search}" + "en": "Theme name contains {search}", + "de": "Themenname enthält {search}", + "nl": "Themenaam bevat {search}" } } ] @@ -464,7 +494,9 @@ } ], "question": { - "en": "Made by contributor {search}" + "en": "Made by contributor {search}", + "de": "Erstellt von {search}", + "nl": "Gemaakt door bijdrager {search}" } } ] @@ -480,7 +512,9 @@ } ], "question": { - "en": "Not made by contributor {search}" + "en": "Not made by contributor {search}", + "de": "Nicht erstellt von {search}", + "nl": "Niet gemaakt door bijdrager {search}" } } ] @@ -497,7 +531,9 @@ } ], "question": { - "en": "Made before {search}" + "en": "Made before {search}", + "de": "Erstellt vor {search}", + "nl": "Gemaakt voor {search}" } } ] @@ -514,7 +550,9 @@ } ], "question": { - "en": "Made after {search}" + "en": "Made after {search}", + "de": "Erstellt nach {search}", + "nl": "Gemaakt na {search}" } } ] @@ -530,7 +568,9 @@ } ], "question": { - "en": "User language (iso-code) {search}" + "en": "User language (iso-code) {search}", + "de": "Benutzersprache (ISO-Code) {search}", + "nl": "De taal van de bijdrager is {search}" } } ] @@ -546,7 +586,9 @@ } ], "question": { - "en": "Made with host {search}" + "en": "Made with host {search}", + "de": "Erstellt mit Host {search}", + "nl": "Gemaakt met host {search}" } } ] @@ -557,7 +599,9 @@ { "osmTags": "add-image>0", "question": { - "en": "Changeset added at least one image" + "en": "Changeset added at least one image", + "de": "Changeset fügte mindestens ein Bild hinzu", + "nl": "Changeset bevat minstens één afbeelding" } } ] @@ -572,7 +616,8 @@ { "id": "link_to_more", "render": { - "en": "More statistics can be found here" + "en": "More statistics can be found here", + "de": "Mehr Statistiken gibt es hier" } }, { diff --git a/assets/themes/maproulette/maproulette.json b/assets/themes/maproulette/maproulette.json index 4d8d80b38..0c27f2396 100644 --- a/assets/themes/maproulette/maproulette.json +++ b/assets/themes/maproulette/maproulette.json @@ -9,7 +9,8 @@ "pa_PK": "میپ‌رولیٹ دے کم", "nl": "MapRoulette taken", "es": "Tareas de MapRoulette", - "cs": "Úkoly MapRoulette" + "cs": "Úkoly MapRoulette", + "zh_Hant": "MapRoulette 任務" }, "description": { "en": "Theme showing MapRoulette tasks, allowing you to search, filter and fix them.", diff --git a/assets/themes/maxspeed/maxspeed.json b/assets/themes/maxspeed/maxspeed.json index a64cf9ee1..dd289fd63 100644 --- a/assets/themes/maxspeed/maxspeed.json +++ b/assets/themes/maxspeed/maxspeed.json @@ -10,7 +10,8 @@ "nl": "Maximale snelheden", "pa_PK": "حد رفتار", "cs": "Maximální rychlost", - "ru": "Ограничения скорости" + "ru": "Ограничения скорости", + "zh_Hant": "最高速限" }, "shortDescription": { "en": "This map shows the legally allowed maximum speed on every road.", @@ -20,7 +21,8 @@ "da": "Dette kort viser den lovligt tilladte maksimale hastighed på hver vej.", "cs": "Tato mapa zobrazuje zákonem povolenou maximální rychlost na každé silnici.", "es": "Este mapa muestra la velocidad máxima permitida legalmente en cada carretera.", - "ca": "Aquest mapa mostra la velocitat màxima permesa legalment a cada carretera." + "ca": "Aquest mapa mostra la velocitat màxima permesa legalment a cada carretera.", + "zh_Hant": "這份地圖顯示每一條道路的法定允許的最高速限。" }, "description": { "en": "This map shows the legally allowed maximum speed on every road. If a maxspeed is missing or wrong, you can correct it here.", @@ -30,7 +32,8 @@ "nl": "Deze kaart toont de maximum toegestane snelheid voor elke weg. Als er een maximumsnelheid mist of niet klopt, kan je hem hier aanpassen.", "cs": "Tato mapa zobrazuje zákonem povolenou maximální rychlost na každé silnici. Pokud maximální rychlost chybí nebo je nesprávná, můžete ji zde opravit.", "es": "Este mapa muestra la velocidad máxima legalmente permitida en cada carretera. Si falta una velocidad máxima o es incorrecta, puedes corregirla aquí.", - "ca": "Aquest mapa mostra la velocitat màxima permesa legalment a cada carretera. Si falta una velocitat màxima o és incorrecta, podeu corregir-la aquí." + "ca": "Aquest mapa mostra la velocitat màxima permesa legalment a cada carretera. Si falta una velocitat màxima o és incorrecta, podeu corregir-la aquí.", + "zh_Hant": "這份地圖顯示每一條道路的法定允許的最高速限,如果有缺漏的最高速限或是標示錯誤,你可以在這邊更正資訊。" }, "icon": "./assets/themes/maxspeed/maxspeed_logo.svg", "startLat": 0, diff --git a/assets/themes/nature/nature.json b/assets/themes/nature/nature.json index fd4582ce7..480187491 100644 --- a/assets/themes/nature/nature.json +++ b/assets/themes/nature/nature.json @@ -9,7 +9,8 @@ "da": "Ud i naturen", "nb_NO": "Inn i naturen", "cs": "Do přírody", - "es": "En la naturaleza" + "es": "En la naturaleza", + "zh_Hant": "投入自然懷抱" }, "shortDescription": { "en": "A map for nature lovers, with interesting POI's", @@ -19,7 +20,8 @@ "fr": "Une carte pour les amoureux de la nature", "da": "Et kort for naturelskere med interessante POI'er", "cs": "Mapa pro milovníky přírody se zajímavými body zájmu", - "ca": "Un mapa per als amants de la natura, amb PDI interessants" + "ca": "Un mapa per als amants de la natura, amb PDI interessants", + "zh_Hant": "為了自然愛好者,以及有趣的興趣點的地圖" }, "description": { "en": "On this map, one can find interesting information for tourists and nature lovers.", @@ -29,7 +31,8 @@ "fr": "Retrouvez sur cette carte des informations pour les touristes et les amoureux de la nature, telles que ", "da": "På dette kort kan man finde interessant information for turister og naturelskere, som f.eks ", "cs": "Na této mapě najdete zajímavé informace pro turisty a milovníky přírody.", - "ca": "En aquest mapa es pot trobar informació interessant per a turistes i amants de la natura." + "ca": "En aquest mapa es pot trobar informació interessant per a turistes i amants de la natura.", + "zh_Hant": "在這份地圖,你可以找到觀光客與自然愛好者感興趣的資訊..." }, "icon": "./assets/themes/nature/logo.svg", "startLat": 51.20875, diff --git a/assets/themes/notes/notes.json b/assets/themes/notes/notes.json index a5c156e71..17f476cea 100644 --- a/assets/themes/notes/notes.json +++ b/assets/themes/notes/notes.json @@ -13,7 +13,8 @@ "nb_NO": "Notater på OpenStreetMap", "fr": "Notes sur OpenStreetMap", "da": "Noter på OpenStreetMap", - "cs": "Poznámky k OpenStreetMap" + "cs": "Poznámky k OpenStreetMap", + "zh_Hant": "開放街圖上的註解" }, "description": { "en": "A note is a pin on the map with some text to indicate something wrong.

Make sure to checkout the filter view to search for users and text.", @@ -24,7 +25,8 @@ "fr": "Une note est une épingle sur la carte avec du text pour indiquer une erreur.

Assurez-vous d’utiliser le filtre pour chercher des utilisateurs and du texte.", "da": "En note er en nål på kortet med noget tekst, der indikerer, at noget er forkert.

Sørg for at tjekke filtervisningen for at søge efter brugere og tekst .", "cs": "Poznámka je špendlík na mapě s textem, jež označuje, že něco není v pořádku.

Nezapomeňte si prohlédnout zobrazení filtru pro vyhledávání uživatelů a textu.", - "ca": "Una nota és un marcador al mapa amb un text per indicar alguna cosa incorrecta.

Assegureu-vos de revisar la visualització de filtres per cercar usuaris i text." + "ca": "Una nota és un marcador al mapa amb un text per indicar alguna cosa incorrecta.

Assegureu-vos de revisar la visualització de filtres per cercar usuaris i text.", + "zh_Hant": "註解會散佈在地圖上並且有一些文字說明,來顯示那邊有錯誤。

請確認用過濾檢視來搜尋使用者或是文字。" }, "icon": "./assets/themes/notes/logo.svg", "clustering": false, diff --git a/assets/themes/pets/pets.json b/assets/themes/pets/pets.json index 1a793abab..e671edd9d 100644 --- a/assets/themes/pets/pets.json +++ b/assets/themes/pets/pets.json @@ -8,7 +8,8 @@ "fr": "Vétérinaires, parcs à chiens et autres endroits pour chiens", "ca": "Veterinaris, parcs canins i altres instal·lacions per a mascotes", "es": "Veterinarios, parques para perros y otros servicios para mascotas", - "cs": "Veterináři, psí parky a další služby pro domácí zvířata" + "cs": "Veterináři, psí parky a další služby pro domácí zvířata", + "zh_Hant": "獸醫院、寵物公園以及其他寵物設施" }, "description": { "en": "On this map, you'll find various interesting places for you pets: veterinarians, dog parks, pet shops, dog-friendly restaurants, ...", @@ -39,7 +40,8 @@ "fr": "Restaurants acceptant les chiens", "ca": "Restaurants que accepten gossos", "es": "Restaurantes que admiten perros", - "cs": "Restaurace vhodné pro vstup se psy" + "cs": "Restaurace vhodné pro vstup se psy", + "zh_Hant": "寵物友善餐廳" }, "mapRendering": [ { @@ -88,7 +90,8 @@ "ca": "Botigues amigues dels gossos", "pa_PK": "کُتیاں دی اِجازت دیاں دکاناں", "es": "Tiendas aptas para perros", - "cs": "Obchody vhodné pro vstup se psy" + "cs": "Obchody vhodné pro vstup se psy", + "zh_Hant": "寵物友善商家" }, "title": { "render": { @@ -101,7 +104,8 @@ "ca": "Botigues amigues dels gossos", "pa_PK": "کُتیاں دی اِجازت دیاں دکاناں", "es": "Tiendas aptas para perros", - "cs": "Obchody vhodné pro vstup se psy" + "cs": "Obchody vhodné pro vstup se psy", + "zh_Hant": "寵物友善商家" }, "mappings": [ { @@ -197,7 +201,8 @@ "ca": "botiga amiga dels gossos", "pa_PK": "کُتیاں دی اِجازت دی دکان", "es": "Tienda adaptada para perros", - "cs": "obchod vhodný pro vstup se psem" + "cs": "obchod vhodný pro vstup se psem", + "zh_Hant": "寵物友善商家" }, "tags": [ "dog=yes", @@ -211,7 +216,8 @@ "fr": "Un magasin où vous pouvez amener votre chien presque partout", "ca": "Una botiga on pots dur al gos gairebé a tot arreu", "es": "Una tienda a la que se puede llevar un perro a casi todas partes", - "cs": "Obchod, ve kterém si můžete vzít psa téměř kamkoli" + "cs": "Obchod, ve kterém si můžete vzít psa téměř kamkoli", + "zh_Hant": "你幾乎可以攜帶寵物到處去的商店" } } ], diff --git a/assets/themes/postal_codes/postal_codes.json b/assets/themes/postal_codes/postal_codes.json index f68fba37e..1b4152edb 100644 --- a/assets/themes/postal_codes/postal_codes.json +++ b/assets/themes/postal_codes/postal_codes.json @@ -12,7 +12,8 @@ "fr": "Codes postaux", "da": "Postnumre", "pa_PK": "ڈاک کوڈ", - "cs": "Poštovní směrovací čísla" + "cs": "Poštovní směrovací čísla", + "zh_Hant": "郵遞區號" }, "shortDescription": { "en": "Postal codes", @@ -26,7 +27,8 @@ "fr": "Codes postaux", "da": "Postnumre", "pa_PK": "ڈاک کوڈ", - "cs": "Poštovní směrovací čísla" + "cs": "Poštovní směrovací čísla", + "zh_Hant": "郵遞區號" }, "description": { "en": "Postal codes", @@ -40,7 +42,8 @@ "da": "Postnumre", "nb_NO": "Postnummer", "pa_PK": "ڈاک کوڈ", - "cs": "Poštovní směrovací čísla" + "cs": "Poštovní směrovací čísla", + "zh_Hant": "郵遞區號" }, "icon": "./assets/themes/postal_codes/townhall.svg", "startLat": 0, @@ -65,7 +68,8 @@ "fr": "codes postaux", "da": "postnumre", "pa_PK": "ڈاک کوڈ", - "cs": "poštovní směrovací čísla" + "cs": "poštovní směrovací čísla", + "zh_Hant": "郵遞區號" }, "minzoom": 8, "title": { @@ -80,7 +84,8 @@ "fr": "Code postal {postal_code}", "da": "Postnummer {postal_code}", "ca": "Codi postal {postal_code}", - "cs": "Poštovní směrovací číslo {postal_code}" + "cs": "Poštovní směrovací číslo {postal_code}", + "zh_Hant": "郵遞區號 {postal_code}" } }, "description": {}, @@ -98,7 +103,8 @@ "nb_NO": "Postnummeret er {postal_code}", "da": "Postnummeret er {postal_code}", "ca": "El codi postal és {postal_code}", - "cs": "Poštovní směrovací číslo je {postal_code}" + "cs": "Poštovní směrovací číslo je {postal_code}", + "zh_Hant": "郵遞區號是 {postal_code}" } } ], @@ -163,7 +169,8 @@ "nb_NO": "rådhus", "da": "rådhuse", "es": "Municipios", - "cs": "radnice" + "cs": "radnice", + "zh_Hant": "城鎮" }, "minzoom": 12, "title": { @@ -178,7 +185,8 @@ "nb_NO": "{name}-rådhuset", "ca": "Ajuntament de {name}", "es": "Municipio {name}", - "cs": "Radnice {name}" + "cs": "Radnice {name}", + "zh_Hant": "城鎮 {name}" } }, "calculatedTags": [ diff --git a/assets/themes/rainbow_crossings/rainbow_crossings.json b/assets/themes/rainbow_crossings/rainbow_crossings.json index 46b4810b6..689c29df9 100644 --- a/assets/themes/rainbow_crossings/rainbow_crossings.json +++ b/assets/themes/rainbow_crossings/rainbow_crossings.json @@ -9,7 +9,8 @@ "ru": "Радужные пешеходные переходы", "ca": "Pasos de vianants amb l'arc de Sant Martí", "es": "Pasos de peatones arco iris", - "cs": "Přechody s duhovými barvami" + "cs": "Přechody s duhovými barvami", + "zh_Hant": "彩虹人行穿越道" }, "description": { "en": "On this map, rainbow-painted pedestrian crossings are shown and can be easily added", diff --git a/assets/themes/shops/shops.json b/assets/themes/shops/shops.json index b24954c4d..1d7b4a852 100644 --- a/assets/themes/shops/shops.json +++ b/assets/themes/shops/shops.json @@ -4,7 +4,7 @@ "en": "Shops", "fr": "Carte des magasins", "ja": "オープン ショップ マップ", - "zh_Hant": "開放商店地圖", + "zh_Hant": "商店", "ru": "Открытая карта магазинов", "de": "Geschäfte", "it": "Mappa dei negozi", @@ -27,7 +27,8 @@ "nl": "Een bewerkbare kaart met simpele informatie over winkels", "da": "Et redigerbart kort med grundlæggende butiksoplysninger", "ca": "Un mapa editable amb informació bàsica sobre botigues", - "cs": "Upravitelná mapa se základními informacemi o obchodech" + "cs": "Upravitelná mapa se základními informacemi o obchodech", + "zh_Hant": "有基本商家資訊的可編輯性的地圖" }, "description": { "en": "On this map, one can mark basic information about shops, add opening hours and phone numbers", diff --git a/assets/themes/sidewalks/sidewalks.json b/assets/themes/sidewalks/sidewalks.json index 16bc1b8ca..ed0444a3b 100644 --- a/assets/themes/sidewalks/sidewalks.json +++ b/assets/themes/sidewalks/sidewalks.json @@ -12,7 +12,8 @@ "it": "Marciapiede", "da": "Fortove", "pa_PK": "فُٹ‌پاتھ", - "cs": "Chodníky" + "cs": "Chodníky", + "zh_Hant": "人行道" }, "shortDescription": { "en": "Sidewalk mapping", @@ -37,7 +38,8 @@ "nb_NO": "Eksperimentelt tema", "da": "Eksperimentelt tema", "pa_PK": "آزمائش تھیم", - "cs": "Experimentální téma" + "cs": "Experimentální téma", + "zh_Hant": "實驗性的主題" }, "icon": "./assets/svg/bug.svg", "startLat": 0, @@ -60,7 +62,8 @@ "it": "Marciapiedi", "da": "Fortove", "pa_PK": "فُٹ‌پاتھ", - "cs": "Chodníky" + "cs": "Chodníky", + "zh_Hant": "人行道" }, "minzoom": 12, "source": { @@ -101,7 +104,8 @@ "fr": "Calque montrant les trottoirs", "da": "Lag, der viser fortove på motorveje", "ca": "Una capa que mostra les voreres de les vies", - "cs": "Vrstva zobrazující chodníky silnic" + "cs": "Vrstva zobrazující chodníky silnic", + "zh_Hant": "顯示道路的人行穿越道的圖層" }, "tagRenderings": [ { diff --git a/assets/themes/sports/sports.json b/assets/themes/sports/sports.json index 56a6e52be..2c716fb87 100644 --- a/assets/themes/sports/sports.json +++ b/assets/themes/sports/sports.json @@ -8,7 +8,8 @@ "fr": "Sports", "ca": "Esports", "es": "Deportes", - "cs": "Sport" + "cs": "Sport", + "zh_Hant": "運動" }, "shortDescription": { "en": "Map showing sport facilities.", @@ -17,7 +18,8 @@ "fr": "Carte des équipements sportifs.", "ca": "Mapa amb instal·lacions esportives.", "es": "Mapa con instalaciones deportivas.", - "cs": "Mapa se sportovními zařízeními." + "cs": "Mapa se sportovními zařízeními.", + "zh_Hant": "顯示運動設施的地圖。" }, "description": { "en": "All about sports, find sport pitches, fitness centres and more.", @@ -58,7 +60,8 @@ "de": "ein Sportgeschäft", "ca": "una tenda d'esports", "es": "una tienda de deportes", - "cs": "sportovní obchod" + "cs": "sportovní obchod", + "zh_Hant": "運動用品店" }, "description": { "en": "Add a new shop selling sports goods.", diff --git a/assets/themes/stations/stations.json b/assets/themes/stations/stations.json index afeff3bc7..6cba6f251 100644 --- a/assets/themes/stations/stations.json +++ b/assets/themes/stations/stations.json @@ -8,7 +8,8 @@ "fr": "Gares ferroviaires", "ca": "Estacions de tren", "es": "Estaciones de tren", - "cs": "Vlaková nádraží" + "cs": "Vlaková nádraží", + "zh_Hant": "火車站" }, "description": { "en": "View, edit and add details to a train station", @@ -88,7 +89,8 @@ "fr": "Couche montrant les gares", "ca": "Capa que mostra les estacions de tren", "es": "Capa que muestra las estaciones de tren", - "cs": "Vrstva zobrazující vlaková nádraží" + "cs": "Vrstva zobrazující vlaková nádraží", + "zh_Hant": "顯示火車站的圖層" }, "mapRendering": [ { @@ -281,7 +283,8 @@ "fr": "Tableau des départs", "ca": "Tauler de sortides", "es": "Tablero de salidas", - "cs": "Odjezdová tabule" + "cs": "Odjezdová tabule", + "zh_Hant": "時刻表" } }, "minzoom": 19, @@ -305,7 +308,8 @@ "fr": "De quel type de panneau de départs s'agit-il ?", "ca": "Quin tipus de tauler de sortides és aquest?", "es": "¿Qué tipo de tablero de salidas es éste?", - "cs": "Co je to za odjezdovou tabuli?" + "cs": "Co je to za odjezdovou tabuli?", + "zh_Hant": "這是那種類型的時刻表?" }, "mappings": [ { @@ -342,7 +346,8 @@ "fr": "Tableau des départs papier", "ca": "Aquest és un horari en paper", "es": "Este es un horario en papel", - "cs": "Jedná se o papírový rozvrh" + "cs": "Jedná se o papírový rozvrh", + "zh_Hant": "這份是紙本時刻表" } }, { @@ -372,7 +377,8 @@ "fr": "un panneaux des départs", "ca": "un tauler de sortides", "es": "un tablero de salidas", - "cs": "odjezdová tabule" + "cs": "odjezdová tabule", + "zh_Hant": "時刻表" }, "description": { "en": "Add a board showing departures, either electronic or paper", diff --git a/assets/themes/toilets/toilets.json b/assets/themes/toilets/toilets.json index 82e18bbf6..7d1b59cab 100644 --- a/assets/themes/toilets/toilets.json +++ b/assets/themes/toilets/toilets.json @@ -7,7 +7,7 @@ "nl": "Publieke Toiletten", "ru": "Открытая карта туалетов", "ja": "オープントイレマップ", - "zh_Hant": "開放廁所地圖", + "zh_Hant": "公共廁所", "pl": "Mapa otwartych toalet", "it": "Mappa libera delle toilet", "nb_NO": "Åpent toalettkart", diff --git a/assets/themes/transit/transit.json b/assets/themes/transit/transit.json index 595ddd25f..165cfd1d4 100644 --- a/assets/themes/transit/transit.json +++ b/assets/themes/transit/transit.json @@ -10,7 +10,8 @@ "pa_PK": "بس روٹ", "nl": "Busroutes", "es": "Rutas de autobús", - "cs": "Autobusové linky" + "cs": "Autobusové linky", + "zh_Hant": "公車路線" }, "description": { "en": "Plan your trip with the help of the public transport system.", @@ -21,7 +22,8 @@ "nb_NO": "Planlegg turen din med offentlig transport", "ca": "Planifica el teu viatge amb l'ajuda del sistema públic de transport.", "es": "Planifique su viaje con ayuda del sistema de transporte público.", - "cs": "Naplánujte si cestu pomocí systému veřejné dopravy." + "cs": "Naplánujte si cestu pomocí systému veřejné dopravy.", + "zh_Hant": "藉由大眾運輸系統來計畫你的旅程。" }, "icon": "./assets/layers/transit_stops/bus_stop.svg", "startZoom": 20, diff --git a/assets/themes/walls_and_buildings/walls_and_buildings.json b/assets/themes/walls_and_buildings/walls_and_buildings.json index c177e7ab9..d0b9c21d8 100644 --- a/assets/themes/walls_and_buildings/walls_and_buildings.json +++ b/assets/themes/walls_and_buildings/walls_and_buildings.json @@ -9,7 +9,8 @@ "nl": "Muren en gebouwen", "ca": "Murs i edificis", "es": "Muros y edificios", - "cs": "Stěny a budovy" + "cs": "Stěny a budovy", + "zh_Hant": "牆壁與建築" }, "description": { "en": "Special builtin layer providing all walls and buildings. This layer is useful in presets for objects which can be placed against walls (e.g. AEDs, postboxes, entrances, addresses, surveillance cameras, …). This layer is invisible by default and not toggleable by the user.", @@ -19,7 +20,8 @@ "nl": "Speciale ingebouwde laag voor alle muren en gebouwen. Deze laag is nuttig in voorkeuzen voor objecten die tegen muren geplaatst kunnen worden (bv. AEDs, brievenbussen, ingangen, adressen, beveiligingscamera's,…). Deze laag is standaard onzichtbaar en niet in te schakelen door de gebruiker.", "ca": "Capa construïda especial que proporciona totes les parets i edificis. Aquesta capa és útil als predefinits per a objectes que es poden col·locar a les parets (p. ex. DEA, bústies de correus, entrades, adreces, càmeres de vigilància, ...). Aquesta capa és invisible per defecte i no es pot activar per l'usuari.", "es": "Capa especial incorporada que proporciona todas las paredes y edificios. Esta capa es útil en los preajustes para objetos que pueden colocarse contra las paredes (por ejemplo: AEDs, buzones de correos, entradas, direcciones, cámaras de vigilancia, ...). Esta capa es invisible por defecto y no puede ser activada por el usuario.", - "cs": "Speciální zabudovaná vrstva poskytující všechny stěny a budovy. Tato vrstva je užitečná v předvolbách pro objekty, které lze umístit ke stěnám (např. AED, poštovní schránky, vchody, adresy, bezpečnostní kamery, …). Tato vrstva je ve výchozím nastavení neviditelná a uživatel ji nemůže přepínat." + "cs": "Speciální zabudovaná vrstva poskytující všechny stěny a budovy. Tato vrstva je užitečná v předvolbách pro objekty, které lze umístit ke stěnám (např. AED, poštovní schránky, vchody, adresy, bezpečnostní kamery, …). Tato vrstva je ve výchozím nastavení neviditelná a uživatel ji nemůže přepínat.", + "zh_Hant": "特殊的內建圖層顯示所有牆壁與建築。這個圖層對於規畫要靠牆的東西 (例如 AED、郵筒、入口、地址、監視器等) 相當實用。這個圖層預設顯示而且無法由使用者開關。" }, "icon": "./assets/layers/walls_and_buildings/walls_and_buildings.png", "startLat": 50.8465573, diff --git a/assets/themes/waste/waste.json b/assets/themes/waste/waste.json index 174d5158f..ca29f00e9 100644 --- a/assets/themes/waste/waste.json +++ b/assets/themes/waste/waste.json @@ -11,7 +11,8 @@ "da": "Affald", "es": "Basura y reciclaje", "ru": "Мусор", - "cs": "Odpad" + "cs": "Odpad", + "zh_Hant": "廢棄物" }, "description": { "en": "Map showing waste baskets and recycling facilities.", @@ -22,7 +23,8 @@ "ca": "Mapa que mostra papereres i infraestructures de reciclatge.", "da": "Kort over affaldskurve og genbrugsanlæg.", "es": "Mapa que muestra las papeleras y las instalaciones de reciclaje.", - "cs": "Mapa zobrazující koše na odpadky a recyklační zařízení." + "cs": "Mapa zobrazující koše na odpadky a recyklační zařízení.", + "zh_Hant": "顯示垃圾筒與回收設施的地圖。" }, "icon": "./assets/layers/recycling/recycling-14.svg", "startZoom": 19, diff --git a/customGenerator.html b/customGenerator.html deleted file mode 100644 index 45cd309f5..000000000 --- a/customGenerator.html +++ /dev/null @@ -1,16 +0,0 @@ - - - The custom generator has moved (temporarily), go to - - Redirecting you to the development version - - - - diff --git a/import_helper.html b/import_helper.html deleted file mode 100644 index 4280fdc73..000000000 --- a/import_helper.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - MapComplete Import Helper - - - - - - - - - - - - - - - - - - - - - -
Loading...
- - - - - diff --git a/import_viewer.html b/import_viewer.html deleted file mode 100644 index 77ace0f67..000000000 --- a/import_viewer.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - MapComplete Import Viewer - - - - - - - - - - - - - - - - - - - - - -
Loading...
- - - - - diff --git a/index.ts b/index.ts index 3d29af169..73d68c768 100644 --- a/index.ts +++ b/index.ts @@ -6,13 +6,17 @@ import ThemeViewGUI from "./UI/ThemeViewGUI.svelte" import { FixedUiElement } from "./UI/Base/FixedUiElement" // @ts-ignore -DetermineLayout.GetLayout() - .then((layout) => { - const state = new ThemeViewState(layout) - const main = new SvelteUIElement(ThemeViewGUI, { state }) - main.AttachTo("maindiv") - }) - .catch((err) => { - console.error("Error while initializing: ", err, err.stack) - new FixedUiElement(err).SetClass("block alert").AttachTo("maindiv") - }) +try { + DetermineLayout.GetLayout() + .then((layout) => { + const state = new ThemeViewState(layout) + const main = new SvelteUIElement(ThemeViewGUI, { state }) + main.AttachTo("maindiv") + }) + .catch((err) => { + console.error("Error while initializing: ", err, err.stack) + new FixedUiElement(err).SetClass("block alert").AttachTo("maindiv") + }) +} catch (err) { + new FixedUiElement(err).SetClass("block alert").AttachTo("maindiv") +} diff --git a/langs/ca.json b/langs/ca.json index 00c82ee33..d96cbec37 100644 --- a/langs/ca.json +++ b/langs/ca.json @@ -146,7 +146,6 @@ }, "back": "Tornar", "backToIndex": "Torna a la vista general amb tots els mapes temàtics", - "backToMapcomplete": "Tornar a l'explicació general de la petició", "backgroundMap": "Mapa de fons", "cancel": "Cancel·lar", "confirm": "Confirmar", diff --git a/langs/cs.json b/langs/cs.json index 12f30043d..00d662fbd 100644 --- a/langs/cs.json +++ b/langs/cs.json @@ -146,7 +146,6 @@ }, "back": "Zpět", "backToIndex": "Návrat na přehled všech tematických map", - "backToMapcomplete": "Zpět na přehled témat", "backgroundMap": "Mapa na pozadí", "cancel": "Zrušit", "confirm": "Potvrdit", diff --git a/langs/da.json b/langs/da.json index b90fe99e1..9b5e9d7ce 100644 --- a/langs/da.json +++ b/langs/da.json @@ -95,7 +95,6 @@ "translatedBy": "MapComplete er oversat af {contributors} og {hiddenCount} flere bidragsydere" }, "back": "Tilbage", - "backToMapcomplete": "Tilbage til temaoversigten", "backgroundMap": "Baggrundskort", "cancel": "Afbryd", "confirm": "Bekræft", diff --git a/langs/de.json b/langs/de.json index 4502a007c..47ed513ca 100644 --- a/langs/de.json +++ b/langs/de.json @@ -1,15 +1,20 @@ { + "advanced": { + "title": "Erweiterte Funktionen" + }, "centerMessage": { + "allFilteredAway": "Kein Objekt im Kartenausschnitt erfüllt alle Filterkriterien", "loadingData": "Daten werden geladen…", + "noData": "Es gibt keine relevanten Objekte im aktuellen Kartenausschnitt", "ready": "Erledigt!", "retrying": "Laden von Daten fehlgeschlagen. Erneuter Versuch in {count} Sekunden…", "zoomIn": "Ausschnitt vergrößern, um Daten anzuzeigen oder zu bearbeiten" }, "communityIndex": { "available": "Diese Gemeinschaft spricht {native}", - "intro": "Treten Sie mit anderen Menschen in Kontakt, um sie kennen zu lernen, von ihnen zu lernen, ...", + "intro": "Treten Sie mit anderen Menschen in Kontakt, um sie kennen zu lernen, von ihnen zu lernen, …", "notAvailable": "Diese Gemeinschaft spricht nicht {native}", - "title": "Community index" + "title": "Index der Community" }, "delete": { "cancel": "Abbrechen", @@ -55,13 +60,13 @@ "intro": "Der Benutzer wird von einer Karte mit Objekten begrüßt. Wenn er eines auswählt, werden Informationen über das Objekt angezeigt.", "title": "Wie sieht die Benutzeroberfläche aus?" }, - "examples": "Es gibt viele thematische Karten, von denen hier einige abgedruckt sind.\n\nEs gibt noch viele weitere thematische Karten online: über das Gesundheitswesen, Indoor-Navigation, Zugänglichkeit für Rollstuhlfahrer, Abfallentsorgungsanlagen, öffentliche Bücherschränke, Fußgängerüberwege mit Regenbogenmalerei,... Entdecken Sie sie alle auf mapcomplete.osm.be", + "examples": "Es gibt viele thematische Karten, von denen hier einige dargestellt sind.\n\nEs gibt noch viele weitere thematische Karten online: über das Gesundheitswesen, Indoor-Navigation, Zugänglichkeit für Rollstuhlfahrer, Abfallentsorgungsanlagen, öffentliche Bücherschränke, Fußgängerüberwege mit Regenbogenmalerei,... Entdecken Sie sie alle auf mapcomplete.osm.be", "fakeui": { "add_images": "Bilder mit ein paar Klicks hinzufügen", "attributes": "Zeigt Attribute in einer freundlichen Art und Weise", "edit": "Falsche oder überholte Informationen? Die Schaltfläche \"Bearbeiten\" ist direkt zugänglich.", "question": "Ist ein Attribut noch nicht bekannt, zeigt MapComplete eine Frage an", - "see_images": "Zeigt Bilder von früheren Mitwirkenden, Wikipedia, Mapillary, ... ", + "see_images": "Zeigt Bilder von früheren Mitwirkenden, Wikipedia, Mapillary, …", "wikipedia": "Verlinkte Wikipedia-Artikel werden angezeigt" }, "frontParagraph": "MapComplete ist eine einfach zu bedienende Webanwendung zur Erfassung von Geodaten in OpenStreetMap, die das Sammeln und Verwalten relevanter Daten in einer offenen, crowdsourced und wiederverwendbaren Weise ermöglicht.\n\nNeue Kategorien und Attribute können auf Anfrage hinzugefügt werden.", @@ -88,12 +93,19 @@ }, "general": { "about": "OpenStreetMap für ein bestimmtes Thema einfach bearbeiten und hinzufügen", + "aboutMapComplete": { + "intro": "Nutze MapComplete, um Daten zu einem bestimmten Thema auf OpenStreetMap einzutragen. Beantworte Frage, und in wenigen Minuten sind die Beiträge überall verfügbar. In den meisten Themen kannst Du Bilder hinzufügen oder sogar eine Bewertung hinterlassen. Die Themen-Ersteller*innen definieren Objekte, Fragen und Begriffe für das jeweilige Thema." + }, "add": { "addNew": "{category} hinzufügen", "backToSelect": "Wählen Sie eine andere Kategorie", - "confirmButton": "Eine {category} hinzufügen.
Ihre Ergänzung ist für alle sichtbar
", + "confirmButton": "Eine {category}
hinzufügen. Ihre Ergänzung ist für alle sichtbar
", + "confirmLocation": "Diesen Standort bestätigen", + "confirmTitle": "{title} hinzufügen?", + "confirmWarning": "Das von Dir eingetragene Objekt wird für alle sichtbar sein. Bitte füge nur Objekte hinzu, die wirklich existieren. Viele Anwendungen nutzen diese Daten.", "disableFilters": "Alle Filter deaktivieren", "disableFiltersExplanation": "Einige Elemente können durch einen Filter ausgeblendet sein", + "enableLayer": "Ebene {name} einblenden", "hasBeenImported": "Dieses Objekt wurde bereits importiert", "import": { "hasBeenImported": "Das Objekt wurde importiert", @@ -105,7 +117,7 @@ "zoomInMore": "Ansicht vergrößern, um das Objekt zu importieren" }, "importTags": "Das Element erhält {tags}", - "intro": "An dieser Stelle sind noch keine Daten vorhanden.
", + "intro": "An dieser Stelle sind noch keine Daten vorhanden.
", "layerNotEnabled": "Die Ebene {layer} ist nicht eingeschaltet. Schalten Sie die Ebene ein, um ein Objekt hinzuzufügen", "openLayerControl": "Das Ebenen-Fenster öffnen", "pleaseLogin": "Bitte anmelden, um ein neues Objekt hinzuzufügen", @@ -122,6 +134,8 @@ "isApplied": "Änderungen werden übernommen" }, "attribution": { + "attributionBackgroundLayer": "Die aktuelle Hintergrundebene ist {name}", + "attributionBackgroundLayerWithCopyright": "Die aktuelle Hintergrundebene ist {name}: {copyright}", "attributionContent": "

Alle Daten werden bereitgestellt von OpenStreetMap, frei verwendbar unter der Open Database License.

", "attributionTitle": "Danke", "codeContributionsBy": "MapComplete wurde erstellt von {contributors} und {hiddenCount} weiteren Personen", @@ -137,25 +151,28 @@ "mapContributionsBy": "Die angezeigten Daten wurden bearbeitet durch {contributors}", "mapContributionsByAndHidden": "Die angezeigten Daten wurden bearbeitet von {contributors} und {hiddenCount} weiteren Beitragenden", "mapDataByOsm": "Kartendaten: OpenStreetMap", - "mapillaryHelp": "Mapillary ist ein Online-Dienst, der Straßenbilder sammelt und sie unter einer freien Lizenz anbietet. Mitwirkende dürfen diese Bilder verwenden, um OpenStreetMap zu verbessern", + "mapillaryHelp": "Mapillary ist ein Online-Dienst, der Straßenbilder sammelt und sie unter einer freien Lizenz anbietet. Mitwirkende dürfen diese Bilder verwenden, um OpenStreetMap zu verbessern", "openIssueTracker": "Fehler melden", "openMapillary": "Mapillary öffnen", "openOsmcha": "Letzte Bearbeitungen zum Thema {theme} ansehen", "themeBy": "Dieses Thema wurde erstellt von {author}", + "title": "Copyright und Urheberrechtsangabe", "translatedBy": "MapComplete wurde übersetzt von {contributors} und {hiddenCount} weiteren Personen" }, "back": "Zurück", "backToIndex": "Zurück zur Übersicht aller thematischen Karten", - "backToMapcomplete": "Zurück zur Themenübersicht", - "backgroundMap": "Hintergrundkarte", + "backgroundMap": "Hintergrundkarte auswählen", + "backgroundSwitch": "Hintergrund wechseln", "cancel": "Abbrechen", "confirm": "Bestätigen", "customThemeIntro": "

Benutzerdefinierte Themen

Dies sind zuvor angesehene nutzergenerierte Themen.", "download": { "downloadAsPdf": "Aktuelle Karte als PDF herunterladen", "downloadAsPdfHelper": "Ideal zum Drucken der aktuellen Karte", + "downloadAsPng": "Als Bild herunterladen", + "downloadAsPngHelper": "Am besten geeignet, um in Berichten zu verwenden", "downloadAsSvg": "Aktuelle Karte als SVG herunterladen", - "downloadAsSvgHelper": "Kompatibel mit Inkscape oder Adobe Illustrator; Weiterbearbeitung erforderlich ", + "downloadAsSvgHelper": "Kompatibel mit Inkscape oder Adobe Illustrator; Weiterbearbeitung erforderlich", "downloadCSV": "Sichtbare Daten als CSV herunterladen", "downloadCSVHelper": "Kompatibel mit LibreOffice Calc, Excel, …", "downloadFeatureAsGeojson": "GeoJSON Datei herunterladen", @@ -168,7 +185,11 @@ "includeMetaData": "Metadaten übernehmen (letzter Bearbeiter, berechnete Werte, ...)", "licenseInfo": "

Copyright-Hinweis

Die bereitgestellten Daten sind unter ODbL verfügbar. Die Wiederverwendung ist für jeden Zweck frei, aber
  • die Namensnennung © OpenStreetMap contributors ist darzustellen
  • Jede Änderung muss unter der gleichen Lizenz veröffentlicht werden
Bitte lesen Sie den vollständigen Copyright-Hinweis für weitere Details.", "noDataLoaded": "Noch keine Daten geladen. Download in Kürze verfügbar", - "title": "Sichtbare Daten herunterladen", + "pdf": { + "current_view_a3": "PDF (A3, Hochformat) der aktuellen Ansicht exportieren", + "current_view_a4": "PDF (A4, Querformat) der aktuellen Ansicht exportieren" + }, + "title": "Download", "uploadGpx": "Einen Track auf OpenStreetMap hochladen" }, "error": "Etwas ist schief gelaufen", @@ -199,10 +220,14 @@ "loginToStart": "Anmelden, um diese Frage zu beantworten", "loginWithOpenStreetMap": "Bei OpenStreetMap anmelden", "logout": "Abmelden", + "menu": { + "aboutMapComplete": "Über MapComplete", + "filter": "Daten filtern" + }, "morescreen": { "createYourOwnTheme": "Ein eigenes MapComplete-Thema von Grund auf neu erstellen", "hiddenExplanation": "Diese Themen sind nur für Personen zugänglich, die einen Link erhalten haben. Sie haben {hidden_discovered} von {total_hidden} versteckten Themen entdeckt.", - "intro": "

Mehr thematische Karten?

Sammeln Sie gerne Geodaten?
Es sind weitere Themen verfügbar.", + "intro": "

Mehr thematische Karten?

Sammeln Sie gerne Geodaten?
Es sind weitere Themen verfügbar.", "noMatchingThemes": "Keine Themen, die Ihren Suchkriterien entsprechen", "noSearch": "Alle Themen anzeigen", "previouslyHiddenTitle": "Zuvor besuchte versteckte Themen", @@ -219,6 +244,7 @@ "number": "Zahl", "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", "opening_hours": { "closed_permanently": "Geschlossen auf unbestimmte Zeit", "closed_until": "Geschlossen bis {date}", @@ -243,10 +269,22 @@ }, "pickLanguage": "Sprache auswählen: ", "poweredByOsm": "Unterstützt von OpenStreetMap", + "questionBox": { + "answeredMultiple": "Du hast {answered} Fragen beantwortet", + "answeredMultipleSkippedMultiple": "Du hast {answered} Fragen beantwortet und {skipped} Fragen übersprungen", + "answeredMultipleSkippedOne": "Du hast {answered} Fragen beantwortet und eine Frage übersprungen", + "answeredOne": "Du hast eine Frage beantwortet", + "answeredOneSkippedMultiple": "Du hast eine Frage beantwortet und {skipped} Fragen übersprungen", + "answeredOneSkippedOne": "Du hast eine Frage beantwortet und eine Frage übersprungen", + "done": "Keine weiteren Fragen! Danke Dir!", + "reactivate": "Übersprungene Fragen reaktivieren", + "skippedMultiple": "Du hast {skipped} Fragen übersprungen", + "skippedOne": "Du hast eine Frage übersprungen" + }, "questions": { "emailIs": "Die E-Mail-Adresse dieser {category} lautet {email}", "emailOf": "Wie lautet die E-Mail-Adresse der {category}?", - "phoneNumberIs": "Die Telefonnummer der {category} lautet {phone}", + "phoneNumberIs": "Die Telefonnummer dieser {category} lautet {phone}", "phoneNumberOf": "Wie lautet die Telefonnummer der {category}?", "websiteIs": "Webseite: {website}", "websiteOf": "Wie lautet die Webseite der {category}?" @@ -260,6 +298,7 @@ "error": "Etwas ist schief gelaufen…", "nothing": "Nichts gefunden…", "search": "Ortssuche", + "searchShort": "Suche…", "searching": "Suchen …" }, "sharescreen": { @@ -269,7 +308,7 @@ "downloadCustomThemeHelp": "Ein erfahrener Mitwirkender kann diese Datei verwenden, um Ihr Thema zu verbessern", "editThemeDescription": "Fragen zu diesem Thema hinzufügen oder ändern", "editThisTheme": "Dieses Thema bearbeiten", - "embedIntro": "

Karte in Webseiten einbetten

Betten Sie diese Karte in Ihre Webseite ein. Die Karte ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie.", + "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.", "fsAddNew": "Schaltfläche 'neuen POI hinzufügen' aktivieren", "fsGeolocation": "Schaltfläche 'Mich geolokalisieren' aktivieren (nur mobil)", "fsIncludeCurrentBackgroundMap": "Aktuellen Hintergrund übernehmen ({name})", @@ -281,7 +320,8 @@ "fsUserbadge": "Anmeldefeld aktivieren", "fsWelcomeMessage": "Begrüßung und Registerkarten anzeigen", "intro": "

Karte teilen

Mit dem folgenden Link können Sie diese Karte mit Freunden und Familie teilen:", - "thanksForSharing": "Danke für das Teilen!" + "thanksForSharing": "Danke für das Teilen!", + "title": "Diese Karte teilen" }, "skip": "Frage überspringen", "testing": "Testen - Änderungen werden nicht gespeichert", @@ -338,6 +378,7 @@ "general": "Auf dieser Karte können Sie themenspezifische Kartenobjekte ansehen, bearbeiten und hinzufügen. Verschieben Sie den Kartenausschnitt, um Objekte zu entdecken, tippen Sie auf eines, um weitere Informationen zu sehen oder zu bearbeiten. Alle Daten stammen von OpenStreetMap und dürfen frei verwendet werden." }, "wikipedia": { + "addEntry": "Eine weitere Wikipedia-Seite hinzufügen", "createNewWikidata": "Einen neues Wikidata Element erstellen", "doSearch": "Suche oben, um Ergebnisse zu sehen", "failed": "Laden des Wikipedia-Eintrags fehlgeschlagen", @@ -360,8 +401,11 @@ "geolocate": "Verschieben Sie die Karte auf den aktuellen Standort oder zoomen Sie die Karte auf den aktuellen Standort. Beantragt Standortberechtigung", "intro": "MapComplete unterstützt folgende Tastaturbefehle:", "key": "Tastenkombination", - "openLayersPanel": "Öffnet das Bedienfeld Hintergrund, Ebenen und Filter", - "selectMapnik": "Setzt die Hintergrundebene auf OpenStreetMap-carto", + "openLayersPanel": "Öffnet das Menü für Ebenen und Filter", + "selectAerial": "Hintergrund als Luftbild oder Satellitenbild einstellen. Wechselt zwischen den zwei besten verfügbaren Ebenen", + "selectMap": "Karte aus externer Quelle als Hintergrund wählen. Wechselt zwischen den zwei besten verfügbaren Ebenen", + "selectMapnik": "OpenStreetMap-carto als Hintergrundebene wählen", + "selectOsmbasedmap": "OpenStreetMap-basierte Karte als Hintergrund auswählen (oder Hintergrundebene deaktivieren)", "selectSearch": "Suchleiste auswählen, um nach Orten zu suchen", "title": "Tastaturbefehle" }, @@ -445,7 +489,7 @@ }, "notes": { "addAComment": "Einen Kommentar hinzufügen", - "addComment": "Einen Kommentar hinzufügen", + "addComment": "Kommentar hinzufügen", "addCommentAndClose": "Einen Kommentar hinzufügen und schließen", "addCommentPlaceholder": "Einen Kommentar hinzufügen…", "anonymous": "Anonymer Benutzer", @@ -453,7 +497,7 @@ "createNote": "Eine neue Notiz erstellen", "createNoteIntro": "Ist etwas falsch oder fehlt etwas auf der Karte? Erstellen Sie hier eine Notiz. Diese werden von Freiwilligen überprüft.", "createNoteTitle": "Hier eine neue Notiz erstellen", - "creating": "Notiz wird erstellt...", + "creating": "Notiz wird erstellt…", "disableAllNoteFilters": "Alle Filter ausschalten", "isClosed": "Diese Notiz wurde erledigt", "isCreated": "Die Notiz wurde erstellt!", @@ -509,7 +553,7 @@ "reviews": { "affiliated_reviewer_warning": "(Partner-Rezension)", "attribution": "Rezensionen werden bereitgestellt von Mangrove Reviews und sind unter CC-BY 4.0 verfügbar.", - "i_am_affiliated": "Ich bin mit diem Objekt vertraut
Auswählen, wenn Sie Eigentümer, Ersteller, Angestellter … sind", + "i_am_affiliated": "Ich bin an diesem Objekt beteiligt
Auswählen, wenn Sie Eigentümer, Ersteller, Angestellter … sind", "name_required": "Der Name des Objekts ist erforderlich, um Bewertungen zu erstellen und anzuzeigen", "no_rating": "Vor dem Absenden eine Bewertung abgeben…", "no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!", @@ -539,10 +583,12 @@ "notImmediate": "Die Übersetzung wird nicht direkt aktualisiert. Dies dauert in der Regel ein paar Tage" }, "userinfo": { - "gotoInbox": "Posteingang öffnen", + "editDescription": "Eigene Profilbeschreibung bearbeiten", + "gotoInbox": "Deinen Posteingang öffnen", "gotoSettings": "Einstellungen auf OpenStreetMap.org öffnen", "noDescription": "Sie haben noch keine Profilbeschreibung", - "noDescriptionCallToAction": "Profilbeschreibung hinzufügen" + "noDescriptionCallToAction": "Profilbeschreibung hinzufügen", + "notLoggedIn": "Du hast Dich abgemeldet" }, "validation": { "color": { @@ -583,7 +629,8 @@ }, "phone": { "description": "eine Telefonnummer", - "feedback": "Dies ist keine gültige Telefonnummer" + "feedback": "Dies ist keine gültige Telefonnummer", + "feedbackCountry": "Dies ist keine gültige Telefonnummer (in {country})" }, "pnat": { "description": "eine positive, ganze Zahl", diff --git a/langs/en.json b/langs/en.json index fa8189a65..61e6a186e 100644 --- a/langs/en.json +++ b/langs/en.json @@ -12,7 +12,7 @@ }, "communityIndex": { "available": "This community speaks {native}", - "intro": "Get in touch with other people to get to know them, learn from them, ...", + "intro": "Get in touch with other people to get to know them, learn from them, …", "notAvailable": "This community does not speak {native}", "title": "Community index" }, @@ -60,13 +60,13 @@ "intro": "The user is greeted by a map with features. Upon selecting one, the information about that feature is shown.", "title": "What does the interface look like?" }, - "examples": "There are many thematic maps available of which a few are printed here.\n\nThere are many more thematic maps online: about healthcare, indoor navigation, wheelchair accessibility, waste facilities, public bookcases, pedestrian crossings with a rainbow-painting,... Discover them all on mapcomplete.osm.be", + "examples": "There are many thematic maps available of which a few are shown here.\n\nThere are many more thematic maps online: about healthcare, indoor navigation, wheelchair accessibility, waste facilities, public bookcases, pedestrian crossings with a rainbow-painting,… Discover them all on mapcomplete.osm.be", "fakeui": { "add_images": "Add images with a few clicks", "attributes": "Shows attributes in a friendly way", "edit": "Wrong or outdated info? The edit button is right there.", "question": "If an attribute is not yet known, MapComplete shows a question", - "see_images": "Shows images from previous contributors, Wikipedia, Mapillary, ... ", + "see_images": "Shows images from previous contributors, Wikipedia, Mapillary, …", "wikipedia": "Linked Wikipedia articles are shown" }, "frontParagraph": "MapComplete is an easy to use web application to collect geodata in OpenStreetMap, enabling collecting and managing relevant data in an open, crowdsourced and reusable way.\n\nNew categories and attributes can be added upon request.", @@ -92,6 +92,7 @@ "whatIsOsm": "What is OpenStreetMap?" }, "general": { + "404": "This page does not exist", "about": "Easily edit and add OpenStreetMap for a certain theme", "aboutMapComplete": { "intro": "Use MapComplete to add OpenStreetMap info on a single theme. Answer questions, and within minutes your contributions are available everywhere. In most themes you can add pictures or even leave a review. The theme maintainer defines elements, questions and languages for it." @@ -161,7 +162,6 @@ }, "back": "Back", "backToIndex": "Go back to the overview with all thematic maps", - "backToMapcomplete": "Back to the theme overview", "backgroundMap": "Select a background layer", "backgroundSwitch": "Switch background", "cancel": "Cancel", @@ -278,7 +278,7 @@ "answeredOneSkippedMultiple": "You answered one question and skipped {skipped} questions", "answeredOneSkippedOne": "You answered one and skipped one question", "done": "No more questions! Thank you!", - "reactivate": "Reactive skipped questions", + "reactivate": "Reactivate skipped questions", "skippedMultiple": "You skipped {skipped} questions", "skippedOne": "You skipped one question" }, @@ -498,7 +498,7 @@ "createNote": "Create a new note", "createNoteIntro": "Is something wrong or missing on the map? Create a note here. These will be checked by volunteers.", "createNoteTitle": "Create a new note here", - "creating": "Creating note...", + "creating": "Creating note…", "disableAllNoteFilters": "Disable all filters", "isClosed": "This note is resolved", "isCreated": "Your note has been created!", diff --git a/langs/es.json b/langs/es.json index 84e55b3c3..4a3d2da7b 100644 --- a/langs/es.json +++ b/langs/es.json @@ -102,7 +102,6 @@ }, "back": "Atrás", "backToIndex": "Volver a la vista general con todos los mapas temáticos", - "backToMapcomplete": "Volver a la vista de temas", "backgroundMap": "Mapa de fondo", "cancel": "Cancelar", "confirm": "Confirmar", diff --git a/langs/fr.json b/langs/fr.json index a55177b30..73846ee81 100644 --- a/langs/fr.json +++ b/langs/fr.json @@ -63,6 +63,7 @@ "addNew": "Ajouter {category}", "backToSelect": "Sélectionner une catégorie différente", "confirmButton": "Ajouter un/une {category} ici.
Votre ajout sera visible par tout le monde
", + "confirmLocation": "Confirmer cet emplacement", "disableFilters": "Désactiver tous les filtres", "disableFiltersExplanation": "Certains élément peuvent être filtrés", "hasBeenImported": "Cet élément a déjà été importé", @@ -117,7 +118,6 @@ }, "back": "Retour", "backToIndex": "Revenir vers l'aperçu de toutes les cartes thématiques", - "backToMapcomplete": "Retour à l'aperçu du thème", "backgroundMap": "Fond de plan", "cancel": "Annuler", "confirm": "Confirmer", @@ -207,6 +207,9 @@ }, "pickLanguage": "Choisir la langue : ", "poweredByOsm": "Propulsé par OpenStreetMap", + "questionBox": { + "reactivate": "Réactiver les questions passées" + }, "questions": { "emailIs": "L'adresse électronique de {category} est {email}", "emailOf": "Quelle est l'adresse électronique de {category} ?", diff --git a/langs/hu.json b/langs/hu.json index 83bea582f..afd36563b 100644 --- a/langs/hu.json +++ b/langs/hu.json @@ -91,7 +91,6 @@ "themeBy": "A téma karbantartója: {author}" }, "back": "Vissza", - "backToMapcomplete": "Vissza a témák áttekintéséhez", "backgroundMap": "Háttértérkép", "cancel": "Mégse", "confirm": "Megerősítés", diff --git a/langs/it.json b/langs/it.json index 68e75e6af..171f0fcbd 100644 --- a/langs/it.json +++ b/langs/it.json @@ -96,7 +96,6 @@ "translatedBy": "MapComplete è stata tradotta da {contributors} e da {hiddenCount} contributori aggiuntivi" }, "back": "Indietro", - "backToMapcomplete": "Torna alla panoramica sull'argomento", "backgroundMap": "Mappa di sfondo", "cancel": "Annulla", "confirm": "Conferma", diff --git a/langs/layers/de.json b/langs/layers/de.json index 13dcdcb16..b4a6b185c 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -670,7 +670,7 @@ "then": "Diese Bank hat kein integriertes Kunstwerk" } }, - "question": "Hat diese Bank ein künstlerisches Element? ", + "question": "Hat diese Bank ein künstlerisches Element?", "questionHint": "Z.B. hat es ein integriertes Gemälde, eine Statue oder eine andere nicht triviale, kreative Arbeit" }, "bench-backrest": { @@ -730,8 +730,8 @@ "then": "Diese Bank hat (wahrscheinlich) keine Inschrift" } }, - "question": "Hat diese Bank eine Inschrift? ", - "questionHint": "Z.B. auf einer angebrachten Plakette, in der Rückenlehne, ... ", + "question": "Hat diese Bank eine Inschrift?", + "questionHint": "Z.B. auf einer angebrachten Plakette, in der Rückenlehne, ...", "render": "Diese Bank hat folgende Inschrift:

{inscription}

" }, "bench-material": { @@ -2115,6 +2115,9 @@ }, "4": { "then": "Die Station ist nicht für die Allgemeinheit zugänglich (z. B. nur für die Eigentümer, Mitarbeiter, …)" + }, + "5": { + "then": "Diese Ladestation ist zu gewissen Öffnungszeiten oder Bedingungen öffentlich zugänglich. Einschränkungen sind möglich, aber generelle Nutzung ist erlaubt." } }, "question": "Wer darf diese Ladestation benutzen?", @@ -2572,6 +2575,9 @@ "question": "Welche Leistung bietet ein einzelner Stecker vom Typ
Typ 2 mit Kabel (Mennekes)
?", "render": "
Typ 2 mit Kabel (Mennekes)
liefert maximal {socket:type2_cable:output}" }, + "questions-technical": { + "render": "

Technische Frage

Die nächsten Fragen sind sehr technisch. Du kannst diese auch überspringen.
{questions(technical)}" + }, "ref": { "question": "Welche Kennnummer hat die Ladestation?", "render": "Die Kennziffer ist {ref}" @@ -4006,7 +4012,7 @@ } }, "title": { - "render": "Arztpraxis {name}" + "render": "Zahnarztpraxis {name}" } }, "direction": { @@ -4687,6 +4693,12 @@ "name": "OSM-Objekte mit FIXME-Tags", "tagRenderings": { "fixme": { + "mappings": { + "0": { + "then": "Dieses Problem wurde behoben" + } + }, + "question": "Was stimmt mit diesem Objekt nicht?", "render": "Fixme Text: {fixme}" }, "note": { @@ -5084,6 +5096,9 @@ "Privacy notice": { "render": "Dies ist der Weg, den Sie seit dem Besuch dieser Webseite zurückgelegt haben. Keine Sorge - diese Daten sind nur für Sie sichtbar und für niemanden sonst. Ihre Standortdaten werden niemals an ein anderes Gerät gesendet." } + }, + "title": { + "render": "Deine zurückgelegte Strecke" } }, "hackerspace": { @@ -5548,9 +5563,27 @@ "mapRendering": { "0": { "label": { + "mappings": { + "0": { + "then": "Hinweis auf der Karte hinzufügen" + } + }, "render": "Hier klicken, um ein neues Element hinzuzufügen" } } + }, + "title": { + "mappings": { + "0": { + "then": "Objekt oder Hinweis auf der Karte hinzufügen" + }, + "1": { + "then": "Hinweis hinzufügen" + }, + "2": { + "then": "Objekt hinzufügen" + } + } } }, "map": { @@ -8853,6 +8886,24 @@ } } }, + "inbox": { + "mappings": { + "0": { + "then": { + "special": { + "text": "Deinen Posteingang öffnen" + } + } + }, + "1": { + "then": { + "special": { + "text": "Du hast {_unreadMessages}
Öffne Deinen Posteingang" + } + } + } + } + }, "picture-license": { "mappings": { "0": { @@ -8870,6 +8921,13 @@ }, "question": "Unter welcher Lizenz möchten Sie Ihre Bilder veröffentlichen?" }, + "settings-link": { + "render": { + "special": { + "text": "Öffne Deine Einstellungen auf OpenStreetMap.org" + } + } + }, "show_debug": { "mappings": { "0": { @@ -8884,6 +8942,24 @@ }, "question": "Debug-Informationen zu den Benutzereinstellungen anzeigen?" }, + "show_tags": { + "mappings": { + "0": { + "then": "Tags nie anzeigen." + }, + "1": { + "then": "Tags anzeigen sobald ich {__userjourney_tagsVisibleAt} Changesets erstellt habe" + }, + "2": { + "then": "Tags anzeigen, die bei der Änderung hinzugefügt werden" + }, + "3": { + "then": "Tags anzeigen, die bei der Änderung hinzugefügt werden, und Tag-Tabelle bei jedem Objekt anzeigen" + } + }, + "question": "Rohe OpenStreetMap-Tags anzeigen?", + "questionHint": "Tags sind die Eigenschaften, die jedes Objekt hat. Das sind die technischen Daten, die in der Datenbank gespeichert werden. Du brauchst diese Informationen nicht, um mit MapComplete Änderungen zu machen, aber fortgeschrittenen Nutzer*innen kann es als Referenz dienen." + }, "translation-completeness": { "mappings": { "0": { @@ -8930,6 +9006,9 @@ } } } + }, + "title": { + "render": "Einstellungen" } }, "veterinary": { diff --git a/langs/layers/en.json b/langs/layers/en.json index 27f216f22..d3eeba0a5 100644 --- a/langs/layers/en.json +++ b/langs/layers/en.json @@ -129,7 +129,7 @@ "then": "Electoral advertising" }, "4": { - "then": "Inormation related to theatre, concerts, ..." + "then": "Information related to theatre, concerts, …" }, "5": { "then": "Message from non-profit organizations" @@ -731,7 +731,7 @@ } }, "question": "Does this bench have an inscription?", - "questionHint": "E.g. on a mounted plaque, in the backrest, ...", + "questionHint": "E.g. on a mounted plaque, in the backrest, …", "render": "This bench does have the following inscription:

{inscription}

" }, "bench-material": { @@ -1109,7 +1109,7 @@ "then": "This cleaning service is free to use" }, "1": { - "then": "This cleaning service is paid" + "then": "There is a fee to use this cleaning service" } }, "question": "How much does it cost to use the cleaning service?", diff --git a/langs/layers/zh_Hant.json b/langs/layers/zh_Hant.json index 80bb0fa7e..c13bd051c 100644 --- a/langs/layers/zh_Hant.json +++ b/langs/layers/zh_Hant.json @@ -16,7 +16,7 @@ } }, "artwork": { - "description": "不同類型的藝術品", + "description": "顯示全世界的雕像、半身像、塗鴉以及其他類型的藝術品的地圖", "name": "藝術品", "presets": { "0": { @@ -612,6 +612,9 @@ } } }, + "walls_and_buildings": { + "description": "特殊的內建圖層顯示所有牆壁與建築。這個圖層對於規畫要靠牆的東西 (例如 AED、郵筒、入口、地址、監視器等) 相當實用。這個圖層預設顯示而且無法由使用者開關。" + }, "windturbine": { "name": "風機", "presets": { diff --git a/langs/nb_NO.json b/langs/nb_NO.json index e9b8bf4e5..de0ede216 100644 --- a/langs/nb_NO.json +++ b/langs/nb_NO.json @@ -125,7 +125,6 @@ "translatedBy": "MapComplete har blitt oversatt av {contributors} og {hiddenCount} andre bidragsytere." }, "back": "Tilbake", - "backToMapcomplete": "Tilbake til temaoversikten", "backgroundMap": "Bakgrunnskart", "cancel": "Avbryt", "confirm": "Bekreft", diff --git a/langs/nl.json b/langs/nl.json index 6929e2303..4775dd260 100644 --- a/langs/nl.json +++ b/langs/nl.json @@ -148,7 +148,6 @@ }, "back": "Vorige", "backToIndex": "Keer terug naar het overzicht met alle thematische kaarten", - "backToMapcomplete": "Terug naar het themaoverzicht", "backgroundMap": "Selecteer een achtergrondlaag", "cancel": "Annuleren", "confirm": "Bevestigen", diff --git a/langs/pt.json b/langs/pt.json index d73f25298..c6ac285a5 100644 --- a/langs/pt.json +++ b/langs/pt.json @@ -134,7 +134,6 @@ }, "back": "Voltar", "backToIndex": "Volte para a visão geral com todos os mapas temáticos", - "backToMapcomplete": "Voltar à visão geral do tema", "backgroundMap": "Mapa de fundo", "cancel": "Cancelar", "confirm": "Confirmar", diff --git a/langs/shared-questions/de.json b/langs/shared-questions/de.json index 40c97a528..4c25a79e0 100644 --- a/langs/shared-questions/de.json +++ b/langs/shared-questions/de.json @@ -57,7 +57,7 @@ }, "description": { "question": "Gibt es noch etwas, das die vorhergehenden Fragen nicht abgedeckt haben? Hier wäre Platz dafür.", - "questionHint": "Bitte keine bereits erhobenen Informationen." + "questionHint": "Bitte keine bereits erhobenen Informationen wiederholen" }, "dog-access": { "mappings": { @@ -138,6 +138,13 @@ } } }, + "last_edit": { + "render": { + "special": { + "text": "Zuletzt bearbeitet am {_last_edit:timestamp} von {_last_edit:contributor}" + } + } + }, "level": { "mappings": { "0": { diff --git a/langs/shared-questions/en.json b/langs/shared-questions/en.json index 631841198..8d686d5a2 100644 --- a/langs/shared-questions/en.json +++ b/langs/shared-questions/en.json @@ -56,8 +56,8 @@ "question": "what notes can you use to pay here?" }, "description": { - "question": "Is there still something relevant you couldn't give in the previous questions? Add it here.", - "questionHint": "Don't repeat already stated facts" + "question": "Is there still some relevant info that the previous questions did not cover? Feel free to add it here.", + "questionHint": "Please don't repeat already stated facts" }, "dog-access": { "mappings": { diff --git a/langs/themes/de.json b/langs/themes/de.json index b7bbd382f..36353d8fe 100644 --- a/langs/themes/de.json +++ b/langs/themes/de.json @@ -14,6 +14,31 @@ }, "atm": { "description": "Diese Karte zeigt Geldautomaten zum Abheben oder Einzahlen von Geld", + "layers": { + "3": { + "override": { + "=tagRenderings": { + "0": { + "render": { + "special": { + "text": "Diesen Geldautomaten importieren" + } + } + }, + "1": { + "render": "OpenStreetMap kennt einen Geldautomaten, der {_closest_osm_poi_distance} Meter entfernt ist. " + }, + "2": { + "render": { + "special": { + "message": "Füge alle vorgeschlagenen Tags zum nächstgelegenen Geldautomaten hinzu" + } + } + } + } + } + } + }, "title": "Geldautomaten" }, "bag": { @@ -698,6 +723,9 @@ "tagRenderings": { "building type": { "question": "Was ist das für ein Gebäude?" + }, + "grb-reference": { + "render": "Wurde von GRB importiert, Referenznummer ist {source:geometry:ref}" } } }, @@ -771,6 +799,112 @@ "description": "Eine Karte mit Bordsteinen und Überwegen.", "title": "Bordsteine und Überwege" }, + "mapcomplete-changes": { + "description": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen", + "layers": { + "0": { + "description": "Alle MapComplete-Änderungen anzeigen", + "filter": { + "0": { + "options": { + "0": { + "question": "Themenname enthält {search}" + } + } + }, + "1": { + "options": { + "0": { + "question": "Erstellt von {search}" + } + } + }, + "2": { + "options": { + "0": { + "question": "Nicht erstellt von {search}" + } + } + }, + "3": { + "options": { + "0": { + "question": "Erstellt vor {search}" + } + } + }, + "4": { + "options": { + "0": { + "question": "Erstellt nach {search}" + } + } + }, + "5": { + "options": { + "0": { + "question": "Benutzersprache (ISO-Code) {search}" + } + } + }, + "6": { + "options": { + "0": { + "question": "Erstellt mit Host {search}" + } + } + }, + "7": { + "options": { + "0": { + "question": "Changeset fügte mindestens ein Bild hinzu" + } + } + } + }, + "name": "Zentrum der Änderungssätze", + "tagRenderings": { + "contributor": { + "question": "Welcher Mitwirkende hat diese Änderung vorgenommen?", + "render": "Änderung gemacht von {user}" + }, + "host": { + "question": "Mit welchem Host / welcher Website wurde diese Änderung gemacht?", + "render": "Änderung vorgenommen mit {host}" + }, + "locale": { + "question": "In welcher Sprache wurde diese Änderung vorgenommen?", + "render": "Usersprache ist {locale}" + }, + "show_changeset_id": { + "render": "Änderungssatz {id}" + }, + "theme-id": { + "question": "Welches Thema wurde für diese Änderung verwendet?\"", + "render": "Geändert mit Thema {theme}" + }, + "version": { + "question": "Mit welcher Version von MapComplete wurde diese Änderung gemacht?", + "render": "Erstellt mit {editor}" + } + }, + "title": { + "render": "Änderungssatz für {theme}" + } + }, + "1": { + "override": { + "tagRenderings+": { + "0": { + "render": "Mehr Statistiken gibt es hier" + } + } + } + } + }, + "shortDescription": "Mit MapComplete erstellte Änderungen anzeigen", + "title": "Mit MapComplete erstellte Änderungen" + }, "maproulette": { "description": "Thema mit MapRoulette-Aufgaben, die Sie suchen, filtern und beheben können.", "title": "MapRoulette-Aufgaben" diff --git a/langs/themes/en.json b/langs/themes/en.json index 11c81c3a7..382ec151a 100644 --- a/langs/themes/en.json +++ b/langs/themes/en.json @@ -803,12 +803,12 @@ "description": "This maps shows all the changes made with MapComplete", "layers": { "0": { - "description": "Shows all MapComplete changes", + "description": "Show all MapComplete changes", "filter": { "0": { "options": { "0": { - "question": "Themename contains {search}" + "question": "Theme name contains {search}" } } }, @@ -865,12 +865,12 @@ "name": "Changeset centers", "tagRenderings": { "contributor": { - "question": "What contributor did make this change?", + "question": "Which contributor made this change?", "render": "Change made by {user}" }, "host": { "question": "What host (website) was this change made with?", - "render": "Change with {host}" + "render": "Change made with {host}" }, "locale": { "question": "What locale (language) was this change made in?", @@ -902,7 +902,7 @@ } } }, - "shortDescription": "Shows changes made by MapComplete", + "shortDescription": "Show changes made with MapComplete", "title": "Changes made with MapComplete" }, "maproulette": { diff --git a/langs/themes/zh_Hant.json b/langs/themes/zh_Hant.json index 2f1b6683e..f209bca65 100644 --- a/langs/themes/zh_Hant.json +++ b/langs/themes/zh_Hant.json @@ -1,17 +1,47 @@ { + "advertising": { + "description": "你曾經好奇路上有多少廣告物件?有了這份地圖,你可以找到所有路上能夠看到的廣告物件", + "shortDescription": "我能夠在那裡找到廣告物件?", + "title": "廣告物件" + }, "aed": { "description": "在這份地圖上,你可以找到與標記附近的除顫器", - "title": "開放AED地圖" + "title": "除顫器" }, "artwork": { - "description": "歡迎來到開放藝術品地圖,這份地圖會顯示全世界的雕像、半身像、塗鴉以及其他類型的藝術品", - "title": "開放藝術品地圖" + "description": "顯示全世界的雕像、半身像、塗鴉以及其他類型的藝術品的地圖", + "title": "藝術品" + }, + "atm": { + "description": "這份地圖顯示領錢與存錢的 ATM", + "layers": { + "3": { + "override": { + "=tagRenderings": { + "0": { + "render": { + "special": { + "text": "匯入這座 ATM" + } + } + } + } + } + } + }, + "title": "自動櫃員機" + }, + "bag": { + "title": "BAG 匯入助手" }, "benches": { - "description": "這份地圖顯示開放街圖上所有記錄的長椅:單獨的長椅,屬於大眾運輸站點或涼亭的長椅。只要有開放街圖帳號,你可以新增長椅或是編輯既有長椅的詳細內容。", + "description": "這份地圖顯示開放街圖上所有記錄的長椅:單獨的長椅,屬於大眾運輸站點或涼亭的長椅。", "shortDescription": "長椅的地圖", "title": "長椅" }, + "bicycle_rental": { + "title": "單車租借站" + }, "bicyclelib": { "description": "單車圖書館是指每年支付小額費用,然後可以租用單車的地方。最有名的單車圖書館案例是給小孩的,能夠讓長大的小孩用目前的單車換成比較大的單車", "title": "單車圖書館" @@ -26,10 +56,11 @@ "title": "開放書架地圖" }, "cafes_and_pubs": { + "description": "咖啡廳、俱樂部與酒吧", "title": "咖啡廳與酒吧" }, "campersite": { - "description": "這個網站收集所有官方露營地點,以及那邊能排放廢水。你可以加上詳細的服務項目與價格,加上圖片以及評價。這是網站與網路 app,資料則是存在開放街圖,因此會永遠免費,而且可以被所有 app 再利用。", + "description": "這個網站收集所有官方露營地點,以及那邊能排放廢水。你可以加上詳細的服務項目與價格,加上圖片以及評價。", "layers": { "0": { "description": "露營地", @@ -340,11 +371,28 @@ "shortDescription": "顯示消防栓、滅火器、消防隊與急救站的地圖。", "title": "消防栓、滅火器、消防隊、以及急救站。" }, + "maproulette": { + "title": "MapRoulette 任務" + }, "maps": { "description": "在這份地圖你可以找到所在在開放街圖上已知的地圖 - 特別是顯示地區、城市、區域的資訊版面上的大型地圖,例如佈告欄背面的旅遊地圖,自然保護區的地圖,區域的單車網路地圖,...)

如果有缺少的地圖,你可以輕易在開放街圖上新增這地圖。", "shortDescription": "這份主題顯示所有已知的開放街圖上的 (旅遊) 地圖", "title": "地圖的地圖" }, + "maxspeed": { + "description": "這份地圖顯示每一條道路的法定允許的最高速限,如果有缺漏的最高速限或是標示錯誤,你可以在這邊更正資訊。", + "shortDescription": "這份地圖顯示每一條道路的法定允許的最高速限。", + "title": "最高速限" + }, + "nature": { + "description": "在這份地圖,你可以找到觀光客與自然愛好者感興趣的資訊...", + "shortDescription": "為了自然愛好者,以及有趣的興趣點的地圖", + "title": "投入自然懷抱" + }, + "notes": { + "description": "註解會散佈在地圖上並且有一些文字說明,來顯示那邊有錯誤。

請確認用過濾檢視來搜尋使用者或是文字。", + "title": "開放街圖上的註解" + }, "observation_towers": { "description": "開放可及能觀景的高塔", "shortDescription": "開發可及能觀景的高塔", @@ -363,25 +411,134 @@ "description": "從所有可用的主題圖層創建個人化主題", "title": "個人化主題" }, + "pets": { + "layers": { + "1": { + "override": { + "name": "寵物友善餐廳" + } + }, + "2": { + "override": { + "name": "寵物友善商家", + "title": { + "render": "寵物友善商家" + } + } + }, + "6": { + "override": { + "presets": { + "0": { + "description": "你幾乎可以攜帶寵物到處去的商店", + "title": "寵物友善商家" + } + } + } + } + }, + "title": "獸醫院、寵物公園以及其他寵物設施" + }, "playgrounds": { "description": "在這份地圖上,你可以尋找遊樂場以及其相關資訊", "shortDescription": "遊樂場的地圖", "title": "遊樂場" }, + "postal_codes": { + "description": "郵遞區號", + "layers": { + "0": { + "name": "郵遞區號", + "tagRenderings": { + "postal_code": { + "render": "郵遞區號是 {postal_code}" + } + }, + "title": { + "render": "郵遞區號 {postal_code}" + } + }, + "2": { + "name": "城鎮", + "title": { + "render": "城鎮 {name}" + } + } + }, + "shortDescription": "郵遞區號", + "title": "郵遞區號" + }, "postboxes": { "description": "在這份地圖你能找到與新增有關郵局與郵筒的資料,你可以用這份地圖找到寄送您下張明信片的地方!:)
發現錯誤或是有郵筒遺漏嗎?你可以用免費的開放街圖帳號來編輯。 ", "shortDescription": "顯示郵筒與郵局的地圖", "title": "郵筒與郵局地圖" }, + "rainbow_crossings": { + "title": "彩虹人行穿越道" + }, "shops": { "description": "這份地圖上,你可以標記商家基本資訊,新增營業時間以及聯絡電話", - "title": "開放商店地圖" + "shortDescription": "有基本商家資訊的可編輯性的地圖", + "title": "商店" + }, + "sidewalks": { + "description": "實驗性的主題", + "layers": { + "0": { + "description": "顯示道路的人行穿越道的圖層", + "name": "人行道" + } + }, + "title": "人行道" }, "sport_pitches": { "description": "運動場地是進行運動的地方", "shortDescription": "顯示運動場地的地圖", "title": "運動場地" }, + "sports": { + "layers": { + "4": { + "override": { + "presets": { + "0": { + "title": "運動用品店" + } + } + } + } + }, + "shortDescription": "顯示運動設施的地圖。", + "title": "運動" + }, + "stations": { + "layers": { + "3": { + "description": "顯示火車站的圖層" + }, + "16": { + "presets": { + "0": { + "title": "時刻表" + } + }, + "tagRenderings": { + "type": { + "mappings": { + "2": { + "then": "這份是紙本時刻表" + } + }, + "question": "這是那種類型的時刻表?" + } + }, + "title": { + "render": "時刻表" + } + } + }, + "title": "火車站" + }, "street_lighting": { "description": "在這份地圖你可以找到任何有關路燈的事情", "layers": { @@ -445,13 +602,25 @@ }, "toilets": { "description": "公共廁所的地圖", - "title": "開放廁所地圖" + "title": "公共廁所" + }, + "transit": { + "description": "藉由大眾運輸系統來計畫你的旅程。", + "title": "公車路線" }, "trees": { "description": "繪製所有樹木!", "shortDescription": "所有樹木的地圖", "title": "樹木" }, + "walls_and_buildings": { + "description": "特殊的內建圖層顯示所有牆壁與建築。這個圖層對於規畫要靠牆的東西 (例如 AED、郵筒、入口、地址、監視器等) 相當實用。這個圖層預設顯示而且無法由使用者開關。", + "title": "牆壁與建築" + }, + "waste": { + "description": "顯示垃圾筒與回收設施的地圖。", + "title": "廢棄物" + }, "waste_basket": { "description": "在這份地圖當中,你可以找到你附近的垃圾筒。如果地圖有遺漏垃圾筒,你可以自己加上去", "shortDescription": "垃圾筒的地圖", diff --git a/langs/zh_Hant.json b/langs/zh_Hant.json index c2903bdc6..3d48b102e 100644 --- a/langs/zh_Hant.json +++ b/langs/zh_Hant.json @@ -1,10 +1,21 @@ { + "advanced": { + "title": "進階功能" + }, "centerMessage": { + "allFilteredAway": "檢視畫面當中沒有滿足過瀘條件的圖徵", "loadingData": "正在讀取資料…", + "noData": "目前檢視畫面沒有相關的圖徵", "ready": "完成!", "retrying": "無法讀取資料,請在 {count} 秒後再試一次…", "zoomIn": "放大來檢視或編輯資料" }, + "communityIndex": { + "available": "這個社群說 {native}", + "intro": "與其他人接洽並且與他們熟悉,從他們的經驗學習,...", + "notAvailable": "這個社群不說 {native}", + "title": "社群索引" + }, "delete": { "cancel": "取消", "cannotBeDeleted": "這圖徵無法刪除", @@ -107,7 +118,6 @@ "translatedBy": "MapComplete 由 {contributors} 翻譯,而且還有 {hiddenCount} 更多貢獻者" }, "back": "回去", - "backToMapcomplete": "回到主題總覽", "backgroundMap": "背景地圖", "cancel": "取消", "confirm": "確認", diff --git a/notfound.ts b/notfound.ts index 0da141d4f..da596ea9d 100644 --- a/notfound.ts +++ b/notfound.ts @@ -1,5 +1,4 @@ -import { FixedUiElement } from "./UI/Base/FixedUiElement" -import Combine from "./UI/Base/Combine" -import BackToIndex from "./UI/BigComponents/BackToIndex" +import SvelteUIElement from "./UI/Base/SvelteUIElement" +import NotFound from "./UI/NotFound.svelte" -new Combine([new FixedUiElement("This page is not found"), new BackToIndex()]).AttachTo("maindiv") +new SvelteUIElement(NotFound, {}).AttachTo("maindiv") diff --git a/package.json b/package.json index 7124ffb35..510859243 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapcomplete", - "version": "0.30.7", + "version": "0.30.9", "repository": "https://github.com/pietervdvn/MapComplete", "description": "A small website to edit OSM easily", "bugs": "https://github.com/pietervdvn/MapComplete/issues", @@ -41,7 +41,7 @@ "prepare-deploy": "npm run generate:service-worker && ./scripts/build.sh", "format": "prettier --write '**/*.ts' '**/*.svelte'", "clean:tests": "(find . -type f -name \"*.doctest.ts\" | xargs -r rm)", - "clean": "rm -rf .cache/ && (find *.html | grep -v \"^\\(404\\|index\\|land\\|test\\|preferences\\|studio\\|professional\\|automaton\\|import_helper\\|import_viewer\\|theme\\|style_test\\).html\" | xargs -r rm) && (ls | grep \"^index_[a-zA-Z_-]\\+\\.ts$\" | xargs -r rm) && (ls | grep \".*.webmanifest$\" | grep -v \"manifest.webmanifest\" | xargs -r rm)", + "clean": "rm -rf .cache/ && (find *.html | grep -v \"^\\(404\\|index\\|land\\|test\\|studio\\|theme\\|style_test\\|statistics\\).html\" | xargs -r rm) && (ls | grep \"^index_[a-zA-Z_-]\\+\\.ts$\" | xargs -r rm) && (ls | grep \".*.webmanifest$\" | grep -v \"manifest.webmanifest\" | xargs -r rm)", "generate:dependency-graph": "node_modules/.bin/depcruise --exclude \"^node_modules\" --output-type dot Logic/State/MapState.ts > dependencies.dot && dot dependencies.dot -T svg -o dependencies.svg && rm dependencies.dot", "weblate-add-upstream": "git remote add weblate-github git@github.com:weblate/MapComplete.git && git remote add weblate-hosted-core https://hosted.weblate.org/git/mapcomplete/core/ && git remote add weblate-hosted-layers https://hosted.weblate.org/git/mapcomplete/layers/", "weblate-merge": "git remote update weblate-github; git merge weblate-github/weblate-mapcomplete-core weblate-github/weblate-mapcomplete-layers weblate-github/weblate-mapcomplete-layer-translations", diff --git a/scripts/conflate.ts b/scripts/conflate.ts index 4f045d845..e25abfbf5 100644 --- a/scripts/conflate.ts +++ b/scripts/conflate.ts @@ -91,6 +91,14 @@ export class Conflate extends Script { const unmatched = external_features.filter( (f) => !bestMatches.some((matched) => matched.match.external_feature === f) ) + const weirdMatch = external_features.filter((f) => + bestMatches.some( + (matched) => + matched.match.external_feature === f && + !matched.replayed.certainly_imported && + !matched.replayed.possibly_imported + ) + ) const match_lengths: (string | number)[][] = [ [ "osm_id", @@ -111,6 +119,9 @@ export class Conflate extends Script { if (Object.keys(resting_properties).length === 0) { continue } + if (!certainly_imported && !possibly_imported) { + continue + } const id = osm_feature.properties["@id"] match_lengths.push([ id, @@ -153,6 +164,19 @@ export class Conflate extends Script { " " ) ) + + fs.writeFileSync( + targetDir + "/unmatched_but_has_close_feature.geojson", + JSON.stringify( + { + type: "FeatureCollection", + features: weirdMatch, + }, + + null, + " " + ) + ) } private async findTimeFork( @@ -292,12 +316,12 @@ export class Conflate extends Script { } if (properties["website"]) { let website = properties.website.toLowerCase() - website + website = website .replace("http://http://", "http://") .replace("https://https://", "https://") .replace("https//", "https://") .replace("http://", "https://") - if (website.startsWith("https://")) { + if (!website.startsWith("https://")) { website = "https://" + website } const validator = new UrlValidator() diff --git a/scripts/generateDocs.ts b/scripts/generateDocs.ts index ed2e0c639..9d0e90c48 100644 --- a/scripts/generateDocs.ts +++ b/scripts/generateDocs.ts @@ -34,6 +34,9 @@ function WriteFile( noTableOfContents: boolean } ): void { + if (!html) { + return + } for (const source of autogenSource) { if (source.indexOf("*") > 0) { continue @@ -106,7 +109,8 @@ function GenerateDocumentationForTheme(theme: LayoutConfig): BaseUIElement { function GenLayerOverviewText(): BaseUIElement { for (const id of Constants.priviliged_layers) { if (!AllSharedLayers.sharedLayers.has(id)) { - throw "Priviliged layer definition not found: " + id + console.error("Priviliged layer definition not found: " + id) + return undefined } } diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index 144d429f3..72ae082cf 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -434,30 +434,27 @@ class LayerOverviewUtils extends Script { const themeInfo = themeFiles[i] const themePath = themeInfo.path let themeFile = themeInfo.parsed - console.log(`Validating ${i}/${themeFiles.length} '${themeInfo.parsed.id}'`) - { - const targetPath = - LayerOverviewUtils.themePath + - "/" + - themePath.substring(themePath.lastIndexOf("/")) - const usedLayers = Array.from( - 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" - ) - ) + + const targetPath = + LayerOverviewUtils.themePath + "/" + themePath.substring(themePath.lastIndexOf("/")) + const usedLayers = Array.from( + 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") ) - skippedThemes.push(themeFile.id) - continue - } - recompiledThemes.push(themeFile.id) + ) + console.log("Skipping", themeFile.id) + skippedThemes.push(themeFile.id) + continue } + console.log(`Validating ${i}/${themeFiles.length} '${themeInfo.parsed.id}'`) + + recompiledThemes.push(themeFile.id) new PrevalidateTheme().convertStrict(themeFile, themePath) try {