diff --git a/Docs/FilterFunctionality.gif b/Docs/FilterFunctionality.gif new file mode 100644 index 0000000000..69b826dc4b Binary files /dev/null and b/Docs/FilterFunctionality.gif differ diff --git a/Docs/FilteredByDepth.gif b/Docs/FilteredByDepth.gif new file mode 100644 index 0000000000..3af61e8d3e Binary files /dev/null and b/Docs/FilteredByDepth.gif differ diff --git a/Docs/Making_Your_Own_Theme.md b/Docs/Making_Your_Own_Theme.md index 5279b8b969..7848988d22 100644 --- a/Docs/Making_Your_Own_Theme.md +++ b/Docs/Making_Your_Own_Theme.md @@ -4,6 +4,11 @@ Making your own theme In MapComplete, it is relatively simple to make your own theme. This guide will give some information on how you can do this. +Table of contents: + +1. [Requirements](#requirements) which lists what you should know before starting to create a theme +2. [What is a good theme?](#what-is-a-good-theme) + Requirements ------------ @@ -15,14 +20,217 @@ Before you start, you should have the following qualifications: - You are in contact with your local OpenStreetMap community and do know some other members to discuss tagging and to help testing -If you do not have those qualifications, reach out to the MapComplete community channel +Please, do reach out to the MapComplete community channel on [Telegram](https://t.me/MapComplete) or [Matrix](https://app.element.io/#/room/#MapComplete:matrix.org). + +What is a good theme? +--------------------- + +A **theme** (or _layout_) is a single map showing one or more layers. +The layers should work together in such a way that they serve a certain **audience**. +You should be able to state in a few sentences whom would be the user of such a map, e.g. + +- a cyclist searching for bike repair +- a thirsty person who needs water +- someone who wants to know what their street is named after +- ... + +Some layers will be useful for many themes (e.g. _drinking water_, _toilets_, _shops_, ...). Due to this, MapComplete supports to reuse already existing official layers into a theme. + +To include an already existing layer, simply type the layer id, e.g.: + +```json +{ + "id": "my-theme", + "title": "My theme for xyz", + "...": "...", + "layers": [ + { + "id": "my super-awesome new layer" + }, + "bench", + "shops", + "drinking_water", + "toilet" + ] +} +``` + +Note that it is good practice to use an existing layer and to tweak it: + +```json +{ + "id": "my super awesome theme", + "...": "...", + "layers": [ + { + "builtin": [ + "toilet", + "bench" + ], + "override": { + "#": "Override is a section which copies all the keys here and 'pastes' them into the existing layers. For example, the 'minzoom' defined here will redifine the minzoom of 'toilet' and 'bench'", + "minzoom": 17, + "#0": "Appending to lists is supported to, e.g. to add an extra question", + "tagRenderings+": [ + { + "id": "new-question", + "question": "What is ?", + "render": "{property}", + "...": "..." + } + ], + "#1": "Note that paths will be followed: the below block will add/change the icon of the layer, without changing the other properties of the first tag rendering. (Assumption: the first mapRendering is the icon rendering)", + "mapRendering": [ + { + "icon": { + "render": "new-icon.svg" + } + } + ] + } + } + ] +} + +``` + +### What is a good layer? + +A good layer is layer which shows **all** objects of a certain type, e.g. **all** shops, **all** restaurants, ... + +It asks some relevant questions, with the most important and easiests questions first. + +#### Don't: use a layer to filter + +**Do not define a layer which filters on an attribute**, such as all restaurants with a vegetarian diet, all shops which accept bitcoin. +This makes _addition_ of new points difficult as information might not yet be known. Conser the following situation: + +1. A theme defines a layer `vegetarian restaurants`, which matches `amenity=restaurant` & `diet:vegetarian=yes`. +2. An object exists in OSM with `amenity=restaurant`;`name=Fancy Food`;`diet:vegan=yes`;`phone=...`;... +3. A contributor visits the themes and will notice that _Fancy Food_ is missing +4. The contributor will add _Fancy Food_ +5. There are now **two** Fancy Food objects in OSM. + +Instead, use the filter functionality instead. This can be used from the layer to hide some objects based on their properties. +When the contributor wants to add a new point, they'll be notified that some features might be hidden and only be allowed to add a new point when the points are shown. + +![](./FilterFunctionality.gif) + +```json +{ + "id": "my awesome layer", + "tagRenderings": "... some relevant attributes and questions ...", + "mapRenderings": "... display on the map ... ", + "filter": [ + { + "id": "vegetarian", + "options": [ + { + "question": { + "en": "Has a vegetarian menu" + }, + "osmTags": { + "or": [ + "diet:vegetarian=yes", + "diet:vegetarian=only", + "diet:vegan=yes", + "diet:vegan=only" + ] + } + } + ] + } + ] +} +``` + +If you want to show only features of a certain type, there is a workaround. +For example, the [fritures map](https://mapcomplete.osm.be/fritures.html?z=1&welcome-control-toggle=true) will show french fries shop, aka every `amenity~fast_food|restaurant` with `cuisine=friture`. +However, quite a few fritures are already mapped as fastfood but have their `cuisine`-tag missing (or misspelled). + +There is a workaround for this: show **all** food related items at zoomlevel 19 (or higher), and only show the fritures when zoomed out. + +In order to achieve this: + +1. The layer 'food' is defined in a separate file and reused +2. The layer food is imported in the theme 'fritures'. With 'override', some properties are changed, namely: + - The `osmTags` are overwritten: `cuisine=friture` is now required + - The presets are overwritten and _disabled_ + - The _id_ and _name_ of the layer are changed +3. The layer `food` is imported _a second time_, but now the minzoom is set to `19`. This will show _all_ restaurants. + +In case of a friture which is already added as fastfood, they'll see the fastfood popup instead of adding a new item: + +![](./FilteredByDepth.gif) + +```json +{ + "layers": [ + { + "builtin": "food", + "override": { + "id": "friture", + "name": { + "en": "Fries shop" + }, + "=presets": [], + "source": { + "=osmTags": { + "and": [ + "cuisine=friture", + { + "or": [ + "amenity=fast_food", + "amenity=restaurant" + ] + } + ] + } + } + } + }, + { + "builtin": "food", + "override": { + "minzoom": 19, + "filter": null, + "name": null + } + } + ] +} +``` + + +### What is a good question and tagrendering? + +A tagrendering maps an attribute onto a piece of human readable text. +These should be **full sentences**, e.g. `"render": "The maximum speed of this road is {maxspeed} km/h"` + +In some cases, there might be some predifined special values as mappings, such as `"mappings": [{"if": "maxspeed=30", "then": "The maxspeed is 30km/h"}]` + +The question then follows logically: `{"question": "What is the maximum allowed speed for this road, in km/h?"}` +At last, you'll also want to say that the user can type an answer too and that it has to be a number: `"freeform":{"key": "maxspeed","type":"pnat"}`. + +The entire tagRendering will thus be: + +```json +{ + "question": "What is the maximum allowed speed for this road, in km/h?", + "render": "The maximum speed of this road is {maxspeed} km/h", + "freeform":{"key": "maxspeed","type":"pnat"}, + "mappings": [{"if": "maxspeed=30", "then": "The maxspeed is 30km/h"}] +} +``` + + The template ------------ -[A basic template is availalbe here](https://github.com/pietervdvn/MapComplete/blob/develop/Docs/theme-template.json) +[A basic template is available here](https://github.com/pietervdvn/MapComplete/blob/develop/Docs/theme-template.json) The custom theme generator -------------------------- @@ -229,18 +437,21 @@ disregarding other properties. One should not make one layer for benches with a backrest and one layer for benches without. This is confusing for users and poses problems: what if the backrest status is unknown? What if it is some weird value? Also, it isn't possible to ' -move' an attribute to another layer. +move' a feature to another layer. Instead, make one layer for one kind of object and change the icon based on attributes. -### Using layers as filters - -Using layers as filters - this doesn't work! - -Use the `filter`-functionality instead. - ### Not reading the theme JSON specs There are a few advanced features to do fancy stuff available, which are documented only in the spec above - for example, reusing background images and substituting the colours or HTML rendering. If you need advanced stuff, read it through! + +### Forgetting adjacent concepts + +Some new contributors might add a POI to indicate something that resembles it, but quite isn't. + +For example, if they are only offered a layer with public bookcases, they might map their local library with a public bookcase. +The perfect solution for this is to provide both the library-layer and public bookcases layer - but this requires having both layers. + +A good solution is to clearly explain what a certain feature is and what it is not. \ No newline at end of file diff --git a/Docs/theme-template.json b/Docs/theme-template.json index 9ead97d564..8d904d0aad 100644 --- a/Docs/theme-template.json +++ b/Docs/theme-template.json @@ -22,9 +22,8 @@ "#": "For more options and configuration, see the documentation in LayoutConfig.json", "#layers": "The list of layers is where most of the content will be. Either reuse an already existing layer by simply calling it's ID or define a whole new layer. An overview of builtin layers is at https://github.com/pietervdvn/MapComplete/blob/develop/Docs/BuiltinLayers.md#normal-layers", "layers": [ - "bench", { - "id": "a singular nound describing the feature, in english", + "id": "a singular noun describing the feature, in english", "source": { "osmTags": { "#": "For a description on which tags are possible, see https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md", diff --git a/Logic/Actors/TitleHandler.ts b/Logic/Actors/TitleHandler.ts index d20bea7b9e..8593ecf184 100644 --- a/Logic/Actors/TitleHandler.ts +++ b/Logic/Actors/TitleHandler.ts @@ -16,7 +16,7 @@ export default class TitleHandler { const currentTitle: UIEventSource = state.selectedElement.map( selected => { const layout = state.layoutToUse - const defaultTitle = Translations.WT(layout?.title)?.txt ?? "MapComplete" + const defaultTitle = layout?.title?.txt ?? "MapComplete" if (selected === undefined) { return defaultTitle diff --git a/Logic/DetermineLayout.ts b/Logic/DetermineLayout.ts index 734988583d..b935481e88 100644 --- a/Logic/DetermineLayout.ts +++ b/Logic/DetermineLayout.ts @@ -14,7 +14,6 @@ import {FixLegacyTheme} from "../Models/ThemeConfig/Conversion/LegacyJsonConvert import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; import SharedTagRenderings from "../Customizations/SharedTagRenderings"; import * as known_layers from "../assets/generated/known_layers.json" -import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; import {PrepareTheme} from "../Models/ThemeConfig/Conversion/PrepareTheme"; import * as licenses from "../assets/generated/license_info.json" import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig"; @@ -43,10 +42,6 @@ export default class DetermineLayout { } let layoutId: string = undefined - if (location.href.indexOf("buurtnatuur.be") >= 0) { - layoutId = "buurtnatuur" - } - const path = window.location.pathname.split("/").slice(-1)[0]; if (path !== "theme.html" && path !== "") { @@ -72,7 +67,7 @@ export default class DetermineLayout { public static LoadLayoutFromHash( userLayoutParam: UIEventSource - ): (LayoutConfig & {definition: LayoutConfigJson}) | null { + ): LayoutConfig | null { let hash = location.hash.substr(1); let json: any; @@ -113,9 +108,7 @@ export default class DetermineLayout { const layoutToUse = DetermineLayout.prepCustomTheme(json) userLayoutParam.setData(layoutToUse.id); - const config = new LayoutConfig(layoutToUse, false); - config["definition"] = json - return config + return layoutToUse } catch (e) { console.error(e) if (hash === undefined || hash.length < 10) { @@ -144,7 +137,7 @@ export default class DetermineLayout { .AttachTo("centermessage"); } - private static prepCustomTheme(json: any): LayoutConfigJson { + private static prepCustomTheme(json: any, sourceUrl?: string): LayoutConfig { if(json.layers === undefined && json.tagRenderings !== undefined){ const iconTr = json.mapRendering.map(mr => mr.icon).find(icon => icon !== undefined) @@ -161,7 +154,6 @@ export default class DetermineLayout { } } - const knownLayersDict = new Map() for (const key in known_layers.layers) { const layer = known_layers.layers[key] @@ -172,10 +164,17 @@ export default class DetermineLayout { sharedLayers: knownLayersDict } json = new FixLegacyTheme().convertStrict(json, "While loading a dynamic theme") + const raw = json; + json = new FixImages(DetermineLayout._knownImages).convertStrict(json, "While fixing the images") json = new PrepareTheme(converState).convertStrict(json, "While preparing a dynamic theme") console.log("The layoutconfig is ", json) - return json + + + return new LayoutConfig(json, false, { + definitionRaw: JSON.stringify(raw, null, " "), + definedAtUrl: sourceUrl + }) } private static async LoadRemoteTheme(link: string): Promise { @@ -190,8 +189,7 @@ export default class DetermineLayout { try { parsed.id = link; console.log("Loaded remote link:", link) - const layoutToUse = DetermineLayout.prepCustomTheme(parsed) - return new LayoutConfig(layoutToUse, false) + return DetermineLayout.prepCustomTheme(parsed, link) } catch (e) { console.error(e) DetermineLayout.ShowErrorOnCustomTheme( diff --git a/Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts b/Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts index 5349d8d431..1f5d8cbb41 100644 --- a/Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts +++ b/Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts @@ -1,5 +1,5 @@ /** - * This feature source helps the ShowDataLayer class: it introduces the necessary extra features and indiciates with what renderConfig it should be rendered. + * This feature source helps the ShowDataLayer class: it introduces the necessary extra features and indicates with what renderConfig it should be rendered. */ import {UIEventSource} from "../../UIEventSource"; import {GeoOperations} from "../../GeoOperations"; @@ -11,22 +11,25 @@ export default class RenderingMultiPlexerFeatureSource { public readonly features: UIEventSource<(any & { pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined })[]>; constructor(upstream: FeatureSource, layer: LayerConfig) { + + const pointRenderObjects: { rendering: PointRenderingConfig, index: number }[] = layer.mapRendering.map((r, i) => ({ + rendering: r, + index: i + })) + const pointRenderings = pointRenderObjects.filter(r => r.rendering.location.has("point")) + const centroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("centroid")) + const projectedCentroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("projected_centerpoint")) + const startRenderings = pointRenderObjects.filter(r => r.rendering.location.has("start")) + const endRenderings = pointRenderObjects.filter(r => r.rendering.location.has("end")) + const hasCentroid = centroidRenderings.length > 0 || projectedCentroidRenderings.length > 0 + const lineRenderObjects = layer.lineRendering + this.features = upstream.features.map( features => { if (features === undefined) { return; } - const pointRenderObjects: { rendering: PointRenderingConfig, index: number }[] = layer.mapRendering.map((r, i) => ({ - rendering: r, - index: i - })) - const pointRenderings = pointRenderObjects.filter(r => r.rendering.location.has("point")) - const centroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("centroid")) - const startRenderings = pointRenderObjects.filter(r => r.rendering.location.has("start")) - const endRenderings = pointRenderObjects.filter(r => r.rendering.location.has("end")) - - const lineRenderObjects = layer.lineRendering const withIndex: (any & { pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined, multiLineStringIndex: number | undefined })[] = []; @@ -55,12 +58,25 @@ export default class RenderingMultiPlexerFeatureSource { } } else { // This is a a line: add the centroids - for (const rendering of centroidRenderings) { - addAsPoint(feat, rendering, GeoOperations.centerpointCoordinates(feat)) + let centerpoint: [number, number] = undefined; + let projectedCenterPoint : [number, number] = undefined + if(hasCentroid){ + centerpoint = GeoOperations.centerpointCoordinates(feat) + if(projectedCentroidRenderings.length > 0){ + projectedCenterPoint = <[number,number]> GeoOperations.nearestPoint(feat, centerpoint).geometry.coordinates + } } + for (const rendering of centroidRenderings) { + addAsPoint(feat, rendering, centerpoint) + } + if (feat.geometry.type === "LineString") { + for (const rendering of projectedCentroidRenderings) { + addAsPoint(feat, rendering, projectedCenterPoint) + } + // Add start- and endpoints const coordinates = feat.geometry.coordinates for (const rendering of startRenderings) { @@ -71,6 +87,10 @@ export default class RenderingMultiPlexerFeatureSource { addAsPoint(feat, rendering, coordinate) } + }else{ + for (const rendering of projectedCentroidRenderings) { + addAsPoint(feat, rendering, centerpoint) + } } // AT last, add it 'as is' to what we should render diff --git a/Logic/Web/Wikidata.ts b/Logic/Web/Wikidata.ts index dc4329ebd2..c32f6b6870 100644 --- a/Logic/Web/Wikidata.ts +++ b/Logic/Web/Wikidata.ts @@ -1,6 +1,6 @@ import {Utils} from "../../Utils"; import {UIEventSource} from "../UIEventSource"; -import * as wds from "wikibase-sdk" +import * as wds from "wikidata-sdk" export class WikidataResponse { public readonly id: string @@ -126,13 +126,22 @@ export interface WikidataSearchoptions { maxCount?: 20 | number } +export interface WikidataAdvancedSearchoptions extends WikidataSearchoptions { + instanceOf?: number[]; + notInstanceOf?: number[] +} + + /** * Utility functions around wikidata */ export default class Wikidata { private static readonly _identifierPrefixes = ["Q", "L"].map(str => str.toLowerCase()) - private static readonly _prefixesToRemove = ["https://www.wikidata.org/wiki/Lexeme:", "https://www.wikidata.org/wiki/", "Lexeme:"].map(str => str.toLowerCase()) + private static readonly _prefixesToRemove = ["https://www.wikidata.org/wiki/Lexeme:", + "https://www.wikidata.org/wiki/", + "http://www.wikidata.org/entity/", + "Lexeme:"].map(str => str.toLowerCase()) private static readonly _cache = new Map>() @@ -148,6 +157,52 @@ export default class Wikidata { return src; } + /** + * Given a search text, searches for the relevant wikidata entries, excluding pages "outside of the main tree", e.g. disambiguation pages. + * Optionally, an 'instance of' can be given to limit the scope, e.g. instanceOf:5 (humans) will only search for humans + */ + public static async searchAdvanced(text: string, options: WikidataAdvancedSearchoptions): Promise<{ + id: string, + relevance?: number, + label: string, + description?: string + }[]> { + let instanceOf = "" + if (options?.instanceOf !== undefined && options.instanceOf.length > 0) { + const phrases = options.instanceOf.map(q => `{ ?item wdt:P31/wdt:P279* wd:Q${q}. }`) + instanceOf = "{"+ phrases.join(" UNION ") + "}" + } + const forbidden = (options?.notInstanceOf ?? []) + .concat([17379835]) // blacklist 'wikimedia pages outside of the main knowledge tree', e.g. disambiguation pages + const minusPhrases = forbidden.map(q => `MINUS {?item wdt:P31/wdt:P279* wd:Q${q} .}`) + const sparql = `SELECT * WHERE { + SERVICE wikibase:mwapi { + bd:serviceParam wikibase:api "EntitySearch" . + bd:serviceParam wikibase:endpoint "www.wikidata.org" . + bd:serviceParam mwapi:search "${text}" . + bd:serviceParam mwapi:language "${options.lang}" . + ?item wikibase:apiOutputItem mwapi:item . + ?num wikibase:apiOrdinal true . + bd:serviceParam wikibase:limit ${Math.round((options.maxCount ?? 20) * 1.5) /*Some padding for disambiguation pages */} . + ?label wikibase:apiOutput mwapi:label . + ?description wikibase:apiOutput "@description" . + } + ${instanceOf} + ${minusPhrases.join("\n ")} + } ORDER BY ASC(?num) LIMIT ${options.maxCount ?? 20}` + const url = wds.sparqlQuery(sparql) + + const result = await Utils.downloadJson(url) + /*The full uri of the wikidata-item*/ + + return result.results.bindings.map(({item, label, description, num}) => ({ + relevance: num?.value, + id: item?.value, + label: label?.value, + description: description?.value + })) + } + public static async search( search: string, options?: WikidataSearchoptions, @@ -195,39 +250,28 @@ export default class Wikidata { public static async searchAndFetch( search: string, - options?: WikidataSearchoptions + options?: WikidataAdvancedSearchoptions ): Promise { - const maxCount = options.maxCount // We provide some padding to filter away invalid values - options.maxCount = Math.ceil((options.maxCount ?? 20) * 1.5) - const searchResults = await Wikidata.search(search, options) - const maybeResponses = await Promise.all(searchResults.map(async r => { - try { - return await Wikidata.LoadWikidataEntry(r.id).AsPromise() - } catch (e) { - console.error(e) - return undefined; - } - })) - const responses = maybeResponses - .map(r => r["success"]) - .filter(wd => { - if (wd === undefined) { - return false; + const searchResults = await Wikidata.searchAdvanced(search, options) + const maybeResponses = await Promise.all( + searchResults.map(async r => { + try { + console.log("Loading ", r.id) + return await Wikidata.LoadWikidataEntry(r.id).AsPromise() + } catch (e) { + console.error(e) + return undefined; } - if (wd.claims.get("P31" /*Instance of*/)?.has("Q4167410"/* Wikimedia Disambiguation page*/)) { - return false; - } - return true; - }) - responses.splice(maxCount, responses.length - maxCount) - return responses + })) + return Utils.NoNull(maybeResponses.map(r => r["success"])) } /** * Gets the 'key' segment from a URL - * + * * Wikidata.ExtractKey("https://www.wikidata.org/wiki/Lexeme:L614072") // => "L614072" + * Wikidata.ExtractKey("http://www.wikidata.org/entity/Q55008046") // => "Q55008046" */ public static ExtractKey(value: string | number): string { if (typeof value === "number") { @@ -271,6 +315,35 @@ export default class Wikidata { return undefined; } + /** + * Converts 'Q123' into 123, returns undefined if invalid + * + * Wikidata.QIdToNumber("Q123") // => 123 + * Wikidata.QIdToNumber(" Q123 ") // => 123 + * Wikidata.QIdToNumber(" X123 ") // => undefined + * Wikidata.QIdToNumber(" Q123X ") // => undefined + * Wikidata.QIdToNumber(undefined) // => undefined + * Wikidata.QIdToNumber(123) // => 123 + */ + public static QIdToNumber(q: string | number): number | undefined { + if(q === undefined || q === null){ + return + } + if(typeof q === "number"){ + return q + } + q = q.trim() + if (!q.startsWith("Q")) { + return + } + q = q.substr(1) + const n = Number(q) + if (isNaN(n)) { + return + } + return n + } + public static IdToArticle(id: string) { if (id.startsWith("Q")) { return "https://wikidata.org/wiki/" + id @@ -305,4 +378,4 @@ export default class Wikidata { return WikidataResponse.fromJson(response) } -} \ No newline at end of file +} diff --git a/Models/Constants.ts b/Models/Constants.ts index 431aacf2ce..e829a39de0 100644 --- a/Models/Constants.ts +++ b/Models/Constants.ts @@ -2,7 +2,7 @@ import {Utils} from "../Utils"; export default class Constants { - public static vNumber = "0.19.0-alpha"; + public static vNumber = "0.18.2"; public static ImgurApiKey = '7070e7167f0a25a' public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85" diff --git a/Models/ThemeConfig/Conversion/Conversion.ts b/Models/ThemeConfig/Conversion/Conversion.ts index 3d9aa1183a..5b6b72c008 100644 --- a/Models/ThemeConfig/Conversion/Conversion.ts +++ b/Models/ThemeConfig/Conversion/Conversion.ts @@ -216,13 +216,18 @@ export class Fuse extends DesugaringStep { const information = [] for (let i = 0; i < this.steps.length; i++) { const step = this.steps[i]; - let r = step.convert(json, "While running step " + step.name + ": " + context) - errors.push(...r.errors ?? []) - warnings.push(...r.warnings ?? []) - information.push(...r.information ?? []) - json = r.result - if (errors.length > 0) { - break; + try{ + let r = step.convert(json, "While running step " + step.name + ": " + context) + errors.push(...r.errors ?? []) + warnings.push(...r.warnings ?? []) + information.push(...r.information ?? []) + json = r.result + if (errors.length > 0) { + break; + } + }catch(e){ + console.error("Step "+step.name+" failed due to "+e); + throw e } } return { diff --git a/Models/ThemeConfig/Conversion/PrepareTheme.ts b/Models/ThemeConfig/Conversion/PrepareTheme.ts index 7c1aa17211..8a9877e108 100644 --- a/Models/ThemeConfig/Conversion/PrepareTheme.ts +++ b/Models/ThemeConfig/Conversion/PrepareTheme.ts @@ -479,6 +479,7 @@ export class PrepareTheme extends Fuse { }) { super( "Fully prepares and expands a theme", + new AddContextToTransltionsInLayout(), new PreparePersonalTheme(state), new WarnForUnsubstitutedLayersInTheme(), diff --git a/Models/ThemeConfig/Conversion/Validation.ts b/Models/ThemeConfig/Conversion/Validation.ts index 4bdf9c415c..b0c121953b 100644 --- a/Models/ThemeConfig/Conversion/Validation.ts +++ b/Models/ThemeConfig/Conversion/Validation.ts @@ -68,7 +68,7 @@ class ValidateTheme extends DesugaringStep { const warnings = [] const information = [] - const theme = new LayoutConfig(json, true, "test") + const theme = new LayoutConfig(json, true) { // Legacy format checks @@ -217,12 +217,17 @@ class MiscThemeChecks extends DesugaringStep{ convert(json: LayoutConfigJson, context: string): { result: LayoutConfigJson; errors?: string[]; warnings?: string[]; information?: string[] } { const warnings = [] + const errors = [] + if(json.id !== "personal" && (json.layers === undefined || json.layers.length === 0)){ + errors.push("The theme "+json.id+" has no 'layers' defined ("+context+")") + } if(json.socialImage === ""){ warnings.push("Social image for theme "+json.id+" is the emtpy string") } return { result :json, - warnings + warnings, + errors }; } } @@ -231,8 +236,8 @@ export class PrevalidateTheme extends Fuse { constructor() { super("Various consistency checks on the raw JSON", - new OverrideShadowingCheck(), - new MiscThemeChecks() + new MiscThemeChecks(), + new OverrideShadowingCheck() ); } diff --git a/Models/ThemeConfig/Json/PointRenderingConfigJson.ts b/Models/ThemeConfig/Json/PointRenderingConfigJson.ts index 5170f89534..c9a4abc9d1 100644 --- a/Models/ThemeConfig/Json/PointRenderingConfigJson.ts +++ b/Models/ThemeConfig/Json/PointRenderingConfigJson.ts @@ -13,9 +13,10 @@ export default interface PointRenderingConfigJson { /** * All the locations that this point should be rendered at. - * Using `location: ["point", "centroid"] will always render centerpoint + * Using `location: ["point", "centroid"] will always render centerpoint. + * 'projected_centerpoint' will show an item on the line itself, near the middle of the line. (LineStrings only) */ - location: ("point" | "centroid" | "start" | "end" | string)[] + location: ("point" | "centroid" | "start" | "end" | "projected_centerpoint" | string)[] /** * The icon for an element. diff --git a/Models/ThemeConfig/Json/UnitConfigJson.ts b/Models/ThemeConfig/Json/UnitConfigJson.ts index 5eba5eaf49..bde2683b23 100644 --- a/Models/ThemeConfig/Json/UnitConfigJson.ts +++ b/Models/ThemeConfig/Json/UnitConfigJson.ts @@ -18,9 +18,12 @@ export default interface UnitConfigJson { export interface ApplicableUnitJson { /** - * The canonical value which will be added to the text. + * The canonical value which will be added to the value in OSM. * e.g. "m" for meters - * If the user inputs '42', the canonical value will be added and it'll become '42m' + * If the user inputs '42', the canonical value will be added and it'll become '42m'. + * + * Important: often, _no_ canonical values are expected, e.g. in the case of 'maxspeed' where 'km/h' is the default. + * In this case, an empty string should be used */ canonicalDenomination: string, /** diff --git a/Models/ThemeConfig/LayerConfig.ts b/Models/ThemeConfig/LayerConfig.ts index b7863b4274..ade6d6b6df 100644 --- a/Models/ThemeConfig/LayerConfig.ts +++ b/Models/ThemeConfig/LayerConfig.ts @@ -134,6 +134,9 @@ export default class LayerConfig extends WithContextLoader { this.allowSplit = json.allowSplit ?? false; this.name = Translations.T(json.name, translationContext + ".name"); + if(json.units!==undefined && !Array.isArray(json.units)){ + throw "At "+context+".units: the 'units'-section should be a list; you probably have an object there" + } this.units = (json.units ?? []).map(((unitJson, i) => Unit.fromJson(unitJson, `${context}.unit[${i}]`))) if (json.description !== undefined) { diff --git a/Models/ThemeConfig/LayoutConfig.ts b/Models/ThemeConfig/LayoutConfig.ts index 402f288929..2d8598f6af 100644 --- a/Models/ThemeConfig/LayoutConfig.ts +++ b/Models/ThemeConfig/LayoutConfig.ts @@ -56,9 +56,17 @@ export default class LayoutConfig { public readonly usedImages: string[] public readonly extraLink?: ExtraLinkConfig - constructor(json: LayoutConfigJson, official = true, context?: string) { + public readonly definedAtUrl? : string; + public readonly definitionRaw?: string; + + constructor(json: LayoutConfigJson, official = true,options?: { + definedAtUrl?: string, + definitionRaw?: string + }) { this.official = official; this.id = json.id; + this.definedAtUrl = options?.definedAtUrl + this.definitionRaw = options?.definitionRaw if (official) { if (json.id.toLowerCase() !== json.id) { throw "The id of a theme should be lowercase: " + json.id @@ -67,11 +75,7 @@ export default class LayoutConfig { throw "The id of a theme should match [a-z0-9-_]*: " + json.id } } - if(context === undefined){ - context = this.id - }else{ - context = context + "." + this.id; - } + const context = this.id this.maintainer = json.maintainer; this.credits = json.credits; this.version = json.version; diff --git a/Models/ThemeConfig/PointRenderingConfig.ts b/Models/ThemeConfig/PointRenderingConfig.ts index 0a02149b84..39dcec1563 100644 --- a/Models/ThemeConfig/PointRenderingConfig.ts +++ b/Models/ThemeConfig/PointRenderingConfig.ts @@ -15,8 +15,8 @@ import {VariableUiElement} from "../../UI/Base/VariableUIElement"; export default class PointRenderingConfig extends WithContextLoader { - private static readonly allowed_location_codes = new Set(["point", "centroid", "start", "end"]) - public readonly location: Set<"point" | "centroid" | "start" | "end" | string> + private static readonly allowed_location_codes = new Set(["point", "centroid", "start", "end","projected_centerpoint"]) + public readonly location: Set<"point" | "centroid" | "start" | "end" | "projected_centerpoint" | string> public readonly icon: TagRenderingConfig; public readonly iconBadges: { if: TagsFilter; then: TagRenderingConfig }[]; diff --git a/UI/BigComponents/AddNewMarker.ts b/UI/BigComponents/AddNewMarker.ts index 9bd89e3f53..479098beab 100644 --- a/UI/BigComponents/AddNewMarker.ts +++ b/UI/BigComponents/AddNewMarker.ts @@ -14,7 +14,7 @@ export default class AddNewMarker extends Combine { let last = undefined; for (const filteredLayer of filteredLayers) { const layer = filteredLayer.layerDef; - if(layer.name === undefined){ + if(layer.name === undefined && !filteredLayer.isDisplayed.data){ continue } for (const preset of filteredLayer.layerDef.presets) { diff --git a/UI/BigComponents/LicensePicker.ts b/UI/BigComponents/LicensePicker.ts index 19c608141a..619aad54a6 100644 --- a/UI/BigComponents/LicensePicker.ts +++ b/UI/BigComponents/LicensePicker.ts @@ -17,7 +17,10 @@ export default class LicensePicker extends DropDown { {value: LicensePicker.ccbysa, shown: Translations.t.image.ccbs.Clone()}, {value: LicensePicker.ccby, shown: Translations.t.image.ccb.Clone()} ], - state?.osmConnection?.GetPreference("pictures-license") ?? new UIEventSource("CC0") + state?.osmConnection?.GetPreference("pictures-license") ?? new UIEventSource("CC0"), + { + select_class:"w-min bg-indigo-100 p-1 rounded hover:bg-indigo-200" + } ) this.SetClass("flex flex-col sm:flex-row").SetStyle("float:left"); } diff --git a/UI/BigComponents/ShareScreen.ts b/UI/BigComponents/ShareScreen.ts index a550627792..de96839bfd 100644 --- a/UI/BigComponents/ShareScreen.ts +++ b/UI/BigComponents/ShareScreen.ts @@ -14,6 +14,8 @@ import BaseLayer from "../../Models/BaseLayer"; import FilteredLayer from "../../Models/FilteredLayer"; import {InputElement} from "../Input/InputElement"; import CheckBoxes, {CheckBox} from "../Input/Checkboxes"; +import {SubtleButton} from "../Base/SubtleButton"; +import LZString from "lz-string"; export default class ShareScreen extends Combine { @@ -24,14 +26,6 @@ export default class ShareScreen extends Combine { const optionCheckboxes: InputElement[] = [] const optionParts: (UIEventSource)[] = []; - function check() { - return Svg.checkmark_svg().SetStyle("width: 1.5em; display:inline-block;"); - } - - function nocheck() { - return Svg.no_checkmark_svg().SetStyle("width: 1.5em; display: inline-block;"); - } - const includeLocation = new CheckBox(tr.fsIncludeCurrentLocation, true) optionCheckboxes.push(includeLocation); @@ -49,6 +43,7 @@ export default class ShareScreen extends Combine { } else { return null; } + }, [currentLocation])); @@ -119,6 +114,9 @@ export default class ShareScreen extends Combine { } + if(layout.definitionRaw !== undefined){ + optionParts.push(new UIEventSource("userlayout="+(layout.definedAtUrl ?? layout.id))) + } const options = new Combine(optionCheckboxes).SetClass("flex flex-col") const url = (currentLocation ?? new UIEventSource(undefined)).map(() => { @@ -126,13 +124,21 @@ export default class ShareScreen extends Combine { const host = window.location.host; let path = window.location.pathname; path = path.substr(0, path.lastIndexOf("/")); - let literalText = `https://${host}${path}/${layout.id.toLowerCase()}` + let id = layout.id.toLowerCase() + if(layout.definitionRaw !== undefined){ + id="theme.html" + } + let literalText = `https://${host}${path}/${id}` + let hash = "" + if(layout.definedAtUrl === undefined && layout.definitionRaw !== undefined){ + hash = "#"+ LZString.compressToBase64( Utils.MinifyJSON(layout.definitionRaw)) + } const parts = Utils.NoEmpty(Utils.NoNull(optionParts.map((eventSource) => eventSource.data))); if (parts.length === 0) { - return literalText; + return literalText + hash; } - return literalText + "?" + parts.join("&"); + return literalText + "?" + parts.join("&") + hash; }, optionParts); @@ -184,13 +190,27 @@ export default class ShareScreen extends Combine { }); + + let downloadThemeConfig: BaseUIElement = undefined; + if(layout.definitionRaw !== undefined){ + downloadThemeConfig = new SubtleButton(Svg.download_svg(), new Combine([ + tr.downloadCustomTheme, + tr.downloadCustomThemeHelp.SetClass("subtle") + ]).onClick(() => { + Utils.offerContentsAsDownloadableFile(layout.definitionRaw, layout.id+".mapcomplete-theme-definition.json", { + mimetype:"application/json" + }) + }) + .SetClass("flex flex-col")) + } super([ - tr.intro.Clone(), + tr.intro, link, new VariableUiElement(linkStatus), - tr.addToHomeScreen.Clone(), - tr.embedIntro.Clone(), + downloadThemeConfig, + tr.addToHomeScreen, + tr.embedIntro, options, iframeCode, ]) diff --git a/UI/BigComponents/SimpleAddUI.ts b/UI/BigComponents/SimpleAddUI.ts index 2e8371a0a9..9310928638 100644 --- a/UI/BigComponents/SimpleAddUI.ts +++ b/UI/BigComponents/SimpleAddUI.ts @@ -191,7 +191,7 @@ export default class SimpleAddUI extends Toggle { preset.icon(), new Combine([ title.SetClass("font-bold"), - Translations.WT(preset.description)?.FirstSentence() + preset.description?.FirstSentence() ]).SetClass("flex flex-col") ) } @@ -208,15 +208,20 @@ export default class SimpleAddUI extends Toggle { const allButtons = []; for (const layer of state.filteredLayers.data) { - if (layer.isDisplayed.data === false && !state.featureSwitchFilter.data) { - // The layer is not displayed and we cannot enable the layer control -> we skip - continue; + if (layer.isDisplayed.data === false) { + // The layer is not displayed... + if(!state.featureSwitchFilter.data){ + // ...and we cannot enable the layer control -> we skip, as these presets can never be shown anyway + continue; + } + + if (layer.layerDef.name === undefined) { + // this layer can never be toggled on in any case, so we skip the presets + continue; + } } - if (layer.layerDef.name === undefined) { - // this is a parlty hidden layer - continue; - } + const presets = layer.layerDef.presets; for (const preset of presets) { diff --git a/UI/Image/ImageUploadFlow.ts b/UI/Image/ImageUploadFlow.ts index 743b1b2c28..47e775289b 100644 --- a/UI/Image/ImageUploadFlow.ts +++ b/UI/Image/ImageUploadFlow.ts @@ -15,6 +15,7 @@ import {VariableUiElement} from "../Base/VariableUIElement"; import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; import {OsmConnection} from "../../Logic/Osm/OsmConnection"; import {Changes} from "../../Logic/Osm/Changes"; +import Loading from "../Base/Loading"; export class ImageUploadFlow extends Toggle { @@ -138,16 +139,16 @@ export class ImageUploadFlow extends Toggle { if (l == 0) { return undefined } - return t.uploadFailed.Clone().SetClass("alert"); + return new Loading(t.uploadFailed).SetClass("alert"); })), new VariableUiElement(uploadedCount.map(l => { if (l == 0) { return undefined; } if (l == 1) { - return t.uploadDone.Clone().SetClass("thanks"); + return t.uploadDone.Clone().SetClass("thanks block"); } - return t.uploadMultipleDone.Subs({count: l}).SetClass("thanks") + return t.uploadMultipleDone.Subs({count: l}).SetClass("thanks block") })), fileSelector, diff --git a/UI/ImportFlow/ConfirmProcess.ts b/UI/ImportFlow/ConfirmProcess.ts index d7168a86d3..c8e3f570e8 100644 --- a/UI/ImportFlow/ConfirmProcess.ts +++ b/UI/ImportFlow/ConfirmProcess.ts @@ -13,19 +13,20 @@ export class ConfirmProcess extends Combine implements FlowStep<{ features: any[ constructor(v: { features: any[], theme: string }) { const t = Translations.t.importHelper.confirmProcess; - const toConfirm = [ + const elements = [ new Link(t.readImportGuidelines, "https://wiki.openstreetmap.org/wiki/Import_guidelines", true), t.contactedCommunity, t.licenseIsCompatible, t.wikipageIsMade - ]; + ] + const toConfirm = new CheckBoxes(elements); super([ new Title(t.titleLong), - new CheckBoxes(toConfirm), + toConfirm, ]); this.SetClass("link-underline") - this.IsValid = new CheckBoxes(toConfirm).GetValue().map(selected => toConfirm.length == selected.length) + this.IsValid = toConfirm.GetValue().map(selected => elements.length == selected.length) this.Value = new UIEventSource<{ features: any[], theme: string }>(v) } } \ No newline at end of file diff --git a/UI/ImportFlow/ConflationChecker.ts b/UI/ImportFlow/ConflationChecker.ts index 0f01ce3c96..3ae2103f8b 100644 --- a/UI/ImportFlow/ConflationChecker.ts +++ b/UI/ImportFlow/ConflationChecker.ts @@ -47,6 +47,27 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea const toImport: {features: any[]} = params; let overpassStatus = new UIEventSource<{ error: string } | "running" | "success" | "idle" | "cached">("idle") const cacheAge = new UIEventSource(undefined); + + + function loadDataFromOverpass(){ + // Load the data! + const url = Constants.defaultOverpassUrls[1] + const relationTracker = new RelationsTracker() + const overpass = new Overpass(params.layer.source.osmTags, [], url, new UIEventSource(180), relationTracker, true) + console.log("Loading from overpass!") + overpassStatus.setData("running") + overpass.queryGeoJson(bbox).then( + ([data, date]) => { + console.log("Received overpass-data: ", data.features.length, "features are loaded at ", date); + overpassStatus.setData("success") + fromLocalStorage.setData([data, date]) + }, + (error) => { + overpassStatus.setData({error}) + }) + } + + const fromLocalStorage = IdbLocalStorage.Get<[any, Date]>("importer-overpass-cache-" + layer.id, { whenLoaded: (v) => { @@ -63,22 +84,7 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea } cacheAge.setData(-1) } - // Load the data! - const url = Constants.defaultOverpassUrls[1] - const relationTracker = new RelationsTracker() - const overpass = new Overpass(params.layer.source.osmTags, [], url, new UIEventSource(180), relationTracker, true) - console.log("Loading from overpass!") - overpassStatus.setData("running") - overpass.queryGeoJson(bbox).then( - ([data, date]) => { - console.log("Received overpass-data: ", data.features.length, "features are loaded at ", date); - overpassStatus.setData("success") - fromLocalStorage.setData([data, date]) - }, - (error) => { - overpassStatus.setData({error}) - }) - + loadDataFromOverpass() } }); @@ -166,7 +172,7 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea return osmData.features.filter(f => toImport.features.some(imp => maxDist >= GeoOperations.distanceBetween(imp.geometry.coordinates, GeoOperations.centerpointCoordinates(f)))) - }, [nearbyCutoff.GetValue()]), false); + }, [nearbyCutoff.GetValue().stabilized(500)]), false); const paritionedImport = ImportUtils.partitionFeaturesIfNearby(toImport, geojson, nearbyCutoff.GetValue().map(Number)); // Featuresource showing OSM-features which are nearby a toImport-feature @@ -211,13 +217,17 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea if (age < 0) { return t.cacheExpired } - return t.loadedDataAge.Subs({age: Utils.toHumanTime(age)}) + return new Combine([t.loadedDataAge.Subs({age: Utils.toHumanTime(age)}), + new SubtleButton(Svg.reload_svg().SetClass("h-8"), t.reloadTheCache) + .onClick(loadDataFromOverpass) + .SetClass("h-12") + ]) })), new Title(t.titleLive), t.importCandidatesCount.Subs({count:toImport.features.length }), new VariableUiElement(geojson.map(geojson => { - if(geojson?.features?.length === undefined && geojson?.features?.length === 0){ + if(geojson?.features?.length === undefined || geojson?.features?.length === 0){ return t.nothingLoaded.Subs(layer).SetClass("alert") } return new Combine([ @@ -233,7 +243,7 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea new Combine([t.mapShowingNearbyIntro, nearbyCutoff]).SetClass("flex"), new VariableUiElement(toImportWithNearby.features.map(feats => t.nearbyWarn.Subs({count: feats.length}).SetClass("alert"))), - ,t.setRangeToZero, + t.setRangeToZero, matchedFeaturesMap]).SetClass("flex flex-col") super([ @@ -246,7 +256,7 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea return new Loading(t.states.running) } if (d["error"] !== undefined) { - return t.states.error.Subs(d).SetClass("alert") + return t.states.error.Subs({error: d["error"]}).SetClass("alert") } if (d === "cached") { diff --git a/UI/ImportFlow/CreateNotes.ts b/UI/ImportFlow/CreateNotes.ts index 8b8f1ffc40..249be836ec 100644 --- a/UI/ImportFlow/CreateNotes.ts +++ b/UI/ImportFlow/CreateNotes.ts @@ -9,12 +9,14 @@ import {FixedUiElement} from "../Base/FixedUiElement"; import {SubtleButton} from "../Base/SubtleButton"; import Svg from "../../Svg"; import Translations from "../i18n/Translations"; +import {Translation} from "../i18n/Translation"; export class CreateNotes extends Combine { - public static createNoteContents(feature: {properties: any, geometry: {coordinates: [number,number]}}, - options: {wikilink: string; intro: string; source: string, theme: string } - ): string[]{ + + public static createNoteContentsUi(feature: {properties: any, geometry: {coordinates: [number,number]}}, + options: {wikilink: string; intro: string; source: string, theme: string } + ): (Translation | string)[]{ const src = feature.properties["source"] ?? feature.properties["src"] ?? options.source delete feature.properties["source"] delete feature.properties["src"] @@ -41,14 +43,26 @@ export class CreateNotes extends Combine { return [ options.intro, extraNote, - note.datasource.Subs({source: src}).txt, - note.wikilink.Subs(options).txt, + note.datasource.Subs({source: src}), + note.wikilink.Subs(options), '', - note.importEasily.txt, + note.importEasily, `https://mapcomplete.osm.be/${options.theme}.html?z=18&lat=${lat}&lon=${lon}#import`, ...tags] } + public static createNoteContents(feature: {properties: any, geometry: {coordinates: [number,number]}}, + options: {wikilink: string; intro: string; source: string, theme: string } + ): string[]{ + return CreateNotes.createNoteContentsUi(feature, options).map(trOrStr => { + if(typeof trOrStr === "string"){ + return trOrStr + } + return trOrStr.txt + }) + } + + constructor(state: { osmConnection: OsmConnection }, v: { features: any[]; wikilink: string; intro: string; source: string, theme: string }) { const t = Translations.t.importHelper.createNotes; const createdNotes: UIEventSource = new UIEventSource([]) @@ -83,7 +97,7 @@ export class CreateNotes extends Combine { )))), new Combine([ Svg.party_svg().SetClass("w-24"), - t.done.Subs(v.features.length).SetClass("thanks"), + t.done.Subs({count: v.features.length}).SetClass("thanks"), new SubtleButton(Svg.note_svg(), t.openImportViewer , { url: "import_viewer.html" diff --git a/UI/ImportFlow/ImportViewerGui.ts b/UI/ImportFlow/ImportViewerGui.ts index 2c427bd9c5..779214cd41 100644 --- a/UI/ImportFlow/ImportViewerGui.ts +++ b/UI/ImportFlow/ImportViewerGui.ts @@ -44,6 +44,47 @@ interface NoteState { status: "imported" | "already_mapped" | "invalid" | "closed" | "not_found" | "open" | "has_comments" } +class DownloadStatisticsButton extends SubtleButton { + constructor(states: NoteState[][]) { + super(Svg.statistics_svg(), "Download statistics"); + this.onClick(() => { + + const st: NoteState[] = [].concat(...states) + + const fields = [ + "id", + "status", + "theme", + "date_created", + "date_closed", + "days_open", + "intro", + "...comments" + ] + const values : string[][] = st.map(note => { + + + return [note.props.id+"", + note.status, + note.theme, + note.props.date_created?.substr(0, note.props.date_created.length - 3), + note.props.closed_at?.substr(0, note.props.closed_at.length - 3) ?? "", + JSON.stringify( note.intro), + ...note.props.comments.map(c => JSON.stringify(c.user)+": "+JSON.stringify(c.text)) + ] + }) + + Utils.offerContentsAsDownloadableFile( + [fields, ...values].map(c => c.join(", ")).join("\n"), + "mapcomplete_import_notes_overview.csv", + { + mimetype: "text/csv" + } + ) + }) + } +} + class MassAction extends Combine { constructor(state: UserRelatedState, props: NoteProperties[]) { const textField = ValidatedTextField.ForType("text").ConstructInputElement() @@ -303,7 +344,9 @@ class ImportInspector extends VariableUiElement { contents.push(accordeon) const content = new Combine(contents) return new LeftIndex( - [new TableOfContents(content, {noTopLevel: true, maxDepth: 1}).SetClass("subtle")], + [new TableOfContents(content, {noTopLevel: true, maxDepth: 1}).SetClass("subtle"), + new DownloadStatisticsButton(perBatch) + ], content ) diff --git a/UI/ImportFlow/Introdution.ts b/UI/ImportFlow/Introdution.ts index e46dd3c9ff..d800901965 100644 --- a/UI/ImportFlow/Introdution.ts +++ b/UI/ImportFlow/Introdution.ts @@ -4,13 +4,14 @@ import {UIEventSource} from "../../Logic/UIEventSource"; import Translations from "../i18n/Translations"; import Title from "../Base/Title"; import {CreateNotes} from "./CreateNotes"; +import {FixedUiElement} from "../Base/FixedUiElement"; export default class Introdution extends Combine implements FlowStep { readonly IsValid: UIEventSource; readonly Value: UIEventSource; constructor() { - const example = CreateNotes.createNoteContents({ + const example = CreateNotes.createNoteContentsUi({ properties:{ "some_key":"some_value", "note":"a note in the original dataset" @@ -23,7 +24,7 @@ export default class Introdution extends Combine implements FlowStep { intro: "There might be an XYZ here", theme: "theme", source: "source of the data" - }) + }).map(el => el === "" ? new FixedUiElement("").SetClass("block") : el) super([ new Title(Translations.t.importHelper.introduction.title), diff --git a/UI/Input/DropDown.ts b/UI/Input/DropDown.ts index d7137a04bb..b9fb6a3d32 100644 --- a/UI/Input/DropDown.ts +++ b/UI/Input/DropDown.ts @@ -47,7 +47,7 @@ export class DropDown extends InputElement { } options = options ?? {} - options.select_class = options.select_class ?? 'bg-indigo-100 p-1 rounded hover:bg-indigo-200' + options.select_class = options.select_class ?? 'w-full bg-indigo-100 p-1 rounded hover:bg-indigo-200' { diff --git a/UI/Input/ValidatedTextField.ts b/UI/Input/ValidatedTextField.ts index 874e830bce..15fe25b7eb 100644 --- a/UI/Input/ValidatedTextField.ts +++ b/UI/Input/ValidatedTextField.ts @@ -250,13 +250,15 @@ class WikidataTextField extends TextFieldDef { ["subarg", "doc"], [["removePrefixes", "remove these snippets of text from the start of the passed string to search"], ["removePostfixes", "remove these snippets of text from the end of the passed string to search"], + ["instanceOf","A list of Q-identifier which indicates that the search results _must_ be an entity of this type, e.g. [`Q5`](https://www.wikidata.org/wiki/Q5) for humans"], + ["notInstanceof","A list of Q-identifiers which indicates that the search results _must not_ be an entity of this type, e.g. [`Q79007`](https://www.wikidata.org/wiki/Q79007) to filter away all streets from the search results"] ] )]) ]]), new Title("Example usage"), `The following is the 'freeform'-part of a layer config which will trigger a search for the wikidata item corresponding with the name of the selected feature. It will also remove '-street', '-square', ... if found at the end of the name -\`\`\` +\`\`\`json "freeform": { "key": "name:etymology:wikidata", "type": "wikidata", @@ -269,11 +271,29 @@ class WikidataTextField extends TextFieldDef { "path", "square", "plaza", - ] + ], + "#": "Remove streets and parks from the search results:" + "notInstanceOf": ["Q79007","Q22698"] } + ] } -\`\`\`` +\`\`\` + +Another example is to search for species and trees: + +\`\`\`json + "freeform": { + "key": "species:wikidata", + "type": "wikidata", + "helperArgs": [ + "species", + { + "instanceOf": [10884, 16521] + }] + } +\`\`\` +` ])); } @@ -304,9 +324,9 @@ class WikidataTextField extends TextFieldDef { const args = inputHelperOptions.args ?? [] const searchKey = args[0] ?? "name" - let searchFor = inputHelperOptions.feature?.properties[searchKey]?.toLowerCase() + let searchFor = (inputHelperOptions.feature?.properties[searchKey]?.toLowerCase() ?? "") - const options = args[1] + const options: any = args[1] if (searchFor !== undefined && options !== undefined) { const prefixes = options["removePrefixes"] const postfixes = options["removePostfixes"] @@ -325,10 +345,18 @@ class WikidataTextField extends TextFieldDef { } } + + let instanceOf : number[] = Utils.NoNull((options?.instanceOf ?? []).map(i => Wikidata.QIdToNumber(i))) + let notInstanceOf : number[] = Utils.NoNull((options?.notInstanceOf ?? []).map(i => Wikidata.QIdToNumber(i))) + console.log("Instance of", instanceOf) + + return new WikidataSearchBox({ value: currentValue, - searchText: new UIEventSource(searchFor) + searchText: new UIEventSource(searchFor), + instanceOf, + notInstanceOf }) } } @@ -424,7 +452,7 @@ class UrlTextfieldDef extends TextFieldDef { reformat(str: string): string { try { let url: URL - str = str.toLowerCase() + // str = str.toLowerCase() // URLS are case sensitive. Lowercasing them might break some URLS. See #763 if (!str.startsWith("http://") && !str.startsWith("https://") && !str.startsWith("http:")) { url = new URL("https://" + str) } else { diff --git a/UI/Popup/DeleteWizard.ts b/UI/Popup/DeleteWizard.ts index ba289a2e24..1cfece179c 100644 --- a/UI/Popup/DeleteWizard.ts +++ b/UI/Popup/DeleteWizard.ts @@ -202,7 +202,7 @@ export default class DeleteWizard extends Toggle { private static generateDeleteTagRenderingConfig(softDeletionTags: TagsFilter, nonDeleteOptions: { if: TagsFilter; then: Translation }[], extraDeleteReasons: { explanation: Translation; changesetMessage: string }[], - currentTags: any) { + currentTags: any): TagRenderingConfig { const t = Translations.t.delete nonDeleteOptions = nonDeleteOptions ?? [] let softDeletionTagsStr = [] diff --git a/UI/Popup/ImportButton.ts b/UI/Popup/ImportButton.ts index 4108c4e24c..8db42618de 100644 --- a/UI/Popup/ImportButton.ts +++ b/UI/Popup/ImportButton.ts @@ -194,7 +194,7 @@ ${Utils.special_visualizations_importRequirementDocs} importFlow, isImported ), - t.zoomInMore.SetClass("alert"), + t.zoomInMore.SetClass("alert block"), state.locationControl.map(l => l.zoom >= 18) ), pleaseLoginButton, @@ -613,7 +613,7 @@ export class ImportPointButton extends AbstractImportButton { icon: () => new Img(args.icon), layerToAddTo: state.filteredLayers.data.filter(l => l.layerDef.id === args.targetLayer)[0], name: args.text, - title: Translations.WT(args.text), + title: Translations.T(args.text), preciseInput: preciseInputSpec, // must be explicitely assigned, if 'undefined' won't work otherwise boundsFactor: 3 } diff --git a/UI/Popup/MoveWizard.ts b/UI/Popup/MoveWizard.ts index 6ed7d06575..b6eb6e7124 100644 --- a/UI/Popup/MoveWizard.ts +++ b/UI/Popup/MoveWizard.ts @@ -86,7 +86,7 @@ export default class MoveWizard extends Toggle { moveReason.setData(reason) moveButton = new SubtleButton( reason.icon.SetStyle("height: 1.5rem; width: 1.5rem;"), - Translations.WT(reason.invitingText) + Translations.T(reason.invitingText) ).onClick(() => { currentStep.setData("pick_location") }) diff --git a/UI/Popup/TagRenderingQuestion.ts b/UI/Popup/TagRenderingQuestion.ts index 0348bccb9e..7e32b12638 100644 --- a/UI/Popup/TagRenderingQuestion.ts +++ b/UI/Popup/TagRenderingQuestion.ts @@ -11,7 +11,7 @@ import {SaveButton} from "./SaveButton"; import {VariableUiElement} from "../Base/VariableUIElement"; import Translations from "../i18n/Translations"; import {FixedUiElement} from "../Base/FixedUiElement"; -import {Translation} from "../i18n/Translation"; +import {Translation, TypedTranslation} from "../i18n/Translation"; import Constants from "../../Models/Constants"; import {SubstitutedTranslation} from "../SubstitutedTranslation"; import {TagsFilter} from "../../Logic/Tags/TagsFilter"; @@ -51,7 +51,7 @@ export default class TagRenderingQuestion extends Combine { const applicableMappingsSrc = UIEventSource.ListStabilized(tags.map(tags => { - const applicableMappings: { if: TagsFilter, then: any, ifnot?: TagsFilter, addExtraTags: Tag[] }[] = [] + const applicableMappings: { if: TagsFilter, icon?: string, then: TypedTranslation, ifnot?: TagsFilter, addExtraTags: Tag[] }[] = [] for (const mapping of configuration.mappings ?? []) { if (mapping.hideInAnswer === true) { continue @@ -158,7 +158,7 @@ export default class TagRenderingQuestion extends Combine { private static GenerateInputElement( state, configuration: TagRenderingConfig, - applicableMappings: { if: TagsFilter, then: any, ifnot?: TagsFilter, addExtraTags: Tag[] }[], + applicableMappings: { if: TagsFilter, then: TypedTranslation, icon?: string, ifnot?: TagsFilter, addExtraTags: Tag[] }[], applicableUnit: Unit, tagsSource: UIEventSource, feedback: UIEventSource @@ -168,7 +168,7 @@ export default class TagRenderingQuestion extends Combine { const ff = TagRenderingQuestion.GenerateFreeform(state, configuration, applicableUnit, tagsSource, feedback); - const hasImages = applicableMappings.findIndex(mapping => mapping.then.icon !== undefined) >= 0 + const hasImages = applicableMappings.findIndex(mapping => mapping.icon !== undefined) >= 0 let inputEls: InputElement[]; const ifNotsPresent = applicableMappings.some(mapping => mapping.ifnot !== undefined) @@ -207,7 +207,7 @@ export default class TagRenderingQuestion extends Combine { applicableMappings.map((mapping, i) => { return { value: new And([mapping.if, ...allIfNotsExcept(i)]), - shown: Translations.WT(mapping.then) + shown: mapping.then.Subs(tagsSource.data) } }) ) diff --git a/UI/SpecialVisualizations.ts b/UI/SpecialVisualizations.ts index 046bd28f60..3203553932 100644 --- a/UI/SpecialVisualizations.ts +++ b/UI/SpecialVisualizations.ts @@ -46,6 +46,8 @@ import {LoginToggle} from "./Popup/LoginButton"; import {start} from "repl"; import {SubstitutedTranslation} from "./SubstitutedTranslation"; import {TextField} from "./Input/TextField"; +import Wikidata, {WikidataResponse} from "../Logic/Web/Wikidata"; +import {Translation} from "./i18n/Translation"; export interface SpecialVisualization { funcName: string, @@ -159,19 +161,19 @@ class CloseNoteButton implements SpecialVisualization { tags.ping() }) }) - - if((params.minZoom??"") !== "" && !isNaN(Number(params.minZoom))){ - closeButton = new Toggle( + + if ((params.minZoom ?? "") !== "" && !isNaN(Number(params.minZoom))) { + closeButton = new Toggle( closeButton, params.zoomButton ?? "", - state. locationControl.map(l => l.zoom >= Number(params.minZoom)) + state.locationControl.map(l => l.zoom >= Number(params.minZoom)) ) } - + return new LoginToggle(new Toggle( t.isClosed.SetClass("thanks"), closeButton, - + isClosed ), t.loginToClose, state) } @@ -180,7 +182,7 @@ class CloseNoteButton implements SpecialVisualization { export default class SpecialVisualizations { - public static specialVisualizations : SpecialVisualization[] = SpecialVisualizations.init() + public static specialVisualizations: SpecialVisualization[] = SpecialVisualizations.init() public static HelpMessage() { @@ -207,28 +209,28 @@ export default class SpecialVisualizations { )); return new Combine([ - new Combine([ - - new Title("Special tag renderings", 1), - - "In a tagrendering, some special values are substituted by an advanced UI-element. This allows advanced features and visualizations to be reused by custom themes or even to query third-party API's.", - "General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do not_ need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a comma in your args", - new Title("Using expanded syntax",4), - `Instead of using \`{"render": {"en": "{some_special_visualisation(some_arg, some other really long message, more args)} , "nl": "{some_special_visualisation(some_arg, een boodschap in een andere taal, more args)}}, one can also write`, - new FixedUiElement(JSON.stringify({ - render: { - special:{ - type: "some_special_visualisation", - "argname": "some_arg", - "message":{ - en:"some other really long message", - nl: "een boodschap in een andere taal" - }, - "other_arg_name":"more args" + new Combine([ + + new Title("Special tag renderings", 1), + + "In a tagrendering, some special values are substituted by an advanced UI-element. This allows advanced features and visualizations to be reused by custom themes or even to query third-party API's.", + "General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do not_ need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a comma in your args", + new Title("Using expanded syntax", 4), + `Instead of using \`{"render": {"en": "{some_special_visualisation(some_arg, some other really long message, more args)} , "nl": "{some_special_visualisation(some_arg, een boodschap in een andere taal, more args)}}, one can also write`, + new FixedUiElement(JSON.stringify({ + render: { + special: { + type: "some_special_visualisation", + "argname": "some_arg", + "message": { + en: "some other really long message", + nl: "een boodschap in een andere taal" + }, + "other_arg_name": "more args" + } } - } - })).SetClass("code") - ]).SetClass("flex flex-col"), + })).SetClass("code") + ]).SetClass("flex flex-col"), ...helpTexts ] ).SetClass("flex flex-col"); @@ -297,6 +299,32 @@ export default class SpecialVisualizations { ) }, + { + funcName: "wikidata_label", + docs: "Shows the label of the corresponding wikidata-item", + args: [ + { + name: "keyToShowWikidataFor", + doc: "Use the wikidata entry from this key to show the label", + defaultValue: "wikidata" + } + ], + example: "`{wikidata_label()}` is a basic example, `{wikipedia(name:etymology:wikidata)}` to show the label itself", + constr: (_, tagsSource, args) => + new VariableUiElement( + tagsSource.map(tags => tags[args[0]]) + .map(wikidata => { + wikidata = Utils.NoEmpty(wikidata?.split(";")?.map(wd => wd.trim()) ?? [])[0] + const entry = Wikidata.LoadWikidataEntry(wikidata) + return new VariableUiElement(entry.map(e => { + if (e === undefined || e["success"] === undefined) { + return wikidata + } + const response = e["success"] + return Translation.fromMap(response.labels) + })) + })) + }, { funcName: "minimap", docs: "A small map showing the selected feature.", @@ -482,7 +510,7 @@ export default class SpecialVisualizations { docs: "Downloads a JSON from the given URL, e.g. '{live(example.org/data.json, shorthand:x.y.z, other:a.b.c, shorthand)}' will download the given file, will create an object {shorthand: json[x][y][z], other: json[a][b][c] out of it and will return 'other' or 'json[a][b][c]. This is made to use in combination with tags, e.g. {live({url}, {url:format}, needed_value)}", example: "{live({url},{url:format},hour)} {live(https://data.mobility.brussels/bike/api/counts/?request=live&featureID=CB2105,hour:data.hour_cnt;day:data.day_cnt;year:data.year_cnt,hour)}", args: [{ - name: "Url", + name: "Url", doc: "The URL to load", required: true }, { @@ -783,7 +811,7 @@ export default class SpecialVisualizations { const textField = new TextField( { placeholder: t.addCommentPlaceholder, - inputStyle: "width: 100%; height: 6rem;", + inputStyle: "width: 100%; height: 6rem;", textAreaRows: 3, htmlType: "area" } @@ -846,7 +874,7 @@ export default class SpecialVisualizations { textField, new Combine([ stateButtons.SetClass("sm:mr-2"), - new Toggle(addCommentButton, + new Toggle(addCommentButton, new Combine([t.typeText]).SetClass("flex items-center h-full subtle"), textField.GetValue().map(t => t !== undefined && t.length >= 1)).SetClass("sm:mr-2") ]).SetClass("sm:flex sm:justify-between sm:items-stretch") @@ -947,7 +975,7 @@ export default class SpecialVisualizations { ] specialVisualizations.push(new AutoApplyButton(specialVisualizations)) - + return specialVisualizations; } diff --git a/UI/Wikipedia/WikidataSearchBox.ts b/UI/Wikipedia/WikidataSearchBox.ts index c3df838cdd..87afd99054 100644 --- a/UI/Wikipedia/WikidataSearchBox.ts +++ b/UI/Wikipedia/WikidataSearchBox.ts @@ -17,14 +17,20 @@ export default class WikidataSearchBox extends InputElement { IsSelected: UIEventSource = new UIEventSource(false); private readonly wikidataId: UIEventSource private readonly searchText: UIEventSource + private readonly instanceOf?: number[]; + private readonly notInstanceOf?: number[]; constructor(options?: { searchText?: UIEventSource, - value?: UIEventSource + value?: UIEventSource, + notInstanceOf?: number[], + instanceOf?: number[] }) { super(); this.searchText = options?.searchText this.wikidataId = options?.value ?? new UIEventSource(undefined); + this.instanceOf = options?.instanceOf + this.notInstanceOf = options?.notInstanceOf } GetValue(): UIEventSource { @@ -59,7 +65,9 @@ export default class WikidataSearchBox extends InputElement { if (promise === undefined) { promise = Wikidata.searchAndFetch(searchText, { lang, - maxCount: 5 + maxCount: 5, + notInstanceOf: this.notInstanceOf, + instanceOf: this.instanceOf } ) WikidataSearchBox._searchCache.set(key, promise) @@ -75,13 +83,15 @@ export default class WikidataSearchBox extends InputElement { return new Combine([Translations.t.general.wikipedia.failed.Clone().SetClass("alert"), searchFailMessage.data]) } + if (searchField.GetValue().data.length === 0) { + return Translations.t.general.wikipedia.doSearch + } + if (searchResults.length === 0) { return Translations.t.general.wikipedia.noResults.Subs({search: searchField.GetValue().data ?? ""}) } - if (searchResults.length === 0) { - return Translations.t.general.wikipedia.doSearch - } + return new Combine(searchResults.map(wikidataresponse => { const el = WikidataPreviewBox.WikidataResponsePreview(wikidataresponse).SetClass("rounded-xl p-1 sm:p-2 md:p-3 m-px border-2 sm:border-4 transition-colors") diff --git a/UI/i18n/Translations.ts b/UI/i18n/Translations.ts index 8186226fbd..6a817de9a4 100644 --- a/UI/i18n/Translations.ts +++ b/UI/i18n/Translations.ts @@ -22,6 +22,25 @@ export default class Translations { return s; } + /** + * Converts a string or an object into a typed translation. + * Translation objects ('Translation' and 'TypedTranslation') are converted/returned + * + * Translations.T("some text") // => new TypedTranslation({"*": "some text"}) + * Translations.T("some text").txt // => "some text" + * + * const t = new Translation({"nl": "vertaling", "en": "translation"}) + * Translations.T(t) // => new TypedTranslation({"nl": "vertaling", "en": "translation"}) + * + * const t = new TypedTranslation({"nl": "vertaling", "en": "translation"}) + * Translations.T(t) // => t + * + * const json: any = {"en": "English", "nl": "Nederlands"}; + * const translation = Translations.T(new Translation(json)); + * translation.textFor("en") // => "English" + * translation.textFor("nl") // => "Nederlands" + * + */ static T(t: string | any, context = undefined): TypedTranslation { if (t === undefined || t === null) { return undefined; @@ -30,7 +49,7 @@ export default class Translations { t = "" + t } if (typeof t === "string") { - return new TypedTranslation({"*": t}, context); + return new TypedTranslation({"*": t}, context); } if (t.render !== undefined) { const msg = "Creating a translation, but this object contains a 'render'-field. Use the translation directly" @@ -40,30 +59,12 @@ export default class Translations { if (t instanceof TypedTranslation) { return t; } - return new TypedTranslation(t, context); + if(t instanceof Translation){ + return new TypedTranslation(t.translations) + } + return new TypedTranslation(t, context); } - /** - * 'Wrap Translation': given an object containing translations OR a string, returns a translation object - * - * const json: any = {"en": "English", "nl": "Nederlands"}; - * const translation = Translations.WT(new Translation(json)); - * translation.textFor("en") // => "English" - * translation.textFor("nl") // => "Nederlands" - */ - public static WT(s: string | Translation): Translation { - if (s === undefined || s === null) { - return undefined; - } - if (typeof (s) === "string") { - return new Translation({'*': s}); - } - if (s instanceof Translation) { - return s.Clone() /* MUST CLONE HERE! */; - } - console.error("Trying to Translation.WT, but got ", s) - throw "??? Not a valid translation" - } public static CountTranslations() { const queue: any = [Translations.t]; diff --git a/Utils.ts b/Utils.ts index c8a7da1c9b..b55b4d775a 100644 --- a/Utils.ts +++ b/Utils.ts @@ -756,7 +756,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be * Triggers a 'download file' popup which will download the contents */ public static offerContentsAsDownloadableFile(contents: string | Blob, fileName: string = "download.txt", - options?: { mimetype: string | "text/plain" | "text/csv" | "application/vnd.geo+json" | "{gpx=application/gpx+xml}" }) { + options?: { mimetype: string | "text/plain" | "text/csv" | "application/vnd.geo+json" | "{gpx=application/gpx+xml}" | "application/json" }) { const element = document.createElement("a"); let file; if (typeof (contents) === "string") { diff --git a/assets/language_native.json b/assets/language_native.json index 819cc1678c..c81c79d341 100644 --- a/assets/language_native.json +++ b/assets/language_native.json @@ -1,22 +1,23 @@ { "ca": "català", "de": "Deutsch", - "eo": "Esperanto", - "fr": "français", - "es": "español", - "gl": "lingua galega", - "fi": "suomi", "en": "English", - "ru": "русский язык", - "it": "italiano", - "pl": "język polski", - "ja": "日本語", - "sv": "svenska", - "pt": "português", - "nl": "Nederlands", - "id": "Indonesia", + "eo": "Esperanto", + "es": "español", + "fi": "suomi", + "fr": "français", + "gl": "lingua galega", "hu": "magyar", + "id": "Indonesia", + "it": "italiano", + "ja": "日本語", "nb_NO": "bokmål", - "zh_Hant": "簡體中文", - "pt_BR": "português brasileiro" + "nl": "Nederlands", + "pl": "język polski", + "pt": "português", + "pt_BR": "português brasileiro", + "ru": "русский язык", + "sl": "slovenščina", + "sv": "svenska", + "zh_Hant": "簡體中文" } \ No newline at end of file diff --git a/assets/language_translations.json b/assets/language_translations.json index 383397e1df..2582af26e9 100644 --- a/assets/language_translations.json +++ b/assets/language_translations.json @@ -1,27 +1,4 @@ { - "ca": { - "en": "Catalan", - "de": "Katalanisch", - "nl": "Catalaans", - "ca": "català", - "es": "catalán", - "fr": "catalan", - "eo": "kataluna lingvo", - "fi": "katalaani", - "gl": "lingua catalá", - "hu": "katalán", - "id": "Bahasa Katala", - "it": "catalano", - "ja": "カタルーニャ語", - "nb_NO": "katalansk", - "pl": "język kataloński", - "pt": "língua catalã", - "pt_BR": "língua catalã", - "ru": "каталанский язык", - "sv": "katalanska", - "zh_Hans": "加泰罗尼亚语", - "zh_Hant": "加泰隆尼亞語" - }, "de": { "ca": "alemany", "en": "German", @@ -41,6 +18,7 @@ "pl": "język niemiecki", "pt": "alemão", "ru": "немецкий язык", + "sl": "nemščina", "sv": "tyska", "zh_Hans": "德语", "zh_Hant": "德語" @@ -65,10 +43,36 @@ "pt": "esperanto", "pt_BR": "esperanto", "ru": "эсперанто", + "sl": "esperanto", "sv": "esperanto", "zh_Hans": "世界语" }, + "ca": { + "en": "Catalan", + "de": "Katalanisch", + "nl": "Catalaans", + "ca": "català", + "es": "catalán", + "fr": "catalan", + "eo": "kataluna lingvo", + "fi": "katalaani", + "gl": "lingua catalá", + "hu": "katalán", + "id": "Bahasa Katala", + "it": "catalano", + "ja": "カタルーニャ語", + "nb_NO": "katalansk", + "pl": "język kataloński", + "pt": "língua catalã", + "pt_BR": "língua catalã", + "ru": "каталанский язык", + "sl": "Katalonščina", + "sv": "katalanska", + "zh_Hans": "加泰罗尼亚语", + "zh_Hant": "加泰隆尼亞語" + }, "fr": { + "zh_Hans": "法语", "es": "francés", "nl": "Frans", "en": "French", @@ -84,11 +88,11 @@ "fi": "ranska", "gl": "lingua francesa", "ja": "フランス語", - "zh_Hans": "法语", "nb_NO": "fransk", "pl": "język francuski", "pt_BR": "francês", "ru": "французский язык", + "sl": "francoščina", "sv": "franska" }, "es": { @@ -110,6 +114,7 @@ "pt": "espanhol", "pt_BR": "espanhol", "ru": "испанский язык", + "sl": "španščina", "sv": "spanska", "zh_Hans": "西班牙语", "zh_Hant": "西班牙語" @@ -133,17 +138,11 @@ "pt": "galego", "pt_BR": "língua galega", "ru": "галисийский язык", + "sl": "Galicijščina", "sv": "galiciska", "zh_Hant": "加利西亞語" }, "fi": { - "nb_NO": "finsk", - "pl": "język fiński", - "pt": "finlandês", - "pt_BR": "língua finlandesa", - "sv": "finska", - "zh_Hans": "芬兰语", - "zh_Hant": "芬蘭語", "nl": "Fins", "de": "Finnisch", "en": "Finnish", @@ -157,16 +156,17 @@ "ca": "finès", "eo": "finna lingvo", "fr": "finnois", - "gl": "finés" + "gl": "finés", + "nb_NO": "finsk", + "pl": "język fiński", + "pt": "finlandês", + "pt_BR": "língua finlandesa", + "sl": "finščina", + "sv": "finska", + "zh_Hans": "芬兰语", + "zh_Hant": "芬蘭語" }, "en": { - "pl": "język angielski", - "pt": "inglês", - "pt_BR": "inglês", - "ru": "английский язык", - "sv": "engelska", - "zh_Hans": "英语", - "zh_Hant": "英語", "id": "Inggris", "it": "inglese", "ja": "英語", @@ -180,9 +180,25 @@ "fi": "englanti", "fr": "anglais", "gl": "lingua inglesa", - "hu": "angol" + "hu": "angol", + "pl": "język angielski", + "pt": "inglês", + "pt_BR": "inglês", + "ru": "английский язык", + "sl": "angleščina", + "sv": "engelska", + "zh_Hans": "英语", + "zh_Hant": "英語" }, "ru": { + "zh_Hans": "俄语", + "zh_Hant": "俄語", + "hu": "orosz", + "en": "Russian", + "ru": "русский язык", + "es": "ruso", + "fr": "russe", + "nl": "Russisch", "ca": "rus", "de": "Russisch", "eo": "rusa lingvo", @@ -191,88 +207,35 @@ "id": "Rusia", "it": "russo", "ja": "ロシア語", - "hu": "orosz", - "en": "Russian", - "ru": "русский язык", - "es": "ruso", - "fr": "russe", - "nl": "Russisch", - "sv": "ryska", - "zh_Hans": "俄语", - "zh_Hant": "俄語", "nb_NO": "russisk", "pl": "język rosyjski", "pt": "russo", - "pt_BR": "russo" + "pt_BR": "russo", + "sl": "ruščina", + "sv": "ryska" }, - "it": { - "zh_Hans": "意大利语", - "zh_Hant": "義大利語", - "nb_NO": "italiensk", - "pl": "język włoski", - "pt_BR": "língua italiana", - "ru": "итальянский язык", - "sv": "italienska", - "ca": "italià", - "eo": "itala lingvo", - "fi": "italia", - "gl": "lingua italiana", - "en": "Italian", - "ja": "イタリア語", - "es": "italiano", - "hu": "olasz", - "id": "Italia", - "it": "italiano", - "fr": "italien", - "de": "Italienisch", - "nl": "Italiaans", - "pt": "italiano" - }, - "pl": { - "de": "Polnisch", - "en": "Polish", - "pl": "język polski", - "es": "polaco", - "fr": "polonais", - "ca": "polonès", - "eo": "pola lingvo", - "fi": "puola", - "gl": "lingua polaca", - "hu": "lengyel", - "id": "Polandia", - "zh_Hans": "波兰语", - "zh_Hant": "波蘭語", - "it": "polacco", - "ja": "ポーランド語", - "nb_NO": "polsk", - "nl": "Pools", - "pt": "polaco", - "pt_BR": "língua polonesa", - "ru": "польский язык", - "sv": "polska" - }, - "ja": { - "nb_NO": "japansk", - "nl": "Japans", - "pl": "język japoński", - "pt": "japonês", - "pt_BR": "língua japonesa", - "ru": "японский язык", - "sv": "japanska", - "zh_Hans": "日语", - "zh_Hant": "日語", - "en": "Japanese", - "ca": "japonès", - "de": "Japanisch", - "eo": "japana lingvo", - "es": "japonés", - "fi": "japani", - "fr": "japonais", - "gl": "lingua xaponesa", - "hu": "japán", - "id": "Bahasa Jepang", - "it": "giapponese", - "ja": "日本語" + "sl": { + "en": "Slovene", + "ca": "eslovè", + "de": "Slowenisch", + "eo": "slovena lingvo", + "es": "esloveno", + "fi": "sloveeni", + "fr": "slovène", + "gl": "lingua eslovena", + "hu": "szlovén", + "id": "Bahasa Slovenia", + "it": "sloveno", + "ja": "スロベニア語", + "nb_NO": "slovensk", + "nl": "Sloveens", + "pl": "język słoweński", + "pt": "língua eslovena", + "pt_BR": "língua eslovena", + "ru": "словенский язык", + "sl": "slovenščina", + "sv": "slovenska", + "zh_Hant": "斯洛維尼亞語" }, "sv": { "en": "Swedish", @@ -294,8 +257,33 @@ "pt": "língua sueca", "pt_BR": "língua sueca", "ru": "шведский язык", + "sl": "švedščina", "zh_Hant": "瑞典語" }, + "it": { + "en": "Italian", + "ja": "イタリア語", + "es": "italiano", + "hu": "olasz", + "id": "Italia", + "it": "italiano", + "fr": "italien", + "de": "Italienisch", + "nl": "Italiaans", + "pt": "italiano", + "ca": "italià", + "eo": "itala lingvo", + "fi": "italia", + "gl": "lingua italiana", + "nb_NO": "italiensk", + "pl": "język włoski", + "pt_BR": "língua italiana", + "ru": "итальянский язык", + "sl": "italijanščina", + "sv": "italienska", + "zh_Hans": "意大利语", + "zh_Hant": "義大利語" + }, "pt": { "en": "Portuguese", "hu": "portugál", @@ -315,32 +303,105 @@ "pl": "język portugalski", "pt_BR": "português", "ru": "португальский язык", + "sl": "portugalščina", "sv": "portugisiska", "zh_Hans": "葡萄牙语", "zh_Hant": "葡萄牙語" }, + "pl": { + "de": "Polnisch", + "en": "Polish", + "pl": "język polski", + "es": "polaco", + "fr": "polonais", + "nb_NO": "polsk", + "nl": "Pools", + "pt": "polaco", + "pt_BR": "língua polonesa", + "ru": "польский язык", + "sl": "poljščina", + "sv": "polska", + "zh_Hans": "波兰语", + "zh_Hant": "波蘭語", + "ca": "polonès", + "eo": "pola lingvo", + "fi": "puola", + "gl": "lingua polaca", + "hu": "lengyel", + "id": "Polandia", + "it": "polacco", + "ja": "ポーランド語" + }, + "ja": { + "nb_NO": "japansk", + "nl": "Japans", + "pl": "język japoński", + "pt": "japonês", + "pt_BR": "língua japonesa", + "ru": "японский язык", + "sl": "Japonščina", + "sv": "japanska", + "zh_Hans": "日语", + "zh_Hant": "日語", + "id": "bahasa Jepang", + "en": "Japanese", + "ca": "japonès", + "de": "Japanisch", + "eo": "japana lingvo", + "es": "japonés", + "fi": "japani", + "fr": "japonais", + "gl": "lingua xaponesa", + "hu": "japán", + "it": "giapponese", + "ja": "日本語" + }, "nl": { "en": "Dutch", "de": "Niederländisch", "nl": "Nederlands", "ca": "neerlandès", - "es": "neerlandés", "fr": "néerlandais", "hu": "holland", "id": "Belanda", "it": "olandese", + "es": "Neerlandés", "eo": "nederlanda lingvo", "fi": "hollanti", "gl": "lingua neerlandesa", - "zh_Hans": "荷兰语", - "zh_Hant": "荷蘭語", "ja": "オランダ語", "nb_NO": "nederlandsk", "pl": "język niderlandzki", "pt": "neerlandês", "pt_BR": "neerlandês", "ru": "нидерландский язык", - "sv": "nederländska" + "sl": "Nizozemščina", + "sv": "nederländska", + "zh_Hans": "荷兰语", + "zh_Hant": "荷蘭語" + }, + "hu": { + "en": "Hungarian", + "fr": "hongrois", + "pt": "húngaro", + "pt_BR": "língua húngara", + "ru": "венгерский язык", + "sl": "madžarščina", + "sv": "ungerska", + "zh_Hant": "匈牙利語", + "ca": "hongarès", + "de": "Ungarisch", + "eo": "hungara lingvo", + "es": "húngaro", + "fi": "unkari", + "gl": "lingua húngara", + "hu": "magyar", + "id": "Hongaria", + "it": "ungherese", + "ja": "ハンガリー語", + "nb_NO": "ungarsk", + "nl": "Hongaars", + "pl": "język węgierski" }, "id": { "en": "Indonesian", @@ -361,33 +422,16 @@ "pt": "língua indonésia", "pt_BR": "língua indonésia", "ru": "индонезийский язык", + "sl": "indonezijščina", "sv": "indonesiska", "zh_Hans": "印度尼西亚语", "zh_Hant": "印尼語" }, - "hu": { - "nb_NO": "ungarsk", - "nl": "Hongaars", - "pl": "język węgierski", - "pt": "húngaro", - "pt_BR": "língua húngara", - "ru": "венгерский язык", - "sv": "ungerska", - "zh_Hant": "匈牙利語", - "ca": "hongarès", - "de": "Ungarisch", - "eo": "hungara lingvo", - "es": "húngaro", - "fi": "unkari", - "gl": "lingua húngara", - "hu": "magyar", - "id": "Hongaria", - "it": "ungherese", - "ja": "ハンガリー語", - "en": "Hungarian", - "fr": "hongrois" - }, "nb_NO": { + "ca": "bokmål", + "de": "Bokmål", + "en": "Bokmål", + "eo": "Bokmål", "es": "bokmål", "fi": "kirjanorja", "fr": "bokmål", @@ -402,11 +446,8 @@ "pt": "bokmål", "pt_BR": "Bokmål", "ru": "букмол", - "sv": "bokmål", - "ca": "bokmål", - "de": "Bokmål", - "en": "Bokmål", - "eo": "Bokmål" + "sl": "Bokmål", + "sv": "bokmål" }, "zh_Hant": { "ca": "xinès simplificat", @@ -420,7 +461,7 @@ "it": "cinese semplificato", "ja": "簡体字中国語", "nb_NO": "tradisjonell kinesisk", - "pl": "Chiński uproszczony", + "pl": "język chiński uproszczony", "pt": "chinês simplificado", "zh_Hans": "简体中文", "zh_Hant": "簡體中文", diff --git a/assets/layers/address/address.json b/assets/layers/address/address.json index 05b6808276..506d931aec 100644 --- a/assets/layers/address/address.json +++ b/assets/layers/address/address.json @@ -10,7 +10,8 @@ "ru": "Известные адреса в OSM", "id": "Alamat yang dikenal di OSM", "es": "Direcciones conocidas en OSM", - "zh_Hans": "OSM中已知的地址" + "zh_Hans": "OSM中已知的地址", + "nb_NO": "Kjente adresser i OSM" }, "minzoom": 18, "source": { @@ -38,7 +39,8 @@ "ru": "Известный адрес", "es": "Domicilio conocido", "zh_Hans": "已知的地址", - "id": "Alamat yang diketahui" + "id": "Alamat yang diketahui", + "nb_NO": "Kjent adresse" } }, "description": { @@ -53,7 +55,8 @@ "id": "Alamat", "es": "Direcciones", "zh_Hans": "地址", - "ca": "Adreces" + "ca": "Adreces", + "nb_NO": "Adresser" }, "tagRenderings": [ { @@ -67,7 +70,8 @@ "pl": "Numer tego domu to {addr:housenumber}", "ru": "Номер дома {addr:housenumber}", "zh_Hans": "门牌号是{addr:housenumber}", - "id": "Nomor rumah ini {addr:housenumber}" + "id": "Nomor rumah ini {addr:housenumber}", + "es": "La numeración de la casa es {addr:housenumber}" }, "question": { "en": "What is the number of this house?", @@ -119,7 +123,8 @@ "fr": "Le nom de la voie est {addr:street}", "pl": "Ten adres znajduje się na ulicy {addr:street}", "zh_Hans": "这个地址位于{addr:street}街", - "id": "Alamat ini ada di jalan {addr:street}" + "id": "Alamat ini ada di jalan {addr:street}", + "es": "La dirección está en la calle {addr:street}" }, "question": { "en": "What street is this address located in?", diff --git a/assets/layers/ambulancestation/ambulancestation.json b/assets/layers/ambulancestation/ambulancestation.json index 8e4a199dd9..039c37c1fc 100644 --- a/assets/layers/ambulancestation/ambulancestation.json +++ b/assets/layers/ambulancestation/ambulancestation.json @@ -10,7 +10,8 @@ "hu": "Mentőállomás-térkép", "nl": "Kaart van ambulancestations", "zh_Hans": "救护车站地图", - "id": "Peta stasiun ambulans" + "id": "Peta stasiun ambulans", + "es": "Mapa de estaciones de ambulancias" }, "minzoom": 12, "source": { @@ -29,7 +30,8 @@ "de": "Rettungswache", "it": "Stazione delle ambulanze", "hu": "Mentőállomás", - "nl": "Ambulancestation" + "nl": "Ambulancestation", + "es": "Estación de Ambulancias" } }, "description": { @@ -40,7 +42,8 @@ "it": "La stazione delle ambulanze è un’area per lo stoccaggio delle ambulanze, dell’equipaggiamento medico, dei dispositivi di protezione individuale e di altre forniture medicali.", "hu": "A mentőállomás olyan terület, ahol mentőautókat, orvosi felszereléseket, egyéni védőfelszereléseket és egyéb orvosi felszereléseket tárolnak.", "ru": "Станция скорой помощи это полигон для хранения транспорта, медицинского оборудования, средств индивидуальной защиты и других медицинских принадлежностей.", - "nl": "Een ambulancestation is een plaats waar ambulances, medisch materiaal, persoonlijk beschermingsmateriaal en aanverwanten worden bewaard." + "nl": "Een ambulancestation is een plaats waar ambulances, medisch materiaal, persoonlijk beschermingsmateriaal en aanverwanten worden bewaard.", + "es": "Una estación de ambulancias es una zona para almacenar vehículos de ambulancia, equipamiento médico, equipos de protección personal y otros suministros médicos." }, "tagRenderings": [ { @@ -56,7 +59,9 @@ "it": "Qual è il nome di questa stazione delle ambulanze?", "de": "Wie heißt diese Rettungswache?", "hu": "Mi a neve ennek a menőtállomásnak?", - "nl": "Hoe heet dit ambulancestation?" + "nl": "Hoe heet dit ambulancestation?", + "es": "¿Cual es el nombre de esta estación de ambulancias?", + "nb_NO": "Hva er navnet på denne ambulansestasjonen?" }, "render": { "en": "This station is called {name}.", @@ -66,7 +71,9 @@ "it": "Questa stazione è chiamata {name}.", "de": "Diese Rettungswache heißt {name}.", "hu": "A mentőállomás neve: {name}.", - "nl": "Dit station heet {name}." + "nl": "Dit station heet {name}.", + "es": "Esta estación se llama {name}.", + "nb_NO": "Denne stasjonen heter {name}." } }, { @@ -82,7 +89,8 @@ "it": " Come si chiama la strada in cui si trova questa stazione?", "de": " Wie lautet der Name der Straße, in der sich die Rettungswache befindet?", "hu": " Mi a neve annak az utcának, amelyben az állomás található?", - "nl": " In welke straat ligt dit station?" + "nl": " In welke straat ligt dit station?", + "es": " ¿Cual es el nombre de la calle en la que se encuentra la estación?" }, "render": { "en": "This station is along a highway called {addr:street}.", @@ -92,7 +100,8 @@ "it": "Questa stazione si trova in {addr:street}.", "de": "Dieser Bahnhof liegt an der Straße {addr:street}.", "hu": "Ez az állomás a következő utcában van: {addr:street}.", - "nl": "Straat waar dit station ligt: {addr:street}" + "nl": "Straat waar dit station ligt: {addr:street}", + "es": "Esta estación se encuentra al lado de una autovía llamada {addr:street}." } }, { @@ -105,7 +114,8 @@ "it": "Dove si trova la stazione? (ad es. quartiere, paese o città)", "de": "Wo befindet sich die Rettungswache? (z. B. Name von Stadtviertel, Dorf oder Stadt)", "hu": "Hol található az állomás? (Pl. a falu, kisváros vagy városrész neve.)", - "nl": "Waar ligt het station? (v.b. naam van de buurt, dorp of stad)" + "nl": "Waar ligt het station? (v.b. naam van de buurt, dorp of stad)", + "es": "¿Dónde se encuentra la estación? (ej. nombre del barrio, pueblo o ciudad)" }, "freeform": { "key": "addr:place" @@ -117,7 +127,8 @@ "it": "La stazione si trova a {addr:place}.", "de": "Diese Rettungswache befindet sich in {addr:place}.", "hu": "Ez az állomás itt található: {addr:place}.", - "nl": "Dit station ligt in {addr:place}." + "nl": "Dit station ligt in {addr:place}.", + "es": "Esta estación se encuentra en {addr:place}." } }, { @@ -130,7 +141,8 @@ "de": "Welches Unternehmen betreibt diese Rettungswache?", "hu": "Milyen szervezet működteti ezt az állomást?", "ru": "Какая организация управляет этой станцией?", - "nl": "Welke organisatie beheert dit station?" + "nl": "Welke organisatie beheert dit station?", + "es": "¿Qué agencia opera esta estación?" }, "render": { "en": "This station is operated by {operator}.", @@ -140,7 +152,8 @@ "de": "Diese Rettungswache wird betrieben von {operator}.", "hu": "Az állomás üzemeltetője: {operator}.", "ru": "Эта станция управляется {operator}.", - "nl": "Dit station wordt beheerd door {operator}." + "nl": "Dit station wordt beheerd door {operator}.", + "es": "Esta estación la opera {operator}." }, "freeform": { "key": "operator" @@ -156,7 +169,8 @@ "it": "Com’è classificato il gestore della stazione?", "de": "Wie kann der Betreiber der Rettungswache eingestuft werden?", "hu": "Hogyan sorolható be az állomás üzemeltetője?", - "nl": "Wat voor een organisatie is de beheerder van dit station?" + "nl": "Wat voor een organisatie is de beheerder van dit station?", + "es": "¿Como está clasificada la operadora de la estación?" }, "render": { "en": "The operator is a(n) {operator:type} entity.", @@ -165,7 +179,8 @@ "it": "L’operatore è un ente {operator:type}.", "de": "Der Betreiber ist eine {operator:type}.", "hu": "Az üzemeltető egy {operator:type} jellegű szervezet.", - "nl": "De beheerder is van het type {operator:type}." + "nl": "De beheerder is van het type {operator:type}.", + "es": "La operador a no es una entidad de tipo {operator:type}." }, "freeform": { "key": "operator:type" @@ -185,7 +200,8 @@ "de": "Die Rettungswache wird von einer Behörde betrieben.", "hu": "A mentőállomást a kormány üzemelteti.", "ru": "Станция управляется правительством.", - "nl": "Dit station wordt beheerd door de overheid." + "nl": "Dit station wordt beheerd door de overheid.", + "es": "La estación la opera el govierno." } }, { @@ -202,7 +218,8 @@ "de": "Die Rettungswache wird von einer gemeindenahen oder informellen Organisation betrieben.", "hu": "Mentőállomást egy közösségi vagy nem hivatalos szervezet működteti.", "ru": "Станция управляется волонтёрами или частной организацией.", - "nl": "Dit station wordt beheerd door een informele of community organisatie." + "nl": "Dit station wordt beheerd door een informele of community organisatie.", + "es": "La estación la opera una organización basada en la comunidad o informal." } }, { @@ -218,7 +235,8 @@ "it": "La stazione è gestita da un gruppo ufficiale di volontari.", "de": "Die Rettungswache wird von einer Freiwilligenorganisation betrieben.", "hu": "A mentőállomást egy önkéntesekből álló hivatalos csoport működteti.", - "nl": "Dit station wordt beheerd door een formele groep vrijwilligers." + "nl": "Dit station wordt beheerd door een formele groep vrijwilligers.", + "es": "La estación la opera un grupo formal de voluntarios." } }, { @@ -234,7 +252,8 @@ "it": "La stazione è gestita da un privato.", "de": "Die Rettungswache wird von einer privaten Organisation betrieben.", "hu": "Az állomást egy magánkézben lévő szervezet működteti.", - "nl": "Dit station wordt beheerd door een privé-organisatie." + "nl": "Dit station wordt beheerd door een privé-organisatie.", + "es": "La estación es de gestión privada." } } ] @@ -256,7 +275,9 @@ "hu": "Mentőállomás", "nl": "een ambulancestation", "zh_Hans": "救护车站", - "id": "Stasiun ambulans" + "id": "Stasiun ambulans", + "es": "una estación de ambulancias", + "nb_NO": "en ambulansestasjon" }, "description": { "en": "Add an ambulance station to the map", @@ -268,7 +289,9 @@ "hu": "Mentőállomás hozzáadása a térképhez", "nl": "Voeg een ambulancestation toe aan de kaart", "zh_Hans": "向地图中添加一个救护车站", - "id": "Tambahkan stasiun ambulans ke peta" + "id": "Tambahkan stasiun ambulans ke peta", + "es": "Añadir una estación de ambulancias al mapa", + "nb_NO": "Legg til en ambulansestasjon på kartet" } } ], diff --git a/assets/layers/artwork/artwork.json b/assets/layers/artwork/artwork.json index 9f4b355c4a..f433e7f5c6 100644 --- a/assets/layers/artwork/artwork.json +++ b/assets/layers/artwork/artwork.json @@ -286,7 +286,8 @@ "pt": "Pedra", "hu": "Kő", "pl": "Skała", - "ca": "Pedra" + "ca": "Pedra", + "es": "Piedra" } }, { @@ -345,7 +346,8 @@ "pt": "Relevo", "hu": "Dombormű", "pl": "Płaskorzeźba", - "ca": "Relleu" + "ca": "Relleu", + "es": "Relieve" } }, { @@ -363,7 +365,8 @@ "id": "Azulejo (ubin dekoratif Spanyol)", "pt": "Azulejo (azulejo decorativo espanhol e português)", "hu": "Azulejo (portugál vagy spanyol dekoratív csempe)", - "pl": "Azulejo (hiszpańskie płytka dekoracyjna)" + "pl": "Azulejo (hiszpańskie płytka dekoracyjna)", + "es": "Azulejo (azulejos decorativos españoles)" } }, { @@ -381,7 +384,8 @@ "pt": "Ladrilhos", "hu": "Csempe", "pl": "Płyta ceramiczna (fliza)", - "ca": "Enrajolat" + "ca": "Enrajolat", + "es": "Cerámica" } } ], @@ -401,7 +405,8 @@ "id": "Seniman mana yang menciptakan ini?", "pt": "Que artista criou isto?", "hu": "Melyik művész alkotása ezt?", - "pl": "Który artysta to stworzył?" + "pl": "Który artysta to stworzył?", + "es": "¿Que artista creó esto?" }, "render": { "en": "Created by {artist_name}", @@ -416,7 +421,8 @@ "id": "Dibuat oleh {artist_name}", "pt": "Criado por {artist_name}", "hu": "Alkotó: {artist_name}", - "pl": "Stworzone przez {artist_name}" + "pl": "Stworzone przez {artist_name}", + "es": "Creado por {artist_name}" }, "freeform": { "key": "artist_name" @@ -437,7 +443,8 @@ "id": "Adakah situs web mengenai informasi lebih lanjut tentang karya seni ini?", "pt": "Existe um site com mais informações sobre esta obra de arte?", "hu": "Van-e olyan honlap, amely további információkat tartalmaz erről a műalkotásról?", - "pl": "Gdzie znajdę więcej informacji na temat tego dzieła sztuki?" + "pl": "Gdzie znajdę więcej informacji na temat tego dzieła sztuki?", + "es": "¿Hay un sitio web con más información sobre esta obra de arte?" }, "render": { "en": "More information on this website", @@ -452,7 +459,8 @@ "nb_NO": "Mer info er å finne på denne nettsiden", "pt": "Mais informações neste site", "hu": "További információ ezen a weboldalon", - "pl": "Więcej informacji na tej stronie" + "pl": "Więcej informacji na tej stronie", + "es": "Más información en este sitio web" }, "freeform": { "key": "website", @@ -473,7 +481,8 @@ "nb_NO": "Hvilken Wikipedia-oppføring samsvarer med dette kunstverket?", "id": "Entri Wikidata mana yang sesuai dengan karya seni ini?", "pt": "Que entrada no Wikidata corresponde a esta obra de arte?", - "hu": "Melyik Wikidata-bejegyzés felel meg ennek a műalkotásnak?" + "hu": "Melyik Wikidata-bejegyzés felel meg ennek a műalkotásnak?", + "es": "¿Qué entrada de Wikidata se corresponde con esta obra de arte?" }, "render": { "en": "Corresponds with {wikidata}", @@ -487,7 +496,8 @@ "nb_NO": "Samsvarer med {wikidata}", "id": "Sesuai dengan {wikidata}", "pt": "Corresponde a {wikidata}", - "hu": "Ez a megfelelő: {wikidata}" + "hu": "Ez a megfelelő: {wikidata}", + "es": "Se corresponde con {wikidata}" }, "freeform": { "key": "wikidata", diff --git a/assets/layers/barrier/barrier.json b/assets/layers/barrier/barrier.json index 758c564e52..c331861160 100644 --- a/assets/layers/barrier/barrier.json +++ b/assets/layers/barrier/barrier.json @@ -81,7 +81,8 @@ "nl": "Een paaltje in de weg", "de": "Ein Poller auf der Straße", "hu": "Terelőoszlop az úton", - "fr": "Un potelet sur le chemin" + "fr": "Un potelet sur le chemin", + "es": "Un bolardo en la carretera" }, "preciseInput": { "preferredBackground": [ @@ -161,7 +162,8 @@ "hu": "Ez egyetlen oszlop az úton", "nl": "Dit is een enkel paaltje in de weg", "fr": "C'est un plot unique sur la route", - "de": "Dies ist ein einzelner Poller auf der Straße" + "de": "Dies ist ein einzelner Poller auf der Straße", + "es": "Este es un único bolardo en la carretera" } }, { @@ -171,7 +173,8 @@ "nl": "Dit zijn fietshekjes die fietsers afremmen", "hu": "Ez egy kerékpárakadály, amely lelassítja a kerékpárosokat", "fr": "C'est une barrière visant à ralentir les vélos", - "de": "Dies ist eine Fahrradbarriere, die Radfahrer abbremst" + "de": "Dies ist eine Fahrradbarriere, die Radfahrer abbremst", + "es": "Esta es una barrera ciclista que ralentiza a los ciclistas" } } ] @@ -252,7 +255,8 @@ "nl": "Wat voor fietshekjes zijn dit?", "de": "Um welche Art Fahrradhindernis handelt es sich?", "hu": "Milyen fajta kerékpárakadály ez?", - "fr": "Quel est ce type de barrière cyclable ?" + "fr": "Quel est ce type de barrière cyclable ?", + "es": "¿Qué tipo de barrera ciclista es esta?" }, "condition": "barrier=cycle_barrier", "mappings": [ @@ -321,14 +325,16 @@ "nl": "Maximumbreedte: {maxwidth:physical} m", "de": "Maximale Durchfahrtsbreite: {maxwidth:physical} m", "fr": "Largeur maximale: {maxwidth:physical} m", - "hu": "Legnagyobb szélesség: {maxwidth:physical} m" + "hu": "Legnagyobb szélesség: {maxwidth:physical} m", + "es": "Anchura máxima: {maxwidth:physical} m" }, "question": { "en": "How wide is the gap left over besides the barrier?", "nl": "Hoe breed is de ruimte naast de barrière?", "de": "Welche Durchfahrtsbreite hat das Hindernis?", "hu": "Milyen széles az akadályon az a rés, amelyen át lehet haladni?", - "fr": "Quelle est la largeur du passage ?" + "fr": "Quelle est la largeur du passage ?", + "es": "¿Cómo de ancho es el hueco dejado fuera de la barrera?" }, "condition": { "and": [ @@ -352,14 +358,16 @@ "nl": "Ruimte tussen barrières (langs de lengte van de weg): {width:separation} m", "de": "Abstand zwischen den Barrieren (entlang der Straße): {width:separation} m", "hu": "A korlátok közötti távolság (az út irányában): {width:separation} m", - "fr": "Espace entre deux barrières successives : {width:separation} m" + "fr": "Espace entre deux barrières successives : {width:separation} m", + "es": "Espacio entre barreras (a lo largo de la longitud de la carretera): {width:separation} m" }, "question": { "en": "How much space is there between the barriers (along the length of the road)?", "nl": "Hoeveel ruimte is er tussen de barrières (langs de lengte van de weg)?", "de": "Wie groß ist der Abstand zwischen den Barrieren (entlang der Straße)?", "hu": "Mekkora távolság van a korlátok között (az út irányában)?", - "fr": "Combien d’espace sépare deux barrières successives ?" + "fr": "Combien d’espace sépare deux barrières successives ?", + "es": "¿Cuánto espacio hay entre las barreras (a lo largo de la longitud de la carretera)?" }, "condition": { "or": [ @@ -383,14 +391,16 @@ "nl": "Breedte van de opening: {width:opening} m", "de": "Breite der Öffnung: {width:opening} m", "fr": "Largeur de l'ouverture : {width:opening} m", - "hu": "Nyílás szélessége: {width:opening} m" + "hu": "Nyílás szélessége: {width:opening} m", + "es": "Anchura de la apertura: {width:opening} m" }, "question": { "en": "How wide is the smallest opening next to the barriers?", "nl": "Hoe breed is de smalste opening naast de barrières?", "de": "Wie breit ist die kleinste Öffnung neben den Barrieren?", "hu": "Milyen széles a korlátok melletti legkisebb nyílás?", - "fr": "Quelle est la largeur d'ouverture après la plus petite près de la barrière ?" + "fr": "Quelle est la largeur d'ouverture après la plus petite près de la barrière ?", + "es": "¿Cómo de año es la apertura más pequeña al lado de las barreras?" }, "condition": { "or": [ @@ -414,14 +424,16 @@ "de": "Überschneidung: {overlap} m", "hu": "Átfedés: {overlap} m", "fr": "Chevauchement : {overlap} m", - "nl": "Overlap: {overlap} m" + "nl": "Overlap: {overlap} m", + "es": "Solapado: {overlap} m" }, "question": { "en": "How much overlap do the barriers have?", "nl": "Hoeveel overlappen de barrières?", "de": "Wie stark überschneiden sich die Barrieren?", "hu": "Mekkora a korlátok átfedése?", - "fr": "Quel est le chevauchement des barrières ?" + "fr": "Quel est le chevauchement des barrières ?", + "es": "¿Cuánto se solapan las barreras?" }, "condition": { "or": [ diff --git a/assets/layers/bench/bench.json b/assets/layers/bench/bench.json index 4af69a28b7..b173ae7a61 100644 --- a/assets/layers/bench/bench.json +++ b/assets/layers/bench/bench.json @@ -321,7 +321,8 @@ "zh_Hant": "這個長椅 (座位) 是什麼做的?", "pt_BR": "De que é feito o banco (assento)?", "pl": "Z czego wykonana jest ławka (siedzisko)?", - "pt": "De que é feito o banco (assento)?" + "pt": "De que é feito o banco (assento)?", + "es": "¿De que está hecho el banco (asiento)?" }, "id": "bench-material" }, @@ -353,7 +354,8 @@ "zh_Hant": "當坐在長椅時,那個人朝向 {direction}°。", "pl": "Siedząc na ławce, patrzy się w kierunku {direction}°.", "pt_BR": "Ao sentar-se no banco, olha-se para {direction} °.", - "pt": "Ao sentar-se no banco, olha-se para {direction} °." + "pt": "Ao sentar-se no banco, olha-se para {direction} °.", + "es": "¿Cuando está sentado en el banco, uno mira hacia {direction}º." }, "freeform": { "key": "direction", @@ -420,7 +422,8 @@ "pl": "Kolor: brązowy", "pt": "Cor: castanho", "eo": "Koloro: bruna", - "ca": "Color: marró" + "ca": "Color: marró", + "es": "Color: marrón" } }, { @@ -592,7 +595,8 @@ "zh_Hant": "上一次探察長椅是什麼時候?", "pt_BR": "Quando esta bancada foi pesquisada pela última vez?", "pl": "Kiedy ostatnio badano tę ławkę?", - "pt": "Quando esta bancada foi pesquisada pela última vez?" + "pt": "Quando esta bancada foi pesquisada pela última vez?", + "es": "¿Cuándo fue la última vez que se inspeccionó este banco?" }, "render": { "en": "This bench was last surveyed on {survey:date}", @@ -605,7 +609,8 @@ "zh_Hant": "這個長椅最後是在 {survey:date} 探查的", "pt_BR": "Esta bancada foi pesquisada pela última vez em {survey:date}", "pl": "Ławka ta była ostatnio badana w dniu {survey:date}", - "pt": "Esta bancada foi pesquisada pela última vez em {survey:date}" + "pt": "Esta bancada foi pesquisada pela última vez em {survey:date}", + "es": "Este banco se inspeccionó por última vez el {survey:date}" }, "freeform": { "key": "survey:date", @@ -679,6 +684,7 @@ "nl": "Deze laag toont zitbanken en enkele vragen over deze zitbanken", "en": "A bench is a wooden, metal, stone, ... surface where a human can sit. This layers visualises them and asks a few questions about them.", "fr": "Un banc est une surface en bois, métal, pierre... sur laquelle un humain peut s'asseoir. Cette couche permet de les visualiser et pose des questions à leur sujet.", - "de": "Diese Karte stellt Sitzbänke aus Holz, Metall, Stein, ... dar und stellt ein paar Fragen, um weitere Informationen zu ergänzen." + "de": "Diese Karte stellt Sitzbänke aus Holz, Metall, Stein, ... dar und stellt ein paar Fragen, um weitere Informationen zu ergänzen.", + "es": "Un banco es una superficie de madera, metal, piedra, ... donde un humano se puede sentar. Estas capas los visualizan y preguntan algunas preguntas sobre ellos." } } \ No newline at end of file diff --git a/assets/layers/bench_at_pt/bench_at_pt.json b/assets/layers/bench_at_pt/bench_at_pt.json index 8f8fb65f71..b2cee12c61 100644 --- a/assets/layers/bench_at_pt/bench_at_pt.json +++ b/assets/layers/bench_at_pt/bench_at_pt.json @@ -66,7 +66,8 @@ "zh_Hant": "大眾運輸站點的長椅", "pt_BR": "Banco em ponto de transporte público", "pl": "Ławka na przystanku komunikacji miejskiej", - "pt": "Banco em ponto de transporte público" + "pt": "Banco em ponto de transporte público", + "es": "Banco en una parada de transporte público" } }, { @@ -156,7 +157,8 @@ "en": "There is no bench here", "fr": "Il n'y a pas de banc ici", "de": "Hier gibt es keine Bank", - "nl": "Er is hier geen bank" + "nl": "Er is hier geen bank", + "es": "No hay ningún banco aquí" } } ] diff --git a/assets/layers/bicycle_library/bicycle_library.json b/assets/layers/bicycle_library/bicycle_library.json index 98a237a94a..cd50c836b9 100644 --- a/assets/layers/bicycle_library/bicycle_library.json +++ b/assets/layers/bicycle_library/bicycle_library.json @@ -122,7 +122,8 @@ "nb_NO": "Sykkelleie koster {charge}", "zh_Hant": "租借單車需要 {charge}", "pt_BR": "Custos de empréstimo de bicicleta {charge}", - "pt": "Custos de empréstimo de bicicleta {charge}" + "pt": "Custos de empréstimo de bicicleta {charge}", + "es": "Alquilar una bicicleta cuesta {charge}" }, "freeform": { "key": "charge", @@ -203,7 +204,8 @@ "ru": "Доступны детские велосипеды", "zh_Hant": "提供兒童單車", "pt_BR": "Bicicletas para crianças disponíveis", - "pt": "Bicicletas para crianças disponíveis" + "pt": "Bicicletas para crianças disponíveis", + "es": "Bicicletas para niños disponibles" } }, { @@ -217,7 +219,8 @@ "ru": "Доступны велосипеды для взрослых", "zh_Hant": "有提供成人單車", "pt_BR": "Bicicletas para adulto disponíveis", - "pt": "Bicicletas para adulto disponíveis" + "pt": "Bicicletas para adulto disponíveis", + "es": "Bicicletas para adultos disponibles" } }, { @@ -231,7 +234,8 @@ "ru": "Доступны велосипеды для людей с ограниченными возможностями", "zh_Hant": "有提供行動不便人士的單車", "pt_BR": "Bicicletas para deficientes físicos disponíveis", - "pt": "Bicicletas para deficientes físicos disponíveis" + "pt": "Bicicletas para deficientes físicos disponíveis", + "es": "Bicicletas para discapacitados disponibles" } } ] diff --git a/assets/layers/bicycle_rental/bicycle_rental.json b/assets/layers/bicycle_rental/bicycle_rental.json index 41585c5193..71443941e7 100644 --- a/assets/layers/bicycle_rental/bicycle_rental.json +++ b/assets/layers/bicycle_rental/bicycle_rental.json @@ -39,7 +39,8 @@ "en": "{name}", "nl": "{name}", "ca": "{name}", - "de": "{name}" + "de": "{name}", + "es": "{name}" } } ] @@ -48,7 +49,8 @@ "en": "Bicycle rental stations", "nl": "Fietsverhuustations", "fr": "Station de location de vélo", - "de": "Fahrradverleihstationen" + "de": "Fahrradverleihstationen", + "es": "Estaciones de alquiler de bicicletas" }, "tagRenderings": [ "images", @@ -57,7 +59,8 @@ "question": { "en": "What kind of bicycle rental is this?", "nl": "Wat voor fietsverhuur is dit?", - "de": "Was ist das für ein Fahrradverleih?" + "de": "Was ist das für ein Fahrradverleih?", + "es": "¿Qué tipo de alquiler de bicicletas es este?" }, "mappings": [ { @@ -70,7 +73,8 @@ "then": { "en": "This is a shop whose main focus is bicycle rental", "nl": "Dit is een zaak die focust op fietsverhuur", - "de": "Dies ist ein Geschäft, dessen Schwerpunkt auf dem Fahrradverleih liegt" + "de": "Dies ist ein Geschäft, dessen Schwerpunkt auf dem Fahrradverleih liegt", + "es": "Esta es una tienda que se centra en el alquiler de bicicletas" } }, { @@ -83,7 +87,8 @@ "then": { "en": "This is a rental buisiness which rents out various objects and/or vehicles. It rents out bicycles too, but this is not the main focus", "nl": "Dit is een zaak die verschillende voorwerpen en/of voertuigen verhuurt, waaronder ook fietsen; al zijn fietsen niet de hoofdfocus", - "de": "Dies ist ein Vermietungsunternehmen, das verschiedene Gegenstände und/oder Fahrzeuge vermietet. Es vermietet auch Fahrräder, aber das ist nicht der Hauptschwerpunkt" + "de": "Dies ist ein Vermietungsunternehmen, das verschiedene Gegenstände und/oder Fahrzeuge vermietet. Es vermietet auch Fahrräder, aber das ist nicht der Hauptschwerpunkt", + "es": "Este es un negocio de alquileres que alquila varios objetos y/o vehículos. También alquila bicicletas, pero este no es el enfoque principal" } }, { @@ -91,7 +96,8 @@ "then": { "en": "This is a shop which sells or repairs bicycles, but also rents out bicycles", "nl": "Dit is een fietsenmaker of fietswinkel die ook fietsen verhuurt", - "de": "Dies ist ein Geschäft, das Fahrräder verkauft oder repariert, aber auch Fahrräder vermietet" + "de": "Dies ist ein Geschäft, das Fahrräder verkauft oder repariert, aber auch Fahrräder vermietet", + "es": "Esta es una tienda que vende o alquila bicicletas, pero también las alquila" } }, { @@ -99,7 +105,8 @@ "then": { "en": "This is an automated docking station, where a bicycle is mechanically locked into a structure", "nl": "Dit is een docking station waar de fietsen mechanisch in een grotere structuur worden vastgemaakt", - "de": "Dies ist eine automatisierte Dockingstation, bei der ein Fahrrad mechanisch in einer Struktur verriegelt wird" + "de": "Dies ist eine automatisierte Dockingstation, bei der ein Fahrrad mechanisch in einer Struktur verriegelt wird", + "es": "Esta es una estación automática, en la que una bici se asegura mecánicamente en una estructura" } }, { @@ -148,12 +155,14 @@ "question": { "en": "What kind of bicycles and accessories are rented here?", "nl": "Wat voor soort fietsen en fietstoebehoren worden hier verhuurd?", - "de": "Welche Art von Fahrrädern und Zubehör wird hier vermietet?" + "de": "Welche Art von Fahrrädern und Zubehör wird hier vermietet?", + "es": "¿Qué tipo de bicicletas y accesorios se alquilan aquí?" }, "render": { "en": "{rental} is rented here", "nl": "{rental} kunnen hier uitgeleend worden", - "de": "{rental} wird hier vermietet" + "de": "{rental} wird hier vermietet", + "es": "{rental} se alquilan aquí" }, "freeform": { "key": "rental", @@ -166,7 +175,8 @@ "then": { "en": "Normal city bikes can be rented here", "nl": "Gewone stadsfietsen kunnen hier gehuurd worden", - "de": "Normale Stadtfahrräder können hier gemietet werden" + "de": "Normale Stadtfahrräder können hier gemietet werden", + "es": "Aquí se pueden alquilar bicis normales" } }, { @@ -174,7 +184,8 @@ "then": { "en": "Electrical bikes can be rented here", "nl": "Elektrische fietsen kunnen hier gehuurd worden", - "de": "Elektrofahrräder können hier gemietet werden" + "de": "Elektrofahrräder können hier gemietet werden", + "es": "Aquí se pueden alquilar bicis eléctricas" } }, { @@ -182,7 +193,8 @@ "then": { "en": "BMX bikes can be rented here", "nl": "BMX-fietsen kunnen hier gehuurd worden", - "de": "BMX-Räder können hier gemietet werden" + "de": "BMX-Räder können hier gemietet werden", + "es": "Aquí se pueden alquilar bicis BMX" } }, { @@ -190,7 +202,8 @@ "then": { "en": "Mountainbikes can be rented here", "nl": "Mountainbikes kunnen hier gehuurd worden", - "de": "Mountainbikes können hier gemietet werden" + "de": "Mountainbikes können hier gemietet werden", + "es": "Aquí se pueden alquilar bicis de montaña" } }, { @@ -198,7 +211,8 @@ "then": { "en": "Bikes for childs can be rented here", "nl": "Kinderfietsen kunnen hier gehuurd worden", - "de": "Kinderfahrräder können hier gemietet werden" + "de": "Kinderfahrräder können hier gemietet werden", + "es": "Aquí se pueden alquilar bicis infantiles" } }, { @@ -214,7 +228,8 @@ "then": { "en": "Race bicycles can be rented here", "nl": "Wielerfietsen (sportfietsen) kunnen hier gehuurd worden", - "de": "Rennräder können hier gemietet werden" + "de": "Rennräder können hier gemietet werden", + "es": "Aquí se pueden alquilar bicicletas de carreras" } } ] @@ -231,7 +246,8 @@ { "en": "city bikes", "nl": "stadsfietsen", - "de": "Stadträder" + "de": "Stadträder", + "es": "bicis de ciudad" } ], [ @@ -239,7 +255,8 @@ { "en": "electrical bikes", "nl": "elektrische fietsen", - "de": "Elektrofahrräder" + "de": "Elektrofahrräder", + "es": "bicis eléctricas" } ], [ @@ -247,7 +264,8 @@ { "en": "bikes for children", "nl": "kinderfietsen", - "de": "Kinderfahrräder" + "de": "Kinderfahrräder", + "es": "bicis infantiles" } ], [ @@ -255,7 +273,8 @@ { "en": "BMX bikes", "nl": "BMX-fietsen", - "de": "BMX-Räder" + "de": "BMX-Räder", + "es": "bicis BMX" } ], [ @@ -264,7 +283,8 @@ "en": "mountainbike", "nl": "mountainbike", "ca": "bicicleta de muntanya", - "de": "Mountainbikes" + "de": "Mountainbikes", + "es": "bicis de montaña" } ], [ @@ -315,7 +335,8 @@ "en": "a bicycle rental shop", "nl": "een fietsverhuurzaak", "fr": "une magasin de location de vélos", - "de": "Ein Fahrradverleih" + "de": "Ein Fahrradverleih", + "es": "una tienda de alquiler de bicicletas" }, "tags": [ "amenity=bicycle_rental", @@ -378,7 +399,8 @@ "nl": "{title()} is permanent gestopt", "en": "{title()} has closed down permanently", "fr": "{title()} a était fermé de façon permanente", - "de": "{title()} ist dauerhaft geschlossen" + "de": "{title()} ist dauerhaft geschlossen", + "es": "{title()} ha cerrado permanentemente" }, "changesetMessage": "shop_closed" } @@ -394,7 +416,8 @@ "en": "This bicycle shop used to rent out bikes but doesn't rent out bikes anymore", "nl": "Deze fietszaak verhuurde vroeger fietsen, maar nu niet meer", "fr": "Ce magasin de vélo louait des vélos, mais n'en loue plus maintenant", - "de": "Dieser Fahrradladen vermietete früher Fahrräder, aber jetzt nicht mehr" + "de": "Dieser Fahrradladen vermietete früher Fahrräder, aber jetzt nicht mehr", + "es": "Esta tienda de bicicletas alquilaba bicis, pero ya no lo hace" } } ] diff --git a/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json b/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json index f727dd2136..b492111aab 100644 --- a/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json +++ b/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json @@ -78,7 +78,8 @@ "de": "Ist dieser Automat noch in Betrieb?", "zh_Hant": "這個自動販賣機仍有運作嗎?", "pt_BR": "Esta máquina de venda automática ainda está operacional?", - "pt": "Esta máquina de venda automática ainda está operacional?" + "pt": "Esta máquina de venda automática ainda está operacional?", + "es": "¿Todavía es operacional esta máquina exprendedora?" }, "render": { "en": "The operational status is {operational_status}", @@ -89,7 +90,8 @@ "ru": "Рабочий статус: {operational_status}", "zh_Hant": "運作狀態是 {operational_status}", "pt_BR": "O estado operacional é: {operational_status}", - "pt": "O estado operacional é: {operational_status}" + "pt": "O estado operacional é: {operational_status}", + "es": "El estado operacional es {operational_status}" }, "freeform": { "key": "operational_status" @@ -124,7 +126,8 @@ "de": "Dieser Automat ist kaputt", "zh_Hant": "這個自動販賣機沒有運作了", "pt_BR": "Esta máquina de venda automática está quebrada", - "pt": "Esta máquina de venda automática está quebrada" + "pt": "Esta máquina de venda automática está quebrada", + "es": "Esta máquina exprendedora está rota" } }, { @@ -140,7 +143,8 @@ "de": "Dieser Automat ist geschlossen", "zh_Hant": "這個自動販賣機已經關閉了", "pt_BR": "Esta máquina de venda automática está fechada", - "pt": "Esta máquina de venda automática está fechada" + "pt": "Esta máquina de venda automática está fechada", + "es": "Esta máquina exprendedora está cerrada" } } ], diff --git a/assets/layers/bike_cafe/bike_cafe.json b/assets/layers/bike_cafe/bike_cafe.json index abc8a9538a..4e59b26605 100644 --- a/assets/layers/bike_cafe/bike_cafe.json +++ b/assets/layers/bike_cafe/bike_cafe.json @@ -284,7 +284,8 @@ "zh_Hans": "{name}的电话号码是什么?", "zh_Hant": "{name} 的電話號碼是?", "pt_BR": "Qual o número de telefone de {name}?", - "pt": "Qual é o número de telefone de {name}?" + "pt": "Qual é o número de telefone de {name}?", + "es": "¿Cual es el número de teléfono de {name}?" }, "render": "{phone}", "freeform": { @@ -305,7 +306,8 @@ "zh_Hans": "{name}的电子邮箱是什么?", "zh_Hant": "{name} 的電子郵件地址是?", "pt_BR": "Qual o endereço de email de {name}?", - "pt": "Qual o endereço de email de {name}?" + "pt": "Qual o endereço de email de {name}?", + "es": "¿Cual es la dirección de correo electrónico de {name}?" }, "render": "{email}", "freeform": { diff --git a/assets/layers/bike_cleaning/bike_cleaning.json b/assets/layers/bike_cleaning/bike_cleaning.json index 1e4f88e9a9..18f5c389ae 100644 --- a/assets/layers/bike_cleaning/bike_cleaning.json +++ b/assets/layers/bike_cleaning/bike_cleaning.json @@ -9,7 +9,8 @@ "zh_Hant": "單車清理服務", "pt_BR": "Serviço de limpeza de bicicletas", "pt": "Serviço de limpeza de bicicletas", - "ru": "Услуги по чистке велосипедов" + "ru": "Услуги по чистке велосипедов", + "es": "Servicio de limpieza de bicis" }, "title": { "render": { @@ -21,7 +22,8 @@ "zh_Hant": "單車清理服務", "pt_BR": "Serviço de limpeza de bicicletas", "pt": "Serviço de limpeza de bicicletas", - "ru": "Услуги по чистке велосипедов" + "ru": "Услуги по чистке велосипедов", + "es": "Servicio de limpieza de bicis" }, "mappings": [ { @@ -34,7 +36,8 @@ "de": "Fahrrad-Reinigungsdienst{name}", "zh_Hant": "單車清理服務 {name}", "pt_BR": "Serviço de limpeza de bicicletas {name}", - "pt": "Serviço de limpeza de bicicletas {name}" + "pt": "Serviço de limpeza de bicicletas {name}", + "es": "Servicio de limpieza de bicis {name}" } } ] @@ -61,7 +64,8 @@ "zh_Hant": "單車清理服務", "pt_BR": "uma serviço de limpeza de bicicletas", "pt": "uma serviço de limpeza de bicicletas", - "ru": "Услуги по чистке велосипедов" + "ru": "Услуги по чистке велосипедов", + "es": "un servicio de limpieza de bicis" }, "tags": [ "amenity=bicycle_wash" @@ -74,12 +78,14 @@ "question": { "en": "How much does it cost to use the cleaning service?", "de": "Wie viel kostet die Nutzung des Reinigungsdienstes?", - "nl": "Hoeveel kost het gebruik van het fietsschoonmaakpunt?" + "nl": "Hoeveel kost het gebruik van het fietsschoonmaakpunt?", + "es": "¿Cuánto cuesta utilizar el servicio de limpieza?" }, "render": { "en": "Using the cleaning service costs {service:bicycle:cleaning:charge}", "de": "Nutzung des Reinigungsservice kostet {service:bicycle:cleaning:charge}", - "nl": "Het gebruik van het fietsschoonmaakpunt kost {service:bicycle:cleaning:charge}" + "nl": "Het gebruik van het fietsschoonmaakpunt kost {service:bicycle:cleaning:charge}", + "es": "Utilizar el servicio de limpieza cuesta {service:bicycle:cleaning:charge}" }, "condition": { "and": [ @@ -100,7 +106,8 @@ "then": { "en": "The cleaning service is free to use", "de": "Der Reinigungsservice ist kostenlos", - "nl": "Het fietsschoonmaakpunt is gratis" + "nl": "Het fietsschoonmaakpunt is gratis", + "es": "El servicio de limpieza es gratis" } }, { @@ -108,7 +115,8 @@ "then": { "en": "Free to use", "de": "Kostenlose Nutzung", - "nl": "Gratis te gebruiken" + "nl": "Gratis te gebruiken", + "es": "Gratis" }, "hideInAnswer": true }, @@ -117,7 +125,8 @@ "then": { "en": "The cleaning service has a fee, but the amount is not known", "de": "Der Reinigungsdienst ist kostenpflichtig, aber der Betrag ist nicht bekannt", - "nl": "Het fietsschoonmaakpunt is betalend, maar de prijs is onbekend" + "nl": "Het fietsschoonmaakpunt is betalend, maar de prijs is onbekend", + "es": "El servicio de limpieza tiene una tasa, pero la cantidad se desconoce" }, "hideInAnswer": true } @@ -128,12 +137,14 @@ "question": { "en": "How much does it cost to use the cleaning service?", "de": "Wie viel kostet die Nutzung des Reinigungsdienstes?", - "nl": "Hoeveel kost het gebruik van het fietsschoonmaakpunt?" + "nl": "Hoeveel kost het gebruik van het fietsschoonmaakpunt?", + "es": "¿Cuánto cuesta utilizar el servicio de limpieza?" }, "render": { "en": "Using the cleaning service costs {charge}", "de": "Die Nutzung des Reinigungsdienstes kostet {charge}", - "nl": "Het gebruik van het fietsschoonmaakpunt kost {charge}" + "nl": "Het gebruik van het fietsschoonmaakpunt kost {charge}", + "es": "Utilizar el servicio de limpieza cuesta {charge}" }, "condition": { "or": [ @@ -153,7 +164,8 @@ "then": { "en": "Free to use cleaning service", "de": "Kostenloser Reinigungsservice", - "nl": "Gratis fietsschoonmaakpunt" + "nl": "Gratis fietsschoonmaakpunt", + "es": "Un servicio de limpieza gratis" } }, { @@ -161,7 +173,8 @@ "then": { "en": "Free to use", "de": "Kostenlose Nutzung", - "nl": "Gratis te gebruiken" + "nl": "Gratis te gebruiken", + "es": "Gratis" }, "hideInAnswer": true }, @@ -170,7 +183,8 @@ "then": { "en": "The cleaning service has a fee", "de": "Der Reinigungsservice ist kostenpflichtig", - "nl": "Je moet betalen voor het fietsschoonmaakpunt" + "nl": "Je moet betalen voor het fietsschoonmaakpunt", + "es": "El servicio de limpieza tiene una tarifa" } } ], @@ -220,6 +234,7 @@ "description": { "en": "A layer showing facilities where one can clean their bike", "nl": "Een laag die plaatsen toont waar je je fiets kunt wassen", - "de": "Eine Ebene mit Einrichtungen, in denen man sein Fahrrad reinigen kann" + "de": "Eine Ebene mit Einrichtungen, in denen man sein Fahrrad reinigen kann", + "es": "Una capa que muestra facilidades en las que uno puede limpiar su bici" } } \ No newline at end of file diff --git a/assets/layers/bike_parking/bike_parking.json b/assets/layers/bike_parking/bike_parking.json index 3a0863b1d6..b4fae0a94e 100644 --- a/assets/layers/bike_parking/bike_parking.json +++ b/assets/layers/bike_parking/bike_parking.json @@ -13,7 +13,8 @@ "pl": "Parking dla rowerów", "pt_BR": "Estacionamento de bicicletas", "pt": "Estacionamento de bicicletas", - "ca": "Aparcament per a bicicletes" + "ca": "Aparcament per a bicicletes", + "es": "Aparcamiento de bicis" }, "minzoom": 17, "source": { @@ -37,7 +38,8 @@ "ru": "Велосипедная парковка", "pl": "Parking dla rowerów", "pt_BR": "uma estacionamento de bicicletas", - "pt": "uma estacionamento de bicicletas" + "pt": "uma estacionamento de bicicletas", + "es": "un aparcamiento de bicis" }, "tags": [ "amenity=bicycle_parking" @@ -58,7 +60,8 @@ "pl": "Parking dla rowerów", "pt_BR": "Estacionamento de bicicletas", "pt": "Estacionamento de bicicletas", - "ca": "Aparcament per a bicicletes" + "ca": "Aparcament per a bicicletes", + "es": "Aparcamiento de bicis" } }, "tagRenderings": [ @@ -76,7 +79,8 @@ "zh_Hant": "這是那種類型的單車停車場?", "pl": "Jaki jest typ tego parkingu dla rowerów?", "pt_BR": "Qual o tipo deste estacionamento de bicicletas?", - "pt": "Qual o tipo deste estacionamento de bicicletas?" + "pt": "Qual o tipo deste estacionamento de bicicletas?", + "es": "¿Cual es el tipo de este aparcamiento de bicicletas?" }, "render": { "en": "This is a bicycle parking of the type: {bicycle_parking}", @@ -90,7 +94,8 @@ "ru": "Это велопарковка типа {bicycle_parking}", "pl": "Jest to parking rowerowy typu: {bicycle_parking}", "pt_BR": "Este é um estacionamento de bicicletas do tipo: {bicycle_parking}", - "pt": "Este é um estacionamento de bicicletas do tipo: {bicycle_parking}" + "pt": "Este é um estacionamento de bicicletas do tipo: {bicycle_parking}", + "es": "Este es un aparcamiento de bicicletas del tipo: {bicycle_parking}" }, "freeform": { "key": "bicycle_parking", @@ -200,7 +205,8 @@ "hu": "Fészer", "zh_Hant": "車棚", "it": "Rimessa", - "ru": "Навес" + "ru": "Навес", + "es": "Caseta" }, "icon": { "path": "./assets/layers/bike_parking/shed.svg", @@ -216,7 +222,8 @@ "it": "Colonnina", "de": "Poller", "zh_Hant": "柱子", - "ca": "Pilona" + "ca": "Pilona", + "es": "Bolardo" }, "icon": { "path": "./assets/layers/bike_parking/bollard.svg", @@ -231,7 +238,8 @@ "fr": "Zone au sol qui est marquée pour le stationnement des vélos", "it": "Una zona del pavimento che è marcata per il parcheggio delle bici", "de": "Ein Bereich auf dem Boden, der für das Abstellen von Fahrrädern gekennzeichnet ist", - "zh_Hant": "樓層當中標示為單車停車場的區域" + "zh_Hant": "樓層當中標示為單車停車場的區域", + "es": "Una área en el suelo que está marcada para el aparcamiento de bicicletas" } } ], @@ -247,7 +255,8 @@ "pl": "Jaka jest względna lokalizacja tego parkingu rowerowego?", "pt_BR": "Qual a localização relativa deste estacionamento de bicicletas?", "de": "Wo befinden sich diese Fahrradabstellplätze?", - "pt": "Qual a localização relativa deste estacionamento de bicicletas?" + "pt": "Qual a localização relativa deste estacionamento de bicicletas?", + "es": "¿Cual es la localización relativa de este aparcamiento de bicicletas?" }, "mappings": [ { @@ -262,7 +271,8 @@ "zh_Hant": "地下停車場", "pt_BR": "Estacionamento subterrâneo", "pt": "Estacionamento subterrâneo", - "ca": "Aparcament subterrani" + "ca": "Aparcament subterrani", + "es": "Aparcamiento subterráneo" } }, { @@ -277,7 +287,8 @@ "zh_Hant": "地面停車場", "pt_BR": "Estacionamento de superfície", "pt": "Estacionamento de superfície", - "hu": "Felszíni parkoló" + "hu": "Felszíni parkoló", + "es": "Aparcamiento a nivel de calle" } }, { @@ -293,7 +304,8 @@ "pt_BR": "Estacionamento no telhado", "pt": "Estacionamento no telhado", "ru": "Парковка на крыше", - "ca": "Aparcament al terrat" + "ca": "Aparcament al terrat", + "es": "Aparcamiento de azotea" } }, { @@ -325,7 +337,8 @@ "it": "È un parcheggio coperto? Indicare “coperto” per parcheggi all’interno.", "zh_Hant": "這個停車場是否有車棚?如果是室內停車場也請選擇\"遮蔽\"。", "pt_BR": "Este estacionamento é coberto? Também selecione \"coberto\" para estacionamentos internos.", - "pt": "Este estacionamento é coberto? Também selecione \"coberto\" para estacionamentos internos." + "pt": "Este estacionamento é coberto? Também selecione \"coberto\" para estacionamentos internos.", + "es": "¿Está cubierto este aparcamiento? Selecciona \"cubierto\" también para aparcamientos interiores." }, "condition": { "and": [ @@ -347,7 +360,8 @@ "zh_Hant": "這個停車場有遮蔽 (有屋頂)", "ru": "Это крытая парковка (есть крыша/навес)", "pt_BR": "Este estacionamento é coberto (tem um telhado)", - "pt": "Este estacionamento é coberto (tem um telhado)" + "pt": "Este estacionamento é coberto (tem um telhado)", + "es": "Este aparcamiento está cubierto (tiene un tejado)" } }, { @@ -363,7 +377,8 @@ "zh_Hant": "這個停車場沒有遮蔽", "ru": "Это открытая парковка", "pt_BR": "Este estacionamento não é coberto", - "pt": "Este estacionamento não é coberto" + "pt": "Este estacionamento não é coberto", + "es": "Este aparcamiento no está cubierto" } } ], @@ -377,7 +392,8 @@ "gl": "Cantas bicicletas caben neste aparcadoiro de bicicletas (incluídas as posíbeis bicicletas de carga)?", "de": "Wie viele Fahrräder passen auf diesen Fahrrad-Parkplatz (einschließlich möglicher Lastenfahrräder)?", "it": "Quante biciclette entrano in questo parcheggio per bici (incluse le eventuali bici da trasporto)?", - "zh_Hant": "這個單車停車場能放幾台單車 (包括裝箱單車)?" + "zh_Hant": "這個單車停車場能放幾台單車 (包括裝箱單車)?", + "es": "¿Cuántas bicicletas caben en este aparcamiento de bicicletas (incluyendo posibles bicicletas de carga)?" }, "render": { "en": "Place for {capacity} bikes", @@ -389,7 +405,8 @@ "zh_Hant": "{capacity} 單車的地方", "ru": "Место для {capacity} велосипеда(ов)", "pt_BR": "Lugar para {capacity} bicicletas", - "pt": "Lugar para {capacity} bicicletas" + "pt": "Lugar para {capacity} bicicletas", + "es": "Espacio para {capacity} bicis" }, "freeform": { "key": "capacity", @@ -407,7 +424,8 @@ "zh_Hant": "誰可以使用這個單車停車場?", "ru": "Кто может пользоваться этой велопарковкой?", "pt_BR": "Quem pode usar este estacionamento de bicicletas?", - "pt": "Quem pode usar este estacionamento de bicicletas?" + "pt": "Quem pode usar este estacionamento de bicicletas?", + "es": "¿Quién puede utilizar este aparcamiento de bicicletas?" }, "render": { "en": "{access}", @@ -422,7 +440,8 @@ "pt_BR": "{access}", "pt": "{access}", "eo": "{access}", - "ca": "{access}" + "ca": "{access}", + "es": "{access}" }, "freeform": { "key": "access", @@ -442,7 +461,8 @@ "zh_Hant": "公開可用", "pt_BR": "Acessível ao público", "pt": "Acessível ao público", - "ca": "Accessible al públic" + "ca": "Accessible al públic", + "es": "Accesible públicamente" } }, { @@ -455,7 +475,8 @@ "zh_Hant": "通行性主要是為了企業的顧客", "pt_BR": "Acesso é principalmente para visitantes de uma empresa", "de": "Der Zugang ist in erster Linie für Besucher eines Unternehmens bestimmt", - "pt": "Acesso é principalmente para visitantes de uma empresa" + "pt": "Acesso é principalmente para visitantes de uma empresa", + "es": "El acceso es primariamente para visitantes a un negocio" } }, { @@ -468,7 +489,8 @@ "zh_Hant": "通行性僅限學校、公司或組織的成員", "pt_BR": "Acesso é limitado aos membros de uma escola, companhia ou organização", "de": "Der Zugang ist beschränkt auf Mitglieder einer Schule, eines Unternehmens oder einer Organisation", - "pt": "Acesso é limitado aos membros de uma escola, companhia ou organização" + "pt": "Acesso é limitado aos membros de uma escola, companhia ou organização", + "es": "El acceso se limita a miembros de una escuela, compañía u organización" } } ], @@ -484,7 +506,8 @@ "it": "Questo parcheggio dispone di posti specifici per le bici da trasporto?", "zh_Hant": "這個單車停車場有地方放裝箱的單車嗎?", "pt_BR": "O estacionamento de bicicletas tem vagas para bicicletas de carga?", - "pt": "O estacionamento de bicicletas tem vagas para bicicletas de carga?" + "pt": "O estacionamento de bicicletas tem vagas para bicicletas de carga?", + "es": "¿Este aparcamiento de bicicletas tiene huevos para bicicletas de carga?" }, "mappings": [ { @@ -498,7 +521,8 @@ "it": "Questo parcheggio ha posto per bici da trasporto", "zh_Hant": "這個停車場有地方可以放裝箱單車", "pt_BR": "Este estacionamento tem vagas para bicicletas de carga", - "pt": "Este estacionamento tem vagas para bicicletas de carga" + "pt": "Este estacionamento tem vagas para bicicletas de carga", + "es": "Este aparcamiento tiene espacio para bicicletas de carga" } }, { @@ -512,7 +536,8 @@ "it": "Questo parcheggio ha posti destinati (ufficialmente) alle bici da trasporto.", "zh_Hant": "這停車場有設計 (官方) 空間給裝箱的單車。", "pt_BR": "Este estacionamento tem vagas (oficiais) projetadas para bicicletas de carga.", - "pt": "Este estacionamento tem vagas (oficiais) projetadas para bicicletas de carga." + "pt": "Este estacionamento tem vagas (oficiais) projetadas para bicicletas de carga.", + "es": "Este aparcamiento tiene huecos (oficialmente) designados para bicicletas de carga." } }, { @@ -525,7 +550,8 @@ "fr": "Il est interdit de garer des vélos cargo", "it": "Il parcheggio delle bici da trasporto è proibito", "pt_BR": "Você não tem permissão para estacionar bicicletas de carga", - "pt": "Não tem permissão para estacionar bicicletas de carga" + "pt": "Não tem permissão para estacionar bicicletas de carga", + "es": "No se permite aparcar bicicletas de carga" } } ], @@ -540,7 +566,8 @@ "de": "Wie viele Lastenfahrräder passen auf diesen Fahrrad-Parkplatz?", "it": "Quante bici da trasporto entrano in questo parcheggio per bici?", "pt_BR": "Quantas bicicletas de carga cabem neste estacionamento de bicicletas?", - "pt": "Quantas bicicletas de carga cabem neste estacionamento de bicicletas?" + "pt": "Quantas bicicletas de carga cabem neste estacionamento de bicicletas?", + "es": "¿Cuántas bicicletas de carga caben en este aparcamiento de bicicletas?" }, "render": { "en": "This parking fits {capacity:cargo_bike} cargo bikes", @@ -550,7 +577,8 @@ "de": "Auf diesen Parkplatz passen {capacity:cargo_bike} Lastenfahrräder", "it": "Questo parcheggio può contenere {capacity:cargo_bike} bici da trasporto", "pt_BR": "Neste estacionamento cabem {capacity:cargo_bike} bicicletas de carga", - "pt": "Neste estacionamento cabem {capacity:cargo_bike} bicicletas de carga" + "pt": "Neste estacionamento cabem {capacity:cargo_bike} bicicletas de carga", + "es": "En este aparcamiento caben {capacity:cargo_bike} bicis de carga" }, "condition": "cargo_bike~designated|yes", "freeform": { @@ -592,6 +620,7 @@ "description": { "en": "A layer showing where you can park your bike", "nl": "Een laag die toont waar je je fiets kunt parkeren", - "de": "Eine Ebene, die anzeigt, wo Sie Ihr Fahrrad abstellen können" + "de": "Eine Ebene, die anzeigt, wo Sie Ihr Fahrrad abstellen können", + "es": "Una capa que muestra donde puedes aparcar tu bici" } } \ No newline at end of file diff --git a/assets/layers/bike_repair_station/bike_repair_station.json b/assets/layers/bike_repair_station/bike_repair_station.json index 475e888c4c..4b4ed274d3 100644 --- a/assets/layers/bike_repair_station/bike_repair_station.json +++ b/assets/layers/bike_repair_station/bike_repair_station.json @@ -8,7 +8,8 @@ "de": "Fahrradstationen (Reparatur, Pumpe oder beides)", "it": "Stazioni bici (riparazione, gonfiaggio o entrambi)", "pt_BR": "Estações de bicicletas (reparo, bomba ou ambos)", - "ru": "Велостанции (ремонт, накачка шин или сразу всё)" + "ru": "Велостанции (ремонт, накачка шин или сразу всё)", + "es": "Bomba y reparación de bicicletas" }, "minzoom": 13, "source": { @@ -27,7 +28,8 @@ "de": "Fahrradstation (Pumpe & Reparatur)", "it": "Stazione bici (gonfiaggio & riparazione)", "pt_BR": "Estação de bicicletas (bomba e reparo)", - "ru": "Велостанция (накачка шин и ремонт)" + "ru": "Велостанция (накачка шин и ремонт)", + "es": "Estación de bicis (bomba y reparación)" }, "mappings": [ { @@ -46,7 +48,8 @@ "it": "Stazione riparazione bici", "pt_BR": "Estação de reparo de bicicletas", "pt": "Estação de reparo de bicicletas", - "ru": "Станция обслуживания велосипедов" + "ru": "Станция обслуживания велосипедов", + "es": "Estación de reparación de bicis" } }, { @@ -65,7 +68,8 @@ "it": "Stazione riparazione bici", "pt_BR": "Estação de reparo de bicicletas", "pt": "Estação de reparo de bicicletas", - "ru": "Станция обслуживания велосипедов" + "ru": "Станция обслуживания велосипедов", + "es": "Estación de reparación de bicis" } }, { @@ -89,7 +93,8 @@ "it": "Pompa rotta", "ru": "Насос сломан", "pt_BR": "Bomba quebrada", - "ca": "Bomba trencada" + "ca": "Bomba trencada", + "es": "Bomba rota" } }, { @@ -108,7 +113,8 @@ "de": "Fahrradpumpe {name}", "it": "Pompa per bici {name}", "ru": "Велосипедный насос {name}", - "pt_BR": "Bomba de bicicleta {name}" + "pt_BR": "Bomba de bicicleta {name}", + "es": "Bomba de bicicletas {name}" } }, { @@ -127,7 +133,8 @@ "it": "Pompa per bici", "ru": "Велосипедный насос", "pt_BR": "Bomba de bicicleta", - "ca": "Bomba de bicicleta" + "ca": "Bomba de bicicleta", + "es": "Bomba para bicicletas" } } ] @@ -151,7 +158,8 @@ "de": "Welche Einrichtungen stehen an dieser Fahrradstation zur Verfügung?", "it": "Quali servizi sono disponibili in questa stazione per bici?", "pt_BR": "Quais serviços estão disponíveis nesta estação de bicicletas?", - "pt": "Quais serviços estão disponíveis nesta estação de bicicletas?" + "pt": "Quais serviços estão disponíveis nesta estação de bicicletas?", + "es": "¿Qué servicios están disponibles en esta localización?" }, "mappings": [ { @@ -169,7 +177,8 @@ "de": "Es ist nur eine Pumpe vorhanden", "it": "C’è solamente una pompa presente", "pt_BR": "Há somente uma bomba presente", - "pt": "Há somente uma bomba presente" + "pt": "Há somente uma bomba presente", + "es": "Solo hay una bomba presente" } }, { @@ -187,7 +196,8 @@ "de": "Es sind nur Werkzeuge (Schraubenzieher, Zangen...) vorhanden", "it": "Ci sono solo degli attrezzi (cacciaviti, pinze…) presenti", "pt_BR": "Há somente ferramentas (chaves de fenda, alicates...) presentes", - "pt": "Há somente ferramentas (chaves de fenda, alicates...) presentes" + "pt": "Há somente ferramentas (chaves de fenda, alicates...) presentes", + "es": "Solo hay herramientas (destornilladores, pinzas...) presentes" } }, { @@ -205,7 +215,8 @@ "de": "Es sind sowohl Werkzeuge als auch eine Pumpe vorhanden", "it": "Ci sono sia attrezzi che pompa presenti", "pt_BR": "Há tanto ferramentas e uma bomba presente", - "pt": "Há tanto ferramentas e uma bomba presente" + "pt": "Há tanto ferramentas e uma bomba presente", + "es": "Hay tanto herramientas como bombas" } } ] @@ -219,7 +230,8 @@ "de": "Ist die Fahrradpumpe noch funktionstüchtig?", "it": "La pompa per bici è sempre funzionante?", "ru": "Велосипедный насос все еще работает?", - "pl": "Czy pompka rowerowa jest nadal sprawna?" + "pl": "Czy pompka rowerowa jest nadal sprawna?", + "es": "¿Todavía está operativa la bomba de bicicletas?" }, "condition": "service:bicycle:pump=yes", "mappings": [ @@ -233,7 +245,8 @@ "de": "Die Fahrradpumpe ist kaputt", "it": "La pompa per bici è guasta", "ru": "Велосипедный насос сломан", - "pl": "Pompka rowerowa jest zepsuta" + "pl": "Pompka rowerowa jest zepsuta", + "es": "La bomba de bicicletas está rota" } }, { @@ -246,7 +259,8 @@ "de": "Die Fahrradpumpe ist betriebsbereit", "it": "La pompa per bici funziona", "ru": "Велосипедный насос работает", - "pl": "Pompka rowerowa jest sprawna" + "pl": "Pompka rowerowa jest sprawna", + "es": "La bomba de bicicletas está operativa" } } ], @@ -259,7 +273,8 @@ "fr": "Quand ce point de réparation de vélo est-il ouvert ?", "it": "Quando è aperto questo punto riparazione bici?", "de": "Wann ist diese Fahrradreparaturstelle geöffnet?", - "ru": "Когда работает эта точка обслуживания велосипедов?" + "ru": "Когда работает эта точка обслуживания велосипедов?", + "es": "¿Cuándo está abierto este punto de reparación de bicicletas?" }, "render": "{opening_hours_table()}", "freeform": { @@ -278,7 +293,8 @@ "ru": "Всегда открыто", "pt_BR": "Sempre aberto", "pt": "Sempre aberto", - "ca": "Sempre obert" + "ca": "Sempre obert", + "es": "Siempre abierto" } } ], @@ -289,7 +305,8 @@ "question": { "en": "Who is allowed to use this repair station?", "nl": "Wie kan dit herstelpunt gebruiken?", - "de": "Wer darf diese Reparaturstation benutzen?" + "de": "Wer darf diese Reparaturstation benutzen?", + "es": "¿A quién se le permite utilizar esta estación de reparación?" }, "mappings": [ { @@ -297,7 +314,8 @@ "then": { "en": "Publicly accessible", "nl": "Publiek toegankelijk", - "de": "Öffentlich zugänglich" + "de": "Öffentlich zugänglich", + "es": "Accesible públicamente" } }, { @@ -305,7 +323,8 @@ "then": { "en": "Publicly accessible", "nl": "Publiek toegankelijk", - "de": "Öffentlich zugänglich" + "de": "Öffentlich zugänglich", + "es": "Accesible públicamente" }, "hideInAnswer": true }, @@ -314,7 +333,8 @@ "then": { "en": "Only for customers", "nl": "Enkel voor klanten van de bijhorende zaak", - "de": "Nur für Kunden" + "de": "Nur für Kunden", + "es": "Solo para clientes" } }, { @@ -322,7 +342,8 @@ "then": { "en": "Not accessible to the general public", "nl": "Niet publiek toegankelijk", - "de": "Nicht für die Allgemeinheit zugänglich" + "de": "Nicht für die Allgemeinheit zugänglich", + "es": "No accesible para el público general" }, "icon": "./assets/svg/invalid.svg" }, @@ -331,7 +352,8 @@ "then": { "en": "Not accessible to the general public", "nl": "Niet publiek toegankelijk", - "de": "Nicht für die Allgemeinheit zugänglich" + "de": "Nicht für die Allgemeinheit zugänglich", + "es": "No accesible para el público general" }, "icon": "./assets/svg/invalid.svg", "hideInAnswer": true @@ -349,7 +371,8 @@ "it": "Chi gestisce questa pompa per bici?", "de": "Wer wartet diese Fahrradpumpe?", "pt_BR": "Quem faz a manutenção desta bomba de ciclo?", - "pt": "Quem faz a manutenção desta bomba de ciclo?" + "pt": "Quem faz a manutenção desta bomba de ciclo?", + "es": "¿Quién mantiene esta bomba para bicicletas?" }, "render": { "nl": "Beheer door {operator}", @@ -358,7 +381,8 @@ "it": "Manutenuta da {operator}", "de": "Gewartet von {operator}", "pt_BR": "Mantida por {operator}", - "pt": "Mantida por {operator}" + "pt": "Mantida por {operator}", + "es": "Mantenido por {operator}" }, "freeform": { "key": "operator" @@ -373,7 +397,8 @@ "en": "What is the email address of the maintainer?", "nl": "Wat is het email-adres van de beheerder?", "de": "Wie lautet die E-Mail-Adresse des Betreuers?", - "fr": "Quelle est l'adresse email du service de maintenance ?" + "fr": "Quelle est l'adresse email du service de maintenance ?", + "es": "¿Es esta la dirección de correo electrónico del mantenedor?" }, "freeform": { "key": "email", @@ -390,7 +415,8 @@ "en": "What is the phone number of the maintainer?", "nl": "Wat is het telefoonnummer van de beheerder?", "de": "Wie lautet die Telefonnummer des Betreibers?", - "fr": "Quel est le numéro de téléphone du service de maintenance ?" + "fr": "Quel est le numéro de téléphone du service de maintenance ?", + "es": "¿Cual es el número de teléfono del mantenedor?" }, "freeform": { "key": "phone", @@ -407,7 +433,8 @@ "fr": "Est-ce que cette station vélo a un outil specifique pour réparer la chaîne du vélo ?", "gl": "Esta estación de arranxo de bicicletas ten unha ferramenta especial para arranxar a cadea da túa bicicleta?", "de": "Verfügt diese Fahrrad-Reparaturstation über Spezialwerkzeug zur Reparatur von Fahrradketten?", - "it": "Questa stazione di riparazione bici ha un attrezzo speciale per riparare la catena della bici?" + "it": "Questa stazione di riparazione bici ha un attrezzo speciale per riparare la catena della bici?", + "es": "¿Esta estación de reparación tiene una herramienta especial para reparar la cadena de tu bici?" }, "condition": "service:bicycle:tools=yes", "mappings": [ @@ -421,7 +448,8 @@ "de": "Es gibt ein Kettenwerkzeug", "it": "È presente un utensile per riparare la catena", "pt_BR": "Há uma ferramenta de corrente", - "pt": "Há uma ferramenta de corrente" + "pt": "Há uma ferramenta de corrente", + "es": "Hay una herramienta de cadenas" } }, { @@ -434,7 +462,8 @@ "de": "Es gibt kein Kettenwerkzeug", "it": "Non è presente un utensile per riparare la catena", "pt_BR": "Não há uma ferramenta de corrente", - "pt": "Não há uma ferramenta de corrente" + "pt": "Não há uma ferramenta de corrente", + "es": "No hay herramienta de cadenas" } } ] @@ -447,7 +476,8 @@ "fr": "Est-ce que cette station vélo à un crochet pour suspendre son vélo ou une accroche pour l'élevé ?", "gl": "Esta estación de bicicletas ten un guindastre para pendurar a túa bicicleta ou un soporte para elevala?", "de": "Hat diese Fahrradstation einen Haken, an dem Sie Ihr Fahrrad aufhängen können, oder einen Ständer, um es anzuheben?", - "it": "Questa stazione bici ha un gancio per tenere sospesa la bici o un supporto per alzarla?" + "it": "Questa stazione bici ha un gancio per tenere sospesa la bici o un supporto per alzarla?", + "es": "¿Esta estación tiene un gancho para colgar tu bici o un soporte para elevarla?" }, "condition": "service:bicycle:tools=yes", "mappings": [ @@ -461,7 +491,8 @@ "de": "Es gibt einen Haken oder Ständer", "it": "C’è un gancio o un supporto", "pt_BR": "Há um gancho ou um suporte", - "pt": "Há um gancho ou um suporte" + "pt": "Há um gancho ou um suporte", + "es": "Hay un gancho o soporte" } }, { @@ -474,7 +505,8 @@ "de": "Es gibt keinen Haken oder Ständer", "it": "Non c’è né un gancio né un supporto", "pt_BR": "Não há um gancho ou um suporte", - "pt": "Não há um gancho ou um suporte" + "pt": "Não há um gancho ou um suporte", + "es": "No hay ningún gancho o soporte" } } ] @@ -501,7 +533,8 @@ "gl": "Que válvulas son compatíbeis?", "de": "Welche Ventile werden unterstützt?", "it": "Quali valvole sono supportate?", - "pl": "Jakie zawory są obsługiwane?" + "pl": "Jakie zawory są obsługiwane?", + "es": "¿Que válvulas se soportan?" }, "render": { "en": "This pump supports the following valves: {valves}", @@ -511,7 +544,8 @@ "de": "Diese Pumpe unterstützt die folgenden Ventile: {valves}", "it": "Questa pompa è compatibile con le seguenti valvole: {valves}", "ru": "Этот насос поддерживает следующие клапаны: {valves}", - "pl": "Ta pompka obsługuje następujące zawory: {valves}" + "pl": "Ta pompka obsługuje następujące zawory: {valves}", + "es": "Esta bomba soporta las siguiente válvulas: {valves}" }, "freeform": { "#addExtraTags": [ @@ -569,7 +603,8 @@ "de": "Ist dies eine elektrische Fahrradpumpe?", "it": "Questa pompa per bici è elettrica?", "ru": "Это электрический велосипедный насос?", - "pl": "Czy jest to elektryczna pompka do roweru?" + "pl": "Czy jest to elektryczna pompka do roweru?", + "es": "¿Hay una bomba eléctrica para bicis?" }, "condition": "service:bicycle:pump=yes", "mappings": [ @@ -586,7 +621,8 @@ "pl": "Pompa ręczna", "pt_BR": "Bomba manual", "pt": "Bomba manual", - "ca": "Bomba manual" + "ca": "Bomba manual", + "es": "Bomba manual" } }, { @@ -602,7 +638,8 @@ "pl": "Pompka elektryczna", "pt_BR": "Bomba elétrica", "pt": "Bomba elétrica", - "ca": "Bomba elèctrica" + "ca": "Bomba elèctrica", + "es": "Bomba eléctrica" } } ] @@ -616,7 +653,8 @@ "gl": "Ten a bomba de ar un indicador de presión ou un manómetro?", "de": "Verfügt die Pumpe über einen Druckanzeiger oder ein Manometer?", "it": "Questa pompa ha l’indicatore della pressione o il manometro?", - "pl": "Czy pompka posiada wskaźnik ciśnienia lub manometr?" + "pl": "Czy pompka posiada wskaźnik ciśnienia lub manometr?", + "es": "¿La bomba tiene un indicador de presión o manómetro?" }, "condition": "service:bicycle:pump=yes", "mappings": [ @@ -632,7 +670,8 @@ "ru": "Есть манометр", "pl": "Jest manometr", "pt_BR": "Há um manômetro", - "pt": "Há um manômetro" + "pt": "Há um manômetro", + "es": "Hay un manómetro" } }, { @@ -647,7 +686,8 @@ "ru": "Нет манометра", "pl": "Nie ma manometru", "pt_BR": "Não há um manômetro", - "pt": "Não há um manômetro" + "pt": "Não há um manômetro", + "es": "No hay ningún manometro" } }, { @@ -662,7 +702,8 @@ "ru": "Есть манометр, но он сломан", "pl": "Jest manometr, ale jest uszkodzony", "pt_BR": "Há um manômetro mas está quebrado", - "pt": "Há um manômetro mas está quebrado" + "pt": "Há um manômetro mas está quebrado", + "es": "Hay un manómetro pero está roto" } } ] @@ -681,7 +722,8 @@ "ru": "bелосипедный насос", "fi": "pyöräpumppu", "pl": "pompka do roweru", - "pt_BR": "uma bomba de bicicleta" + "pt_BR": "uma bomba de bicicleta", + "es": "una bomba de bicicletas" }, "tags": [ "amenity=bicycle_repair_station", @@ -696,7 +738,8 @@ "de": "Ein Gerät zum Aufpumpen von Reifen an einem festen Standort im öffentlichen Raum.", "pl": "Urządzenie do pompowania opon w stałym miejscu w przestrzeni publicznej.", "pt_BR": "Um dispositivo para encher seus pneus em um local fixa no espaço público", - "pt": "Um aparelho para encher os seus pneus num local fixa no espaço público" + "pt": "Um aparelho para encher os seus pneus num local fixa no espaço público", + "es": "Un dispositivo para inflar tus ruedas en una posición fija en el espacio público." }, "exampleImages": [ "./assets/layers/bike_repair_station/pump_example_round.jpg", @@ -712,7 +755,8 @@ "gl": "estación de arranxo de bicicletas con bomba de ar", "de": "eine fahrrad-reparaturstation und pumpe", "it": "una stazione di riparazione bici e pompa", - "pl": "stacja naprawy rowerów i pompka" + "pl": "stacja naprawy rowerów i pompka", + "es": "En estación de reparación de bicicletas y bomba" }, "tags": [ "amenity=bicycle_repair_station", @@ -724,7 +768,8 @@ "nl": "Een fietspomp en gereedschap om je fiets te herstellen in de publieke ruimte. Deze zijn op een vastgemaakt, bijvoorbeeld aan een paal.", "fr": "Un dispositif avec des outils pour réparer votre vélo combiné à une pompe a un emplacement fixe. Les outils sont souvent attachés par une chaîne pour empêcher le vol.", "it": "Un dispositivo con attrezzi per riparare la tua bici e una pompa in un luogo fisso. Gli attrezzi sono spesso attaccati ad una catena per prevenire il furto.", - "de": "Ein Gerät mit Werkzeugen zur Reparatur von Fahrrädern kombiniert mit einer Pumpe an einem festen Standort. Die Werkzeuge sind oft mit Ketten gegen Diebstahl gesichert." + "de": "Ein Gerät mit Werkzeugen zur Reparatur von Fahrrädern kombiniert mit einer Pumpe an einem festen Standort. Die Werkzeuge sind oft mit Ketten gegen Diebstahl gesichert.", + "es": "Una bomba de bicicletas y herramientas para reparar tu bicicleta en el espacio público. Las herramientas habitualmente están aseguradas con cadenas contra el robo." }, "exampleImages": [ "./assets/layers/bike_repair_station/repair_station_example_2.jpg", @@ -739,7 +784,8 @@ "gl": "estación de arranxo de bicicletas sin bomba de ar", "de": "eine fahrrad-reparaturstation ohne pumpe", "it": "una stazione di riparazione bici senza pompa", - "ru": "Станция обслуживания велосипедов без накачки (насоса)" + "ru": "Станция обслуживания велосипедов без накачки (насоса)", + "es": "una estación de reparación de bicicletas sin bomba" }, "tags": [ "amenity=bicycle_repair_station", @@ -749,7 +795,8 @@ "description": { "en": "Tools to repair your bike in the public space (without pump). The tools are secured against theft.", "nl": "Gereedschap om je fiets te herstellen in de publieke ruimte (zonder pomp). Deze zijn op een vastgemaakt, bijvoorbeeld aan een paal.", - "de": "Werkzeug, um Ihr Fahrrad im öffentlichen Raum zu reparieren (ohne Pumpe). Die Werkzeuge sind gegen Diebstahl gesichert." + "de": "Werkzeug, um Ihr Fahrrad im öffentlichen Raum zu reparieren (ohne Pumpe). Die Werkzeuge sind gegen Diebstahl gesichert.", + "es": "Herramientas para reparar tu bici en el espacio público (sin bomba).Las herramientas están aseguradas contra el robo." } } ], @@ -842,6 +889,7 @@ "description": { "en": "A layer showing bicycle pumps and bicycle repair tool stands", "nl": "Deze laag toont fietspompen en herstelpunten voor fietsen", - "de": "Eine Ebene mit Fahrradpumpen und Werkzeugständern für die Fahrradreparatur" + "de": "Eine Ebene mit Fahrradpumpen und Werkzeugständern für die Fahrradreparatur", + "es": "Una capa que muestra bombas de bicicletas y puestos de herramientas de reparación de bicicletas" } } \ No newline at end of file diff --git a/assets/layers/bike_shop/bike_shop.json b/assets/layers/bike_shop/bike_shop.json index 4748cdafc1..2b5c11a012 100644 --- a/assets/layers/bike_shop/bike_shop.json +++ b/assets/layers/bike_shop/bike_shop.json @@ -104,7 +104,8 @@ "ru": "Прокат велосипедов {name}", "de": "Fahrradverleih{name}", "pt_BR": "Aluguel de bicicletas {name}", - "pt": "Aluguel de bicicletas {name}" + "pt": "Aluguel de bicicletas {name}", + "es": "Alquiler de bicicletas {name}" } }, { @@ -123,7 +124,8 @@ "it": "Riparazione biciclette {name}", "ru": "Ремонт велосипедов {name}", "pt_BR": "Reparo de bicicletas {name}", - "pt": "Reparo de bicicletas {name}" + "pt": "Reparo de bicicletas {name}", + "es": "Reparación de bicis {name}" } }, { @@ -141,7 +143,8 @@ "it": "Negozio di biciclette {name}", "ru": "Магазин велосипедов {name}", "pt_BR": "Loja de bicicletas {name}", - "pt": "Loja de bicicletas {name}" + "pt": "Loja de bicicletas {name}", + "es": "Tienda de bicis {name}" } }, { @@ -191,7 +194,8 @@ "ru": "Магазин, специализирующийся на продаже велосипедов или сопутствующих товаров", "pt_BR": "Uma loja que vende especificamente bicicletas ou itens relacionados", "de": "Ein Geschäft, das speziell Fahrräder oder verwandte Artikel verkauft", - "pt": "Uma loja que vende especificamente bicicletas ou itens relacionados" + "pt": "Uma loja que vende especificamente bicicletas ou itens relacionados", + "es": "Una tiene que vende específicamente bicis u objetos relacionados" }, "tagRenderings": [ "images", @@ -211,7 +215,8 @@ "it": "Questo negozio è specializzato nella vendita di {shop} ed effettua attività relative alle biciclette", "pt_BR": "Esta loja é especializada em vender {shop} e faz atividades relacionadas à bicicletas", "de": "Dieses Geschäft ist auf den Verkauf von {shop} spezialisiert und im Bereich Fahrrad tätig", - "pt": "Esta loja é especializada em vender {shop} e faz atividades relacionadas à bicicletas" + "pt": "Esta loja é especializada em vender {shop} e faz atividades relacionadas à bicicletas", + "es": "Esta tienda está especializada en vender {shop} y hace actividades relacionadas con bicicletas" }, "mappings": [ { @@ -234,7 +239,8 @@ "it": "Qual è il nome di questo negozio di biciclette?", "ru": "Как называется магазин велосипедов?", "pt_BR": "Qual o nome desta loja de bicicletas?", - "pt": "Qual o nome desta loja de bicicletas?" + "pt": "Qual o nome desta loja de bicicletas?", + "es": "¿Cual es el nombre de esta tienda de bicicletas?" }, "render": { "en": "This bicycle shop is called {name}", @@ -245,7 +251,8 @@ "it": "Questo negozio di biciclette è chiamato {name}", "ru": "Этот магазин велосипедов называется {name}", "pt_BR": "Esta loja de bicicletas se chama {name}", - "pt": "Esta loja de bicicletas se chama {name}" + "pt": "Esta loja de bicicletas se chama {name}", + "es": "Esta tienda de bicicletas se llama {name}" }, "freeform": { "key": "name" @@ -263,7 +270,8 @@ "id": "URL {name} apa?", "de": "Was ist die Webseite von {name}?", "pt_BR": "Qual o website de {name}?", - "pt": "Qual o website de {name}?" + "pt": "Qual o website de {name}?", + "es": "¿Cual es el sitio web de {name}?" }, "render": "{website}", "freeform": { @@ -282,7 +290,8 @@ "ru": "Какой номер телефона у {name}?", "de": "Wie lautet die Telefonnummer von {name}?", "pt_BR": "Qual o número de telefone de {name}?", - "pt": "Qual é o número de telefone de {name}?" + "pt": "Qual é o número de telefone de {name}?", + "es": "¿Cual es el número de teléfono de {name}?" }, "render": "{phone}", "freeform": { @@ -301,7 +310,8 @@ "ru": "Какой адрес электронной почты у {name}?", "de": "Wie lautet die E-Mail-Adresse von {name}?", "pt_BR": "Qual o endereço de email de {name}?", - "pt": "Qual o endereço de email de {name}?" + "pt": "Qual o endereço de email de {name}?", + "es": "¿Cual es la dirección de correo electrónico de {name}?" }, "render": "{email}", "freeform": { @@ -315,7 +325,8 @@ "render": { "en": "Only accessible to {access}", "nl": "Enkel voor {access}", - "de": "Nur zugänglich für {access}" + "de": "Nur zugänglich für {access}", + "es": "Solo accesible a {access}" }, "freeform": { "key": "access" @@ -333,7 +344,8 @@ "it": "Questo negozio vende bici?", "ru": "Продаются ли велосипеды в этом магазине?", "pt_BR": "Esta loja vende bicicletas?", - "pt": "Esta loja vende bicicletas?" + "pt": "Esta loja vende bicicletas?", + "es": "¿Vende bicis esta tienda?" }, "mappings": [ { @@ -347,7 +359,8 @@ "it": "Questo negozio vende bici", "ru": "В этом магазине продаются велосипеды", "pt_BR": "Esta loja vende bicicletas", - "pt": "Esta loja vende bicicletas" + "pt": "Esta loja vende bicicletas", + "es": "Esta tienda vende bicis" } }, { @@ -361,7 +374,8 @@ "it": "Questo negozio non vende bici", "ru": "В этом магазине не продают велосипеды", "pt_BR": "Esta loja não vende bicicletas", - "pt": "Esta loja não vende bicicletas" + "pt": "Esta loja não vende bicicletas", + "es": "Esta tienda no vende bicis" } } ] @@ -377,7 +391,8 @@ "it": "Questo negozio ripara bici?", "ru": "В этом магазине ремонтируют велосипеды?", "pt_BR": "Esta loja conserta bicicletas?", - "pt": "Esta loja conserta bicicletas?" + "pt": "Esta loja conserta bicicletas?", + "es": "¿Repara bicis esta tienda?" }, "mappings": [ { @@ -391,7 +406,8 @@ "it": "Questo negozio ripara bici", "ru": "Этот магазин ремонтирует велосипеды", "pt_BR": "Esta loja conserta bicicletas", - "pt": "Esta loja conserta bicicletas" + "pt": "Esta loja conserta bicicletas", + "es": "Esta tienda repara bicis" } }, { @@ -405,7 +421,8 @@ "it": "Questo negozio non ripara bici", "ru": "Этот магазин не ремонтирует велосипеды", "pt_BR": "Esta loja não conserta bicicletas", - "pt": "Esta loja não conserta bicicletas" + "pt": "Esta loja não conserta bicicletas", + "es": "Esta tienda no repara bicis" } }, { @@ -419,7 +436,8 @@ "it": "Questo negozio ripara solo le bici che sono state acquistate qua", "ru": "Этот магазин ремонтирует только велосипеды, купленные здесь", "pt_BR": "Esta loja conserta bicicletas compradas aqui", - "pt": "Esta loja conserta bicicletas compradas aqui" + "pt": "Esta loja conserta bicicletas compradas aqui", + "es": "Esta tienda solo repara bicis compradas aquí" } }, { @@ -433,7 +451,8 @@ "it": "Questo negozio ripara solo le biciclette di una certa marca", "ru": "В этом магазине обслуживают велосипеды определённого бренда", "pt_BR": "Esta loja conserta bicicletas de uma certa marca", - "pt": "Esta loja conserta bicicletas de uma certa marca" + "pt": "Esta loja conserta bicicletas de uma certa marca", + "es": "Esta tienda solo repara bicis de una cierta marca" } } ] @@ -450,7 +469,8 @@ "it": "Questo negozio noleggia le bici?", "ru": "Этот магазин сдает велосипеды в аренду?", "pt_BR": "Esta loja aluga bicicletas?", - "pt": "Esta loja aluga bicicletas?" + "pt": "Esta loja aluga bicicletas?", + "es": "¿Alquila bicicis esta tienda?" }, "mappings": [ { @@ -464,7 +484,8 @@ "it": "Questo negozio noleggia le bici", "ru": "Этот магазин сдает велосипеды в аренду", "pt_BR": "Esta loja aluga bicicletas", - "pt": "Esta loja aluga bicicletas" + "pt": "Esta loja aluga bicicletas", + "es": "Esta tienda alquila bicis" } }, { @@ -478,7 +499,8 @@ "it": "Questo negozio non noleggia le bici", "ru": "Этот магазин не сдает велосипеды напрокат", "pt_BR": "Esta loja não aluga bicicletas", - "pt": "Esta loja não aluga bicicletas" + "pt": "Esta loja não aluga bicicletas", + "es": "Esta tienda no alquila bicis" } } ] @@ -493,7 +515,8 @@ "gl": "Esta tenda vende bicicletas de segunda man?", "de": "Verkauft dieses Geschäft gebrauchte Fahrräder?", "it": "Questo negozio vende bici usate?", - "ru": "В этом магазине продаются подержанные велосипеды?" + "ru": "В этом магазине продаются подержанные велосипеды?", + "es": "¿Vende bicis de segunda mano esta tienda?" }, "mappings": [ { @@ -505,7 +528,8 @@ "gl": "Esta tenda vende bicicletas de segunda man", "de": "Dieses Geschäft verkauft gebrauchte Fahrräder", "it": "Questo negozio vende bici usate", - "ru": "В этом магазине продаются подержанные велосипеды" + "ru": "В этом магазине продаются подержанные велосипеды", + "es": "Esta tienda vende bicis de segunda mano" } }, { @@ -517,7 +541,8 @@ "gl": "Esta tenda non vende bicicletas de segunda man", "de": "Dieses Geschäft verkauft keine gebrauchten Fahrräder", "it": "Questo negozio non vende bici usate", - "ru": "В этом магазине не продаются подержанные велосипеды" + "ru": "В этом магазине не продаются подержанные велосипеды", + "es": "Esta tienda no vende bicis de segunda mano" } }, { @@ -529,7 +554,8 @@ "gl": "Esta tenda só vende bicicletas de segunda man", "de": "Dieses Geschäft verkauft nur gebrauchte Fahrräder", "it": "Questo negozio vende solamente bici usate", - "ru": "В этом магазине продаются только подержанные велосипеды" + "ru": "В этом магазине продаются только подержанные велосипеды", + "es": "Esta tienda solo vende bicis de segunda mano" } } ] @@ -543,7 +569,8 @@ "gl": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa?", "de": "Bietet dieses Geschäft eine Fahrradpumpe zur Benutzung für alle an?", "it": "Questo negozio offre l’uso a chiunque di una pompa per bici?", - "ru": "Предлагается ли в этом магазине велосипедный насос для всеобщего пользования?" + "ru": "Предлагается ли в этом магазине велосипедный насос для всеобщего пользования?", + "es": "¿Esta tienda ofrece una bomba para que la utilice cualquiera?" }, "mappings": [ { @@ -555,7 +582,8 @@ "gl": "Esta tenda ofrece unha bomba de ar para uso de calquera persoa", "de": "Dieses Geschäft bietet eine Fahrradpumpe für alle an", "it": "Questo negozio offre l’uso pubblico di una pompa per bici", - "ru": "В этом магазине есть велосипедный насос для всеобщего пользования" + "ru": "В этом магазине есть велосипедный насос для всеобщего пользования", + "es": "Esta tienda ofrece una bomba para cualquiera" } }, { @@ -567,7 +595,8 @@ "gl": "Esta tenda non ofrece unha bomba de ar para uso de calquera persoa", "de": "Dieses Geschäft bietet für niemanden eine Fahrradpumpe an", "it": "Questo negozio non offre l’uso pubblico di una pompa per bici", - "ru": "В этом магазине нет велосипедного насоса для всеобщего пользования" + "ru": "В этом магазине нет велосипедного насоса для всеобщего пользования", + "es": "Esta tienda no ofrece una bomba para cualquiera" } }, { @@ -577,7 +606,8 @@ "nl": "Er is een fietspomp, deze is apart aangeduid", "fr": "Il y a une pompe à vélo, c'est indiqué comme un point séparé ", "it": "C’è una pompa per bici, è mostrata come punto separato ", - "de": "Es gibt eine Fahrradpumpe, sie wird als separater Punkt angezeigt " + "de": "Es gibt eine Fahrradpumpe, sie wird als separater Punkt angezeigt ", + "es": "Hay una bomba para bicicletas, se muestra como un punto separado " } } ] @@ -591,7 +621,8 @@ "gl": "Hai ferramentas aquí para arranxar a túa propia bicicleta?", "de": "Gibt es hier Werkzeuge, um das eigene Fahrrad zu reparieren?", "it": "Sono presenti degli attrezzi per riparare la propria bici?", - "ru": "Есть ли здесь инструменты для починки собственного велосипеда?" + "ru": "Есть ли здесь инструменты для починки собственного велосипеда?", + "es": "¿Hay herramientas para reparar tu propia bici?" }, "mappings": [ { @@ -637,7 +668,8 @@ "fr": "Lave-t-on les vélos ici ?", "it": "Vengono lavate le bici qua?", "ru": "Здесь моют велосипеды?", - "de": "Werden hier Fahrräder gewaschen?" + "de": "Werden hier Fahrräder gewaschen?", + "es": "¿Aquí se lavan bicicletas?" }, "mappings": [ { @@ -648,7 +680,8 @@ "fr": "Ce magasin lave les vélos", "it": "Questo negozio lava le biciclette", "de": "Dieses Geschäft reinigt Fahrräder", - "ru": "В этом магазине оказываются услуги мойки/чистки велосипедов" + "ru": "В этом магазине оказываются услуги мойки/чистки велосипедов", + "es": "Esta tienda limpia bicicletas" } }, { @@ -658,7 +691,8 @@ "nl": "Deze winkel biedt een installatie aan om zelf je fiets schoon te maken", "fr": "Ce magasin a une installation pour laver soi même des vélos", "it": "Questo negozio ha una struttura dove è possibile pulire la propria bici", - "de": "Dieser Laden hat eine Anlage, in der man Fahrräder selbst reinigen kann" + "de": "Dieser Laden hat eine Anlage, in der man Fahrräder selbst reinigen kann", + "es": "Esta tienda tiene una instalación donde uno puede limpiar bicicletas por si mismo" } }, { @@ -669,7 +703,8 @@ "fr": "Ce magasin ne fait pas le nettoyage de vélo", "it": "Questo negozio non offre la pulizia della bicicletta", "de": "Dieser Laden bietet keine Fahrradreinigung an", - "ru": "В этом магазине нет услуг мойки/чистки велосипедов" + "ru": "В этом магазине нет услуг мойки/чистки велосипедов", + "es": "Esta tienda no ofrece limpieza de bicicletas" } } ] diff --git a/assets/layers/bike_themed_object/bike_themed_object.json b/assets/layers/bike_themed_object/bike_themed_object.json index 717c2fd39d..6c173061c5 100644 --- a/assets/layers/bike_themed_object/bike_themed_object.json +++ b/assets/layers/bike_themed_object/bike_themed_object.json @@ -5,7 +5,8 @@ "nl": "Fietsgerelateerd object", "fr": "Objet cycliste", "de": "Weitere fahrradbezogene Objekte", - "it": "Oggetto relativo alle bici" + "it": "Oggetto relativo alle bici", + "es": "Objeto relacionada con bicis" }, "minzoom": 13, "source": { @@ -29,7 +30,8 @@ "nl": "Fietsgerelateerd object", "fr": "Objet cycliste", "de": "Mit Fahrrad zusammenhängendes Objekt", - "it": "Oggetto relativo alle bici" + "it": "Oggetto relativo alle bici", + "es": "Objeto relacionado con bicis" }, "mappings": [ { @@ -45,7 +47,8 @@ "it": "Pista ciclabile", "de": "Radweg", "ru": "Велотрек", - "ca": "Pista ciclable" + "ca": "Pista ciclable", + "es": "Carril bici" } } ] @@ -84,6 +87,7 @@ "description": { "en": "A layer with bike-themed objects but who don't match any other layer", "nl": "Een laag met fietsgerelateerde diensten, die in geen enkele andere laag konden ondergebracht worden", - "de": "Eine Ebene mit Objekten zum Thema Fahrrad, die zu keiner anderen Ebene passen" + "de": "Eine Ebene mit Objekten zum Thema Fahrrad, die zu keiner anderen Ebene passen", + "es": "Una capa con los objetos relacionados con bicis pero que no coinciden con ninguna otra capa" } } \ No newline at end of file diff --git a/assets/layers/binocular/binocular.json b/assets/layers/binocular/binocular.json index 0186274ba3..8bdb070434 100644 --- a/assets/layers/binocular/binocular.json +++ b/assets/layers/binocular/binocular.json @@ -14,7 +14,8 @@ "nl": "Verrekijker", "de": "Ferngläser", "ru": "Бинокль", - "ca": "Prismàtics" + "ca": "Prismàtics", + "es": "Binoculares" } }, "description": { @@ -51,12 +52,14 @@ "render": { "en": "Using these binoculars costs {charge}", "nl": "Deze verrekijker gebruiken kost {charge}", - "de": "Die Benutzung dieses Fernglases kostet {charge}" + "de": "Die Benutzung dieses Fernglases kostet {charge}", + "es": "Utilizar estos binoculares cuesta {charge}" }, "question": { "en": "How much does one have to pay to use these binoculars?", "nl": "Hoeveel moet men betalen om deze verrekijker te gebruiken?", - "de": "Wie viel muss man für die Nutzung dieser Ferngläser bezahlen?" + "de": "Wie viel muss man für die Nutzung dieser Ferngläser bezahlen?", + "es": "¿Cuánto hay que pagar para utilizar estos binoculares?" }, "id": "binocular-charge" }, @@ -64,12 +67,14 @@ "question": { "en": "When looking through this binocular, in what direction does one look?", "nl": "Welke richting kijkt men uit als men door deze verrekijker kijkt?", - "de": "In welche Richtung blickt man, wenn man durch dieses Fernglas schaut?" + "de": "In welche Richtung blickt man, wenn man durch dieses Fernglas schaut?", + "es": "¿Cuándo uno mira a través de este binocular, en qué dirección lo hace?" }, "render": { "en": "Looks towards {direction}°", "nl": "Kijkt richting {direction}°", - "de": "Blick in Richtung {direction}°" + "de": "Blick in Richtung {direction}°", + "es": "Mira hacia {direction}º" }, "freeform": { "key": "direction", diff --git a/assets/layers/birdhide/birdhide.json b/assets/layers/birdhide/birdhide.json index 4c679898cb..8658156978 100644 --- a/assets/layers/birdhide/birdhide.json +++ b/assets/layers/birdhide/birdhide.json @@ -3,7 +3,8 @@ "name": { "en": "Bird watching places", "nl": "Vogelkijkhutten", - "de": "Orte zur Vogelbeobachtung" + "de": "Orte zur Vogelbeobachtung", + "es": "Lugares para ver pájaros" }, "minzoom": 14, "source": { @@ -142,7 +143,8 @@ }, "then": { "en": "There are special provisions for wheelchair users", - "nl": "Er zijn speciale voorzieningen voor rolstoelen" + "nl": "Er zijn speciale voorzieningen voor rolstoelen", + "es": "Hay provisiones especiales para usuarios de sillas de ruedas" } }, { @@ -175,7 +177,9 @@ }, "then": { "en": "Not accessible to wheelchair users", - "nl": "Niet rolstoeltoegankelijk" + "nl": "Niet rolstoeltoegankelijk", + "de": "Nicht zugänglich für Rollstuhlfahrer", + "es": "No accesible a usuarios con sillas de ruedas" } } ] @@ -183,7 +187,9 @@ { "render": { "en": "Operated by {operator}", - "nl": "Beheer door {operator}" + "nl": "Beheer door {operator}", + "de": "Betrieben von {operator}", + "es": "Operado por {operator}" }, "freeform": { "key": "operator" @@ -197,14 +203,17 @@ "if": "operator=Natuurpunt", "then": { "en": "Operated by Natuurpunt", - "nl": "Beheer door Natuurpunt" + "nl": "Beheer door Natuurpunt", + "de": "Betrieben von Natuurpunt", + "es": "Operado por Natuurpunt" } }, { "if": "operator=Agentschap Natuur en Bos", "then": { "en": "Operated by the Agency for Nature and Forests", - "nl": "Beheer door het Agentschap Natuur en Bos" + "nl": "Beheer door het Agentschap Natuur en Bos", + "de": "Betrieben von einer Forst- bzw. Naturschutzbehörde" } } ], @@ -239,7 +248,9 @@ }, "description": { "en": "A covered shelter where one can watch birds comfortably", - "nl": "Een overdekte hut waarbinnen er warm en droog naar vogels gekeken kan worden" + "nl": "Een overdekte hut waarbinnen er warm en droog naar vogels gekeken kan worden", + "de": "Ein überdachter Unterstand, in dem man bequem Vögel beobachten kann", + "es": "Un refugio cubierto donde se pueden ver pájaros confortablemente" } }, { @@ -254,7 +265,8 @@ }, "description": { "en": "A screen or wall with openings to watch birds", - "nl": "Een vogelkijkwand waarachter men kan staan om vogels te kijken" + "nl": "Een vogelkijkwand waarachter men kan staan om vogels te kijken", + "es": "Una pantalla o pared con aperturas para ver pájaros" } } ], @@ -268,7 +280,8 @@ "en": "Wheelchair accessible", "de": "Zugänglich für Rollstuhlfahrer", "fr": "Accessible aux fauteuils roulants", - "ca": "Accessible per a cadires de rodes" + "ca": "Accessible per a cadires de rodes", + "es": "Accesible con sillas de ruedas" }, "osmTags": { "or": [ diff --git a/assets/layers/cafe_pub/cafe_pub.json b/assets/layers/cafe_pub/cafe_pub.json index c0351ceaac..42cd2ce791 100644 --- a/assets/layers/cafe_pub/cafe_pub.json +++ b/assets/layers/cafe_pub/cafe_pub.json @@ -6,7 +6,8 @@ "de": "Cafés und Kneipen", "fr": "Cafés et pubs", "zh_Hant": "咖啡廳與酒吧", - "hu": "Kávézók és kocsmák" + "hu": "Kávézók és kocsmák", + "es": "Cafeterías y bares" }, "source": { "osmTags": { @@ -33,7 +34,9 @@ }, "description": { "en": "A pub, mostly for drinking beers in a warm, relaxed interior", - "nl": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk" + "nl": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk", + "de": "Eine Kneipe, in der vor allem Bier in ruhiger, entspannter Atmosphäre getrunken wird", + "es": "Un bar, principalmente para beber cervezas en un interior templado y relajado" }, "preciseInput": { "preferredBackground": "map" @@ -53,7 +56,8 @@ }, "description": { "en": "A more modern and commercial bar, possibly with a music and light installation", - "nl": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek" + "nl": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek", + "de": "Eine modernere und kommerzielle Bar, möglicherweise mit einer Musik- und Lichtinstallation" }, "preciseInput": { "preferredBackground": "map" @@ -73,7 +77,8 @@ }, "description": { "en": "A cafe to drink tea, coffee or an alcoholical bevarage in a quiet environment", - "nl": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen." + "nl": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen.", + "de": "Ein Café, um in ruhiger Umgebung Tee, Kaffee oder ein alkoholisches Getränk zu trinken" }, "preciseInput": { "preferredBackground": "map" @@ -84,7 +89,8 @@ "render": { "en": "Pub", "nl": "Café", - "ca": "Bar" + "ca": "Bar", + "de": "Kneipe" }, "mappings": [ { @@ -137,35 +143,40 @@ "if": "amenity=pub", "then": { "en": "A pub, mostly for drinking beers in a warm, relaxed interior", - "nl": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk" + "nl": "Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk", + "de": "Eine Kneipe, in der vor allem Bier in ruhiger, entspannter Atmosphäre getrunken wird" } }, { "if": "amenity=bar", "then": { "en": "A more modern and commercial bar, possibly with a music and light installation", - "nl": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek" + "nl": "Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek", + "de": "Eine modernere und kommerzielle Bar, möglicherweise mit einer Musik- und Lichtinstallation" } }, { "if": "amenity=cafe", "then": { "en": "A cafe to drink tea, coffee or an alcoholical bevarage in a quiet environment", - "nl": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen." + "nl": "Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen.", + "de": "Ein Café, um in ruhiger Umgebung Tee, Kaffee oder ein alkoholisches Getränk zu trinken" } }, { "if": "amenity=restaurant", "then": { "en": "A restuarant where one can get a proper meal", - "nl": "Dit is een restaurant waar men een maaltijd geserveerd krijgt" + "nl": "Dit is een restaurant waar men een maaltijd geserveerd krijgt", + "de": "Ein Restaurant, in dem man ordentlich essen kann" } }, { "if": "amenity=biergarten", "then": { "en": "An open space where beer is served, typically seen in Germany", - "nl": "Een open ruimte waar bier geserveerd wordt. Typisch in Duitsland" + "nl": "Een open ruimte waar bier geserveerd wordt. Typisch in Duitsland", + "de": "Ein Außenbereich mit Bierausschank, typischerweise in Deutschland" }, "hideInAnswer": "_country!=de" } @@ -192,7 +203,8 @@ "de": "Derzeit geöffnet", "fr": "Ouvert maintenant", "hu": "Most nyitva van", - "ca": "Obert ara" + "ca": "Obert ara", + "es": "Abiert oahora" }, "osmTags": "_isOpen=yes" } @@ -210,7 +222,9 @@ { "explanation": { "nl": "{title()} is permanent gestopt", - "en": "{title()} has closed down permanently" + "en": "{title()} has closed down permanently", + "de": "{title()} wurde dauerhaft geschlossen", + "es": "{title()} ha cerrado permanentemente" }, "changesetMessage": "shop_closed" } @@ -251,6 +265,8 @@ "description": { "en": "A layer showing cafés and pubs where one can gather around a drink. The layer asks for some relevant questions", "hu": "Egy olyan réteg, amely kávézókat és kocsmákat jelenít meg, ahol össze lehet gyűlni egy ital köré. A réteg néhány lényeges kérdést tesz fel", - "nl": "Een laag die kroegen en koffiehuizen toont waar je iets kunt drinken. De laag zal je enkele vragen stellen" + "nl": "Een laag die kroegen en koffiehuizen toont waar je iets kunt drinken. De laag zal je enkele vragen stellen", + "de": "Eine Ebene mit Cafés und Kneipen, in denen man sich auf ein Getränk treffen kann. Die Ebene fragt nach einigen relevanten Eigenschaften", + "es": "Una capa que muestra cafeterías y bares donde uno se puede reunir con una bebida. La capa pregunta algunas preguntas relevantes" } } \ No newline at end of file diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json index ea5804e18e..959c91114b 100644 --- a/assets/layers/charging_station/charging_station.json +++ b/assets/layers/charging_station/charging_station.json @@ -138,7 +138,8 @@ }, "render": { "en": "Access is {access}", - "nl": "Toegang voor {access}" + "nl": "Toegang voor {access}", + "de": "Zugang ist {access}" }, "freeform": { "key": "access", @@ -151,7 +152,8 @@ "if": "access=yes", "then": { "en": "Anyone can use this charging station (payment might be needed)", - "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)" + "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)", + "de": "Jeder kann diese Ladestation nutzen (eventuell gegen Bezahlung)" } }, { @@ -163,7 +165,8 @@ }, "then": { "en": "Anyone can use this charging station (payment might be needed)", - "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)" + "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)", + "de": "Jeder kann diese Ladestation nutzen (eventuell gegen Bezahlung)" }, "hideInAnswer": true }, @@ -202,7 +205,8 @@ }, "question": { "en": "How much vehicles can be charged here at the same time?", - "nl": "Hoeveel voertuigen kunnen hier opgeladen worden?" + "nl": "Hoeveel voertuigen kunnen hier opgeladen worden?", + "de": "Wie viele Fahrzeuge können hier gleichzeitig geladen werden?" }, "freeform": { "key": "capacity", @@ -223,7 +227,8 @@ "ifnot": "socket:schuko=", "then": { "en": "Schuko wall plug without ground pin (CEE7/4 type F)", - "nl": "Schuko stekker zonder aardingspin (CEE7/4 type F)" + "nl": "Schuko stekker zonder aardingspin (CEE7/4 type F)", + "de": "Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)" }, "icon": { "path": "./assets/layers/charging_station/CEE7_4F.svg", @@ -251,7 +256,8 @@ }, "then": { "en": "Schuko wall plug without ground pin (CEE7/4 type F)", - "nl": "Schuko stekker zonder aardingspin (CEE7/4 type F)" + "nl": "Schuko stekker zonder aardingspin (CEE7/4 type F)", + "de": "Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)" }, "hideInAnswer": true, "icon": { @@ -264,7 +270,8 @@ "ifnot": "socket:typee=", "then": { "en": "European wall plug with ground pin (CEE7/4 type E)", - "nl": "Europese stekker met aardingspin (CEE7/4 type E)" + "nl": "Europese stekker met aardingspin (CEE7/4 type E)", + "de": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" }, "icon": { "path": "./assets/layers/charging_station/TypeE.svg", @@ -280,7 +287,8 @@ }, "then": { "en": "European wall plug with ground pin (CEE7/4 type E)", - "nl": "Europese stekker met aardingspin (CEE7/4 type E)" + "nl": "Europese stekker met aardingspin (CEE7/4 type E)", + "de": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" }, "hideInAnswer": true, "icon": { @@ -294,7 +302,8 @@ "then": { "en": "Chademo", "nl": "Chademo", - "ca": "Chademo" + "ca": "Chademo", + "de": "Chademo" }, "icon": { "path": "./assets/layers/charging_station/Chademo_type4.svg", @@ -337,7 +346,8 @@ "then": { "en": "Chademo", "nl": "Chademo", - "ca": "Chademo" + "ca": "Chademo", + "de": "Chademo" }, "hideInAnswer": true, "icon": { @@ -350,7 +360,8 @@ "ifnot": "socket:type1_cable=", "then": { "en": "Type 1 with cable (J1772)", - "nl": "Type 1 met kabel (J1772)" + "nl": "Type 1 met kabel (J1772)", + "de": "Typ 1 mit Kabel (J1772)" }, "icon": { "path": "./assets/layers/charging_station/Type1_J1772.svg", @@ -392,7 +403,8 @@ }, "then": { "en": "Type 1 with cable (J1772)", - "nl": "Type 1 met kabel (J1772)" + "nl": "Type 1 met kabel (J1772)", + "de": "Typ 1 mit Kabel (J1772)" }, "hideInAnswer": true, "icon": { @@ -405,7 +417,8 @@ "ifnot": "socket:type1=", "then": { "en": "Type 1 without cable (J1772)", - "nl": "Type 1 zonder kabel (J1772)" + "nl": "Type 1 zonder kabel (J1772)", + "de": "Typ 1 ohne Kabel (J1772)" }, "icon": { "path": "./assets/layers/charging_station/Type1_J1772.svg", @@ -447,7 +460,8 @@ }, "then": { "en": "Type 1 without cable (J1772)", - "nl": "Type 1 zonder kabel (J1772)" + "nl": "Type 1 zonder kabel (J1772)", + "de": " Typ 1 ohne Kabel (J1772)" }, "hideInAnswer": true, "icon": { @@ -460,7 +474,8 @@ "ifnot": "socket:type1_combo=", "then": { "en": "Type 1 CCS (aka Type 1 Combo)", - "nl": "Type 1 CCS (ook gekend als Type 1 Combo)" + "nl": "Type 1 CCS (ook gekend als Type 1 Combo)", + "de": "Typ 1 CCS (auch bekannt als Typ 1 Combo)" }, "icon": { "path": "./assets/layers/charging_station/Type1-ccs.svg", @@ -502,7 +517,8 @@ }, "then": { "en": "Type 1 CCS (aka Type 1 Combo)", - "nl": "Type 1 CCS (ook gekend als Type 1 Combo)" + "nl": "Type 1 CCS (ook gekend als Type 1 Combo)", + "de": " Typ 1 CCS (auch bekannt als Typ 1 Combo)" }, "hideInAnswer": true, "icon": { @@ -515,7 +531,8 @@ "ifnot": "socket:tesla_supercharger=", "then": { "en": "Tesla Supercharger", - "nl": "Tesla Supercharger" + "nl": "Tesla Supercharger", + "de": "Tesla Supercharger" }, "icon": { "path": "./assets/layers/charging_station/Tesla-hpwc-model-s.svg", @@ -557,7 +574,8 @@ }, "then": { "en": "Tesla Supercharger", - "nl": "Tesla Supercharger" + "nl": "Tesla Supercharger", + "de": "Tesla Supercharger" }, "hideInAnswer": true, "icon": { @@ -570,7 +588,8 @@ "ifnot": "socket:type2=", "then": { "en": "Type 2 (mennekes)", - "nl": "Type 2 (mennekes)" + "nl": "Type 2 (mennekes)", + "de": "Typ 2 (mennekes)" }, "icon": { "path": "./assets/layers/charging_station/Type2_socket.svg", @@ -612,7 +631,8 @@ }, "then": { "en": "Type 2 (mennekes)", - "nl": "Type 2 (mennekes)" + "nl": "Type 2 (mennekes)", + "de": "Typ 2 (mennekes)" }, "hideInAnswer": true, "icon": { @@ -625,7 +645,8 @@ "ifnot": "socket:type2_combo=", "then": { "en": "Type 2 CCS (mennekes)", - "nl": "Type 2 CCS (mennekes)" + "nl": "Type 2 CCS (mennekes)", + "de": "Typ 2 CCS (mennekes)" }, "icon": { "path": "./assets/layers/charging_station/Type2_CCS.svg", @@ -667,7 +688,8 @@ }, "then": { "en": "Type 2 CCS (mennekes)", - "nl": "Type 2 CCS (mennekes)" + "nl": "Type 2 CCS (mennekes)", + "de": "Typ 2 CCS (mennekes)" }, "hideInAnswer": true, "icon": { @@ -680,7 +702,8 @@ "ifnot": "socket:type2_cable=", "then": { "en": "Type 2 with cable (mennekes)", - "nl": "Type 2 met kabel (J1772)" + "nl": "Type 2 met kabel (J1772)", + "de": "Typ 2 mit Kabel (mennekes)" }, "icon": { "path": "./assets/layers/charging_station/Type2_tethered.svg", @@ -722,7 +745,8 @@ }, "then": { "en": "Type 2 with cable (mennekes)", - "nl": "Type 2 met kabel (J1772)" + "nl": "Type 2 met kabel (J1772)", + "de": "Typ 2 mit Kabel (mennekes)" }, "hideInAnswer": true, "icon": { @@ -735,7 +759,8 @@ "ifnot": "socket:tesla_supercharger_ccs=", "then": { "en": "Tesla Supercharger CCS (a branded type2_css)", - "nl": "Tesla Supercharger CCS (een type2 CCS met Tesla-logo)" + "nl": "Tesla Supercharger CCS (een type2 CCS met Tesla-logo)", + "de": "Tesla Supercharger CCS (ein Markenzeichen von type2_css)" }, "icon": { "path": "./assets/layers/charging_station/Type2_CCS.svg", @@ -777,7 +802,8 @@ }, "then": { "en": "Tesla Supercharger CCS (a branded type2_css)", - "nl": "Tesla Supercharger CCS (een type2 CCS met Tesla-logo)" + "nl": "Tesla Supercharger CCS (een type2 CCS met Tesla-logo)", + "de": "Tesla Supercharger CCS (ein Markenzeichen von type2_css)" }, "hideInAnswer": true, "icon": { @@ -790,7 +816,8 @@ "ifnot": "socket:tesla_destination=", "then": { "en": "Tesla Supercharger (destination)", - "nl": "Tesla Supercharger (destination)" + "nl": "Tesla Supercharger (destination)", + "de": "Tesla Supercharger (Destination)" }, "icon": { "path": "./assets/layers/charging_station/Tesla-hpwc-model-s.svg", @@ -838,7 +865,8 @@ }, "then": { "en": "Tesla Supercharger (destination)", - "nl": "Tesla Supercharger (destination)" + "nl": "Tesla Supercharger (destination)", + "de": "Tesla Supercharger (Destination)" }, "hideInAnswer": true, "icon": { @@ -851,7 +879,8 @@ "ifnot": "socket:tesla_destination=", "then": { "en": "Tesla supercharger (destination) (A Type 2 with cable branded as tesla)", - "nl": "Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)" + "nl": "Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)", + "de": "Tesla supercharger (Destination) (Typ 2 mit Kabel von Tesla)" }, "icon": { "path": "./assets/layers/charging_station/Type2_tethered.svg", @@ -899,7 +928,8 @@ }, "then": { "en": "Tesla supercharger (destination) (A Type 2 with cable branded as tesla)", - "nl": "Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)" + "nl": "Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)", + "de": "Tesla supercharger (Destination) (Typ 2 mit Kabel von Tesla)" }, "hideInAnswer": true, "icon": { @@ -912,7 +942,8 @@ "ifnot": "socket:USB-A=", "then": { "en": "USB to charge phones and small electronics", - "nl": "USB om GSMs en kleine electronica op te laden" + "nl": "USB om GSMs en kleine electronica op te laden", + "de": "USB zum Aufladen von Handys und kleinen Elektrogeräten" }, "icon": { "path": "./assets/layers/charging_station/usb_port.svg", @@ -928,7 +959,8 @@ }, "then": { "en": "USB to charge phones and small electronics", - "nl": "USB om GSMs en kleine electronica op te laden" + "nl": "USB om GSMs en kleine electronica op te laden", + "de": "USB zum Aufladen von Handys und kleinen Elektrogeräten" }, "hideInAnswer": true, "icon": { @@ -941,7 +973,8 @@ "ifnot": "socket:bosch_3pin=", "then": { "en": "Bosch Active Connect with 3 pins and cable", - "nl": "Bosch Active Connect met 3 pinnen aan een kabel" + "nl": "Bosch Active Connect met 3 pinnen aan een kabel", + "de": "Bosch Active Connect mit 3 Pins und Kabel" }, "icon": { "path": "./assets/layers/charging_station/bosch-3pin.svg", @@ -979,7 +1012,8 @@ }, "then": { "en": "Bosch Active Connect with 3 pins and cable", - "nl": "Bosch Active Connect met 3 pinnen aan een kabel" + "nl": "Bosch Active Connect met 3 pinnen aan een kabel", + "de": " Bosch Active Connect mit 3 Pins und Kabel" }, "hideInAnswer": true, "icon": { @@ -992,7 +1026,8 @@ "ifnot": "socket:bosch_5pin=", "then": { "en": "Bosch Active Connect with 5 pins and cable", - "nl": "Bosch Active Connect met 5 pinnen aan een kabel" + "nl": "Bosch Active Connect met 5 pinnen aan een kabel", + "de": "Bosch Active Connect mit 5 Pins und Kabel" }, "icon": { "path": "./assets/layers/charging_station/bosch-5pin.svg", @@ -1030,7 +1065,8 @@ }, "then": { "en": "Bosch Active Connect with 5 pins and cable", - "nl": "Bosch Active Connect met 5 pinnen aan een kabel" + "nl": "Bosch Active Connect met 5 pinnen aan een kabel", + "de": " Bosch Active Connect mit 5 Pins und Kabel" }, "hideInAnswer": true, "icon": { @@ -1044,11 +1080,13 @@ "id": "plugs-0", "question": { "en": "How much plugs of type
Schuko wall plug without ground pin (CEE7/4 type F)
are available here?", - "nl": "Hoeveel stekkers van type
Schuko stekker zonder aardingspin (CEE7/4 type F)
heeft dit oplaadpunt?" + "nl": "Hoeveel stekkers van type
Schuko stekker zonder aardingspin (CEE7/4 type F)
heeft dit oplaadpunt?", + "de": "Wie viele Stecker vom Typ
Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)
sind hier vorhanden?" }, "render": { "en": "There are {socket:schuko} plugs of type
Schuko wall plug without ground pin (CEE7/4 type F)
available here", - "nl": "Hier zijn {socket:schuko} stekkers van het type
Schuko stekker zonder aardingspin (CEE7/4 type F)
" + "nl": "Hier zijn {socket:schuko} stekkers van het type
Schuko stekker zonder aardingspin (CEE7/4 type F)
", + "de": "Hier sind {socket:schuko} Stecker des Typs
Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)
vorhanden" }, "freeform": { "key": "socket:schuko", @@ -1065,11 +1103,13 @@ "id": "plugs-1", "question": { "en": "How much plugs of type
European wall plug with ground pin (CEE7/4 type E)
are available here?", - "nl": "Hoeveel stekkers van type
Europese stekker met aardingspin (CEE7/4 type E)
heeft dit oplaadpunt?" + "nl": "Hoeveel stekkers van type
Europese stekker met aardingspin (CEE7/4 type E)
heeft dit oplaadpunt?", + "de": "Wie viele Stecker des Typs
Europäischer Wandstecker mit Erdungsstift (CEE7/4 Typ E)
sind hier vorhanden?" }, "render": { "en": "There are {socket:typee} plugs of type
European wall plug with ground pin (CEE7/4 type E)
available here", - "nl": "Hier zijn {socket:typee} stekkers van het type
Europese stekker met aardingspin (CEE7/4 type E)
" + "nl": "Hier zijn {socket:typee} stekkers van het type
Europese stekker met aardingspin (CEE7/4 type E)
", + "de": "Hier sind {socket:typee} Stecker des Typs
Europäischer Wandstecker mit Erdungsstift (CEE7/4 Typ E)
vorhanden" }, "freeform": { "key": "socket:typee", @@ -2953,7 +2993,8 @@ }, "render": { "en": "
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs {socket:tesla_destination:voltage} volt", - "nl": "
Tesla supercharger (destination). (Een Type 2 met kabel en Tesla-logo)
heeft een spanning van {socket:tesla_destination:voltage} volt" + "nl": "
Tesla supercharger (destination). (Een Type 2 met kabel en Tesla-logo)
heeft een spanning van {socket:tesla_destination:voltage} volt", + "de": "
Tesla Supercharger (Destination) (Typ 2 mit Kabel von Tesla)
liefert {socket:tesla_destination:voltage} Volt" }, "freeform": { "key": "socket:tesla_destination:voltage", @@ -3087,11 +3128,13 @@ "group": "technical", "question": { "en": "What voltage do the plugs with
USB to charge phones and small electronics
offer?", - "nl": "Welke spanning levert de stekker van type
USB om GSMs en kleine electronica op te laden
" + "nl": "Welke spanning levert de stekker van type
USB om GSMs en kleine electronica op te laden
", + "de": "Welche Spannung liefern die Stecker mit
USB zum Laden von Handys und kleinen Elektrogeräten
?" }, "render": { "en": "
USB to charge phones and small electronics
outputs {socket:USB-A:voltage} volt", - "nl": "
USB om GSMs en kleine electronica op te laden
heeft een spanning van {socket:USB-A:voltage} volt" + "nl": "
USB om GSMs en kleine electronica op te laden
heeft een spanning van {socket:USB-A:voltage} volt", + "de": "
USB zum Aufladen von Telefonen und kleinen Elektrogeräten
liefert {socket:USB-A:voltage} Volt" }, "freeform": { "key": "socket:USB-A:voltage", @@ -3102,7 +3145,8 @@ "if": "socket:USB-A:voltage=5 V", "then": { "en": "USB to charge phones and small electronics outputs 5 volt", - "nl": "USB om GSMs en kleine electronica op te laden heeft een spanning van 5 volt" + "nl": "USB om GSMs en kleine electronica op te laden heeft een spanning van 5 volt", + "de": "USB zum Aufladen von Handys und kleinen Elektrogeräten liefert 5 Volt" }, "icon": { "path": "./assets/layers/charging_station/usb_port.svg", @@ -3214,7 +3258,8 @@ "group": "technical", "question": { "en": "What voltage do the plugs with
Bosch Active Connect with 3 pins and cable
offer?", - "nl": "Welke spanning levert de stekker van type
Bosch Active Connect met 3 pinnen aan een kabel
" + "nl": "Welke spanning levert de stekker van type
Bosch Active Connect met 3 pinnen aan een kabel
", + "de": "Welche Spannung bieten die Stecker mit
Bosch Active Connect mit 3 Pins und Kabel
?" }, "render": { "en": "
Bosch Active Connect with 3 pins and cable
outputs {socket:bosch_3pin:voltage} volt", @@ -3376,7 +3421,8 @@ "id": "fee", "question": { "en": "Does one have to pay to use this charging station?", - "nl": "Moet men betalen om dit oplaadpunt te gebruiken?" + "nl": "Moet men betalen om dit oplaadpunt te gebruiken?", + "de": "Muss man für die Nutzung dieser Ladestation bezahlen?" }, "mappings": [ { @@ -3390,7 +3436,8 @@ }, "then": { "nl": "Gratis te gebruiken (zonder aan te melden)", - "en": "Free to use (without authenticating)" + "en": "Free to use (without authenticating)", + "de": "Kostenlos nutzbar (ohne Authentifizierung)" } }, { @@ -3404,7 +3451,8 @@ }, "then": { "nl": "Gratis te gebruiken, maar aanmelden met een applicatie is verplicht", - "en": "Free to use, but one has to authenticate" + "en": "Free to use, but one has to authenticate", + "de": "Kostenlose Nutzung, aber man muss sich authentifizieren" } }, { @@ -3415,7 +3463,8 @@ }, "then": { "nl": "Gratis te gebruiken", - "en": "Free to use" + "en": "Free to use", + "de": "Kostenlose Nutzung" }, "hideInAnswer": true }, @@ -3428,7 +3477,8 @@ }, "then": { "nl": "Betalend te gebruiken, maar gratis voor klanten van het bijhorende hotel/café/ziekenhuis/...", - "en": "Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station" + "en": "Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station", + "de": "Kostenpflichtige Nutzung, aber kostenlos für Kunden des Hotels / Pub / Krankenhauses / ... wer die Ladestation betreibt" } }, { @@ -3450,7 +3500,8 @@ "id": "charge", "question": { "en": "How much does one have to pay to use this charging station?", - "nl": "Hoeveel moet men betalen om dit oplaadpunt te gebruiken?" + "nl": "Hoeveel moet men betalen om dit oplaadpunt te gebruiken?", + "de": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?" }, "render": { "en": "Using this charging station costs {charge}", @@ -3583,11 +3634,13 @@ "id": "Auth phone", "render": { "en": "Authenticate by calling or SMS'ing to {authentication:phone_call:number}", - "nl": "Aanmelden door te bellen of te SMS'en naar {authentication:phone_call:number}" + "nl": "Aanmelden door te bellen of te SMS'en naar {authentication:phone_call:number}", + "de": "Authentifizierung durch Anruf oder SMS an {authentication:phone_call:number}" }, "question": { "en": "What's the phone number for authentication call or SMS?", - "nl": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?" + "nl": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?", + "de": "Wie lautet die Telefonnummer für den Authentifizierungsanruf oder die SMS?" }, "freeform": { "key": "authentication:phone_call:number", @@ -3604,21 +3657,24 @@ "id": "maxstay", "question": { "en": "What is the maximum amount of time one is allowed to stay here?", - "nl": "Hoelang mag een voertuig hier blijven staan?" + "nl": "Hoelang mag een voertuig hier blijven staan?", + "de": "Wie lange darf man hier maximal parken?" }, "freeform": { "key": "maxstay" }, "render": { "en": "One can stay at most {canonical(maxstay)}", - "nl": "De maximale parkeertijd hier is {canonical(maxstay)}" + "nl": "De maximale parkeertijd hier is {canonical(maxstay)}", + "de": "Die maximale Parkdauer beträgt {canonical(maxstay)}" }, "mappings": [ { "if": "maxstay=unlimited", "then": { "en": "No timelimit on leaving your vehicle here", - "nl": "Geen maximum parkeertijd" + "nl": "Geen maximum parkeertijd", + "de": "Keine Höchstparkdauer" } } ], @@ -3744,11 +3800,13 @@ "id": "phone", "question": { "en": "What number can one call if there is a problem with this charging station?", - "nl": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?" + "nl": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?", + "de": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?" }, "render": { "en": "In case of problems, call {phone}", - "nl": "Bij problemen, bel naar {phone}" + "nl": "Bij problemen, bel naar {phone}", + "de": "Bei Problemen, anrufen unter {phone}" }, "freeform": { "key": "phone", @@ -3759,11 +3817,13 @@ "id": "email", "question": { "en": "What is the email address of the operator?", - "nl": "Wat is het email-adres van de operator?" + "nl": "Wat is het email-adres van de operator?", + "de": "Wie lautet die E-Mail-Adresse des Betreibers?" }, "render": { "en": "In case of problems, send an email to {email}", - "nl": "Bij problemen, email naar {email}" + "nl": "Bij problemen, email naar {email}", + "de": "Bei Problemen senden Sie bitte eine E-Mail an {email}" }, "freeform": { "key": "email", @@ -4012,7 +4072,8 @@ ], "title": { "en": "a charging station for electrical bikes with a normal european wall plug (meant to charge electrical bikes)", - "nl": "een oplaadpunt voor elektrische fietsen met een gewoon Europees stopcontact (speciaal bedoeld voor fietsen)" + "nl": "een oplaadpunt voor elektrische fietsen met een gewoon Europees stopcontact (speciaal bedoeld voor fietsen)", + "de": "eine Ladestation für Elektrofahrräder mit einer normalen europäischen Steckdose (zum Laden von Elektrofahrrädern)" }, "preciseInput": { "preferredBackground": "map" diff --git a/assets/layers/etymology/etymology.json b/assets/layers/etymology/etymology.json index 4b43c7ac82..3268eb41bd 100644 --- a/assets/layers/etymology/etymology.json +++ b/assets/layers/etymology/etymology.json @@ -52,6 +52,10 @@ "helperArgs": [ "name", { + "notInstanceOf": [ + "Q79007", + "Q22698" + ], "removePostfixes": [ "steenweg", "heirbaan", @@ -70,7 +74,9 @@ "wegel", "kerk", "church", - "kaai" + "kaai", + "park", + "parque" ] } ] @@ -140,7 +146,8 @@ "id": "etymology_multi_apply", "render": { "en": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Auto-applying data on all segments with the same name, true)}", - "nl": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Wijzigingen worden automatisch gedaan op alle segmenten met dezelfde naam, true)}" + "nl": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Wijzigingen worden automatisch gedaan op alle segmenten met dezelfde naam, true)}", + "de": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Automatische Datenübernahme auf alle Segmente mit demselben Namen, true)}" } }, { diff --git a/assets/layers/food/food.json b/assets/layers/food/food.json index 522ac67740..93294a607a 100644 --- a/assets/layers/food/food.json +++ b/assets/layers/food/food.json @@ -66,7 +66,7 @@ "cuisine=friture" ], "description": { - "en": "A fastfood-buisiness focused on french fries", + "en": "A fastfood-business focused on french fries", "nl": "Een fastfood-zaak waar je frieten koopt" }, "preciseInput": { @@ -78,7 +78,8 @@ "render": { "en": "Restaurant", "nl": "Eetgelegenheid", - "ca": "Restaurant" + "ca": "Restaurant", + "de": "Restaurant" }, "mappings": [ { @@ -460,7 +461,8 @@ "question": { "en": "Does this fries shop have vegetarian snacks?", "nl": "Heeft deze frituur vegetarische snacks?", - "fr": "Cette friterie est-elle équipée de snacks végétariens ?" + "fr": "Cette friterie est-elle équipée de snacks végétariens ?", + "de": "Hat dieser Frittenladen vegetarische Snacks?" }, "mappings": [ { diff --git a/assets/layers/ghost_bike/ghost_bike.json b/assets/layers/ghost_bike/ghost_bike.json index 24c911da53..550daa9c24 100644 --- a/assets/layers/ghost_bike/ghost_bike.json +++ b/assets/layers/ghost_bike/ghost_bike.json @@ -125,7 +125,7 @@ "then": { "en": "No name is marked on the bike", "nl": "De naam is niet aangeduid op de fiets", - "de": "Auf dem Fahrrad ist kein Name angegeben", + "de": "Am Fahrrad ist kein Name angegeben", "it": "Nessun nome scritto sulla bici", "fr": "Aucun nom n'est marqué sur le vélo" } @@ -227,6 +227,7 @@ ], "description": { "en": "A layer showing memorials for cyclists, killed in road accidents", - "nl": "Een laag die herdenkingsplaatsen voor verongelukte fietsers toont" + "nl": "Een laag die herdenkingsplaatsen voor verongelukte fietsers toont", + "de": "Eine Ebene mit Gedenkstätten für Radfahrer, die bei Verkehrsunfällen ums Leben gekommen sind" } } \ No newline at end of file diff --git a/assets/layers/information_board/information_board.json b/assets/layers/information_board/information_board.json index 0f5960b74e..ed9fe7e111 100644 --- a/assets/layers/information_board/information_board.json +++ b/assets/layers/information_board/information_board.json @@ -82,6 +82,7 @@ ], "description": { "en": "A layer showing touristical, road side information boards (e.g. giving information about the landscape, a building, a feature, a map, ...)", - "nl": "Deze laag toont informatieborden in de publieke ruimte die uitleg geven over een bezienswaardigheid (bv. uitleg over het landschap, een ruine, een kaart van de omgeving, ...)" + "nl": "Deze laag toont informatieborden in de publieke ruimte die uitleg geven over een bezienswaardigheid (bv. uitleg over het landschap, een ruine, een kaart van de omgeving, ...)", + "de": "Eine Ebene mit touristischen, straßenseitigen Informationstafeln (z. B. mit Informationen über die Landschaft, ein Gebäude, ein Merkmal, eine Karte, ...)" } } \ No newline at end of file diff --git a/assets/layers/nature_reserve/nature_reserve.json b/assets/layers/nature_reserve/nature_reserve.json index 4dee1cdffe..6c4db4dcfd 100644 --- a/assets/layers/nature_reserve/nature_reserve.json +++ b/assets/layers/nature_reserve/nature_reserve.json @@ -26,7 +26,8 @@ "title": { "render": { "nl": "Natuurgebied", - "en": "Nature reserve" + "en": "Nature reserve", + "de": "Naturschutzgebiet" }, "mappings": [ { @@ -51,11 +52,13 @@ { "render": { "en": "Accessin this nature reserve: {access:description}", - "nl": "De toegankelijkheid van dit gebied is: {access:description}" + "nl": "De toegankelijkheid van dit gebied is: {access:description}", + "de": "Zugang zu diesem Naturschutzgebiet: {access:description}" }, "question": { "en": "Is this nature reserve accessible to the public?", - "nl": "Is dit gebied toegankelijk?" + "nl": "Is dit gebied toegankelijk?", + "de": "Ist dieses Naturschutzgebiet für die Öffentlichkeit zugänglich?" }, "freeform": { "key": "access:description" @@ -70,7 +73,8 @@ }, "then": { "en": "Publicly accessible", - "nl": "Vrij toegankelijk" + "nl": "Vrij toegankelijk", + "de": "Öffentlich zugänglich" } }, { @@ -82,7 +86,8 @@ }, "then": { "en": "Not accessible", - "nl": "Niet toegankelijk" + "nl": "Niet toegankelijk", + "de": "Nicht zugänglich" } }, { @@ -94,7 +99,8 @@ }, "then": { "en": "Not accessible as this is a private area", - "nl": "Niet toegankelijk, want privégebied" + "nl": "Niet toegankelijk, want privégebied", + "de": "Nicht zugänglich, da dies ein privater Bereich ist" } }, { @@ -106,7 +112,8 @@ }, "then": { "en": "Accessible despite being a privately owned area", - "nl": "Toegankelijk, ondanks dat het privegebied is" + "nl": "Toegankelijk, ondanks dat het privegebied is", + "de": "Zugänglich, obwohl es sich um ein privates Gebiet handelt" } }, { @@ -118,7 +125,8 @@ }, "then": { "en": "Only accessible with a guide or during organised activities", - "nl": "Enkel toegankelijk met een gids of tijdens een activiteit" + "nl": "Enkel toegankelijk met een gids of tijdens een activiteit", + "de": "Nur mit einem Führer oder bei organisierten Aktivitäten zugänglich" } }, { @@ -130,7 +138,8 @@ }, "then": { "en": "Accessible with fee", - "nl": "Toegankelijk mits betaling" + "nl": "Toegankelijk mits betaling", + "de": "Zugänglich gegen Gebühr" } } ], @@ -139,11 +148,13 @@ { "render": { "en": "Operated by {operator}", - "nl": "Beheer door {operator}" + "nl": "Beheer door {operator}", + "de": "Betrieben von {operator}" }, "question": { "en": "Who operates this area?", - "nl": "Wie beheert dit gebied?" + "nl": "Wie beheert dit gebied?", + "de": "Wer betreibt dieses Gebiet?" }, "freeform": { "key": "operator" @@ -157,7 +168,8 @@ }, "then": { "en": "Operated by Natuurpunt", - "nl": "Dit gebied wordt beheerd door Natuurpunt" + "nl": "Dit gebied wordt beheerd door Natuurpunt", + "de": "Betrieben von Natuurpunt" }, "icon": "./assets/layers/nature_reserve/Natuurpunt.jpg" }, @@ -169,7 +181,8 @@ }, "then": { "en": "Operated by {operator}", - "nl": "Dit gebied wordt beheerd door {operator}" + "nl": "Dit gebied wordt beheerd door {operator}", + "de": "Betrieben von {operator}" }, "icon": "./assets/layers/nature_reserve/Natuurpunt.jpg", "hideInAnswer": true @@ -182,7 +195,8 @@ }, "then": { "en": "Operated by Agentschap Natuur en Bos", - "nl": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos" + "nl": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos", + "de": "Betrieben von Agentschap Natuur en Bos" }, "icon": "./assets/layers/nature_reserve/ANB.jpg" } @@ -192,11 +206,13 @@ { "render": { "nl": "Dit gebied heet {name}", - "en": "This area is named {name}" + "en": "This area is named {name}", + "de": "Dieses Gebiet heißt {name}" }, "question": { "nl": "Wat is de naam van dit gebied?", - "en": "What is the name of this area?" + "en": "What is the name of this area?", + "de": "Wie heißt dieses Gebiet?" }, "freeform": { "key": "name", @@ -219,7 +235,8 @@ }, "then": { "en": "This area doesn't have a name", - "nl": "Dit gebied heeft geen naam" + "nl": "Dit gebied heeft geen naam", + "de": "Dieses Gebiet hat keinen Namen" } } ], @@ -340,7 +357,8 @@ { "render": { "en": "Extra information: {description}", - "nl": "Extra info: {description}" + "nl": "Extra info: {description}", + "de": "Zusätzliche Informationen: {description}" }, "freeform": { "key": "description" @@ -350,11 +368,13 @@ { "question": { "en": "Is there some extra info?", - "nl": "Is er extra info die je kwijt wil?" + "nl": "Is er extra info die je kwijt wil?", + "de": "Gibt es zusätzliche Informationen?" }, "render": { "en": "Extra info: {description:0}", - "nl": "Extra info: {description:0}" + "nl": "Extra info: {description:0}", + "de": "Zusätzliche Informationen: {description:0}" }, "freeform": { "key": "description:0" @@ -382,11 +402,13 @@ ], "title": { "en": "a nature reserve", - "nl": "een natuurreservaat" + "nl": "een natuurreservaat", + "de": "ein Naturschutzgebiet" }, "description": { "en": "Add a missing nature reserve", - "nl": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt" + "nl": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt", + "de": "Ein fehlendes Naturschutzgebiet hinzufügen" } } ], @@ -410,7 +432,8 @@ { "question": { "en": "All nature reserves", - "nl": "Alle natuurgebieden" + "nl": "Alle natuurgebieden", + "de": "Alle Naturschutzgebiete" } }, { diff --git a/assets/layers/note/note.json b/assets/layers/note/note.json index 6acece52ac..1a64adbac5 100644 --- a/assets/layers/note/note.json +++ b/assets/layers/note/note.json @@ -17,14 +17,16 @@ "render": { "en": "Note", "nl": "Note", - "ca": "Nota" + "ca": "Nota", + "de": "Notiz" }, "mappings": [ { "if": "closed_at~*", "then": { "en": "Closed note", - "nl": "Gesloten Note" + "nl": "Gesloten Note", + "de": "Geschlossene Notiz" } } ] @@ -61,7 +63,8 @@ "id": "report-contributor", "render": { "en": "Report {_first_user} as spam", - "nl": "{_first_user} melden als spam" + "nl": "{_first_user} melden als spam", + "de": "{_first_user} als Spam melden" }, "condition": "_opened_by_anonymous_user=false" }, @@ -69,7 +72,8 @@ "id": "report-note", "render": { "en": "Report this note as spam or inappropriate", - "nl": "Deze not melden als spam of ongepast" + "nl": "Deze not melden als spam of ongepast", + "de": "Diese Notiz als Spam oder unangemessen melden" } } ], @@ -114,7 +118,8 @@ ], "question": { "en": "Should mention {search} in the first comment", - "nl": "Moet in de eerste opmerking \"{search}\" bevatten" + "nl": "Moet in de eerste opmerking \"{search}\" bevatten", + "de": "Sollte {search} im ersten Kommentar erwähnen" } } ] @@ -131,7 +136,8 @@ ], "question": { "en": "Should not mention {search} in the first comment", - "nl": "Mag in de eerste opmerking niet \"{search}\" bevatten" + "nl": "Mag in de eerste opmerking niet \"{search}\" bevatten", + "de": "Sollte nicht {search} im ersten Kommentar erwähnen" } } ] @@ -148,7 +154,8 @@ ], "question": { "en": "Opened by contributor {search}", - "nl": "Geopend door bijdrager {search}" + "nl": "Geopend door bijdrager {search}", + "de": "Geöffnet vom Mitwirkenden {search}" } } ] @@ -165,7 +172,8 @@ ], "question": { "en": "Not opened by contributor {search}", - "nl": "Niet geopend door bijdrager {search}" + "nl": "Niet geopend door bijdrager {search}", + "de": "Nicht vom Mitwirkenden {search} geöffnet" } } ] @@ -182,7 +190,8 @@ ], "question": { "en": "Last edited by contributor {search}", - "nl": "Laatst bewerkt door bijdrager {search}" + "nl": "Laatst bewerkt door bijdrager {search}", + "de": "Zuletzt bearbeitet vom Mitwirkenden {search}" } } ] @@ -199,7 +208,8 @@ ], "question": { "en": "Opened after {search}", - "nl": "Geopend na {search}" + "nl": "Geopend na {search}", + "de": "Geöffnet nach {search}" } } ] @@ -217,7 +227,8 @@ ], "question": { "en": "Created before {search}", - "nl": "Aangemaakt voor {search}" + "nl": "Aangemaakt voor {search}", + "de": "Erstellt vor {search}" } } ] @@ -235,7 +246,8 @@ ], "question": { "en": "Created after {search}", - "nl": "Aangemaakt na {search}" + "nl": "Aangemaakt na {search}", + "de": "Erstellt nach {search}" } } ] @@ -247,7 +259,8 @@ "osmTags": "_opened_by_anonymous_user=true", "question": { "en": "Only show notes opened by an anonymous contributor", - "nl": "Toon enkel de Notes geopend door een anonieme bijdrager" + "nl": "Toon enkel de Notes geopend door een anonieme bijdrager", + "de": "Nur Notizen anzeigen, die von anonymen Mitwirkenden geöffnet wurden" } } ] @@ -259,7 +272,8 @@ "osmTags": "closed_at=", "question": { "en": "Only show open notes", - "nl": "Toon enkel open Notes" + "nl": "Toon enkel open Notes", + "de": "Nur offene Notizen anzeigen" } } ] @@ -271,7 +285,8 @@ "osmTags": "_is_import_note=", "question": { "en": "Hide import notes", - "nl": "Verberg import Notes" + "nl": "Verberg import Notes", + "de": "Importnotizen ausblenden" } } ] diff --git a/assets/layers/note_import/note_import.json b/assets/layers/note_import/note_import.json index 40d33c32ce..72584bed52 100644 --- a/assets/layers/note_import/note_import.json +++ b/assets/layers/note_import/note_import.json @@ -2,7 +2,8 @@ "id": "note_import", "name": { "en": "Possible bookcases", - "nl": "Mogelijke publieke boekenkastjes" + "nl": "Mogelijke publieke boekenkastjes", + "de": "Mögliche Bücherschränke" }, "description": "Template for note note imports.", "source": { @@ -19,7 +20,8 @@ "title": { "render": { "en": "Possible feature", - "nl": "Mogelijk object" + "nl": "Mogelijk object", + "de": "Mögliches Objekt" } }, "calculatedTags": [ diff --git a/assets/layers/observation_tower/observation_tower.json b/assets/layers/observation_tower/observation_tower.json index 8157692305..59943038ec 100644 --- a/assets/layers/observation_tower/observation_tower.json +++ b/assets/layers/observation_tower/observation_tower.json @@ -84,21 +84,24 @@ "question": { "en": "Can this tower be visited?", "nl": "Is deze toren publiek toegankelijk?", - "es": "¿Se puede visitar esta torre?" + "es": "¿Se puede visitar esta torre?", + "de": "Kann dieser Turm besichtigt werden?" }, "mappings": [ { "if": "access=yes", "then": { "en": "This tower is publicly accessible", - "nl": "Deze toren is publiek toegankelijk" + "nl": "Deze toren is publiek toegankelijk", + "de": "Dieser Turm ist öffentlich zugänglich" } }, { "if": "access=guided", "then": { "en": "This tower can only be visited with a guide", - "nl": "Deze toren can enkel bezocht worden met een gids" + "nl": "Deze toren can enkel bezocht worden met een gids", + "de": "Dieser Turm kann nur mit einem Führer besichtigt werden" } } ] @@ -160,7 +163,8 @@ "id": "step_count", "question": { "en": "How much individual steps does one have to climb to reach the top of this tower?", - "nl": "Hoeveel treden moet men beklimmen op de top van de toren te bereiken?" + "nl": "Hoeveel treden moet men beklimmen op de top van de toren te bereiken?", + "de": "Wie viele einzelne Stufen muss man erklimmen, um die Spitze des Turms zu erreichen?" }, "freeform": { "key": "step_count", @@ -168,7 +172,8 @@ }, "render": { "en": "This tower has {step_count} steps to reach the top", - "nl": "Deze toren heeft {step_count} traptredes" + "nl": "Deze toren heeft {step_count} traptredes", + "de": "Dieser Turm hat {step_count} Stufen, um die Spitze zu erreichen" }, "condition": { "or": [ @@ -181,21 +186,24 @@ "id": "elevator", "question": { "en": "Does this tower have an elevator?", - "nl": "Heeft deze toren een lift?" + "nl": "Heeft deze toren een lift?", + "de": "Hat dieser Turm einen Aufzug?" }, "mappings": [ { "if": "elevator=yes", "then": { "en": "This tower has an elevator which takes visitors to the top", - "nl": "Deze toren heeft een lift die bezoekers naar de top van de toren brengt" + "nl": "Deze toren heeft een lift die bezoekers naar de top van de toren brengt", + "de": "Dieser Turm verfügt über einen Aufzug, der die Besucher nach oben bringt" } }, { "if": "elevator=no", "then": { "en": "This tower does not have an elevator", - "nl": "Deze toren heeft geen lift" + "nl": "Deze toren heeft geen lift", + "de": "Dieser Turm hat keinen Aufzug" } } ], diff --git a/assets/layers/parking/parking.json b/assets/layers/parking/parking.json index 3a1c1a1084..17ec106fe7 100644 --- a/assets/layers/parking/parking.json +++ b/assets/layers/parking/parking.json @@ -13,12 +13,14 @@ "title": { "render": { "nl": "Parking voor auto's", - "en": "Car parking" + "en": "Car parking", + "de": "Parkplatz" } }, "description": { "en": "A layer showing car parkings", - "nl": "Deze laag toont autoparkings" + "nl": "Deze laag toont autoparkings", + "de": "Eine Ebene mit Parkplätzen" }, "tagRenderings": [ "images" @@ -30,7 +32,8 @@ ], "title": { "nl": "een parking voor auto's", - "en": "a car parking" + "en": "a car parking", + "de": "ein Parkplatz" } } ], diff --git a/assets/layers/playground/playground.json b/assets/layers/playground/playground.json index 8e09bbef56..ab16932294 100644 --- a/assets/layers/playground/playground.json +++ b/assets/layers/playground/playground.json @@ -304,7 +304,8 @@ "if": "fee=yes", "then": { "en": "This is a paid playground", - "nl": "Er moet betaald worden om deze speeltuin te mogen gebruiken" + "nl": "Er moet betaald worden om deze speeltuin te mogen gebruiken", + "de": "Dies ist ein gebührenpflichtiger Spielplatz" }, "addExtraTags": [ "access=customers" diff --git a/assets/layers/recycling/recycling.json b/assets/layers/recycling/recycling.json index a875896138..e2078207fd 100644 --- a/assets/layers/recycling/recycling.json +++ b/assets/layers/recycling/recycling.json @@ -8,7 +8,8 @@ }, "description": { "en": "A layer with recycling containers and centres", - "nl": "Een laag met recyclagingcontainers en -centrums" + "nl": "Een laag met recyclagingcontainers en -centrums", + "de": "Eine Ebene mit Recyclingcontainern und -zentren" }, "source": { "osmTags": "amenity=recycling" @@ -20,7 +21,8 @@ "title": { "render": { "en": "Recycling facility", - "nl": "Recyclingfaciliteit" + "nl": "Recyclingfaciliteit", + "de": "Recyclinganlage" }, "mappings": [ { @@ -28,21 +30,24 @@ "then": { "*": "{name}", "en": "Recycling centre", - "nl": "Recyclingcentrum" + "nl": "Recyclingcentrum", + "de": "Wertstoffhof" } }, { "if": "recycling_type=centre", "then": { "en": "Recycling centre", - "nl": "Recyclingcentrum" + "nl": "Recyclingcentrum", + "de": "Wertstoffhof" } }, { "if": "recycling_type=container", "then": { "en": "Recycling container", - "nl": "Recyclingcontainer" + "nl": "Recyclingcontainer", + "de": "Recyclingcontainer" } } ] @@ -410,7 +415,8 @@ { "title": { "en": "a recycling container", - "nl": "een recycling container" + "nl": "een recycling container", + "de": "ein Recyclingcontainer" }, "tags": [ "amenity=recycling", @@ -420,7 +426,8 @@ { "title": { "en": "a recycling centre", - "nl": "een containerpark (recycling center)" + "nl": "een containerpark (recycling center)", + "de": "ein Wertstoffhof" }, "tags": [ "amenity=recycling", @@ -434,28 +441,32 @@ "id": "recycling-type", "question": { "en": "What type of recycling is this?", - "nl": "Wat voor soort recycling is dit?" + "nl": "Wat voor soort recycling is dit?", + "de": "Um welche Recyclingeinrichtung handelt es sich?" }, "mappings": [ { "if": "recycling_type=container", "then": { "en": "This is a recycling container", - "nl": "Dit is een recyclingcontainer" + "nl": "Dit is een recyclingcontainer", + "de": "Dies ist ein Recycling-Container" } }, { "if": "recycling_type=centre", "then": { "en": "This is a recycling centre", - "nl": "Dit is een recyclingcentrum" + "nl": "Dit is een recyclingcentrum", + "de": "Dies ist ein Wertstoffhof" } }, { "if": "amenity=waste_disposal", "then": { "en": "Waste disposal container for residual waste", - "nl": "Afvalcontainer voor restafval" + "nl": "Afvalcontainer voor restafval", + "de": "Dies ist ein Abfallcontainer für Restmüll" }, "addExtraTags": [ "recycling:batteries=", @@ -486,11 +497,13 @@ "id": "recycling-centre-name", "question": { "en": "What is the name of this recycling centre?", - "nl": "Wat is de naam van dit recyclagecentrum?" + "nl": "Wat is de naam van dit recyclagecentrum?", + "de": "Wie lautet der Name dieses Wertstoffhofs?" }, "render": { "en": "This recycling centre is named {name}", - "nl": "Dit recyclagecentrum heet {name}" + "nl": "Dit recyclagecentrum heet {name}", + "de": "Dieser Wertstoffhof heißt {name}" }, "freeform": { "key": "name" @@ -500,7 +513,8 @@ "if": "noname=yes", "then": { "en": "This recycling centre doesn't have a specific name", - "nl": "Dit recyclagecentrum heeft geen specifieke naam" + "nl": "Dit recyclagecentrum heeft geen specifieke naam", + "de": "Dieser Wertstoffhof hat keinen bestimmten Namen" } } ], @@ -510,7 +524,8 @@ "id": "container-location", "question": { "en": "Where is this container located?", - "nl": "Waar bevindt deze container zich?" + "nl": "Waar bevindt deze container zich?", + "de": "Wo befindet sich dieser Container?" }, "condition": "recycling_type=container", "mappings": [ @@ -518,21 +533,24 @@ "if": "location=underground", "then": { "en": "This is an underground container", - "nl": "Dit is een ondergrondse container" + "nl": "Dit is een ondergrondse container", + "de": "Dies ist ein Unterflurcontainer" } }, { "if": "location=indoor", "then": { "en": "This container is located indoors", - "nl": "Deze container bevindt zich binnen" + "nl": "Deze container bevindt zich binnen", + "de": "Dieser Container befindet sich in einem Gebäude" } }, { "if": "location=", "then": { "en": "This container is located outdoors", - "nl": "Deze container is buiten" + "nl": "Deze container is buiten", + "de": "Dieser Container befindet sich im Freien" } } ] @@ -541,7 +559,8 @@ "id": "recycling-accepts", "question": { "en": "What can be recycled here?", - "nl": "Wat kan hier gerecycled worden?" + "nl": "Wat kan hier gerecycled worden?", + "de": "Was kann hier recycelt werden?" }, "multiAnswer": true, "mappings": [ @@ -550,7 +569,8 @@ "ifnot": "recycling:batteries=", "then": { "en": "Batteries can be recycled here", - "nl": "Batterijen kunnen hier gerecycled worden" + "nl": "Batterijen kunnen hier gerecycled worden", + "de": "Batterien können hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/batteries.svg", @@ -562,7 +582,8 @@ "ifnot": "recycling:beverage_cartons=", "then": { "en": "Beverage cartons can be recycled here", - "nl": "Drankpakken kunnen hier gerecycled worden" + "nl": "Drankpakken kunnen hier gerecycled worden", + "de": "Getränkekartons können hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/beverage_cartons.svg", @@ -574,7 +595,8 @@ "ifnot": "recycling:cans=", "then": { "en": "Cans can be recycled here", - "nl": "Blikken kunnen hier gerecycled worden" + "nl": "Blikken kunnen hier gerecycled worden", + "de": "Dosen können hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/cans.svg", @@ -586,7 +608,8 @@ "ifnot": "recycling:clothes=", "then": { "en": "Clothes can be recycled here", - "nl": "Kleren kunnen hier gerecycled worden" + "nl": "Kleren kunnen hier gerecycled worden", + "de": "Kleidung kann hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/clothes.svg", @@ -598,7 +621,8 @@ "ifnot": "recycling:cooking_oil=", "then": { "en": "Cooking oil can be recycled here", - "nl": "Frituurvet kan hier gerecycled worden" + "nl": "Frituurvet kan hier gerecycled worden", + "de": "Speiseöl kann hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/cooking_oil.svg", @@ -610,7 +634,8 @@ "ifnot": "recycling:engine_oil=", "then": { "en": "Engine oil can be recycled here", - "nl": "Motorolie kan hier gerecycled worden" + "nl": "Motorolie kan hier gerecycled worden", + "de": "Motoröl kann hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/engine_oil.svg", @@ -622,7 +647,8 @@ "ifnot": "recycling:green_waste=", "then": { "en": "Green waste can be recycled here", - "nl": "Groen afval kan hier gerecycled worden" + "nl": "Groen afval kan hier gerecycled worden", + "de": "Grünabfälle können hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/garden_waste.svg", @@ -634,7 +660,8 @@ "ifnot": "recycling:organic=", "then": { "en": "Organic waste can be recycled here", - "nl": "Organisch afval kan hier gerecycled worden" + "nl": "Organisch afval kan hier gerecycled worden", + "de": "Bio-Abfall kann hier recycelt werden" }, "hideInAnswer": true, "icon": { @@ -647,7 +674,8 @@ "ifnot": "recycling:glass_bottles=", "then": { "en": "Glass bottles can be recycled here", - "nl": "Glazen flessen kunnen hier gerecycled worden" + "nl": "Glazen flessen kunnen hier gerecycled worden", + "de": "Glasflaschen können hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/glass_bottles.svg", @@ -659,7 +687,8 @@ "ifnot": "recycling:glass=", "then": { "en": "Glass can be recycled here", - "nl": "Glas kan hier gerecycled worden" + "nl": "Glas kan hier gerecycled worden", + "de": "Glas kann hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/glass.svg", @@ -671,7 +700,8 @@ "ifnot": "recycling:newspaper=", "then": { "en": "Newspapers can be recycled here", - "nl": "Kranten kunnen hier gerecycled worden" + "nl": "Kranten kunnen hier gerecycled worden", + "de": "Zeitungen können hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/newspaper.svg", @@ -683,7 +713,8 @@ "ifnot": "recycling:paper=", "then": { "en": "Paper can be recycled here", - "nl": "Papier kan hier gerecycled worden" + "nl": "Papier kan hier gerecycled worden", + "de": "Papier kann hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/paper.svg", @@ -695,7 +726,8 @@ "ifnot": "recycling:plastic_bottles=", "then": { "en": "Plastic bottles can be recycled here", - "nl": "Plastic flessen kunnen hier gerecycled worden" + "nl": "Plastic flessen kunnen hier gerecycled worden", + "de": "Plastikflaschen können hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/plastic_bottles.svg", @@ -707,7 +739,8 @@ "ifnot": "recycling:plastic_packaging=", "then": { "en": "Plastic packaging can be recycled here", - "nl": "Plastic verpakking kan hier gerecycled worden" + "nl": "Plastic verpakking kan hier gerecycled worden", + "de": "Kunststoffverpackungen können hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/plastic_packaging.svg", @@ -719,7 +752,8 @@ "ifnot": "recycling:plastic=", "then": { "en": "Plastic can be recycled here", - "nl": "Plastic kan hier gerecycled worden" + "nl": "Plastic kan hier gerecycled worden", + "de": "Kunststoff kann hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/plastic.svg", @@ -731,7 +765,8 @@ "ifnot": "recycling:scrap_metal=", "then": { "en": "Scrap metal can be recycled here", - "nl": "Oud metaal kan hier gerecycled worden" + "nl": "Oud metaal kan hier gerecycled worden", + "de": "Metallschrott kann hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/scrap_metal.svg", @@ -743,7 +778,8 @@ "ifnot": "recycling:shoes=", "then": { "en": "Shoes can be recycled here", - "nl": "Schoenen kunnen hier gerecycled worden" + "nl": "Schoenen kunnen hier gerecycled worden", + "de": "Schuhe können hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/shoes.svg", @@ -755,7 +791,8 @@ "ifnot": "recycling:small_appliances=", "then": { "en": "Small electrical appliances can be recycled here", - "nl": "Kleine elektrische apparaten kunnen hier gerecycled worden" + "nl": "Kleine elektrische apparaten kunnen hier gerecycled worden", + "de": "Elektrokleingeräte können hier recycelt werden" }, "icon": { "path": "./assets/layers/recycling/small_electrical_appliances.svg", @@ -767,7 +804,8 @@ "ifnot": "recycling:small_electrical_appliances=", "then": { "en": "Small electrical appliances can be recycled here", - "nl": "Kleine elektrische apparaten kunnen hier gerecycled worden" + "nl": "Kleine elektrische apparaten kunnen hier gerecycled worden", + "de": "Elektrokleingeräte können hier recycelt werden" }, "hideInAnswer": true, "icon": { @@ -780,7 +818,8 @@ "ifnot": "recycling:needles=", "then": { "en": "Needles can be recycled here", - "nl": "Injectienaalden kunnen hier gerecycled worden" + "nl": "Injectienaalden kunnen hier gerecycled worden", + "de": "Nadeln können hier recycelt werden" } }, { @@ -788,7 +827,8 @@ "ifnot": "recycling:waste=", "then": { "en": "Residual waste can be recycled here", - "nl": "Restafval kan hier gerecycled worden" + "nl": "Restafval kan hier gerecycled worden", + "de": "Restmüll kann hier recycelt werden" }, "icon": { "path": "./assets/layers/waste_disposal/waste_disposal.svg", @@ -802,11 +842,13 @@ "id": "operator", "render": { "en": "This recycling facility is operated by {operator}", - "nl": "Deze recyclingfaciliteit wordt beheerd door {operator}" + "nl": "Deze recyclingfaciliteit wordt beheerd door {operator}", + "de": "Diese Recyclinganlage wird betrieben von {operator}" }, "question": { "en": "What company operates this recycling facility?", - "nl": "Wat is de beheerder van deze recyclingfaciliteit?" + "nl": "Wat is de beheerder van deze recyclingfaciliteit?", + "de": "Welches Unternehmen betreibt diese Recyclinganlage?" }, "freeform": { "key": "operator", @@ -828,7 +870,8 @@ "render": "{opening_hours_table()}", "question": { "en": "What are the opening hours of this recycling facility?", - "nl": "Wat zijn de openingstijden van deze recyclingfaciliteit?" + "nl": "Wat zijn de openingstijden van deze recyclingfaciliteit?", + "de": "Wie sind die Öffnungszeiten dieser Recyclinganlage?" }, "freeform": { "key": "opening_hours", @@ -840,7 +883,8 @@ "then": { "en": "24/7", "nl": "24/7", - "ca": "24/7" + "ca": "24/7", + "de": "24/7" } } ] @@ -866,55 +910,63 @@ { "question": { "en": "All recycling types", - "nl": "Alle recyclingtypes" + "nl": "Alle recyclingtypes", + "de": "Alle Recyclingarten" } }, { "question": { "en": "Recycling of batteries", - "nl": "Recycling van batterijen" + "nl": "Recycling van batterijen", + "de": "Recycling von Batterien" }, "osmTags": "recycling:batteries=yes" }, { "question": { "en": "Recycling of beverage cartons", - "nl": "Recycling van drankpakken" + "nl": "Recycling van drankpakken", + "de": "Recycling von Getränkekartons" }, "osmTags": "recycling:beverage_cartons=yes" }, { "question": { "en": "Recycling of cans", - "nl": "Recycling van blikken" + "nl": "Recycling van blikken", + "de": "Recycling von Dosen" }, "osmTags": "recycling:cans=yes" }, { "question": { "en": "Recycling of clothes", - "nl": "Recycling van kleding" + "nl": "Recycling van kleding", + "de": "Recycling von Kleidung" }, "osmTags": "recycling:clothes=yes" }, { "question": { "en": "Recycling of cooking oil", - "nl": "Recycling van frituurvet" + "nl": "Recycling van frituurvet", + "de": "Recycling von Speiseöl" }, "osmTags": "recycling:cooking_oil=yes" }, { "question": { "en": "Recycling of engine oil", - "nl": "Recycling van motorolie" + "nl": "Recycling van motorolie", + "de": "Recycling von Motoröl" }, "osmTags": "recycling:engine_oil=yes" }, { "question": { "en": "Recycling of green waste", - "nl": "Recycling van groen afval" + "nl": "Recycling van groen afval", + "de": "Recycling von Grünabfällen" }, "osmTags": { "or": [ @@ -926,63 +978,72 @@ { "question": { "en": "Recycling of glass bottles", - "nl": "Recycling van glazen flessen" + "nl": "Recycling van glazen flessen", + "de": "Recycling von Glasflaschen" }, "osmTags": "recycling:glass_bottles=yes" }, { "question": { "en": "Recycling of glass", - "nl": "Recycling van glas" + "nl": "Recycling van glas", + "de": "Recycling von Glas" }, "osmTags": "recycling:glass=yes" }, { "question": { "en": "Recycling of newspapers", - "nl": "Recycling van kranten" + "nl": "Recycling van kranten", + "de": "Recycling von Zeitungen" }, "osmTags": "recycling:newspaper=yes" }, { "question": { "en": "Recycling of paper", - "nl": "Recycling van papier" + "nl": "Recycling van papier", + "de": "Recycling von Papier" }, "osmTags": "recycling:paper=yes" }, { "question": { "en": "Recycling of plastic bottles", - "nl": "Recycling van plastic flessen" + "nl": "Recycling van plastic flessen", + "de": "Recycling von Plastikflaschen" }, "osmTags": "recycling:plastic_bottles=yes" }, { "question": { "en": "Recycling of plastic packaging", - "nl": "Recycling van plastic verpakking" + "nl": "Recycling van plastic verpakking", + "de": "Recycling von Kunststoffverpackungen" }, "osmTags": "recycling:plastic_packaging=yes" }, { "question": { "en": "Recycling of plastic", - "nl": "Recycling van plastic" + "nl": "Recycling van plastic", + "de": "Recycling von Kunststoffen" }, "osmTags": "recycling:plastic=yes" }, { "question": { "en": "Recycling of scrap metal", - "nl": "Recycling van oud metaal" + "nl": "Recycling van oud metaal", + "de": "Recycling von Metallschrott" }, "osmTags": "recycling:scrap_metal=yes" }, { "question": { "en": "Recycling of small electrical appliances", - "nl": "Recycling van kleine elektrische apparaten" + "nl": "Recycling van kleine elektrische apparaten", + "de": "Recycling von Elektrokleingeräten" }, "osmTags": { "or": [ @@ -994,7 +1055,8 @@ { "question": { "en": "Recycling of residual waste", - "nl": "Recycling van restafval" + "nl": "Recycling van restafval", + "de": "Recycling von Restabfällen" }, "osmTags": "recycling:waste=yes" } diff --git a/assets/layers/shops/shops.json b/assets/layers/shops/shops.json index 35741422e3..a6990c56dc 100644 --- a/assets/layers/shops/shops.json +++ b/assets/layers/shops/shops.json @@ -294,7 +294,8 @@ "ru": "{email}", "ja": "{email}", "eo": "{email}", - "nl": "{email}" + "nl": "{email}", + "de": "{email}" }, "question": { "en": "What is the email address of this shop?", @@ -318,7 +319,8 @@ "ru": "{opening_hours_table(opening_hours)}", "ja": "{opening_hours_table(opening_hours)}", "nl": "{opening_hours_table(opening_hours)}", - "ca": "{opening_hours_table(opening_hours)}" + "ca": "{opening_hours_table(opening_hours)}", + "de": "{opening_hours_table(opening_hours)}" }, "question": { "en": "What are the opening hours of this shop?", @@ -374,7 +376,8 @@ { "explanation": { "nl": "{title()} is permanent gestopt", - "en": "{title()} has closed down permanently" + "en": "{title()} has closed down permanently", + "de": "{title()} wurde dauerhaft geschlossen" }, "changesetMessage": "shop_closed" } diff --git a/assets/layers/slow_roads/slow_roads.json b/assets/layers/slow_roads/slow_roads.json index 1779abcb04..0e0a86b506 100644 --- a/assets/layers/slow_roads/slow_roads.json +++ b/assets/layers/slow_roads/slow_roads.json @@ -281,6 +281,7 @@ ], "description": { "en": "All carfree roads", - "nl": "Alle verkeersvrije wegen" + "nl": "Alle verkeersvrije wegen", + "de": "Alle autofreien Straßen" } } \ No newline at end of file diff --git a/assets/layers/street_lamps/street_lamps.json b/assets/layers/street_lamps/street_lamps.json index 4bbd7d1c31..5d65a0fa61 100644 --- a/assets/layers/street_lamps/street_lamps.json +++ b/assets/layers/street_lamps/street_lamps.json @@ -12,14 +12,16 @@ "title": { "render": { "en": "Street Lamp", - "nl": "Straatlantaarn" + "nl": "Straatlantaarn", + "de": "Straßenlaterne" }, "mappings": [ { "if": "ref~*", "then": { "en": "Street Lamp {ref}", - "nl": "Straatlantaarn {ref}" + "nl": "Straatlantaarn {ref}", + "de": "Straßenlaterne {ref}" } } ] @@ -44,7 +46,8 @@ { "title": { "en": "a street lamp", - "nl": "een straatlantaarn" + "nl": "een straatlantaarn", + "de": "eine Straßenlaterne" }, "tags": [ "highway=street_lamp" @@ -57,11 +60,13 @@ "id": "ref", "render": { "en": "This street lamp has the reference number {ref}", - "nl": "Deze straatlantaarn heeft het nummer {ref}" + "nl": "Deze straatlantaarn heeft het nummer {ref}", + "de": "Diese Straßenlaterne hat die Referenznummer {ref}" }, "question": { "en": "What is the reference number of this street lamp?", - "nl": "Wat is het nummer van deze straatlantaarn?" + "nl": "Wat is het nummer van deze straatlantaarn?", + "de": "Wie lautet die Referenznummer dieser Straßenlaterne?" }, "freeform": { "key": "ref" @@ -71,56 +76,64 @@ "id": "support", "question": { "en": "How is this street lamp mounted?", - "nl": "Hoe is deze straatlantaarn gemonteerd?" + "nl": "Hoe is deze straatlantaarn gemonteerd?", + "de": "Wie ist diese Straßenlaterne befestigt?" }, "mappings": [ { "if": "support=catenary", "then": { "en": "This lamp is suspended using cables", - "nl": "Deze lantaarn hangt aan kabels" + "nl": "Deze lantaarn hangt aan kabels", + "de": "Diese Straßenlaterne ist an einem Kabel aufgehängt" } }, { "if": "support=ceiling", "then": { "en": "This lamp is mounted on a ceiling", - "nl": "Deze lantaarn hangt aan een plafond" + "nl": "Deze lantaarn hangt aan een plafond", + "de": "Diese Straßenlaterne ist an einer Decke montiert" } }, { "if": "support=ground", "then": { "en": "This lamp is mounted in the ground", - "nl": "Deze lantaarn zit in de grond" + "nl": "Deze lantaarn zit in de grond", + "de": "Diese Straßenlaterne ist im Boden montiert" } }, { "if": "support=pedestal", "then": { "en": "This lamp is mounted on a short pole (mostly < 1.5m)", - "nl": "Deze lantaarn zit op een korte paal (meestal < 1.5m)" + "nl": "Deze lantaarn zit op een korte paal (meestal < 1.5m)", + "de": "Diese Straßenlaterne ist an einem kurzen Mast (< 1,5m) montiert" } }, { "if": "support=pole", "then": { "en": "This lamp is mounted on a pole", - "nl": "Deze lantaarn zit op een paal" + "nl": "Deze lantaarn zit op een paal", + "de": "Diese Straßenlaterne ist an einem Mast montiert" } }, { "if": "support=wall", "then": { "en": "This lamp is mounted directly to the wall", - "nl": "Deze lantaarn hangt direct aan de muur" + "nl": "Deze lantaarn hangt direct aan de muur", + "de": "Diese Straßenlaterne ist direkt an der Wand montiert" } }, { "if": "support=wall_mount", "then": { "en": "This lamp is mounted to the wall using a metal bar", - "nl": "Deze lantaarn hangt aan de muur met een metalen balk" + "nl": "Deze lantaarn hangt aan de muur met een metalen balk", + "de": "Diese Straßenlaterne ist mit einer Metallstange an der Wand montiert" } } ] @@ -129,7 +142,8 @@ "id": "lamp_mount", "question": { "en": "How is this lamp mounted to the pole?", - "nl": "Hoe zit deze lantaarn aan de paal?" + "nl": "Hoe zit deze lantaarn aan de paal?", + "de": "Wie ist diese Straßenlaterne am Mast befestigt?" }, "condition": "support=pole", "mappings": [ @@ -137,14 +151,16 @@ "if": "lamp_mount=straight_mast", "then": { "en": "This lamp sits atop of a straight mast", - "nl": "Deze lantaarn zit boven op een rechte paal" + "nl": "Deze lantaarn zit boven op een rechte paal", + "de": "Diese Straßenlaterne sitzt auf einem geraden Mast" } }, { "if": "lamp_mount=bent_mast", "then": { "en": "This lamp sits at the end of a bent mast", - "nl": "Deze lantaarn zit aan het eind van een gebogen paal" + "nl": "Deze lantaarn zit aan het eind van een gebogen paal", + "de": "Diese Straßenlaterne sitzt am Ende eines gebogenen Mastes" } } ] @@ -153,14 +169,16 @@ "id": "method", "question": { "en": "What kind of lighting does this lamp use?", - "nl": "Wat voor verlichting gebruikt deze lantaarn?" + "nl": "Wat voor verlichting gebruikt deze lantaarn?", + "de": "Mit welcher Art von Beleuchtung arbeitet diese Straßenlaterne?" }, "mappings": [ { "if": "light:method=electric", "then": { "en": "This lamp is lit electrically", - "nl": "Deze lantaarn is elektrisch verlicht" + "nl": "Deze lantaarn is elektrisch verlicht", + "de": "Diese Straßenlaterne leuchtet elektrisch" }, "hideInAnswer": true }, @@ -168,77 +186,88 @@ "if": "light:method=LED", "then": { "en": "This lamp uses LEDs", - "nl": "Deze lantaarn gebruikt LEDs" + "nl": "Deze lantaarn gebruikt LEDs", + "de": "Diese Straßenlaterne verwendet LEDs" } }, { "if": "light:method=incandescent", "then": { "en": "This lamp uses incandescent lighting", - "nl": "Deze lantaarn gebruikt gloeilampen" + "nl": "Deze lantaarn gebruikt gloeilampen", + "de": "Diese Straßenlaterne verwendet Glühlampenlicht" } }, { "if": "light:method=halogen", "then": { "en": "This lamp uses halogen lighting", - "nl": "Deze lantaarn gebruikt halogeen verlichting" + "nl": "Deze lantaarn gebruikt halogeen verlichting", + "de": "Diese Straßenlaterne verwendet Halogenlicht" } }, { "if": "light:method=discharge", "then": { "en": "This lamp uses discharge lamps (unknown type)", - "nl": "Deze lantaarn gebruikt gasontladingslampen (onbekend type)" + "nl": "Deze lantaarn gebruikt gasontladingslampen (onbekend type)", + "de": "Diese Straßenlaterne verwendet Entladungslampen (unbekannter Typ)" } }, { "if": "light:method=mercury", "then": { "en": "This lamp uses a mercury-vapour lamp (lightly blueish)", - "nl": "Deze lantaarn gebruikt een kwiklamp (enigszins blauwachtig)" + "nl": "Deze lantaarn gebruikt een kwiklamp (enigszins blauwachtig)", + "de": "Diese Straßenlaterne verwendet eine Quecksilberdampflampe (leicht bläulich)" } }, { "if": "light:method=metal-halide", "then": { "en": "This lamp uses metal-halide lamps (bright white)", - "nl": "Deze lantaarn gebruikt metaalhalidelampen" + "nl": "Deze lantaarn gebruikt metaalhalidelampen", + "de": "Diese Straßenlaterne verwendet Halogen-Metalldampflampen (hellweiß)" } }, { "if": "light:method=fluorescent", "then": { "en": "This lamp uses fluorescent lighting", - "nl": "Deze lantaarn gebruikt fluorescentieverlichting (TL en spaarlamp)" + "nl": "Deze lantaarn gebruikt fluorescentieverlichting (TL en spaarlamp)", + "de": "Diese Straßenlaterne verwendet Leuchtstoffröhren" } }, { "if": "light:method=sodium", "then": { "en": "This lamp uses sodium lamps (unknown type)", - "nl": "Deze lantaarn gebruikt natriumlampen (onbekend type)" + "nl": "Deze lantaarn gebruikt natriumlampen (onbekend type)", + "de": "Diese Straßenlaterne verwendet Natriumdampflampen (unbekannter Typ)" } }, { "if": "light:method=low_pressure_sodium", "then": { "en": "This lamp uses low pressure sodium lamps (monochrome orange)", - "nl": "Deze lantaarn gebruikt lagedruknatriumlampen (monochroom oranje)" + "nl": "Deze lantaarn gebruikt lagedruknatriumlampen (monochroom oranje)", + "de": "Diese Straßenlaterne verwendet Niederdruck-Natriumdampflampen (einfarbig orange)" } }, { "if": "light:method=high_pressure_sodium", "then": { "en": "This lamp uses high pressure sodium lamps (orange with white)", - "nl": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)" + "nl": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)", + "de": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" } }, { "if": "light:method=gas", "then": { "en": "This lamp is lit using gas", - "nl": "Deze lantaarn wordt verlicht met gas" + "nl": "Deze lantaarn wordt verlicht met gas", + "de": "Diese Straßenlaterne wird mit Gas beleuchtet" } } ] @@ -247,11 +276,13 @@ "id": "colour", "question": { "en": "What colour light does this lamp emit?", - "nl": "Wat voor kleur licht geeft deze lantaarn?" + "nl": "Wat voor kleur licht geeft deze lantaarn?", + "de": "Welche Lichtfarbe strahlt diese Lampe aus?" }, "render": { "en": "This lamp emits {light:colour} light", - "nl": "Deze lantaarn geeft {light:colour} licht" + "nl": "Deze lantaarn geeft {light:colour} licht", + "de": "Diese Lampe strahlt {light:colour} Licht aus" }, "freeform": { "key": "light:colour", @@ -262,21 +293,24 @@ "if": "light:colour=white", "then": { "en": "This lamp emits white light", - "nl": "Deze lantaarn geeft wit licht" + "nl": "Deze lantaarn geeft wit licht", + "de": "Diese Lampe strahlt weißes Licht aus" } }, { "if": "light:colour=green", "then": { "en": "This lamp emits green light", - "nl": "Deze lantaarn geeft groen licht" + "nl": "Deze lantaarn geeft groen licht", + "de": "Diese Lampe strahlt grünes Licht aus" } }, { "if": "light:colour=orange", "then": { "en": "This lamp emits orange light", - "nl": "Deze lantaarn geeft oranje licht" + "nl": "Deze lantaarn geeft oranje licht", + "de": "Diese Lampe strahlt orangefarbenes Licht aus" } } ] @@ -285,11 +319,13 @@ "id": "count", "render": { "en": "This lamp has {light:count} fixtures", - "nl": "Deze lantaarn heeft {light:count} lampen" + "nl": "Deze lantaarn heeft {light:count} lampen", + "de": "Diese Straßenlaterne hat {light:count} Leuchten" }, "question": { "en": "How many fixtures does this light have?", - "nl": "Hoeveel lampen heeft deze lantaarn?" + "nl": "Hoeveel lampen heeft deze lantaarn?", + "de": "Wie viele Leuchten hat diese Straßenlaterne?" }, "condition": "support=pole", "freeform": { @@ -301,14 +337,16 @@ "if": "light:count=1", "then": { "en": "This lamp has 1 fixture", - "nl": "Deze lantaarn heeft 1 lamp" + "nl": "Deze lantaarn heeft 1 lamp", + "de": "Diese Straßenlaterne hat 1 Leuchte" } }, { "if": "light:count=2", "then": { "en": "This lamp has 2 fixtures", - "nl": "Deze lantaarn heeft 2 lampen" + "nl": "Deze lantaarn heeft 2 lampen", + "de": "Diese Straßenlaterne hat 2 Leuchten" } } ] @@ -317,35 +355,40 @@ "id": "lit", "question": { "en": "When is this lamp lit?", - "nl": "Wanneer is deze lantaarn verlicht?" + "nl": "Wanneer is deze lantaarn verlicht?", + "de": "Wann leuchtet diese Straßenlaterne?" }, "mappings": [ { "if": "light:lit=dusk-dawn", "then": { "en": "This lamp is lit at night", - "nl": "Deze lantaarn is 's nachts verlicht" + "nl": "Deze lantaarn is 's nachts verlicht", + "de": "Diese Straßenlaterne leuchtet nachts" } }, { "if": "light:lit=24/7", "then": { "en": "This lamp is lit 24/7", - "nl": "Deze lantaarn is 24/7 verlicht" + "nl": "Deze lantaarn is 24/7 verlicht", + "de": "Diese Straßenlaterne leuchtet durchgehend" } }, { "if": "light:lit=motion", "then": { "en": "This lamp is lit based on motion", - "nl": "Deze lantaarn is verlicht op basis van beweging" + "nl": "Deze lantaarn is verlicht op basis van beweging", + "de": "Diese Straßenlaterne leuchtet bewegungsgesteuert" } }, { "if": "light:lit=demand", "then": { "en": "This lamp is lit based on demand (e.g. with a pushbutton)", - "nl": "Deze lantaarn is verlicht op verzoek (bijv. met een drukknop)" + "nl": "Deze lantaarn is verlicht op verzoek (bijv. met een drukknop)", + "de": "Diese Straßenlaterne leuchtet bei Bedarf (z. B. mit einem Taster)" } } ] @@ -354,11 +397,13 @@ "id": "direction", "render": { "en": "This lamp points towards {light:direction}", - "nl": "Deze lantaarn is gericht naar {light:direction}" + "nl": "Deze lantaarn is gericht naar {light:direction}", + "de": "Diese Straßenlaterne leuchtet in Richtung {light:direction}" }, "question": { "en": "Where does this lamp point to?", - "nl": "Waar is deze lamp heengericht?" + "nl": "Waar is deze lamp heengericht?", + "de": "Wohin leuchtet diese Straßenlaterne?" }, "condition": "light:count=1", "freeform": { @@ -374,6 +419,7 @@ }, "description": { "en": "A layer showing street lights", - "nl": "Een laag die alle straatlantaarns toont" + "nl": "Een laag die alle straatlantaarns toont", + "de": "Eine Ebene mit Straßenbeleuchtung" } } \ No newline at end of file diff --git a/assets/layers/surveillance_camera/surveillance_camera.json b/assets/layers/surveillance_camera/surveillance_camera.json index 12d5287fcd..a1e789544c 100644 --- a/assets/layers/surveillance_camera/surveillance_camera.json +++ b/assets/layers/surveillance_camera/surveillance_camera.json @@ -106,7 +106,8 @@ "en": "Films to a compass heading of {camera:direction}", "nl": "Filmt in kompasrichting {camera:direction}", "fr": "Filme dans une direction {camera:direction}", - "it": "Punta in direzione {camera:direction}" + "it": "Punta in direzione {camera:direction}", + "de": "filmt in Himmelsrichtung {camera:direction}" }, "condition": { "or": [ @@ -137,7 +138,8 @@ "en": "Films to a compass heading of {direction}", "nl": "Filmt in kompasrichting {direction}", "fr": "Filme dans une direction {direction}", - "it": "Punta in direzione {direction}" + "it": "Punta in direzione {direction}", + "de": "filmt in Himmelsrichtung {direction}" }, "hideInAnswer": true } @@ -463,7 +465,8 @@ ], "title": { "en": "a surveillance camera", - "nl": "een bewakingscamera" + "nl": "een bewakingscamera", + "de": "eine Überwachungskamera" } }, { @@ -474,7 +477,8 @@ ], "title": { "en": "a surveillance camera mounted on a wall", - "nl": "een bewakingscamera gemonteerd op een muur" + "nl": "een bewakingscamera gemonteerd op een muur", + "de": "eine an einer Wand montierte Überwachungskamera" }, "preciseInput": { "snapToLayer": "walls_and_buildings" @@ -543,6 +547,7 @@ ], "description": { "en": "This layer shows surveillance cameras and allows a contributor to update information and add new cameras", - "nl": "Deze laag toont bewakingscamera's en laat toe om de informatie te verrijken en om nieuwe camera\"s toe te voegen" + "nl": "Deze laag toont bewakingscamera's en laat toe om de informatie te verrijken en om nieuwe camera\"s toe te voegen", + "de": "Diese Ebene zeigt die Überwachungskameras an und ermöglicht es, Informationen zu aktualisieren und neue Kameras hinzuzufügen" } } \ No newline at end of file diff --git a/assets/layers/toilet/toilet.json b/assets/layers/toilet/toilet.json index 10ede6fa7b..c485e06c68 100644 --- a/assets/layers/toilet/toilet.json +++ b/assets/layers/toilet/toilet.json @@ -209,7 +209,8 @@ "id": "Opening-hours", "question": { "en": "When are these toilets opened?", - "nl": "Wanneer zijn deze toiletten open?" + "nl": "Wanneer zijn deze toiletten open?", + "de": "Wann sind diese Toiletten geöffnet?" }, "render": "{opening_hours_table()}", "freeform": { @@ -221,7 +222,8 @@ "if": "opening_hours=24/7", "then": { "en": "Opened 24/7", - "nl": "Altijd open" + "nl": "Altijd open", + "de": "Durchgehend geöffnet" } } ] @@ -445,7 +447,8 @@ "if": "toilets:paper_supplied=yes", "then": { "en": "This toilet is equipped with toilet paper", - "nl": "Deze toilet is voorzien van toiletpapier" + "nl": "Deze toilet is voorzien van toiletpapier", + "de": "Diese Toilette ist mit Toilettenpapier ausgestattet" } }, { @@ -579,6 +582,7 @@ ], "description": { "en": "A layer showing (public) toilets", - "nl": "Een laag die publieke toiletten toont" + "nl": "Een laag die publieke toiletten toont", + "de": "Eine Ebene mit (öffentlichen) Toiletten" } } \ No newline at end of file diff --git a/assets/layers/tree_node/tree_node.json b/assets/layers/tree_node/tree_node.json index dcc8223bb1..0931dde3f6 100644 --- a/assets/layers/tree_node/tree_node.json +++ b/assets/layers/tree_node/tree_node.json @@ -7,7 +7,8 @@ "ru": "Дерево", "fr": "Arbre", "de": "Bäume", - "ca": "Arbre" + "ca": "Arbre", + "es": "Árbol" }, "minzoom": 16, "source": { @@ -26,13 +27,36 @@ "fr": "Arbre", "de": "Baum", "eo": "Arbo", - "ca": "Arbre" + "ca": "Arbre", + "es": "Árbol" }, "mappings": [ { - "if": "name~*", + "if": { + "and": ["name~*","species:wikidata~*"] + }, "then": { - "*": "{name}" + "*": "{name} ({wikidata_label(species:wikidata)})" + } + }, + { + "if": { + "and": ["name~*"] + }, + "then": { + "*": "{name}" + } + }, + { + "if": "species:wikidata~*", + "then": { + "*": "{wikidata_label(species:wikidata)}" + } + }, + { + "if": "species~*", + "then": { + "*": "{species}" } } ] @@ -47,7 +71,8 @@ "it": "Altezza: {height}", "ru": "Высота: {height}", "fr": "Hauteur : {height}", - "de": "Höhe: {height}" + "de": "Höhe: {height}", + "es": "Altura: {height}" }, "condition": { "and": [ @@ -67,7 +92,8 @@ "it": "Altezza: {height} m", "ru": "Высота: {height} м", "fr": "Hauteur : {height} m", - "de": "Höhe: {height} m" + "de": "Höhe: {height} m", + "es": "Altura: {height} m" } } ] @@ -79,7 +105,8 @@ "en": "Is this a broadleaved or needleleaved tree?", "it": "Si tratta di un albero latifoglia o aghifoglia?", "fr": "Cet arbre est-il un feuillu ou un résineux ?", - "de": "Ist dies ein Laub- oder Nadelbaum?" + "de": "Ist dies ein Laub- oder Nadelbaum?", + "es": "¿Es un árbol de hoja ancha o de hoja aguja?" }, "mappings": [ { @@ -94,7 +121,8 @@ "it": "Latifoglia", "fr": "Feuillu", "de": "Laubbaum", - "ca": "De fulla ampla" + "ca": "De fulla ampla", + "es": "Latifoliada" }, "icon": { "path": "./assets/themes/trees/broadleaved.svg", @@ -113,7 +141,8 @@ "it": "Aghifoglia", "fr": "Résineux", "de": "Nadelbaum", - "ca": "Amb fulles d'agulla" + "ca": "Amb fulles d'agulla", + "es": "Hoja aguja" }, "icon": { "path": "./assets/themes/trees/needleleaved.svg", @@ -131,7 +160,8 @@ "en": "Permanently leafless", "it": "Privo di foglie (permanente)", "fr": "Sans feuilles (Permanent)", - "de": "Dauerhaft blattlos" + "de": "Dauerhaft blattlos", + "es": "Permanentemente sin hojas" }, "hideInAnswer": true, "icon": { @@ -148,7 +178,8 @@ "en": "How significant is this tree? Choose the first answer that applies.", "it": "Quanto significativo è questo albero? Scegli la prima risposta che corrisponde.", "fr": "Quelle est l'importance de cet arbre ? Choisissez la première réponse qui s'applique.", - "de": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft." + "de": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft.", + "es": "¿Qué importancia tiene este árbol? Elige la primera respuesta que corresponda." }, "mappings": [ { @@ -162,7 +193,8 @@ "en": "The tree is remarkable due to its size or prominent location. It is useful for navigation.", "it": "È un albero notevole per le sue dimensioni o per la posizione prominente. È utile alla navigazione.", "fr": "L'arbre est remarquable en raison de sa taille ou de son emplacement proéminent. Il est utile pour la navigation.", - "de": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung." + "de": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung.", + "es": "El árbol es notable debido a su tamaño o ubicación prominente. Es útil para la navegación." } }, { @@ -176,7 +208,8 @@ "en": "The tree is a natural monument, e.g. because it is especially old, or of a valuable species.", "it": "L’albero è un monumento naturale, ad esempio perché specialmente antico o appartenente a specie importanti.", "fr": "Cet arbre est un monument naturel (ex : âge, espèce, etc…)", - "de": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört." + "de": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört.", + "es": "El árbol es un monumento natural, por ejemplo, porque es especialmente antiguo, o de una especie valiosa." } }, { @@ -190,7 +223,8 @@ "en": "The tree is used for agricultural purposes, e.g. in an orchard.", "it": "L’albero è usato per scopi agricoli, ad esempio in un frutteto.", "fr": "Cet arbre est utilisé à but d’agriculture (ex : dans un verger)", - "de": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage." + "de": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage.", + "es": "El árbol se utiliza con fines agrícolas, por ejemplo, en un huerto." } }, { @@ -204,7 +238,8 @@ "en": "The tree is in a park or similar (cemetery, school grounds, …).", "it": "L’albero è in un parco o qualcosa di simile (cimitero, aree didattiche, etc.).", "fr": "Cet arbre est dans un parc ou une aire similaire (ex : cimetière, cour d’école, …).", - "de": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)." + "de": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...).", + "es": "El árbol está en un parque o similar (cementerio, recinto escolar, ...)." } }, { @@ -217,7 +252,9 @@ "nl": "De boom staat in de tuin bij een woning/flatgebouw.", "en": "The tree is a residential garden.", "it": "L’albero è un giardino residenziale.", - "fr": "Cet arbre est dans une cour résidentielle." + "fr": "Cet arbre est dans une cour résidentielle.", + "es": "El árbol está en un jardín privado o residencial.", + "de": "Der Baum steht in einem Wohngarten." } }, { @@ -231,7 +268,8 @@ "en": "This is a tree along an avenue.", "it": "Fa parte di un viale alberato.", "fr": "C'est un arbre le long d'une avenue.", - "de": "Dieser Baum steht entlang einer Straße." + "de": "Dieser Baum steht entlang einer Straße.", + "es": "El árbol está en bandejón de una avenida." } }, { @@ -244,7 +282,9 @@ "nl": "De boom staat in een woonkern.", "en": "The tree is an urban area.", "it": "L’albero si trova in un’area urbana.", - "fr": "L'arbre est une zone urbaine." + "fr": "L'arbre est une zone urbaine.", + "es": "El árbol está en un zona urbana.", + "de": "Der Baum steht in einem städtischen Gebiet." } }, { @@ -258,7 +298,8 @@ "en": "The tree is outside of an urban area.", "it": "L’albero si trova fuori dall’area urbana.", "fr": "Cet arbre est en zone rurale.", - "de": "Dieser Baum steht außerhalb eines städtischen Gebiets." + "de": "Dieser Baum steht außerhalb eines städtischen Gebiets.", + "es": "El árbol está fuera de una zona urbana." } } ] @@ -271,7 +312,8 @@ "it": "È un sempreverde o caduco?", "ru": "Это дерево вечнозелёное или листопадное?", "fr": "L’arbre est-il à feuillage persistant ou caduc ?", - "de": "Ist dies ein Nadelbaum oder ein Laubbaum?" + "de": "Ist dies ein Nadelbaum oder ein Laubbaum?", + "es": "¿El árbol es Siempreverde o Caduco?" }, "mappings": [ { @@ -286,7 +328,8 @@ "it": "Caduco: l’albero perde le sue foglie per un periodo dell’anno.", "ru": "Листопадное: у дерева опадают листья в определённое время года.", "fr": "Caduc : l’arbre perd son feuillage une partie de l’année.", - "de": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter." + "de": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter.", + "es": "Caduco o Deciduo: el árbol pierde las hojas en un período del año" } }, { @@ -302,7 +345,8 @@ "fr": "À feuilles persistantes.", "ru": "Вечнозелёное.", "de": "immergrüner Baum.", - "ca": "Perenne." + "ca": "Perenne.", + "es": "Siempreverde." } } ], @@ -312,6 +356,41 @@ ] } }, + { + "id": "tree-species-wikidata", + "question": { + "en": "What species is this tree?" + }, + "render": { + "*": "{wikipedia(species:wikidata):max-height: 25rem}" + }, + "freeform": { + "key": "species:wikidata", + "type": "wikidata", + "helperArgs": [ + "species", + { + "instanceOf": [ + 10884, + 16521 + ] + } + ] + } + }, + { + "id": "tree-wikipedia", + "#": "If this tree has a wikipedia article, show it. People can _only_ set the species though!", + "render": { + "*": "{wikipedia()}" + }, + "condition": { + "or": [ + "wikipedia~*", + "wikidata~*" + ] + } + }, { "render": { "nl": "Naam: {name}", @@ -329,7 +408,8 @@ "it": "L’albero ha un nome?", "fr": "L'arbre a-t-il un nom ?", "ru": "Есть ли у этого дерева название?", - "de": "Hat der Baum einen Namen?" + "de": "Hat der Baum einen Namen?", + "es": "El árbol no tiene nombre?." }, "freeform": { "key": "name", @@ -351,7 +431,8 @@ "it": "L’albero non ha un nome.", "fr": "L'arbre n'a pas de nom.", "ru": "У этого дерева нет названия.", - "de": "Der Baum hat keinen Namen." + "de": "Der Baum hat keinen Namen.", + "es": "No identificas la especie." } } ], @@ -371,7 +452,8 @@ "en": "Is this tree registered heritage?", "it": "Quest’albero è registrato come patrimonio?", "fr": "Cet arbre est-il inscrit au patrimoine ?", - "de": "Ist dieser Baum ein Naturdenkmal?" + "de": "Ist dieser Baum ein Naturdenkmal?", + "es": "¿Este árbol es patrimonio registrado?" }, "mappings": [ { @@ -386,7 +468,8 @@ "en": "Registered as heritage by Onroerend Erfgoed Flanders", "it": "Registrato come patrimonio da Onroerend Erfgoed Flanders", "fr": "Fait partie du patrimoine par Onroerend Erfgoed", - "de": "Als Denkmal registriert von der Onroerend Erfgoed Flandern" + "de": "Als Denkmal registriert von der Onroerend Erfgoed Flandern", + "es": "Registrado como patrimonio por Onroerend Erfgoed Flandes" }, "icon": { "path": "./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg", @@ -405,7 +488,8 @@ "en": "Registered as heritage by Direction du Patrimoine culturel Brussels", "it": "Registrato come patrimonio da Direction du Patrimoine culturel di Bruxelles", "fr": "Enregistré comme patrimoine par la Direction du Patrimoine culturel Bruxelles", - "de": "Als Denkmal registriert von der Direction du Patrimoine culturel Brüssel" + "de": "Als Denkmal registriert von der Direction du Patrimoine culturel Brüssel", + "es": "Registrado como patrimonio por la Dirección de Patrimonio Cultural de Bruselas" } }, { @@ -420,7 +504,8 @@ "en": "Registered as heritage by a different organisation", "it": "Registrato come patrimonio da un’organizzazione differente", "fr": "Enregistré comme patrimoine par une autre organisation", - "de": "Von einer anderen Organisation als Denkmal registriert" + "de": "Von einer anderen Organisation als Denkmal registriert", + "es": "Registrado como patrimonio por una organización diferente" } }, { @@ -435,7 +520,8 @@ "en": "Not registered as heritage", "it": "Non è registrato come patrimonio", "fr": "Non enregistré comme patrimoine", - "de": "Nicht als Denkmal registriert" + "de": "Nicht als Denkmal registriert", + "es": "No registrado como patrimonio" } }, { @@ -449,7 +535,8 @@ "en": "Registered as heritage by a different organisation", "it": "Registrato come patrimonio da un’organizzazione differente", "fr": "Enregistré comme patrimoine par une autre organisation", - "de": "Von einer anderen Organisation als Denkmal registriert" + "de": "Von einer anderen Organisation als Denkmal registriert", + "es": "Registrado como patrimonio por un organización diferente" }, "hideInAnswer": true } @@ -467,14 +554,16 @@ "en": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", "it": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", "ru": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", - "fr": "\"\"/ Identifiant Onroerend Erfgoed : {ref:OnroerendErfgoed}" + "fr": "\"\"/ Identifiant Onroerend Erfgoed : {ref:OnroerendErfgoed}", + "de": "\"\"/ Onroerend Erfgoed Kennung: {ref:OnroerendErfgoed}" }, "question": { "nl": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?", "en": "What is the ID issued by Onroerend Erfgoed Flanders?", "it": "Qual è l’ID rilasciato da Onroerend Erfgoed Flanders?", "fr": "Quel est son identifiant donné par Onroerend Erfgoed ?", - "de": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?" + "de": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?", + "es": "¿Cuál es la identificación emitida por Onroerend Erfgoed Flandes?" }, "freeform": { "key": "ref:OnroerendErfgoed", @@ -495,14 +584,16 @@ "it": "\"\"/ Wikidata: {wikidata}", "ru": "\"\"/ Wikidata: {wikidata}", "fr": "\"\"/ Wikidata : {wikidata}", - "de": "\"\"/ Wikidata: {wikidata}" + "de": "\"\"/ Wikidata: {wikidata}", + "es": "\"\"/ Wikidata: {wikidata}" }, "question": { "nl": "Wat is het Wikidata-ID van deze boom?", "en": "What is the Wikidata ID for this tree?", "it": "Qual è l’ID Wikidata per questo albero?", "fr": "Quel est l'identifiant Wikidata de cet arbre ?", - "de": "Was ist das passende Wikidata Element zu diesem Baum?" + "de": "Was ist das passende Wikidata Element zu diesem Baum?", + "es": "¿Cuál es el ID de Wikidata para este árbol?" }, "freeform": { "key": "wikidata", @@ -530,14 +621,16 @@ "it": "una albero latifoglia", "fr": "une arbre feuillu", "ru": "Лиственное дерево", - "de": "eine laubbaum" + "de": "eine laubbaum", + "es": "árbol de hoja ancha" }, "description": { "nl": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.", "en": "A tree of a species with leaves, such as oak or populus.", "it": "Un albero di una specie con foglie larghe come la quercia o il pioppo.", "fr": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier.", - "de": "Ein Baum mit Blättern, z. B. Eiche oder Buche." + "de": "Ein Baum mit Blättern, z. B. Eiche oder Buche.", + "es": "Un árbol de hojas como el Roble o el Álamo." }, "preciseInput": { "preferredBackground": "photo" @@ -554,7 +647,8 @@ "it": "una albero aghifoglia", "ru": "Хвойное дерево", "fr": "une arbre résineux", - "de": "eine nadelbaum" + "de": "eine nadelbaum", + "es": "Árbol tipo Conífera" }, "description": { "nl": "Een boom van een soort met naalden, bijvoorbeeld den of spar.", @@ -562,7 +656,8 @@ "it": "Un albero di una specie con aghi come il pino o l’abete.", "ru": "Дерево с хвоей (иглами), например, сосна или ель.", "fr": "Une espèce d’arbre avec des épines comme le pin ou l’épicéa.", - "de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte." + "de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte.", + "es": "Un árbol de hojas agujas, como el Pino o el Abeto." }, "preciseInput": { "preferredBackground": "photo" @@ -580,7 +675,8 @@ "fr": "une arbre", "id": "Pohon", "de": "eine baum", - "ca": "un arbre" + "ca": "un arbre", + "es": "un árbol" }, "description": { "nl": "Wanneer je niet zeker bent of het nu een loof- of naaldboom is.", @@ -588,7 +684,8 @@ "it": "Qualora non si sia sicuri se si tratta di un albero latifoglia o aghifoglia.", "fr": "Si vous n'êtes pas sûr(e) de savoir s'il s'agit d'un arbre à feuilles larges ou à aiguilles.", "ru": "Если вы не уверены в том, лиственное это дерево или хвойное.", - "de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt." + "de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt.", + "es": "Si no estás seguro de si es un árbol de hoja ancha o de hoja de aguja." }, "preciseInput": { "preferredBackground": "photo" @@ -636,6 +733,8 @@ ], "description": { "en": "A layer showing trees", - "nl": "Een laag die bomen toont" + "nl": "Een laag die bomen toont", + "es": "Una capa que muestra árboles", + "de": "Eine Ebene, die Bäume zeigt" } } \ No newline at end of file diff --git a/assets/layers/village_green/village_green.json b/assets/layers/village_green/village_green.json index 1cbd49f409..b5d095f3eb 100644 --- a/assets/layers/village_green/village_green.json +++ b/assets/layers/village_green/village_green.json @@ -47,6 +47,7 @@ ], "description": { "en": "A layer showing village-green (which are communal green areas, but not quite parks)", - "nl": "Een laag die dorpsgroen toont (gemeenschapsgroen, maar niet echt een park)" + "nl": "Een laag die dorpsgroen toont (gemeenschapsgroen, maar niet echt een park)", + "de": "Eine Ebene mit Dorfangern (kommunale Grünflächen, aber nicht wirklich Parks)" } } \ No newline at end of file diff --git a/assets/layers/walls_and_buildings/walls_and_buildings.json b/assets/layers/walls_and_buildings/walls_and_buildings.json index cb71301cf7..48638c38d7 100644 --- a/assets/layers/walls_and_buildings/walls_and_buildings.json +++ b/assets/layers/walls_and_buildings/walls_and_buildings.json @@ -4,12 +4,14 @@ "title": { "render": { "en": "Wall or building", - "nl": "Muur of gebouw" + "nl": "Muur of gebouw", + "de": "Wand oder Gebäude" } }, "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.", - "nl": "Speciale laag met alle muren en gebouwen. Deze laag is nuttig om objecten toe te voegen die met een muur verbonden zijn (zoals AEDs, brievenbussen, adressen, bewakingscamera's,...). Deze laag is standaard onzichtbaar en kan niet aangezet worden door de gebruiker." + "nl": "Speciale laag met alle muren en gebouwen. Deze laag is nuttig om objecten toe te voegen die met een muur verbonden zijn (zoals AEDs, brievenbussen, adressen, bewakingscamera's,...). Deze laag is standaard onzichtbaar en kan niet aangezet worden door de gebruiker.", + "de": "Spezielle eingebaute Ebene, die alle Wände und Gebäude bereitstellt. Diese Ebene ist in Voreinstellungen für Objekte nützlich, die an Wänden platziert werden können (z. B. AEDs, Briefkästen, Eingänge, Adressen, Überwachungskameras, ...). Diese Ebene ist standardmäßig unsichtbar und kann vom Benutzer nicht umgeschaltet werden." }, "source": { "osmTags": { diff --git a/assets/layers/waste_basket/waste_basket.json b/assets/layers/waste_basket/waste_basket.json index f0cda12055..67d9687021 100644 --- a/assets/layers/waste_basket/waste_basket.json +++ b/assets/layers/waste_basket/waste_basket.json @@ -31,6 +31,7 @@ "de": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können." }, "tagRenderings": [ + "images", { "id": "waste-basket-waste-types", "question": { diff --git a/assets/layers/waste_disposal/waste_disposal.json b/assets/layers/waste_disposal/waste_disposal.json index 9e9322ef12..286f074f67 100644 --- a/assets/layers/waste_disposal/waste_disposal.json +++ b/assets/layers/waste_disposal/waste_disposal.json @@ -2,11 +2,13 @@ "id": "waste_disposal", "name": { "en": "Waste Disposal Bins", - "nl": "Afvalcontainers voor huishoudelijk afval" + "nl": "Afvalcontainers voor huishoudelijk afval", + "de": "Mülleimer" }, "description": { "en": "Waste Disposal Bin, medium to large bin for disposal of (household) waste", - "nl": "Een grote afvalcontainer voor (huishoudelijk) afval" + "nl": "Een grote afvalcontainer voor (huishoudelijk) afval", + "de": "Entsorgungsbehälter, mittlerer bis großer Behälter zur Entsorgung von (Haushalts-)Abfällen" }, "source": { "osmTags": "amenity=waste_disposal" @@ -16,7 +18,8 @@ "title": { "render": { "en": "Waste Disposal", - "nl": "Afvalbak" + "nl": "Afvalbak", + "de": "Abfallentsorgung" } }, "mapRendering": [ @@ -32,14 +35,16 @@ { "title": { "en": "a waste disposal bin", - "nl": "Een afvalcontainer" + "nl": "Een afvalcontainer", + "de": "ein Abfalleimer" }, "tags": [ "amenity=waste_disposal" ], "description": { "en": "Medium to large bin for disposal of (household) waste", - "nl": "middelgrote of grote afvalcontainer voor (huishoudelijk) afval" + "nl": "middelgrote of grote afvalcontainer voor (huishoudelijk) afval", + "de": "Mittlere bis große Mülltonne für die Entsorgung von (Haushalts-)Abfällen" } } ], @@ -48,11 +53,13 @@ "id": "access", "render": { "en": "Access: {access}", - "nl": "Toegankelijk voor {access}" + "nl": "Toegankelijk voor {access}", + "de": "Zugang: {access}" }, "question": { "en": "Who can use this waste disposal bin?", - "nl": "Wie mag deze afvalcontainer gebruiken?" + "nl": "Wie mag deze afvalcontainer gebruiken?", + "de": "Wer kann diese Mülltonne benutzen?" }, "freeform": { "key": "access", @@ -63,21 +70,24 @@ "if": "access=yes", "then": { "en": "This bin can be used by anyone", - "nl": "Iedereen mag deze afvalcontainer gebruiken" + "nl": "Iedereen mag deze afvalcontainer gebruiken", + "de": "Dieser Behälter kann von jedem benutzt werden" } }, { "if": "access=no", "then": { "en": "This bin is private", - "nl": "Deze afvalcontainer is enkel voor privaat gebruik" + "nl": "Deze afvalcontainer is enkel voor privaat gebruik", + "de": "Dieser Behälter ist privat" } }, { "if": "access=residents", "then": { "en": "This bin is only for residents", - "nl": "Enkel bewoners mogen deze afvalcontainer gebruiken" + "nl": "Enkel bewoners mogen deze afvalcontainer gebruiken", + "de": "Diese Mülltonne ist nur für Anwohner" } } ] @@ -86,28 +96,32 @@ "id": "disposal-location", "question": { "en": "Where is this container located?", - "nl": "Waar bevindt deze container zich?" + "nl": "Waar bevindt deze container zich?", + "de": "Wo befindet sich dieser Container?" }, "mappings": [ { "if": "location=underground", "then": { "en": "This is an underground container", - "nl": "Dit is een ondergrondse container" + "nl": "Dit is een ondergrondse container", + "de": "Dies ist ein unterirdischer Container" } }, { "if": "location=indoor", "then": { "en": "This container is located indoors", - "nl": "Deze container bevindt zich binnen" + "nl": "Deze container bevindt zich binnen", + "de": "Dieser Container befindet sich in einem Gebäude" } }, { "if": "location=", "then": { "en": "This container is located outdoors", - "nl": "Deze container is buiten" + "nl": "Deze container is buiten", + "de": "Dieser Container befindet sich im Freien" } } ] @@ -120,7 +134,8 @@ { "question": { "en": "Only public access", - "nl": "Enkel publiek toegankelijke afvalcontainers" + "nl": "Enkel publiek toegankelijke afvalcontainers", + "de": "Nur öffentlich zugänglich" }, "osmTags": "access=yes" } diff --git a/assets/layers/windturbine/windturbine.json b/assets/layers/windturbine/windturbine.json index 334d611c86..3e51ea7e17 100644 --- a/assets/layers/windturbine/windturbine.json +++ b/assets/layers/windturbine/windturbine.json @@ -9,6 +9,9 @@ "zh_Hant": "風機", "hu": "Szélerőmű" }, + "description": { + "en": "Modern windmills generating electricity" + }, "source": { "osmTags": "generator:source=wind" }, diff --git a/assets/tagRenderings/questions.json b/assets/tagRenderings/questions.json index 74b905f2bf..55620b18d4 100644 --- a/assets/tagRenderings/questions.json +++ b/assets/tagRenderings/questions.json @@ -28,7 +28,9 @@ "zh_Hant": "對應的維基資料項目是?", "pl": "Jaki jest powiązany obiekt Wikidata?", "ja": "対応するウィキデータのエンティティは何ですか?", - "fil": "Ano ang nau-ukol na entidad sa Wikidata?" + "fil": "Ano ang nau-ukol na entidad sa Wikidata?", + "es": "¿Cual es la entidad de Wikidata que se corresponde?", + "zh_Hans": "在Wikidata上对应的实体是什么?" }, "mappings": [ { @@ -48,7 +50,9 @@ "ru": "Никакой страницы на Википедии не было прикреплено", "pl": "Link do strony Wikipedii nie został jeszcze określony", "ja": "ウィキペディアのページはまだリンクされていません", - "fil": "Wala pang kawing ng Wikipedia page" + "fil": "Wala pang kawing ng Wikipedia page", + "es": "Todavía no se ha enlazado una página de wikipedia", + "zh_Hans": "尚未有连接到的维基百科页面" }, "hideInAnswer": true } @@ -84,7 +88,9 @@ "ca": "Quin és el telèfon de {title()}?", "ja": "{title()}の電話番号は?", "sl": "Kakšno telefonsko številko ima {title()}?", - "fil": "Ano ang telepono ng {title()}?" + "fil": "Ano ang telepono ng {title()}?", + "es": "¿Cuál es el número de teléfono de {title()}?", + "zh_Hans": "{title()} 的电话号码为何?" }, "render": "{phone}", "mappings": [ @@ -127,7 +133,9 @@ "fr": "Quel est l’élément Wikipédia correspondant ?", "pl": "Jaki jest link do strony Wikipedii?", "ja": "Wikipediaの該当項目は何ですか?", - "fil": "Ano ang nau-ukol na partida sa Wikipedia?" + "fil": "Ano ang nau-ukol na partida sa Wikipedia?", + "es": "¿Cual es el ítem correspondiente en Wikipedia?", + "zh_Hans": "在维基百科上对应的条目是什么?" }, "mappings": [ { @@ -146,7 +154,9 @@ "zh_Hant": "沒有連結到維基百科", "pl": "Brak linku do strony Wikipedii", "ja": "ウィキペディアと連動していない", - "fil": "Hindi naka-ugnay sa Wikipedia" + "fil": "Hindi naka-ugnay sa Wikipedia", + "es": "No enlazado con Wikipedia", + "zh_Hans": "不要连接到维基百科" } } ], @@ -176,7 +186,9 @@ "ca": "Quina és l'adreça de correu electrònic de {title()}?", "ja": "{title()}のEメールアドレスは何ですか?", "sl": "Kakšen naslov elektronske pošte ima {title()}?", - "fil": "Ano ang email address ng {title()}?" + "fil": "Ano ang email address ng {title()}?", + "es": "¿Cual es la direccióm de correo electrónico de {title()}?", + "zh_Hans": "{title()} 的电子邮箱地址为何?" }, "mappings": [ { @@ -213,7 +225,9 @@ "hu": "Mi a weboldala ennek: {title()}?", "ca": "Quina és la web de {title()}?", "ja": "{title()}のウェブサイトは?", - "fil": "Ano ang website ng {title()}?" + "fil": "Ano ang website ng {title()}?", + "es": "¿Cual es el sitio web de {title()}?", + "zh_Hans": "{title()} 的网站为何?" }, "render": "{website}", "freeform": { @@ -247,7 +261,8 @@ "zh_Hant": "這個地方可以坐輪椅到達嗎?", "pl": "Czy to miejsce jest dostępne dla osób na wózkach inwalidzkich?", "ja": "車いすでのアクセスは可能ですか?", - "fil": "Kaya bang abutin ang lugar na ito ng naka-wheelchair?" + "fil": "Kaya bang abutin ang lugar na ito ng naka-wheelchair?", + "es": "¿Este lugar es accesible con una silla de ruedas?" }, "mappings": [ { @@ -272,7 +287,8 @@ "ru": "Это место подходит для людей на инвалидной коляске", "pl": "W tym miejscu zainstalowane zostały udogodnienia dla osób na wózkach inwalidzkich", "ja": "この場所は、車椅子の方のための特別仕様になっています", - "fil": "Ang lugar na ito ay angkop sa mga gumagamit ng wheelchair" + "fil": "Ang lugar na ito ay angkop sa mga gumagamit ng wheelchair", + "es": "Este lugar está especialmente adaptado para usuarios en sillas de ruedas" } }, { @@ -297,7 +313,8 @@ "ru": "До этого места легко добраться на инвалидной коляске", "pl": "To miejsce jest łatwo dostępne dla osób na wózkach inwalidzkich", "ja": "この場所は、車いすで簡単に行くことができます", - "fil": "Ang lugar na ito ay kayang abutin ng mga naka-wheelchair" + "fil": "Ang lugar na ito ay kayang abutin ng mga naka-wheelchair", + "es": "Este lugar es fácilmente accesible con una silla de ruedas" } }, { @@ -322,7 +339,8 @@ "ru": "До этого места можно добраться, но не просто", "pl": "To miejsce jest dostępne dla osób na wózkach inwalidzkich, ale z pewnymi trudnościami", "ja": "車いすでこの場所まで行くことは可能ですが、簡単ではありません", - "fil": "Kayang abutin ang lugar na ito ng mga naka-wheelchair, pero hindi madali" + "fil": "Kayang abutin ang lugar na ito ng mga naka-wheelchair, pero hindi madali", + "es": "Es posible llegar a este lugar con una silla de ruedas, pero no es fácil" } }, { @@ -346,7 +364,8 @@ "zh_Hant": "輪椅無法到達這個地方", "pl": "To miejsce jest niedostępne dla osób na wózkach inwalidzkich", "ja": "この場所は車いすでは行けません", - "fil": "Ang lugar na ito ay hindi kayang abutin ng naka-wheelchair" + "fil": "Ang lugar na ito ay hindi kayang abutin ng naka-wheelchair", + "es": "No es posible llegar a este lugar con una silla de ruedas" } } ] @@ -369,7 +388,9 @@ "ja": "犬を飼うことができますか?", "id": "Apakah anjing diperbolehkan dalam bisnis ini?", "sl": "Ali so v tem podjetju dovoljeni psi?", - "fil": "Pinapayagan ba ang mga aso sa establisyementong ito?" + "fil": "Pinapayagan ba ang mga aso sa establisyementong ito?", + "es": "¿Están permitidos los perros en este negocio?", + "zh_Hans": "犬只是否在这个商业体中允许?" }, "mappings": [ { @@ -393,7 +414,8 @@ "ja": "ペット同伴可能", "es": "Se permiten perros", "sl": "Psi so dovoljeni", - "fil": "Pinapayagan ang mga aso" + "fil": "Pinapayagan ang mga aso", + "zh_Hans": "允许犬只" } }, { @@ -417,7 +439,8 @@ "ja": "ペット同伴不可", "es": "No se permiten perros", "sl": "Psi niso dovoljeni", - "fil": "Hindi pinapayagan ang mga aso" + "fil": "Hindi pinapayagan ang mga aso", + "zh_Hans": "允许犬只" } }, { @@ -439,7 +462,9 @@ "pl": "Psy dozwolone, ale muszą być na smyczy", "ja": "ペット同伴可能。ただしリード着用", "sl": "Psi so dovoljeni, vendar morajo biti na povodcu", - "fil": "Pinapayagan ang mga aso kung may tali" + "fil": "Pinapayagan ang mga aso kung may tali", + "es": "Los perros están permitidos, pero tienen que llevar correa", + "zh_Hans": "允许犬只,但必须拴绳" } }, { @@ -461,7 +486,9 @@ "ja": "犬同伴可能、自由に走り回れる", "id": "Anjing diperbolehkan dan dapat berkeliaran dengan bebas", "sl": "Psi so dovoljeni in lahko prosto tekajo naokoli", - "fil": "Pinapayayagan ang mga aso, at malayang makatatakbo" + "fil": "Pinapayayagan ang mga aso, at malayang makatatakbo", + "es": "Los perros están permitidos y pueden estar sueltos", + "zh_Hans": "允许犬只,且可自由放养" } } ] @@ -511,7 +538,9 @@ "ca": "Quin és l'horari d'obertura de {title()}?", "ja": "{title()}の営業時間は?", "sl": "Kakšen odpiralni čas ima {title()}?", - "fil": "Anong oras nagbubukas ang {title()}?" + "fil": "Anong oras nagbubukas ang {title()}?", + "es": "¿Cuales son las horas de apertura de {title()}?", + "zh_Hans": "{title()} 的开放时间为何?" }, "render": { "de": "

Öffnungszeiten

{opening_hours_table(opening_hours)}", @@ -531,7 +560,9 @@ "ca": "

Horari d'obertura

{opening_hours_table(opening_hours)}", "ja": "

営業時間

{opening_hours_table(opening_hours)}", "sl": "

Odpiralni čas

{opening_hours_table(opening_hours)}", - "fil": "

Mga oras na bukas

{opening_hours_table(opening_hours)}" + "fil": "

Mga oras na bukas

{opening_hours_table(opening_hours)}", + "es": "

Horas de apertura

{opening_hours_table(opening_hours)}", + "zh_Hans": "

开放时间

{opening_hours_table(opening_hours)}" }, "freeform": { "key": "opening_hours", @@ -552,7 +583,8 @@ "fr": "Des prises sont elles à disposition des client·e·s en intérieur ?", "pl": "Czy w tym przybytku znajdują się gniazdka elektryczne, gdzie klienci mogą naładować swoje urządzenia?", "ja": "このアメニティにはコンセントがあり、お客様が店内にいるときにも利用できますか?", - "fil": "Merong bang mga intsupe (outlet) sa loob, para sa mga suki?" + "fil": "Merong bang mga intsupe (outlet) sa loob, para sa mga suki?", + "es": "¿Esta facilidad tiene enchufes eléctricos, disponibles para los clientes cuando están dentro?" }, "mappings": [ { @@ -568,7 +600,8 @@ "fr": "Il y a suffisamment de prises disponibles pour les client·e·s en intérieur souhaitant recharger leurs appareils", "pl": "W budynku znajduje się wiele gniazdek elektrycznych, gdzie klienci mogą naładować swoje urządzenia", "ja": "屋内の席に座っているお客様には、家庭用コンセントがたくさん用意されており、そこで電子機器を充電することができます", - "fil": "Maraming mga intsupe (sockets) na maaring gamitin ng mga suki na nakaupo sa loob, pang-karga ng kanilang mga elektroniks" + "fil": "Maraming mga intsupe (sockets) na maaring gamitin ng mga suki na nakaupo sa loob, pang-karga ng kanilang mga elektroniks", + "es": "Hay numerosos enchufes domésticos disponibles para los clientes sentados en el interior, donde pueden cargar sus dispositivos electrónicos" }, "if": "service:electricity=yes" }, @@ -585,7 +618,8 @@ "fr": "Il y a peu de prises disponibles pour les client·e·s en intérieur souhaitant recharger leurs appareils", "pl": "W budynku znajduje się kilka gniazdek elektrycznych, gdzie klienci mogą naładować swoje urządzenia", "ja": "屋内の席に座ったお客様が充電できるよう、コンセントがいくつか用意されています", - "fil": "May iilang mga intsupe (sockets) na maaring gamitin ng mga suki na nakaupo sa loob, pang-karga ng kanilang mga elektroniks" + "fil": "May iilang mga intsupe (sockets) na maaring gamitin ng mga suki na nakaupo sa loob, pang-karga ng kanilang mga elektroniks", + "es": "Hay algunos enchufes domésticos disponibles para los clientes sentados en el interior, donde pueden cargar sus dispositivos electrónicos" }, "if": "service:electricity=limited" }, @@ -602,7 +636,8 @@ "hu": "A belső térben nincs konnektor az ügyfeleknek, de lehetséges, hogy a személyzet segítségével lehet elektromos eszközt tölteni", "pl": "W budynku nie ma gniazdek elektrycznych dostępnych dla klientów, ale mogą zostać one udostępnione po spytaniu obsługi", "ja": "屋内にはコンセントがありませんが、スタッフに声をかければ充電できるかもしれません", - "fil": "Walang mga intsupe (socket) para sa mga suki, pero maaring tanungin ang kawani kung magpapa-karga" + "fil": "Walang mga intsupe (socket) para sa mga suki, pero maaring tanungin ang kawani kung magpapa-karga", + "es": "No hay enchufes disponibles en el interior para los clientes, pero cargar puede ser posible si se pregunta al personal" }, "if": "service:electricity=ask" }, @@ -619,7 +654,8 @@ "hu": "A belső térben ülő ügyfeleknek nem áll rendelkezésére konnektor", "pl": "W budynku nie ma gniazdek elektrycznych dostępnych dla klientów", "ja": "屋内の席には、家庭用コンセントはありません", - "fil": "Walang mga intsupe (socket) para sa mga suking nakaubo sa loob" + "fil": "Walang mga intsupe (socket) para sa mga suking nakaubo sa loob", + "es": "No hay enchufes domésticos disponibles para los clientes sentados en el interior" }, "if": "service:electricity=no" } @@ -644,7 +680,9 @@ "ru": "Какие способы оплаты здесь принимают?", "ja": "どのような支払い方法が可能ですか?", "sl": "Kateri načini plačila so možni tu?", - "fil": "Anong mga paraang pambayad ang tinatanggap dito?" + "fil": "Anong mga paraang pambayad ang tinatanggap dito?", + "es": "¿Qué métodos de pago se aceptan aquí?", + "zh_Hans": "这里支持哪些支付方式?" }, "multiAnswer": true, "mappings": [ @@ -670,7 +708,9 @@ "ru": "Здесь принимают наличными", "ja": "現金利用可能", "sl": "Tu sprejemajo gotovino", - "fil": "Tinatanggap ang salapi rito" + "fil": "Tinatanggap ang salapi rito", + "es": "Aquí se acepta el pago en efectivo", + "zh_Hans": "可用现金" } }, { @@ -695,7 +735,9 @@ "ru": "Здесь принимают банковские карты", "ja": "お支払いはこちらで承ります", "sl": "Tukaj sprejemajo plačilne kartice", - "fil": "Tinatanggap ang mga tarhetang pambayad dito" + "fil": "Tinatanggap ang mga tarhetang pambayad dito", + "es": "Aquí se acepta el pago por tarjeta", + "zh_Hans": "可用信用卡" } } ] @@ -717,7 +759,9 @@ "fr": "Paiement via une application", "sl": "Plačilo se opravi z namensko aplikacijo", "ca": "El pagament es fa amb una app dedicada", - "fil": "Binabayaran gamit ang sariling app" + "fil": "Binabayaran gamit ang sariling app", + "es": "El pago se realiza con una aplicación dedicada", + "zh_Hans": "使用专用APP支付" } }, { @@ -733,7 +777,10 @@ "fr": "Paiement via une carte de membre", "sl": "Plačilo se izvede s člansko izkaznico", "ca": "El pagament es fa amb una targeta de membre", - "fil": "Binabayaran gamit ang membership card" + "fil": "Binabayaran gamit ang membership card", + "es": "El pago se realiza con una tarjeta de membresía", + "nb_NO": "Betaling utføres med et medlemskort", + "zh_Hans": "使用会员卡支付" } } ] @@ -765,7 +812,8 @@ "ca": "A quina planta està situat aquest element?", "sv": "På vilken nivå finns den här funktionen?", "ja": "この機能は何階にあるのでしょうか?", - "fil": "Anong palapag matatagpuan ang tampók?" + "fil": "Anong palapag matatagpuan ang tampók?", + "es": "¿En qué nivel se encuentra esta característica?" }, "render": { "en": "Located on the {level}th floor", @@ -784,7 +832,8 @@ "ca": "Situat a la planta {level}", "ja": "{level}階にあります", "sl": "Nahaja se v {level}. nadstropju", - "fil": "Natagpuan sa ika-{level} na palapag" + "fil": "Natagpuan sa ika-{level} na palapag", + "es": "Localizada en la {level}° planta" }, "freeform": { "key": "level", @@ -811,7 +860,8 @@ "ja": "地下にあります", "id": "Terletak di bawah tanah", "sl": "Nahaja se pod zemljo", - "fil": "Nasa ilalim ng lupa" + "fil": "Nasa ilalim ng lupa", + "es": "Localizado bajo tierra" }, "hideInAnswer": true }, @@ -836,7 +886,8 @@ "ja": "1階にあります", "id": "Terletak di lantai dasar", "sl": "Nahaja se v pritličju", - "fil": "Nasa unang palapag" + "fil": "Nasa unang palapag", + "es": "Localizado en la planta baja" } }, { @@ -861,7 +912,8 @@ "ja": "1階にあります", "id": "Terletak di lantai dasar", "sl": "Nahaja se v pritličju", - "fil": "Nasa unang palapag" + "fil": "Nasa unang palapag", + "es": "Localizado en la planta baja" } }, { @@ -885,7 +937,8 @@ "ca": "Situat a primera planta", "ja": "1階にあります", "sl": "Nahaja se v prvem nadstropju", - "fil": "Nasa unang palapag" + "fil": "Nasa unang palapag", + "es": "Localizado en la primera planta" } }, { @@ -900,7 +953,8 @@ "fr": "Sous-sol", "sl": "Nahaja se v prvi kletni etaži", "ca": "Localitzat a la planta base", - "fil": "Nasa silong" + "fil": "Nasa silong", + "es": "Situado en el primer nivel del sótano" } } ] diff --git a/assets/themes/aed/aed.json b/assets/themes/aed/aed.json index 987e2a6864..50d0598bda 100644 --- a/assets/themes/aed/aed.json +++ b/assets/themes/aed/aed.json @@ -17,7 +17,8 @@ "sv": "Öppna AED-karta", "pl": "Otwórz mapę AED", "pt_BR": "Abrir mapa AED", - "sl": "Zemljevid defibrilatorjev (AED)" + "sl": "Zemljevid defibrilatorjev (AED)", + "zh_Hans": "Open AED Map" }, "maintainer": "MapComplete", "icon": "./assets/themes/aed/aed.svg", @@ -38,7 +39,8 @@ "pt_BR": "Neste mapa, pode-se encontrar e marcar desfibriladores próximos", "nb_NO": "Defibrillatorer i nærheten", "hu": "Ezen a térképen a közeli defibrillátorokat lehet megtalálni és feltüntetni", - "sl": "Na tem zemljevidu lahko poiščete in označite bližnje defibrilatorje" + "sl": "Na tem zemljevidu lahko poiščete in označite bližnje defibrilatorje", + "zh_Hans": "在这份地图上可以寻找和标记附近的除颤器" }, "version": "2020-08-29", "startLat": 0, diff --git a/assets/themes/artwork/artwork.json b/assets/themes/artwork/artwork.json index 15cfa538b3..f0b26afecc 100644 --- a/assets/themes/artwork/artwork.json +++ b/assets/themes/artwork/artwork.json @@ -15,7 +15,8 @@ "sv": "Öppen konstverkskarta", "pl": "Otwórz mapę dzieł sztuki", "nb_NO": "Kunstkort", - "ca": "Open Artwork Map" + "ca": "Open Artwork Map", + "zh_Hans": "Open Artwork Map" }, "description": { "en": "Welcome to Open Artwork Map, a map of statues, busts, grafittis and other artwork all over the world", @@ -31,7 +32,8 @@ "nb_NO": "Velkommen til det åpne kunstverkskartet, et kart over statuer, byster, grafitti, og andre kunstverk i verden", "hu": "Isten hozta a nyílt műalkotástérképen, a világ minden táján megtalálható szobrok, mellszobrok, graffitik és más műalkotások gyűjtőhelyén", "pl": "Witaj w Open Artwork Map, mapie pomników, popierś, graffitti i innych dzieł sztuki z całego świata", - "ca": "Benvingut a Open Artwork Map, un mapa d'estàtues, busts, grafitis i altres obres d'art del tot el món" + "ca": "Benvingut a Open Artwork Map, un mapa d'estàtues, busts, grafitis i altres obres d'art del tot el món", + "zh_Hans": "欢迎使用Open Artwork Map,一个雕塑、半身像、涂鸦和其他全球艺术品的地图" }, "icon": "./assets/themes/artwork/artwork.svg", "maintainer": "MapComplete", diff --git a/assets/themes/benches/benches.json b/assets/themes/benches/benches.json index 66d32c21ec..42616da806 100644 --- a/assets/themes/benches/benches.json +++ b/assets/themes/benches/benches.json @@ -13,7 +13,9 @@ "pt_BR": "Bancadas", "id": "Bangku", "hu": "Padok", - "ca": "Bancs" + "ca": "Bancs", + "es": "Bancos", + "zh_Hans": "长椅" }, "shortDescription": { "en": "A map of benches", @@ -28,11 +30,13 @@ "pt_BR": "Um mapa de bancadas", "hu": "Padtérkép", "id": "Peta bangku", - "ca": "Un mapa de bancs" + "ca": "Un mapa de bancs", + "es": "Un mapa de bancos", + "zh_Hans": "长椅地图" }, "description": { "en": "This map shows all benches that are recorded in OpenStreetMap: Individual benches, and benches belonging to public transport stops or shelters. With an OpenStreetMap account, you can map new benches or edit details of existing benches.", - "de": "Diese Karte zeigt alle Sitzbänke, die in OpenStreetMap eingetragen sind: Einzeln stehende Bänke und Bänke, die zu Haltestellen oder Unterständen gehören. Mit einem OpenStreetMap-Account können Sie neue Bänke eintragen oder Detailinformationen existierender Bänke bearbeiten.", + "de": "Diese Karte zeigt alle Sitzbänke, die in OpenStreetMap eingetragen sind: Alleinstehende Bänke und Bänke, die zu Haltestellen oder Unterständen gehören. Mit einem OpenStreetMap-Konto können Sie neue Bänke eintragen oder Details existierender Bänke bearbeiten.", "fr": "Cette carte affiche les bancs mappés dans OpenStreetMap, entre autres : bancs des transports en commun, bancs publics, etc. À l'aide de votre compte OpenStretMap, vous pourrez ajouter de nouveaux bancs ou modifier les bancs existants.", "nl": "Deze kaart toont alle zitbanken die zijn opgenomen in OpenStreetMap: individuele banken en banken bij bushaltes. Met een OpenStreetMap-account kan je informatie verbeteren en nieuwe zitbanken toevoegen.", "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.", @@ -40,7 +44,8 @@ "ja": "このマップには、OpenStreetMapに記録されているすべてのベンチが表示されます。個々のベンチ、および公共交通機関の停留所または避難場所に属するベンチです。OpenStreetMapアカウントを使用すると、新しいベンチをマップしたり、既存のベンチの詳細を編集したりできます。", "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. Amb un compte d'OpenStreetMap pots afegir nous bancs o editar detalls dels existents." + "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. Amb un compte d'OpenStreetMap pots afegir nous bancs o editar detalls dels existents.", + "es": "Este mapa muestra todos los bancos que están grabados en OpenStreetMap: Bancos individuales, bancos que pertenecen a paradas o marquesinas del transporte público. Con una cuenta de OpenStreetMap, puedes mapear nuevos bancos o editar detalles de bancos existentes." }, "maintainer": "Florian Edelmann", "icon": "./assets/themes/benches/bench_poi.svg", diff --git a/assets/themes/bicycle_rental/bicycle_rental.json b/assets/themes/bicycle_rental/bicycle_rental.json index f0b81c2cae..af25c533e2 100644 --- a/assets/themes/bicycle_rental/bicycle_rental.json +++ b/assets/themes/bicycle_rental/bicycle_rental.json @@ -6,20 +6,24 @@ "de": "Fahrradverleih", "id": "Sewa sepeda", "fr": "Location de vélos", - "ca": "Lloguer de bicicletes" + "ca": "Lloguer de bicicletes", + "es": "Alquiler de bicicletas", + "nb_NO": "Sykkelutleie" }, "shortDescription": { "en": "A map with bicycle rental stations and bicycle rental shops", "nl": "Een kaart met fietsverhuurpunten en fietsverhuurzaken", "de": "Eine Karte mit Fahrradverleihstationen und Fahrradverleihern", "id": "Peta dengan stasiun persewaan sepeda dan toko penyewaan sepeda", - "fr": "Une carte avec des stations et magasins de location de vélos" + "fr": "Une carte avec des stations et magasins de location de vélos", + "es": "Un mapa con estaciones de alquiler de bicicletas y tiendas de alquiler de bicicletas" }, "description": { "en": "On this map, you'll find the many bicycle rental stations as they are known by OpenStreetMap", "nl": "Op deze kaart vind je verschillende fietsverhuurpunten en fietsverhuurzaken", "de": "Auf dieser Karte finden Sie die vielen Fahrradverleihstationen, wie sie auf OpenStreetMap eingetragen wurden", - "fr": "Vous trouverez sur cette carte toutes les stations de location de vélo telles qu'elles sont référencées dans OpenStreetMap" + "fr": "Vous trouverez sur cette carte toutes les stations de location de vélo telles qu'elles sont référencées dans OpenStreetMap", + "es": "En este mapa, encontrarás numerosas estaciones de alquiler de bicicletas que son conocidas por OpenStreetMap" }, "maintainer": "", "icon": "./assets/themes/bicycle_rental/logo.svg", diff --git a/assets/themes/binoculars/binoculars.json b/assets/themes/binoculars/binoculars.json index 76834bad26..d6cc85fc86 100644 --- a/assets/themes/binoculars/binoculars.json +++ b/assets/themes/binoculars/binoculars.json @@ -7,7 +7,9 @@ "it": "Binocoli", "nb_NO": "Kikkerter", "zh_Hant": "望遠鏡", - "hu": "Távcsövek" + "hu": "Távcsövek", + "fr": "Jumelles", + "es": "Binoculares" }, "shortDescription": { "en": "A map with fixed binoculars", @@ -16,7 +18,9 @@ "it": "Una cartina dei binocoli pubblici fissi", "nb_NO": "Et kart over fastmonterte kikkerter", "zh_Hant": "固定望遠鏡的地圖", - "hu": "Rögzített távcsövek (binokulárok) térképe" + "hu": "Rögzített távcsövek (binokulárok) térképe", + "fr": "Une carte de jumelles panoramiques", + "es": "Un mapa con prismáticos fijos" }, "description": { "en": "A map with binoculars fixed in place with a pole. It can typically be found on touristic locations, viewpoints, on top of panoramic towers or occasionally on a nature reserve.", @@ -24,7 +28,9 @@ "de": "Eine Karte für festinstallierte Ferngläsern. Man findet sie meist an touristischen Orten, Aussichtspunkten, Aussichtstürmen oder gelegentlich in Naturschutzgebieten.", "it": "Una cartina dei binocoli su un palo fissi in un luogo. Si trovano tipicamente nei luoghi turistici, nei belvedere, in cima a torri panoramiche oppure occasionalmente nelle riserve naturali.", "zh_Hant": "固定一地的望遠鏡地圖,特別是能夠在旅遊景點、觀景點、城鎮環景點,或是自然保護區找到。", - "hu": "Rúdra rögzített távcsövek térképe. Jellemzően turisztikailag érdekes, panorámás helyeken, kilátótornyok tetején vagy természetvédelmi területen találhatók." + "hu": "Rúdra rögzített távcsövek térképe. Jellemzően turisztikailag érdekes, panorámás helyeken, kilátótornyok tetején vagy természetvédelmi területen találhatók.", + "fr": "Une carte des longue-vues fixes. Se trouve typiquement sur les sites touristiques, les points de vue, les tours panoramiques ou dans les réserves naturelles.", + "es": "Un mapa con prismáticos fijos en un poste. Suele encontrarse en lugares turísticos, miradores, en lo alto de torres panorámicas u ocasionalmente en una reserva natural." }, "maintainer": "", "icon": "./assets/layers/binocular/telescope.svg", diff --git a/assets/themes/bookcases/bookcases.json b/assets/themes/bookcases/bookcases.json index ef899634b5..aa86a11394 100644 --- a/assets/themes/bookcases/bookcases.json +++ b/assets/themes/bookcases/bookcases.json @@ -14,7 +14,8 @@ "pt_BR": "Abrir Mapa de Estantes", "nb_NO": "Kart over åpne bokhyller", "hu": "Könyvespolctérkép", - "ca": "Open Bookcase Map" + "ca": "Open Bookcase Map", + "es": "Mapa de Librerías Abiertas" }, "description": { "en": "A public bookcase is a small streetside cabinet, box, old phone booth or some other objects where books are stored. Everyone can place or take a book. This map aims to collect all these bookcases. You can discover new bookcases nearby and, with a free OpenStreetMap account, quickly add your favourite bookcases.", @@ -25,7 +26,8 @@ "ja": "公共の本棚とは、本が保管されている小さな街角のキャビネット、箱、古い電話のトランク、その他の物のことです。誰でも本を置いたり持ったりすることができます。このマップは、すべての公共の本棚を収集することを目的としています。近くで新しい本棚を見つけることができ、無料のOpenStreetMapアカウントを使えば、お気に入りの本棚を簡単に追加できます。", "zh_Hant": "公共書架是街邊箱子、盒子、舊的電話亭或是其他存放書本的物件,每一個人都能放置或拿取書本。這份地圖收集所有類型的書架,你可以探索你附近新的書架,同時也能用免費的開放街圖帳號來快速新增你最愛的書架。", "it": "Una libreria pubblica è una piccola cabina a lato della strada, un locale, una vecchia cabina telefonica o qualche altro luogo in cui sono tenuti libri. Chiunque può lasciare o prendere libri. Scopo della mappa è individuarle. Se scopri nuove librerie nelle vicinanze, puoi facilmente aggiungerle con un account OpenStreetMap.", - "hu": "A nyilvános könyvespolc egy kis utcai szekrény, doboz, régi telefonfülke vagy más tárgy, ahol könyveket tárolnak. Bárki tehet rá vagy vihet el róla könyvet. Ez a térkép ezeket a könyvespolcokat kívánja összegyűjteni. Ha felfedezett egy új könyvespolcot a közelben, akkor egy ingyenes OpenStreetMap-fiókkal gyorsan fel is rajzolhatja a térképre." + "hu": "A nyilvános könyvespolc egy kis utcai szekrény, doboz, régi telefonfülke vagy más tárgy, ahol könyveket tárolnak. Bárki tehet rá vagy vihet el róla könyvet. Ez a térkép ezeket a könyvespolcokat kívánja összegyűjteni. Ha felfedezett egy új könyvespolcot a közelben, akkor egy ingyenes OpenStreetMap-fiókkal gyorsan fel is rajzolhatja a térképre.", + "es": "Una librería pública es un pequeño armario en la calle, una caja, una vieja cabina telefónica o algún otro objeto donde se guardan libros. Todo el mundo puede colocar o coger un libro. Este mapa pretende recoger todas estas librerías. Puedes descubrir nuevas librerías cercanas y, con una cuenta gratuita de OpenStreetMap, añadir rápidamente tus librerías favoritas." }, "icon": "./assets/themes/bookcases/bookcase.svg", "startLat": 0, diff --git a/assets/themes/cafes_and_pubs/cafes_and_pubs.json b/assets/themes/cafes_and_pubs/cafes_and_pubs.json index 9288d10a1b..9cdbff2f34 100644 --- a/assets/themes/cafes_and_pubs/cafes_and_pubs.json +++ b/assets/themes/cafes_and_pubs/cafes_and_pubs.json @@ -10,13 +10,17 @@ "zh_Hant": "咖啡廳與酒吧", "ru": "Кафе и пабы", "hu": "Kávézók és kocsmák", - "ca": "Cafés i bars" + "ca": "Cafés i bars", + "es": "Cafeterías y pubs", + "fr": "Cafés et pubs" }, "description": { "en": "Pubs and bars", "nl": "Cafés, kroegen en drinkgelegenheden", "de": "Kneipen und Bars", - "ca": "Bars i pubs" + "ca": "Bars i pubs", + "es": "Pubs y bares", + "fr": "Bars et pubs" }, "maintainer": "", "icon": "./assets/layers/cafe_pub/pub.svg", diff --git a/assets/themes/campersite/campersite.json b/assets/themes/campersite/campersite.json index 672bba7b45..74c7169c72 100644 --- a/assets/themes/campersite/campersite.json +++ b/assets/themes/campersite/campersite.json @@ -34,7 +34,8 @@ "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. Dies ist eine Webseite und eine Webapp. Die Daten werden in OpenStreetMap gespeichert, so dass sie für immer kostenlos sind und von jeder App weiterverwendet werden können.", - "hu": "Ez az oldal az összes olyan hivatalos lakóautós megállóhelyet és helyet gyűjti össze, ahol szürke és fekete szennyvizet lehet üríteni. Hozzáadhat részleteket a nyújtott szolgáltatásokról és a költségekről, valamint képeket és értékeléseket. Ez egyszerre egy weboldal és egy webes alkalmazás. Az adatokat az OpenStreetMapen tároljuk, így mindig ingyenesek lesznek, és bármelyik alkalmazás újra felhasználhatja őket." + "hu": "Ez az oldal az összes olyan hivatalos lakóautós megállóhelyet és helyet gyűjti össze, ahol szürke és fekete szennyvizet lehet üríteni. Hozzáadhat részleteket a nyújtott szolgáltatásokról és a költségekről, valamint képeket és értékeléseket. Ez egyszerre egy weboldal és egy webes alkalmazás. Az adatokat az OpenStreetMapen tároljuk, így mindig ingyenesek lesznek, és bármelyik alkalmazás újra felhasználhatja őket.", + "es": "Este sitio recoge todos los lugares oficiales de parada de caravanas y los lugares donde se pueden verter las aguas grises y negras. Puedes añadir detalles sobre los servicios prestados y el coste. Añade fotos y reseñas. Este es un sitio web y una aplicación web. Los datos se almacenan en OpenStreetMap, por lo que serán gratuitos para siempre y podrán ser reutilizados por cualquier aplicación." }, "maintainer": "joost schouppe", "icon": "./assets/themes/campersite/caravan.svg", @@ -59,7 +60,8 @@ "de": "Wohnmobilstellplätze", "hu": "Lakóautós megállóhely", "id": "Tempat camping", - "ca": "Llocs d'acampada" + "ca": "Llocs d'acampada", + "es": "Sitios de Acampada" }, "minzoom": 10, "source": { @@ -116,7 +118,8 @@ "de": "Wohnmobilstellplätze", "hu": "Lakóautós megállóhelyek", "id": "Tempat camping", - "ca": "llocs d'acampada" + "ca": "llocs d'acampada", + "es": "Sitios de acampada" }, "tagRenderings": [ "images", @@ -131,7 +134,8 @@ "nl": "Deze plaats heet {name}", "pt_BR": "Este lugar é chamado de {name}", "de": "Dieser Ort heißt {name}", - "id": "Tempat ini disebut {name}" + "id": "Tempat ini disebut {name}", + "es": "Este lugar se llama {name}" }, "question": { "en": "What is this place called?", @@ -143,7 +147,8 @@ "zh_Hant": "這個地方叫做什麼?", "nl": "Wat is de naam van deze plaats?", "pt_BR": "Qual o nome deste lugar?", - "de": "Wie heißt dieser Ort?" + "de": "Wie heißt dieser Ort?", + "es": "¿Cómo se llama este lugar?" }, "freeform": { "key": "name" @@ -161,7 +166,8 @@ "zh_Hant": "這個地方收費嗎?", "nl": "Moet men betalen om deze camperplaats te gebruiken?", "pt_BR": "Este lugar cobra alguma taxa?", - "de": "Wird hier eine Gebühr erhoben?" + "de": "Wird hier eine Gebühr erhoben?", + "es": "¿Este lugar cobra una tarifa?" }, "mappings": [ { @@ -180,7 +186,8 @@ "fr": "L’utilisation est payante", "pt_BR": "Você precisa pagar para usar", "de": "Sie müssen für die Nutzung bezahlen", - "id": "Anda perlu membayar untuk menggunakannya" + "id": "Anda perlu membayar untuk menggunakannya", + "es": "Necesitas pagar por su uso" } }, { @@ -201,7 +208,8 @@ "zh_Hant": "可以免費使用", "nl": "Kan gratis gebruikt worden", "pt_BR": "Pode ser usado de graça", - "de": "Nutzung kostenlos" + "de": "Nutzung kostenlos", + "es": "Se puede usar de manera gratuita" }, "addExtraTags": [ "charge=" @@ -220,7 +228,8 @@ "nl": "Deze plaats vraagt {charge}", "fr": "Ce site fait payer {charge}", "pt_BR": "Este lugar cobra {charge}", - "de": "Die Gebühr beträgt {charge}" + "de": "Die Gebühr beträgt {charge}", + "es": "Este lugar cobra {charge}" }, "question": { "en": "How much does this place charge?", @@ -232,7 +241,8 @@ "zh_Hant": "這個地方收多少費用?", "nl": "Hoeveel kost deze plaats?", "pt_BR": "Quanto este lugar cobra?", - "de": "Wie hoch ist die Gebühr an diesem Ort?" + "de": "Wie hoch ist die Gebühr an diesem Ort?", + "es": "¿Cuánto cobra este lugar?" }, "freeform": { "key": "charge" @@ -255,7 +265,8 @@ "fr": "Ce site possède-t’il un lieu de vidange ?", "pt_BR": "Este local tem uma estação de aterro sanitário?", "de": "Hat dieser Ort eine sanitäre Entsorgungsstation?", - "id": "Apakah tempat ini memiliki tempat pembuangan sanitasi?" + "id": "Apakah tempat ini memiliki tempat pembuangan sanitasi?", + "es": "¿Este lugar tiene un vertedero sanitario?" }, "mappings": [ { @@ -273,7 +284,8 @@ "zh_Hant": "這個地方有衛生設施", "pt_BR": "Este local tem uma estação de aterro sanitário", "de": "Dieser Ort hat eine sanitäre Entsorgungsstation", - "id": "Tempat ini memiliki tempat pembuangan sanitasi" + "id": "Tempat ini memiliki tempat pembuangan sanitasi", + "es": "Este lugar tiene un vertedero sanitario" } }, { @@ -291,7 +303,8 @@ "fr": "Ce site ne possède pas de lieu de vidange", "pt_BR": "Este local não tem uma estação de aterro sanitário", "de": "Dieser Ort hat keine sanitäre Entsorgungsstation", - "id": "Tempat ini tidak memiliki tempat pembuangan sampah sanitasi" + "id": "Tempat ini tidak memiliki tempat pembuangan sampah sanitasi", + "es": "Este lugar no tiene vertedero sanitario" } } ] @@ -306,7 +319,8 @@ "fr": "{capacity} personnes peuvent utiliser cet espace en même temps", "pt_BR": "{capacity} campistas podem usar este lugar ao mesmo tempo", "de": "{capacity} Wohnmobile können diesen Platz gleichzeitig nutzen", - "nl": "{capacity} campers kunnen deze plaats tegelijk gebruiken" + "nl": "{capacity} campers kunnen deze plaats tegelijk gebruiken", + "es": "{capacity} los campistas pueden utilizar este lugar al mismo tiempo" }, "question": { "en": "How many campers can stay here? (skip if there is no obvious number of spaces or allowed vehicles)", @@ -317,7 +331,8 @@ "fr": "Combien de personnes peuvent camper ici ? (Passez s’il n’y a pas de places délimitées)", "pt_BR": "Quantos campistas podem ficar aqui? (pule se não houver um número óbvio de vagas ou veículos permitidos)", "de": "Wie viele Wohnmobile können hier parken? (Überspringen, wenn es keine offensichtliche Anzahl von Stellplätzen oder erlaubten Fahrzeugen gibt)", - "nl": "Hoeveel campers kunnen hier overnachten? (sla dit over als er geen duidelijk aantal plaatsen of aangeduid maximum is)" + "nl": "Hoeveel campers kunnen hier overnachten? (sla dit over als er geen duidelijk aantal plaatsen of aangeduid maximum is)", + "es": "¿Cuántos campistas pueden alojarse aquí? (omitir si no hay un número evidente de plazas o vehículos permitidos)" }, "freeform": { "key": "capacity", @@ -337,7 +352,8 @@ "zh_Hant": "這個地方有提網路連線嗎?", "pt_BR": "Este lugar fornece acesso a internet?", "de": "Ist an diesem Ort ein Internetzugang vorhanden?", - "nl": "Biedt deze plaats internettoegang?" + "nl": "Biedt deze plaats internettoegang?", + "es": "¿Este lugar tiene acceso a internet?" }, "mappings": [ { @@ -357,7 +373,8 @@ "pt_BR": "Há acesso à internet", "de": "Internetzugang ist vorhanden", "nl": "Er is internettoegang", - "ca": "Hi ha accés a internet" + "ca": "Hi ha accés a internet", + "es": "Hay acceso a internet" } }, { @@ -377,7 +394,8 @@ "fr": "Il y a un accès internet", "pt_BR": "Há acesso à Internet", "de": "Internetzugang ist vorhanden", - "nl": "Er is internettoegang" + "nl": "Er is internettoegang", + "es": "Hay acceso a internet" }, "hideInAnswer": true }, @@ -397,7 +415,8 @@ "fr": "Il n’y a pas d’accès internet", "pt_BR": "Não há acesso à internet", "de": "Kein Internetzugang vorhanden", - "nl": "Er is geen internettoegang" + "nl": "Er is geen internettoegang", + "es": "No hay acceso a internet" } } ] @@ -413,7 +432,8 @@ "fr": "L’accès internet est-il payant ?", "pt_BR": "Você tem que pagar pelo acesso à internet?", "de": "Ist der Internetzugang gebührenpflichtig?", - "nl": "Moet je betalen voor internettoegang?" + "nl": "Moet je betalen voor internettoegang?", + "es": "¿Tienes que pagar por el acceso a internet?" }, "mappings": [ { @@ -431,7 +451,8 @@ "fr": "L’accès internet est en supplément", "pt_BR": "Você precisa pagar um extra pelo acesso à internet", "de": "Der Internetzugang ist gebührenpflichtig", - "nl": "Je moet extra betalen voor internettoegang" + "nl": "Je moet extra betalen voor internettoegang", + "es": "Tienes que pagar a mayores por el acceso a internet" } }, { @@ -449,7 +470,8 @@ "fr": "L’accès internet est inclus", "pt_BR": "Você não precisa pagar um extra pelo acesso à internet", "de": "Der Internetzugang ist kostenlos", - "nl": "Je hoeft niet extra te betalen voor internettoegang" + "nl": "Je hoeft niet extra te betalen voor internettoegang", + "es": "No tienes que pagar a mayores por el acceso a internet" } } ], @@ -493,7 +515,8 @@ "pt_BR": "Este lugar tem banheiros", "de": "Dieser Ort verfügt über Toiletten", "nl": "Deze plaats heeft toiletten", - "hu": "Itt van WC" + "hu": "Itt van WC", + "es": "Este lugar cuenta con sanitarios" } }, { @@ -514,7 +537,8 @@ "pt_BR": "Este lugar não tem banheiros", "de": "Dieser Ort verfügt nicht über Toiletten", "nl": "Deze plaats heeft geen toiletten", - "hu": "Itt nincs WC" + "hu": "Itt nincs WC", + "es": "Este lugar no tiene sanitarios" } } ] @@ -562,7 +586,8 @@ "it": "Questo luogo offre spazi per il noleggio a lungo termine?", "fr": "Ce site permet-il la location longue durée ?", "pt_BR": "Este lugar oferece vagas para aluguel a longo prazo?", - "de": "Gibt es a diesem Ort Plätze für Dauercamper?" + "de": "Gibt es a diesem Ort Plätze für Dauercamper?", + "es": "¿Este lugar ofrece huecos para alquilar a largo plazo?" }, "mappings": [ { @@ -579,7 +604,8 @@ "it": "Sì, ci sono spazi per il noleggio a lungo termine, ma puoi anche pagare per singola giornata", "fr": "Oui, mais il est possible d’y passer seulement une nuit", "pt_BR": "Sim, há alguns pontos para aluguel a longo prazo, mas você também pode ficar em uma base diária", - "de": "Ja, es gibt einige Plätze für Langzeitmieten, aber Sie können auch tageweise bleiben" + "de": "Ja, es gibt einige Plätze für Langzeitmieten, aber Sie können auch tageweise bleiben", + "es": "Sí, hay algunas plazas de alquiler a largo plazo, pero también puedes alojarte por días" } }, { @@ -596,7 +622,8 @@ "it": "No, non ci sono ospiti a lungo termine qui", "fr": "Non, il n’y a pas de résidents permanents", "pt_BR": "Não, não há hóspedes permanentes aqui", - "de": "Nein, hier gibt es keine Dauergäste" + "de": "Nein, hier gibt es keine Dauergäste", + "es": "No, no hay huéspedes permanentes aquí" } }, { @@ -612,7 +639,8 @@ "zh_Hant": "如果有長期租用合約才有可能待下來(如果你選擇這個地方則會在這份地圖消失)", "it": "Puoi soggiornare qui solo se hai un contratto a lungo termine (se selezioni questa opzione, questo luogo sarà rimosso da questa mappa)", "fr": "C’est possible sous contrat (Cette option fera disparaître le site de la carte)", - "de": "Es sind nur Plätze für Dauercamper vorhanden (wenn Sie diese Antwort auswählen, wird dieser Ort wird von der Karte verschwinden)" + "de": "Es sind nur Plätze für Dauercamper vorhanden (wenn Sie diese Antwort auswählen, wird dieser Ort wird von der Karte verschwinden)", + "es": "Solo es posible permanecer aquí si tienes un contrato a largo plazo (este lugar desaparecerá de este mapa si escoges esto)" } } ] @@ -628,7 +656,8 @@ "fr": "Plus de détails à propos du site : {description}", "pt_BR": "Mais detalhes sobre este lugar: {description}", "de": "Mehr Details über diesen Ort: {description}", - "nl": "Meer details over deze plaats: {description}" + "nl": "Meer details over deze plaats: {description}", + "es": "Más detalles sobre este lugar:{description}" }, "question": { "en": "Would you like to add a general description of this place? (Do not repeat information previously asked or shown above. Please keep it objective - opinions go into the reviews)", @@ -638,7 +667,8 @@ "it": "Desideri aggiungere una descrizione del luogo? (Non vanno ripetute informazioni già richieste e mostrate precedentemente. Si prega di attenersi a dati oggettivi - le opinioni vanno nelle recensioni)", "fr": "Souhaitez-vous ajouter une description générale du lieu ? (Ne pas répéter les informations précédentes et rester neutre, les opinions vont dans les avis)", "de": "Möchten Sie eine allgemeine Beschreibung für diesen Ort hinzufügen? (Bitte wiederholen Sie keine Informationen, die Sie bereits zuvor angegeben haben. Bitte bleiben Sie objektiv - Meinungen gehen in die Bewertungen ein)", - "nl": "Wil je graag een algemene beschrijving toevoegen van deze plaats? (Herhaal hier niet de antwoorden op de vragen die reeds gesteld zijn. Hou het objectief - je kan je mening geven via een review)" + "nl": "Wil je graag een algemene beschrijving toevoegen van deze plaats? (Herhaal hier niet de antwoorden op de vragen die reeds gesteld zijn. Hou het objectief - je kan je mening geven via een review)", + "es": "¿Te gustaría añadir una descripción general de este lugar? (No repitas información previamente preguntada o mostrada arriba. Por favor mantenla objetiva - las opiniones van en la de opiniones)" }, "freeform": { "key": "description", @@ -665,7 +695,8 @@ "de": "eine wohnmobilstellplatz", "nl": "een camperplaats", "hu": "lakóautós megállóhely", - "ca": "un lloc d'acampada" + "ca": "un lloc d'acampada", + "es": "Un camping" }, "description": { "en": "Add a new official camper site. These are designated places to stay overnight with your camper. They might look like a real camping or just look like a parking. They might not be signposted at all, but just be defined in a municipal decision. A regular parking intended for campers where it is not expected to spend the night, is -not- a camper site ", @@ -676,7 +707,8 @@ "de": "Fügen Sie einen neuen offiziellen Wohnmobilstellplatz hinzu. Dies sind ausgewiesene Plätze, an denen Sie in Ihrem Wohnmobil übernachten können. Sie können wie ein richtiger Campingplatz oder nur wie ein Parkplatz aussehen. Möglicherweise sind sie gar nicht ausgeschildert, sondern nur in einem Gemeindebeschluss festgelegt. Ein normaler Parkplatz für Wohnmobile, auf dem übernachten nicht zulässig ist, ist kein Wohnmobilstellplatz. ", "nl": "Voeg een nieuwe officiële camperplaats toe. Dit zijn speciaal aangeduide plaatsen waar het toegestaan is om te overnachten met een camper. Ze kunnen er uitzien als een parking, of soms eerder als een camping. Soms staan ze niet ter plaatse aangeduid, maar heeft de gemeente wel degelijk beslist dat dit een camperplaats is. Een parking voor campers waar je niet mag overnachten is géén camperplaats. ", "zh_Hant": "新增正式露營地點,通常是設計給過夜的露營者的地點。看起來像是真的露營地或是一般的停車場,而且也許沒有任何指標,但在城鎮被定議地點。如果一般給露營者的停車場並不是用來過夜,則不是露營地點 ", - "hu": "Új hivatalos lakóautóhely hozzáadása. Ez arra vannak kijelölve, hogy lakóautóval ott éjszakázzunk. Lehet, hogy úgy néz ki, mint egy igazi kemping, de az is lehet, hogy csak olyan, mint egy parkoló. Előfordulhat, hogy egyáltalán nem jelzik őket, hanem csak egy önkormányzati határozatban vannak kijelölve. A lakóautósoknak szánt olyan hagyományos parkolók, ahol nem várhatóan nem fognak éjszakázni, -nem minősül- lakóautóhelynek. " + "hu": "Új hivatalos lakóautóhely hozzáadása. Ez arra vannak kijelölve, hogy lakóautóval ott éjszakázzunk. Lehet, hogy úgy néz ki, mint egy igazi kemping, de az is lehet, hogy csak olyan, mint egy parkoló. Előfordulhat, hogy egyáltalán nem jelzik őket, hanem csak egy önkormányzati határozatban vannak kijelölve. A lakóautósoknak szánt olyan hagyományos parkolók, ahol nem várhatóan nem fognak éjszakázni, -nem minősül- lakóautóhelynek. ", + "es": "Añade un nuevo sitio de acampada oficial. Son lugares designados para pasar la noche con tu caravana. Pueden parecerse a un camping real o simplemente a un aparcamiento. Puede que no estén señalizados en absoluto, sino que simplemente estén definidos en una decisión municipal. Un aparcamiento normal destinado a los campistas en el que no se espera que se pase la noche, no es un camping. " } } ], diff --git a/assets/themes/charging_stations/charging_stations.json b/assets/themes/charging_stations/charging_stations.json index 637bd69036..89014e3675 100644 --- a/assets/themes/charging_stations/charging_stations.json +++ b/assets/themes/charging_stations/charging_stations.json @@ -11,7 +11,8 @@ "nb_NO": "Ladestasjoner", "ru": "Зарядные станции", "hu": "Elektromos töltőpontok", - "ca": "Estacions de càrrega" + "ca": "Estacions de càrrega", + "fr": "Points de recharge" }, "shortDescription": { "en": "A worldwide map of charging stations", @@ -22,7 +23,8 @@ "de": "Eine weltweite Karte mit Ladestationen", "nb_NO": "Et verdensomspennende kart over ladestasjoner", "ru": "Карта зарядных станций по всему миру", - "hu": "Elektromos töltőpontok világtérképe" + "hu": "Elektromos töltőpontok világtérképe", + "fr": "Une carte mondiale des points de recharge" }, "description": { "en": "On this open map, one can find and mark information about charging stations", @@ -31,7 +33,8 @@ "ru": "На этой карте вы можно найти и отметить информацию о зарядных станциях", "zh_Hant": "在這份開放地圖上,你可以尋找與標示充電站的資訊", "de": "Auf dieser freien Karte kann man Informationen zu Ladestationen finden und hinzufügen", - "hu": "Ezen a térképen a elektromos töltőpontokról szóló információkat lehet megtalálni és megadni" + "hu": "Ezen a térképen a elektromos töltőpontokról szóló információkat lehet megtalálni és megadni", + "fr": "Sur cette carte l’on trouve et ajoute des informations sur les points de recharge" }, "maintainer": "", "icon": "./assets/themes/charging_stations/logo.svg", diff --git a/assets/themes/climbing/climbing.json b/assets/themes/climbing/climbing.json index 3b1b6eb7c4..3723d6b518 100644 --- a/assets/themes/climbing/climbing.json +++ b/assets/themes/climbing/climbing.json @@ -570,7 +570,8 @@ "ru": "Здесь можно заняться спортивным скалолазанием", "ja": "ここでスポーツクライミングができます", "it": "L’arrampicata sportiva è possibile qua", - "hu": "Itt lehetőség van sportmászásra" + "hu": "Itt lehetőség van sportmászásra", + "fr": "De l’escalade est possible ici" } }, { @@ -582,7 +583,8 @@ "ru": "Спортивное скалолазание здесь невозможно", "ja": "ここではスポーツクライミングはできません", "it": "L’arrampicata sportiva non è possibile qua", - "hu": "Itt nincs lehetőség sportmászásra" + "hu": "Itt nincs lehetőség sportmászásra", + "fr": "L’escalade est impossible ici" } }, { diff --git a/assets/themes/cycle_highways/cycle_highways.json b/assets/themes/cycle_highways/cycle_highways.json index cc604c4bb2..bd11a28545 100644 --- a/assets/themes/cycle_highways/cycle_highways.json +++ b/assets/themes/cycle_highways/cycle_highways.json @@ -4,7 +4,8 @@ "en": "Cycle highways", "de": "Radschnellwege", "it": "Strade per velocipedi", - "ca": "Vies ciclistes" + "ca": "Vies ciclistes", + "fr": "Aménagements cyclables" }, "hideFromOverview": true, "maintainer": "L'imaginaire", @@ -14,7 +15,8 @@ "description": { "en": "This map shows cycle highways", "de": "Diese Karte zeigt Radschnellwege", - "it": "Questa cartina mostra le strade per velocipedi" + "it": "Questa cartina mostra le strade per velocipedi", + "fr": "Cette carte affiche les aménagements cyclables" }, "version": "2021-08-23", "startLat": 51.1599, @@ -101,7 +103,8 @@ "name": { "en": "cycle highways", "de": "Radschnellwege", - "ca": "vies ciclistes" + "ca": "vies ciclistes", + "fr": "Aménagements cyclables" }, "source": { "osmTags": "cycle_network=BE-VLG:cycle_highway" @@ -111,7 +114,8 @@ "render": { "en": "cycle highway", "de": "Radschnellweg", - "ca": "via ciclista" + "ca": "via ciclista", + "fr": "Aménagement cyclable" } }, "filter": [ diff --git a/assets/themes/cycle_infra/cycle_infra.json b/assets/themes/cycle_infra/cycle_infra.json index cd18ec926b..7d358b37ce 100644 --- a/assets/themes/cycle_infra/cycle_infra.json +++ b/assets/themes/cycle_infra/cycle_infra.json @@ -26,7 +26,8 @@ "de": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur. Erstellt während #osoc21.", "it": "Una cartina dove vedere e modificare gli elementi riguardanti l’infrastruttura dei velocipedi. Realizzata durante #osoc21.", "zh_Hant": "可以檢視與編輯單車相關設施的地圖,在 #os0c21時製作。", - "hu": "Kerékpáros infrastruktúrával kapcsolatos dolgokat megjelenítő és szerkesztésre felkínáló térkép. Az #osoc21 (Open Summer of Code) alatt készült." + "hu": "Kerékpáros infrastruktúrával kapcsolatos dolgokat megjelenítő és szerkesztésre felkínáló térkép. Az #osoc21 (Open Summer of Code) alatt készült.", + "fr": "Une carte montrant les aménagements cyclables et où l’on peut rajouter des informations. Réalisée durant #osoc21." }, "maintainer": "MapComplete", "hideFromOverview": false, diff --git a/assets/themes/ghostbikes/ghostbikes.json b/assets/themes/ghostbikes/ghostbikes.json index 09f48b0159..c1bbdf8837 100644 --- a/assets/themes/ghostbikes/ghostbikes.json +++ b/assets/themes/ghostbikes/ghostbikes.json @@ -24,7 +24,7 @@ "description": { "en": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location.

On this map, one can see all the ghost bikes which are known by OpenStreetMap. Is a ghost bike missing? Everyone can add or update information here - you only need to have a (free) OpenStreetMap account.", "nl": "Een Witte Fiets of Spookfiets is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat om een fiets die volledig wit is geschilderd en in de buurt van het ongeval werd geinstalleerd.

Op deze kaart zie je alle witte fietsen die door OpenStreetMap gekend zijn. Ontbreekt er een Witte Fiets of wens je informatie aan te passen? Meld je dan aan met een (gratis) OpenStreetMap account.", - "de": "Ein Geisterrad ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde.

Auf dieser Karte kann man alle Geisterräder sehen, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.", + "de": "Ein Geisterrad ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde.

Auf dieser Karte sehen Sie alle Geisterräder, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen nur ein (kostenloses) OpenStreetMap-Konto.", "ja": "ゴーストバイクは、交通事故で死亡したサイクリストを記念するもので、事故現場の近くに恒久的に置かれた白い自転車の形をしています。

このマップには、OpenStreetMapで知られているゴーストバイクがすべて表示されます。ゴーストバイクは行方不明ですか?誰でもここで情報の追加や更新ができます。必要なのは(無料の)OpenStreetMapアカウントだけです。", "zh_Hant": "幽靈單車是用來紀念死於交通事故的單車騎士,在事發地點附近放置白色單車。

在這份地圖上面,你可以看到所有在開放街圖已知的幽靈單車。有缺漏的幽靈單車嗎?所有人都可以在這邊新增或是更新資訊-只有你有(免費)開放街圖帳號。", "fr": "Les vélos fantômes sont des mémoriaux pour les cyclistes tuées sur la route, prenant la forme de vélos blancs placés à proximité des faits.

Cette carte indique leur emplacement à partir d’OpenStreetMap. Il est possible de contribuer aux informations ici, sous réserve d’avoir un compte OpenStreetMap (gratuit).", diff --git a/assets/themes/grb_import/grb.json b/assets/themes/grb_import/grb.json index 067a00ba22..b8abc07595 100644 --- a/assets/themes/grb_import/grb.json +++ b/assets/themes/grb_import/grb.json @@ -469,7 +469,7 @@ "_overlaps_with=feat.get('_overlaps_with_buildings').find(f => f.overlap > 1 /* square meter */ )", "_osm_obj:source:ref=feat.get('_overlaps_with')?.feat?.properties['source:geometry:ref']", "_osm_obj:id=feat.get('_overlaps_with')?.feat?.properties?.id", - "_osm_obj:source:date=feat.get('_overlaps_with')?.feat?.properties['source:geometry:date'].replace(/\\//g, '-')", + "_osm_obj:source:date=(feat.get('_overlaps_with')?.feat?.properties ?? {})['source:geometry:date']?.replace(/\\//g, '-')", "_osm_obj:building=feat.get('_overlaps_with')?.feat?.properties?.building", "_osm_obj:addr:street=(feat.get('_overlaps_with')?.feat?.properties ?? {})['addr:street']", "_osm_obj:addr:housenumber=(feat.get('_overlaps_with')?.feat?.properties ?? {})['addr:housenumber']", diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json index 2f479a092b..c90abd4c4d 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json @@ -1,16 +1,13 @@ { "id": "mapcomplete-changes", "title": { - "en": "Changes made with MapComplete", - "de": "Änderungen mit MapComplete" + "en": "Changes made with MapComplete" }, "shortDescription": { - "en": "Shows changes made by MapComplete", - "de": "Zeigt Änderungen von MapComplete" + "en": "Shows changes made by MapComplete" }, "description": { - "en": "This maps shows all the changes made with MapComplete", - "de": "Diese Karte zeigt alle Änderungen die mit MapComplete gemacht wurden" + "en": "This maps shows all the changes made with MapComplete" }, "maintainer": "", "icon": "./assets/svg/logo.svg", @@ -25,8 +22,7 @@ { "id": "mapcomplete-changes", "name": { - "en": "Changeset centers", - "de": "Schwerpunkte von Änderungssätzen" + "en": "Changeset centers" }, "minzoom": 0, "source": { @@ -40,41 +36,35 @@ ], "title": { "render": { - "en": "Changeset for {theme}", - "de": "Änderungen für {theme}" + "en": "Changeset for {theme}" } }, "description": { - "en": "Shows all MapComplete changes", - "de": "Zeigt alle MapComplete Änderungen" + "en": "Shows all MapComplete changes" }, "tagRenderings": [ { "id": "render_id", "render": { - "en": "Changeset {id}", - "de": "Änderung {id}" + "en": "Changeset {id}" } }, { "id": "contributor", "render": { - "en": "Change made by {_last_edit:contributor}", - "de": "Änderung wurde von {_last_edit:contributor} gemacht" + "en": "Change made by {_last_edit:contributor}" } }, { "id": "theme", "render": { - "en": "Change with theme {theme}", - "de": "Änderung mit Thema {theme}" + "en": "Change with theme {theme}" }, "mappings": [ { "if": "theme~http.*", "then": { - "en": "Change with unofficial theme {theme}", - "de": "Änderung mit inoffiziellem Thema {theme}" + "en": "Change with unofficial theme {theme}" } } ] @@ -338,8 +328,7 @@ } ], "question": { - "en": "Themename contains {search}", - "de": "Themenname enthält {search}" + "en": "Themename contains {search}" } } ] @@ -355,8 +344,7 @@ } ], "question": { - "en": "Made by contributor {search}", - "de": "Erstellt von {search}" + "en": "Made by contributor {search}" } } ] @@ -372,8 +360,7 @@ } ], "question": { - "en": "Not made by contributor {search}", - "de": "Nicht erstellt von {search}" + "en": "Not made by contributor {search}" } } ] @@ -388,8 +375,7 @@ { "id": "link_to_more", "render": { - "en": "More statistics can be found here", - "de": "Weitere Statistiken finden Sie hier" + "en": "More statistics can be found here" } }, { diff --git a/assets/themes/notes/notes.json b/assets/themes/notes/notes.json index 2f148bad2e..34be3c74cc 100644 --- a/assets/themes/notes/notes.json +++ b/assets/themes/notes/notes.json @@ -16,7 +16,7 @@ "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.", "hu": "A jegyzet egy gombostű a térképen egy szöveggel, amely azt jelzi, hogy valami nem stimmel.

Felhasználók vagy szövegek kereséséhez nézd meg a szűrő nézetet.", "nl": "Een kaartnota bevat tekst op een specifieke locatie om aan te duiden dat er iets mis is of ontbreekt.

Bekijk ook het filtermenu om de notas te filteren op tekst, gebruiker, datum, ...", - "de": "Ein Hinweis ist eine Stecknadel auf der Karte mit einer Fehlerbeschreibung.

Über die Filteransicht kann nach Benutzern und Text gesucht werden." + "de": "Eine Notiz ist eine Stecknadel auf der Karte mit einer Fehlerbeschreibung.

Über die Filteransicht kann nach Benutzer und Text gesucht werden." }, "icon": "./assets/themes/notes/logo.svg", "clustering": false, diff --git a/assets/themes/parkings/parkings.json b/assets/themes/parkings/parkings.json index 0cc6ab693e..b63d31e5b1 100644 --- a/assets/themes/parkings/parkings.json +++ b/assets/themes/parkings/parkings.json @@ -9,7 +9,8 @@ "ru": "Парковка", "zh_Hant": "停車場", "id": "Tempat parkir", - "hu": "Parkolás" + "hu": "Parkolás", + "fr": "Stationnement" }, "shortDescription": { "nl": "Deze kaart toont verschillende parkeerplekken", @@ -28,7 +29,8 @@ "it": "Questa cartina mostra diversi posti dove parcheggiare", "zh_Hant": "這地圖顯示不同的停車空間", "id": "Peta ini menunjukkan tempat parkir yang berbeda", - "hu": "Ez a térkép különböző parkolókat jelenít meg" + "hu": "Ez a térkép különböző parkolókat jelenít meg", + "fr": "Cette carte affiche différents lieux de stationnement" }, "maintainer": "", "icon": "./assets/themes/parkings/parkings.svg", diff --git a/assets/themes/trees/trees.json b/assets/themes/trees/trees.json index 76d4f3b3ed..910160fa58 100644 --- a/assets/themes/trees/trees.json +++ b/assets/themes/trees/trees.json @@ -13,7 +13,8 @@ "nb_NO": "Trær", "id": "Pohon", "hu": "Fatérkép", - "ca": "Arbres" + "ca": "Arbres", + "es": "Árboles" }, "shortDescription": { "nl": "Breng bomen in kaart", @@ -27,7 +28,8 @@ "de": "Kartieren Sie alle Bäume", "nb_NO": "Kartlegg alle trærne", "hu": "Az összes fa feltérképezése", - "ca": "Mapeja tots els arbres" + "ca": "Mapeja tots els arbres", + "es": "Mapa de los Árboles" }, "description": { "nl": "Breng bomen in kaart!", @@ -40,7 +42,8 @@ "de": "Kartieren Sie alle Bäume!", "nb_NO": "Kartlegg trærne.", "hu": "Térképezzünk fel minden fát!", - "ca": "Mapeja tots els arbres." + "ca": "Mapeja tots els arbres.", + "es": "Mapa de todos los Árboles" }, "maintainer": "Midgard", "icon": "./assets/themes/trees/logo.svg", diff --git a/langs/da.json b/langs/da.json new file mode 100644 index 0000000000..ddcedb2450 --- /dev/null +++ b/langs/da.json @@ -0,0 +1,593 @@ +{ + "centerMessage": { + "loadingData": "Indlæser data…", + "ready": "Færdig!", + "retrying": "Indlæsning af data fejlede. Prøver igen om {count} sekunder…", + "zoomIn": "Zoom ind for at se og redigere data" + }, + "delete": { + "cancel": "Afbryd", + "cannotBeDeleted": "Dette element kan ikke slettes", + "delete": "Slet", + "explanations": { + "hardDelete": "Dette punkt vil blive slettet på OpenStreetMap. Det kan gendannes af en øvet bidragsyder", + "selectReason": "Angiv venligst hvorfor dette element burde slettes", + "softDelete": "Dette element vil blive opdateret og skjult for dette program {reason}" + }, + "isDeleted": "Dette element er slettet", + "isntAPoint": "Kun punkter skal slettes, det valgte element er en vej, et areal eller en relation.", + "loading": "Undersøger egenskaber for at finde ud af om dette element kan slettes.", + "loginToDelete": "Du skal være logget ind for slette et punkt", + "notEnoughExperience": "Punktet blev lavet af en anden.", + "onlyEditedByLoggedInUser": "Dette punkt er kun blevet redigeret af dig selv, du kan roligt slette det.", + "partOfOthers": "Dette punkt er en del af en vej eller relation og kan ikke direkte slettes.", + "readMessages": "Du har ulæste beskeder. Læs dem for du slette et punkt - nogen kan have tilbagemeldinger", + "reasons": { + "disused": "Dette element er nedlagt eller fjernet", + "duplicate": "Dette punkt er en dublet af et andet element", + "notFound": "Dette element kunne ikke findes", + "test": "Dette var et prøvepunkt - elementet var der aldrig rigtigt" + }, + "safeDelete": "Dette punkt kan slettes uden risiko.", + "useSomethingElse": "Brug i stedet en anden OpenStreetMap editor til at slette det", + "whyDelete": "Hvorfor skal dette punkt slettes?" + }, + "favourite": { + "loginNeeded": "

Log ind

En personlig opsætning er kun til rådighed for OpenStreetMap-brugere", + "panelIntro": "

Dit personlige tema

Aktiver dit favoritlag fra et af alle de officelle temaer", + "reload": "Genindlæs data" + }, + "general": { + "about": "Ret og tilføj nemt til Openstreetmap for et bestemt tema", + "aboutMapcomplete": "

Om MapComplete

Brug det til at tilføje OpenStreetMap information om et bestemt tema. Besvar spørgsmål, og i løbet af få minutter er dine bidrag tilgængelige overalt. temabestyreren definerer elementer, spørgsmål og sprog for temaet.

Find ud af mere

MapComplete tilbyder altid det næste trin for at lære mere om OpenStreetMap.

  • Når det er indlejret på et websted, linker iframe-en til et fuldskærms MapComplete
  • Fuldskærmsversionen tilbyder information om OpenStreetMap
  • Man kan se det uden at logge ind, men redigering kræver en OSM-konto.
  • Hvis du ikke har logget ind, vil du blive bedt om at gøre det
  • Når du har besvaret et enkelt spørgsmål, kan du tilføje nye punkter til kortet
  • Efter et stykke tid bliver faktiske OSM-tags vist, senere igen links til wiki-en


Bemærkede du et problem? Har du enanmodning om en ny funktion? Vil du hjælpe med at oversætte? Gå til kildekoden eller issue trackeren.

Vil du se dit fremskridt? Følg antallet af rettelser på OsmCha.

", + "add": { + "addNew": "Tilføj {category}", + "addNewMapLabel": "Klik her for at tilføje et nyt punkt", + "confirmButton": "Tilføj en {category}
Din tilføjelse er synlig for alle
", + "confirmIntro": "

Tilføj en {title}?

Punktet du opretter her vil være synligt for alle. Tilføj kun ting til kortet, hvis de virkelig findes. Mange programmer bruger disse data.", + "disableFilters": "Slå alle filtre fra", + "disableFiltersExplanation": "Nogle elementer kan være skjult af et filter", + "hasBeenImported": "Punktet er allerede importeret", + "import": { + "hasBeenImported": "Objektet blev importeret", + "howToTest": "For at afprøve, tilføj test=true eller backend=osm-test til URL-en. Ændringssættet vil blive udskrevet på konsollen. Opret venligst en PR for at publicere dette tema og dermed aktivere importknappen.", + "importTags": "Dette element vil modtage {tags}", + "officialThemesOnly": "Importknappen er slået fra for uofficielle temaer for at undgå uheld", + "wrongType": "Dette element er ikke et punkt eller en vej og kan ikke importeres", + "zoomInMore": "Zoom mere ind for at importere dette element" + }, + "importTags": "Dette element modtager {tags}", + "intro": "Du klikkede et sted, hvor der endnu ikke er kendt data.
", + "layerNotEnabled": "Laget {layer} er ikke slået til. Slå laget til for at tilføje et punkt", + "openLayerControl": "Åben kontrolboksen for lag", + "pleaseLogin": "Log venligst ind for at tilføje et nyt punkt", + "presetInfo": "Det nye POI vil have {tags}", + "stillLoading": "Data indlæses stadig. Vent venligt lidt for du tilføjet et nyt punkt.", + "title": "Tilføj et nyt punkt?", + "warnVisibleForEveryone": "Til tilføjelse vil være synlig for alle", + "wrongType": "Dette element er ikke et punkt eller en vej og kan ikke importeres", + "zoomInFurther": "Zoom mere ind fore at tilføje et punkt.", + "zoomInMore": "Zoom mere ind for at importere dette element" + }, + "apply_button": { + "appliedOnAnotherObject": "Objektet {id} modtager {tags}", + "isApplied": "Ændringerne er anvendt" + }, + "attribution": { + "attributionContent": "

Alle data leveres af OpenStreetMap, frit genanvendelige under Open DataBase Licensen.

", + "attributionTitle": "Meddelelse om tilskrivning", + "codeContributionsBy": "MapComplete er lavet af {contributors} og {hiddenCount} flere bidragsydere", + "donate": "Støt MapComplete økonomisk", + "editId": "Åben OpenStreetMap onlineeditoren her", + "editJosm": "Rediger her med JOSM", + "iconAttribution": { + "title": "Brugte ikoner" + }, + "josmNotOpened": "Kunne ikke komme i kontakt med JOSM. Sørg for at den er åbnet og at fjernbetjening er slået til", + "josmOpened": "JOSM er åbnet", + "mapContributionsBy": "Aktult synligt data har rettelser lavet af {contributors}", + "mapContributionsByAndHidden": "De aktuelt synlige rettelser er lavet af {contributors} og {hiddenCount} flere bidragsydere", + "openIssueTracker": "Rapporter en fejl", + "openMapillary": "Åbn Mapillary her", + "openOsmcha": "De de seneste rettelser lavet med {theme}", + "themeBy": "Tema vedligeholdt af {author}", + "translatedBy": "MapComplete er oversat af {contributors} og {hiddenCount} flere bidragsydere" + }, + "back": "Tilbage", + "backToMapcomplete": "Tilbage til temaoversigten", + "backgroundMap": "Baggrundskort", + "cancel": "Afbryd", + "confirm": "Bekræft", + "customThemeIntro": "

Brugergeneredede temaer

Disse er tidligere sete bruger-genererede temaer.", + "download": { + "downloadAsPdf": "Hent en PDF med det aktuelle kort", + "downloadAsPdfHelper": "Ideelt til at udskrive det aktuelle kort", + "downloadAsSvg": "Hent en SVG med det aktuelle kort", + "downloadCSV": "Hent synligt data som CSV", + "downloadCSVHelper": "Kompatibel med LibreOffice Calc, Excel, …", + "downloadFeatureAsGeojson": "Hent som GeoJson fil", + "downloadFeatureAsGpx": "Hent som GPX fil", + "downloadGeoJsonHelper": "Kompatibel med QGIS, ArcGIS, ESRI, …", + "downloadGeojson": "Hent synlig data som GeoJSON", + "downloadGpx": "Hent som GPX fil", + "downloadGpxHelper": "En GPX-fil kan bruges med de fleste navigationsenheder og programmer", + "exporting": "Eksporterer…", + "includeMetaData": "Inkluder metadata (sidste editor, beregnede værdier, ...)", + "licenseInfo": "

Ophavsretsmeddelelse

De leverede data er tilgængelige under ODbL. Genbrug til alle formål er gratis, men
  • tilskrivningen © OpenStreetMap contributors kræves
  • Enhver ændring skal bruge licensen
Læs venligst hele ophavsretsmeddelelsen for detaljer.", + "noDataLoaded": "Der er endnu ikke indlæst noget data. Nedhentning vil snart være tilgængelig", + "title": "Hent synligt data", + "uploadGpx": "Upload dit spor til OpenStreetMap" + }, + "error": "Noget gik galt", + "example": "Eksempel", + "examples": "Eksempler", + "fewChangesBefore": "Besvar venligst nogle få spørgsmål om eksisterende punkter før du tilføjer et nyt punkt.", + "getStartedLogin": "Log in med OpenStreetMap for at komme i gang", + "getStartedNewAccount": " eller lav en ny konto", + "goToInbox": "Åbn indboks", + "histogram": { + "error_loading": "Kunne ikke indlæse histogrammet" + }, + "layerSelection": { + "title": "Vælg lag", + "zoomInToSeeThisLayer": "Zoom ind for at se dette lag" + }, + "loading": "Indlæser...", + "loadingTheme": "Indlæser {theme}...", + "loginFailed": "Det mislykkedes at logge ind på OpenStreetMap", + "loginOnlyNeededToEdit": "hvis du vil redigere kortet", + "loginToStart": "Log ind for at besvare dette spørgsmål", + "loginWithOpenStreetMap": "Logind med OpenStreetMap", + "logout": "Log ud", + "morescreen": { + "createYourOwnTheme": "Lave dit eget MapComplete tema fra bunden af", + "hiddenExplanation": "Disse temaer er kun tilgængelige med linket. Du har opdaget {hidden_discovered} af {total_hidden} skjulte temaer.", + "intro": "

Flere tematiske kort?

Nød du at indsamle geodata?
Der er flere temaer til rådighed.", + "previouslyHiddenTitle": "Tidligere besøgte skjulte temaer", + "requestATheme": "Hvis de efterspørger et specialfremstillet tema, så bed om det i issue tracker-en", + "streetcomplete": "En anden lignende applikation er StreetComplete." + }, + "nameInlineQuestion": "{category} hedder $$$", + "next": "Næste", + "noNameCategory": "{category} uden navn", + "noTagsSelected": "Ingen tags valgt", + "notValid": "Vælg en gyldig værdi for at gå videre", + "number": "tal", + "oneSkippedQuestion": "Et spørgsmål er ignoreret", + "openStreetMapIntro": "

At Åbent kort

Et som alle kan bruge og redigere frit. Eet sted at gemme al geo-information. Forskellige, små, inkompatible og forældede kort er der ikke brug for nogen steder.

OpenStreetMap er ikke fjendens kort. Kortet kan bruges frit (med kreditering og publicering af ændringer af data). Alle kan tilføje mere data og rette fejl. Denne website bruger OpenStreetMap. Al data kommer derfra, og dine svar og rettelser vil blive bruge alle vegne.

Mange folk og apps bruger allerede OpenStreetMap: Organic Maps, OsmAnd, men også kortene på Facebook, Instagram, Apple-maps and Bing-maps er (delvist) drevet af OpenStreetMap.

", + "openTheMap": "Åbn kortet", + "opening_hours": { + "closed_permanently": "Lukket med en ukendt varighed", + "closed_until": "Lukket indtil {date}", + "error_loading": "Fejl: Kunne ikke visualisere disse åbningstider.", + "loadingCountry": "Bestemmer land…", + "not_all_rules_parsed": "Disse åbningstider er komplicerede. De følgende regler er ignoreret i inputelementet:", + "openTill": "indtil", + "open_24_7": "døgnåbent", + "open_during_ph": "På offentlige helligdage, er dette", + "opensAt": "fra", + "ph_closed": "lukket", + "ph_not_known": " ", + "ph_open": "åbent", + "ph_open_as_usual": "åbent som sædvanligt" + }, + "osmLinkTooltip": "Læs dette objekt i en browser på OpenStreetMap for historik og flere rettemuligheder", + "pdf": { + "attr": "Kortdata © OpenStreetMap Contributors, bearbejdelser under ODbL", + "attrBackground": "Baggrundslag: {background}", + "generatedWith": "Genereret med MapComplete.osm.be", + "versionInfo": "v{version} - genereret den {date}" + }, + "pickLanguage": "Vælg et sprog: ", + "poweredByOsm": "Drevet af OpenStreetMap", + "questions": { + "emailIs": "Emailadressen på denne {category} er {email}", + "emailOf": "Hvad er emailadressen på {category}?", + "phoneNumberIs": "Telefonnummeret på denne/dette {category} er {phone}", + "phoneNumberOf": "Hvad er telefonnummeret for {category}?", + "websiteIs": "Hjemmeside: {website}", + "websiteOf": "Hvad er hjemmesiden for {category}?" + }, + "readYourMessages": "Læs venligst alle dine OpenStreetMap beskeder før du tilføjer et nyt punkt.", + "removeLocationHistory": "Slet placeringshistorikken", + "returnToTheMap": "Vend tilbage til kortet", + "save": "Gem", + "screenToSmall": "Åbn {theme} i et nyt vindue", + "search": { + "error": "Noget gik galt…", + "nothing": "Intet fundet…", + "search": "Vælg en sted", + "searching": "Søger…" + }, + "sharescreen": { + "addToHomeScreen": "

Tilføj til din hjemmeskærm

Du kan let tilføje denne hjemmeside til din smartphones hjemmeskærm for at få den integreret. Klik på 'Tilføj til hjemmeskærm' knappen i URL-feltet for at gøre det.", + "copiedToClipboard": "Link kopierer til udklipsholder", + "editThemeDescription": "Tilføj eller ret spørgsmål til dette korttema", + "editThisTheme": "Ret dette tema", + "embedIntro": "

Indlejr på din hjemmeside

Indlejr venligst dette kort på din hjemmeside.
Vi tilskynder dig til det - du behøver ikke engang at spørge om tilladelse.
Det det frit og gratis og vil altid være det. Jo flere der bruger det, jo mere værdifuldt bliver det.", + "fsAddNew": "Slå 'tilføj nyt POI' knappen til", + "fsGeolocation": "Slå 'geolocate-me' knappen til (kun mobil)", + "fsIncludeCurrentBackgroundMap": "Inkluder det aktuelle baggrundsvalg {name}", + "fsIncludeCurrentLayers": "Inkluder det aktuelle valg af lag", + "fsIncludeCurrentLocation": "Inkludere det aktuelle sted", + "fsLayerControlToggle": "Start med lagkontrollen udvidet", + "fsLayers": "Slå lagkontrollen til", + "fsSearch": "Slå søgefeltet til", + "fsUserbadge": "Slå loginknappen til", + "fsWelcomeMessage": "Vis velkomstbeskeden og tilknyttede faner", + "intro": "

Del dette kort

Del dette kort ved at kopiere linket nedenunder og send det til venner og familie:", + "thanksForSharing": "Tak for at dele!" + }, + "skip": "Spring over dette spørgsmål", + "skippedQuestions": "Nogle spørgsmål er sprunget over", + "testing": "Testing - ingen ændringer vil blive gemt", + "weekdays": { + "abbreviations": { + "friday": "Fre", + "monday": "Man", + "saturday": "Lør", + "sunday": "Søn", + "thursday": "Tor", + "tuesday": "Tir", + "wednesday": "Ons" + }, + "friday": "Fredag", + "monday": "Mandag", + "saturday": "Lørdag", + "sunday": "Søndag", + "thursday": "Torsdag", + "tuesday": "Tirsdag", + "wednesday": "Onsdag" + }, + "welcomeBack": "Du er logget ind, velkommen tilbage!", + "wikipedia": { + "createNewWikidata": "Opret et nyt Wikidata element", + "doSearch": "Søg ovenfor for at se resultater", + "failed": "Indlæsning af Wikipedia-artikel mislykkedes", + "loading": "Indlæser Wikipedia...", + "noResults": "Intet fundet for {search}", + "noWikipediaPage": "Dette Wikidata-element har endnu ingen tilknyttet Wikipedia artikel.", + "previewbox": { + "born": "Født: {value}", + "died": "Død: {value}" + }, + "searchWikidata": "Søg på Wikidata", + "wikipediaboxTitle": "Wikipedia" + } + }, + "image": { + "addPicture": "Tilføj Billede", + "ccb": "under CC-BY-licensen", + "ccbExplanation": "The CC-BY licensen siger, at alle kan bruge dit billede til ethvert formål, men at de skal kreditere dig", + "ccbs": "under CC-BY-SA-licensen", + "ccbsExplanation": "CC-BY-SA licensen siger, at alle kan bruge dit billede til ethvert formål, men at de skal kreditere dig og at bearbejdelser af billedet skal offentliggøres under samme licens", + "cco": "i offentligt domæne", + "ccoExplanation": "At tilføje et billede til det offentlig domæne betyder, at alle kan gøre hvad som helst med dit billede", + "doDelete": "Fjern billede", + "dontDelete": "Afbryd", + "isDeleted": "Slettet", + "pleaseLogin": "Log venligst ind for at tilføje et billede", + "respectPrivacy": "Tag ikke billeder af mennesker eller nummerplader. Upload ikke Google Maps, Google Streetview, eller fra andre ophavsresbeskyttede kilder.", + "toBig": "Dit billede er for stort da det er {actual_size}. Brug venligst billeder, der er højst {max_size}", + "uploadDone": "Dit billede er tilføjet. Tak for hjælpen!", + "uploadFailed": "Kunne ikke uploade dit billede. Er du forbundet til Internettet og tillader du tredieparts API'er. Brave browseren eller uMatrix plugin'et kunne blokerer dem.", + "uploadMultipleDone": "{count} billeder tilføjet. Tak for at hjælpe til!", + "uploadingMultiple": "Uploader {count} billeder…", + "uploadingPicture": "Uploading dit billede…", + "willBePublished": "Dit billede vil blive offentliggjort " + }, + "importHelper": { + "askMetadata": { + "downloadGeojson": "Hent geojson", + "giveDescription": "Skriv venligst en lille beskrivelse til nogen, som ser beskeden. A god besked beskriver hvad bidragsyderen skal gøre, fx; Der kunne være en bænk her. Hvis du er i nærheden, kunne du venligst checke og indikere om bænken findes eller ej? (Et link til MapComplete vil automatisk blive tilføjet)", + "giveSource": "Hvad er kilden til disse data. Hvis 'source' er sat på elementen, vil denne værdi blive ignoreret", + "giveWikilink": "På hvilken wikiside kan man finde mere information om denne import?", + "intro": "Angiv venligst noget mere information før du tilføjer {count} noter.", + "orDownload": "Alternativt kan du hente datasættet og importere det direkte", + "shouldBeOsmWikilink": "Forventede et link til en side på wiki.openstreetmap.org", + "shouldBeUrl": "Ikke en gyldig URL", + "shouldNotBeHomepage": "Nej, hjemmesiden er heller ikke tilladt. Indtast URL'en for en rigtig wikipage, der dokumenterer din import", + "title": "Sæt metadata" + }, + "compareToAlreadyExistingNotes": { + "completelyImported": "Alle de foreslåede punkter har (eller havde) allerede en importnote", + "loading": "Henter noter fra OSM", + "loadingFailed": "Det mislykkedes at indlæse noter fordi {error}", + "mapExplanation": "De røde elementer på det næste kort er alle datapunkter fra dit datasæt. Der er {length} elementer i dit dataset.", + "noPreviousNotesFound": "Ingen tidligere importnoter fundet", + "nothingNearby": "Ingen af de foreslåede punkter har en importnote i nærheden", + "someNearby": "{hasNearby} punkter har allerede en eksisterende importnote indenfor {distance} meter", + "title": "Sammenlig med eksisterende noter", + "titleLong": "Sammenlign med allerede eksisterende 'til-import'-noter", + "wontBeImported": "Disse datapunkter vil ikke blive importeret og er vist som røde prikker på kortet nedenunder" + }, + "confirmProcess": { + "contactedCommunity": "Jeg kontaktede (det lokale) fællesskab(et) angående denne import", + "licenseIsCompatible": "Licensen for data, der skal importeres, tillader at det importeres til OSM. OSM har lov til at videredistribuere det kommercielt, med kun minimal kreditering", + "readImportGuidelines": "Jeg har læst importeringsvejledningerne på OSM wiki'en", + "title": "Licens og fællesskab", + "titleLong": "Har du gennemgået importprocessen?", + "wikipageIsMade": "Processen er dokumenteret på OSM-wikien (du får senere brug for dette link)" + }, + "conflationChecker": { + "cacheExpired": "Cachen udløb", + "downloadOverpassData": "Hent den indlæste geojson fra overpass", + "importCandidatesCount": "De {count} røde elementer på det følgende kort er alle dine importkandidater.", + "loadedDataAge": "Det indlæste data er fra cachen og er {age} gammelt", + "mapShowingNearbyIntro": "Det følgende kort viser elementer til import, som indeholder et OSM-element ", + "nearbyWarn": "De {count} røde elementer på det følgende kort vil ikke blive importeret!", + "nothingLoaded": "Ingen elementer er indlæst fra OpenStreetMap som matcher det aktuelle lag {name}", + "osmLoaded": "{count} elementer indlæst fra OpenStreetMap matcher laget {name}.", + "setRangeToZero": "Sæt rækkevidden til 0 eller 1 hvis du vil importere dem alle", + "states": { + "error": "Kunne ikke indlæse seneste data fra overpass pga {error}", + "idle": "Undersøger lokalt lager...", + "running": "Forespørger overpass...", + "unexpected": "Uventet tilstand {state}" + }, + "title": "Sammenlign med eksisterende data", + "titleLive": "Live data på OSM", + "titleNearby": "Elementer i nærheden", + "zoomIn": "Live data bliver vist på zoomniveau mindst {needed}. Det aktuelle zoomniveau er {current}" + }, + "createNotes": { + "creating": "Oprettede {count} noter ud af {total}", + "done": "Alle {count} noter er oprettet!", + "loading": "Vent mens vi indlæser...", + "openImportViewer": "Inspicerer fremgangen af dine noter i 'import_viewer'", + "title": "Noteoprettelse" + }, + "gotoImportViewer": "Inspicer dine tidligere importeringer", + "introduction": { + "description": "Importeringshjælperen konverterer et eksterns datasæt til noter. Det eksterne datasæt skal matche et af de eksisterende MapComplete lag. For hvert ting, du putter i importeringshjælperen, vil en enkelt note blive oprettet. Disse noter vises sammen med de relevante elementer i disse kort, så de nemt kan tilføjes.", + "importFormat": "En tekst i en note skulle have det følgende format for blive taget med", + "title": "Introduktion" + }, + "login": { + "lockNotice": "Denne side er låst. Du skal have {importHelperUnlock}ændringssæt før du får adgang her.", + "loggedInWith": "De er nu logget ind som {name} og har lavet {csCount} ændringssæt", + "loginIsCorrect": "{name} er den rigtige konto til at lave importnoter med.", + "loginRequired": "Du skal være logget ind for at gå videre", + "title": "Log ind", + "userAccountTitle": "Vælg en brugerkonto" + }, + "mapPreview": { + "confirm": "Elementerne er det rigtige sted på kortet", + "mismatch": "{count} elementer matchede ikke det valgte lag. Sørg for at mærkerne, der indikerer typen er der, nemlig {tags}", + "selectLayer": "Hvilket lag passer denne importering med?", + "title": "Forhåndsvisning af kort" + }, + "noteParts": { + "datasource": "Originalt data fra {source}", + "importEasily": "Tilføj nemt dette punkt med MapComplete:", + "wikilink": "Mere information om denne importering kan findes på {wikilink}" + }, + "previewAttributes": { + "allAttributesSame": "Alle elementer til importering har dette mærke", + "inspectDataTitle": "Inspicer data for {count} elementer til importering", + "inspectLooksCorrect": "Disse værdier ser korrekte ud", + "someHaveSame": "{count} elementer til importering har dette mærke, det er {percentage}% af totalen", + "title": "Inspicer attributter" + }, + "selectFile": { + "description": "Vælg en .csv eller .geojson fil for at komme i gang", + "errDuplicate": "Flere kolonner har det samme navn", + "errNoLatOrLon": "Headeren indeholder ikke `lat` eller `lon`", + "errNoName": "Nogle kolonner har ikke et navn", + "errNotFeatureCollection": "Den indlæste JSON fil er ikke en geojson-featurecollection", + "errPointsOnly": "Den indlæste JSON-fil skal kun indeholde punkter", + "fileFormatDescription": "Vælg en .csv eller en .geojson fil", + "noFilesLoaded": "Ingen fil er indlæst", + "title": "Vælg fil" + }, + "selectTheme": { + "displayNonMatchingCount": "{length} objekter passer ikke med nogen forudindstillinger", + "missing": "Forventede $k}={v}, men det mangler helt", + "needsTags": "{title} skal have mærker {tags}", + "notApplicable": "Forudindstillet {title} kan ikke anvendes:", + "title": "Vælg et tema" + }, + "testMode": "Testmodus - vil ikke faktisk importere noter", + "title": "Importeringshjælper" + }, + "importInspector": { + "title": "Undersøg og håndter noter" + }, + "importLayer": { + "alreadyMapped": "Der er allerede en anden {title} på kortet - dette punkt er en dublet", + "description": "Et lag som importerer poster for {title}", + "layerName": "Mulig {title}", + "notFound": "Jeg kunne ikke finde {title} - fjern det", + "popupTitle": "Mulig {title}" + }, + "index": { + "featuredThemeTitle": "Fremhævet denne uge", + "pickTheme": "Vælg et tema nedenfor for at komme i gang.", + "title": "Velkommen til MapComplete" + }, + "move": { + "cancel": "Afbryd flytning", + "cannotBeMoved": "Dette element kan ikke flyttes.", + "confirmMove": "Flyt her", + "inviteToMove": { + "generic": "Flyt dette punkt", + "reasonInaccurate": "Forbedr nøjagtigheden for dette punkt" + }, + "inviteToMoveAgain": "Flyt dette punkt igen", + "loginToMove": "Du skal være logget ind for at flytte et punkt", + "moveTitle": "Flyt dette punkt", + "pointIsMoved": "Dette punkt er blevet flyttet", + "selectReason": "Hvorfor flytter du dette objekt?", + "whyMove": "Hvorfor vil du flytte dette punkt?", + "zoomInFurther": "Zoom mere ind for bekræfte denne flytning" + }, + "notes": { + "addAComment": "Tilføj en kommentar", + "addComment": "Tilføj kommentar", + "addCommentAndClose": "Tilføj kommentar og luk", + "addCommentPlaceholder": "Tilføj en kommentar...", + "anonymous": "Anonym bruger", + "closeNote": "Luk note", + "createNote": "Lav en ny note", + "createNoteTitle": "Opret en ny note her", + "disableAllNoteFilters": "Slå alle filtre fra", + "isClosed": "Denne note er løst", + "isCreated": "Din note er oprettet!", + "loginToAddComment": "Log ind for at tilføje en kommentar", + "loginToAddPicture": "Log ind for tilføje et billede", + "loginToClose": "Log ind for at lukke denne note", + "noteIsPublic": "Dette vil kunne ses af alle", + "noteLayerDoEnable": "Slå laget, der viser noter, til", + "noteLayerHasFilters": "Nogle noter kan være skjult af et filter", + "reopenNote": "Genåbn note", + "reopenNoteAndComment": "Genåbn note og kommenter", + "textNeeded": "Indtast en beskrivende tekst for at oprette en note", + "typeText": "Indtast noget tekst for at tilføje en kommentar" + }, + "privacy": { + "geodataTitle": "Din placering", + "miscCookiesTitle": "Andre cookies", + "title": "Privatlivspolitik", + "trackingTitle": "Statistisk data", + "whileYoureHere": "Sætter du pris på privatliv?" + }, + "professional": { + "aboutMc": { + "internalUse": { + "title": "Brug af data i interne processer" + }, + "layers": { + "title": "Hvilke data kan blive vist med MapComplete?" + }, + "survey": { + "title": "Kortlægningsmuligheder" + }, + "title": "Brug MapComplete i din organisation" + }, + "aboutOsm": { + "aboutOsm": { + "li3": "og meget, meget mere…", + "title": "Hvad er OpenStreetMap?" + }, + "benefits": { + "title": "Fordele ved OSM økosystemet" + }, + "license": { + "li0": "Et produkt, der bruger OpenStreetMap data, skal kreditere.", + "outro": "Licensen har nogle få konsekvenser - Disse er forklaret nedenfor.", + "title": "Licensen" + }, + "vandalism": { + "intro": "Eftersom alle kan redigere data, er det faktisk muligt, at der forekommer en ondsindet ændring. Det er imidlertid ekstremt sjælden af nogle få årsager:", + "li0": "den tekniske barriere for at foretage ændringer er høj", + "li4": "I Belgien (og visse andre lande), bliver den første ændring af ny bidragsyder systematisk checket og hvis nødvendigt, rettet.", + "title": "Hvad med vandalisme?" + } + }, + "drawbacks": { + "licenseNuances": { + "li0": "Al data kan bruges til ethvert formål - deriblandt kommercielle formål", + "title": "Konsekvenser af ODbL: nogle use cases", + "usecaseGatheringOpenData": { + "title": "Indsamle åben data" + }, + "usecaseMapDifferentSources": { + "li1": "...hvorimod alle-rettigheder-forbeholdes licenserne ville forbyde dette.", + "title": "Dannelse af kort fra forskellige kilder" + } + }, + "title": "Nogle få ulemper at holde sig for øje", + "unsuitedData": { + "title": "Data uegnet for OpenStreetMap" + } + }, + "indexPage": { + "button": "Opdag vore tjenester", + "hook": "Brug for professionel støtte?" + }, + "services": { + "intro": "Udviklerne af MapComplete kan hjælpe dig med følgende tjenester:", + "li0": "Opsætning af et tema skræddersyet efter dine behov", + "li1": "Hjælp med opsætning af internt data flow til integration med OpenStreetMap", + "title": "MapComplete tjenester" + }, + "title": "Professionel støtte med MapComplete" + }, + "reviews": { + "affiliated_reviewer_warning": "(Tilknyttet anmeldelse)", + "no_rating": "Ingen vurdering givet", + "plz_login": "Log ind for at give en anmeldelse", + "posting_as": "Anmelder som", + "saved": "Anmeldelse gemt. Tak for at bidrage!", + "saving_review": "Gemmer…", + "title": "{count} Anmeldelser", + "title_singular": "En anmeldelse", + "write_a_comment": "Skriv en anmeldelse…" + }, + "split": { + "cancel": "Afbryd", + "hasBeenSplit": "Denne vej er blevet opdelt", + "split": "Opdel" + }, + "translations": { + "activateButton": "Hjælp med at oversætte MapComplete", + "deactivate": "Slå oversættelsesknapper fra", + "missing": "{count} uoversatte strenge" + }, + "validation": { + "color": { + "description": "En farve eller hex-kode" + }, + "date": { + "description": "En dato, der starter med årstallet" + }, + "decimal": { + "description": "Et tal" + }, + "email": { + "description": "email-adresse", + "feedback": "Dette er ikke en gyldig emailadresse", + "noAt": "En emailadresse skulle indeholde et @" + }, + "float": { + "description": "et tal", + "feedback": "Dette er ikke et tal" + }, + "int": { + "description": "et heltal" + }, + "nat": { + "description": "et positivt heltal eller nul", + "mustBePositive": "Dette tal skal være positivt", + "mustBeWhole": "Kun heltal er tilladt", + "notANumber": "Indtast et tal" + }, + "opening_hours": { + "description": "Åbningstider" + }, + "pfloat": { + "description": "et positivt heltal" + }, + "phone": { + "description": "et telefonnummer", + "feedback": "Dette er ikke et gyldigt telefonnummer" + }, + "pnat": { + "description": "et positivt heltal", + "noZero": "Nul er ikke tilladt" + }, + "string": { + "description": "et stykke tekst" + }, + "text": { + "description": "et stykke tekst" + }, + "url": { + "description": "link til en webside", + "feedback": "Dette er ikke et gyldigt link" + }, + "wikidata": { + "description": "En Wikidata identifier" + } + } +} diff --git a/langs/de.json b/langs/de.json index dcbdbfe5fb..92f29e3c44 100644 --- a/langs/de.json +++ b/langs/de.json @@ -39,7 +39,7 @@ }, "general": { "about": "OpenStreetMap für ein bestimmtes Thema einfach bearbeiten und hinzufügen", - "aboutMapcomplete": "

Über MapComplete

Nutzen Sie MapComplete, um OpenStreetMap-Informationen zu einem einzigen Thema hinzuzufügen. Beantworten Sie Fragen, und in wenigen Minuten sind Ihre Beiträge überall verfügbar. Der Theme-Maintainer definiert Elemente, Fragen und Sprachen dafür.

Mehr erfahren

MapComplete bietet immer den nächsten Schritt, um mehr über OpenStreetMap zu erfahren.

  • In einer Website eingebettet, verlinkt der iframe zu einer Vollbildversion von MapComplete
  • Die Vollbildversion bietet Informationen über OpenStreetMap
  • Das Betrachten funktioniert ohne Anmeldung, aber das Bearbeiten erfordert ein OSM-Konto.
  • Wenn Sie nicht angemeldet sind, werden Sie dazu aufgefordert
  • Sobald Sie eine Frage beantwortet haben, können Sie der Karte neue Punkte hinzufügen
  • Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt werden


Haben Sie ein Problem bemerkt? Haben Sie einen Funktionswunsch? Möchten Sie bei der Übersetzung helfen? Hier geht es zum Quellcode und Issue Tracker

Möchten Sie Ihren Fortschritt sehen? Verfolgen Sie Ihre Änderungen auf OsmCha.

", + "aboutMapcomplete": "

Über MapComplete

Nutzen Sie MapComplete, um OpenStreetMap-Informationen zu einem bestimmten Thema hinzuzufügen. Beantworten Sie Fragen, und in wenigen Minuten sind Ihre Beiträge überall verfügbar. Der Theme-Maintainer definiert Elemente, Fragen und Sprachen dafür.

Mehr erfahren

MapComplete bietet immer den nächsten Schritt, um mehr über OpenStreetMap zu erfahren.

  • In einer Website eingebettet, verlinkt der iframe zu einer Vollbildversion von MapComplete
  • Die Vollbildversion bietet Informationen über OpenStreetMap
  • Das Betrachten funktioniert ohne Anmeldung, aber das Bearbeiten erfordert ein OSM-Konto.
  • Wenn Sie nicht angemeldet sind, werden Sie dazu aufgefordert
  • Sobald Sie eine Frage beantwortet haben, können Sie der Karte neue Punkte hinzufügen
  • Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt werden


Haben Sie ein Problem bemerkt? Haben Sie einen Funktionswunsch? Möchten Sie bei der Übersetzung helfen? Hier geht es zum Quellcode und Issue Tracker

Möchten Sie Ihren Fortschritt sehen? Verfolgen Sie Ihre Änderungen auf OsmCha.

", "add": { "addNew": "Füge {category} hinzu", "addNewMapLabel": "Hier klicken, um ein neues Element hinzuzufügen", @@ -119,6 +119,7 @@ "title": "Sichtbare Daten herunterladen", "uploadGpx": "Lade deinen Track auf OpenStreetMap hoch" }, + "error": "Etwas ist schief gelaufen", "example": "Beispiel", "examples": "Beispiele", "fewChangesBefore": "Bitte beantworten Sie ein paar Fragen zu bestehenden Punkten, bevor Sie einen neuen Punkt hinzufügen.", @@ -148,9 +149,10 @@ "streetcomplete": "Eine ähnliche App ist StreetComplete." }, "nameInlineQuestion": "Der Name dieser {category} ist $$$", - "next": "Nächstes", + "next": "Weiter", "noNameCategory": "{category} ohne Namen", "noTagsSelected": "Keine Tags ausgewählt", + "notValid": "Gültigen Wert auswählen, um fortzufahren", "number": "Zahl", "oneSkippedQuestion": "Eine Frage wurde übersprungen", "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.

", @@ -276,16 +278,79 @@ "willBePublished": "Ihr Bild wird veröffentlicht " }, "importHelper": { + "askMetadata": { + "downloadGeojson": "geojson herunterladen", + "giveDescription": "Bitte schreiben Sie eine kurze Beschreibung für jemanden, der die Notiz sieht. Eine gute Notiz beschreibt, was der Mitwirkende zu tun hat, z.B. Hier könnte eine Bank stehen. Wenn Sie in der Nähe sind, könnten Sie bitte überprüfen und angeben, ob die Bank existiert oder nicht? (Ein Link zu MapComplete wird automatisch hinzugefügt)", + "giveSource": "Was ist die Quelle dieser Daten? Wenn 'source' bereits als Attribut am Objekt vorhanden ist, wird dieser Wert ignoriert", + "giveWikilink": "Auf welcher Wikiseite gibt es weitere Informationen zu diesem Import?", + "intro": "Bevor Sie {count} Notizen hinzufügen, geben Sie bitte einige zusätzliche Informationen an.", + "orDownload": "Alternativ können Sie den Datensatz auch herunterladen und direkt importieren", + "shouldBeOsmWikilink": "Link zu einer Seite auf wiki.openstreetmap.org erwartet", + "shouldBeUrl": "Keine gültige URL", + "shouldNotBeHomepage": "Nein, die Homepage ist auch nicht erlaubt. Geben Sie die URL einer geeigneten Wikiseite ein, die Ihren Import dokumentiert", + "title": "Metadaten angeben" + }, + "compareToAlreadyExistingNotes": { + "completelyImported": "Alle vorgeschlagenen Punkte haben (oder hatten) bereits eine Importnotiz", + "loading": "Notizen von OSM abrufen", + "loadingFailed": "Laden von Notizen fehlgeschlagen aufgrund von {error}", + "mapExplanation": "Die roten Elemente auf der nächsten Karte sind alle Datenpunkte aus Ihrem Datensatz. Es gibt {length} Elemente in Ihrem Datensatz.", + "noPreviousNotesFound": "Keine früheren Importnotizen gefunden", + "nothingNearby": "Alle vorgeschlagenen Punkte haben keine vorherige Importnotiz in der Nähe", + "someNearby": "{hasNearby} Punkte haben eine bereits eine Importnotiz innerhalb {distance} Meter", + "title": "Mit vorhandenen Hinweisen vergleichen", + "titleLong": "Mit bereits vorhandenen 'zu-importieren'-Notizen vergleichen", + "wontBeImported": "Diese Datenpunkte werden nicht importiert und sind als rote Punkte auf der Karte unten dargestellt" + }, + "confirmProcess": { + "contactedCommunity": "Ich habe die (lokale) Community wegen dieses Imports kontaktiert", + "licenseIsCompatible": "Die Lizenz der zu importierenden Daten erlaubt es, sie in OSM zu importieren. Sie dürfen kommerziell weiterverteilt werden, mit nur minimaler Namensnennung", + "readImportGuidelines": "Ich habe die Importrichtlinien im OSM-Wiki gelesen", + "title": "Lizenz und Gemeinschaft", + "titleLong": "Haben Sie den Importvorgang durchlaufen?", + "wikipageIsMade": "Der Vorgang ist im OSM-Wiki dokumentiert (diesen Link benötigen Sie später)" + }, + "conflationChecker": { + "cacheExpired": "Der Cache ist abgelaufen", + "downloadOverpassData": "Die geladene geojson Datei von overpass herunterladen", + "importCandidatesCount": "Die {count} roten Elemente auf der folgenden Karte sind alle Ihre Importkandidaten.", + "loadedDataAge": "Geladene Daten stammen aus dem Cache und sind {age} alt", + "mapShowingNearbyIntro": "Die folgende Karte zeigt zu importierende Objekte, die ein OSM-Objekt enthalten ", + "nearbyWarn": "Die {count} roten Elemente auf der folgenden Karte werden nicht importiert!", + "nothingLoaded": "Es werden keine Elemente aus OpenStreetMap geladen, die dem aktuellen Layer {name} entsprechen", + "osmLoaded": "{count} Elemente werden aus OpenStreetMap geladen, die dem Layer {name} entsprechen.", + "setRangeToZero": "Setzen Sie den Bereich auf 0 oder 1, wenn Sie alle importieren möchten", + "states": { + "error": "Letzte Daten nicht von overpass heruntergeladen aufgrund von {error}", + "idle": "Lokalen Speicher überprüfen...", + "running": "Abfrage bei overpass...", + "unexpected": "Unerwarteter Zustand {state}" + }, + "title": "Mit vorhandenen Daten vergleichen", + "titleLive": "Live-Daten auf OSM", + "titleNearby": "Objekte in der Nähe", + "zoomIn": "Live-Daten werden ab Zoomstufe {needed} angezeigt. Die aktuelle Zoomstufe ist {current}" + }, + "createNotes": { + "creating": "{count} Notizen von {total} erstellt", + "done": "Alle {count} Notizen wurden erstellt!", + "loading": "Bitte warten, Daten werden geladen...", + "openImportViewer": "Sehen Sie den Fortschritt Ihrer Notizen im 'import_viewer'", + "title": "Notizerstellung" + }, + "gotoImportViewer": "Vorherige Importe überprüfen", "introduction": { - "description": "Der Import-Helfer konvertiert einen externen Datensatz in Hinweise. Der externe Datensatz muss mit einer der vorhandenen MapComplete-Ebenen übereinstimmen. Für jedes Element, das Sie in den Import-Helfer eingeben, wird ein einzelner Hinweis erstellt. Diese Hinweise werden zusammen mit den entsprechenden Objekten in diesen Karten angezeigt, um sie leicht hinzufügen zu können.", - "importFormat": "Der Hinweistext sollte folgendes Format haben, um aufgenommen zu werden:
[Eine kleine Einführung]
https://mapcomplete.osm.be/[themenname].html?[Parameter wie lat und lon]#import
[alle Tags des Objekts]
" + "description": "Der Import-Helfer konvertiert einen externen Datensatz in Hinweise. Der externe Datensatz muss mit einer vorhandenen MapComplete-Ebene übereinstimmen. Für jedes Element, das Sie in den Importer eingeben, wird eine einzelner Hinweis erstellt. Diese Hinweise werden zusammen mit den entsprechenden Objekten in diesen Karten angezeigt, um sie leicht hinzufügen zu können.", + "importFormat": "Der Hinweistext sollte das folgende Format haben, um aufgenommen zu werden", + "title": "Einführung" }, "login": { - "lockNotice": "Diese Seite ist gesperrt. Du brauchst die Änderungen {importHelperUnlock} bevor du die Seite öffnen kannst.", - "loggedInWith": "Du bist eingeloggt als {name} und hast {csCount} Änderungen", - "loginIsCorrect": "{name} ist der richtige Account um Importnotizen zu erstellen.", - "loginRequired": "Sie müssen eingeloggt sein, um fortzufahren", - "userAccountTitle": "Wähle einen Benutzeraccount" + "lockNotice": "Diese Seite ist gesperrt. Zum Zugang werden {importHelperUnlock} Änderungssätze benötigt.", + "loggedInWith": "Sie sind derzeit angemeldet als {name} und haben {csCount} Änderungen vorgenommen", + "loginIsCorrect": "{name} ist das richtige Konto, mit dem die Importhinweise erstellt werden.", + "loginRequired": "Bitte anmelden, um fortzufahren", + "title": "Anmeldung", + "userAccountTitle": "Benutzerkonto auswählen" }, "mapPreview": { "autodetected": "Die Ebene wurde anhand der Eigenschaften automatisch abgezogen", @@ -294,11 +359,17 @@ "selectLayer": "Zu welcher Ebene passt dieser Import?", "title": "Kartenvorschau" }, + "noteParts": { + "datasource": "Originaldaten von {source}", + "importEasily": "Diesen Punkt einfach mit MapComplete hinzufügen:", + "wikilink": "Weitere Informationen über diesen Import unter {wikilink}" + }, "previewAttributes": { "allAttributesSame": "Alle zu importierenden Objekte haben diesen Tag", "inspectDataTitle": "Daten von {count} zu importierenden Objekten prüfen", - "inspectLooksCorrect": "Die Werte sehen richtig aus", - "someHaveSame": "{count} der zu importierenden Objekte haben dieses Tag, das sind {percentage}% der Gesamtzahl" + "inspectLooksCorrect": "Diese Werte sehen korrekt aus", + "someHaveSame": "{count} zu importierende Objekte haben diesen Tag, das sind {percentage}% der Gesamtanzahl", + "title": "Attribute prüfen" }, "selectFile": { "description": "Wähle eine .csv oder .geojson Datei um anzufangen", @@ -312,8 +383,20 @@ "fileFormatDescriptionGeoJson": "In der geojson-Datei sollten nur Punkte enthalten sein. Die Eigenschaften sollten genau die Eigenschaften sein, die in OpenStreetMap verwendet werden sollen", "loadedFilesAre": "Die Datei {file} ist geladen", "noFilesLoaded": "Keine Datei geladen", - "title": "Wähle eine Datei" + "title": "Datei auswählen" }, + "selectTheme": { + "displayNonMatchingCount": "{length} Objekte stimmen nicht mit Voreinstellungen überein", + "intro": "Alle folgenden Themen zeigen die Importhinweise an. Die Notiz auf OpenStreetMap kann jedoch nur mit einem einzigen Thema verknüpft werden. Wählen Sie das Thema, mit dem die erstellten Notizen verknüpft werden sollen", + "misMatch": "Eigenschaft mit Schlüssel {k} hat nicht den erwarteten Wert {v}; stattdessen ist es {properties}", + "missing": "Erwartet $k}={v}, aber es fehlt komplett", + "needsTags": "{title} benötigt tags {tags}", + "noMatchingPresets": "Dieses Thema hat keine Voreinstellungen geladen. Daher werden Importe hier nicht funktionieren", + "notApplicable": "Voreinstellung {title} ist nicht anwendbar:", + "title": "Thema auswählen", + "unmatchedTitle": "Die folgenden Elemente stimmen mit keiner Voreinstellung überein" + }, + "testMode": "Testmodus - Notizen werden nicht importiert", "title": "Import-Helfer" }, "importInspector": { @@ -362,7 +445,7 @@ "zoomInFurther": "Weiter vergrößern, um die Verschiebung zu bestätigen" }, "multi_apply": { - "autoApply": "Wenn Sie die Attribute {attr_names} ändern, werden diese Attribute automatisch auch auf {count} anderen Objekten geändert" + "autoApply": "Wenn Sie die Attribute {attr_names} ändern, diese Änderung automatisch auch auf {count} andere Objekte angewendet" }, "notes": { "addAComment": "Füge einen Kommentar hinzu", @@ -471,6 +554,7 @@ "title": "Sammeln offener Daten" }, "usecaseMapDifferentSources": { + "intro": "Man könnte zum Beispiel eine Karte mit allen Bänken in einer Stadt erstellen, die auf den von OpenStreetMap bekannten Bänken basiert. Diese gedruckte Karte muss einen klaren Hinweis enthalten, dass die Kartendaten auf OpenStreetMap basieren. Stellt der Kartenmacher fest, dass in einem bestimmten Gebiet Bänke fehlen, und fügt diese auf der gedruckten Karte hinzu, sind die Daten zu den fehlenden Bänken automatisch auch offene Daten. Das bedeutet, dass ein OpenStreetMap-Mitwirkender die gedruckte Karte nehmen und sie verwenden darf, um die fehlenden Bänke wieder in OpenStreetMap einzufügen. Dieser Mitwirkende hat auch das Recht, den Datensatz der fehlenden Bänke anzufordern, der ebenfalls bereitgestellt werden sollte.

Natürlich kann eine Karte nur mit Bänken langweilig sein. Der Kartenersteller könnte auch beschließen, eine Ebene mit Geschäften hinzuzufügen, die möglicherweise von einem anderen Geodatenanbieter unter einer anderen Lizenz bezogen werden. Dies ist zulässig, wenn auf der Karte deutlich angegeben wird, dass die Bänke von OSM (unter ODBL) stammen und die Geschäfte eine andere Quelle haben (eventuell mit einem \"All rights reserved\"). Wenn der Kartenersteller z. B. feststellt, dass OSM über ausgezeichnete Daten zu Bänken in einem Teil der Stadt verfügt und der Closed-Source-Anbieter über ausgezeichnete Daten zu Bänken in einem anderen Teil der Stadt, könnte die Zusammenführung dieser Datensätze zu einem einzigen problematisch sein:

", "li0": "die offene Lizenz würde verlangen, dass die Modifikationen offen wiederveröffentlicht werden…", "li1": "...wohingegen die All-Rights-Reserved-Lizenz dies untersagen würde.", "outro": "Folglich ist diese Art der Vermischung nicht erlaubt", @@ -487,7 +571,7 @@ } }, "indexPage": { - "button": "Erfahren Sie mehr über unsere Dienstleistungen", + "button": "Mehr über unsere Dienste erfahren", "hook": "Benötigen Sie professionelle Unterstützung?", "hookMore": "Wir können bei der Erstellung von Umfragen, Datenimporten und OpenStreetMap-Beratung helfen" }, diff --git a/langs/en.json b/langs/en.json index a65378e4da..4b6f74a0ee 100644 --- a/langs/en.json +++ b/langs/en.json @@ -119,7 +119,7 @@ "title": "Download visible data", "uploadGpx": "Upload your track to OpenStreetMap" }, - "error": "Something went wrong...", + "error": "Something went wrong", "example": "Example", "examples": "Examples", "fewChangesBefore": "Please, answer a few questions of existing points before adding a new point.", @@ -203,6 +203,8 @@ "sharescreen": { "addToHomeScreen": "

Add to your home screen

You can easily add this website to your smartphone home screen for a native feel. Click the 'Add to home screen' button in the URL bar to do this.", "copiedToClipboard": "Link copied to clipboard", + "downloadCustomTheme": "Download the configuration for this theme", + "downloadCustomThemeHelp": "An experienced contributor can use this file to improve your theme", "editThemeDescription": "Add or change questions to this map theme", "editThisTheme": "Edit this theme", "embedIntro": "

Embed on your website

Please, embed this map into your website.
We encourage you to do it - you don't even have to ask permission.
It is free, and always will be. The more people are using this, the more valuable it becomes.", @@ -296,7 +298,7 @@ "loadingFailed": "Loading notes failed due to {error}", "mapExplanation": "The red elements on the next map are all the data points from your dataset. There are {length} elements in your dataset.", "noPreviousNotesFound": "No previous import notes found", - "nothingNearby": "All of the proposed points have don't have a previous import note nearby", + "nothingNearby": "None of the proposed points have an import note nearby", "someNearby": "{hasNearby} points do have an already existing import note within {distance} meter", "title": "Compare with existing notes", "titleLong": "Compare with already existing 'to-import'-notes", @@ -319,6 +321,7 @@ "nearbyWarn": "The {count} red elements on the following map will not be imported!", "nothingLoaded": "No elements are loaded from OpenStreetMap which match the current layer {name}", "osmLoaded": "{count} elements are loaded from OpenStreetMap which match the layer {name}.", + "reloadTheCache": "Clear the cache and query overpass again", "setRangeToZero": "Set the range to 0 or 1 if you want to import them all", "states": { "error": "Could not load latest data from overpass due to {error}", diff --git a/langs/es.json b/langs/es.json index 7aeb05d294..f2b9ed4cc4 100644 --- a/langs/es.json +++ b/langs/es.json @@ -11,9 +11,23 @@ "delete": "Eliminar", "explanations": { "hardDelete": "Este punto será eliminado en OpenStreetMap. Puede ser recuperado por un colaborador experimentado", - "selectReason": "Por favor, seleccione el motivo por el que esta característica debe ser eliminada" + "selectReason": "Por favor, seleccione el motivo por el que esta característica debe ser eliminada", + "softDelete": "Esta característica se actualizará y ocultará en esta aplicación. <spann class='subtle'>{reason}" }, "isDeleted": "Esta función se ha eliminado", + "isntAPoint": "Solo los puntos pueden ser eliminados, esta característica es una vía, área o relación.", + "loading": "Inspeccionando las propiedades para comprobar si esta característica puede ser eliminada.", + "loginToDelete": "Debes de haber iniciado sesión para eliminar un punto", + "notEnoughExperience": "Este punto fue hecho por otra persona.", + "onlyEditedByLoggedInUser": "Este punto solo ha sido editado por ti, puedes eliminarlo de manera segura.", + "partOfOthers": "Este punto forma parte de alguna vía o relación y no puede ser eliminada de manera directa.", + "readMessages": "Tienes mensajes sin leer. Léelos antes de eliminar un punto - alguien puede tener algún comentario", + "reasons": { + "disused": "Esta característica está fuera de uso o eliminada", + "duplicate": "Este punto es un duplicado de otra característica", + "notFound": "Esta característica no se puedo encontrar", + "test": "Esto era un punto de pruebas - la característica en realidad nunca estuvo ahí" + }, "safeDelete": "Este punto puede ser eliminado con seguridad.", "useSomethingElse": "Utilice otro editor de OpenStreetMap para eliminarlo", "whyDelete": "¿Por qué debería eliminarse este punto?" @@ -25,6 +39,7 @@ }, "general": { "about": "Edita fácilmente y añade puntos en OpenStreetMap de un tema concreto", + "aboutMapcomplete": "

Aceca de MapComplete

Lo utilizamos para añadir información de OpenStreetMap en un único tema. Responde preguntas, y en minutos tus contribuciones estarán disponibles en todos lados. El mantenedor del tema define elementos, preguntas e idiomas para él.

Descubre más

MapComplete siempre ofrece el siguiente paso para aprender más sobre OpenStreetMap.

  • Cuando se embebe en un sitio web, el iframe enlaza a un MapComplete a pantalla completa
  • La versión a pantalla completa ofrece información sobre OpenStreetMpa
  • Se puede ver el trabajo sin iniciar sesión, pero la edición requiere una cuenta de OSM.
  • Si no has iniciado sesión, se te pedirá que lo hagas
  • Una vez que hayas respondido a una simple pregunta, podrás añadir nuevos puntos al mapa
  • Después de un poco, las etiquetas de OSM se mostrarán, después de enlazar a la wiki


¿Te fijaste en un problema? Tienes una petición de característica?¿Quieres ayudar a traducir? Ve al código fuente o issue tracker.

¿Quieres ver tu progreso? Sigue a la cuenta de ediciones en OsmCha.

", "add": { "addNew": "Añadir {category}", "addNewMapLabel": "Haga clic aquí para añadir un nuevo ítem", @@ -35,6 +50,7 @@ "hasBeenImported": "Este punto ya ha sido importado", "import": { "hasBeenImported": "Este objeto ya ha sido importado", + "howToTest": "Para probar, añade test=true o backend=osm-test a la URL. El conjunto de cambios se imprimirá en la consola. Por favor abre un PR para oficializar este tema o activar el botón \"importar\".", "importTags": "El elemento recibirá {tags}", "officialThemesOnly": "El botón de importación está desactivado para los temas no oficiales para evitar accidentes", "wrongType": "Este elemento no es un punto o una vía y no puede ser importado", @@ -60,38 +76,74 @@ "attribution": { "attributionContent": "

Todos los datos son proporcionados por OpenStreetMap, reutilizables libremente bajo la Licencia Abierta de Bases de Datos (ODL).

", "attributionTitle": "Aviso de atribución", + "codeContributionsBy": "MapComplete ha sido construido por {contributors} y {hiddenCount} más contribuidores", + "donate": "Apoya a MapComplete de manera financiera", + "editId": "Abre el editor en línea de OpenStreetMap aquí", + "editJosm": "Edita aquí conJOSM", "iconAttribution": { "title": "Iconos usados" }, + "josmNotOpened": "No se pudo llegar a JSOM. Asegúrate de que esta abierto y que el control remoto esta activado", + "josmOpened": "JOSM está abierto", "mapContributionsBy": "La información visible actual tiene ediciones hechas por {contributors}", - "themeBy": "Tema mantenido por {author}" + "mapContributionsByAndHidden": "Los datos actualmente visibles tienen ediciones hechas por {contributors} y {hiddenCount} más contribuidores", + "openIssueTracker": "Reportar un error", + "openMapillary": "Abrir Mapillary aquí", + "openOsmcha": "Ver las últimas ediciones hechas con {theme}", + "themeBy": "Tema mantenido por {author}", + "translatedBy": "MapComplete ha sido traducido por {contributors} y {hiddenCount} más contribuidores" }, "back": "Atrás", + "backToMapcomplete": "Volver a la vista de temas", "backgroundMap": "Mapa de fondo", "cancel": "Cancelar", "confirm": "Confirmar", "customThemeIntro": "

Temas personalizados

Estos son los temas generados por los usuarios que han sido visitados previamente.", "download": { - "exporting": "Exportando…" + "downloadAsPdf": "Descargar un PDF del mapa actual", + "downloadAsPdfHelper": "Ideal para imprimir el mapa actual", + "downloadAsSvg": "Descargar un SVG del mapa actual", + "downloadCSV": "Descargar los datos visibles como CSV", + "downloadCSVHelper": "Compatible con LibreOffice Calc, Excel, …", + "downloadFeatureAsGeojson": "Descargar como un archivo GeoJson", + "downloadFeatureAsGpx": "Descargar como archivo GPX", + "downloadGeoJsonHelper": "Compatible con QGIS, ArcGIS, ESRI, …", + "downloadGeojson": "Descargar los datos visibles como GeoJSON", + "downloadGpx": "Descargar como archivo GPX", + "downloadGpxHelper": "Un archivo GPX puede ser utilizado con la mayor parte de dispositivos y aplicaciones de navegación", + "exporting": "Exportando…", + "includeMetaData": "Incluir metadatos (último editor, valores calculados, ...)", + "licenseInfo": "

Aviso de derechos

Los datos provistos están disponibles bajo ODbL. Reutilizarlos es gratis para cualquier propósito, pero
  • la actribución © contribuidores d e OpenStreetMap se requiere
  • Cualquier cambio debe de utilizar la licencia
Por favor leer todo el aviso de derechos para detalles.", + "noDataLoaded": "Aún no se han cargado ningunos daos. La descarga estará disponible proximamente", + "title": "Descargar los datos visibles", + "uploadGpx": "Sube tu traza a OpenStreetMap" }, + "error": "Algo fue mal", "example": "Ejemplo", "examples": "Ejemplos", "fewChangesBefore": "Contesta unas cuantas preguntas sobre puntos existentes antes de añadir nuevos.", "getStartedLogin": "Entra en OpenStreetMap para empezar", "getStartedNewAccount": " o crea una nueva cuenta", "goToInbox": "Abrir mensajes", + "histogram": { + "error_loading": "No se pudo cargar el histograma" + }, "layerSelection": { "title": "Seleccionar capas", "zoomInToSeeThisLayer": "Amplía para ver esta capa" }, "loading": "Cargando…", "loadingTheme": "Cargar {theme}...", + "loginFailed": "El inicio de sesión en OpenStreetMap falló", + "loginOnlyNeededToEdit": "Si quieres editar el mapa", "loginToStart": "Entra para contestar esta pregunta", "loginWithOpenStreetMap": "Acceder con OpenStreetMap", "logout": "Cerrar la sesión", "morescreen": { "createYourOwnTheme": "Crea tu propia petición completa de MapComplete desde cero.", + "hiddenExplanation": "Estos temas solo son visibles para aquellos con el enlace. Has descubierto {hidden_discovered} de {total_hidden} temas ocultos.", "intro": "

Más peticiones

Te gusta captar datos?
Hay más capas disponibles.", + "previouslyHiddenTitle": "Temas ocultos previamente visitados", "requestATheme": "Si quieres que te hagamos una petición propia , pídela aquí.", "streetcomplete": "Otra aplicación similar es StreetComplete." }, @@ -99,6 +151,7 @@ "next": "Siguiente", "noNameCategory": "{category} sin nombre", "noTagsSelected": "No se han seleccionado etiquetas", + "notValid": "Selecciona un valor válido para continuar", "number": "número", "oneSkippedQuestion": "Has ignorado una pregunta", "openStreetMapIntro": "

Un mapa abierto

¿No sería genial si hubiera un solo mapa, que todos pudieran usar y editar libremente?¿Un solo lugar para almacenar toda la información geográfica? Entonces, todos esos sitios web con mapas diferentes, pequeños e incompatibles (que siempre están desactualizados) ya no serían necesarios.

OpenStreetMap es ese mapa. Los datos del mapa se pueden utilizar de forma gratuita (con atribución y publicación de cambios en esos datos). Además de eso, todos pueden agregar libremente nuevos datos y corregir errores. Este sitio web también usa OpenStreetMap. Todos los datos provienen de allí, y tus respuestas y correcciones también se añadirán allí.

Muchas personas y aplicaciones ya usan OpenStreetMap: Maps.me, OsmAnd, pero también los mapas de Facebook, Instagram, Apple y Bing son (en parte) impulsados ​​por OpenStreetMap. Si cambias algo aquí, también se reflejará en esas aplicaciones, en su próxima actualización

", @@ -122,7 +175,8 @@ "pdf": { "attr": "Datos cartográficos © colaboradores de OpenStreetMap, reutilizables en virtud de la ODbL", "attrBackground": "Capa de fondo: {background}", - "generatedWith": "Generado como MapComplete.osm.be" + "generatedWith": "Generado como MapComplete.osm.be", + "versionInfo": "v{version} - generado el {date}" }, "pickLanguage": "Escoge idioma: ", "questions": { @@ -134,8 +188,10 @@ "websiteOf": "Cual es la página web de {category}?" }, "readYourMessages": "Lee todos tus mensajes de OpenStreetMap antes de añadir nuevos puntos.", + "removeLocationHistory": "Eliminar el historial de ubicaciones", "returnToTheMap": "Volver al mapa", "save": "Guardar", + "screenToSmall": "Abrir {theme} en una ventana nueva", "search": { "error": "Alguna cosa no ha ido bien...", "nothing": "Nada encontrado.", @@ -183,24 +239,32 @@ }, "welcomeBack": "Has entrado, bienvenido.", "wikipedia": { + "doSearch": "Busca arriba para ver los resultados", + "failed": "La carga de la entrada de Wikipedia falló", "loading": "Cargando Wikipedia...", + "noResults": "No se encontró nada para {search}", + "noWikipediaPage": "Este ítem de wikidata aún no tiene una página de Wikipedia correspondiente.", "previewbox": { "born": "Nacido: {value}", "died": "Murió: {value}" }, + "searchWikidata": "Buscar en Wikidata", "wikipediaboxTitle": "Wikipedia" } }, "image": { "addPicture": "Añadir foto", "ccb": "bajo licencia CC-BY", + "ccbExplanation": "La licencia CC-BY implica cualquiera podría utilizar tu fotografía para cualquier propósito, pero tienen que atribuirte", "ccbs": "bajo licencia CC-BY-SA", "cco": "en dominio público", + "ccoExplanation": "Añadir una fotografía en el dominio público implica que cualquiera puede hacer cualquier cosa con tu fotografía", "doDelete": "Borrar imagen", "dontDelete": "Cancelar", "isDeleted": "Borrada", "pleaseLogin": "Acceda para cargar una imagen", "respectPrivacy": "No fotografíe personas ni matrículas. No cargue datos de Google Maps, Google StreetView u otras fuentes protegidas por derechos de autor.", + "toBig": "Tu imagen es demasiado grande, ya que pesa {actual_size}. Por favor utiliza imágenes de como máximo {max_size}", "uploadDone": "Se ha añadido la imagen. Gracias por ayudar.", "uploadFailed": "No se pudo cargar la imagen. ¿Tiene Internet y se permiten las API de terceros? El navegador Brave o uMatrix podría bloquearlas.", "uploadMultipleDone": "Se han añadido {count} imágenes. Gracias por ayudar.", @@ -209,6 +273,28 @@ "willBePublished": "La imagen se publicará " }, "importHelper": { + "askMetadata": { + "downloadGeojson": "Descargar geojson", + "giveDescription": "Por favor, escribe una pequeña descripción para alguien que vea la nota. Una buena nota describe lo que el contribuidor tiene que hacer, ej; Puede que haya un banco aquí. Si estás por aquí, ¿Podrías por favor comprueba e indica si el banco existe o no? (Un enlace a MapComplete se añadirá automáticamente)", + "giveWikilink": "¿En qué wikipágina puede encontrar uno más información sobre esta importación?", + "intro": "Antes de añadir {count} notas, por favor provee alguna información extra.", + "orDownload": "Alternativamente, puedes descargar el conjunto de datos para importar directamente", + "shouldBeOsmWikilink": "Se espera un enlace a una página en wiki.openstreetmap.org", + "shouldBeUrl": "No una URL válida", + "shouldNotBeHomepage": "No, tampoco se permite la página de inicio. Introduce la URL de una wikipágina de verdad para documentar tu importación", + "title": "Especificar metadatos" + }, + "compareToAlreadyExistingNotes": { + "completelyImported": "Todos los puntos propuestos ya tienen (o tenían) una nota de importación", + "loading": "Cargando las notas desde OSM", + "loadingFailed": "La carga de las notas falló debido a {error}", + "mapExplanation": "Los elementos rojos en el siguiente mapa son todos los puntos de datos de tu conjunto de datos. Hay {length} elementos en tu conjunto de datos.", + "noPreviousNotesFound": "No se han encontrado notas de importación previas", + "nothingNearby": "Todos los puntos propuestos no tienen una nota de importación previa cerca", + "someNearby": "{hasNearby} puntos sí que tienen una nota de importación ya existente a menos de {distance} metros", + "title": "Comparar con notas existentes", + "wontBeImported": "Estos puntos de datos no serán importados y se muestran como puntos en el mapa de debajo" + }, "mapPreview": { "title": "Previsualización de mapa" }, @@ -234,7 +320,7 @@ }, "notes": { "addComment": "Añadir comentario", - "anonymous": "Usuario anónimo", + "anonymous": "Usuarioi anónimo", "closeNote": "Cerrar nota", "reopenNote": "Reabrir nota" }, diff --git a/langs/layers/da.json b/langs/layers/da.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/langs/layers/da.json @@ -0,0 +1 @@ +{} diff --git a/langs/layers/de.json b/langs/layers/de.json index 172d005452..0220e91464 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -1156,9 +1156,42 @@ } } }, - "name": "Orte zur Vogelbeobachtung" + "name": "Orte zur Vogelbeobachtung", + "presets": { + "0": { + "description": "Ein überdachter Unterstand, in dem man bequem Vögel beobachten kann" + } + }, + "tagRenderings": { + "bird-hide-wheelchair": { + "mappings": { + "3": { + "then": "Nicht zugänglich für Rollstuhlfahrer" + } + } + }, + "birdhide-operator": { + "mappings": { + "0": { + "then": "Betrieben von Natuurpunt" + }, + "1": { + "then": "Betrieben von einer Forst- bzw. Naturschutzbehörde" + } + }, + "render": "Betrieben von {operator}" + } + } }, "cafe_pub": { + "deletion": { + "extraDeleteReasons": { + "0": { + "explanation": "{title()} wurde dauerhaft geschlossen" + } + } + }, + "description": "Eine Ebene mit Cafés und Kneipen, in denen man sich auf ein Getränk treffen kann. Die Ebene fragt nach einigen relevanten Eigenschaften", "filter": { "0": { "options": { @@ -1171,17 +1204,37 @@ "name": "Cafés und Kneipen", "presets": { "0": { + "description": "Eine Kneipe, in der vor allem Bier in ruhiger, entspannter Atmosphäre getrunken wird", "title": "eine kneipe" }, "1": { + "description": "Eine modernere und kommerzielle Bar, möglicherweise mit einer Musik- und Lichtinstallation", "title": "eine bar" }, "2": { + "description": "Ein Café, um in ruhiger Umgebung Tee, Kaffee oder ein alkoholisches Getränk zu trinken", "title": "eine café" } }, "tagRenderings": { "Classification": { + "mappings": { + "0": { + "then": "Eine Kneipe, in der vor allem Bier in ruhiger, entspannter Atmosphäre getrunken wird" + }, + "1": { + "then": "Eine modernere und kommerzielle Bar, möglicherweise mit einer Musik- und Lichtinstallation" + }, + "2": { + "then": "Ein Café, um in ruhiger Umgebung Tee, Kaffee oder ein alkoholisches Getränk zu trinken" + }, + "3": { + "then": "Ein Restaurant, in dem man ordentlich essen kann" + }, + "4": { + "then": "Ein Außenbereich mit Bierausschank, typischerweise in Deutschland" + } + }, "question": "Was ist das für ein Café" }, "Name": { @@ -1194,7 +1247,8 @@ "0": { "then": "{name}" } - } + }, + "render": "Kneipe" } }, "charging_station": { @@ -1248,11 +1302,18 @@ }, "name": "Ladestationen", "presets": { + "0": { + "title": "eine Ladestation für Elektrofahrräder mit einer normalen europäischen Steckdose (zum Laden von Elektrofahrrädern)" + }, "1": { "title": "eine ladestation für e-bikes" } }, "tagRenderings": { + "Auth phone": { + "question": "Wie lautet die Telefonnummer für den Authentifizierungsanruf oder die SMS?", + "render": "Authentifizierung durch Anruf oder SMS an {authentication:phone_call:number}" + }, "Authentication": { "mappings": { "0": { @@ -1283,6 +1344,104 @@ "question": "Welche Art der Authentifizierung ist an der Ladestation möglich?" }, "Available_charging_stations (generated)": { + "mappings": { + "0": { + "then": "Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)" + }, + "1": { + "then": "Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)" + }, + "2": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, + "3": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, + "4": { + "then": "Chademo" + }, + "5": { + "then": "Chademo" + }, + "6": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "7": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "8": { + "then": "Typ 1 ohne Kabel (J1772)" + }, + "9": { + "then": " Typ 1 ohne Kabel (J1772)" + }, + "10": { + "then": "Typ 1 CCS (auch bekannt als Typ 1 Combo)" + }, + "11": { + "then": " Typ 1 CCS (auch bekannt als Typ 1 Combo)" + }, + "12": { + "then": "Tesla Supercharger" + }, + "13": { + "then": "Tesla Supercharger" + }, + "14": { + "then": "Typ 2 (mennekes)" + }, + "15": { + "then": "Typ 2 (mennekes)" + }, + "16": { + "then": "Typ 2 CCS (mennekes)" + }, + "17": { + "then": "Typ 2 CCS (mennekes)" + }, + "18": { + "then": "Typ 2 mit Kabel (mennekes)" + }, + "19": { + "then": "Typ 2 mit Kabel (mennekes)" + }, + "20": { + "then": "Tesla Supercharger CCS (ein Markenzeichen von type2_css)" + }, + "21": { + "then": "Tesla Supercharger CCS (ein Markenzeichen von type2_css)" + }, + "22": { + "then": "Tesla Supercharger (Destination)" + }, + "23": { + "then": "Tesla Supercharger (Destination)" + }, + "24": { + "then": "Tesla supercharger (Destination) (Typ 2 mit Kabel von Tesla)" + }, + "25": { + "then": "Tesla supercharger (Destination) (Typ 2 mit Kabel von Tesla)" + }, + "26": { + "then": "USB zum Aufladen von Handys und kleinen Elektrogeräten" + }, + "27": { + "then": "USB zum Aufladen von Handys und kleinen Elektrogeräten" + }, + "28": { + "then": "Bosch Active Connect mit 3 Pins und Kabel" + }, + "29": { + "then": " Bosch Active Connect mit 3 Pins und Kabel" + }, + "30": { + "then": "Bosch Active Connect mit 5 Pins und Kabel" + }, + "31": { + "then": " Bosch Active Connect mit 5 Pins und Kabel" + } + }, "question": "Welche Ladeanschlüsse gibt es hier?" }, "Network": { @@ -1367,6 +1526,12 @@ }, "access": { "mappings": { + "0": { + "then": "Jeder kann diese Ladestation nutzen (eventuell gegen Bezahlung)" + }, + "1": { + "then": "Jeder kann diese Ladestation nutzen (eventuell gegen Bezahlung)" + }, "2": { "then": "Nur Kunden des Ortes, zu dem diese Station gehört, können diese Ladestation nutzen
Z.B. eine von einem Hotel betriebene Ladestation, die nur von dessen Gästen genutzt werden kann" }, @@ -1377,20 +1542,76 @@ "then": "Nicht für die Allgemeinheit zugänglich (z. B. nur für die Eigentümer, Mitarbeiter, ...)" } }, - "question": "Wer darf diese Ladestation benutzen?" + "question": "Wer darf diese Ladestation benutzen?", + "render": "Zugang ist {access}" }, "capacity": { + "question": "Wie viele Fahrzeuge können hier gleichzeitig geladen werden?", "render": "{capacity} Fahrzeuge können hier gleichzeitig laden" }, "charge": { + "question": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?", "render": "Die Nutzung dieser Ladestation kostet {charge}" }, + "email": { + "question": "Wie lautet die E-Mail-Adresse des Betreibers?", + "render": "Bei Problemen senden Sie bitte eine E-Mail an {email}" + }, "fee": { "mappings": { + "0": { + "then": "Kostenlos nutzbar (ohne Authentifizierung)" + }, + "1": { + "then": "Kostenlose Nutzung, aber man muss sich authentifizieren" + }, + "2": { + "then": "Kostenlose Nutzung" + }, + "3": { + "then": "Kostenpflichtige Nutzung, aber kostenlos für Kunden des Hotels / Pub / Krankenhauses / ... wer die Ladestation betreibt" + }, "4": { "then": "Nutzung gebührenpflichtig" } - } + }, + "question": "Muss man für die Nutzung dieser Ladestation bezahlen?" + }, + "maxstay": { + "mappings": { + "0": { + "then": "Keine Höchstparkdauer" + } + }, + "question": "Wie lange darf man hier maximal parken?", + "render": "Die maximale Parkdauer beträgt {canonical(maxstay)}" + }, + "phone": { + "question": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?", + "render": "Bei Problemen, anrufen unter {phone}" + }, + "plugs-0": { + "question": "Wie viele Stecker vom Typ
Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)
sind hier vorhanden?", + "render": "Hier sind {socket:schuko} Stecker des Typs
Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)
vorhanden" + }, + "plugs-1": { + "question": "Wie viele Stecker des Typs
Europäischer Wandstecker mit Erdungsstift (CEE7/4 Typ E)
sind hier vorhanden?", + "render": "Hier sind {socket:typee} Stecker des Typs
Europäischer Wandstecker mit Erdungsstift (CEE7/4 Typ E)
vorhanden" + }, + "voltage-12": { + "render": "
Tesla Supercharger (Destination) (Typ 2 mit Kabel von Tesla)
liefert {socket:tesla_destination:voltage} Volt" + }, + "voltage-13": { + "mappings": { + "0": { + "then": "USB zum Aufladen von Handys und kleinen Elektrogeräten liefert 5 Volt" + } + }, + "question": "Welche Spannung liefern die Stecker mit
USB zum Laden von Handys und kleinen Elektrogeräten
?", + "render": "
USB zum Aufladen von Telefonen und kleinen Elektrogeräten
liefert {socket:USB-A:voltage} Volt" + }, + "voltage-14": { + "question": "Welche Spannung bieten die Stecker mit
Bosch Active Connect mit 3 Pins und Kabel
?" } } }, @@ -2221,6 +2442,9 @@ "description": "Alle Objekte, die eine bekannte Namensherkunft haben", "name": "Objekte mit Informationen zur Namensherkunft", "tagRenderings": { + "etymology_multi_apply": { + "render": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Automatische Datenübernahme auf alle Segmente mit demselben Namen, true)}" + }, "simple etymology": { "mappings": { "0": { @@ -2387,6 +2611,9 @@ }, "question": "Wenn Sie Ihr eigenes Behältnis mitbringen (z. B. einen Kochtopf und kleine Töpfe), wird es dann zum Verpacken Ihrer Bestellung verwendet?
" }, + "friture-vegetarian": { + "question": "Hat dieser Frittenladen vegetarische Snacks?" + }, "halal (no friture)": { "mappings": { "0": { @@ -2416,10 +2643,12 @@ "2": { "then": "Schnellrestaurant" } - } + }, + "render": "Restaurant" } }, "ghost_bike": { + "description": "Eine Ebene mit Gedenkstätten für Radfahrer, die bei Verkehrsunfällen ums Leben gekommen sind", "name": "Geisterräder", "presets": { "0": { @@ -2437,7 +2666,7 @@ "ghost_bike-name": { "mappings": { "0": { - "then": "Auf dem Fahrrad ist kein Name angegeben" + "then": "Am Fahrrad ist kein Name angegeben" } }, "question": "An wen erinnert dieses Geisterrad?
Bitte respektieren Sie die Privatsphäre - geben Sie den Namen nur an, wenn er weit verbreitet oder auf dem Fahrrad markiert ist. Den Familiennamen können Sie weglassen.
", @@ -2598,6 +2827,7 @@ } }, "information_board": { + "description": "Eine Ebene mit touristischen, straßenseitigen Informationstafeln (z. B. mit Informationen über die Landschaft, ein Gebäude, ein Merkmal, eine Karte, ...)", "name": "Informationstafeln", "presets": { "0": { @@ -2663,6 +2893,9 @@ }, "1": { "options": { + "0": { + "question": "Alle Naturschutzgebiete" + }, "1": { "question": "Hunde dürfen frei herumlaufen" }, @@ -2673,7 +2906,37 @@ } }, "name": "Naturschutzgebiete", + "presets": { + "0": { + "description": "Ein fehlendes Naturschutzgebiet hinzufügen", + "title": "ein Naturschutzgebiet" + } + }, "tagRenderings": { + "Access tag": { + "mappings": { + "0": { + "then": "Öffentlich zugänglich" + }, + "1": { + "then": "Nicht zugänglich" + }, + "2": { + "then": "Nicht zugänglich, da dies ein privater Bereich ist" + }, + "3": { + "then": "Zugänglich, obwohl es sich um ein privates Gebiet handelt" + }, + "4": { + "then": "Nur mit einem Führer oder bei organisierten Aktivitäten zugänglich" + }, + "5": { + "then": "Zugänglich gegen Gebühr" + } + }, + "question": "Ist dieses Naturschutzgebiet für die Öffentlichkeit zugänglich?", + "render": "Zugang zu diesem Naturschutzgebiet: {access:description}" + }, "Curator": { "question": "Wer ist der Verwalter dieses Naturschutzgebietes?
Respektieren Sie die Privatsphäre - geben Sie nur dann einen Namen an, wenn dieser allgemein bekannt ist", "render": "{curator} ist der Pfleger dieses Naturschutzgebietes" @@ -2692,20 +2955,155 @@ }, "question": "Sind Hunde in diesem Naturschutzgebiet erlaubt?" }, + "Editable description": { + "question": "Gibt es zusätzliche Informationen?", + "render": "Zusätzliche Informationen: {description:0}" + }, "Email": { "question": "An welche Email-Adresse kann man sich bei Fragen und Problemen zu diesem Naturschutzgebiet wenden?
Respektieren Sie die Privatsphäre - geben Sie nur dann eine persönliche Email-Adresse an, wenn diese allgemein bekannt ist", "render": "{email}" }, + "Name tag": { + "mappings": { + "0": { + "then": "Dieses Gebiet hat keinen Namen" + } + }, + "question": "Wie heißt dieses Gebiet?", + "render": "Dieses Gebiet heißt {name}" + }, + "Non-editable description": { + "render": "Zusätzliche Informationen: {description}" + }, + "Operator tag": { + "mappings": { + "0": { + "then": "Betrieben von Natuurpunt" + }, + "1": { + "then": "Betrieben von {operator}" + }, + "2": { + "then": "Betrieben von Agentschap Natuur en Bos" + } + }, + "question": "Wer betreibt dieses Gebiet?", + "render": "Betrieben von {operator}" + }, "Surface area": { "render": "Grundfläche: {_surface:ha}ha" }, "phone": { "question": "Welche Telefonnummer kann man bei Fragen und Problemen zu diesem Naturschutzgebiet anrufen?
Respektieren Sie die Privatsphäre - geben Sie nur eine Telefonnummer an, wenn diese allgemein bekannt ist" } + }, + "title": { + "render": "Naturschutzgebiet" } }, "note": { - "name": "OpenStreetMap-Hinweise" + "filter": { + "0": { + "options": { + "0": { + "question": "Sollte {search} im ersten Kommentar erwähnen" + } + } + }, + "1": { + "options": { + "0": { + "question": "Sollte nicht {search} im ersten Kommentar erwähnen" + } + } + }, + "2": { + "options": { + "0": { + "question": "Geöffnet vom Mitwirkenden {search}" + } + } + }, + "3": { + "options": { + "0": { + "question": "Nicht vom Mitwirkenden {search} geöffnet" + } + } + }, + "4": { + "options": { + "0": { + "question": "Zuletzt bearbeitet vom Mitwirkenden {search}" + } + } + }, + "5": { + "options": { + "0": { + "question": "Geöffnet nach {search}" + } + } + }, + "6": { + "options": { + "0": { + "question": "Erstellt vor {search}" + } + } + }, + "7": { + "options": { + "0": { + "question": "Erstellt nach {search}" + } + } + }, + "8": { + "options": { + "0": { + "question": "Nur Notizen anzeigen, die von anonymen Mitwirkenden geöffnet wurden" + } + } + }, + "9": { + "options": { + "0": { + "question": "Nur offene Notizen anzeigen" + } + } + }, + "10": { + "options": { + "0": { + "question": "Importnotizen ausblenden" + } + } + } + }, + "name": "OpenStreetMap-Hinweise", + "tagRenderings": { + "report-contributor": { + "render": "{_first_user} als Spam melden" + }, + "report-note": { + "render": "Diese Notiz als Spam oder unangemessen melden" + } + }, + "title": { + "mappings": { + "0": { + "then": "Geschlossene Notiz" + } + }, + "render": "Notiz" + } + }, + "note_import": { + "name": "Mögliche Bücherschränke", + "title": { + "render": "Mögliches Objekt" + } }, "observation_tower": { "description": "Türme zur Aussicht auf die umgebende Landschaft", @@ -2728,6 +3126,28 @@ "question": "Wer betreibt diesen Turm?", "render": "Betrieben von {operator}" }, + "access": { + "mappings": { + "0": { + "then": "Dieser Turm ist öffentlich zugänglich" + }, + "1": { + "then": "Dieser Turm kann nur mit einem Führer besichtigt werden" + } + }, + "question": "Kann dieser Turm besichtigt werden?" + }, + "elevator": { + "mappings": { + "0": { + "then": "Dieser Turm verfügt über einen Aufzug, der die Besucher nach oben bringt" + }, + "1": { + "then": "Dieser Turm hat keinen Aufzug" + } + }, + "question": "Hat dieser Turm einen Aufzug?" + }, "name": { "mappings": { "0": { @@ -2736,6 +3156,10 @@ }, "question": "Wie heißt dieser Turm?", "render": "Der Name dieses Turms lautet {name}" + }, + "step_count": { + "question": "Wie viele einzelne Stufen muss man erklimmen, um die Spitze des Turms zu erreichen?", + "render": "Dieser Turm hat {step_count} Stufen, um die Spitze zu erreichen" } }, "title": { @@ -2757,7 +3181,16 @@ } }, "parking": { - "name": "Parkplätze" + "description": "Eine Ebene mit Parkplätzen", + "name": "Parkplätze", + "presets": { + "0": { + "title": "ein Parkplatz" + } + }, + "title": { + "render": "Parkplatz" + } }, "pedestrian_path": { "name": "Fußgängerwege" @@ -2816,6 +3249,9 @@ "0": { "then": "Zugänglich für die Allgemeinheit" }, + "1": { + "then": "Dies ist ein gebührenpflichtiger Spielplatz" + }, "2": { "then": "Nur für Kunden des Betreibers zugänglich" }, @@ -3024,6 +3460,7 @@ } }, "recycling": { + "description": "Eine Ebene mit Recyclingcontainern und -zentren", "filter": { "0": { "options": { @@ -3031,11 +3468,217 @@ "question": "Derzeit geöffnet" } } + }, + "1": { + "options": { + "0": { + "question": "Alle Recyclingarten" + }, + "1": { + "question": "Recycling von Batterien" + }, + "2": { + "question": "Recycling von Getränkekartons" + }, + "3": { + "question": "Recycling von Dosen" + }, + "4": { + "question": "Recycling von Kleidung" + }, + "5": { + "question": "Recycling von Speiseöl" + }, + "6": { + "question": "Recycling von Motoröl" + }, + "7": { + "question": "Recycling von Grünabfällen" + }, + "8": { + "question": "Recycling von Glasflaschen" + }, + "9": { + "question": "Recycling von Glas" + }, + "10": { + "question": "Recycling von Zeitungen" + }, + "11": { + "question": "Recycling von Papier" + }, + "12": { + "question": "Recycling von Plastikflaschen" + }, + "13": { + "question": "Recycling von Kunststoffverpackungen" + }, + "14": { + "question": "Recycling von Kunststoffen" + }, + "15": { + "question": "Recycling von Metallschrott" + }, + "16": { + "question": "Recycling von Elektrokleingeräten" + }, + "17": { + "question": "Recycling von Restabfällen" + } + } } }, - "name": "Recycling" + "name": "Recycling", + "presets": { + "0": { + "title": "ein Recyclingcontainer" + }, + "1": { + "title": "ein Wertstoffhof" + } + }, + "tagRenderings": { + "container-location": { + "mappings": { + "0": { + "then": "Dies ist ein Unterflurcontainer" + }, + "1": { + "then": "Dieser Container befindet sich in einem Gebäude" + }, + "2": { + "then": "Dieser Container befindet sich im Freien" + } + }, + "question": "Wo befindet sich dieser Container?" + }, + "opening_hours": { + "mappings": { + "0": { + "then": "24/7" + } + }, + "question": "Wie sind die Öffnungszeiten dieser Recyclinganlage?" + }, + "operator": { + "question": "Welches Unternehmen betreibt diese Recyclinganlage?", + "render": "Diese Recyclinganlage wird betrieben von {operator}" + }, + "recycling-accepts": { + "mappings": { + "0": { + "then": "Batterien können hier recycelt werden" + }, + "1": { + "then": "Getränkekartons können hier recycelt werden" + }, + "2": { + "then": "Dosen können hier recycelt werden" + }, + "3": { + "then": "Kleidung kann hier recycelt werden" + }, + "4": { + "then": "Speiseöl kann hier recycelt werden" + }, + "5": { + "then": "Motoröl kann hier recycelt werden" + }, + "6": { + "then": "Grünabfälle können hier recycelt werden" + }, + "7": { + "then": "Bio-Abfall kann hier recycelt werden" + }, + "8": { + "then": "Glasflaschen können hier recycelt werden" + }, + "9": { + "then": "Glas kann hier recycelt werden" + }, + "10": { + "then": "Zeitungen können hier recycelt werden" + }, + "11": { + "then": "Papier kann hier recycelt werden" + }, + "12": { + "then": "Plastikflaschen können hier recycelt werden" + }, + "13": { + "then": "Kunststoffverpackungen können hier recycelt werden" + }, + "14": { + "then": "Kunststoff kann hier recycelt werden" + }, + "15": { + "then": "Metallschrott kann hier recycelt werden" + }, + "16": { + "then": "Schuhe können hier recycelt werden" + }, + "17": { + "then": "Elektrokleingeräte können hier recycelt werden" + }, + "18": { + "then": "Elektrokleingeräte können hier recycelt werden" + }, + "19": { + "then": "Nadeln können hier recycelt werden" + }, + "20": { + "then": "Restmüll kann hier recycelt werden" + } + }, + "question": "Was kann hier recycelt werden?" + }, + "recycling-centre-name": { + "mappings": { + "0": { + "then": "Dieser Wertstoffhof hat keinen bestimmten Namen" + } + }, + "question": "Wie lautet der Name dieses Wertstoffhofs?", + "render": "Dieser Wertstoffhof heißt {name}" + }, + "recycling-type": { + "mappings": { + "0": { + "then": "Dies ist ein Recycling-Container" + }, + "1": { + "then": "Dies ist ein Wertstoffhof" + }, + "2": { + "then": "Dies ist ein Abfallcontainer für Restmüll" + } + }, + "question": "Um welche Recyclingeinrichtung handelt es sich?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Wertstoffhof" + }, + "1": { + "then": "Wertstoffhof" + }, + "2": { + "then": "Recyclingcontainer" + } + }, + "render": "Recyclinganlage" + } }, "shops": { + "deletion": { + "extraDeleteReasons": { + "0": { + "explanation": "{title()} wurde dauerhaft geschlossen" + } + } + }, "description": "Ein Geschäft", "filter": { "0": { @@ -3062,13 +3705,15 @@ }, "tagRenderings": { "shops-email": { - "question": "Wie ist die Email-Adresse dieses Geschäfts?" + "question": "Wie ist die Email-Adresse dieses Geschäfts?", + "render": "{email}" }, "shops-name": { "question": "Wie ist der Name dieses Geschäfts?" }, "shops-opening_hours": { - "question": "Wie sind die Öffnungszeiten dieses Geschäfts?" + "question": "Wie sind die Öffnungszeiten dieses Geschäfts?", + "render": "{opening_hours_table(opening_hours)}" }, "shops-phone": { "question": "Wie ist die Telefonnummer?", @@ -3119,6 +3764,7 @@ } }, "slow_roads": { + "description": "Alle autofreien Straßen", "tagRenderings": { "slow_roads-surface": { "mappings": { @@ -3262,10 +3908,165 @@ } }, "street_lamps": { - "name": "Straßenlaternen" + "description": "Eine Ebene mit Straßenbeleuchtung", + "name": "Straßenlaternen", + "presets": { + "0": { + "title": "eine Straßenlaterne" + } + }, + "tagRenderings": { + "colour": { + "mappings": { + "0": { + "then": "Diese Lampe strahlt weißes Licht aus" + }, + "1": { + "then": "Diese Lampe strahlt grünes Licht aus" + }, + "2": { + "then": "Diese Lampe strahlt orangefarbenes Licht aus" + } + }, + "question": "Welche Lichtfarbe strahlt diese Lampe aus?", + "render": "Diese Lampe strahlt {light:colour} Licht aus" + }, + "count": { + "mappings": { + "0": { + "then": "Diese Straßenlaterne hat 1 Leuchte" + }, + "1": { + "then": "Diese Straßenlaterne hat 2 Leuchten" + } + }, + "question": "Wie viele Leuchten hat diese Straßenlaterne?", + "render": "Diese Straßenlaterne hat {light:count} Leuchten" + }, + "direction": { + "question": "Wohin leuchtet diese Straßenlaterne?", + "render": "Diese Straßenlaterne leuchtet in Richtung {light:direction}" + }, + "lamp_mount": { + "mappings": { + "0": { + "then": "Diese Straßenlaterne sitzt auf einem geraden Mast" + }, + "1": { + "then": "Diese Straßenlaterne sitzt am Ende eines gebogenen Mastes" + } + }, + "question": "Wie ist diese Straßenlaterne am Mast befestigt?" + }, + "lit": { + "mappings": { + "0": { + "then": "Diese Straßenlaterne leuchtet nachts" + }, + "1": { + "then": "Diese Straßenlaterne leuchtet durchgehend" + }, + "2": { + "then": "Diese Straßenlaterne leuchtet bewegungsgesteuert" + }, + "3": { + "then": "Diese Straßenlaterne leuchtet bei Bedarf (z. B. mit einem Taster)" + } + }, + "question": "Wann leuchtet diese Straßenlaterne?" + }, + "method": { + "mappings": { + "0": { + "then": "Diese Straßenlaterne leuchtet elektrisch" + }, + "1": { + "then": "Diese Straßenlaterne verwendet LEDs" + }, + "2": { + "then": "Diese Straßenlaterne verwendet Glühlampenlicht" + }, + "3": { + "then": "Diese Straßenlaterne verwendet Halogenlicht" + }, + "4": { + "then": "Diese Straßenlaterne verwendet Entladungslampen (unbekannter Typ)" + }, + "5": { + "then": "Diese Straßenlaterne verwendet eine Quecksilberdampflampe (leicht bläulich)" + }, + "6": { + "then": "Diese Straßenlaterne verwendet Halogen-Metalldampflampen (hellweiß)" + }, + "7": { + "then": "Diese Straßenlaterne verwendet Leuchtstoffröhren" + }, + "8": { + "then": "Diese Straßenlaterne verwendet Natriumdampflampen (unbekannter Typ)" + }, + "9": { + "then": "Diese Straßenlaterne verwendet Niederdruck-Natriumdampflampen (einfarbig orange)" + }, + "10": { + "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" + }, + "11": { + "then": "Diese Straßenlaterne wird mit Gas beleuchtet" + } + }, + "question": "Mit welcher Art von Beleuchtung arbeitet diese Straßenlaterne?" + }, + "ref": { + "question": "Wie lautet die Referenznummer dieser Straßenlaterne?", + "render": "Diese Straßenlaterne hat die Referenznummer {ref}" + }, + "support": { + "mappings": { + "0": { + "then": "Diese Straßenlaterne ist an einem Kabel aufgehängt" + }, + "1": { + "then": "Diese Straßenlaterne ist an einer Decke montiert" + }, + "2": { + "then": "Diese Straßenlaterne ist im Boden montiert" + }, + "3": { + "then": "Diese Straßenlaterne ist an einem kurzen Mast (< 1,5m) montiert" + }, + "4": { + "then": "Diese Straßenlaterne ist an einem Mast montiert" + }, + "5": { + "then": "Diese Straßenlaterne ist direkt an der Wand montiert" + }, + "6": { + "then": "Diese Straßenlaterne ist mit einer Metallstange an der Wand montiert" + } + }, + "question": "Wie ist diese Straßenlaterne befestigt?" + } + }, + "title": { + "mappings": { + "0": { + "then": "Straßenlaterne {ref}" + } + }, + "render": "Straßenlaterne" + } }, "surveillance_camera": { + "description": "Diese Ebene zeigt die Überwachungskameras an und ermöglicht es, Informationen zu aktualisieren und neue Kameras hinzuzufügen", "name": "Überwachungskameras", + "presets": { + "0": { + "title": "eine Überwachungskamera" + }, + "1": { + "title": "eine an einer Wand montierte Überwachungskamera" + } + }, "tagRenderings": { "Camera type: fixed; panning; dome": { "mappings": { @@ -3343,7 +4144,13 @@ "render": "Montageart: {camera:mount}" }, "camera_direction": { - "question": "In welche Himmelsrichtung ist diese Kamera ausgerichtet?" + "mappings": { + "0": { + "then": "filmt in Himmelsrichtung {direction}" + } + }, + "question": "In welche Himmelsrichtung ist diese Kamera ausgerichtet?", + "render": "filmt in Himmelsrichtung {camera:direction}" }, "is_indoor": { "mappings": { @@ -3365,6 +4172,7 @@ } }, "toilet": { + "description": "Eine Ebene mit (öffentlichen) Toiletten", "filter": { "0": { "options": { @@ -3406,6 +4214,14 @@ } }, "tagRenderings": { + "Opening-hours": { + "mappings": { + "0": { + "then": "Durchgehend geöffnet" + } + }, + "question": "Wann sind diese Toiletten geöffnet?" + }, "toilet-access": { "mappings": { "0": { @@ -3462,6 +4278,9 @@ }, "toilet-has-paper": { "mappings": { + "0": { + "then": "Diese Toilette ist mit Toilettenpapier ausgestattet" + }, "1": { "then": "Für diese Toilette müssen Sie Ihr eigenes Toilettenpapier mitbringen" } @@ -3551,6 +4370,7 @@ } }, "tree_node": { + "description": "Eine Ebene, die Bäume zeigt", "name": "Bäume", "presets": { "0": { @@ -3592,9 +4412,15 @@ "3": { "then": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)." }, + "4": { + "then": "Der Baum steht in einem Wohngarten." + }, "5": { "then": "Dieser Baum steht entlang einer Straße." }, + "6": { + "then": "Der Baum steht in einem städtischen Gebiet." + }, "7": { "then": "Dieser Baum steht außerhalb eines städtischen Gebiets." } @@ -3653,7 +4479,8 @@ "render": "Name: {name}" }, "tree_node-ref:OnroerendErfgoed": { - "question": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?" + "question": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?", + "render": "\"\"/ Onroerend Erfgoed Kennung: {ref:OnroerendErfgoed}" }, "tree_node-wikidata": { "question": "Was ist das passende Wikidata Element zu diesem Baum?", @@ -3681,6 +4508,9 @@ "render": "Aussichtspunkt" } }, + "village_green": { + "description": "Eine Ebene mit Dorfangern (kommunale Grünflächen, aber nicht wirklich Parks)" + }, "visitor_information_centre": { "description": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet.", "name": "Besucherinformationszentrum", @@ -3693,6 +4523,12 @@ "render": "{name}" } }, + "walls_and_buildings": { + "description": "Spezielle eingebaute Ebene, die alle Wände und Gebäude bereitstellt. Diese Ebene ist in Voreinstellungen für Objekte nützlich, die an Wänden platziert werden können (z. B. AEDs, Briefkästen, Eingänge, Adressen, Überwachungskameras, ...). Diese Ebene ist standardmäßig unsichtbar und kann vom Benutzer nicht umgeschaltet werden.", + "title": { + "render": "Wand oder Gebäude" + } + }, "waste_basket": { "description": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können.", "filter": { @@ -3792,6 +4628,59 @@ "render": "Abfalleimer" } }, + "waste_disposal": { + "description": "Entsorgungsbehälter, mittlerer bis großer Behälter zur Entsorgung von (Haushalts-)Abfällen", + "filter": { + "0": { + "options": { + "0": { + "question": "Nur öffentlich zugänglich" + } + } + } + }, + "name": "Mülleimer", + "presets": { + "0": { + "description": "Mittlere bis große Mülltonne für die Entsorgung von (Haushalts-)Abfällen", + "title": "ein Abfalleimer" + } + }, + "tagRenderings": { + "access": { + "mappings": { + "0": { + "then": "Dieser Behälter kann von jedem benutzt werden" + }, + "1": { + "then": "Dieser Behälter ist privat" + }, + "2": { + "then": "Diese Mülltonne ist nur für Anwohner" + } + }, + "question": "Wer kann diese Mülltonne benutzen?", + "render": "Zugang: {access}" + }, + "disposal-location": { + "mappings": { + "0": { + "then": "Dies ist ein unterirdischer Container" + }, + "1": { + "then": "Dieser Container befindet sich in einem Gebäude" + }, + "2": { + "then": "Dieser Container befindet sich im Freien" + } + }, + "question": "Wo befindet sich dieser Container?" + } + }, + "title": { + "render": "Abfallentsorgung" + } + }, "watermill": { "name": "Wassermühle" }, diff --git a/langs/layers/en.json b/langs/layers/en.json index f66ce48feb..aaf6f81d83 100644 --- a/langs/layers/en.json +++ b/langs/layers/en.json @@ -3422,7 +3422,7 @@ "title": "a fastfood" }, "2": { - "description": "A fastfood-buisiness focused on french fries", + "description": "A fastfood-business focused on french fries", "title": "a fries shop" } }, @@ -5454,6 +5454,9 @@ }, "question": "Is this a broadleaved or needleleaved tree?" }, + "tree-species-wikidata": { + "question": "What species is this tree?" + }, "tree_node-name": { "mappings": { "0": { @@ -5670,6 +5673,7 @@ "name": "Watermill" }, "windturbine": { + "description": "Modern windmills generating electricity", "name": "wind turbine", "presets": { "0": { diff --git a/langs/layers/es.json b/langs/layers/es.json index 961033fe75..482a0f017e 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -12,16 +12,67 @@ "then": "Esta edificación no tiene número" } }, - "question": "¿Cuál es el número de esta casa?" + "question": "¿Cuál es el número de esta casa?", + "render": "La numeración de la casa es {addr:housenumber}" }, "street": { - "question": "¿En qué calle se encuentra esta dirección?" + "question": "¿En qué calle se encuentra esta dirección?", + "render": "La dirección está en la calle {addr:street}" } }, "title": { "render": "Domicilio conocido" } }, + "ambulancestation": { + "description": "Una estación de ambulancias es una zona para almacenar vehículos de ambulancia, equipamiento médico, equipos de protección personal y otros suministros médicos.", + "name": "Mapa de estaciones de ambulancias", + "presets": { + "0": { + "description": "Añadir una estación de ambulancias al mapa", + "title": "una estación de ambulancias" + } + }, + "tagRenderings": { + "ambulance-agency": { + "question": "¿Qué agencia opera esta estación?", + "render": "Esta estación la opera {operator}." + }, + "ambulance-name": { + "question": "¿Cual es el nombre de esta estación de ambulancias?", + "render": "Esta estación se llama {name}." + }, + "ambulance-operator-type": { + "mappings": { + "0": { + "then": "La estación la opera el govierno." + }, + "1": { + "then": "La estación la opera una organización basada en la comunidad o informal." + }, + "2": { + "then": "La estación la opera un grupo formal de voluntarios." + }, + "3": { + "then": "La estación es de gestión privada." + } + }, + "question": "¿Como está clasificada la operadora de la estación?", + "render": "La operador a no es una entidad de tipo {operator:type}." + }, + "ambulance-place": { + "question": "¿Dónde se encuentra la estación? (ej. nombre del barrio, pueblo o ciudad)", + "render": "Esta estación se encuentra en {addr:place}." + }, + "ambulance-street": { + "question": " ¿Cual es el nombre de la calle en la que se encuentra la estación?", + "render": "Esta estación se encuentra al lado de una autovía llamada {addr:street}." + } + }, + "title": { + "render": "Estación de Ambulancias" + } + }, "artwork": { "description": "Diversas piezas de obras de arte", "name": "Obras de arte", @@ -31,6 +82,10 @@ } }, "tagRenderings": { + "artwork-artist_name": { + "question": "¿Que artista creó esto?", + "render": "Creado por {artist_name}" + }, "artwork-artwork_type": { "mappings": { "0": { @@ -51,15 +106,35 @@ "5": { "then": "Busto" }, + "6": { + "then": "Piedra" + }, "7": { "then": "Instalación" }, "8": { "then": "Grafiti" + }, + "9": { + "then": "Relieve" + }, + "10": { + "then": "Azulejo (azulejos decorativos españoles)" + }, + "11": { + "then": "Cerámica" } }, "question": "¿Qué tipo de obra es esta pieza?", "render": "Esta es un {artwork_type}" + }, + "artwork-website": { + "question": "¿Hay un sitio web con más información sobre esta obra de arte?", + "render": "Más información en este sitio web" + }, + "artwork-wikidata": { + "question": "¿Qué entrada de Wikidata se corresponde con esta obra de arte?", + "render": "Se corresponde con {wikidata}" } }, "title": { @@ -75,6 +150,7 @@ "name": "Barreras", "presets": { "0": { + "description": "Un bolardo en la carretera", "title": "una bolardo" } }, @@ -92,6 +168,35 @@ } }, "question": "¿Qué tipo de bolardo es este?" + }, + "Cycle barrier type": { + "question": "¿Qué tipo de barrera ciclista es esta?" + }, + "MaxWidth": { + "question": "¿Cómo de ancho es el hueco dejado fuera de la barrera?", + "render": "Anchura máxima: {maxwidth:physical} m" + }, + "Overlap (cyclebarrier)": { + "question": "¿Cuánto se solapan las barreras?", + "render": "Solapado: {overlap} m" + }, + "Space between barrier (cyclebarrier)": { + "question": "¿Cuánto espacio hay entre las barreras (a lo largo de la longitud de la carretera)?", + "render": "Espacio entre barreras (a lo largo de la longitud de la carretera): {width:separation} m" + }, + "Width of opening (cyclebarrier)": { + "question": "¿Cómo de año es la apertura más pequeña al lado de las barreras?", + "render": "Anchura de la apertura: {width:opening} m" + }, + "barrier_type": { + "mappings": { + "0": { + "then": "Este es un único bolardo en la carretera" + }, + "1": { + "then": "Esta es una barrera ciclista que ralentiza a los ciclistas" + } + } } }, "title": { @@ -104,6 +209,7 @@ } }, "bench": { + "description": "Un banco es una superficie de madera, metal, piedra, ... donde un humano se puede sentar. Estas capas los visualizan y preguntan algunas preguntas sobre ellos.", "name": "Bancos", "presets": { "0": { @@ -124,6 +230,9 @@ }, "bench-colour": { "mappings": { + "0": { + "then": "Color: marrón" + }, "1": { "then": "Color: verde" }, @@ -150,7 +259,8 @@ "render": "Color: {colour}" }, "bench-direction": { - "question": "¿En qué dirección se mira al sentarse en el banco?" + "question": "¿En qué dirección se mira al sentarse en el banco?", + "render": "¿Cuando está sentado en el banco, uno mira hacia {direction}º." }, "bench-material": { "mappings": { @@ -173,11 +283,16 @@ "then": "Material: acero" } }, + "question": "¿De que está hecho el banco (asiento)?", "render": "Material: {material}" }, "bench-seats": { "question": "¿Cuántos asientos tiene este banco?", "render": "{seats} asientos" + }, + "bench-survey:date": { + "question": "¿Cuándo fue la última vez que se inspeccionó este banco?", + "render": "Este banco se inspeccionó por última vez el {survey:date}" } }, "title": { @@ -189,6 +304,11 @@ "name": "Bancos en una parada de transporte público", "tagRenderings": { "bench_at_pt-bench_type": { + "mappings": { + "2": { + "then": "No hay ningún banco aquí" + } + }, "question": "¿Qué tipo de banco es este?" }, "bench_at_pt-name": { @@ -196,21 +316,662 @@ } }, "title": { + "mappings": { + "0": { + "then": "Banco en una parada de transporte público" + } + }, "render": "Banco" } }, + "bicycle_library": { + "tagRenderings": { + "bicycle-library-target-group": { + "mappings": { + "0": { + "then": "Bicicletas para niños disponibles" + }, + "1": { + "then": "Bicicletas para adultos disponibles" + }, + "2": { + "then": "Bicicletas para discapacitados disponibles" + } + } + }, + "bicycle_library-charge": { + "render": "Alquilar una bicicleta cuesta {charge}" + } + } + }, "bicycle_rental": { + "deletion": { + "extraDeleteReasons": { + "0": { + "explanation": "{title()} ha cerrado permanentemente" + } + }, + "nonDeleteMappings": { + "0": { + "then": "Esta tienda de bicicletas alquilaba bicis, pero ya no lo hace" + } + } + }, + "description": "Estaciones de alquiler de bicicletas", + "presets": { + "0": { + "title": "una tienda de alquiler de bicicletas" + } + }, + "tagRenderings": { + "9": { + "rewrite": { + "into": { + "0": { + "1": "bicis de ciudad" + }, + "1": { + "1": "bicis eléctricas" + }, + "2": { + "1": "bicis infantiles" + }, + "3": { + "1": "bicis BMX" + }, + "4": { + "1": "bicis de montaña" + } + } + } + }, + "bicycle-types": { + "mappings": { + "0": { + "then": "Aquí se pueden alquilar bicis normales" + }, + "1": { + "then": "Aquí se pueden alquilar bicis eléctricas" + }, + "2": { + "then": "Aquí se pueden alquilar bicis BMX" + }, + "3": { + "then": "Aquí se pueden alquilar bicis de montaña" + }, + "4": { + "then": "Aquí se pueden alquilar bicis infantiles" + }, + "6": { + "then": "Aquí se pueden alquilar bicicletas de carreras" + } + }, + "question": "¿Qué tipo de bicicletas y accesorios se alquilan aquí?", + "render": "{rental} se alquilan aquí" + }, + "bicycle_rental_type": { + "mappings": { + "0": { + "then": "Esta es una tienda que se centra en el alquiler de bicicletas" + }, + "1": { + "then": "Este es un negocio de alquileres que alquila varios objetos y/o vehículos. También alquila bicicletas, pero este no es el enfoque principal" + }, + "2": { + "then": "Esta es una tienda que vende o alquila bicicletas, pero también las alquila" + }, + "3": { + "then": "Esta es una estación automática, en la que una bici se asegura mecánicamente en una estructura" + } + }, + "question": "¿Qué tipo de alquiler de bicicletas es este?" + } + }, "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, "render": "Alquiler de bicicletas" } }, + "bicycle_tube_vending_machine": { + "tagRenderings": { + "Still in use?": { + "mappings": { + "1": { + "then": "Esta máquina exprendedora está rota" + }, + "2": { + "then": "Esta máquina exprendedora está cerrada" + } + }, + "question": "¿Todavía es operacional esta máquina exprendedora?", + "render": "El estado operacional es {operational_status}" + } + } + }, "bike_cafe": { "tagRenderings": { + "bike_cafe-email": { + "question": "¿Cual es la dirección de correo electrónico de {name}?" + }, + "bike_cafe-phone": { + "question": "¿Cual es el número de teléfono de {name}?" + }, "bike_cafe-repair-tools": { "question": "¿Hay herramientas para reparar su propia bicicleta?" } } }, + "bike_cleaning": { + "description": "Una capa que muestra facilidades en las que uno puede limpiar su bici", + "name": "Servicio de limpieza de bicis", + "presets": { + "0": { + "title": "un servicio de limpieza de bicis" + } + }, + "tagRenderings": { + "bike_cleaning-charge": { + "mappings": { + "0": { + "then": "Un servicio de limpieza gratis" + }, + "1": { + "then": "Gratis" + }, + "2": { + "then": "El servicio de limpieza tiene una tarifa" + } + }, + "question": "¿Cuánto cuesta utilizar el servicio de limpieza?", + "render": "Utilizar el servicio de limpieza cuesta {charge}" + }, + "bike_cleaning-service:bicycle:cleaning:charge": { + "mappings": { + "0": { + "then": "El servicio de limpieza es gratis" + }, + "1": { + "then": "Gratis" + }, + "2": { + "then": "El servicio de limpieza tiene una tasa, pero la cantidad se desconoce" + } + }, + "question": "¿Cuánto cuesta utilizar el servicio de limpieza?", + "render": "Utilizar el servicio de limpieza cuesta {service:bicycle:cleaning:charge}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Servicio de limpieza de bicis {name}" + } + }, + "render": "Servicio de limpieza de bicis" + } + }, + "bike_parking": { + "description": "Una capa que muestra donde puedes aparcar tu bici", + "name": "Aparcamiento de bicis", + "presets": { + "0": { + "title": "un aparcamiento de bicis" + } + }, + "tagRenderings": { + "Access": { + "mappings": { + "0": { + "then": "Accesible públicamente" + }, + "1": { + "then": "El acceso es primariamente para visitantes a un negocio" + }, + "2": { + "then": "El acceso se limita a miembros de una escuela, compañía u organización" + } + }, + "question": "¿Quién puede utilizar este aparcamiento de bicicletas?", + "render": "{access}" + }, + "Bicycle parking type": { + "mappings": { + "5": { + "then": "Caseta" + }, + "6": { + "then": "Bolardo" + }, + "7": { + "then": "Una área en el suelo que está marcada para el aparcamiento de bicicletas" + } + }, + "question": "¿Cual es el tipo de este aparcamiento de bicicletas?", + "render": "Este es un aparcamiento de bicicletas del tipo: {bicycle_parking}" + }, + "Capacity": { + "question": "¿Cuántas bicicletas caben en este aparcamiento de bicicletas (incluyendo posibles bicicletas de carga)?", + "render": "Espacio para {capacity} bicis" + }, + "Cargo bike capacity?": { + "question": "¿Cuántas bicicletas de carga caben en este aparcamiento de bicicletas?", + "render": "En este aparcamiento caben {capacity:cargo_bike} bicis de carga" + }, + "Cargo bike spaces?": { + "mappings": { + "0": { + "then": "Este aparcamiento tiene espacio para bicicletas de carga" + }, + "1": { + "then": "Este aparcamiento tiene huecos (oficialmente) designados para bicicletas de carga." + }, + "2": { + "then": "No se permite aparcar bicicletas de carga" + } + }, + "question": "¿Este aparcamiento de bicicletas tiene huevos para bicicletas de carga?" + }, + "Is covered?": { + "mappings": { + "0": { + "then": "Este aparcamiento está cubierto (tiene un tejado)" + }, + "1": { + "then": "Este aparcamiento no está cubierto" + } + }, + "question": "¿Está cubierto este aparcamiento? Selecciona \"cubierto\" también para aparcamientos interiores." + }, + "Underground?": { + "mappings": { + "0": { + "then": "Aparcamiento subterráneo" + }, + "1": { + "then": "Aparcamiento a nivel de calle" + }, + "2": { + "then": "Aparcamiento de azotea" + } + }, + "question": "¿Cual es la localización relativa de este aparcamiento de bicicletas?" + } + }, + "title": { + "render": "Aparcamiento de bicis" + } + }, + "bike_repair_station": { + "description": "Una capa que muestra bombas de bicicletas y puestos de herramientas de reparación de bicicletas", + "name": "Bomba y reparación de bicicletas", + "presets": { + "0": { + "description": "Un dispositivo para inflar tus ruedas en una posición fija en el espacio público.", + "title": "una bomba de bicicletas" + }, + "1": { + "description": "Una bomba de bicicletas y herramientas para reparar tu bicicleta en el espacio público. Las herramientas habitualmente están aseguradas con cadenas contra el robo.", + "title": "En estación de reparación de bicicletas y bomba" + }, + "2": { + "description": "Herramientas para reparar tu bici en el espacio público (sin bomba).Las herramientas están aseguradas contra el robo.", + "title": "una estación de reparación de bicicletas sin bomba" + } + }, + "tagRenderings": { + "Operational status": { + "mappings": { + "0": { + "then": "La bomba de bicicletas está rota" + }, + "1": { + "then": "La bomba de bicicletas está operativa" + } + }, + "question": "¿Todavía está operativa la bomba de bicicletas?" + }, + "access": { + "mappings": { + "0": { + "then": "Accesible públicamente" + }, + "1": { + "then": "Accesible públicamente" + }, + "2": { + "then": "Solo para clientes" + }, + "3": { + "then": "No accesible para el público general" + }, + "4": { + "then": "No accesible para el público general" + } + }, + "question": "¿A quién se le permite utilizar esta estación de reparación?" + }, + "bike_repair_station-available-services": { + "mappings": { + "0": { + "then": "Solo hay una bomba presente" + }, + "1": { + "then": "Solo hay herramientas (destornilladores, pinzas...) presentes" + }, + "2": { + "then": "Hay tanto herramientas como bombas" + } + }, + "question": "¿Qué servicios están disponibles en esta localización?" + }, + "bike_repair_station-bike-chain-tool": { + "mappings": { + "0": { + "then": "Hay una herramienta de cadenas" + }, + "1": { + "then": "No hay herramienta de cadenas" + } + }, + "question": "¿Esta estación de reparación tiene una herramienta especial para reparar la cadena de tu bici?" + }, + "bike_repair_station-bike-stand": { + "mappings": { + "0": { + "then": "Hay un gancho o soporte" + }, + "1": { + "then": "No hay ningún gancho o soporte" + } + }, + "question": "¿Esta estación tiene un gancho para colgar tu bici o un soporte para elevarla?" + }, + "bike_repair_station-electrical_pump": { + "mappings": { + "0": { + "then": "Bomba manual" + }, + "1": { + "then": "Bomba eléctrica" + } + }, + "question": "¿Hay una bomba eléctrica para bicis?" + }, + "bike_repair_station-email": { + "question": "¿Es esta la dirección de correo electrónico del mantenedor?" + }, + "bike_repair_station-manometer": { + "mappings": { + "0": { + "then": "Hay un manómetro" + }, + "1": { + "then": "No hay ningún manometro" + }, + "2": { + "then": "Hay un manómetro pero está roto" + } + }, + "question": "¿La bomba tiene un indicador de presión o manómetro?" + }, + "bike_repair_station-opening_hours": { + "mappings": { + "0": { + "then": "Siempre abierto" + } + }, + "question": "¿Cuándo está abierto este punto de reparación de bicicletas?" + }, + "bike_repair_station-operator": { + "question": "¿Quién mantiene esta bomba para bicicletas?", + "render": "Mantenido por {operator}" + }, + "bike_repair_station-phone": { + "question": "¿Cual es el número de teléfono del mantenedor?" + }, + "bike_repair_station-valves": { + "question": "¿Que válvulas se soportan?", + "render": "Esta bomba soporta las siguiente válvulas: {valves}" + } + }, + "title": { + "mappings": { + "0": { + "then": "Estación de reparación de bicis" + }, + "1": { + "then": "Estación de reparación de bicis" + }, + "2": { + "then": "Bomba rota" + }, + "3": { + "then": "Bomba de bicicletas {name}" + }, + "4": { + "then": "Bomba para bicicletas" + } + }, + "render": "Estación de bicis (bomba y reparación)" + } + }, + "bike_shop": { + "description": "Una tiene que vende específicamente bicis u objetos relacionados", + "tagRenderings": { + "bike_repair_bike-pump-service": { + "mappings": { + "0": { + "then": "Esta tienda ofrece una bomba para cualquiera" + }, + "1": { + "then": "Esta tienda no ofrece una bomba para cualquiera" + }, + "2": { + "then": "Hay una bomba para bicicletas, se muestra como un punto separado " + } + }, + "question": "¿Esta tienda ofrece una bomba para que la utilice cualquiera?" + }, + "bike_repair_bike-wash": { + "mappings": { + "0": { + "then": "Esta tienda limpia bicicletas" + }, + "1": { + "then": "Esta tienda tiene una instalación donde uno puede limpiar bicicletas por si mismo" + }, + "2": { + "then": "Esta tienda no ofrece limpieza de bicicletas" + } + }, + "question": "¿Aquí se lavan bicicletas?" + }, + "bike_repair_rents-bikes": { + "mappings": { + "0": { + "then": "Esta tienda alquila bicis" + }, + "1": { + "then": "Esta tienda no alquila bicis" + } + }, + "question": "¿Alquila bicicis esta tienda?" + }, + "bike_repair_repairs-bikes": { + "mappings": { + "0": { + "then": "Esta tienda repara bicis" + }, + "1": { + "then": "Esta tienda no repara bicis" + }, + "2": { + "then": "Esta tienda solo repara bicis compradas aquí" + }, + "3": { + "then": "Esta tienda solo repara bicis de una cierta marca" + } + }, + "question": "¿Repara bicis esta tienda?" + }, + "bike_repair_second-hand-bikes": { + "mappings": { + "0": { + "then": "Esta tienda vende bicis de segunda mano" + }, + "1": { + "then": "Esta tienda no vende bicis de segunda mano" + }, + "2": { + "then": "Esta tienda solo vende bicis de segunda mano" + } + }, + "question": "¿Vende bicis de segunda mano esta tienda?" + }, + "bike_repair_sells-bikes": { + "mappings": { + "0": { + "then": "Esta tienda vende bicis" + }, + "1": { + "then": "Esta tienda no vende bicis" + } + }, + "question": "¿Vende bicis esta tienda?" + }, + "bike_repair_tools-service": { + "question": "¿Hay herramientas para reparar tu propia bici?" + }, + "bike_shop-access": { + "render": "Solo accesible a {access}" + }, + "bike_shop-email": { + "question": "¿Cual es la dirección de correo electrónico de {name}?" + }, + "bike_shop-is-bicycle_shop": { + "render": "Esta tienda está especializada en vender {shop} y hace actividades relacionadas con bicicletas" + }, + "bike_shop-name": { + "question": "¿Cual es el nombre de esta tienda de bicicletas?", + "render": "Esta tienda de bicicletas se llama {name}" + }, + "bike_shop-phone": { + "question": "¿Cual es el número de teléfono de {name}?" + }, + "bike_shop-website": { + "question": "¿Cual es el sitio web de {name}?" + } + }, + "title": { + "mappings": { + "2": { + "then": "Alquiler de bicicletas {name}" + }, + "3": { + "then": "Reparación de bicis {name}" + }, + "4": { + "then": "Tienda de bicis {name}" + } + } + } + }, + "bike_themed_object": { + "description": "Una capa con los objetos relacionados con bicis pero que no coinciden con ninguna otra capa", + "name": "Objeto relacionada con bicis", + "title": { + "mappings": { + "1": { + "then": "Carril bici" + } + }, + "render": "Objeto relacionado con bicis" + } + }, + "binocular": { + "tagRenderings": { + "binocular-charge": { + "question": "¿Cuánto hay que pagar para utilizar estos binoculares?", + "render": "Utilizar estos binoculares cuesta {charge}" + }, + "binocular-direction": { + "question": "¿Cuándo uno mira a través de este binocular, en qué dirección lo hace?", + "render": "Mira hacia {direction}º" + } + }, + "title": { + "render": "Binoculares" + } + }, + "birdhide": { + "filter": { + "0": { + "options": { + "0": { + "question": "Accesible con sillas de ruedas" + } + } + } + }, + "name": "Lugares para ver pájaros", + "presets": { + "0": { + "description": "Un refugio cubierto donde se pueden ver pájaros confortablemente" + }, + "1": { + "description": "Una pantalla o pared con aperturas para ver pájaros" + } + }, + "tagRenderings": { + "bird-hide-wheelchair": { + "mappings": { + "0": { + "then": "Hay provisiones especiales para usuarios de sillas de ruedas" + }, + "3": { + "then": "No accesible a usuarios con sillas de ruedas" + } + } + }, + "birdhide-operator": { + "mappings": { + "0": { + "then": "Operado por Natuurpunt" + } + }, + "render": "Operado por {operator}" + } + } + }, + "cafe_pub": { + "deletion": { + "extraDeleteReasons": { + "0": { + "explanation": "{title()} ha cerrado permanentemente" + } + } + }, + "description": "Una capa que muestra cafeterías y bares donde uno se puede reunir con una bebida. La capa pregunta algunas preguntas relevantes", + "filter": { + "0": { + "options": { + "0": { + "question": "Abiert oahora" + } + } + } + }, + "name": "Cafeterías y bares", + "presets": { + "0": { + "description": "Un bar, principalmente para beber cervezas en un interior templado y relajado" + } + } + }, "charging_station": { "tagRenderings": { "Authentication": { @@ -332,5 +1093,125 @@ "question": "¿Se puede visitar esta torre?" } } + }, + "tree_node": { + "description": "Una capa que muestra árboles", + "name": "Árbol", + "presets": { + "0": { + "description": "Un árbol de hojas como el Roble o el Álamo.", + "title": "árbol de hoja ancha" + }, + "1": { + "description": "Un árbol de hojas agujas, como el Pino o el Abeto.", + "title": "Árbol tipo Conífera" + }, + "2": { + "description": "Si no estás seguro de si es un árbol de hoja ancha o de hoja de aguja.", + "title": "un árbol" + } + }, + "tagRenderings": { + "tree-decidouous": { + "mappings": { + "0": { + "then": "Caduco o Deciduo: el árbol pierde las hojas en un período del año" + }, + "1": { + "then": "Siempreverde." + } + }, + "question": "¿El árbol es Siempreverde o Caduco?" + }, + "tree-denotation": { + "mappings": { + "0": { + "then": "El árbol es notable debido a su tamaño o ubicación prominente. Es útil para la navegación." + }, + "1": { + "then": "El árbol es un monumento natural, por ejemplo, porque es especialmente antiguo, o de una especie valiosa." + }, + "2": { + "then": "El árbol se utiliza con fines agrícolas, por ejemplo, en un huerto." + }, + "3": { + "then": "El árbol está en un parque o similar (cementerio, recinto escolar, ...)." + }, + "4": { + "then": "El árbol está en un jardín privado o residencial." + }, + "5": { + "then": "El árbol está en bandejón de una avenida." + }, + "6": { + "then": "El árbol está en un zona urbana." + }, + "7": { + "then": "El árbol está fuera de una zona urbana." + } + }, + "question": "¿Qué importancia tiene este árbol? Elige la primera respuesta que corresponda." + }, + "tree-height": { + "mappings": { + "0": { + "then": "Altura: {height} m" + } + }, + "render": "Altura: {height}" + }, + "tree-heritage": { + "mappings": { + "0": { + "then": "Registrado como patrimonio por Onroerend Erfgoed Flandes" + }, + "1": { + "then": "Registrado como patrimonio por la Dirección de Patrimonio Cultural de Bruselas" + }, + "2": { + "then": "Registrado como patrimonio por una organización diferente" + }, + "3": { + "then": "No registrado como patrimonio" + }, + "4": { + "then": "Registrado como patrimonio por un organización diferente" + } + }, + "question": "¿Este árbol es patrimonio registrado?" + }, + "tree-leaf_type": { + "mappings": { + "0": { + "then": "Latifoliada" + }, + "1": { + "then": "Hoja aguja" + }, + "2": { + "then": "Permanentemente sin hojas" + } + }, + "question": "¿Es un árbol de hoja ancha o de hoja aguja?" + }, + "tree_node-name": { + "mappings": { + "0": { + "then": "No identificas la especie." + } + }, + "question": "El árbol no tiene nombre?." + }, + "tree_node-ref:OnroerendErfgoed": { + "question": "¿Cuál es la identificación emitida por Onroerend Erfgoed Flandes?" + }, + "tree_node-wikidata": { + "question": "¿Cuál es el ID de Wikidata para este árbol?", + "render": "\"\"/ Wikidata: {wikidata}" + } + }, + "title": { + "render": "Árbol" + } } } \ No newline at end of file diff --git a/langs/layers/nb_NO.json b/langs/layers/nb_NO.json index cb4dce0aeb..487780cc5a 100644 --- a/langs/layers/nb_NO.json +++ b/langs/layers/nb_NO.json @@ -1,4 +1,25 @@ { + "address": { + "description": "Adresser", + "name": "Kjente adresser i OSM", + "title": { + "render": "Kjent adresse" + } + }, + "ambulancestation": { + "presets": { + "0": { + "description": "Legg til en ambulansestasjon på kartet", + "title": "en ambulansestasjon" + } + }, + "tagRenderings": { + "ambulance-name": { + "question": "Hva er navnet på denne ambulansestasjonen?", + "render": "Denne stasjonen heter {name}." + } + } + }, "artwork": { "name": "Kunstverk", "presets": { diff --git a/langs/nl.json b/langs/nl.json index 92573b6ba1..a42df19945 100644 --- a/langs/nl.json +++ b/langs/nl.json @@ -244,7 +244,7 @@ "doSearch": "Zoek hierboven om resultaten te zien", "failed": "Het Wikipedia-artikel inladen is mislukt", "loading": "Wikipedia aan het laden...", - "noResults": "Niet gevonden voor {search}", + "noResults": "Geen relevante items gevonden voor {search}", "noWikipediaPage": "Dit Wikidata-item heeft nog geen overeenkomstig Wikipedia-artikel", "previewbox": { "born": "Geboren: {value}", @@ -276,6 +276,9 @@ "willBePublished": "Jouw foto wordt gepubliceerd " }, "importHelper": { + "compareToAlreadyExistingNotes": { + "nothingNearby": "Geen enkel te importeren punt heeft een importeer-kaartnota in de buurt" + }, "introduction": { "description": "De importeer-helper converteert een externe dataset in OSM-kaartnotas. De externe data moet overeenkomen met een bestaande MapComplete-laag. Voor elk item wordt er een kaartnota gemaakt. Deze notas worden dan samen met de relevante POI getoond en kunnen dan (via MapComplete) snel en eenvoudig toegevoegd worden.", "importFormat": "Een kaartnota moet het volgende formaat hebben om gedetecteerd te worden binnen een laag:
[Een introductietekst]
https://mapcomplete.osm.be/[themename].html?[parameters waaronder lon en lat]#import
[alle tags van het te importeren object]
" @@ -294,6 +297,11 @@ "selectLayer": "Met welke laag komt deze te importeren dataset overeen?", "title": "Voorbeeldkaart" }, + "noteParts": { + "datasource": "Oorspronkelijke data van {source}", + "importEasily": "Voeg dit punt eenvoudig toe met MapComplete:", + "wikilink": "Meer informatie over deze import: {wikilink}" + }, "previewAttributes": { "allAttributesSame": "Alle kaart-objecten om te importeren hebben deze tag", "inspectDataTitle": "Bekijk de data van {count} te importeren objecten", diff --git a/langs/shared-questions/da.json b/langs/shared-questions/da.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/langs/shared-questions/da.json @@ -0,0 +1 @@ +{} diff --git a/langs/shared-questions/es.json b/langs/shared-questions/es.json index e513f074e8..f6b0d6ad56 100644 --- a/langs/shared-questions/es.json +++ b/langs/shared-questions/es.json @@ -10,8 +10,122 @@ }, "1": { "then": "No se permiten perros" + }, + "2": { + "then": "Los perros están permitidos, pero tienen que llevar correa" + }, + "3": { + "then": "Los perros están permitidos y pueden estar sueltos" + } + }, + "question": "¿Están permitidos los perros en este negocio?" + }, + "email": { + "question": "¿Cual es la direccióm de correo electrónico de {title()}?" + }, + "level": { + "mappings": { + "0": { + "then": "Localizado bajo tierra" + }, + "1": { + "then": "Localizado en la planta baja" + }, + "2": { + "then": "Localizado en la planta baja" + }, + "3": { + "then": "Localizado en la primera planta" + }, + "4": { + "then": "Situado en el primer nivel del sótano" + } + }, + "question": "¿En qué nivel se encuentra esta característica?", + "render": "Localizada en la {level}° planta" + }, + "opening_hours": { + "question": "¿Cuales son las horas de apertura de {title()}?", + "render": "

Horas de apertura

{opening_hours_table(opening_hours)}" + }, + "payment-options": { + "mappings": { + "0": { + "then": "Aquí se acepta el pago en efectivo" + }, + "1": { + "then": "Aquí se acepta el pago por tarjeta" + } + }, + "question": "¿Qué métodos de pago se aceptan aquí?" + }, + "payment-options-advanced": { + "override": { + "mappings+": { + "0": { + "then": "El pago se realiza con una aplicación dedicada" + }, + "1": { + "then": "El pago se realiza con una tarjeta de membresía" + } } } + }, + "phone": { + "question": "¿Cuál es el número de teléfono de {title()}?" + }, + "service:electricity": { + "mappings": { + "0": { + "then": "Hay numerosos enchufes domésticos disponibles para los clientes sentados en el interior, donde pueden cargar sus dispositivos electrónicos" + }, + "1": { + "then": "Hay algunos enchufes domésticos disponibles para los clientes sentados en el interior, donde pueden cargar sus dispositivos electrónicos" + }, + "2": { + "then": "No hay enchufes disponibles en el interior para los clientes, pero cargar puede ser posible si se pregunta al personal" + }, + "3": { + "then": "No hay enchufes domésticos disponibles para los clientes sentados en el interior" + } + }, + "question": "¿Esta facilidad tiene enchufes eléctricos, disponibles para los clientes cuando están dentro?" + }, + "website": { + "question": "¿Cual es el sitio web de {title()}?" + }, + "wheelchair-access": { + "mappings": { + "0": { + "then": "Este lugar está especialmente adaptado para usuarios en sillas de ruedas" + }, + "1": { + "then": "Este lugar es fácilmente accesible con una silla de ruedas" + }, + "2": { + "then": "Es posible llegar a este lugar con una silla de ruedas, pero no es fácil" + }, + "3": { + "then": "No es posible llegar a este lugar con una silla de ruedas" + } + }, + "question": "¿Este lugar es accesible con una silla de ruedas?" + }, + "wikipedia": { + "mappings": { + "0": { + "then": "Todavía no se ha enlazado una página de wikipedia" + } + }, + "question": "¿Cual es la entidad de Wikidata que se corresponde?" + }, + "wikipedialink": { + "mappings": { + "0": { + "then": "No enlazado con Wikipedia" + } + }, + "question": "¿Cual es el ítem correspondiente en Wikipedia?" } } } \ No newline at end of file diff --git a/langs/shared-questions/nb_NO.json b/langs/shared-questions/nb_NO.json index 7b1497c6e3..e768c96d88 100644 --- a/langs/shared-questions/nb_NO.json +++ b/langs/shared-questions/nb_NO.json @@ -54,6 +54,15 @@ }, "question": "Hvilke betalingsmetoder godtas her?" }, + "payment-options-advanced": { + "override": { + "mappings+": { + "1": { + "then": "Betaling utføres med et medlemskort" + } + } + } + }, "phone": { "question": "Hva er telefonnummeret til {title()}?" }, diff --git a/langs/shared-questions/zh_Hans.json b/langs/shared-questions/zh_Hans.json new file mode 100644 index 0000000000..a6422ac1b4 --- /dev/null +++ b/langs/shared-questions/zh_Hans.json @@ -0,0 +1,73 @@ +{ + "shared_questions": { + "dog-access": { + "mappings": { + "0": { + "then": "允许犬只" + }, + "1": { + "then": "允许犬只" + }, + "2": { + "then": "允许犬只,但必须拴绳" + }, + "3": { + "then": "允许犬只,且可自由放养" + } + }, + "question": "犬只是否在这个商业体中允许?" + }, + "email": { + "question": "{title()} 的电子邮箱地址为何?" + }, + "opening_hours": { + "question": "{title()} 的开放时间为何?", + "render": "

开放时间

{opening_hours_table(opening_hours)}" + }, + "payment-options": { + "mappings": { + "0": { + "then": "可用现金" + }, + "1": { + "then": "可用信用卡" + } + }, + "question": "这里支持哪些支付方式?" + }, + "payment-options-advanced": { + "override": { + "mappings+": { + "0": { + "then": "使用专用APP支付" + }, + "1": { + "then": "使用会员卡支付" + } + } + } + }, + "phone": { + "question": "{title()} 的电话号码为何?" + }, + "website": { + "question": "{title()} 的网站为何?" + }, + "wikipedia": { + "mappings": { + "0": { + "then": "尚未有连接到的维基百科页面" + } + }, + "question": "在Wikidata上对应的实体是什么?" + }, + "wikipedialink": { + "mappings": { + "0": { + "then": "不要连接到维基百科" + } + }, + "question": "在维基百科上对应的条目是什么?" + } + } +} \ No newline at end of file diff --git a/langs/themes/da.json b/langs/themes/da.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/langs/themes/da.json @@ -0,0 +1 @@ +{} diff --git a/langs/themes/de.json b/langs/themes/de.json index 98f62021aa..56f22bcfe9 100644 --- a/langs/themes/de.json +++ b/langs/themes/de.json @@ -8,7 +8,7 @@ "title": "Freie Kunstwerk-Karte" }, "benches": { - "description": "Diese Karte zeigt alle Sitzbänke, die in OpenStreetMap eingetragen sind: Einzeln stehende Bänke und Bänke, die zu Haltestellen oder Unterständen gehören. Mit einem OpenStreetMap-Account können Sie neue Bänke eintragen oder Detailinformationen existierender Bänke bearbeiten.", + "description": "Diese Karte zeigt alle Sitzbänke, die in OpenStreetMap eingetragen sind: Alleinstehende Bänke und Bänke, die zu Haltestellen oder Unterständen gehören. Mit einem OpenStreetMap-Konto können Sie neue Bänke eintragen oder Details existierender Bänke bearbeiten.", "shortDescription": "Eine Karte aller Sitzbänke", "title": "Sitzbänke" }, @@ -677,7 +677,7 @@ "title": "Pommes-frites-Läden" }, "ghostbikes": { - "description": "Ein Geisterrad ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde.

Auf dieser Karte kann man alle Geisterräder sehen, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.", + "description": "Ein Geisterrad ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde.

Auf dieser Karte sehen Sie alle Geisterräder, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen nur ein (kostenloses) OpenStreetMap-Konto.", "title": "Geisterräder" }, "grb": { @@ -797,7 +797,7 @@ "title": "In die Natur" }, "notes": { - "description": "Ein Hinweis ist eine Stecknadel auf der Karte mit einer Fehlerbeschreibung.

Über die Filteransicht kann nach Benutzern und Text gesucht werden.", + "description": "Eine Notiz ist eine Stecknadel auf der Karte mit einer Fehlerbeschreibung.

Über die Filteransicht kann nach Benutzer und Text gesucht werden.", "title": "Notizen von OpenStreetMap" }, "observation_towers": { diff --git a/langs/themes/es.json b/langs/themes/es.json index 8d15340174..b1af01d8aa 100644 --- a/langs/themes/es.json +++ b/langs/themes/es.json @@ -6,11 +6,143 @@ "artwork": { "description": "Bienvenido a Open Artwork Map, un mapa de estatuas, bustos, grafitis y otras obras de arte de todo el mundo" }, + "benches": { + "description": "Este mapa muestra todos los bancos que están grabados en OpenStreetMap: Bancos individuales, bancos que pertenecen a paradas o marquesinas del transporte público. Con una cuenta de OpenStreetMap, puedes mapear nuevos bancos o editar detalles de bancos existentes.", + "shortDescription": "Un mapa de bancos", + "title": "Bancos" + }, + "bicycle_rental": { + "description": "En este mapa, encontrarás numerosas estaciones de alquiler de bicicletas que son conocidas por OpenStreetMap", + "shortDescription": "Un mapa con estaciones de alquiler de bicicletas y tiendas de alquiler de bicicletas", + "title": "Alquiler de bicicletas" + }, + "binoculars": { + "description": "Un mapa con prismáticos fijos en un poste. Suele encontrarse en lugares turísticos, miradores, en lo alto de torres panorámicas u ocasionalmente en una reserva natural.", + "shortDescription": "Un mapa con prismáticos fijos", + "title": "Binoculares" + }, + "bookcases": { + "description": "Una librería pública es un pequeño armario en la calle, una caja, una vieja cabina telefónica o algún otro objeto donde se guardan libros. Todo el mundo puede colocar o coger un libro. Este mapa pretende recoger todas estas librerías. Puedes descubrir nuevas librerías cercanas y, con una cuenta gratuita de OpenStreetMap, añadir rápidamente tus librerías favoritas.", + "title": "Mapa de Librerías Abiertas" + }, + "cafes_and_pubs": { + "description": "Pubs y bares", + "title": "Cafeterías y pubs" + }, + "campersite": { + "description": "Este sitio recoge todos los lugares oficiales de parada de caravanas y los lugares donde se pueden verter las aguas grises y negras. Puedes añadir detalles sobre los servicios prestados y el coste. Añade fotos y reseñas. Este es un sitio web y una aplicación web. Los datos se almacenan en OpenStreetMap, por lo que serán gratuitos para siempre y podrán ser reutilizados por cualquier aplicación.", + "layers": { + "0": { + "description": "Sitios de acampada", + "name": "Sitios de Acampada", + "presets": { + "0": { + "description": "Añade un nuevo sitio de acampada oficial. Son lugares designados para pasar la noche con tu caravana. Pueden parecerse a un camping real o simplemente a un aparcamiento. Puede que no estén señalizados en absoluto, sino que simplemente estén definidos en una decisión municipal. Un aparcamiento normal destinado a los campistas en el que no se espera que se pase la noche, no es un camping. ", + "title": "Un camping" + } + }, + "tagRenderings": { + "caravansites-capacity": { + "question": "¿Cuántos campistas pueden alojarse aquí? (omitir si no hay un número evidente de plazas o vehículos permitidos)", + "render": "{capacity} los campistas pueden utilizar este lugar al mismo tiempo" + }, + "caravansites-charge": { + "question": "¿Cuánto cobra este lugar?", + "render": "Este lugar cobra {charge}" + }, + "caravansites-description": { + "question": "¿Te gustaría añadir una descripción general de este lugar? (No repitas información previamente preguntada o mostrada arriba. Por favor mantenla objetiva - las opiniones van en la de opiniones)", + "render": "Más detalles sobre este lugar:{description}" + }, + "caravansites-fee": { + "mappings": { + "0": { + "then": "Necesitas pagar por su uso" + }, + "1": { + "then": "Se puede usar de manera gratuita" + } + }, + "question": "¿Este lugar cobra una tarifa?" + }, + "caravansites-internet": { + "mappings": { + "0": { + "then": "Hay acceso a internet" + }, + "1": { + "then": "Hay acceso a internet" + }, + "2": { + "then": "No hay acceso a internet" + } + }, + "question": "¿Este lugar tiene acceso a internet?" + }, + "caravansites-internet-fee": { + "mappings": { + "0": { + "then": "Tienes que pagar a mayores por el acceso a internet" + }, + "1": { + "then": "No tienes que pagar a mayores por el acceso a internet" + } + }, + "question": "¿Tienes que pagar por el acceso a internet?" + }, + "caravansites-long-term": { + "mappings": { + "0": { + "then": "Sí, hay algunas plazas de alquiler a largo plazo, pero también puedes alojarte por días" + }, + "1": { + "then": "No, no hay huéspedes permanentes aquí" + }, + "2": { + "then": "Solo es posible permanecer aquí si tienes un contrato a largo plazo (este lugar desaparecerá de este mapa si escoges esto)" + } + }, + "question": "¿Este lugar ofrece huecos para alquilar a largo plazo?" + }, + "caravansites-name": { + "question": "¿Cómo se llama este lugar?", + "render": "Este lugar se llama {name}" + }, + "caravansites-sanitary-dump": { + "mappings": { + "0": { + "then": "Este lugar tiene un vertedero sanitario" + }, + "1": { + "then": "Este lugar no tiene vertedero sanitario" + } + }, + "question": "¿Este lugar tiene un vertedero sanitario?" + }, + "caravansites-toilets": { + "mappings": { + "0": { + "then": "Este lugar cuenta con sanitarios" + }, + "1": { + "then": "Este lugar no tiene sanitarios" + } + } + } + } + } + } + }, "ghostbikes": { "title": "Bicicleta blanca" }, "personal": { "description": "Crea una interficie basada en todas las capas disponibles de todas las interficies", "title": "Interficie personal" + }, + "trees": { + "description": "Mapa de todos los Árboles", + "shortDescription": "Mapa de los Árboles", + "title": "Árboles" } } \ No newline at end of file diff --git a/langs/themes/fr.json b/langs/themes/fr.json index c87ff74c52..eeb226c080 100644 --- a/langs/themes/fr.json +++ b/langs/themes/fr.json @@ -21,10 +21,19 @@ "description": "Une vélothèque est un endroit où on peut emprunter des vélos, souvent moyennant une petite somme annuelle. Un cas d'utilisation notable est celui des vélothèques pour les enfants, qui leur permettent de passer à un vélo plus grand quand ils sont trop grands pour leur vélo actuel", "title": "Vélothèques" }, + "binoculars": { + "description": "Une carte des longue-vues fixes. Se trouve typiquement sur les sites touristiques, les points de vue, les tours panoramiques ou dans les réserves naturelles.", + "shortDescription": "Une carte de jumelles panoramiques", + "title": "Jumelles" + }, "bookcases": { "description": "Une microbibliothèques, également appelée boite à livre, est un élément de mobilier urbain (étagère, armoire, etc) dans lequel sont stockés des livres et autres objets en accès libre. Découvrez les boites à livres prêt de chez vous, ou ajouter en une nouvelle à l'aide de votre compte OpenStreetMap.", "title": "Carte des microbibliothèques" }, + "cafes_and_pubs": { + "description": "Bars et pubs", + "title": "Cafés et pubs" + }, "campersite": { "description": "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.", "layers": { @@ -252,6 +261,11 @@ "shortDescription": "Trouver des sites pour passer la nuit avec votre camping-car", "title": "Sites pour camping-cars" }, + "charging_stations": { + "description": "Sur cette carte l’on trouve et ajoute des informations sur les points de recharge", + "shortDescription": "Une carte mondiale des points de recharge", + "title": "Points de recharge" + }, "climbing": { "description": "Cette carte indique les sites d’escalades comme les salles d’escalade ou les sites naturels.", "descriptionTail": "La carte des sites d'escalade a été créée par Christian Neumann. Merci de le contacter pour des avis ou des questions.

Ce projet utilise les données OpenStreetMap.

", @@ -335,6 +349,16 @@ } }, "question": "Est-il possible d’escalader à la moulinette ?" + }, + "9": { + "mappings": { + "0": { + "then": "De l’escalade est possible ici" + }, + "1": { + "then": "L’escalade est impossible ici" + } + } } }, "units+": { @@ -352,6 +376,21 @@ }, "title": "Open Climbing Map" }, + "cycle_highways": { + "description": "Cette carte affiche les aménagements cyclables", + "layers": { + "0": { + "name": "Aménagements cyclables", + "title": { + "render": "Aménagement cyclable" + } + } + }, + "title": "Aménagements cyclables" + }, + "cycle_infra": { + "description": "Une carte montrant les aménagements cyclables et où l’on peut rajouter des informations. Réalisée durant #osoc21." + }, "cyclofix": { "description": "Le but de cette carte est de présenter aux cyclistes une solution facile à utiliser pour trouver l'infrastructure appropriée à leurs besoins.

Vous pouvez suivre votre localisation précise (mobile uniquement) et sélectionner les couches qui vous concernent dans le coin inférieur gauche. Vous pouvez également utiliser cet outil pour ajouter ou modifier des épingles (points d'intérêt) sur la carte et fournir plus de données en répondant aux questions.

Toutes les modifications que vous apportez seront automatiquement enregistrées dans la base de données mondiale d'OpenStreetMap et peuvent être librement réutilisées par d'autres.

Pour plus d'informations sur le projet cyclofix, rendez-vous sur cyclofix.osm.be.", "title": "Cyclofix - Une carte ouverte pour les cyclistes" @@ -516,6 +555,10 @@ "description": "Une carte indiquant les éoliennes et permettant leur édition.", "title": "OpenWindPowerMap" }, + "parkings": { + "description": "Cette carte affiche différents lieux de stationnement", + "title": "Stationnement" + }, "personal": { "description": "Crée un thème personnalisé basé sur toutes les couches disponibles de tous les thèmes", "title": "Thème personnalisé" diff --git a/langs/themes/nb_NO.json b/langs/themes/nb_NO.json index 1d541c65a4..12fd79fccf 100644 --- a/langs/themes/nb_NO.json +++ b/langs/themes/nb_NO.json @@ -11,6 +11,9 @@ "shortDescription": "Et benkekart", "title": "Benker" }, + "bicycle_rental": { + "title": "Sykkelutleie" + }, "bicyclelib": { "title": "Sykkelbibliotek" }, diff --git a/langs/themes/zh_Hans.json b/langs/themes/zh_Hans.json new file mode 100644 index 0000000000..f124b98086 --- /dev/null +++ b/langs/themes/zh_Hans.json @@ -0,0 +1,14 @@ +{ + "aed": { + "description": "在这份地图上可以寻找和标记附近的除颤器", + "title": "Open AED Map" + }, + "artwork": { + "description": "欢迎使用Open Artwork Map,一个雕塑、半身像、涂鸦和其他全球艺术品的地图", + "title": "Open Artwork Map" + }, + "benches": { + "shortDescription": "长椅地图", + "title": "长椅" + } +} \ No newline at end of file diff --git a/langs/zh_Hans.json b/langs/zh_Hans.json index 9e26dfeeb6..380347ac9f 100644 --- a/langs/zh_Hans.json +++ b/langs/zh_Hans.json @@ -1 +1,29 @@ -{} \ No newline at end of file +{ + "centerMessage": { + "loadingData": "加载数据中……", + "ready": "完成!", + "retrying": "加载数据失败。将在 {count} 秒后重试……", + "zoomIn": "放大以查看或编辑数据" + }, + "delete": { + "cancel": "取消", + "delete": "删除", + "explanations": { + "hardDelete": "这个点将在OpenStreetMap中被删除。它可以被有经验的贡献者恢复" + }, + "notEnoughExperience": "这个点由其他人创建。", + "onlyEditedByLoggedInUser": "这个点仅被您所编辑,您可以安全的删除它。", + "useSomethingElse": "使用其他OpenStreetMap编辑器来删除它", + "whyDelete": "为什么这个点需要被删除?" + }, + "favourite": { + "reload": "重新加载数据" + }, + "general": { + "aboutMapcomplete": "

关于MapComplete

使用它在特定主题上追加OpenStreetMap信息。 Answer questions, and within minutes your contributions are available everywhere. 主题维护者为它定义元素、问题和语言。

发现更多

MapComplete always offers the next step to learn more about OpenStreetMap.

  • 当嵌入在网站的时候,iframe连接到一个全屏的MapComplete
  • 全屏版本提供OpenStreetMap信息
  • 无需登录即可查看,但编辑需要一个OSM账号。
  • 若您未登录则将被要求登录
  • 每次当您回答一条问题,您都可以向地图添加新的点
  • After a while, actual OSM-tags are shown, later linking to the wiki


Did you notice an issue? Do you have a feature request? Want to help translate? Head over to the source code orissue tracker.

想要查看您的进度?查阅OsmCha上的编辑计数。

", + "add": { + "disableFilters": "禁用所有过滤器", + "hasBeenImported": "这个点已经被导入过了" + } + } +} diff --git a/package.json b/package.json index cd3536ab8c..1488ede86b 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,8 @@ "clean:tests": "(find . -type f -name \"*.doctest.ts\" | xargs rm)", "clean": "rm -rf .cache/ && (find *.html | grep -v \"\\(404\\|index\\|land\\|test\\|preferences\\|customGenerator\\|professional\\|automaton\\|import_helper\\|import_viewer\\|theme\\).html\" | xargs rm) && (ls | grep \"^index_[a-zA-Z_-]\\+\\.ts$\" | xargs rm) && (ls | grep \".*.webmanifest$\" | xargs 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", - "script": "ts-node" + "script": "ts-node", + "merge-translations": "git remote update weblate ; git merge weblate/master" }, "keywords": [ "OpenStreetMap", diff --git a/scripts/fetchLanguages.ts b/scripts/fetchLanguages.ts index 2abf82e8fb..69aa952eaa 100644 --- a/scripts/fetchLanguages.ts +++ b/scripts/fetchLanguages.ts @@ -93,12 +93,15 @@ function extract(data){ function getNativeList(langs: Map>){ const native = {} - langs.forEach((translations, key ) =>{ + const keys: string[] = Array.from(langs.keys()) + keys.sort() + for (const key of keys) { + const translations: Map = langs.get(key) if(!usedLanguages.has(key)){ - return + continue } native[key] = translations.get(key) - }) + } return native } diff --git a/scripts/filter.ts b/scripts/filter.ts new file mode 100644 index 0000000000..1a97136588 --- /dev/null +++ b/scripts/filter.ts @@ -0,0 +1,45 @@ +import * as fs from "fs"; +import {TagUtils} from "../Logic/Tags/TagUtils"; +import {writeFileSync} from "fs"; +import {TagsFilter} from "../Logic/Tags/TagsFilter"; + +function main(args) { + if (args.length < 2) { + console.log("Given a single geojson file and a filter specification, will print all the entries to std-out which pass the property") + console.log("USAGE: perProperty `file.geojson` `key=value` [outputfile]") + return + } + const path = args[0] + const spec = args[1] + const output = args[2] + + const data = JSON.parse(fs.readFileSync(path, "UTF8")) + let filter : TagsFilter ; + try{ + filter = TagUtils.Tag(JSON.parse(spec)) + + }catch(e){ + filter = TagUtils.Tag(spec) + } + const features = data.features.filter(f => filter.matchesProperties(f.properties)) + + if(features.length === 0){ + console.log("Warning: no features matched the filter. Exiting now") + return + } + + const collection = { + type:"FeatureCollection", + features + } + const stringified = JSON.stringify(collection, null, " ") + if(output === undefined){ + console.log(stringified) + }else{ + console.log("Filtered "+path+": kept "+features.length+" out of "+data.features.length+" objects") + writeFileSync(output, stringified) + } + +} + +main(process.argv.slice(2)) \ No newline at end of file diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index d9faf2d9ab..02cc138594 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -203,16 +203,22 @@ class LayerOverviewUtils { const themePath = themeInfo.path new PrevalidateTheme().convertStrict(themeFile, themePath) - themeFile = new PrepareTheme(convertState).convertStrict(themeFile, themePath) - - if(knownImagePaths === undefined){ - throw "Could not load known images/licenses" + try{ + + themeFile = new PrepareTheme(convertState).convertStrict(themeFile, themePath) + + if(knownImagePaths === undefined){ + throw "Could not load known images/licenses" + } + new ValidateThemeAndLayers(knownImagePaths, themePath, true, convertState.tagRenderings) + .convertStrict(themeFile, themePath) + + this.writeTheme(themeFile) + fixed.set(themeFile.id, themeFile) + }catch(e){ + console.error("ERROR: could not prepare theme "+themePath+" due to "+e) + throw e; } - new ValidateThemeAndLayers(knownImagePaths, themePath, true, convertState.tagRenderings) - .convertStrict(themeFile, themePath) - - this.writeTheme(themeFile) - fixed.set(themeFile.id, themeFile) } this.writeSmallOverview(themeFiles.map(tf => { diff --git a/scripts/generateLayouts.ts b/scripts/generateLayouts.ts index 7711d7678c..546d26350b 100644 --- a/scripts/generateLayouts.ts +++ b/scripts/generateLayouts.ts @@ -161,8 +161,8 @@ async function createManifest(layout: LayoutConfig, alreadyWritten: string[]): P console.log(icon) throw "Icon is not an svg for " + layout.id } - const ogTitle = Translations.WT(layout.title).txt; - const ogDescr = Translations.WT(layout.description ?? "").txt; + const ogTitle = Translations.T(layout.title).txt; + const ogDescr = Translations.T(layout.description ?? "").txt; const manifest = { name: name, @@ -186,8 +186,8 @@ async function createLandingPage(layout: LayoutConfig, manifest, whiteIcons, alr Locale.language.setData(layout.language[0]); const targetLanguage = layout.language[0] - const ogTitle = Translations.WT(layout.title).textFor(targetLanguage).replace(/"/g, '\\"'); - const ogDescr = Translations.WT(layout.shortDescription ?? "Easily add and edit geodata with OpenStreetMap").textFor(targetLanguage).replace(/"/g, '\\"'); + const ogTitle = Translations.T(layout.title).textFor(targetLanguage).replace(/"/g, '\\"'); + const ogDescr = Translations.T(layout.shortDescription ?? "Easily add and edit geodata with OpenStreetMap").textFor(targetLanguage).replace(/"/g, '\\"'); let ogImage = layout.socialImage; let twitterImage = ogImage if (ogImage === LayoutConfig.defaultSocialImage && layout.official) { @@ -303,7 +303,7 @@ async function main(): Promise { if (theme !== undefined && layoutConfigJson.id !== theme) { continue } - const layout = new LayoutConfig(layoutConfigJson, true, "generating layouts") + const layout = new LayoutConfig(layoutConfigJson, true) const layoutName = layout.id if (blacklist.indexOf(layoutName.toLowerCase()) >= 0) { console.log(`Skipping a layout with name${layoutName}, it is on the blacklist`); diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index a046eabbd3..0f83f30ba3 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -582,14 +582,12 @@ if (!themeOverwritesWeblate) { genTranslations() const allTranslationFiles = ScriptUtils.readDirRecSync("langs").filter(path => path.endsWith(".json")) for (const path of allTranslationFiles) { - console.log("Formatting ", path) formatFile(path) } - // Some validation TranslationPart.fromDirectory("./langs").validateStrict("./langs") TranslationPart.fromDirectory("./langs/layers").validateStrict("layers") TranslationPart.fromDirectory("./langs/themes").validateStrict("themes") TranslationPart.fromDirectory("./langs/shared-questions").validateStrict("shared-questions") - +console.log("All done!") diff --git a/scripts/generateWikiPage.ts b/scripts/generateWikiPage.ts index 1c06c0f531..0e7a7ac281 100644 --- a/scripts/generateWikiPage.ts +++ b/scripts/generateWikiPage.ts @@ -18,7 +18,7 @@ function generateWikiEntry(layout: { hideFromOverview: boolean, id: string, shor |name= [https://mapcomplete.osm.be/${layout.id} ${layout.id}] |region= Worldwide |lang= ${languages} -|descr= A MapComplete theme: ${Translations.WT(layout.shortDescription) +|descr= A MapComplete theme: ${Translations.T(layout.shortDescription) .textFor("en") .replace(".*<\/a>/, "]]") diff --git a/scripts/perProperty.ts b/scripts/perProperty.ts index 9349499d15..30e796fba6 100644 --- a/scripts/perProperty.ts +++ b/scripts/perProperty.ts @@ -2,7 +2,7 @@ import * as fs from "fs"; function main(args) { if (args.length < 2) { - console.log("Given a single geojson file, generates the partitions for every found property") + console.log("Given a single geojson file and an attribute-key, will generate a new file for every value of the partition.") console.log("USAGE: perProperty `file.geojson` `property-key`") return } @@ -35,11 +35,4 @@ function main(args) { } -let args = [...process.argv] -args.splice(0, 2) -try { - main(args) -} catch (e) { - console.error("Error building cache:", e) -} -console.log("All done!") \ No newline at end of file +main(process.argv.slice(2)) diff --git a/test.ts b/test.ts index 9a6b02f972..4640df0ca4 100644 --- a/test.ts +++ b/test.ts @@ -1,31 +1,17 @@ -import Combine from "./UI/Base/Combine"; -import ValidatedTextField from "./UI/Input/ValidatedTextField"; -import Title from "./UI/Base/Title"; -import {FixedUiElement} from "./UI/Base/FixedUiElement"; import {VariableUiElement} from "./UI/Base/VariableUIElement"; import {UIEventSource} from "./Logic/UIEventSource"; -import {Translation} from "./UI/i18n/Translation"; +import Wikidata from "./Logic/Web/Wikidata"; +import Combine from "./UI/Base/Combine"; +import {FixedUiElement} from "./UI/Base/FixedUiElement"; -new Combine( - ValidatedTextField.AvailableTypes().map(key => { - let inp; - const feedback = new UIEventSource(undefined) - try { - inp = ValidatedTextField.ForType(key).ConstructInputElement({ - feedback, - country: () => "be" - }); - } catch (e) { - console.error(e) - inp = new FixedUiElement(e).SetClass("alert") - } - - return new Combine([ - new Title(key), - inp, - new VariableUiElement(inp.GetValue()), - new VariableUiElement(feedback.map(v => v?.SetClass("alert"))) - ]); - } - ) -).AttachTo("maindiv") \ No newline at end of file +const result = UIEventSource.FromPromise( + Wikidata.searchAdvanced("WOlf", { + lang: "nl", + maxCount: 100, + instanceOf: 5 + }) +) +result.addCallbackAndRunD(r => console.log(r)) +new VariableUiElement(result.map(items =>new Combine( (items??[])?.map(i => + new FixedUiElement(JSON.stringify(i, null, " ")).SetClass("p-4 block") +)) )).SetClass("flex flex-col").AttachTo("maindiv") \ No newline at end of file diff --git a/test/Logic/Actors/Actors.spec.ts b/test/Logic/Actors/Actors.spec.ts index 334647c567..2aed28b52e 100644 --- a/test/Logic/Actors/Actors.spec.ts +++ b/test/Logic/Actors/Actors.spec.ts @@ -47,7 +47,7 @@ Utils.injectJsonDownloadForTests( ) it("should download the latest version", () => { - const state = new UserRelatedState(new LayoutConfig( bookcaseJson, true, "tests")) + const state = new UserRelatedState(new LayoutConfig( bookcaseJson, true)) const feature = { "type": "Feature", "id": "node/5568693115", diff --git a/test/Models/ThemeConfig/Conversion/FixLegacyTheme.spec.ts b/test/Models/ThemeConfig/Conversion/FixLegacyTheme.spec.ts index e61496bd20..0fbe04ccae 100644 --- a/test/Models/ThemeConfig/Conversion/FixLegacyTheme.spec.ts +++ b/test/Models/ThemeConfig/Conversion/FixLegacyTheme.spec.ts @@ -145,7 +145,7 @@ describe("FixLegacyTheme", () => { walking_node_theme, "While testing") expect(fixed.errors, "Could not fix the legacy theme").empty - const theme = new LayoutConfig(fixed.result, false,"test") + const theme = new LayoutConfig(fixed.result, false) expect(theme).not.undefined })