diff --git a/Customizations/AllKnownLayers.ts b/Customizations/AllKnownLayers.ts index 6b5080bdb..b55da3b58 100644 --- a/Customizations/AllKnownLayers.ts +++ b/Customizations/AllKnownLayers.ts @@ -1,16 +1,18 @@ import * as known_layers from "../assets/generated/known_layers_and_themes.json" import {Utils} from "../Utils"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; -import BaseUIElement from "../UI/BaseUIElement"; -import Combine from "../UI/Base/Combine"; -import Title from "../UI/Base/Title"; -import List from "../UI/Base/List"; -import {AllKnownLayouts} from "./AllKnownLayouts"; -import {isNullOrUndefined} from "util"; -import {Layer} from "leaflet"; +import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson"; +import SharedTagRenderings from "./SharedTagRenderings"; +import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; +import WithContextLoader from "../Models/ThemeConfig/WithContextLoader"; export default class AllKnownLayers { + public static inited = (_ => { + WithContextLoader.getKnownTagRenderings = (id => AllKnownLayers.getTagRendering(id)) + return true + })() + // Must be below the list... public static sharedLayers: Map = AllKnownLayers.getSharedLayers(); @@ -64,7 +66,7 @@ export default class AllKnownLayers { return sharedLayers; } - private static getSharedLayersJson(): Map { + private static getSharedLayersJson(): Map { const sharedLayers = new Map(); for (const layer of known_layers.layers) { sharedLayers.set(layer.id, layer); @@ -73,4 +75,41 @@ export default class AllKnownLayers { return sharedLayers; } + /** + * Gets the appropriate tagRenderingJSON + * Allows to steal them from other layers. + * This will add the tags of the layer to the configuration though! + * @param renderingId + */ + static getTagRendering(renderingId: string): TagRenderingConfigJson { + if(renderingId.indexOf(".") < 0){ + return SharedTagRenderings.SharedTagRenderingJson.get(renderingId) + } + + const [layerId, id] = renderingId.split(".") + const layer = AllKnownLayers.getSharedLayersJson().get(layerId) + if(layer === undefined){ + if(Utils.runningFromConsole){ + // Probably generating the layer overview + return { + id: "dummy" + } + } + throw "Builtin layer "+layerId+" not found" + } + const renderings = layer?.tagRenderings ?? [] + for (const rendering of renderings) { + if(rendering["id"] === id){ + const found = JSON.parse(JSON.stringify(rendering)) + if(found.condition === undefined){ + found.condition = layer.source.osmTags + }else{ + found.condition = {and: [found.condition, layer.source.osmTags]} + } + return found + } + } + throw `The rendering with id ${id} was not found in the builtin layer ${layerId}. Try one of ${Utils.NoNull(renderings.map(r => r["id"])).join(", ")}` + } + } diff --git a/Customizations/SharedTagRenderings.ts b/Customizations/SharedTagRenderings.ts index 977dc2b4d..4344b6e89 100644 --- a/Customizations/SharedTagRenderings.ts +++ b/Customizations/SharedTagRenderings.ts @@ -43,4 +43,5 @@ export default class SharedTagRenderings { return dict; } + } diff --git a/Models/Constants.ts b/Models/Constants.ts index 19e7a1655..89e115476 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.12.5"; + public static vNumber = "0.12.6"; public static ImgurApiKey = '7070e7167f0a25a' public static readonly mapillary_client_token_v3 = 'TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2' public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85" diff --git a/Models/ThemeConfig/TagRenderingConfig.ts b/Models/ThemeConfig/TagRenderingConfig.ts index e4d256fba..43c8e0e4c 100644 --- a/Models/ThemeConfig/TagRenderingConfig.ts +++ b/Models/ThemeConfig/TagRenderingConfig.ts @@ -173,10 +173,47 @@ export default class TagRenderingConfig { throw `${context}: A question is defined, but no mappings nor freeform (key) are. The question is ${this.question.txt} at ${context}` } - if (this.freeform && this.render === undefined) { - throw `${context}: Detected a freeform key without rendering... Key: ${this.freeform.key} in ${context}` + if (this.freeform) { + if(this.render === undefined){ + throw `${context}: Detected a freeform key without rendering... Key: ${this.freeform.key} in ${context}` + } + for (const ln in this.render.translations) { + const txt :string = this.render.translations[ln] + if(txt === ""){ + throw context+" Rendering for language "+ln+" is empty" + } + if(txt.indexOf("{"+this.freeform.key+"}") >= 0){ + continue + } + if(txt.indexOf("{canonical("+this.freeform.key+")") >= 0){ + continue + } + if(this.freeform.type === "opening_hours" && txt.indexOf("{opening_hours_table(") >= 0){ + continue + } + if(this.freeform.type === "wikidata" && txt.indexOf("{wikipedia("+this.freeform.key) >= 0){ + continue + } + if(this.freeform.key === "wikidata" && txt.indexOf("{wikipedia()") >= 0){ + continue + } + throw `${context}: The rendering for language ${ln} does not contain the freeform key {${this.freeform.key}}. This is a bug, as this rendering should show exactly this freeform key!\nThe rendering is ${txt} ` + + } } + if (this.id === "questions" && this.render !== undefined) { + for (const ln in this.render.translations) { + const txt :string = this.render.translations[ln] + if(txt.indexOf("{questions}") >= 0){ + continue + } + throw `${context}: The rendering for language ${ln} does not contain {questions}. This is a bug, as this rendering should include exactly this to trigger those questions to be shown!` + + } + } + + if (this.render && this.question && this.freeform === undefined) { throw `${context}: Detected a tagrendering which takes input without freeform key in ${context}; the question is ${this.question.txt}` } @@ -238,7 +275,7 @@ export default class TagRenderingConfig { public IsKnown(tags: any): boolean { if (this.condition && !this.condition.matchesProperties(tags)) { - // Filtered away by the condition + // Filtered away by the condition, so it is kindof known return true; } if (this.multiAnswer) { diff --git a/Models/ThemeConfig/WithContextLoader.ts b/Models/ThemeConfig/WithContextLoader.ts index 36948c973..63c9b14d5 100644 --- a/Models/ThemeConfig/WithContextLoader.ts +++ b/Models/ThemeConfig/WithContextLoader.ts @@ -6,6 +6,10 @@ import {Utils} from "../../Utils"; export default class WithContextLoader { protected readonly _context: string; private readonly _json: any; + + public static getKnownTagRenderings : ((id: string) => TagRenderingConfigJson)= function(id) { + return SharedTagRenderings.SharedTagRenderingJson.get(id) +} constructor(json: any, context: string) { this._json = json; @@ -71,7 +75,7 @@ export default class WithContextLoader { continue; } - let sharedJson = SharedTagRenderings.SharedTagRenderingJson.get(renderingId) + let sharedJson = WithContextLoader.getKnownTagRenderings(renderingId) if (sharedJson === undefined) { const keys = Array.from(SharedTagRenderings.SharedTagRenderingJson.keys()); throw `Predefined tagRendering ${renderingId} not found in ${context}.\n Try one of ${keys.join( diff --git a/UI/DefaultGUI.ts b/UI/DefaultGUI.ts index d57dbbd5b..a4ac2ddee 100644 --- a/UI/DefaultGUI.ts +++ b/UI/DefaultGUI.ts @@ -44,6 +44,11 @@ export default class DefaultGUI { this.SetupUIElements(); this.SetupMap() + + + if(state.layoutToUse.customCss !== undefined && window.location.pathname.indexOf("index") >= 0){ + Utils.LoadCustomCss(state.layoutToUse.customCss) + } } public setupClickDialogOnMap(filterViewIsOpened: UIEventSource, state: FeaturePipelineState) { diff --git a/UI/Popup/FeatureInfoBox.ts b/UI/Popup/FeatureInfoBox.ts index 255e34703..f2e018dc1 100644 --- a/UI/Popup/FeatureInfoBox.ts +++ b/UI/Popup/FeatureInfoBox.ts @@ -17,6 +17,7 @@ import {Translation} from "../i18n/Translation"; import {Utils} from "../../Utils"; import {SubstitutedTranslation} from "../SubstitutedTranslation"; import MoveWizard from "./MoveWizard"; +import Toggle from "../Input/Toggle"; export default class FeatureInfoBox extends ScrollableFullScreen { @@ -51,13 +52,13 @@ export default class FeatureInfoBox extends ScrollableFullScreen { private static GenerateContent(tags: UIEventSource, layerConfig: LayerConfig): BaseUIElement { - let questionBoxes: Map = new Map(); + let questionBoxes: Map = new Map(); const allGroupNames = Utils.Dedup(layerConfig.tagRenderings.map(tr => tr.group)) if (State.state.featureSwitchUserbadge.data) { for (const groupName of allGroupNames) { const questions = layerConfig.tagRenderings.filter(tr => tr.group === groupName) - const questionBox = new QuestionBox(tags, questions, layerConfig.units); + const questionBox = new QuestionBox({tagsSource: tags, tagRenderings: questions, units:layerConfig.units}); questionBoxes.set(groupName, questionBox) } } @@ -75,7 +76,20 @@ export default class FeatureInfoBox extends ScrollableFullScreen { const questionBox = questionBoxes.get(tr.group) questionBoxes.delete(tr.group) - renderingsForGroup.push(questionBox) + if(tr.render !== undefined){ + const renderedQuestion = new TagRenderingAnswer(tags, tr, tr.group + " questions", "", { + specialViz: new Map([["questions", questionBox]]) + }) + const possiblyHidden = new Toggle( + renderedQuestion, + undefined, + questionBox.currentQuestion.map(i => i !== undefined) + ) + renderingsForGroup.push(possiblyHidden) + }else{ + renderingsForGroup.push(questionBox) + } + } else { let classes = innerClasses let isHeader = renderingsForGroup.length === 0 && i > 0 diff --git a/UI/Popup/QuestionBox.ts b/UI/Popup/QuestionBox.ts index 08ae151a3..c38ce7806 100644 --- a/UI/Popup/QuestionBox.ts +++ b/UI/Popup/QuestionBox.ts @@ -1,7 +1,6 @@ import {UIEventSource} from "../../Logic/UIEventSource"; import TagRenderingQuestion from "./TagRenderingQuestion"; import Translations from "../i18n/Translations"; -import State from "../../State"; import Combine from "../Base/Combine"; import BaseUIElement from "../BaseUIElement"; import {VariableUiElement} from "../Base/VariableUIElement"; @@ -14,71 +13,88 @@ import Lazy from "../Base/Lazy"; * Generates all the questions, one by one */ export default class QuestionBox extends VariableUiElement { + public readonly skippedQuestions: UIEventSource; + public readonly currentQuestion: UIEventSource; - constructor(tagsSource: UIEventSource, tagRenderings: TagRenderingConfig[], units: Unit[]) { + constructor(options: { tagsSource: UIEventSource, tagRenderings: TagRenderingConfig[], units: Unit[] }) { const skippedQuestions: UIEventSource = new UIEventSource([]) - tagRenderings = tagRenderings + const tagsSource = options.tagsSource + const units = options.units + const tagRenderings = options.tagRenderings .filter(tr => tr.question !== undefined) - .filter(tr => tr.question !== null); + .filter(tr => tr.question !== null) - super(tagsSource.map(tags => { - if (tags === undefined) { - return undefined; + + const tagRenderingQuestions = tagRenderings + .map((tagRendering, i) => + new Lazy(() => new TagRenderingQuestion(tagsSource, tagRendering, + { + units: units, + afterSave: () => { + // We save and indicate progress by pinging and recalculating + skippedQuestions.ping(); + }, + cancelButton: Translations.t.general.skip.Clone() + .SetClass("btn btn-secondary mr-3") + .onClick(() => { + skippedQuestions.data.push(i); + skippedQuestions.ping(); + }) + } + ))); + + + const skippedQuestionsButton = Translations.t.general.skippedQuestions + .onClick(() => { + skippedQuestions.setData([]); + }) + + const currentQuestion: UIEventSource = tagsSource.map(tags => { + if (tags === undefined) { + return undefined; + } + for (let i = 0; i < tagRenderingQuestions.length; i++) { + let tagRendering = tagRenderings[i]; + + if (skippedQuestions.data.indexOf(i) >= 0) { + continue; + } + if (tagRendering.IsKnown(tags)) { + continue; + } + if (tagRendering.condition && + !tagRendering.condition.matchesProperties(tags)) { + // Filtered away by the condition, so it is kindof known + continue; } - const tagRenderingQuestions = tagRenderings - .map((tagRendering, i) => - new Lazy(() => new TagRenderingQuestion(tagsSource, tagRendering, - { - units: units, - afterSave: () => { - // We save and indicate progress by pinging and recalculating - skippedQuestions.ping(); - }, - cancelButton: Translations.t.general.skip.Clone() - .SetClass("btn btn-secondary mr-3") - .onClick(() => { - skippedQuestions.data.push(i); - skippedQuestions.ping(); - }) - } - ))); - - const skippedQuestionsButton = Translations.t.general.skippedQuestions - .onClick(() => { - skippedQuestions.setData([]); - }) + // this value is NOT known - this is the question we have to show! + return i + } + return undefined; // The questions are depleted + }, [skippedQuestions]) - const allQuestions: BaseUIElement[] = [] - for (let i = 0; i < tagRenderingQuestions.length; i++) { - let tagRendering = tagRenderings[i]; - - if (tagRendering.IsKnown(tags)) { - continue; - } - - if (skippedQuestions.data.indexOf(i) >= 0) { - continue; - } - // this value is NOT known - we show the questions for it - if (State.state.featureSwitchShowAllQuestions.data || allQuestions.length == 0) { - allQuestions.push(tagRenderingQuestions[i]) - } - + super(currentQuestion.map(i => { + const els: BaseUIElement[] = [] + if (i !== undefined) { + els.push(tagRenderingQuestions[i]) } if (skippedQuestions.data.length > 0) { - allQuestions.push(skippedQuestionsButton) + els.push(skippedQuestionsButton) } - - return new Combine(allQuestions).SetClass("block mb-8") - }, [skippedQuestions]) + return new Combine(els).SetClass("block mb-8") + }) ) + this.skippedQuestions = skippedQuestions; + this.currentQuestion = currentQuestion + + } } \ No newline at end of file diff --git a/UI/Popup/TagRenderingAnswer.ts b/UI/Popup/TagRenderingAnswer.ts index 14b4e354c..c7724b538 100644 --- a/UI/Popup/TagRenderingAnswer.ts +++ b/UI/Popup/TagRenderingAnswer.ts @@ -12,7 +12,9 @@ import TagRenderingConfig from "../../Models/ThemeConfig/TagRenderingConfig"; export default class TagRenderingAnswer extends VariableUiElement { constructor(tagsSource: UIEventSource, configuration: TagRenderingConfig, - contentClasses: string = "", contentStyle: string = "") { + contentClasses: string = "", contentStyle: string = "", options?:{ + specialViz: Map + }) { if (configuration === undefined) { throw "Trying to generate a tagRenderingAnswer without configuration..." } @@ -35,7 +37,7 @@ export default class TagRenderingAnswer extends VariableUiElement { return undefined; } - const valuesToRender: BaseUIElement[] = trs.map(tr => new SubstitutedTranslation(tr, tagsSource)) + const valuesToRender: BaseUIElement[] = trs.map(tr => new SubstitutedTranslation(tr, tagsSource, options?.specialViz)) if (valuesToRender.length === 1) { return valuesToRender[0]; } else if (valuesToRender.length > 1) { diff --git a/Utils.ts b/Utils.ts index 5506f5973..7736ab225 100644 --- a/Utils.ts +++ b/Utils.ts @@ -224,7 +224,7 @@ Note that these values can be prepare with javascript in the theme by using a [c link.href = location; link.media = 'all'; head.appendChild(link); - console.log("Added custom layout ", location) + console.log("Added custom css file ", location) } /** diff --git a/assets/layers/barrier/barrier.json b/assets/layers/barrier/barrier.json index aa23992c7..b481674b8 100644 --- a/assets/layers/barrier/barrier.json +++ b/assets/layers/barrier/barrier.json @@ -244,9 +244,9 @@ }, { "render": { - "en": "Space between barriers (along the length of the road): {spacing} m", - "nl": "Ruimte tussen barrières (langs de lengte van de weg): {spacing} m", - "de": "Abstand zwischen den Barrieren (entlang der Straße): {spacing} m" + "en": "Space between barriers (along the length of the road): {width:separation} m", + "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" }, "question": { "en": "How much space is there between the barriers (along the length of the road)?", @@ -271,9 +271,9 @@ }, { "render": { - "en": "Width of opening: {opening} m", - "nl": "Breedte van de opening: {opening} m", - "de": "Breite der Öffnung: {opening} m" + "en": "Width of opening: {width:opening} m", + "nl": "Breedte van de opening: {width:opening} m", + "de": "Breite der Öffnung: {width:opening} m" }, "question": { "en": "How wide is the smallest opening next to the barriers?", diff --git a/assets/layers/bench/bench.json b/assets/layers/bench/bench.json index a6ed25f7f..833ba00d9 100644 --- a/assets/layers/bench/bench.json +++ b/assets/layers/bench/bench.json @@ -45,27 +45,6 @@ "tagRenderings": [ "images", { - "render": { - "en": "Backrest", - "de": "Rückenlehne", - "fr": "Dossier", - "nl": "Rugleuning", - "es": "Respaldo", - "hu": "Háttámla", - "id": "Sandaran", - "it": "Schienale", - "ru": "Спинка", - "zh_Hans": "靠背", - "zh_Hant": "靠背", - "nb_NO": "Rygglene", - "fi": "Selkänoja", - "pl": "Oparcie", - "pt_BR": "Encosto", - "pt": "Encosto" - }, - "freeform": { - "key": "backrest" - }, "mappings": [ { "if": "backrest=yes", diff --git a/assets/layers/bench_at_pt/bench_at_pt.json b/assets/layers/bench_at_pt/bench_at_pt.json index 645d990de..681aff3ad 100644 --- a/assets/layers/bench_at_pt/bench_at_pt.json +++ b/assets/layers/bench_at_pt/bench_at_pt.json @@ -116,26 +116,38 @@ "id": "bench_at_pt-name" }, { - "render": { - "en": "Stand up bench", - "de": "Stehbank", - "fr": "Banc assis debout", - "nl": "Leunbank", - "it": "Panca in piedi", - "zh_Hans": "站立长凳", - "ru": "Встаньте на скамейке", - "zh_Hant": "站立長椅" + "id": "bench_at_pt-bench_type", + "question": { + "en": "What kind of bench is this?", + "nl": "Wat voor soort bank is dit?" }, - "freeform": { - "key": "bench", - "addExtraTags": [] - }, - "condition": { - "and": [ - "bench=stand_up_bench" - ] - }, - "id": "bench_at_pt-bench" + "mappings": [ + { + "if": "bench=yes", + "then": { + "en": "There is a normal, sit-down bench here" + } + }, + { + "if": "bench=stand_up_bench", + "then": { + "en": "Stand up bench", + "de": "Stehbank", + "fr": "Banc assis debout", + "nl": "Leunbank", + "it": "Panca in piedi", + "zh_Hans": "站立长凳", + "ru": "Встаньте на скамейке", + "zh_Hant": "站立長椅" + } + }, + { + "if": "bench=no", + "then": { + "en": "There is no bench here" + } + } + ] } ], "mapRendering": [ 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 dc67b90c9..4fb0991ad 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 @@ -81,15 +81,15 @@ "pt": "Esta máquina de venda automática ainda está operacional?" }, "render": { - "en": "The operational status is {operational_status", + "en": "The operational status is {operational_status}", "nl": "Deze verkoopsautomaat is {operational_status}", "fr": "L'état opérationnel est {operational_status}", "it": "Lo stato operativo è {operational_status}", - "de": "Der Betriebszustand ist {operational_status", - "ru": "Рабочий статус: {operational_status", - "zh_Hant": "運作狀態是 {operational_status", - "pt_BR": "O estado operacional é: {operational_status", - "pt": "O estado operacional é: {operational_status" + "de": "Der Betriebszustand ist {operational_status}", + "ru": "Рабочий статус: {operational_status}", + "zh_Hant": "運作狀態是 {operational_status}", + "pt_BR": "O estado operacional é: {operational_status}", + "pt": "O estado operacional é: {operational_status}" }, "freeform": { "key": "operational_status" diff --git a/assets/layers/bike_cleaning/bike_cleaning.json b/assets/layers/bike_cleaning/bike_cleaning.json index ce484f3a9..9c32e7fb6 100644 --- a/assets/layers/bike_cleaning/bike_cleaning.json +++ b/assets/layers/bike_cleaning/bike_cleaning.json @@ -72,35 +72,50 @@ "tagRenderings": [ "images", { - "question": "How much does it cost to use the cleaning service?", - "render": "Using the cleaning service costs {charge}", + "question": { + "en": "How much does it cost to use the cleaning service?" + }, + "render": { + "en": "Using the cleaning service costs {service:bicycle:cleaning:charge}" + }, "condition": "amenity!=bike_wash", "freeform": { "key": "service:bicycle:cleaning:charge", "addExtraTags": [ "service:bicycle:cleaning:fee=yes" - ] + ], + "inline": true }, "mappings": [ { "if": "service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge=", - "then": "The cleaning service is free to use" + "then": { + "en": "The cleaning service is free to use" + } }, { - "if": "service:bicycle:cleaning:fee=no&", - "then": "Free to use", + "if": "service:bicycle:cleaning:fee=no", + "then": { + "en": "Free to use" + }, "hideInAnswer": true }, { "if": "service:bicycle:cleaning:fee=yes", - "then": "The cleaning service has a fee" + "then": { + "en": "The cleaning service has a fee, but the amount is not known" + } } ], "id": "bike_cleaning-service:bicycle:cleaning:charge" }, { - "question": "How much does it cost to use the cleaning service?", - "render": "Using the cleaning service costs {charge}", + "question": { + "en": "How much does it cost to use the cleaning service?" + }, + "render": { + "en": "Using the cleaning service costs {charge}" + }, "condition": "amenity=bike_wash", "freeform": { "key": "charge", @@ -111,16 +126,22 @@ "mappings": [ { "if": "fee=no&charge=", - "then": "Free to use cleaning service" + "then": { + "en": "Free to use cleaning service" + } }, { - "if": "fee=no&", - "then": "Free to use", + "if": "fee=no", + "then": { + "en": "Free to use" + }, "hideInAnswer": true }, { "if": "fee=yes", - "then": "The cleaning service has a fee" + "then": { + "en": "The cleaning service has a fee" + } } ], "id": "bike_cleaning-charge" diff --git a/assets/layers/bike_shop/bike_shop.json b/assets/layers/bike_shop/bike_shop.json index 2e2004062..2f4bf3e0e 100644 --- a/assets/layers/bike_shop/bike_shop.json +++ b/assets/layers/bike_shop/bike_shop.json @@ -231,8 +231,8 @@ "de": "Dieses Fahrradgeschäft heißt {name}", "it": "Questo negozio di biciclette è chiamato {name}", "ru": "Этот магазин велосипедов называется {name}", - "pt_BR": "Esta loja de bicicletas se chama {nome}", - "pt": "Esta loja de bicicletas se chama {nome}" + "pt_BR": "Esta loja de bicicletas se chama {name}", + "pt": "Esta loja de bicicletas se chama {name}" }, "freeform": { "key": "name" @@ -664,32 +664,7 @@ } ] }, - { - "question": "How much does it cost to use the cleaning service?", - "render": "Using the cleaning service costs {charge}", - "freeform": { - "key": "service:bicycle:cleaning:charge", - "addExtraTags": [ - "service:bicycle:cleaning:fee=yes" - ] - }, - "mappings": [ - { - "if": "service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge=", - "then": "The cleaning service is free to use" - }, - { - "if": "service:bicycle:cleaning:fee=no&", - "then": "Free to use", - "hideInAnswer": true - }, - { - "if": "service:bicycle:cleaning:fee=yes", - "then": "The cleaning service has a fee" - } - ], - "id": "bike_cleaning-service:bicycle:cleaning:charge" - } + "bike_cleaning.bike_cleaning-service:bicycle:cleaning:charge" ], "presets": [ { diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json index 8be6498a8..05c840ab6 100644 --- a/assets/layers/charging_station/charging_station.json +++ b/assets/layers/charging_station/charging_station.json @@ -23,8 +23,7 @@ }, "description": { "en": "A charging station", - "nl": "Oplaadpunten", - "de": "Eine Ladestation" + "nl": "Oplaadpunten" }, "tagRenderings": [ "images", @@ -33,8 +32,7 @@ "#": "Allowed vehicle types", "question": { "en": "Which vehicles are allowed to charge here?", - "nl": "Welke voertuigen kunnen hier opgeladen worden?", - "de": "Welche Fahrzeuge dürfen hier geladen werden?" + "nl": "Welke voertuigen kunnen hier opgeladen worden?" }, "multiAnswer": true, "mappings": [ @@ -43,8 +41,7 @@ "ifnot": "bicycle=no", "then": { "en": "Bcycles can be charged here", - "nl": "Fietsen kunnen hier opgeladen worden", - "de": "Fahrräder können hier geladen werden" + "nl": "Fietsen kunnen hier opgeladen worden" } }, { @@ -52,8 +49,7 @@ "ifnot": "motorcar=no", "then": { "en": "Cars can be charged here", - "nl": "Elektrische auto's kunnen hier opgeladen worden", - "de": "Autos können hier geladen werden" + "nl": "Elektrische auto's kunnen hier opgeladen worden" } }, { @@ -61,8 +57,7 @@ "ifnot": "scooter=no", "then": { "en": "Scooters can be charged here", - "nl": "Electrische scooters (snorfiets of bromfiets) kunnen hier opgeladen worden", - "de": " Roller können hier geladen werden" + "nl": "Electrische scooters (snorfiets of bromfiets) kunnen hier opgeladen worden" } }, { @@ -70,8 +65,7 @@ "ifnot": "hgv=no", "then": { "en": "Heavy good vehicles (such as trucks) can be charged here", - "nl": "Vrachtwagens kunnen hier opgeladen worden", - "de": "Lastkraftwagen (LKW) können hier geladen werden" + "nl": "Vrachtwagens kunnen hier opgeladen worden" } }, { @@ -79,8 +73,7 @@ "ifnot": "bus=no", "then": { "en": "Buses can be charged here", - "nl": "Bussen kunnen hier opgeladen worden", - "de": "Busse können hier geladen werden" + "nl": "Bussen kunnen hier opgeladen worden" } } ] @@ -89,13 +82,11 @@ "id": "access", "question": { "en": "Who is allowed to use this charging station?", - "nl": "Wie mag er dit oplaadpunt gebruiken?", - "de": "Wer darf diese Ladestation benutzen?" + "nl": "Wie mag er dit oplaadpunt gebruiken?" }, "render": { "en": "Access is {access}", - "nl": "Toegang voor {access}", - "de": "Zugang ist {access}" + "nl": "Toegang voor {access}" }, "freeform": { "key": "access", @@ -144,13 +135,11 @@ "id": "capacity", "render": { "en": "{capacity} vehicles can be charged here at the same time", - "nl": "{capacity} voertuigen kunnen hier op hetzelfde moment opgeladen worden", - "de": "{capacity} Fahrzeuge können hier gleichzeitig geladen werden" + "nl": "{capacity} voertuigen kunnen hier op hetzelfde moment opgeladen worden" }, "question": { "en": "How much vehicles can be charged here at the same time?", - "nl": "Hoeveel voertuigen kunnen hier opgeladen worden?", - "de": "Wie viele Fahrzeuge können hier gleichzeitig geladen werden?" + "nl": "Hoeveel voertuigen kunnen hier opgeladen worden?" }, "freeform": { "key": "capacity", @@ -161,8 +150,7 @@ "id": "Available_charging_stations (generated)", "question": { "en": "Which charging connections are available here?", - "nl": "Welke aansluitingen zijn hier beschikbaar?", - "de": "Welche Ladestationen gibt es hier?" + "nl": "Welke aansluitingen zijn hier beschikbaar?" }, "multiAnswer": true, "mappings": [ @@ -263,8 +251,7 @@ }, "then": { "en": "
Chademo
", - "nl": "
Chademo
", - "de": "
Chademo
" + "nl": "
Chademo
" }, "hideInAnswer": true }, @@ -273,8 +260,7 @@ "ifnot": "socket:type1_cable=", "then": { "en": "
Type 1 with cable (J1772)
", - "nl": "
Type 1 met kabel (J1772)
", - "de": "
Typ 1 mit Kabel (J1772)
" + "nl": "
Type 1 met kabel (J1772)
" }, "hideInAnswer": { "or": [ @@ -312,8 +298,7 @@ }, "then": { "en": "
Type 1 with cable (J1772)
", - "nl": "
Type 1 met kabel (J1772)
", - "de": "
Typ 1 mit Kabel (J1772)
" + "nl": "
Type 1 met kabel (J1772)
" }, "hideInAnswer": true }, @@ -322,8 +307,7 @@ "ifnot": "socket:type1=", "then": { "en": "
Type 1 without cable (J1772)
", - "nl": "
Type 1 zonder kabel (J1772)
", - "de": "
Typ 1 ohne Kabel (J1772)
" + "nl": "
Type 1 zonder kabel (J1772)
" }, "hideInAnswer": { "or": [ @@ -361,8 +345,7 @@ }, "then": { "en": "
Type 1 without cable (J1772)
", - "nl": "
Type 1 zonder kabel (J1772)
", - "de": "
Typ 1 ohne Kabel (J1772)
" + "nl": "
Type 1 zonder kabel (J1772)
" }, "hideInAnswer": true }, @@ -371,8 +354,7 @@ "ifnot": "socket:type1_combo=", "then": { "en": "
Type 1 CCS (aka Type 1 Combo)
", - "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
", - "de": "
Typ 1 CCS (auch bekannt als Typ 1 Combo)
" + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
" }, "hideInAnswer": { "or": [ @@ -410,8 +392,7 @@ }, "then": { "en": "
Type 1 CCS (aka Type 1 Combo)
", - "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
", - "de": "
Typ 1 CCS (auch bekannt als Typ 1 Combo)
" + "nl": "
Type 1 CCS (ook gekend als Type 1 Combo)
" }, "hideInAnswer": true }, @@ -420,8 +401,7 @@ "ifnot": "socket:tesla_supercharger=", "then": { "en": "
Tesla Supercharger
", - "nl": "
Tesla Supercharger
", - "de": "
Tesla Supercharger
" + "nl": "
Tesla Supercharger
" }, "hideInAnswer": { "or": [ @@ -459,8 +439,7 @@ }, "then": { "en": "
Tesla Supercharger
", - "nl": "
Tesla Supercharger
", - "de": "
Tesla Supercharger
" + "nl": "
Tesla Supercharger
" }, "hideInAnswer": true }, @@ -469,8 +448,7 @@ "ifnot": "socket:type2=", "then": { "en": "
Type 2 (mennekes)
", - "nl": "
Type 2 (mennekes)
", - "de": "
Typ 2 (Mennekes)
" + "nl": "
Type 2 (mennekes)
" }, "hideInAnswer": { "or": [ @@ -508,8 +486,7 @@ }, "then": { "en": "
Type 2 (mennekes)
", - "nl": "
Type 2 (mennekes)
", - "de": "
Typ 2 (Mennekes)
" + "nl": "
Type 2 (mennekes)
" }, "hideInAnswer": true }, @@ -518,8 +495,7 @@ "ifnot": "socket:type2_combo=", "then": { "en": "
Type 2 CCS (mennekes)
", - "nl": "
Type 2 CCS (mennekes)
", - "de": "
Typ 2 CCS (Mennekes)
" + "nl": "
Type 2 CCS (mennekes)
" }, "hideInAnswer": { "or": [ @@ -557,8 +533,7 @@ }, "then": { "en": "
Type 2 CCS (mennekes)
", - "nl": "
Type 2 CCS (mennekes)
", - "de": "
Typ 2 CCS (Mennekes)
" + "nl": "
Type 2 CCS (mennekes)
" }, "hideInAnswer": true }, @@ -567,8 +542,7 @@ "ifnot": "socket:type2_cable=", "then": { "en": "
Type 2 with cable (mennekes)
", - "nl": "
Type 2 met kabel (J1772)
", - "de": "
Typ 2 mit Kabel (Mennekes)
" + "nl": "
Type 2 met kabel (J1772)
" }, "hideInAnswer": { "or": [ @@ -606,8 +580,7 @@ }, "then": { "en": "
Type 2 with cable (mennekes)
", - "nl": "
Type 2 met kabel (J1772)
", - "de": "
Typ 2 mit Kabel (Mennekes)
" + "nl": "
Type 2 met kabel (J1772)
" }, "hideInAnswer": true }, @@ -616,8 +589,7 @@ "ifnot": "socket:tesla_supercharger_ccs=", "then": { "en": "
Tesla Supercharger CCS (a branded type2_css)
", - "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
", - "de": "
Tesla Supercharger CCS (Typ 2 CSS)
" + "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
" }, "hideInAnswer": { "or": [ @@ -655,8 +627,7 @@ }, "then": { "en": "
Tesla Supercharger CCS (a branded type2_css)
", - "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
", - "de": "
Tesla Supercharger CCS (Typ 2 CSS)
" + "nl": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
" }, "hideInAnswer": true }, @@ -769,8 +740,7 @@ "ifnot": "socket:USB-A=", "then": { "en": "
USB to charge phones and small electronics
", - "nl": "
USB om GSMs en kleine electronica op te laden
", - "de": "
USB zum Laden von Smartphones oder Elektrokleingeräten
" + "nl": "
USB om GSMs en kleine electronica op te laden
" } }, { @@ -782,8 +752,7 @@ }, "then": { "en": "
USB to charge phones and small electronics
", - "nl": "
USB om GSMs en kleine electronica op te laden
", - "de": "
USB zum Laden von Smartphones und Elektrokleingeräten
" + "nl": "
USB om GSMs en kleine electronica op te laden
" }, "hideInAnswer": true }, @@ -835,8 +804,7 @@ "ifnot": "socket:bosch_5pin=", "then": { "en": "
Bosch Active Connect with 5 pins and cable
", - "nl": "
Bosch Active Connect met 5 pinnen aan een kabel
", - "de": "
Bosch Active Connect mit 5 Pins und Kabel
" + "nl": "
Bosch Active Connect met 5 pinnen aan een kabel
" }, "hideInAnswer": { "or": [ @@ -870,8 +838,7 @@ }, "then": { "en": "
Bosch Active Connect with 5 pins and cable
", - "nl": "
Bosch Active Connect met 5 pinnen aan een kabel
", - "de": "
Bosch Active Connect mit 5 Pins und Kabel
" + "nl": "
Bosch Active Connect met 5 pinnen aan een kabel
" }, "hideInAnswer": true } @@ -2893,21 +2860,14 @@ }, "question": { "en": "When is this charging station opened?", - "nl": "Wanneer is dit oplaadpunt beschikbaar??", - "de": "Wann ist diese Ladestation geöffnet?", - "it": "Quali sono gli orari di apertura di questa stazione di ricarica?", - "ja": "この充電ステーションはいつオープンしますか?", - "nb_NO": "Når åpnet denne ladestasjonen?", - "ru": "В какое время работает эта зарядная станция?", - "zh_Hant": "何時是充電站開放使用的時間?" + "nl": "Wanneer is dit oplaadpunt beschikbaar??" }, "mappings": [ { "if": "opening_hours=24/7", "then": { "en": "24/7 opened (including holidays)", - "nl": "24/7 open - ook tijdens vakanties", - "de": "durchgehend geöffnet (auch an Feiertagen)" + "nl": "24/7 open - ook tijdens vakanties" } } ] @@ -3016,8 +2976,7 @@ "ifnot": "payment:app=no", "then": { "en": "Payment is done using a dedicated app", - "nl": "Betalen via een app van het netwerk", - "de": "Bezahlung mit einer speziellen App" + "nl": "Betalen via een app van het netwerk" } }, { @@ -3025,8 +2984,7 @@ "ifnot": "payment:membership_card=no", "then": { "en": "Payment is done using a membership card", - "nl": "Betalen via een lidkaart van het netwerk", - "de": "Bezahlung mit einer Mitgliedskarte" + "nl": "Betalen via een lidkaart van het netwerk" } } ] @@ -3037,8 +2995,7 @@ "#": "In some cases, charging is free but one has to be authenticated. We only ask for authentication if fee is no (or unset). By default one sees the questions for either the payment options or the authentication options, but normally not both", "question": { "en": "What kind of authentication is available at the charging station?", - "nl": "Hoe kan men zich aanmelden aan dit oplaadstation?", - "de": "Welche Authentifizierung ist an der Ladestation möglich?" + "nl": "Hoe kan men zich aanmelden aan dit oplaadstation?" }, "multiAnswer": true, "mappings": [ @@ -3047,8 +3004,7 @@ "ifnot": "authentication:membership_card=no", "then": { "en": "Authentication by a membership card", - "nl": "Aanmelden met een lidkaart is mogelijk", - "de": "Authentifizierung durch eine Mitgliedskarte" + "nl": "Aanmelden met een lidkaart is mogelijk" } }, { @@ -3056,8 +3012,7 @@ "ifnot": "authentication:app=no", "then": { "en": "Authentication by an app", - "nl": "Aanmelden via een applicatie is mogelijk", - "de": "Authentifizierung durch eine App" + "nl": "Aanmelden via een applicatie is mogelijk" } }, { @@ -3065,8 +3020,7 @@ "ifnot": "authentication:phone_call=no", "then": { "en": "Authentication via phone call is available", - "nl": "Aanmelden door te bellen naar een telefoonnummer is mogelijk", - "de": "Authentifizierung per Anruf ist möglich" + "nl": "Aanmelden door te bellen naar een telefoonnummer is mogelijk" } }, { @@ -3074,8 +3028,7 @@ "ifnot": "authentication:short_message=no", "then": { "en": "Authentication via SMS is available", - "nl": "Aanmelden via SMS is mogelijk", - "de": "Authentifizierung per Anruf ist möglich" + "nl": "Aanmelden via SMS is mogelijk" } }, { @@ -3083,8 +3036,7 @@ "ifnot": "authentication:nfc=no", "then": { "en": "Authentication via NFC is available", - "nl": "Aanmelden via NFC is mogelijk", - "de": "Authentifizierung über NFC ist möglich" + "nl": "Aanmelden via NFC is mogelijk" } }, { @@ -3092,8 +3044,7 @@ "ifnot": "authentication:money_card=no", "then": { "en": "Authentication via Money Card is available", - "nl": "Aanmelden met Money Card is mogelijk", - "de": "Authentifizierung über Geldkarte ist möglich" + "nl": "Aanmelden met Money Card is mogelijk" } }, { @@ -3101,8 +3052,7 @@ "ifnot": "authentication:debit_card=no", "then": { "en": "Authentication via debit card is available", - "nl": "Aanmelden met een betaalkaart is mogelijk", - "de": "Authentifizierung per Debitkarte ist möglich" + "nl": "Aanmelden met een betaalkaart is mogelijk" } }, { @@ -3110,8 +3060,7 @@ "ifnot": "authentication:none=no", "then": { "en": "Charging here is (also) possible without authentication", - "nl": "Hier opladen is (ook) mogelijk zonder aan te melden", - "de": "Das Aufladen ist hier (auch) ohne Authentifizierung möglich" + "nl": "Hier opladen is (ook) mogelijk zonder aan te melden" } } ], @@ -3126,13 +3075,11 @@ "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}", - "de": "Authentifizierung durch Anruf oder SMS an {authentication:phone_call:number}" + "nl": "Aanmelden door te bellen of te SMS'en naar {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?", - "de": "Wie lautet die Telefonnummer für den Authentifizierungsanruf oder die SMS?" + "nl": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?" }, "freeform": { "key": "authentication:phone_call:number", @@ -3149,24 +3096,21 @@ "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?", - "de": "Was ist die Höchstdauer des Aufenthalts hier?" + "nl": "Hoelang mag een voertuig hier blijven staan?" }, "freeform": { "key": "maxstay" }, "render": { "en": "One can stay at most {canonical(maxstay)}", - "nl": "De maximale parkeertijd hier is {canonical(maxstay)}", - "de": "Die maximale Parkzeit beträgt {canonical(maxstay)}" + "nl": "De maximale parkeertijd hier is {canonical(maxstay)}" }, "mappings": [ { "if": "maxstay=unlimited", "then": { "en": "No timelimit on leaving your vehicle here", - "nl": "Geen maximum parkeertijd", - "de": "Keine Höchstparkdauer" + "nl": "Geen maximum parkeertijd" } } ], @@ -3183,22 +3127,11 @@ "id": "Network", "render": { "en": "Part of the network {network}", - "nl": "Maakt deel uit van het {network}-netwerk", - "de": "Teil des Netzwerks {network}", - "it": "{network}", - "ja": "{network}", - "nb_NO": "{network}", - "ru": "{network}", - "zh_Hant": "{network}" + "nl": "Maakt deel uit van het {network}-netwerk" }, "question": { "en": "Is this charging station part of a network?", - "nl": "Is dit oplaadpunt deel van een groter netwerk?", - "de": "Ist diese Ladestation Teil eines Netzwerks?", - "it": "A quale rete appartiene questa stazione di ricarica?", - "ja": "この充電ステーションの運営チェーンはどこですか?", - "ru": "К какой сети относится эта станция?", - "zh_Hant": "充電站所屬的網路是?" + "nl": "Is dit oplaadpunt deel van een groter netwerk?" }, "freeform": { "key": "network" @@ -3208,16 +3141,14 @@ "if": "no:network=yes", "then": { "en": "Not part of a bigger network", - "nl": "Maakt geen deel uit van een groter netwerk", - "de": "Nicht Teil eines größeren Netzwerks" + "nl": "Maakt geen deel uit van een groter netwerk" } }, { "if": "network=none", "then": { "en": "Not part of a bigger network", - "nl": "Maakt geen deel uit van een groter netwerk", - "de": "Nicht Teil eines größeren Netzwerks" + "nl": "Maakt geen deel uit van een groter netwerk" }, "hideInAnswer": true }, @@ -3239,13 +3170,11 @@ "id": "Operator", "question": { "en": "Who is the operator of this charging station?", - "nl": "Wie beheert dit oplaadpunt?", - "de": "Wer ist der Betreiber dieser Ladestation?" + "nl": "Wie beheert dit oplaadpunt?" }, "render": { "en": "This charging station is operated by {operator}", - "nl": "Wordt beheerd door {operator}", - "de": "Diese Ladestation wird betrieben von {operator}" + "nl": "Wordt beheerd door {operator}" }, "freeform": { "key": "operator" @@ -3259,8 +3188,7 @@ }, "then": { "en": "Actually, {operator} is the network", - "nl": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt", - "de": "Eigentlich ist {operator} das Netzwerk" + "nl": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt" }, "addExtraTags": [ "operator=" @@ -3273,13 +3201,11 @@ "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?", - "de": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?" + "nl": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?" }, "render": { "en": "In case of problems, call {phone}", - "nl": "Bij problemen, bel naar {phone}", - "de": "Bei Problemen, anrufen unter {phone}" + "nl": "Bij problemen, bel naar {phone}" }, "freeform": { "key": "phone", @@ -3290,13 +3216,11 @@ "id": "email", "question": { "en": "What is the email address of the operator?", - "nl": "Wat is het email-adres van de operator?", - "de": "Wie ist die Email-Adresse des Betreibers?" + "nl": "Wat is het email-adres van de operator?" }, "render": { "en": "In case of problems, send an email to {email}", - "nl": "Bij problemen, email naar {email}", - "de": "Bei Problemen senden Sie eine E-Mail an {email}" + "nl": "Bij problemen, email naar {email}" }, "freeform": { "key": "email", @@ -3307,13 +3231,11 @@ "id": "website", "question": { "en": "What is the website where one can find more information about this charging station?", - "nl": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?", - "de": "Wie ist die Webseite des Betreibers?" + "nl": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?" }, "render": { "en": "More info on {website}", - "nl": "Meer informatie op {website}", - "de": "Weitere Informationen auf {website}" + "nl": "Meer informatie op {website}" }, "freeform": { "key": "website", @@ -3325,13 +3247,11 @@ "id": "ref", "question": { "en": "What is the reference number of this charging station?", - "nl": "Wat is het referentienummer van dit oplaadstation?", - "de": "Wie lautet die Kennung dieser Ladestation?" + "nl": "Wat is het referentienummer van dit oplaadstation?" }, "render": { "en": "Reference number is {ref}", - "nl": "Het referentienummer van dit oplaadpunt is {ref}", - "de": "Die Kennziffer ist {ref}" + "nl": "Het referentienummer van dit oplaadpunt is {ref}" }, "freeform": { "key": "ref" @@ -3343,8 +3263,7 @@ "id": "Operational status", "question": { "en": "Is this charging point in use?", - "nl": "Is dit oplaadpunt operationeel?", - "de": "Ist dieser Ladepunkt in Betrieb?" + "nl": "Is dit oplaadpunt operationeel?" }, "mappings": [ { @@ -3359,8 +3278,7 @@ }, "then": { "en": "This charging station works", - "nl": "Dit oplaadpunt werkt", - "de": "Diese Ladestation funktioniert" + "nl": "Dit oplaadpunt werkt" } }, { @@ -3375,8 +3293,7 @@ }, "then": { "en": "This charging station is broken", - "nl": "Dit oplaadpunt is kapot", - "de": "Diese Ladestation ist kaputt" + "nl": "Dit oplaadpunt is kapot" } }, { @@ -3391,8 +3308,7 @@ }, "then": { "en": "A charging station is planned here", - "nl": "Hier zal binnenkort een oplaadpunt gebouwd worden", - "de": "Hier ist eine Ladestation geplant" + "nl": "Hier zal binnenkort een oplaadpunt gebouwd worden" } }, { @@ -3407,8 +3323,7 @@ }, "then": { "en": "A charging station is constructed here", - "nl": "Hier wordt op dit moment een oplaadpunt gebouwd", - "de": "Hier wird eine Ladestation gebaut" + "nl": "Hier wordt op dit moment een oplaadpunt gebouwd" } }, { @@ -3423,8 +3338,7 @@ }, "then": { "en": "This charging station has beed permanently disabled and is not in use anymore but is still visible", - "nl": "Dit oplaadpunt is niet meer in gebruik maar is wel nog aanwezig", - "de": "Diese Ladestation wurde dauerhaft deaktiviert und wird nicht mehr benutzt, ist aber noch sichtbar" + "nl": "Dit oplaadpunt is niet meer in gebruik maar is wel nog aanwezig" } } ] @@ -3433,24 +3347,21 @@ "id": "Parking:fee", "question": { "en": "Does one have to pay a parking fee while charging?", - "nl": "Moet men parkeergeld betalen tijdens het opladen?", - "de": "Muss man beim Laden eine Parkgebühr bezahlen?" + "nl": "Moet men parkeergeld betalen tijdens het opladen?" }, "mappings": [ { "if": "parking:fee=no", "then": { "en": "No additional parking cost while charging", - "nl": "Geen extra parkeerkost tijdens het opladen", - "de": "Keine zusätzlichen Parkgebühren beim Laden" + "nl": "Geen extra parkeerkost tijdens het opladen" } }, { "if": "parking:fee=yes", "then": { "en": "An additional parking fee should be paid while charging", - "nl": "Tijdens het opladen moet er parkeergeld betaald worden", - "de": "Beim Laden ist eine zusätzliche Parkgebühr zu entrichten" + "nl": "Tijdens het opladen moet er parkeergeld betaald worden" } } ], @@ -3469,7 +3380,11 @@ }, { "id": "questions", - "group": "technical" + "group": "technical", + "render": { + "en": "

Technical questions

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

Technische vragen

De vragen hieronder zijn erg technisch - sla deze over indien je hier geen tijd voor hebt
{questions}" + } } ], "mapRendering": [ @@ -3545,9 +3460,7 @@ ], "title": { "en": "charging station with a normal european wall plug (meant to charge electrical bikes)", - "nl": "laadpunt met gewone stekker(s) (bedoeld om electrische fietsen op te laden)", - "de": "Ladestation", - "ru": "Зарядная станция" + "nl": "laadpunt met gewone stekker(s) (bedoeld om electrische fietsen op te laden)" }, "preciseInput": { "preferredBackground": "map" @@ -3601,23 +3514,20 @@ { "question": { "en": "All vehicle types", - "nl": "Alle voertuigen", - "de": "Alle Fahrzeugtypen" + "nl": "Alle voertuigen" } }, { "question": { "en": "Charging station for bicycles", - "nl": "Oplaadpunten voor fietsen", - "de": "Ladestation für Fahrräder" + "nl": "Oplaadpunten voor fietsen" }, "osmTags": "bicycle=yes" }, { "question": { "en": "Charging station for cars", - "nl": "Oplaadpunten voor auto's", - "de": "Ladestation für Autos" + "nl": "Oplaadpunten voor auto's" }, "osmTags": { "or": [ @@ -3634,8 +3544,7 @@ { "question": { "en": "Only working charging stations", - "nl": "Enkel werkende oplaadpunten", - "de": "Nur funktionierende Ladestationen" + "nl": "Enkel werkende oplaadpunten" }, "osmTags": { "and": [ @@ -3652,8 +3561,7 @@ { "question": { "en": "All connectors", - "nl": "Alle types", - "de": "Alle Anschlüsse" + "nl": "Alle types" } }, { @@ -3673,8 +3581,7 @@ { "question": { "en": "Has a
Chademo
connector", - "nl": "Heeft een
Chademo
", - "de": "Hat einen
Chademo
Stecker" + "nl": "Heeft een
Chademo
" }, "osmTags": "socket:chademo~*" }, @@ -3702,8 +3609,7 @@ { "question": { "en": "Has a
Tesla Supercharger
connector", - "nl": "Heeft een
Tesla Supercharger
", - "de": "Hat einen
Tesla Supercharger
Stecker" + "nl": "Heeft een
Tesla Supercharger
" }, "osmTags": "socket:tesla_supercharger~*" }, @@ -3791,15 +3697,11 @@ ], "human": { "en": " minutes", - "nl": " minuten", - "de": " Minuten", - "ru": " минут" + "nl": " minuten" }, "humanSingular": { "en": " minute", - "nl": " minuut", - "de": " Minute", - "ru": " минута" + "nl": " minuut" } }, { @@ -3815,15 +3717,11 @@ ], "human": { "en": " hours", - "nl": " uren", - "de": " Stunden", - "ru": " часов" + "nl": " uren" }, "humanSingular": { "en": " hour", - "nl": " uur", - "de": " Stunde", - "ru": " час" + "nl": " uur" } }, { @@ -3836,15 +3734,11 @@ ], "human": { "en": " days", - "nl": " day", - "de": " Tage", - "ru": " дней" + "nl": " day" }, "humanSingular": { "en": " day", - "nl": " dag", - "de": " Tag", - "ru": " день" + "nl": " dag" } } ] @@ -3880,9 +3774,7 @@ ], "human": { "en": "Volts", - "nl": "volt", - "de": "Volt", - "ru": "Вольт" + "nl": "volt" } } ], @@ -3951,9 +3843,7 @@ ], "human": { "en": "kilowatt", - "nl": "kilowatt", - "de": "Kilowatt", - "ru": "киловатт" + "nl": "kilowatt" } }, { @@ -3963,9 +3853,7 @@ ], "human": { "en": "megawatt", - "nl": "megawatt", - "de": "Megawatt", - "ru": "мегаватт" + "nl": "megawatt" } } ], diff --git a/assets/layers/charging_station/charging_station.protojson b/assets/layers/charging_station/charging_station.protojson index 53e8e5a9e..985f38312 100644 --- a/assets/layers/charging_station/charging_station.protojson +++ b/assets/layers/charging_station/charging_station.protojson @@ -678,7 +678,11 @@ }, { "id": "questions", - "group": "technical" + "group": "technical", + "render": { + "en": "

Technical questions

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

Technische vragen

De vragen hieronder zijn erg technisch - sla deze over indien je hier geen tijd voor hebt
{questions}" + } } ], "mapRendering": [ diff --git a/assets/layers/defibrillator/defibrillator.json b/assets/layers/defibrillator/defibrillator.json index ac21247dc..fe98f75ec 100644 --- a/assets/layers/defibrillator/defibrillator.json +++ b/assets/layers/defibrillator/defibrillator.json @@ -182,13 +182,6 @@ "id": "defibrillator-access" }, { - "render": { - "en": "There is no info about the type of device", - "nl": "Er is geen info over het soort toestel", - "fr": "Il n'y a pas d'information sur le type de dispositif", - "it": "Non vi sono informazioni riguardanti il tipo di questo dispositivo", - "de": "Es gibt keine Informationen über den Gerätetyp" - }, "question": { "en": "Is this a a regular automatic defibrillator or a manual defibrillator for professionals only?", "nl": "Is dit een gewone automatische defibrillator of een manueel toestel enkel voor professionals?", @@ -196,15 +189,24 @@ "it": "Si tratta di un normale defibrillatore automatico o un defibrillatore manuale riservato ai professionisti?", "de": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?" }, - "freeform": { - "key": "defibrillator" - }, + "condition": { "and": [ "access=no" ] }, "mappings": [ + { + "if": "defibrillator=", + "then": { + "en": "There is no info about the type of device", + "nl": "Er is geen info over het soort toestel", + "fr": "Il n'y a pas d'information sur le type de dispositif", + "it": "Non vi sono informazioni riguardanti il tipo di questo dispositivo", + "de": "Es gibt keine Informationen über den Gerätetyp" + }, + "hideInAnswer": true + }, { "if": "defibrillator=manual", "then": { @@ -225,6 +227,13 @@ "ru": "Это обычный автоматический дефибриллятор", "de": "Dies ist ein normaler automatischer Defibrillator" } + }, + { + "if": "defibrillator~", + "then": { + "en": "This is a special type of defibrillator: {defibrillator}" + }, + "hideInAnswer": true } ], "id": "defibrillator-defibrillator" @@ -308,9 +317,9 @@ "render": { "nl": "Meer informatie over de locatie (in het Engels):
{defibrillator:location:en}", "en": "Extra information about the location (in English):
{defibrillator:location:en}", - "fr": "Informations supplémentaires à propos de l'emplacement (en anglais) :
{defibrillator:location}", + "fr": "Informations supplémentaires à propos de l'emplacement (en anglais) :
{defibrillator:location:en}", "it": "Informazioni supplementari circa la posizione (in inglese):
{defibrillator:location:en}", - "de": "Zusätzliche Informationen über den Standort (auf Englisch):
{defibrillator:location}" + "de": "Zusätzliche Informationen über den Standort (auf Englisch):
{defibrillator:location:en}" }, "question": { "en": "Please give some explanation on where the defibrillator can be found (in English)", @@ -331,9 +340,9 @@ "render": { "nl": "Meer informatie over de locatie (in het Frans):
{defibrillator:location:fr}", "en": "Extra information about the location (in French):
{defibrillator:location:fr}", - "fr": "Informations supplémentaires à propos de l'emplacement (en Français) :
{defibrillator:location}", + "fr": "Informations supplémentaires à propos de l'emplacement (en Français) :
{defibrillator:location:fr}", "it": "Informazioni supplementari circa la posizione (in francese):
{defibrillator:location:fr}", - "de": "Zusätzliche Informationen zum Standort (auf Französisch):
{defibrillator:Standort:fr}" + "de": "Zusätzliche Informationen zum Standort (auf Französisch):
{defibrillator:location:fr}" }, "question": { "en": "Please give some explanation on where the defibrillator can be found (in French)", diff --git a/assets/layers/drinking_water/drinking_water.json b/assets/layers/drinking_water/drinking_water.json index 37dfc5f34..5afb438e3 100644 --- a/assets/layers/drinking_water/drinking_water.json +++ b/assets/layers/drinking_water/drinking_water.json @@ -65,11 +65,11 @@ "de": "Ist diese Trinkwasserstelle noch in Betrieb?" }, "render": { - "en": "The operational status is {operational_status", + "en": "The operational status is {operational_status}", "nl": "Deze waterkraan-status is {operational_status}", "it": "Lo stato operativo è {operational_status}", - "fr": "L'état opérationnel est {operational_status", - "de": "Der Betriebsstatus ist {operational_status" + "fr": "L'état opérationnel est {operational_status}", + "de": "Der Betriebsstatus ist {operational_status}/i>" }, "freeform": { "key": "operational_status" diff --git a/assets/layers/surveillance_camera/surveillance_camera.json b/assets/layers/surveillance_camera/surveillance_camera.json index 22c1af368..de5883328 100644 --- a/assets/layers/surveillance_camera/surveillance_camera.json +++ b/assets/layers/surveillance_camera/surveillance_camera.json @@ -409,11 +409,11 @@ "de": "Wie ist diese Kamera montiert?" }, "render": { - "en": "Mounting method: {mount}", + "en": "Mounting method: {camera:mount}", "nl": "Montage: {camera:mount}", - "fr": "Méthode de montage : {mount}", - "it": "Metodo di montaggio: {mount}", - "de": "Montageart: {mount}" + "fr": "Méthode de montage : {camera:mount}", + "it": "Metodo di montaggio: {camera:mount}", + "de": "Montageart: {camera:mount}" }, "freeform": { "key": "camera:mount" diff --git a/assets/layers/tree_node/tree_node.json b/assets/layers/tree_node/tree_node.json index 03993c946..b7e2201a4 100644 --- a/assets/layers/tree_node/tree_node.json +++ b/assets/layers/tree_node/tree_node.json @@ -454,8 +454,7 @@ "en": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", "it": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", "ru": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}", - "fr": "\"\"/ Identifiant Onroerend Erfgoed : {ref:OnroerendErfgoed}", - "de": "" + "fr": "\"\"/ Identifiant Onroerend Erfgoed : {ref:OnroerendErfgoed}" }, "question": { "nl": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?", diff --git a/assets/tagRenderings/questions.json b/assets/tagRenderings/questions.json index ce7bdbe11..16924328e 100644 --- a/assets/tagRenderings/questions.json +++ b/assets/tagRenderings/questions.json @@ -484,7 +484,7 @@ "fr": "Étage {level}", "pl": "Znajduje się na {level} piętrze", "sv": "Ligger på {level}:e våningen", - "pt": "Está no {nível}º andar", + "pt": "Está no {level}º andar", "eo": "En la {level}a etaĝo", "hu": "{level}. emeleten található", "it": "Si trova al piano numero {level}" diff --git a/assets/themes/campersite/campersite.json b/assets/themes/campersite/campersite.json index f45403b00..e69fe6b96 100644 --- a/assets/themes/campersite/campersite.json +++ b/assets/themes/campersite/campersite.json @@ -128,7 +128,7 @@ "it": "Questo luogo è chiamato {name}", "ru": "Это место называется {name}", "ja": "この場所は {name} と呼ばれています", - "fr": "Cet endroit s'appelle {nom}", + "fr": "Cet endroit s'appelle {name}", "zh_Hant": "這個地方叫做 {name}", "nl": "Deze plaats heet {name}", "pt_BR": "Este lugar é chamado de {name}", diff --git a/assets/themes/climbing/climbing.json b/assets/themes/climbing/climbing.json index 70e211855..890b9e3ce 100644 --- a/assets/themes/climbing/climbing.json +++ b/assets/themes/climbing/climbing.json @@ -1335,7 +1335,7 @@ "it": "Qual è il livello della via più difficile qua, secondo il sistema di classificazione francese?" }, "render": { - "de": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:min} (französisch/belgisches System)", + "de": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:max} (französisch/belgisches System)", "en": "The maximal difficulty is {climbing:grade:french:max} according to the french/belgian system", "nl": "De maximale klimmoeilijkheid is {climbing:grade:french:max} volgens het Franse/Belgische systeem", "ja": "フランス/ベルギーのランク評価システムでは、最大の難易度は{climbing:grade:french:max}です", diff --git a/assets/themes/hailhydrant/hailhydrant.json b/assets/themes/hailhydrant/hailhydrant.json index 4a435ae24..bd398f508 100644 --- a/assets/themes/hailhydrant/hailhydrant.json +++ b/assets/themes/hailhydrant/hailhydrant.json @@ -102,7 +102,7 @@ }, "render": { "en": "The hydrant color is {colour}", - "ja": "消火栓の色は{color}です", + "ja": "消火栓の色は{colour}です", "nb_NO": "Brannhydranter er {colour}", "ru": "Цвет гидранта {colour}", "fr": "La borne est {colour}", @@ -262,22 +262,12 @@ { "id": "hydrant-state", "question": { - "en": "Update the lifecycle status of the hydrant.", + "en": "Is this hydrant still working?", "ja": "消火栓のライフサイクルステータスを更新します。", "fr": "Mettre à jour l’état de la borne.", "de": "Aktualisieren Sie den Lebenszyklusstatus des Hydranten.", "it": "Aggiorna lo stato di funzionamento dell’idrante." }, - "render": { - "en": "Lifecycle status", - "ja": "ライフサイクルステータス", - "fr": "État", - "de": "Lebenszyklus-Status", - "it": "Stato di funzionamento" - }, - "freeform": { - "key": "disused:emergency" - }, "mappings": [ { "if": { @@ -286,7 +276,7 @@ ] }, "then": { - "en": "The hydrant is (fully or partially) working.", + "en": "The hydrant is (fully or partially) working", "ja": "消火栓は(完全にまたは部分的に)機能しています。", "ru": "Гидрант (полностью или частично) в рабочем состоянии.", "fr": "La borne est en état, ou partiellement en état, de fonctionner.", @@ -302,7 +292,7 @@ ] }, "then": { - "en": "The hydrant is unavailable.", + "en": "The hydrant is unavailable", "ja": "消火栓は使用できません。", "fr": "La borne est hors-service.", "de": "Der Hydrant ist nicht verfügbar.", @@ -317,7 +307,7 @@ ] }, "then": { - "en": "The hydrant has been removed.", + "en": "The hydrant has been removed", "ja": "消火栓が撤去されました。", "ru": "Гидрант демонтирован.", "fr": "La borne a été retirée.", diff --git a/assets/themes/toerisme_vlaanderen/custom.css b/assets/themes/toerisme_vlaanderen/custom.css new file mode 100644 index 000000000..e030e7ed1 --- /dev/null +++ b/assets/themes/toerisme_vlaanderen/custom.css @@ -0,0 +1,3 @@ +.technical.questions { + display: none +} \ No newline at end of file diff --git a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json index 0c1c63839..9f5f0c3cc 100644 --- a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json +++ b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json @@ -3,6 +3,7 @@ "credits": "Commissioned theme for Toerisme Vlaandere", "maintainer": "MapComplete", "version": "0.0.1", + "customCss": "./assets/themes/toerisme_vlaanderen/custom.css", "language": [ "en", "nl" diff --git a/assets/themes/uk_addresses/uk_addresses.json b/assets/themes/uk_addresses/uk_addresses.json index d2d8e223f..6d3b5f6fc 100644 --- a/assets/themes/uk_addresses/uk_addresses.json +++ b/assets/themes/uk_addresses/uk_addresses.json @@ -325,7 +325,7 @@ }, { "id": "fixme", - "render": "Fixme description{render}", + "render": "Fixme description{fixme}", "question": { "en": "What should be fixed here? Please explain" }, diff --git a/css/index-tailwind-output.css b/css/index-tailwind-output.css index 658e97769..72f9f9cfb 100644 --- a/css/index-tailwind-output.css +++ b/css/index-tailwind-output.css @@ -1482,6 +1482,11 @@ video { line-height: 1.75rem; } +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + .text-sm { font-size: 0.875rem; line-height: 1.25rem; @@ -1497,11 +1502,6 @@ video { line-height: 1.5rem; } -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - .text-4xl { font-size: 2.25rem; line-height: 2.5rem; @@ -1998,12 +1998,6 @@ li::marker { padding: 0.15em 0.3em; } -.question form { - display: inline-block; - max-width: 90vw; - width: 100%; -} - .invalid { box-shadow: 0 0 10px #ff5353; height: -webkit-min-content; diff --git a/css/tagrendering.css b/css/tagrendering.css index 6e154e6c1..7b675e563 100644 --- a/css/tagrendering.css +++ b/css/tagrendering.css @@ -12,7 +12,13 @@ padding: 1em; border-radius: 1em; font-size: larger; + overflow-wrap: initial; +} +.question form { + display: inline-block; + max-width: 90vw; + width: 100%; } .question svg { diff --git a/index.css b/index.css index 746aceb30..6efe3035a 100644 --- a/index.css +++ b/index.css @@ -289,12 +289,6 @@ li::marker { padding: 0.15em 0.3em; } -.question form { - display: inline-block; - max-width: 90vw; - width: 100%; -} - .invalid { box-shadow: 0 0 10px #ff5353; height: min-content; diff --git a/langs/layers/de.json b/langs/layers/de.json index 18a7cd25f..3d3fe4f07 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -133,11 +133,11 @@ }, "Space between barrier (cyclebarrier)": { "question": "Wie groß ist der Abstand zwischen den Barrieren (entlang der Straße)?", - "render": "Abstand zwischen den Barrieren (entlang der Straße): {spacing} m" + "render": "Abstand zwischen den Barrieren (entlang der Straße): {width:separation} m" }, "Width of opening (cyclebarrier)": { "question": "Wie breit ist die kleinste Öffnung neben den Barrieren?", - "render": "Breite der Öffnung: {opening} m" + "render": "Breite der Öffnung: {width:opening} m" }, "bicycle=yes/no": { "mappings": { @@ -180,8 +180,7 @@ "then": "Rückenlehne: Nein" } }, - "question": "Hat diese Bank eine Rückenlehne?", - "render": "Rückenlehne" + "question": "Hat diese Bank eine Rückenlehne?" }, "bench-colour": { "mappings": { @@ -257,8 +256,12 @@ "bench_at_pt": { "name": "Sitzbänke bei Haltestellen", "tagRenderings": { - "bench_at_pt-bench": { - "render": "Stehbank" + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "Stehbank" + } + } }, "bench_at_pt-name": { "render": "{name}" @@ -342,7 +345,7 @@ } }, "question": "Ist dieser Automat noch in Betrieb?", - "render": "Der Betriebszustand ist {operational_status" + "render": "Der Betriebszustand ist {operational_status}" } }, "title": { @@ -923,312 +926,6 @@ } } }, - "charging_station": { - "description": "Eine Ladestation", - "filter": { - "0": { - "options": { - "0": { - "question": "Alle Fahrzeugtypen" - }, - "1": { - "question": "Ladestation für Fahrräder" - }, - "2": { - "question": "Ladestation für Autos" - } - } - }, - "1": { - "options": { - "0": { - "question": "Nur funktionierende Ladestationen" - } - } - }, - "2": { - "options": { - "0": { - "question": "Alle Anschlüsse" - }, - "3": { - "question": "Hat einen
Chademo
Stecker" - }, - "7": { - "question": "Hat einen
Tesla Supercharger
Stecker" - } - } - } - }, - "presets": { - "0": { - "title": "Ladestation" - } - }, - "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": { - "then": "Authentifizierung durch eine Mitgliedskarte" - }, - "1": { - "then": "Authentifizierung durch eine App" - }, - "2": { - "then": "Authentifizierung per Anruf ist möglich" - }, - "3": { - "then": "Authentifizierung per Anruf ist möglich" - }, - "4": { - "then": "Authentifizierung über NFC ist möglich" - }, - "5": { - "then": "Authentifizierung über Geldkarte ist möglich" - }, - "6": { - "then": "Authentifizierung per Debitkarte ist möglich" - }, - "7": { - "then": "Das Aufladen ist hier (auch) ohne Authentifizierung möglich" - } - }, - "question": "Welche Authentifizierung ist an der Ladestation möglich?" - }, - "Available_charging_stations (generated)": { - "mappings": { - "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 (Typ 2 CSS)
" - }, - "21": { - "then": "
Tesla Supercharger CCS (Typ 2 CSS)
" - }, - "26": { - "then": "
USB zum Laden von Smartphones oder Elektrokleingeräten
" - }, - "27": { - "then": "
USB zum Laden von Smartphones und Elektrokleingeräten
" - }, - "30": { - "then": "
Bosch Active Connect mit 5 Pins und Kabel
" - }, - "31": { - "then": "
Bosch Active Connect mit 5 Pins und Kabel
" - } - }, - "question": "Welche Ladestationen gibt es hier?" - }, - "Network": { - "mappings": { - "0": { - "then": "Nicht Teil eines größeren Netzwerks" - }, - "1": { - "then": "Nicht Teil eines größeren Netzwerks" - } - }, - "question": "Ist diese Ladestation Teil eines Netzwerks?", - "render": "Teil des Netzwerks {network}" - }, - "OH": { - "mappings": { - "0": { - "then": "durchgehend geöffnet (auch an Feiertagen)" - } - }, - "question": "Wann ist diese Ladestation geöffnet?" - }, - "Operational status": { - "mappings": { - "0": { - "then": "Diese Ladestation funktioniert" - }, - "1": { - "then": "Diese Ladestation ist kaputt" - }, - "2": { - "then": "Hier ist eine Ladestation geplant" - }, - "3": { - "then": "Hier wird eine Ladestation gebaut" - }, - "4": { - "then": "Diese Ladestation wurde dauerhaft deaktiviert und wird nicht mehr benutzt, ist aber noch sichtbar" - } - }, - "question": "Ist dieser Ladepunkt in Betrieb?" - }, - "Operator": { - "mappings": { - "0": { - "then": "Eigentlich ist {operator} das Netzwerk" - } - }, - "question": "Wer ist der Betreiber dieser Ladestation?", - "render": "Diese Ladestation wird betrieben von {operator}" - }, - "Parking:fee": { - "mappings": { - "0": { - "then": "Keine zusätzlichen Parkgebühren beim Laden" - }, - "1": { - "then": "Beim Laden ist eine zusätzliche Parkgebühr zu entrichten" - } - }, - "question": "Muss man beim Laden eine Parkgebühr bezahlen?" - }, - "Type": { - "mappings": { - "0": { - "then": "Fahrräder können hier geladen werden" - }, - "1": { - "then": "Autos können hier geladen werden" - }, - "2": { - "then": " Roller können hier geladen werden" - }, - "3": { - "then": "Lastkraftwagen (LKW) können hier geladen werden" - }, - "4": { - "then": "Busse können hier geladen werden" - } - }, - "question": "Welche Fahrzeuge dürfen hier geladen werden?" - }, - "access": { - "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 geladen werden" - }, - "email": { - "question": "Wie ist die Email-Adresse des Betreibers?", - "render": "Bei Problemen senden Sie eine E-Mail an {email}" - }, - "maxstay": { - "mappings": { - "0": { - "then": "Keine Höchstparkdauer" - } - }, - "question": "Was ist die Höchstdauer des Aufenthalts hier?", - "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}" - }, - "payment-options": { - "override": { - "mappings+": { - "0": { - "then": "Bezahlung mit einer speziellen App" - }, - "1": { - "then": "Bezahlung mit einer Mitgliedskarte" - } - } - } - }, - "phone": { - "question": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?", - "render": "Bei Problemen, anrufen unter {phone}" - }, - "ref": { - "question": "Wie lautet die Kennung dieser Ladestation?", - "render": "Die Kennziffer ist {ref}" - }, - "website": { - "question": "Wie ist die Webseite des Betreibers?", - "render": "Weitere Informationen auf {website}" - } - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " Minuten", - "humanSingular": " Minute" - }, - "1": { - "human": " Stunden", - "humanSingular": " Stunde" - }, - "2": { - "human": " Tage", - "humanSingular": " Tag" - } - } - }, - "1": { - "applicableUnits": { - "0": { - "human": "Volt" - } - } - }, - "3": { - "applicableUnits": { - "0": { - "human": "Kilowatt" - }, - "1": { - "human": "Megawatt" - } - } - } - } - }, "crossings": { "description": "Übergänge für Fußgänger und Radfahrer", "name": "Kreuzungen", @@ -1737,14 +1434,16 @@ "defibrillator-defibrillator": { "mappings": { "0": { - "then": "Dies ist ein manueller Defibrillator für den professionellen Einsatz" + "then": "Es gibt keine Informationen über den Gerätetyp" }, "1": { + "then": "Dies ist ein manueller Defibrillator für den professionellen Einsatz" + }, + "2": { "then": "Dies ist ein normaler automatischer Defibrillator" } }, - "question": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?", - "render": "Es gibt keine Informationen über den Gerätetyp" + "question": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?" }, "defibrillator-defibrillator:location": { "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (in der lokalen Sprache)", @@ -1752,11 +1451,11 @@ }, "defibrillator-defibrillator:location:en": { "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Englisch)", - "render": "Zusätzliche Informationen über den Standort (auf Englisch):
{defibrillator:location}" + "render": "Zusätzliche Informationen über den Standort (auf Englisch):
{defibrillator:location:en}" }, "defibrillator-defibrillator:location:fr": { "question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (auf Französisch)", - "render": "Zusätzliche Informationen zum Standort (auf Französisch):
{defibrillator:Standort:fr}" + "render": "Zusätzliche Informationen zum Standort (auf Französisch):
{defibrillator:location:fr}" }, "defibrillator-description": { "question": "Gibt es nützliche Informationen für Benutzer, die Sie oben nicht beschreiben konnten? (leer lassen, wenn nein)", @@ -1860,7 +1559,7 @@ } }, "question": "Ist diese Trinkwasserstelle noch in Betrieb?", - "render": "Der Betriebsstatus ist {operational_status" + "render": "Der Betriebsstatus ist {operational_status}/i>" }, "render-closest-drinking-water": { "render": "Ein weiterer Trinkwasserbrunnen befindet sich in {_closest_other_drinking_water_distance} Meter" @@ -2771,7 +2470,7 @@ } }, "question": "Wie ist diese Kamera montiert?", - "render": "Montageart: {mount}" + "render": "Montageart: {camera:mount}" }, "direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view": { "question": "In welche Himmelsrichtung ist diese Kamera ausgerichtet?" @@ -3064,8 +2763,7 @@ "render": "Name: {name}" }, "tree_node-ref:OnroerendErfgoed": { - "question": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?", - "render": "" + "question": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?" }, "tree_node-wikidata": { "question": "Was ist das passende Wikidata Element zu diesem Baum?", diff --git a/langs/layers/en.json b/langs/layers/en.json index 03010f2a1..b410872c0 100644 --- a/langs/layers/en.json +++ b/langs/layers/en.json @@ -133,11 +133,11 @@ }, "Space between barrier (cyclebarrier)": { "question": "How much space is there between the barriers (along the length of the road)?", - "render": "Space between barriers (along the length of the road): {spacing} m" + "render": "Space between barriers (along the length of the road): {width:separation} m" }, "Width of opening (cyclebarrier)": { "question": "How wide is the smallest opening next to the barriers?", - "render": "Width of opening: {opening} m" + "render": "Width of opening: {width:opening} m" }, "bicycle=yes/no": { "mappings": { @@ -180,8 +180,7 @@ "then": "Backrest: No" } }, - "question": "Does this bench have a backrest?", - "render": "Backrest" + "question": "Does this bench have a backrest?" }, "bench-colour": { "mappings": { @@ -257,8 +256,19 @@ "bench_at_pt": { "name": "Benches at public transport stops", "tagRenderings": { - "bench_at_pt-bench": { - "render": "Stand up bench" + "bench_at_pt-bench_type": { + "mappings": { + "0": { + "then": "There is a normal, sit-down bench here" + }, + "1": { + "then": "Stand up bench" + }, + "2": { + "then": "There is no bench here" + } + }, + "question": "What kind of bench is this?" }, "bench_at_pt-name": { "render": "{name}" @@ -342,7 +352,7 @@ } }, "question": "Is this vending machine still operational?", - "render": "The operational status is {operational_status" + "render": "The operational status is {operational_status}" } }, "title": { @@ -423,6 +433,38 @@ "title": "Bike cleaning service" } }, + "tagRenderings": { + "bike_cleaning-charge": { + "mappings": { + "0": { + "then": "Free to use cleaning service" + }, + "1": { + "then": "Free to use" + }, + "2": { + "then": "The cleaning service has a fee" + } + }, + "question": "How much does it cost to use the cleaning service?", + "render": "Using the cleaning service costs {charge}" + }, + "bike_cleaning-service:bicycle:cleaning:charge": { + "mappings": { + "0": { + "then": "The cleaning service is free to use" + }, + "1": { + "then": "Free to use" + }, + "2": { + "then": "The cleaning service has a fee, but the amount is not known" + } + }, + "question": "How much does it cost to use the cleaning service?", + "render": "Using the cleaning service costs {service:bicycle:cleaning:charge}" + } + }, "title": { "mappings": { "0": { @@ -1714,6 +1756,9 @@ "question": "What power output does a single plug of type
Type 2 with cable (mennekes)
offer?", "render": "
Type 2 with cable (mennekes)
outputs at most {socket:type2_cable:output}" }, + "questions": { + "render": "

Technical questions

The questions below are very technical. Feel free to ignore them
{questions}" + }, "ref": { "question": "What is the reference number of this charging station?", "render": "Reference number is {ref}" @@ -2468,14 +2513,19 @@ "defibrillator-defibrillator": { "mappings": { "0": { - "then": "This is a manual defibrillator for professionals" + "then": "There is no info about the type of device" }, "1": { + "then": "This is a manual defibrillator for professionals" + }, + "2": { "then": "This is a normal automatic defibrillator" + }, + "3": { + "then": "This is a special type of defibrillator: {defibrillator}" } }, - "question": "Is this a a regular automatic defibrillator or a manual defibrillator for professionals only?", - "render": "There is no info about the type of device" + "question": "Is this a a regular automatic defibrillator or a manual defibrillator for professionals only?" }, "defibrillator-defibrillator:location": { "question": "Please give some explanation on where the defibrillator can be found (in the local language)", @@ -2591,7 +2641,7 @@ } }, "question": "Is this drinking water spot still operational?", - "render": "The operational status is {operational_status" + "render": "The operational status is {operational_status}" }, "render-closest-drinking-water": { "render": "There is another drinking water fountain at {_closest_other_drinking_water_distance} meter" @@ -3679,7 +3729,7 @@ } }, "question": "How is this camera placed?", - "render": "Mounting method: {mount}" + "render": "Mounting method: {camera:mount}" }, "direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view": { "mappings": { diff --git a/langs/layers/es.json b/langs/layers/es.json index 69e661729..ef10b5f04 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -39,8 +39,7 @@ "then": "Respaldo: No" } }, - "question": "¿Este banco tiene un respaldo?", - "render": "Respaldo" + "question": "¿Este banco tiene un respaldo?" }, "bench-material": { "mappings": { diff --git a/langs/layers/fi.json b/langs/layers/fi.json index 60a227b23..518882d48 100644 --- a/langs/layers/fi.json +++ b/langs/layers/fi.json @@ -30,8 +30,7 @@ "1": { "then": "Selkänoja: ei" } - }, - "render": "Selkänoja" + } }, "bench-colour": { "mappings": { diff --git a/langs/layers/fr.json b/langs/layers/fr.json index f3cc78b1f..94674cfc5 100644 --- a/langs/layers/fr.json +++ b/langs/layers/fr.json @@ -89,8 +89,7 @@ "then": "Dossier : Non" } }, - "question": "Ce banc dispose-t-il d'un dossier ?", - "render": "Dossier" + "question": "Ce banc dispose-t-il d'un dossier ?" }, "bench-colour": { "mappings": { @@ -166,8 +165,12 @@ "bench_at_pt": { "name": "Bancs des arrêts de transport en commun", "tagRenderings": { - "bench_at_pt-bench": { - "render": "Banc assis debout" + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "Banc assis debout" + } + } }, "bench_at_pt-name": { "render": "{name}" @@ -777,14 +780,16 @@ "defibrillator-defibrillator": { "mappings": { "0": { - "then": "C'est un défibrillateur manuel pour professionnel" + "then": "Il n'y a pas d'information sur le type de dispositif" }, "1": { + "then": "C'est un défibrillateur manuel pour professionnel" + }, + "2": { "then": "C'est un défibrillateur automatique manuel" } }, - "question": "Est-ce un défibrillateur automatique normal ou un défibrillateur manuel à usage professionnel uniquement ?", - "render": "Il n'y a pas d'information sur le type de dispositif" + "question": "Est-ce un défibrillateur automatique normal ou un défibrillateur manuel à usage professionnel uniquement ?" }, "defibrillator-defibrillator:location": { "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (dans la langue local)", @@ -792,11 +797,11 @@ }, "defibrillator-defibrillator:location:en": { "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (en englais)", - "render": "Informations supplémentaires à propos de l'emplacement (en anglais) :
{defibrillator:location}" + "render": "Informations supplémentaires à propos de l'emplacement (en anglais) :
{defibrillator:location:en}" }, "defibrillator-defibrillator:location:fr": { "question": "Veuillez indiquez plus précisément où se situe le défibrillateur (en français)", - "render": "Informations supplémentaires à propos de l'emplacement (en Français) :
{defibrillator:location}" + "render": "Informations supplémentaires à propos de l'emplacement (en Français) :
{defibrillator:location:fr}" }, "defibrillator-description": { "question": "Y a-t-il des informations utiles pour les utilisateurs que vous n'avez pas pu décrire ci-dessus ? (laisser vide sinon)", @@ -900,7 +905,7 @@ } }, "question": "Ce point d'eau potable est-il toujours opérationnel ?", - "render": "L'état opérationnel est {operational_status" + "render": "L'état opérationnel est {operational_status}" }, "render-closest-drinking-water": { "render": "Une autre source d’eau potable est à {_closest_other_drinking_water_distance} mètres a>" @@ -1660,7 +1665,7 @@ } }, "question": "Comment cette caméra est-elle placée ?", - "render": "Méthode de montage : {mount}" + "render": "Méthode de montage : {camera:mount}" }, "direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view": { "mappings": { diff --git a/langs/layers/hu.json b/langs/layers/hu.json index 0b9e01e68..3610384ba 100644 --- a/langs/layers/hu.json +++ b/langs/layers/hu.json @@ -26,8 +26,7 @@ "then": "Háttámla: Nem" } }, - "question": "Van háttámlája ennek a padnak?", - "render": "Háttámla" + "question": "Van háttámlája ennek a padnak?" }, "bench-colour": { "mappings": { diff --git a/langs/layers/id.json b/langs/layers/id.json index fd910d6fe..3ac8616f9 100644 --- a/langs/layers/id.json +++ b/langs/layers/id.json @@ -80,8 +80,7 @@ "then": "Sandaran: Tidak" } }, - "question": "Apakah bangku ini memiliki sandaran?", - "render": "Sandaran" + "question": "Apakah bangku ini memiliki sandaran?" }, "bench-colour": { "render": "Warna: {colour}" diff --git a/langs/layers/it.json b/langs/layers/it.json index 48e91dec9..656edbad7 100644 --- a/langs/layers/it.json +++ b/langs/layers/it.json @@ -89,8 +89,7 @@ "then": "Schienale: No" } }, - "question": "Questa panchina ha lo schienale?", - "render": "Schienale" + "question": "Questa panchina ha lo schienale?" }, "bench-colour": { "mappings": { @@ -166,8 +165,12 @@ "bench_at_pt": { "name": "Panchine alle fermate del trasporto pubblico", "tagRenderings": { - "bench_at_pt-bench": { - "render": "Panca in piedi" + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "Panca in piedi" + } + } }, "bench_at_pt-name": { "render": "{name}" @@ -745,17 +748,6 @@ "render": "Oggetto relativo alle bici" } }, - "charging_station": { - "tagRenderings": { - "Network": { - "question": "A quale rete appartiene questa stazione di ricarica?", - "render": "{network}" - }, - "OH": { - "question": "Quali sono gli orari di apertura di questa stazione di ricarica?" - } - } - }, "defibrillator": { "name": "Defibrillatori", "presets": { @@ -788,14 +780,16 @@ "defibrillator-defibrillator": { "mappings": { "0": { - "then": "Questo è un defibrillatore manuale per professionisti" + "then": "Non vi sono informazioni riguardanti il tipo di questo dispositivo" }, "1": { + "then": "Questo è un defibrillatore manuale per professionisti" + }, + "2": { "then": "È un normale defibrillatore automatico" } }, - "question": "Si tratta di un normale defibrillatore automatico o un defibrillatore manuale riservato ai professionisti?", - "render": "Non vi sono informazioni riguardanti il tipo di questo dispositivo" + "question": "Si tratta di un normale defibrillatore automatico o un defibrillatore manuale riservato ai professionisti?" }, "defibrillator-defibrillator:location": { "question": "Indica più precisamente dove si trova il defibrillatore (in lingua locale)", @@ -1556,7 +1550,7 @@ } }, "question": "Com'è posizionata questa telecamera?", - "render": "Metodo di montaggio: {mount}" + "render": "Metodo di montaggio: {camera:mount}" }, "direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view": { "mappings": { diff --git a/langs/layers/ja.json b/langs/layers/ja.json index 847778410..5e70da46e 100644 --- a/langs/layers/ja.json +++ b/langs/layers/ja.json @@ -72,17 +72,6 @@ "render": "アートワーク" } }, - "charging_station": { - "tagRenderings": { - "Network": { - "question": "この充電ステーションの運営チェーンはどこですか?", - "render": "{network}" - }, - "OH": { - "question": "この充電ステーションはいつオープンしますか?" - } - } - }, "food": { "tagRenderings": { "friture-take-your-container": { diff --git a/langs/layers/nb_NO.json b/langs/layers/nb_NO.json index b2efac43a..d9d7e4123 100644 --- a/langs/layers/nb_NO.json +++ b/langs/layers/nb_NO.json @@ -88,8 +88,7 @@ "then": "Rygglene: Nei" } }, - "question": "Har denne beken et rygglene?", - "render": "Rygglene" + "question": "Har denne beken et rygglene?" }, "bench-colour": { "mappings": { @@ -175,16 +174,6 @@ } } }, - "charging_station": { - "tagRenderings": { - "Network": { - "render": "{network}" - }, - "OH": { - "question": "Når åpnet denne ladestasjonen?" - } - } - }, "ghost_bike": { "name": "Spøkelsessykler", "title": { diff --git a/langs/layers/nl.json b/langs/layers/nl.json index 8e868bee1..4e9920bad 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -132,11 +132,11 @@ }, "Space between barrier (cyclebarrier)": { "question": "Hoeveel ruimte is er tussen de barrières (langs de lengte van de weg)?", - "render": "Ruimte tussen barrières (langs de lengte van de weg): {spacing} m" + "render": "Ruimte tussen barrières (langs de lengte van de weg): {width:separation} m" }, "Width of opening (cyclebarrier)": { "question": "Hoe breed is de smalste opening naast de barrières?", - "render": "Breedte van de opening: {opening} m" + "render": "Breedte van de opening: {width:opening} m" }, "bicycle=yes/no": { "mappings": { @@ -179,8 +179,7 @@ "then": "Rugleuning ontbreekt" } }, - "question": "Heeft deze zitbank een rugleuning?", - "render": "Rugleuning" + "question": "Heeft deze zitbank een rugleuning?" }, "bench-colour": { "mappings": { @@ -256,8 +255,13 @@ "bench_at_pt": { "name": "Zitbanken aan bushaltes", "tagRenderings": { - "bench_at_pt-bench": { - "render": "Leunbank" + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "Leunbank" + } + }, + "question": "Wat voor soort bank is dit?" }, "bench_at_pt-name": { "render": "{name}" @@ -1828,6 +1832,9 @@ "question": "Welk vermogen levert een enkele stekker van type
Type 2 met kabel (J1772)
?", "render": "
Type 2 met kabel (J1772)
levert een vermogen van maximaal {socket:type2_cable:output}" }, + "questions": { + "render": "

Technische vragen

De vragen hieronder zijn erg technisch - sla deze over indien je hier geen tijd voor hebt
{questions}" + }, "ref": { "question": "Wat is het referentienummer van dit oplaadstation?", "render": "Het referentienummer van dit oplaadpunt is {ref}" @@ -2556,14 +2563,16 @@ "defibrillator-defibrillator": { "mappings": { "0": { - "then": "Dit is een manueel toestel enkel voor professionals" + "then": "Er is geen info over het soort toestel" }, "1": { + "then": "Dit is een manueel toestel enkel voor professionals" + }, + "2": { "then": "Dit is een gewone automatische defibrillator" } }, - "question": "Is dit een gewone automatische defibrillator of een manueel toestel enkel voor professionals?", - "render": "Er is geen info over het soort toestel" + "question": "Is dit een gewone automatische defibrillator of een manueel toestel enkel voor professionals?" }, "defibrillator-defibrillator:location": { "question": "Gelieve meer informatie te geven over de exacte locatie van de defibrillator (in de plaatselijke taal)", diff --git a/langs/layers/pl.json b/langs/layers/pl.json index fd3d783f3..9674e16c3 100644 --- a/langs/layers/pl.json +++ b/langs/layers/pl.json @@ -31,8 +31,7 @@ "then": "Oparcie: Nie" } }, - "question": "Czy ta ławka ma oparcie?", - "render": "Oparcie" + "question": "Czy ta ławka ma oparcie?" }, "bench-colour": { "mappings": { diff --git a/langs/layers/pt.json b/langs/layers/pt.json index 5ece6f9a3..be98e0014 100644 --- a/langs/layers/pt.json +++ b/langs/layers/pt.json @@ -31,8 +31,7 @@ "then": "Encosto: Não" } }, - "question": "Este assento tem um escosto?", - "render": "Encosto" + "question": "Este assento tem um escosto?" }, "bench-colour": { "mappings": { @@ -189,7 +188,7 @@ } }, "question": "Esta máquina de venda automática ainda está operacional?", - "render": "O estado operacional é: {operational_status" + "render": "O estado operacional é: {operational_status}" } }, "title": { @@ -493,7 +492,7 @@ }, "bike_shop-name": { "question": "Qual o nome desta loja de bicicletas?", - "render": "Esta loja de bicicletas se chama {nome}" + "render": "Esta loja de bicicletas se chama {name}" }, "bike_shop-phone": { "question": "Qual é o número de telefone de {name}?" diff --git a/langs/layers/pt_BR.json b/langs/layers/pt_BR.json index c0ad18f5d..a0f45d6f8 100644 --- a/langs/layers/pt_BR.json +++ b/langs/layers/pt_BR.json @@ -31,8 +31,7 @@ "then": "Encosto: Não" } }, - "question": "Este assento tem um escosto?", - "render": "Encosto" + "question": "Este assento tem um escosto?" }, "bench-colour": { "mappings": { @@ -189,7 +188,7 @@ } }, "question": "Esta máquina de venda automática ainda está operacional?", - "render": "O estado operacional é: {operational_status" + "render": "O estado operacional é: {operational_status}" } }, "title": { @@ -505,7 +504,7 @@ }, "bike_shop-name": { "question": "Qual o nome desta loja de bicicletas?", - "render": "Esta loja de bicicletas se chama {nome}" + "render": "Esta loja de bicicletas se chama {name}" }, "bike_shop-phone": { "question": "Qual o número de telefone de {name}?" diff --git a/langs/layers/ru.json b/langs/layers/ru.json index 455bc47da..7935e67ef 100644 --- a/langs/layers/ru.json +++ b/langs/layers/ru.json @@ -105,8 +105,7 @@ "then": "Без спинки" } }, - "question": "Есть ли у этой скамейки спинка?", - "render": "Спинка" + "question": "Есть ли у этой скамейки спинка?" }, "bench-colour": { "mappings": { @@ -182,8 +181,12 @@ "bench_at_pt": { "name": "Скамейки на остановках общественного транспорта", "tagRenderings": { - "bench_at_pt-bench": { - "render": "Встаньте на скамейке" + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "Встаньте на скамейке" + } + } }, "bench_at_pt-name": { "render": "{name}" @@ -267,7 +270,7 @@ } }, "question": "Этот торговый автомат все еще работает?", - "render": "Рабочий статус: {operational_status" + "render": "Рабочий статус: {operational_status}" } }, "title": { @@ -634,57 +637,6 @@ } } }, - "charging_station": { - "presets": { - "0": { - "title": "Зарядная станция" - } - }, - "tagRenderings": { - "Network": { - "question": "К какой сети относится эта станция?", - "render": "{network}" - }, - "OH": { - "question": "В какое время работает эта зарядная станция?" - } - }, - "units": { - "0": { - "applicableUnits": { - "0": { - "human": " минут", - "humanSingular": " минута" - }, - "1": { - "human": " часов", - "humanSingular": " час" - }, - "2": { - "human": " дней", - "humanSingular": " день" - } - } - }, - "1": { - "applicableUnits": { - "0": { - "human": "Вольт" - } - } - }, - "3": { - "applicableUnits": { - "0": { - "human": "киловатт" - }, - "1": { - "human": "мегаватт" - } - } - } - } - }, "crossings": { "presets": { "1": { @@ -732,7 +684,7 @@ }, "defibrillator-defibrillator": { "mappings": { - "1": { + "2": { "then": "Это обычный автоматический дефибриллятор" } } diff --git a/langs/layers/zh_Hans.json b/langs/layers/zh_Hans.json index 4dc038ea6..c6a570228 100644 --- a/langs/layers/zh_Hans.json +++ b/langs/layers/zh_Hans.json @@ -16,8 +16,7 @@ "then": "靠背:无" } }, - "question": "这个长椅有靠背吗?", - "render": "靠背" + "question": "这个长椅有靠背吗?" }, "bench-colour": { "mappings": { @@ -92,8 +91,12 @@ "bench_at_pt": { "name": "在公交站点的长椅", "tagRenderings": { - "bench_at_pt-bench": { - "render": "站立长凳" + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "站立长凳" + } + } }, "bench_at_pt-name": { "render": "{name}" diff --git a/langs/layers/zh_Hant.json b/langs/layers/zh_Hant.json index 838b3bf02..92fdbfe65 100644 --- a/langs/layers/zh_Hant.json +++ b/langs/layers/zh_Hant.json @@ -89,8 +89,7 @@ "then": "靠背:無" } }, - "question": "這個長椅是否有靠背?", - "render": "靠背" + "question": "這個長椅是否有靠背?" }, "bench-colour": { "mappings": { @@ -166,8 +165,12 @@ "bench_at_pt": { "name": "大眾運輸站點的長椅", "tagRenderings": { - "bench_at_pt-bench": { - "render": "站立長椅" + "bench_at_pt-bench_type": { + "mappings": { + "1": { + "then": "站立長椅" + } + } }, "bench_at_pt-name": { "render": "{name}" @@ -251,7 +254,7 @@ } }, "question": "這個自動販賣機仍有運作嗎?", - "render": "運作狀態是 {operational_status" + "render": "運作狀態是 {operational_status}" } }, "title": { @@ -445,17 +448,6 @@ "render": "單車停車場" } }, - "charging_station": { - "tagRenderings": { - "Network": { - "question": "充電站所屬的網路是?", - "render": "{network}" - }, - "OH": { - "question": "何時是充電站開放使用的時間?" - } - } - }, "ghost_bike": { "name": "幽靈單車", "title": { diff --git a/langs/shared-questions/pt.json b/langs/shared-questions/pt.json index d3fd26d91..ea89c725d 100644 --- a/langs/shared-questions/pt.json +++ b/langs/shared-questions/pt.json @@ -39,7 +39,7 @@ } }, "question": "Em que nível se encontra este elemento?", - "render": "Está no {nível}º andar" + "render": "Está no {level}º andar" }, "opening_hours": { "question": "Qual é o horário de funcionamento de {name}?", diff --git a/langs/themes/de.json b/langs/themes/de.json index a9692fa8f..910c87b74 100644 --- a/langs/themes/de.json +++ b/langs/themes/de.json @@ -473,7 +473,7 @@ }, "6": { "question": "Welche Schwierigkeit hat hier die schwerste Route (französisch/belgisches System)?", - "render": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:min} (französisch/belgisches System)" + "render": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:max} (französisch/belgisches System)" }, "7": { "mappings": { @@ -874,8 +874,7 @@ "then": "Der Hydrant wurde entfernt." } }, - "question": "Aktualisieren Sie den Lebenszyklusstatus des Hydranten.", - "render": "Lebenszyklus-Status" + "question": "Aktualisieren Sie den Lebenszyklusstatus des Hydranten." }, "hydrant-type": { "mappings": { diff --git a/langs/themes/en.json b/langs/themes/en.json index fabc87e90..1972a62c9 100644 --- a/langs/themes/en.json +++ b/langs/themes/en.json @@ -905,17 +905,16 @@ "hydrant-state": { "mappings": { "0": { - "then": "The hydrant is (fully or partially) working." + "then": "The hydrant is (fully or partially) working" }, "1": { - "then": "The hydrant is unavailable." + "then": "The hydrant is unavailable" }, "2": { - "then": "The hydrant has been removed." + "then": "The hydrant has been removed" } }, - "question": "Update the lifecycle status of the hydrant.", - "render": "Lifecycle status" + "question": "Is this hydrant still working?" }, "hydrant-type": { "mappings": { diff --git a/langs/themes/fr.json b/langs/themes/fr.json index 2db7b0e6d..4cf52e17c 100644 --- a/langs/themes/fr.json +++ b/langs/themes/fr.json @@ -97,7 +97,7 @@ }, "caravansites-name": { "question": "Comment s'appelle cet endroit ?", - "render": "Cet endroit s'appelle {nom}" + "render": "Cet endroit s'appelle {name}" }, "caravansites-sanitary-dump": { "mappings": { @@ -686,8 +686,7 @@ "then": "La borne a été retirée." } }, - "question": "Mettre à jour l’état de la borne.", - "render": "État" + "question": "Mettre à jour l’état de la borne." }, "hydrant-type": { "mappings": { diff --git a/langs/themes/it.json b/langs/themes/it.json index 5c6a028fc..331e45984 100644 --- a/langs/themes/it.json +++ b/langs/themes/it.json @@ -829,8 +829,7 @@ "then": "L’idrante è stato rimosso." } }, - "question": "Aggiorna lo stato di funzionamento dell’idrante.", - "render": "Stato di funzionamento" + "question": "Aggiorna lo stato di funzionamento dell’idrante." }, "hydrant-type": { "mappings": { diff --git a/langs/themes/ja.json b/langs/themes/ja.json index 2f3f327d5..b4c8afeb5 100644 --- a/langs/themes/ja.json +++ b/langs/themes/ja.json @@ -655,7 +655,7 @@ } }, "question": "消火栓の色は何色ですか?", - "render": "消火栓の色は{color}です" + "render": "消火栓の色は{colour}です" }, "hydrant-state": { "mappings": { @@ -669,8 +669,7 @@ "then": "消火栓が撤去されました。" } }, - "question": "消火栓のライフサイクルステータスを更新します。", - "render": "ライフサイクルステータス" + "question": "消火栓のライフサイクルステータスを更新します。" }, "hydrant-type": { "mappings": { diff --git a/package.json b/package.json index 58ff23009..eae06c77e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "start": "npm run start:prepare && npm-run-all --parallel start:parallel:*", "strt": "npm run start:prepare && npm run start:parallel:parcel", "start:prepare": "ts-node scripts/generateLayerOverview.ts --no-fail && npm run increase-memory", - "start:parallel:parcel": "node --max_old_space_size=8000 $(which parcel) serve *.html UI/** Logic/** assets/*.json assets/svg/* assets/generated/* assets/layers/*/*.svg assets/layers/*/*.jpg assets/layers/*/*.png assets/tagRenderings/*.json assets/themes/*/*.svg assets/themes/*/*.jpg assets/themes/*/*.png vendor/* vendor/*/*", + "start:parallel:parcel": "node --max_old_space_size=8000 $(which parcel) serve *.html UI/** Logic/** assets/*.json assets/svg/* assets/generated/* assets/layers/*/*.svg assets/layers/*/*.jpg assets/layers/*/*.png assets/layers/*/*.css assets/tagRenderings/*.json assets/themes/*/*.svg assets/themes/*/*.css assets/themes/*/*.jpg assets/themes/*/*.png vendor/* vendor/*/*", "start:parallel:tailwindcli": "tailwindcss -i index.css -o css/index-tailwind-output.css --watch", "generate:css": "tailwindcss -i index.css -o css/index-tailwind-output.css", "test": "ts-node test/TestAll.ts", diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index 9d4ee262b..fb4161601 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -188,7 +188,7 @@ class LayerOverviewUtils { allTranslations .filter(t => t.tr.translations[neededLanguage] === undefined && t.tr.translations["*"] === undefined) .forEach(missing => { - themeErrorCount.push("The theme " + theme.id + " should be translation-complete for " + neededLanguage + ", but it lacks a translation for " + missing.context) + themeErrorCount.push("The theme " + theme.id + " should be translation-complete for " + neededLanguage + ", but it lacks a translation for " + missing.context+".\n\tThe full translation is "+missing.tr.translations) }) }