From 2ae24107aede0166e5652a4ad2f0aeae93a42bce Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Tue, 19 Oct 2021 01:22:24 +0200
Subject: [PATCH 01/58] Add correct splitting of turn restrictions
---
Logic/Osm/Actions/RelationSplitHandler.ts | 155 +++++--
test/RelationSplitHandler.spec.ts | 466 ++++++++++++++++++----
2 files changed, 520 insertions(+), 101 deletions(-)
diff --git a/Logic/Osm/Actions/RelationSplitHandler.ts b/Logic/Osm/Actions/RelationSplitHandler.ts
index 00c5a67069..4636743474 100644
--- a/Logic/Osm/Actions/RelationSplitHandler.ts
+++ b/Logic/Osm/Actions/RelationSplitHandler.ts
@@ -10,13 +10,9 @@ export interface RelationSplitInput {
originalNodes: number[],
allWaysNodesInOrder: number[][]
}
-
-/**
- * When a way is split and this way is part of a relation, the relation should be updated too to have the new segment if relevant.
- */
-export default class RelationSplitHandler extends OsmChangeAction {
- private readonly _input: RelationSplitInput;
- private readonly _theme: string;
+abstract class AbstractRelationSplitHandler extends OsmChangeAction {
+ protected readonly _input: RelationSplitInput;
+ protected readonly _theme: string;
constructor(input: RelationSplitInput, theme: string) {
super()
@@ -24,35 +20,10 @@ export default class RelationSplitHandler extends OsmChangeAction {
this._theme = theme;
}
- async CreateChangeDescriptions(changes: Changes): Promise {
- return new InPlaceReplacedmentRTSH(this._input, this._theme).CreateChangeDescriptions(changes)
- }
-
-
-}
-
-
-/**
- * A simple strategy to split relations:
- * -> Download the way members just before and just after the original way
- * -> Make sure they are still aligned
- *
- * Note that the feature might appear multiple times.
- */
-export class InPlaceReplacedmentRTSH extends OsmChangeAction {
- private readonly _input: RelationSplitInput;
- private readonly _theme: string;
-
- constructor(input: RelationSplitInput, theme: string) {
- super();
- this._input = input;
- this._theme = theme;
- }
-
/**
* Returns which node should border the member at the given index
*/
- private async targetNodeAt(i: number, first: boolean) {
+ protected async targetNodeAt(i: number, first: boolean) {
const member = this._input.relation.members[i]
if (member === undefined) {
return undefined
@@ -74,6 +45,124 @@ export class InPlaceReplacedmentRTSH extends OsmChangeAction {
}
return undefined;
}
+}
+
+/**
+ * When a way is split and this way is part of a relation, the relation should be updated too to have the new segment if relevant.
+ */
+export default class RelationSplitHandler extends AbstractRelationSplitHandler {
+
+ constructor(input: RelationSplitInput, theme: string) {
+ super(input, theme)
+ }
+
+ async CreateChangeDescriptions(changes: Changes): Promise {
+ if(this._input.relation.tags["type"] === "restriction"){
+ // This is a turn restriction
+ return new TurnRestrictionRSH(this._input, this._theme).CreateChangeDescriptions(changes)
+ }
+ return new InPlaceReplacedmentRTSH(this._input, this._theme).CreateChangeDescriptions(changes)
+ }
+
+
+}
+
+export class TurnRestrictionRSH extends AbstractRelationSplitHandler {
+
+ constructor(input: RelationSplitInput, theme: string) {
+ super(input, theme);
+ }
+
+ public async CreateChangeDescriptions(changes: Changes): Promise {
+
+ const relation = this._input.relation
+ const members = relation.members
+
+ const selfMembers = members.filter(m => m.type === "way" && m.ref === this._input.originalWayId)
+
+ if(selfMembers.length > 1){
+ console.warn("Detected a turn restriction where this way has multiple occurances. This is an error")
+ }
+ const selfMember = selfMembers[0]
+
+ if(selfMember.role === "via"){
+ // A via way can be replaced in place
+ return new InPlaceReplacedmentRTSH(this._input, this._theme).CreateChangeDescriptions(changes);
+ }
+
+
+ // We have to keep only the way with a common point with the rest of the relation
+ // Let's figure out which member is neighbouring our way
+
+ let commonStartPoint : number = await this.targetNodeAt(members.indexOf(selfMember), true)
+ let commonEndPoint : number = await this.targetNodeAt(members.indexOf(selfMember), false)
+
+ // In normal circumstances, only one of those should be defined
+ let commonPoint = commonStartPoint ?? commonEndPoint
+
+ // Let's select the way to keep
+ const idToKeep : {id: number} = this._input.allWaysNodesInOrder.map((nodes, i) => ({nodes: nodes, id: this._input.allWayIdsInOrder[i]}))
+ .filter(nodesId => {
+ const nds = nodesId.nodes
+ return nds[0] == commonPoint || nds[nds.length - 1] == commonPoint
+ })[0]
+
+ if(idToKeep === undefined){
+ console.error("No common point found, this was a broken turn restriction!", relation.id)
+ return []
+ }
+
+ const originalWayId = this._input.originalWayId
+ if(idToKeep.id === originalWayId){
+ console.log("Turn_restriction fixer: the original ID can be kept, nothing to do")
+ return []
+ }
+
+ const newMembers : {
+ ref:number,
+ type:"way" | "node" | "relation",
+ role:string
+ } [] = relation.members.map(m => {
+ if(m.type === "way" && m.ref === originalWayId){
+ return {
+ ref: idToKeep.id,
+ type:"way",
+ role: m.role
+ }
+ }
+ return m
+ })
+
+
+ return [
+ {
+ type: "relation",
+ id: relation.id,
+ changes: {
+ members: newMembers
+ },
+ meta: {
+ theme: this._theme,
+ changeType: "relation-fix:turn_restriction"
+ }
+ }
+ ];
+ }
+
+}
+
+/**
+ * A simple strategy to split relations:
+ * -> Download the way members just before and just after the original way
+ * -> Make sure they are still aligned
+ *
+ * Note that the feature might appear multiple times.
+ */
+export class InPlaceReplacedmentRTSH extends AbstractRelationSplitHandler {
+
+ constructor(input: RelationSplitInput, theme: string) {
+ super(input, theme);
+ }
async CreateChangeDescriptions(changes: Changes): Promise {
diff --git a/test/RelationSplitHandler.spec.ts b/test/RelationSplitHandler.spec.ts
index 43d57de873..0d13e7dc59 100644
--- a/test/RelationSplitHandler.spec.ts
+++ b/test/RelationSplitHandler.spec.ts
@@ -1,88 +1,418 @@
import T from "./TestHelper";
-import {InPlaceReplacedmentRTSH} from "../Logic/Osm/Actions/RelationSplitHandler";
+import {InPlaceReplacedmentRTSH, TurnRestrictionRSH} from "../Logic/Osm/Actions/RelationSplitHandler";
import {OsmObject, OsmRelation} from "../Logic/Osm/OsmObject";
import {Changes} from "../Logic/Osm/Changes";
import {Utils} from "../Utils";
export default class RelationSplitHandlerSpec extends T {
-
- private static async split(): Promise {
- // Lets mimick a split action of https://www.openstreetmap.org/way/295132739
-
- const relation: OsmRelation = await OsmObject.DownloadObjectAsync("relation/9572808")
- const originalNodeIds = [5273988967,
- 170497153,
- 1507524582,
- 4524321710,
- 170497155,
- 170497157,
- 170497158,
- 3208166179,
- 1507524610,
- 170497160,
- 3208166178,
- 1507524573,
- 1575932830,
- 6448669326]
-
- const withSplit = [[5273988967,
- 170497153,
- 1507524582,
- 4524321710,
- 170497155,
- 170497157,
- 170497158],
- [
- 3208166179,
- 1507524610,
- 170497160,
- 3208166178,
- 1507524573,
- 1575932830,
- 6448669326]]
-
- const splitter = new InPlaceReplacedmentRTSH(
- {
- relation: relation,
- originalWayId: 295132739,
- allWayIdsInOrder: [295132739, -1],
- originalNodes: originalNodeIds,
- allWaysNodesInOrder: withSplit
- },"no-theme")
- const changeDescription = await splitter.CreateChangeDescriptions(new Changes())
- const allIds = changeDescription[0].changes["members"].map(m => m.ref).join(",")
- const expected = "687866206,295132739,-1,690497698"
- if (allIds.indexOf(expected) < 0) {
- throw "Invalid order or the split ways. If this suddenly breaks, the parent relation at https://osm.org/relation/9572808 has probably changed and the test must be updated"
- }
- }
-
constructor() {
-
+
Utils.injectJsonDownloadForTests(
"https://www.openstreetmap.org/api/0.6/node/1124134958/ways",
- {"version":"0.6","generator":"CGImap 0.8.5 (2937646 spike-07.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"way","id":97038428,"timestamp":"2019-06-19T12:26:24Z","version":6,"changeset":71399984,"user":"Pieter Vander Vennet","uid":3818858,"nodes":[1124134958,323729212,323729351,2542460408,187073405],"tags":{"highway":"residential","name":"Brugs-Kerkhofstraat","sett:pattern":"arc","surface":"sett"}},{"type":"way","id":97038434,"timestamp":"2019-06-19T12:26:24Z","version":5,"changeset":71399984,"user":"Pieter Vander Vennet","uid":3818858,"nodes":[1124134958,1124135024,187058607],"tags":{"bicycle":"use_sidepath","highway":"residential","name":"Kerkhofblommenstraat","sett:pattern":"arc","surface":"sett"}},{"type":"way","id":97038435,"timestamp":"2017-12-21T21:41:08Z","version":4,"changeset":54826837,"user":"Jakka","uid":2403313,"nodes":[1124134958,2576628889,1124135035,5298371485,5298371495],"tags":{"bicycle":"use_sidepath","highway":"residential","name":"Kerkhofblommenstraat"}},{"type":"way","id":251446313,"timestamp":"2019-01-07T19:22:47Z","version":4,"changeset":66106872,"user":"M!dgard","uid":763799,"nodes":[1124134958,5243143198,4555715455],"tags":{"foot":"yes","highway":"service"}}]}
+ {
+ "version": "0.6",
+ "generator": "CGImap 0.8.5 (2937646 spike-07.openstreetmap.org)",
+ "copyright": "OpenStreetMap and contributors",
+ "attribution": "http://www.openstreetmap.org/copyright",
+ "license": "http://opendatacommons.org/licenses/odbl/1-0/",
+ "elements": [{
+ "type": "way",
+ "id": 97038428,
+ "timestamp": "2019-06-19T12:26:24Z",
+ "version": 6,
+ "changeset": 71399984,
+ "user": "Pieter Vander Vennet",
+ "uid": 3818858,
+ "nodes": [1124134958, 323729212, 323729351, 2542460408, 187073405],
+ "tags": {
+ "highway": "residential",
+ "name": "Brugs-Kerkhofstraat",
+ "sett:pattern": "arc",
+ "surface": "sett"
+ }
+ }, {
+ "type": "way",
+ "id": 97038434,
+ "timestamp": "2019-06-19T12:26:24Z",
+ "version": 5,
+ "changeset": 71399984,
+ "user": "Pieter Vander Vennet",
+ "uid": 3818858,
+ "nodes": [1124134958, 1124135024, 187058607],
+ "tags": {
+ "bicycle": "use_sidepath",
+ "highway": "residential",
+ "name": "Kerkhofblommenstraat",
+ "sett:pattern": "arc",
+ "surface": "sett"
+ }
+ }, {
+ "type": "way",
+ "id": 97038435,
+ "timestamp": "2017-12-21T21:41:08Z",
+ "version": 4,
+ "changeset": 54826837,
+ "user": "Jakka",
+ "uid": 2403313,
+ "nodes": [1124134958, 2576628889, 1124135035, 5298371485, 5298371495],
+ "tags": {"bicycle": "use_sidepath", "highway": "residential", "name": "Kerkhofblommenstraat"}
+ }, {
+ "type": "way",
+ "id": 251446313,
+ "timestamp": "2019-01-07T19:22:47Z",
+ "version": 4,
+ "changeset": 66106872,
+ "user": "M!dgard",
+ "uid": 763799,
+ "nodes": [1124134958, 5243143198, 4555715455],
+ "tags": {"foot": "yes", "highway": "service"}
+ }]
+ }
)
-
- Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/relation/9572808",
- {"version":"0.6","generator":"CGImap 0.8.5 (3128319 spike-07.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"relation","id":9572808,"timestamp":"2021-08-12T12:44:06Z","version":11,"changeset":109573204,"user":"A67-A67","uid":553736,"members":[{"type":"way","ref":173662702,"role":""},{"type":"way","ref":467606230,"role":""},{"type":"way","ref":126267167,"role":""},{"type":"way","ref":301897426,"role":""},{"type":"way","ref":687866206,"role":""},{"type":"way","ref":295132739,"role":""},{"type":"way","ref":690497698,"role":""},{"type":"way","ref":627893684,"role":""},{"type":"way","ref":295132741,"role":""},{"type":"way","ref":301903120,"role":""},{"type":"way","ref":672541156,"role":""},{"type":"way","ref":126264330,"role":""},{"type":"way","ref":280440853,"role":""},{"type":"way","ref":838499667,"role":""},{"type":"way","ref":838499663,"role":""},{"type":"way","ref":690497623,"role":""},{"type":"way","ref":301902946,"role":""},{"type":"way","ref":280460715,"role":""},{"type":"way","ref":972534369,"role":""},{"type":"way","ref":695680702,"role":""},{"type":"way","ref":690497860,"role":""},{"type":"way","ref":295410363,"role":""},{"type":"way","ref":823864063,"role":""},{"type":"way","ref":663172088,"role":""},{"type":"way","ref":659950322,"role":""},{"type":"way","ref":659950323,"role":""},{"type":"way","ref":230180094,"role":""},{"type":"way","ref":690497912,"role":""},{"type":"way","ref":39588765,"role":""}],"tags":{"distance":"13 km","name":"Abdijenroute","network":"lcn","old_name":"Spoorlijn 58","operator":"Toerisme West-Vlaanderen","railway":"abandoned","route":"bicycle","type":"route","wikipedia":"nl:Spoorlijn 58"}}]}
- )
-
- Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/way/687866206/full",
- {"version":"0.6","generator":"CGImap 0.8.5 (2601512 spike-07.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"node","id":5273988959,"lat":51.1811406,"lon":3.2427712,"timestamp":"2021-07-29T21:14:53Z","version":6,"changeset":108847202,"user":"kaart_fietser","uid":11022240,"tags":{"network:type":"node_network","rwn_ref":"32"}},{"type":"node","id":6448669326,"lat":51.1811346,"lon":3.242891,"timestamp":"2019-05-04T22:44:12Z","version":1,"changeset":69891295,"user":"Pieter Vander Vennet","uid":3818858,"tags":{"barrier":"bollard"}},{"type":"way","id":687866206,"timestamp":"2019-05-06T20:52:20Z","version":2,"changeset":69951497,"user":"noelbov","uid":8054928,"nodes":[6448669326,5273988959],"tags":{"highway":"cycleway","name":"Abdijenroute","railway":"abandoned","surface":"asphalt"}}]}
- )
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/way/690497698/full" ,
- {"version":"0.6","generator":"CGImap 0.8.5 (3023311 spike-07.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"node","id":170497152,"lat":51.1832353,"lon":3.2498759,"timestamp":"2018-04-24T00:29:37Z","version":7,"changeset":58357376,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":2988218625,"lat":51.1835053,"lon":3.2503067,"timestamp":"2018-09-24T21:48:46Z","version":2,"changeset":62895918,"user":"A67-A67","uid":553736},{"type":"node","id":5273988967,"lat":51.182659,"lon":3.249004,"timestamp":"2017-12-09T18:40:21Z","version":1,"changeset":54493533,"user":"CacherB","uid":1999108},{"type":"way","id":690497698,"timestamp":"2021-07-29T21:14:53Z","version":3,"changeset":108847202,"user":"kaart_fietser","uid":11022240,"nodes":[2988218625,170497152,5273988967],"tags":{"highway":"cycleway","lit":"no","name":"Abdijenroute","oneway":"no","railway":"abandoned","surface":"compacted"}}]}
+ "https://www.openstreetmap.org/api/0.6/relation/9572808",
+ {
+ "version": "0.6",
+ "generator": "CGImap 0.8.5 (3128319 spike-07.openstreetmap.org)",
+ "copyright": "OpenStreetMap and contributors",
+ "attribution": "http://www.openstreetmap.org/copyright",
+ "license": "http://opendatacommons.org/licenses/odbl/1-0/",
+ "elements": [{
+ "type": "relation",
+ "id": 9572808,
+ "timestamp": "2021-08-12T12:44:06Z",
+ "version": 11,
+ "changeset": 109573204,
+ "user": "A67-A67",
+ "uid": 553736,
+ "members": [{"type": "way", "ref": 173662702, "role": ""}, {
+ "type": "way",
+ "ref": 467606230,
+ "role": ""
+ }, {"type": "way", "ref": 126267167, "role": ""}, {
+ "type": "way",
+ "ref": 301897426,
+ "role": ""
+ }, {"type": "way", "ref": 687866206, "role": ""}, {
+ "type": "way",
+ "ref": 295132739,
+ "role": ""
+ }, {"type": "way", "ref": 690497698, "role": ""}, {
+ "type": "way",
+ "ref": 627893684,
+ "role": ""
+ }, {"type": "way", "ref": 295132741, "role": ""}, {
+ "type": "way",
+ "ref": 301903120,
+ "role": ""
+ }, {"type": "way", "ref": 672541156, "role": ""}, {
+ "type": "way",
+ "ref": 126264330,
+ "role": ""
+ }, {"type": "way", "ref": 280440853, "role": ""}, {
+ "type": "way",
+ "ref": 838499667,
+ "role": ""
+ }, {"type": "way", "ref": 838499663, "role": ""}, {
+ "type": "way",
+ "ref": 690497623,
+ "role": ""
+ }, {"type": "way", "ref": 301902946, "role": ""}, {
+ "type": "way",
+ "ref": 280460715,
+ "role": ""
+ }, {"type": "way", "ref": 972534369, "role": ""}, {
+ "type": "way",
+ "ref": 695680702,
+ "role": ""
+ }, {"type": "way", "ref": 690497860, "role": ""}, {
+ "type": "way",
+ "ref": 295410363,
+ "role": ""
+ }, {"type": "way", "ref": 823864063, "role": ""}, {
+ "type": "way",
+ "ref": 663172088,
+ "role": ""
+ }, {"type": "way", "ref": 659950322, "role": ""}, {
+ "type": "way",
+ "ref": 659950323,
+ "role": ""
+ }, {"type": "way", "ref": 230180094, "role": ""}, {
+ "type": "way",
+ "ref": 690497912,
+ "role": ""
+ }, {"type": "way", "ref": 39588765, "role": ""}],
+ "tags": {
+ "distance": "13 km",
+ "name": "Abdijenroute",
+ "network": "lcn",
+ "old_name": "Spoorlijn 58",
+ "operator": "Toerisme West-Vlaanderen",
+ "railway": "abandoned",
+ "route": "bicycle",
+ "type": "route",
+ "wikipedia": "nl:Spoorlijn 58"
+ }
+ }]
+ }
+ )
+
+ Utils.injectJsonDownloadForTests(
+ "https://www.openstreetmap.org/api/0.6/way/687866206/full",
+ {
+ "version": "0.6",
+ "generator": "CGImap 0.8.5 (2601512 spike-07.openstreetmap.org)",
+ "copyright": "OpenStreetMap and contributors",
+ "attribution": "http://www.openstreetmap.org/copyright",
+ "license": "http://opendatacommons.org/licenses/odbl/1-0/",
+ "elements": [{
+ "type": "node",
+ "id": 5273988959,
+ "lat": 51.1811406,
+ "lon": 3.2427712,
+ "timestamp": "2021-07-29T21:14:53Z",
+ "version": 6,
+ "changeset": 108847202,
+ "user": "kaart_fietser",
+ "uid": 11022240,
+ "tags": {"network:type": "node_network", "rwn_ref": "32"}
+ }, {
+ "type": "node",
+ "id": 6448669326,
+ "lat": 51.1811346,
+ "lon": 3.242891,
+ "timestamp": "2019-05-04T22:44:12Z",
+ "version": 1,
+ "changeset": 69891295,
+ "user": "Pieter Vander Vennet",
+ "uid": 3818858,
+ "tags": {"barrier": "bollard"}
+ }, {
+ "type": "way",
+ "id": 687866206,
+ "timestamp": "2019-05-06T20:52:20Z",
+ "version": 2,
+ "changeset": 69951497,
+ "user": "noelbov",
+ "uid": 8054928,
+ "nodes": [6448669326, 5273988959],
+ "tags": {
+ "highway": "cycleway",
+ "name": "Abdijenroute",
+ "railway": "abandoned",
+ "surface": "asphalt"
+ }
+ }]
+ }
+ )
+
+ Utils.injectJsonDownloadForTests(
+ "https://www.openstreetmap.org/api/0.6/way/690497698/full",
+ {
+ "version": "0.6",
+ "generator": "CGImap 0.8.5 (3023311 spike-07.openstreetmap.org)",
+ "copyright": "OpenStreetMap and contributors",
+ "attribution": "http://www.openstreetmap.org/copyright",
+ "license": "http://opendatacommons.org/licenses/odbl/1-0/",
+ "elements": [{
+ "type": "node",
+ "id": 170497152,
+ "lat": 51.1832353,
+ "lon": 3.2498759,
+ "timestamp": "2018-04-24T00:29:37Z",
+ "version": 7,
+ "changeset": 58357376,
+ "user": "Pieter Vander Vennet",
+ "uid": 3818858
+ }, {
+ "type": "node",
+ "id": 2988218625,
+ "lat": 51.1835053,
+ "lon": 3.2503067,
+ "timestamp": "2018-09-24T21:48:46Z",
+ "version": 2,
+ "changeset": 62895918,
+ "user": "A67-A67",
+ "uid": 553736
+ }, {
+ "type": "node",
+ "id": 5273988967,
+ "lat": 51.182659,
+ "lon": 3.249004,
+ "timestamp": "2017-12-09T18:40:21Z",
+ "version": 1,
+ "changeset": 54493533,
+ "user": "CacherB",
+ "uid": 1999108
+ }, {
+ "type": "way",
+ "id": 690497698,
+ "timestamp": "2021-07-29T21:14:53Z",
+ "version": 3,
+ "changeset": 108847202,
+ "user": "kaart_fietser",
+ "uid": 11022240,
+ "nodes": [2988218625, 170497152, 5273988967],
+ "tags": {
+ "highway": "cycleway",
+ "lit": "no",
+ "name": "Abdijenroute",
+ "oneway": "no",
+ "railway": "abandoned",
+ "surface": "compacted"
+ }
+ }]
+ }
+ )
+ Utils.injectJsonDownloadForTests(
+ "https://www.openstreetmap.org/api/0.6/relation/4374576" ,
+ {"version":"0.6","generator":"CGImap 0.8.5 (1266692 spike-06.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"relation","id":4374576,"timestamp":"2014-12-23T21:42:27Z","version":2,"changeset":27660623,"user":"escada","uid":436365,"members":[{"type":"way","ref":318616190,"role":"from"},{"type":"node","ref":1407529979,"role":"via"},{"type":"way","ref":143298912,"role":"to"}],"tags":{"restriction":"no_right_turn","type":"restriction"}}]}
+ )
+
+ Utils.injectJsonDownloadForTests(
+ "https://www.openstreetmap.org/api/0.6/way/143298912/full" ,
+ {"version":"0.6","generator":"CGImap 0.8.5 (4046166 spike-07.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"node","id":26343912,"lat":51.2146847,"lon":3.2397007,"timestamp":"2015-04-11T10:40:56Z","version":5,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":26343913,"lat":51.2161912,"lon":3.2386907,"timestamp":"2015-04-11T10:40:56Z","version":6,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":26343914,"lat":51.2193456,"lon":3.2360696,"timestamp":"2015-04-11T10:40:56Z","version":5,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":26343915,"lat":51.2202816,"lon":3.2352429,"timestamp":"2015-04-11T10:40:56Z","version":5,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":875668688,"lat":51.2131868,"lon":3.2406009,"timestamp":"2015-04-11T10:40:56Z","version":4,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1109632153,"lat":51.2207068,"lon":3.234882,"timestamp":"2015-04-11T10:40:55Z","version":3,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1109632154,"lat":51.220784,"lon":3.2348394,"timestamp":"2021-05-30T08:01:17Z","version":4,"changeset":105557550,"user":"albertino","uid":499281},{"type":"node","id":1109632177,"lat":51.2205082,"lon":3.2350441,"timestamp":"2015-04-11T10:40:55Z","version":3,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1407529961,"lat":51.2168476,"lon":3.2381772,"timestamp":"2015-04-11T10:40:55Z","version":2,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1407529969,"lat":51.2155155,"lon":3.23917,"timestamp":"2011-08-21T20:08:27Z","version":1,"changeset":9088257,"user":"toeklk","uid":219908},{"type":"node","id":1407529979,"lat":51.212694,"lon":3.2409595,"timestamp":"2015-04-11T10:40:55Z","version":6,"changeset":30139621,"user":"M!dgard","uid":763799,"tags":{"highway":"traffic_signals"}},{"type":"node","id":1634435395,"lat":51.2129189,"lon":3.2408257,"timestamp":"2012-02-15T19:37:51Z","version":1,"changeset":10695640,"user":"Eimai","uid":6072},{"type":"node","id":1634435396,"lat":51.2132508,"lon":3.2405417,"timestamp":"2012-02-15T19:37:51Z","version":1,"changeset":10695640,"user":"Eimai","uid":6072},{"type":"node","id":1634435397,"lat":51.2133918,"lon":3.2404416,"timestamp":"2015-04-11T10:40:55Z","version":2,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1974988033,"lat":51.2127459,"lon":3.240928,"timestamp":"2012-10-20T12:24:13Z","version":1,"changeset":13566903,"user":"skyman81","uid":955688},{"type":"node","id":3250129361,"lat":51.2127906,"lon":3.2409016,"timestamp":"2018-12-19T00:00:33Z","version":2,"changeset":65596519,"user":"beardhatcode","uid":5439560,"tags":{"crossing":"traffic_signals","highway":"crossing"}},{"type":"node","id":3250129363,"lat":51.2149189,"lon":3.2395571,"timestamp":"2015-04-11T10:40:56Z","version":2,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":3450326133,"lat":51.2139571,"lon":3.2401205,"timestamp":"2015-04-11T10:40:26Z","version":1,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":3450326135,"lat":51.2181385,"lon":3.2370893,"timestamp":"2015-04-11T10:40:26Z","version":1,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":4794847239,"lat":51.2191224,"lon":3.2362584,"timestamp":"2019-08-27T23:07:05Z","version":2,"changeset":73816461,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":8493044168,"lat":51.2130348,"lon":3.2407284,"timestamp":"2021-03-06T21:52:51Z","version":1,"changeset":100555232,"user":"kaart_fietser","uid":11022240,"tags":{"highway":"traffic_signals","traffic_signals":"traffic_lights"}},{"type":"node","id":8792687918,"lat":51.2207505,"lon":3.2348579,"timestamp":"2021-06-02T18:27:15Z","version":1,"changeset":105735092,"user":"albertino","uid":499281},{"type":"way","id":143298912,"timestamp":"2021-06-02T18:27:15Z","version":15,"changeset":105735092,"user":"albertino","uid":499281,"nodes":[1407529979,1974988033,3250129361,1634435395,8493044168,875668688,1634435396,1634435397,3450326133,26343912,3250129363,1407529969,26343913,1407529961,3450326135,4794847239,26343914,26343915,1109632177,1109632153,8792687918,1109632154],"tags":{"cycleway:right":"track","highway":"primary","lanes":"2","lit":"yes","maxspeed":"70","name":"Buiten Kruisvest","oneway":"yes","ref":"R30","surface":"asphalt","wikipedia":"nl:Buiten Kruisvest"}}]}
)
super("relationsplithandler", [
["split 295132739",
- () => RelationSplitHandlerSpec.split().then(_ => console.log("OK"))]
+ async () => {
+ // Lets mimick a split action of https://www.openstreetmap.org/way/295132739
+
+ const relation: OsmRelation = await OsmObject.DownloadObjectAsync("relation/9572808")
+ const originalNodeIds = [5273988967,
+ 170497153,
+ 1507524582,
+ 4524321710,
+ 170497155,
+ 170497157,
+ 170497158,
+ 3208166179,
+ 1507524610,
+ 170497160,
+ 3208166178,
+ 1507524573,
+ 1575932830,
+ 6448669326]
+
+ const withSplit = [[5273988967,
+ 170497153,
+ 1507524582,
+ 4524321710,
+ 170497155,
+ 170497157,
+ 170497158],
+ [
+ 3208166179,
+ 1507524610,
+ 170497160,
+ 3208166178,
+ 1507524573,
+ 1575932830,
+ 6448669326]]
+
+ const splitter = new InPlaceReplacedmentRTSH(
+ {
+ relation: relation,
+ originalWayId: 295132739,
+ allWayIdsInOrder: [295132739, -1],
+ originalNodes: originalNodeIds,
+ allWaysNodesInOrder: withSplit
+ }, "no-theme")
+ const changeDescription = await splitter.CreateChangeDescriptions(new Changes())
+ const allIds = changeDescription[0].changes["members"].map(m => m.ref).join(",")
+ const expected = "687866206,295132739,-1,690497698"
+ T.isTrue(allIds.indexOf(expected) >= 0, "didn't find the expected order of ids in the relation to test")
+ }],
+ ["split https://www.openstreetmap.org/way/143298912 (turn restriction relation)",
+ async () => {
+
+
+ const relation: OsmRelation = await OsmObject.DownloadObjectAsync("relation/4374576")
+ const originalNodeIds =
+ [
+ 1407529979,
+ 1974988033,
+ 3250129361,
+ 1634435395,
+ 8493044168,
+ 875668688,
+ 1634435396,
+ 1634435397,
+ 3450326133,
+ 26343912,
+ 3250129363,
+ 1407529969,
+ 26343913,
+ 1407529961,
+ 3450326135,
+ 4794847239,
+ 26343914,
+ 26343915,
+ 1109632177,
+ 1109632153,
+ 8792687918,
+ 1109632154
+
+ ]
+
+ const withSplit = [[
+ 1407529979, // The via point
+ 1974988033,
+ 3250129361,
+ 1634435395,
+ 8493044168,
+ 875668688,
+ 1634435396,
+ 1634435397,
+ 3450326133,
+ 26343912,
+ 3250129363,
+ 1407529969,
+ 26343913],
+ [
+ 1407529961,
+ 3450326135,
+ 4794847239,
+ 26343914,
+ 26343915,
+ 1109632177,
+ 1109632153,
+ 8792687918,
+ 1109632154
+
+ ]]
+
+ const splitter = new TurnRestrictionRSH(
+ {
+ relation: relation,
+ originalWayId: 143298912,
+ allWayIdsInOrder: [-1, 143298912],
+ originalNodes: originalNodeIds,
+ allWaysNodesInOrder: withSplit
+ }, "no-theme")
+ const changeDescription = await splitter.CreateChangeDescriptions(new Changes())
+ const allIds = changeDescription[0].changes["members"].map(m => m.type+"/"+ m.ref+"-->"+m.role).join(",")
+ const expected = "way/318616190-->from,node/1407529979-->via,way/-1-->to"
+ T.equals(expected, allIds)
+
+
+ // Reversing the ids has no effect
+ const splitterReverse = new TurnRestrictionRSH(
+ {
+ relation: relation,
+ originalWayId: 143298912,
+ allWayIdsInOrder: [143298912, -1],
+ originalNodes: originalNodeIds,
+ allWaysNodesInOrder: withSplit
+ }, "no-theme")
+ const changesReverse = await splitterReverse.CreateChangeDescriptions(new Changes())
+ T.equals(0, changesReverse.length, "Reverse turn restriction split did generate a changedescription, should not be needed")
+
+ }
+ ]
]);
}
}
\ No newline at end of file
From 57596943322e8db4f1ddbdb0ace2f70eaeabdce9 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Tue, 19 Oct 2021 01:22:59 +0200
Subject: [PATCH 02/58] Enable allow-split on cycle-infra theme
---
assets/layers/cycleways_and_roads/cycleways_and_roads.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/assets/layers/cycleways_and_roads/cycleways_and_roads.json b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
index dfcb6becb3..1480f007a5 100644
--- a/assets/layers/cycleways_and_roads/cycleways_and_roads.json
+++ b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
@@ -1175,5 +1175,6 @@
"then": ""
}
]
- }
+ },
+ "allowSplit": true
}
\ No newline at end of file
From ad8674dd70cf17c19fa236424f343c5b53205c16 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Tue, 19 Oct 2021 01:32:26 +0200
Subject: [PATCH 03/58] Small tweaks to wording in cycle_infra theme
---
assets/layers/cycleways_and_roads/cycleways_and_roads.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/assets/layers/cycleways_and_roads/cycleways_and_roads.json b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
index 1480f007a5..8b10ac7b32 100644
--- a/assets/layers/cycleways_and_roads/cycleways_and_roads.json
+++ b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
@@ -668,8 +668,8 @@
]
},
"question": {
- "en": "What is the carriage width of this road (in meters)?",
- "nl": "Hoe breed is de rijbaan in deze straat (in meters)?"
+ "en": "What is the carriage width of this road (in meters)? This is measured curb to curb and thus includes the width of parallell parking lanes",
+ "nl": "Hoe breed is de rijbaan in deze straat (in meters)? Dit is Meet dit van stoepsteen tot stoepsteen, dus inclusief een parallelle parkeerstrook"
},
"id": "width:carriageway"
},
From 1fb45ad75a0c2e8493b0008eaa27154d0d4c3787 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Tue, 19 Oct 2021 02:03:52 +0200
Subject: [PATCH 04/58] Autoremoved roaming renderings if empty
---
assets/themes/benches/benches.json | 3 +--
assets/themes/bicyclelib/bicyclelib.json | 1 -
assets/themes/bookcases/bookcases.json | 1 -
assets/themes/charging_stations/charging_stations.json | 3 +--
assets/themes/cyclofix/cyclofix.json | 3 +--
assets/themes/drinking_water/drinking_water.json | 3 +--
assets/themes/facadegardens/facadegardens.json | 3 +--
assets/themes/fritures/fritures.json | 3 +--
assets/themes/fruit_trees/fruit_trees.json | 3 +--
assets/themes/grb.json | 1 -
assets/themes/maps/maps.json | 3 +--
assets/themes/nature/nature.json | 3 +--
assets/themes/parkings/parkings.json | 3 +--
assets/themes/personal/personal.json | 3 +--
assets/themes/play_forests/play_forests.json | 3 +--
assets/themes/playgrounds/playgrounds.json | 3 +--
assets/themes/sport_pitches/sport_pitches.json | 3 +--
assets/themes/surveillance/surveillance.json | 3 +--
assets/themes/trees/trees.json | 1 -
assets/themes/uk_addresses/uk_addresses.json | 3 +--
assets/themes/waste_basket/waste_basket.json | 3 +--
scripts/lint.ts | 7 ++++++-
22 files changed, 23 insertions(+), 39 deletions(-)
diff --git a/assets/themes/benches/benches.json b/assets/themes/benches/benches.json
index d94f88597a..eef8c2dc50 100644
--- a/assets/themes/benches/benches.json
+++ b/assets/themes/benches/benches.json
@@ -58,6 +58,5 @@
"bench",
"bench_at_pt",
"picnic_table"
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/bicyclelib/bicyclelib.json b/assets/themes/bicyclelib/bicyclelib.json
index 1c3a5c000f..09bc1352b5 100644
--- a/assets/themes/bicyclelib/bicyclelib.json
+++ b/assets/themes/bicyclelib/bicyclelib.json
@@ -42,7 +42,6 @@
"startLon": 0,
"startZoom": 1,
"widenFactor": 1.5,
- "roamingRenderings": [],
"layers": [
{
"builtin": "bicycle_library",
diff --git a/assets/themes/bookcases/bookcases.json b/assets/themes/bookcases/bookcases.json
index 0862fbb379..7209162f2f 100644
--- a/assets/themes/bookcases/bookcases.json
+++ b/assets/themes/bookcases/bookcases.json
@@ -40,7 +40,6 @@
"startLon": 0,
"startZoom": 1,
"widenFactor": 1,
- "roamingRenderings": [],
"layers": [
"public_bookcase"
]
diff --git a/assets/themes/charging_stations/charging_stations.json b/assets/themes/charging_stations/charging_stations.json
index 15d55a1b3f..fdf9a0bdce 100644
--- a/assets/themes/charging_stations/charging_stations.json
+++ b/assets/themes/charging_stations/charging_stations.json
@@ -46,6 +46,5 @@
"defaultBackgroundId": "CartoDB.Voyager",
"layers": [
"charging_station"
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/cyclofix/cyclofix.json b/assets/themes/cyclofix/cyclofix.json
index 47a6267368..db626f24c7 100644
--- a/assets/themes/cyclofix/cyclofix.json
+++ b/assets/themes/cyclofix/cyclofix.json
@@ -57,6 +57,5 @@
"bike_themed_object",
"bike_cleaning",
"bike_parking"
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/drinking_water/drinking_water.json b/assets/themes/drinking_water/drinking_water.json
index 819f0cfb89..5da9ee3c71 100644
--- a/assets/themes/drinking_water/drinking_water.json
+++ b/assets/themes/drinking_water/drinking_water.json
@@ -40,6 +40,5 @@
"widenFactor": 2,
"layers": [
"drinking_water"
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/facadegardens/facadegardens.json b/assets/themes/facadegardens/facadegardens.json
index 526dd699cf..d9fc9ed62d 100644
--- a/assets/themes/facadegardens/facadegardens.json
+++ b/assets/themes/facadegardens/facadegardens.json
@@ -456,6 +456,5 @@
],
"wayHandling": 1
}
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/fritures/fritures.json b/assets/themes/fritures/fritures.json
index 235a5f65a1..e74e38bec1 100644
--- a/assets/themes/fritures/fritures.json
+++ b/assets/themes/fritures/fritures.json
@@ -54,6 +54,5 @@
"filter": null
}
}
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/fruit_trees/fruit_trees.json b/assets/themes/fruit_trees/fruit_trees.json
index 68ce79228d..9f9e84fab6 100644
--- a/assets/themes/fruit_trees/fruit_trees.json
+++ b/assets/themes/fruit_trees/fruit_trees.json
@@ -172,6 +172,5 @@
}
]
}
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/grb.json b/assets/themes/grb.json
index a0f32cdc6e..d55577e5a2 100644
--- a/assets/themes/grb.json
+++ b/assets/themes/grb.json
@@ -201,6 +201,5 @@
}
],
"hideFromOverview": true,
- "roamingRenderings": [],
"defaultBackgroundId": "AGIVFlandersGRB"
}
\ No newline at end of file
diff --git a/assets/themes/maps/maps.json b/assets/themes/maps/maps.json
index 52d757a9da..959494a063 100644
--- a/assets/themes/maps/maps.json
+++ b/assets/themes/maps/maps.json
@@ -40,6 +40,5 @@
"socialImage": "",
"layers": [
"map"
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/nature/nature.json b/assets/themes/nature/nature.json
index 0f8004e2c0..edd29baf35 100644
--- a/assets/themes/nature/nature.json
+++ b/assets/themes/nature/nature.json
@@ -26,6 +26,5 @@
"map",
"information_board",
"nature_reserve"
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/parkings/parkings.json b/assets/themes/parkings/parkings.json
index ca322052ce..affbbfc211 100644
--- a/assets/themes/parkings/parkings.json
+++ b/assets/themes/parkings/parkings.json
@@ -26,6 +26,5 @@
"socialImage": "",
"layers": [
"parking"
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/personal/personal.json b/assets/themes/personal/personal.json
index d0218d014e..4b88eefa53 100644
--- a/assets/themes/personal/personal.json
+++ b/assets/themes/personal/personal.json
@@ -46,6 +46,5 @@
"startZoom": 16,
"widenFactor": 1.2,
"overpassMaxZoom": 0,
- "layers": [],
- "roamingRenderings": []
+ "layers": []
}
\ No newline at end of file
diff --git a/assets/themes/play_forests/play_forests.json b/assets/themes/play_forests/play_forests.json
index 5c65a702a5..96aedcf5db 100644
--- a/assets/themes/play_forests/play_forests.json
+++ b/assets/themes/play_forests/play_forests.json
@@ -23,6 +23,5 @@
"socialImage": "",
"layers": [
"play_forest"
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/playgrounds/playgrounds.json b/assets/themes/playgrounds/playgrounds.json
index 2908a88b47..8c153a10a6 100644
--- a/assets/themes/playgrounds/playgrounds.json
+++ b/assets/themes/playgrounds/playgrounds.json
@@ -42,6 +42,5 @@
"socialImage": "",
"layers": [
"playground"
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/sport_pitches/sport_pitches.json b/assets/themes/sport_pitches/sport_pitches.json
index 4db24cdd69..257b835a8d 100644
--- a/assets/themes/sport_pitches/sport_pitches.json
+++ b/assets/themes/sport_pitches/sport_pitches.json
@@ -41,6 +41,5 @@
"socialImage": "",
"layers": [
"sport_pitch"
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/surveillance/surveillance.json b/assets/themes/surveillance/surveillance.json
index a61633b23b..4663b87fbd 100644
--- a/assets/themes/surveillance/surveillance.json
+++ b/assets/themes/surveillance/surveillance.json
@@ -43,6 +43,5 @@
"layers": [
"direction",
"surveillance_camera"
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/trees/trees.json b/assets/themes/trees/trees.json
index 7c2baa8ac2..35815969b1 100644
--- a/assets/themes/trees/trees.json
+++ b/assets/themes/trees/trees.json
@@ -55,6 +55,5 @@
"layers": [
"tree_node"
],
- "roamingRenderings": [],
"defaultBackgroundId": "AGIV"
}
\ No newline at end of file
diff --git a/assets/themes/uk_addresses/uk_addresses.json b/assets/themes/uk_addresses/uk_addresses.json
index 4a9ab30ab5..09e93cbe6a 100644
--- a/assets/themes/uk_addresses/uk_addresses.json
+++ b/assets/themes/uk_addresses/uk_addresses.json
@@ -274,6 +274,5 @@
"render": "0"
}
}
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/assets/themes/waste_basket/waste_basket.json b/assets/themes/waste_basket/waste_basket.json
index 6bb40ae6c2..b31d12d9a0 100644
--- a/assets/themes/waste_basket/waste_basket.json
+++ b/assets/themes/waste_basket/waste_basket.json
@@ -33,6 +33,5 @@
"minzoom": 12
}
}
- ],
- "roamingRenderings": []
+ ]
}
\ No newline at end of file
diff --git a/scripts/lint.ts b/scripts/lint.ts
index a4f3902a64..fe79b61303 100644
--- a/scripts/lint.ts
+++ b/scripts/lint.ts
@@ -46,6 +46,11 @@ for (const themeFile of themeFiles) {
// @ts-ignore
fixLayerConfig(layerConfig)
}
+
+ if(themeFile.parsed["roamingRenderings"] !== undefined && themeFile.parsed["roamingRenderings"].length == 0){
+ delete themeFile.parsed["roamingRenderings"]
+ }
+
writeFileSync(themeFile.path, JSON.stringify(themeFile.parsed, null, " "))
}
-//*/
\ No newline at end of file
+//*/
From 4153193500a5e3984cfbd30321f32bcb7379a27d Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Tue, 19 Oct 2021 02:13:50 +0200
Subject: [PATCH 05/58] Remove roamingRenderings as feature, overrideAll is
easier to use
---
assets/themes/buurtnatuur/buurtnatuur.json | 488 ++++----
assets/themes/campersite/campersite.json | 124 ++-
assets/themes/climbing/climbing.json | 1042 +++++++++---------
assets/themes/cyclestreets/cyclestreets.json | 200 ++--
scripts/generateLayerOverview.ts | 5 +-
5 files changed, 934 insertions(+), 925 deletions(-)
diff --git a/assets/themes/buurtnatuur/buurtnatuur.json b/assets/themes/buurtnatuur/buurtnatuur.json
index 9c4f2a1894..03d04cffe9 100644
--- a/assets/themes/buurtnatuur/buurtnatuur.json
+++ b/assets/themes/buurtnatuur/buurtnatuur.json
@@ -343,263 +343,265 @@
},
"viewpoint"
],
- "roamingRenderings": [
- {
- "#": "Access tag",
- "condition": {
- "and": [
- "tourism!~viewpoint"
+ "overrideAll": {
+ "tagRenderings+": [
+ {
+ "id": "Access tag",
+ "condition": {
+ "and": [
+ "tourism!~viewpoint"
+ ]
+ },
+ "render": {
+ "nl": "De toegankelijkheid van dit gebied is: {access:description}"
+ },
+ "question": {
+ "nl": "Is dit gebied toegankelijk?"
+ },
+ "freeform": {
+ "key": "access:description",
+ "addExtraTags": [
+ "access="
+ ]
+ },
+ "mappings": [
+ {
+ "if": {
+ "and": [
+ "access:description=",
+ "access=",
+ "leisure=park"
+ ]
+ },
+ "then": {
+ "nl": "Dit gebied is vrij toegankelijk"
+ },
+ "hideInAnswer": true
+ },
+ {
+ "if": {
+ "and": [
+ "access:description=",
+ "access=yes",
+ "fee="
+ ]
+ },
+ "then": {
+ "nl": "Vrij toegankelijk"
+ }
+ },
+ {
+ "if": {
+ "and": [
+ "access:description=",
+ "access=no",
+ "fee="
+ ]
+ },
+ "then": {
+ "nl": "Niet toegankelijk"
+ }
+ },
+ {
+ "if": {
+ "and": [
+ "access:description=",
+ "access=private",
+ "fee="
+ ]
+ },
+ "then": {
+ "nl": "Niet toegankelijk, want privégebied"
+ }
+ },
+ {
+ "if": {
+ "and": [
+ "access:description=",
+ "access=permissive",
+ "fee="
+ ]
+ },
+ "then": {
+ "nl": "Toegankelijk, ondanks dat het privegebied is"
+ }
+ },
+ {
+ "if": {
+ "and": [
+ "access:description=",
+ "access=guided",
+ "fee="
+ ]
+ },
+ "then": {
+ "nl": "Enkel toegankelijk met een gids of tijdens een activiteit"
+ }
+ },
+ {
+ "if": {
+ "and": [
+ "access:description=",
+ "access=yes",
+ "fee=yes"
+ ]
+ },
+ "then": {
+ "nl": "Toegankelijk mits betaling"
+ }
+ }
]
},
- "render": {
- "nl": "De toegankelijkheid van dit gebied is: {access:description}"
- },
- "question": {
- "nl": "Is dit gebied toegankelijk?"
- },
- "freeform": {
- "key": "access:description",
- "addExtraTags": [
- "access="
- ]
- },
- "mappings": [
- {
- "if": {
- "and": [
- "access:description=",
- "access=",
- "leisure=park"
- ]
- },
- "then": {
- "nl": "Dit gebied is vrij toegankelijk"
- },
- "hideInAnswer": true
+ {
+ "id": "Operator tag",
+ "render": {
+ "nl": "Beheer door {operator}"
},
- {
- "if": {
- "and": [
- "access:description=",
- "access=yes",
- "fee="
- ]
- },
- "then": {
- "nl": "Vrij toegankelijk"
- }
+ "question": {
+ "nl": "Wie beheert dit gebied?"
},
- {
- "if": {
- "and": [
- "access:description=",
- "access=no",
- "fee="
- ]
- },
- "then": {
- "nl": "Niet toegankelijk"
- }
+ "freeform": {
+ "key": "operator"
},
- {
- "if": {
- "and": [
- "access:description=",
- "access=private",
- "fee="
- ]
+ "mappings": [
+ {
+ "if": {
+ "and": [
+ "leisure=park",
+ "operator="
+ ]
+ },
+ "then": "Beheer door de gemeente",
+ "hideInAnswer": true
},
- "then": {
- "nl": "Niet toegankelijk, want privégebied"
- }
- },
- {
- "if": {
- "and": [
- "access:description=",
- "access=permissive",
- "fee="
- ]
+ {
+ "if": {
+ "and": [
+ "operator=Natuurpunt"
+ ]
+ },
+ "then": {
+ "nl": "Dit gebied wordt beheerd door Natuurpunt"
+ }
},
- "then": {
- "nl": "Toegankelijk, ondanks dat het privegebied is"
- }
- },
- {
- "if": {
- "and": [
- "access:description=",
- "access=guided",
- "fee="
- ]
+ {
+ "if": {
+ "and": [
+ "operator~(n|N)atuurpunt.*"
+ ]
+ },
+ "then": {
+ "nl": "Dit gebied wordt beheerd door {operator}"
+ },
+ "hideInAnswer": true
},
- "then": {
- "nl": "Enkel toegankelijk met een gids of tijdens een activiteit"
- }
- },
- {
- "if": {
- "and": [
- "access:description=",
- "access=yes",
- "fee=yes"
- ]
+ {
+ "if": {
+ "and": [
+ "operator=Agentschap Natuur en Bos"
+ ]
+ },
+ "then": {
+ "nl": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos"
+ }
},
- "then": {
- "nl": "Toegankelijk mits betaling"
+ {
+ "if": {
+ "and": [
+ "operator:type=private"
+ ]
+ },
+ "then": "Beheer door een privépersoon",
+ "hideInAnswer": true
+ },
+ {
+ "if": {
+ "and": [
+ "operator:type=private",
+ "operator="
+ ]
+ },
+ "then": "Beheer door een privépersoon"
}
+ ],
+ "condition": {
+ "and": [
+ "leisure!~park",
+ "tourism!~viewpoint"
+ ]
}
- ]
- },
- {
- "#": "Operator tag",
- "render": {
- "nl": "Beheer door {operator}"
},
- "question": {
- "nl": "Wie beheert dit gebied?"
- },
- "freeform": {
- "key": "operator"
- },
- "mappings": [
- {
- "if": {
- "and": [
- "leisure=park",
- "operator="
- ]
- },
- "then": "Beheer door de gemeente",
- "hideInAnswer": true
+ {
+ "id": "Non-editable description {description}",
+ "render": {
+ "nl": "Extra info: {description}"
},
- {
- "if": {
- "and": [
- "operator=Natuurpunt"
- ]
- },
- "then": {
- "nl": "Dit gebied wordt beheerd door Natuurpunt"
- }
- },
- {
- "if": {
- "and": [
- "operator~(n|N)atuurpunt.*"
- ]
- },
- "then": {
- "nl": "Dit gebied wordt beheerd door {operator}"
- },
- "hideInAnswer": true
- },
- {
- "if": {
- "and": [
- "operator=Agentschap Natuur en Bos"
- ]
- },
- "then": {
- "nl": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos"
- }
- },
- {
- "if": {
- "and": [
- "operator:type=private"
- ]
- },
- "then": "Beheer door een privépersoon",
- "hideInAnswer": true
- },
- {
- "if": {
- "and": [
- "operator:type=private",
- "operator="
- ]
- },
- "then": "Beheer door een privépersoon"
+ "freeform": {
+ "key": "description"
}
- ],
- "condition": {
- "and": [
- "leisure!~park",
- "tourism!~viewpoint"
- ]
- }
- },
- {
- "#": "Non-editable description {description}",
- "render": {
- "nl": "Extra info: {description}"
},
- "freeform": {
- "key": "description"
- }
- },
- {
- "#": "Editable description {description:0}",
- "question": "Is er extra info die je kwijt wil? De naam van het gebied wordt in de volgende vraag gesteld",
- "render": {
- "nl": "Extra info via buurtnatuur.be: {description:0}"
- },
- "freeform": {
- "key": "description:0"
- }
- },
- {
- "#": "Name:nl-tag",
- "render": {
- "nl": "Dit gebied heet {name:nl}"
- },
- "question": {
- "nl": "Wat is de Nederlandstalige naam van dit gebied?"
- },
- "freeform": {
- "key": "name:nl"
- },
- "condition": {
- "and": [
- "name:nl~*",
- "viewpoint!~tourism"
- ]
- }
- },
- {
- "#": "Name tag",
- "render": {
- "nl": "Dit gebied heet {name}"
- },
- "question": {
- "nl": "Wat is de naam van dit gebied?"
- },
- "freeform": {
- "key": "name",
- "addExtraTags": [
- "noname="
- ]
- },
- "condition": {
- "and": [
- "name:nl=",
- "tourism!~viewpoint"
- ]
- },
- "mappings": [
- {
- "if": {
- "and": [
- "noname=yes",
- "name="
- ]
- },
- "then": {
- "nl": "Dit gebied heeft geen naam"
- }
+ {
+ "id": "Editable description {description:0}",
+ "question": "Is er extra info die je kwijt wil? De naam van het gebied wordt in de volgende vraag gesteld",
+ "render": {
+ "nl": "Extra info via buurtnatuur.be: {description:0}"
+ },
+ "freeform": {
+ "key": "description:0"
}
- ]
- }
- ]
+ },
+ {
+ "id": "Name:nl-tag",
+ "render": {
+ "nl": "Dit gebied heet {name:nl}"
+ },
+ "question": {
+ "nl": "Wat is de Nederlandstalige naam van dit gebied?"
+ },
+ "freeform": {
+ "key": "name:nl"
+ },
+ "condition": {
+ "and": [
+ "name:nl~*",
+ "viewpoint!~tourism"
+ ]
+ }
+ },
+ {
+ "id": "Name tag",
+ "render": {
+ "nl": "Dit gebied heet {name}"
+ },
+ "question": {
+ "nl": "Wat is de naam van dit gebied?"
+ },
+ "freeform": {
+ "key": "name",
+ "addExtraTags": [
+ "noname="
+ ]
+ },
+ "condition": {
+ "and": [
+ "name:nl=",
+ "tourism!~viewpoint"
+ ]
+ },
+ "mappings": [
+ {
+ "if": {
+ "and": [
+ "noname=yes",
+ "name="
+ ]
+ },
+ "then": {
+ "nl": "Dit gebied heeft geen naam"
+ }
+ }
+ ]
+ }
+ ]
+ }
}
\ No newline at end of file
diff --git a/assets/themes/campersite/campersite.json b/assets/themes/campersite/campersite.json
index a255aed854..670e45299e 100644
--- a/assets/themes/campersite/campersite.json
+++ b/assets/themes/campersite/campersite.json
@@ -1078,66 +1078,70 @@
]
}
],
- "roamingRenderings": [
- {
- "render": {
- "en": "This place is operated by {operator}",
- "ja": "この場所は{operator}によって運営されます",
- "it": "Questo luogo è gestito da {operator}",
- "fr": "Ce site est exploité par {operator}",
- "de": "Dieser Ort wird betrieben von {operator}"
- },
- "question": {
- "en": "Who operates this place?",
- "ja": "この店は誰が経営しているんですか?",
- "it": "Chi gestisce questo luogo?",
- "fr": "Qui est l’exploitant du site ?",
- "de": "Wer betreibt diesen Ort?"
- },
- "freeform": {
- "key": "operator"
- }
- },
- {
- "question": {
- "en": "Does this place have a power supply?",
- "ja": "この場所に電源はありますか?",
- "it": "Questo luogo fornisce corrente elettrica?",
- "fr": "Ce site a-t’il une source d’électricité ?",
- "de": "Hat dieser Ort eine Stromversorgung?"
- },
- "mappings": [
- {
- "if": {
- "and": [
- "power_supply=yes"
- ]
- },
- "then": {
- "en": "This place has a power supply",
- "id": "Tempat ini memiliki catu daya",
- "ja": "この場所には電源があります",
- "it": "Questo luogo fornisce corrente elettrica",
- "fr": "Ce site a une source d’alimentation",
- "de": "Dieser Ort hat eine Stromversorgung"
- }
+ "overrideAll": {
+ "tagRenderings+": [
+ {
+ "id": "operator",
+ "render": {
+ "en": "This place is operated by {operator}",
+ "ja": "この場所は{operator}によって運営されます",
+ "it": "Questo luogo è gestito da {operator}",
+ "fr": "Ce site est exploité par {operator}",
+ "de": "Dieser Ort wird betrieben von {operator}"
},
- {
- "if": {
- "and": [
- "power_supply=no"
- ]
- },
- "then": {
- "en": "This place does not have power supply",
- "id": "Tempat ini tidak memiliki sumber listrik",
- "ja": "この場所には電源がありません",
- "it": "Questo luogo non fornisce corrente elettrica",
- "fr": "Ce site n’a pas de source d’alimentation",
- "de": "Dieser Ort hat keine Stromversorgung"
- }
+ "question": {
+ "en": "Who operates this place?",
+ "ja": "この店は誰が経営しているんですか?",
+ "it": "Chi gestisce questo luogo?",
+ "fr": "Qui est l’exploitant du site ?",
+ "de": "Wer betreibt diesen Ort?"
+ },
+ "freeform": {
+ "key": "operator"
}
- ]
- }
- ]
+ },
+ {
+ "id": "power_supply",
+ "question": {
+ "en": "Does this place have a power supply?",
+ "ja": "この場所に電源はありますか?",
+ "it": "Questo luogo fornisce corrente elettrica?",
+ "fr": "Ce site a-t’il une source d’électricité ?",
+ "de": "Hat dieser Ort eine Stromversorgung?"
+ },
+ "mappings": [
+ {
+ "if": {
+ "and": [
+ "power_supply=yes"
+ ]
+ },
+ "then": {
+ "en": "This place has a power supply",
+ "id": "Tempat ini memiliki catu daya",
+ "ja": "この場所には電源があります",
+ "it": "Questo luogo fornisce corrente elettrica",
+ "fr": "Ce site a une source d’alimentation",
+ "de": "Dieser Ort hat eine Stromversorgung"
+ }
+ },
+ {
+ "if": {
+ "and": [
+ "power_supply=no"
+ ]
+ },
+ "then": {
+ "en": "This place does not have power supply",
+ "id": "Tempat ini tidak memiliki sumber listrik",
+ "ja": "この場所には電源がありません",
+ "it": "Questo luogo non fornisce corrente elettrica",
+ "fr": "Ce site n’a pas de source d’alimentation",
+ "de": "Dieser Ort hat keine Stromversorgung"
+ }
+ }
+ ]
+ }
+ ]
+ }
}
\ No newline at end of file
diff --git a/assets/themes/climbing/climbing.json b/assets/themes/climbing/climbing.json
index b5720d4ae0..bfd84bba85 100644
--- a/assets/themes/climbing/climbing.json
+++ b/assets/themes/climbing/climbing.json
@@ -933,527 +933,6 @@
"wayHandling": 0
}
],
- "roamingRenderings": [
- {
- "#": "Website",
- "question": {
- "en": "Is there a (unofficial) website with more informations (e.g. topos)?",
- "de": "Gibt es eine (inoffizielle) Website mit mehr Informationen (z.B. Topos)?",
- "ja": "もっと情報のある(非公式の)ウェブサイトはありますか(例えば、topos)?",
- "nl": "Is er een (onofficiële) website met meer informatie (b.v. met topos)?",
- "ru": "Есть ли (неофициальный) веб-сайт с более подробной информацией (напр., topos)?",
- "fr": "Existe-t’il un site avec plus d’informations (ex : topographie) ?"
- },
- "condition": {
- "and": [
- "leisure!~sports_centre",
- "sport=climbing",
- "office=",
- "club="
- ]
- },
- "render": "{url}",
- "freeform": {
- "key": "url",
- "type": "url"
- }
- },
- {
- "#": "Access from containing feature",
- "mappings": [
- {
- "if": "_embedding_feature:access=yes",
- "then": {
- "en": "The containing feature states that this is publicly accessible {_embedding_feature:access:description}",
- "nl": "Een omvattend element geeft aan dat dit publiek toegangkelijk is {_embedding_feature:access:description}",
- "fr": "L’élément englobant indique un accès libre {_embedding_feature:access:description}"
- }
- },
- {
- "if": "_embedding_feature:access=permit",
- "then": {
- "en": "The containing feature states that a permit is needed to access {_embedding_feature:access:description}",
- "nl": "Een omvattend element geeft aan dat een toelating nodig is om hier te klimmen {_embedding_feature:access:description}",
- "fr": "L’élément englobant indique qu’ une autorisation d’accès est nécessaire {_embedding_feature:access:description}"
- }
- },
- {
- "if": "_embedding_feature:access=customers",
- "then": {
- "en": "The containing feature states that this is only accessible to customers {_embedding_feature:access:description}",
- "fr": "L’élément englobant indique que l’accès est réservés aux clients {_embedding_feature:access:description}"
- }
- },
- {
- "if": "_embedding_feature:access=members",
- "then": {
- "en": "The containing feature states that this is only accessible to club members {_embedding_feature:access:description}",
- "fr": "L’élément englobant indique que l’accès est réservé aux membres {_embedding_feature:access:description}"
- }
- },
- {
- "if": "_embedding_feature:access=no",
- "then": "Not accessible as stated by the containing feature"
- }
- ],
- "condition": "_embedding_feature:access~*"
- },
- {
- "#": "Access",
- "question": {
- "en": "Who can access here?",
- "fr": "Qui peut y accéder ?",
- "de": "Wer hat hier Zugang?"
- },
- "mappings": [
- {
- "if": "access=yes",
- "then": {
- "en": "Publicly accessible to anyone",
- "fr": "Libre d’accès",
- "de": "Öffentlich zugänglich für jedermann"
- }
- },
- {
- "if": "access=permit",
- "then": {
- "en": "You need a permit to access here",
- "fr": "Une autorisation est nécessaire",
- "de": "Zugang nur mit Genehmigung"
- }
- },
- {
- "if": "access=customers",
- "then": {
- "en": "Only custumers",
- "fr": "Réservé aux clients",
- "de": "Nur für Kunden"
- }
- },
- {
- "if": "access=members",
- "then": {
- "en": "Only club members",
- "ru": "Только членам клуба",
- "fr": "Réservé aux membres",
- "de": "Nur für Vereinsmitglieder"
- }
- },
- {
- "if": "access=no",
- "then": "Not accessible"
- }
- ],
- "condition": {
- "and": [
- "climbing!=no",
- "office=",
- "club=",
- {
- "or": [
- "sport=climbing",
- "climbing:sport=yes"
- ]
- },
- {
- "or": [
- "access~*",
- "_embedding_feature:access="
- ]
- }
- ]
- }
- },
- {
- "#": "Access description (without _embedding_feature:access:description)",
- "render": "{access:description}",
- "freeform": {
- "key": "access:description"
- }
- },
- {
- "#": "Avg length?",
- "render": {
- "de": "Die Routen sind durchschnittlich {canonical(climbing:length)} lang",
- "en": "The routes are {canonical(climbing:length)} long on average",
- "nl": "De klimroutes zijn gemiddeld {canonical(climbing:length)} lang",
- "ja": "ルートの長さは平均で{canonical(climbing:length)}です",
- "fr": "Les voies font {canonical(climbing:length)} de long en moyenne"
- },
- "condition": {
- "and": [
- "climbing!~route",
- "office=",
- "club=",
- "climbing:toprope!=no",
- {
- "or": [
- "sport=climbing",
- "climbing:sport=yes",
- "climbing=traditional",
- "climbing=gym"
- ]
- }
- ]
- },
- "question": {
- "de": "Wie lang sind die Routen (durchschnittlich) in Metern?",
- "en": "What is the (average) length of the routes in meters?",
- "nl": "Wat is de (gemiddelde) lengte van de klimroutes, in meter?",
- "ja": "ルートの(平均)長さはメートル単位でいくつですか?",
- "fr": "Quelle est la longueur moyenne des voies en mètres ?"
- },
- "freeform": {
- "key": "climbing:length",
- "type": "pnat"
- }
- },
- {
- "#": "Difficulty-min",
- "question": {
- "de": "Welche Schwierigkeit hat hier die leichteste Route (französisch/belgisches System)?",
- "en": "What is the level of the easiest route here, accoring to the french classification system?",
- "nl": "Wat is het niveau van de makkelijkste route, volgens het Franse classificatiesysteem?",
- "ja": "ここで一番簡単なルートのレベルは、フランスのランク評価システムで何ですか?",
- "fr": "Quel est le niveau de la voie la plus simple selon la classification franco-belge ?"
- },
- "render": {
- "de": "Die leichteste Route hat hier die Schwierigkeit {climbing:grade:french:min} (französisch/belgisches System)",
- "en": "The minimal difficulty is {climbing:grade:french:min} according to the french/belgian system",
- "nl": "De minimale klimmoeilijkheid is {climbing:grade:french:min} volgens het Franse/Belgische systeem",
- "ja": "フランス/ベルギーのランク評価システムでは、最小の難易度は{climbing:grade:french:min}です",
- "fr": "La difficulté minimale est {climbing:grade:french:min} selon la classification franco-belge"
- },
- "freeform": {
- "key": "climbing:grade:french:min"
- },
- "condition": {
- "and": [
- "climbing!~route",
- "office=",
- "club=",
- {
- "or": [
- "climbing:sport=yes",
- "sport=climbing"
- ]
- }
- ]
- }
- },
- {
- "#": "Difficulty-max",
- "question": {
- "de": "Welche Schwierigkeit hat hier die schwerste Route (französisch/belgisches System)?",
- "en": "What is the level of the most difficult route here, accoring to the french classification system?",
- "nl": "Wat is het niveau van de moeilijkste route, volgens het Franse classificatiesysteem?",
- "ja": "フランスのランク評価によると、ここで一番難しいルートのレベルはどれくらいですか?",
- "fr": "Quel est le niveau de la voie la plus difficile selon la classification franco-belge ?"
- },
- "render": {
- "de": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:min} (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}です",
- "fr": "La difficulté maximale est {climbing:grade:french:max} selon la classification franco-belge"
- },
- "freeform": {
- "key": "climbing:grade:french:max"
- },
- "condition": {
- "and": [
- "climbing!~route",
- "office=",
- "club=",
- {
- "or": [
- "climbing:sport=yes",
- "sport=climbing"
- ]
- }
- ]
- }
- },
- {
- "#": "Boldering?",
- "question": {
- "de": "Kann hier gebouldert werden?",
- "en": "Is bouldering possible here?",
- "nl": "Is het mogelijk om hier te bolderen?",
- "ja": "ここでボルダリングはできますか?",
- "nb_NO": "Er buldring mulig her?",
- "fr": "L’escalade de bloc est-elle possible ici ?"
- },
- "mappings": [
- {
- "if": "climbing:boulder=yes",
- "then": {
- "de": "Hier kann gebouldert werden",
- "en": "Bouldering is possible here",
- "nl": "Bolderen kan hier",
- "ja": "ボルダリングはここで可能です",
- "nb_NO": "Buldring er mulig her",
- "fr": "L’escalade de bloc est possible"
- }
- },
- {
- "if": "climbing:boulder=no",
- "then": {
- "de": "Hier kann nicht gebouldert werden",
- "en": "Bouldering is not possible here",
- "nl": "Bolderen kan hier niet",
- "ja": "ここではボルダリングはできません",
- "nb_NO": "Buldring er ikke mulig her",
- "fr": "L’escalade de bloc n’est pas possible"
- }
- },
- {
- "if": "climbing:boulder=limited",
- "then": {
- "de": "Bouldern ist hier nur an wenigen Routen möglich",
- "en": "Bouldering is possible, allthough there are only a few routes",
- "nl": "Bolderen kan hier, maar er zijn niet zoveel routes",
- "ja": "ボルダリングは可能ですが、少しのルートしかありません",
- "fr": "L’escalade de bloc est possible sur des voies précises"
- }
- },
- {
- "if": "climbing:boulder~*",
- "then": {
- "de": "Hier gibt es {climbing:boulder} Boulder-Routen",
- "en": "There are {climbing:boulder} boulder routes",
- "nl": "Er zijn hier {climbing:boulder} bolderroutes",
- "ja": "{climbing:boulder} ボルダールートがある",
- "fr": "Il y a {climbing:boulder} voies d’escalade de bloc"
- },
- "hideInAnswer": true
- }
- ],
- "condition": {
- "and": [
- {
- "or": [
- "climbing:sport=yes",
- "sport=climbing"
- ]
- },
- "office=",
- "club="
- ]
- }
- },
- {
- "#": "Toproping?",
- "question": {
- "de": "Ist Toprope-Klettern hier möglich?",
- "en": "Is toprope climbing possible here?",
- "nl": "Is het mogelijk om hier te toprope-klimmen?",
- "ja": "ここでtoprope登坂はできますか?",
- "fr": "Est-il possible d’escalader à la moulinette ?"
- },
- "mappings": [
- {
- "if": "climbing:toprope=yes",
- "then": {
- "de": "Toprope-Klettern ist hier möglich",
- "en": "Toprope climbing is possible here",
- "nl": "Toprope-klimmen kan hier",
- "ja": "ここでToprope登坂ができます",
- "fr": "L’escalade à la moulinette est possible"
- }
- },
- {
- "if": "climbing:toprope=no",
- "then": {
- "de": "Toprope-Climbing ist hier nicht möglich",
- "en": "Toprope climbing is not possible here",
- "nl": "Toprope-klimmen kan hier niet",
- "ja": "ここではToprope登坂はできません",
- "fr": "L’escalade à la moulinette n’est pas possible"
- }
- },
- {
- "if": "climbing:toprope~*",
- "then": {
- "de": "Hier gibt es {climbing:toprope} Toprope-Routen",
- "en": "There are {climbing:toprope} toprope routes",
- "nl": "Er zijn hier {climbing:toprope} toprope routes",
- "ja": "{climbing:toprope} 登坂ルートがある",
- "fr": "{climbing:toprope} voies sont équipées de moulinettes"
- },
- "hideInAnswer": true
- }
- ],
- "condition": {
- "and": [
- {
- "or": [
- "climbing:sport=yes",
- "sport=climbing"
- ]
- },
- "office=",
- "club="
- ]
- }
- },
- {
- "#": "Sportclimbing?",
- "question": {
- "de": "Ist hier Sportklettern möglich (feste Ankerpunkte)?",
- "en": "Is sport climbing possible here on fixed anchors?",
- "nl": "Is het mogelijk om hier te sportklimmen/voorklimmen op reeds aangebrachte haken?",
- "ja": "ここでは固定アンカー式のスポーツクライミングはできますか?"
- },
- "mappings": [
- {
- "if": "climbing:sport=yes",
- "then": {
- "de": "Sportklettern ist hier möglich",
- "en": "Sport climbing is possible here",
- "nl": "Sportklimmen/voorklimmen kan hier",
- "ru": "Здесь можно заняться спортивным скалолазанием",
- "ja": "ここでスポーツクライミングができます"
- }
- },
- {
- "if": "climbing:sport=no",
- "then": {
- "de": "Sportklettern ist hier nicht möglich",
- "en": "Sport climbing is not possible here",
- "nl": "Sportklimmen/voorklimmen kan hier niet",
- "ru": "Спортивное скалолазание здесь невозможно",
- "ja": "ここではスポーツクライミングはできません"
- }
- },
- {
- "if": "climbing:sport~*",
- "then": {
- "de": "Hier gibt es {climbing:sport} Sportkletter-Routen",
- "en": "There are {climbing:sport} sport climbing routes",
- "nl": "Er zijn hier {climbing:sport} sportklimroutes/voorklimroutes",
- "ja": "スポーツクライミングの {climbing:sport} ルートがある"
- },
- "hideInAnswer": true
- }
- ],
- "condition": {
- "and": [
- {
- "or": [
- "climbing:sport=yes",
- "sport=climbing"
- ]
- },
- "office=",
- "club="
- ]
- }
- },
- {
- "#": "Traditional climbing?",
- "question": {
- "de": "Ist hier traditionelles Klettern möglich (eigene Sicherung z.B. mit Klemmkleilen)?",
- "en": "Is traditional climbing possible here (using own gear e.g. chocks)?",
- "nl": "Is het mogelijk om hier traditioneel te klimmen? (Dit is klimmen met klemblokjes en friends)",
- "ja": "伝統的な登山はここで可能ですか(例えば、チョックのような独自のギアを使用して)?"
- },
- "mappings": [
- {
- "if": "climbing:traditional=yes",
- "then": {
- "de": "Traditionelles Klettern ist hier möglich",
- "en": "Traditional climbing is possible here",
- "nl": "Traditioneel klimmen kan hier",
- "ja": "ここでは伝統的な登山が可能です"
- }
- },
- {
- "if": "climbing:traditional=no",
- "then": {
- "de": "Traditionelles Klettern ist hier nicht möglich",
- "en": "Traditional climbing is not possible here",
- "nl": "Traditioneel klimmen kan hier niet",
- "ja": "伝統的な登山はここではできない"
- }
- },
- {
- "if": "climbing:traditional~*",
- "then": {
- "de": "Hier gibt es {climbing:traditional} Routen für traditionelles Klettern",
- "en": "There are {climbing:traditional} traditional climbing routes",
- "nl": "Er zijn hier {climbing:traditional} traditionele klimroutes",
- "ja": "{climbing:traditional} の伝統的な登山ルートがある"
- },
- "hideInAnswer": true
- }
- ],
- "condition": {
- "and": [
- {
- "or": [
- "climbing:sport=yes",
- "sport=climbing"
- ]
- },
- "office=",
- "club="
- ]
- }
- },
- {
- "#": "Speed climbing?",
- "question": {
- "de": "Gibt es hier eine Speedkletter-Wand?",
- "en": "Is there a speed climbing wall?",
- "nl": "Is er een snelklimmuur (speed climbing)?",
- "ja": "スピードクライミングウォールはありますか?"
- },
- "condition": {
- "and": [
- "leisure=sports_centre",
- {
- "or": [
- "climbing:sport=yes",
- "sport=climbing"
- ]
- },
- "office=",
- "club="
- ]
- },
- "mappings": [
- {
- "if": "climbing:speed=yes",
- "then": {
- "de": "Hier gibt es eine Speedkletter-Wand",
- "en": "There is a speed climbing wall",
- "nl": "Er is een snelklimmuur voor speed climbing",
- "ja": "スピードクライミングウォールがある"
- }
- },
- {
- "if": "climbing:speed=no",
- "then": {
- "de": "Hier gibt es keine Speedkletter-Wand",
- "en": "There is no speed climbing wall",
- "nl": "Er is geen snelklimmuur voor speed climbing",
- "ja": "スピードクライミングウォールがない"
- }
- },
- {
- "if": "climbing:speed~*",
- "then": {
- "de": "Hier gibt es {climbing:speed} Speedkletter-Routen",
- "en": "There are {climbing:speed} speed climbing walls",
- "nl": "Er zijn hier {climbing:speed} snelklimmuren",
- "ja": "{climbing:speed} のスピードクライミングウォールがある"
- },
- "hideInAnswer": true
- }
- ]
- }
- ],
"overrideAll": {
"titleIcons": [
{
@@ -1524,6 +1003,527 @@
}
]
}
+ ],
+ "tagRenderings+": [
+ {
+ "id": "Website",
+ "question": {
+ "en": "Is there a (unofficial) website with more informations (e.g. topos)?",
+ "de": "Gibt es eine (inoffizielle) Website mit mehr Informationen (z.B. Topos)?",
+ "ja": "もっと情報のある(非公式の)ウェブサイトはありますか(例えば、topos)?",
+ "nl": "Is er een (onofficiële) website met meer informatie (b.v. met topos)?",
+ "ru": "Есть ли (неофициальный) веб-сайт с более подробной информацией (напр., topos)?",
+ "fr": "Existe-t’il un site avec plus d’informations (ex : topographie) ?"
+ },
+ "condition": {
+ "and": [
+ "leisure!~sports_centre",
+ "sport=climbing",
+ "office=",
+ "club="
+ ]
+ },
+ "render": "{url}",
+ "freeform": {
+ "key": "url",
+ "type": "url"
+ }
+ },
+ {
+ "id": "Access from containing feature",
+ "mappings": [
+ {
+ "if": "_embedding_feature:access=yes",
+ "then": {
+ "en": "The containing feature states that this is publicly accessible {_embedding_feature:access:description}",
+ "nl": "Een omvattend element geeft aan dat dit publiek toegangkelijk is {_embedding_feature:access:description}",
+ "fr": "L’élément englobant indique un accès libre {_embedding_feature:access:description}"
+ }
+ },
+ {
+ "if": "_embedding_feature:access=permit",
+ "then": {
+ "en": "The containing feature states that a permit is needed to access {_embedding_feature:access:description}",
+ "nl": "Een omvattend element geeft aan dat een toelating nodig is om hier te klimmen {_embedding_feature:access:description}",
+ "fr": "L’élément englobant indique qu’ une autorisation d’accès est nécessaire {_embedding_feature:access:description}"
+ }
+ },
+ {
+ "if": "_embedding_feature:access=customers",
+ "then": {
+ "en": "The containing feature states that this is only accessible to customers {_embedding_feature:access:description}",
+ "fr": "L’élément englobant indique que l’accès est réservés aux clients {_embedding_feature:access:description}"
+ }
+ },
+ {
+ "if": "_embedding_feature:access=members",
+ "then": {
+ "en": "The containing feature states that this is only accessible to club members {_embedding_feature:access:description}",
+ "fr": "L’élément englobant indique que l’accès est réservé aux membres {_embedding_feature:access:description}"
+ }
+ },
+ {
+ "if": "_embedding_feature:access=no",
+ "then": "Not accessible as stated by the containing feature"
+ }
+ ],
+ "condition": "_embedding_feature:access~*"
+ },
+ {
+ "id": "Access",
+ "question": {
+ "en": "Who can access here?",
+ "fr": "Qui peut y accéder ?",
+ "de": "Wer hat hier Zugang?"
+ },
+ "mappings": [
+ {
+ "if": "access=yes",
+ "then": {
+ "en": "Publicly accessible to anyone",
+ "fr": "Libre d’accès",
+ "de": "Öffentlich zugänglich für jedermann"
+ }
+ },
+ {
+ "if": "access=permit",
+ "then": {
+ "en": "You need a permit to access here",
+ "fr": "Une autorisation est nécessaire",
+ "de": "Zugang nur mit Genehmigung"
+ }
+ },
+ {
+ "if": "access=customers",
+ "then": {
+ "en": "Only custumers",
+ "fr": "Réservé aux clients",
+ "de": "Nur für Kunden"
+ }
+ },
+ {
+ "if": "access=members",
+ "then": {
+ "en": "Only club members",
+ "ru": "Только членам клуба",
+ "fr": "Réservé aux membres",
+ "de": "Nur für Vereinsmitglieder"
+ }
+ },
+ {
+ "if": "access=no",
+ "then": "Not accessible"
+ }
+ ],
+ "condition": {
+ "and": [
+ "climbing!=no",
+ "office=",
+ "club=",
+ {
+ "or": [
+ "sport=climbing",
+ "climbing:sport=yes"
+ ]
+ },
+ {
+ "or": [
+ "access~*",
+ "_embedding_feature:access="
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "id": "Access description (without _embedding_feature:access:description)",
+ "render": "{access:description}",
+ "freeform": {
+ "key": "access:description"
+ }
+ },
+ {
+ "id": "Avg length?",
+ "render": {
+ "de": "Die Routen sind durchschnittlich {canonical(climbing:length)} lang",
+ "en": "The routes are {canonical(climbing:length)} long on average",
+ "nl": "De klimroutes zijn gemiddeld {canonical(climbing:length)} lang",
+ "ja": "ルートの長さは平均で{canonical(climbing:length)}です",
+ "fr": "Les voies font {canonical(climbing:length)} de long en moyenne"
+ },
+ "condition": {
+ "and": [
+ "climbing!~route",
+ "office=",
+ "club=",
+ "climbing:toprope!=no",
+ {
+ "or": [
+ "sport=climbing",
+ "climbing:sport=yes",
+ "climbing=traditional",
+ "climbing=gym"
+ ]
+ }
+ ]
+ },
+ "question": {
+ "de": "Wie lang sind die Routen (durchschnittlich) in Metern?",
+ "en": "What is the (average) length of the routes in meters?",
+ "nl": "Wat is de (gemiddelde) lengte van de klimroutes, in meter?",
+ "ja": "ルートの(平均)長さはメートル単位でいくつですか?",
+ "fr": "Quelle est la longueur moyenne des voies en mètres ?"
+ },
+ "freeform": {
+ "key": "climbing:length",
+ "type": "pnat"
+ }
+ },
+ {
+ "id": "Difficulty-min",
+ "question": {
+ "de": "Welche Schwierigkeit hat hier die leichteste Route (französisch/belgisches System)?",
+ "en": "What is the level of the easiest route here, accoring to the french classification system?",
+ "nl": "Wat is het niveau van de makkelijkste route, volgens het Franse classificatiesysteem?",
+ "ja": "ここで一番簡単なルートのレベルは、フランスのランク評価システムで何ですか?",
+ "fr": "Quel est le niveau de la voie la plus simple selon la classification franco-belge ?"
+ },
+ "render": {
+ "de": "Die leichteste Route hat hier die Schwierigkeit {climbing:grade:french:min} (französisch/belgisches System)",
+ "en": "The minimal difficulty is {climbing:grade:french:min} according to the french/belgian system",
+ "nl": "De minimale klimmoeilijkheid is {climbing:grade:french:min} volgens het Franse/Belgische systeem",
+ "ja": "フランス/ベルギーのランク評価システムでは、最小の難易度は{climbing:grade:french:min}です",
+ "fr": "La difficulté minimale est {climbing:grade:french:min} selon la classification franco-belge"
+ },
+ "freeform": {
+ "key": "climbing:grade:french:min"
+ },
+ "condition": {
+ "and": [
+ "climbing!~route",
+ "office=",
+ "club=",
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "id": "Difficulty-max",
+ "question": {
+ "de": "Welche Schwierigkeit hat hier die schwerste Route (französisch/belgisches System)?",
+ "en": "What is the level of the most difficult route here, accoring to the french classification system?",
+ "nl": "Wat is het niveau van de moeilijkste route, volgens het Franse classificatiesysteem?",
+ "ja": "フランスのランク評価によると、ここで一番難しいルートのレベルはどれくらいですか?",
+ "fr": "Quel est le niveau de la voie la plus difficile selon la classification franco-belge ?"
+ },
+ "render": {
+ "de": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:min} (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}です",
+ "fr": "La difficulté maximale est {climbing:grade:french:max} selon la classification franco-belge"
+ },
+ "freeform": {
+ "key": "climbing:grade:french:max"
+ },
+ "condition": {
+ "and": [
+ "climbing!~route",
+ "office=",
+ "club=",
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "id": "Boldering?",
+ "question": {
+ "de": "Kann hier gebouldert werden?",
+ "en": "Is bouldering possible here?",
+ "nl": "Is het mogelijk om hier te bolderen?",
+ "ja": "ここでボルダリングはできますか?",
+ "nb_NO": "Er buldring mulig her?",
+ "fr": "L’escalade de bloc est-elle possible ici ?"
+ },
+ "mappings": [
+ {
+ "if": "climbing:boulder=yes",
+ "then": {
+ "de": "Hier kann gebouldert werden",
+ "en": "Bouldering is possible here",
+ "nl": "Bolderen kan hier",
+ "ja": "ボルダリングはここで可能です",
+ "nb_NO": "Buldring er mulig her",
+ "fr": "L’escalade de bloc est possible"
+ }
+ },
+ {
+ "if": "climbing:boulder=no",
+ "then": {
+ "de": "Hier kann nicht gebouldert werden",
+ "en": "Bouldering is not possible here",
+ "nl": "Bolderen kan hier niet",
+ "ja": "ここではボルダリングはできません",
+ "nb_NO": "Buldring er ikke mulig her",
+ "fr": "L’escalade de bloc n’est pas possible"
+ }
+ },
+ {
+ "if": "climbing:boulder=limited",
+ "then": {
+ "de": "Bouldern ist hier nur an wenigen Routen möglich",
+ "en": "Bouldering is possible, allthough there are only a few routes",
+ "nl": "Bolderen kan hier, maar er zijn niet zoveel routes",
+ "ja": "ボルダリングは可能ですが、少しのルートしかありません",
+ "fr": "L’escalade de bloc est possible sur des voies précises"
+ }
+ },
+ {
+ "if": "climbing:boulder~*",
+ "then": {
+ "de": "Hier gibt es {climbing:boulder} Boulder-Routen",
+ "en": "There are {climbing:boulder} boulder routes",
+ "nl": "Er zijn hier {climbing:boulder} bolderroutes",
+ "ja": "{climbing:boulder} ボルダールートがある",
+ "fr": "Il y a {climbing:boulder} voies d’escalade de bloc"
+ },
+ "hideInAnswer": true
+ }
+ ],
+ "condition": {
+ "and": [
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ },
+ "office=",
+ "club="
+ ]
+ }
+ },
+ {
+ "id": "Toproping?",
+ "question": {
+ "de": "Ist Toprope-Klettern hier möglich?",
+ "en": "Is toprope climbing possible here?",
+ "nl": "Is het mogelijk om hier te toprope-klimmen?",
+ "ja": "ここでtoprope登坂はできますか?",
+ "fr": "Est-il possible d’escalader à la moulinette ?"
+ },
+ "mappings": [
+ {
+ "if": "climbing:toprope=yes",
+ "then": {
+ "de": "Toprope-Klettern ist hier möglich",
+ "en": "Toprope climbing is possible here",
+ "nl": "Toprope-klimmen kan hier",
+ "ja": "ここでToprope登坂ができます",
+ "fr": "L’escalade à la moulinette est possible"
+ }
+ },
+ {
+ "if": "climbing:toprope=no",
+ "then": {
+ "de": "Toprope-Climbing ist hier nicht möglich",
+ "en": "Toprope climbing is not possible here",
+ "nl": "Toprope-klimmen kan hier niet",
+ "ja": "ここではToprope登坂はできません",
+ "fr": "L’escalade à la moulinette n’est pas possible"
+ }
+ },
+ {
+ "if": "climbing:toprope~*",
+ "then": {
+ "de": "Hier gibt es {climbing:toprope} Toprope-Routen",
+ "en": "There are {climbing:toprope} toprope routes",
+ "nl": "Er zijn hier {climbing:toprope} toprope routes",
+ "ja": "{climbing:toprope} 登坂ルートがある",
+ "fr": "{climbing:toprope} voies sont équipées de moulinettes"
+ },
+ "hideInAnswer": true
+ }
+ ],
+ "condition": {
+ "and": [
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ },
+ "office=",
+ "club="
+ ]
+ }
+ },
+ {
+ "id": "Sportclimbing?",
+ "question": {
+ "de": "Ist hier Sportklettern möglich (feste Ankerpunkte)?",
+ "en": "Is sport climbing possible here on fixed anchors?",
+ "nl": "Is het mogelijk om hier te sportklimmen/voorklimmen op reeds aangebrachte haken?",
+ "ja": "ここでは固定アンカー式のスポーツクライミングはできますか?"
+ },
+ "mappings": [
+ {
+ "if": "climbing:sport=yes",
+ "then": {
+ "de": "Sportklettern ist hier möglich",
+ "en": "Sport climbing is possible here",
+ "nl": "Sportklimmen/voorklimmen kan hier",
+ "ru": "Здесь можно заняться спортивным скалолазанием",
+ "ja": "ここでスポーツクライミングができます"
+ }
+ },
+ {
+ "if": "climbing:sport=no",
+ "then": {
+ "de": "Sportklettern ist hier nicht möglich",
+ "en": "Sport climbing is not possible here",
+ "nl": "Sportklimmen/voorklimmen kan hier niet",
+ "ru": "Спортивное скалолазание здесь невозможно",
+ "ja": "ここではスポーツクライミングはできません"
+ }
+ },
+ {
+ "if": "climbing:sport~*",
+ "then": {
+ "de": "Hier gibt es {climbing:sport} Sportkletter-Routen",
+ "en": "There are {climbing:sport} sport climbing routes",
+ "nl": "Er zijn hier {climbing:sport} sportklimroutes/voorklimroutes",
+ "ja": "スポーツクライミングの {climbing:sport} ルートがある"
+ },
+ "hideInAnswer": true
+ }
+ ],
+ "condition": {
+ "and": [
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ },
+ "office=",
+ "club="
+ ]
+ }
+ },
+ {
+ "id": "Traditional climbing?",
+ "question": {
+ "de": "Ist hier traditionelles Klettern möglich (eigene Sicherung z.B. mit Klemmkleilen)?",
+ "en": "Is traditional climbing possible here (using own gear e.g. chocks)?",
+ "nl": "Is het mogelijk om hier traditioneel te klimmen? (Dit is klimmen met klemblokjes en friends)",
+ "ja": "伝統的な登山はここで可能ですか(例えば、チョックのような独自のギアを使用して)?"
+ },
+ "mappings": [
+ {
+ "if": "climbing:traditional=yes",
+ "then": {
+ "de": "Traditionelles Klettern ist hier möglich",
+ "en": "Traditional climbing is possible here",
+ "nl": "Traditioneel klimmen kan hier",
+ "ja": "ここでは伝統的な登山が可能です"
+ }
+ },
+ {
+ "if": "climbing:traditional=no",
+ "then": {
+ "de": "Traditionelles Klettern ist hier nicht möglich",
+ "en": "Traditional climbing is not possible here",
+ "nl": "Traditioneel klimmen kan hier niet",
+ "ja": "伝統的な登山はここではできない"
+ }
+ },
+ {
+ "if": "climbing:traditional~*",
+ "then": {
+ "de": "Hier gibt es {climbing:traditional} Routen für traditionelles Klettern",
+ "en": "There are {climbing:traditional} traditional climbing routes",
+ "nl": "Er zijn hier {climbing:traditional} traditionele klimroutes",
+ "ja": "{climbing:traditional} の伝統的な登山ルートがある"
+ },
+ "hideInAnswer": true
+ }
+ ],
+ "condition": {
+ "and": [
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ },
+ "office=",
+ "club="
+ ]
+ }
+ },
+ {
+ "id": "Speed climbing?",
+ "question": {
+ "de": "Gibt es hier eine Speedkletter-Wand?",
+ "en": "Is there a speed climbing wall?",
+ "nl": "Is er een snelklimmuur (speed climbing)?",
+ "ja": "スピードクライミングウォールはありますか?"
+ },
+ "condition": {
+ "and": [
+ "leisure=sports_centre",
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ },
+ "office=",
+ "club="
+ ]
+ },
+ "mappings": [
+ {
+ "if": "climbing:speed=yes",
+ "then": {
+ "de": "Hier gibt es eine Speedkletter-Wand",
+ "en": "There is a speed climbing wall",
+ "nl": "Er is een snelklimmuur voor speed climbing",
+ "ja": "スピードクライミングウォールがある"
+ }
+ },
+ {
+ "if": "climbing:speed=no",
+ "then": {
+ "de": "Hier gibt es keine Speedkletter-Wand",
+ "en": "There is no speed climbing wall",
+ "nl": "Er is geen snelklimmuur voor speed climbing",
+ "ja": "スピードクライミングウォールがない"
+ }
+ },
+ {
+ "if": "climbing:speed~*",
+ "then": {
+ "de": "Hier gibt es {climbing:speed} Speedkletter-Routen",
+ "en": "There are {climbing:speed} speed climbing walls",
+ "nl": "Er zijn hier {climbing:speed} snelklimmuren",
+ "ja": "{climbing:speed} のスピードクライミングウォールがある"
+ },
+ "hideInAnswer": true
+ }
+ ]
+ }
]
}
}
\ No newline at end of file
diff --git a/assets/themes/cyclestreets/cyclestreets.json b/assets/themes/cyclestreets/cyclestreets.json
index 3392671981..23343c762c 100644
--- a/assets/themes/cyclestreets/cyclestreets.json
+++ b/assets/themes/cyclestreets/cyclestreets.json
@@ -43,105 +43,6 @@
"maxZoom": 12,
"minNeededElements": 200
},
- "roamingRenderings": [
- {
- "question": {
- "nl": "Is deze straat een fietsstraat?",
- "en": "Is this street a cyclestreet?",
- "ja": "この通りはcyclestreetですか?",
- "nb_NO": "Er denne gaten en sykkelvei?",
- "de": "Ist diese Straße eine Fahrradstraße?"
- },
- "mappings": [
- {
- "if": {
- "and": [
- "cyclestreet=yes",
- "maxspeed=30",
- "overtaking:motor_vehicle=no",
- "proposed:cyclestreet="
- ]
- },
- "then": {
- "nl": "Deze straat is een fietsstraat (en dus zone 30)",
- "en": "This street is a cyclestreet (and has a speed limit of 30 km/h)",
- "ja": "cyclestreet(最高速度は30km/h)",
- "nb_NO": "Denne gaten er en sykkelvei (og har en fartsgrense på 30 km/t)",
- "de": "Diese Straße ist eine Fahrradstraße (mit einer Geschwindigkeitsbegrenzung von 30 km/h)"
- }
- },
- {
- "if": {
- "and": [
- "cyclestreet=yes",
- "proposed:cyclestreet="
- ]
- },
- "then": {
- "nl": "Deze straat i een fietsstraat",
- "en": "This street is a cyclestreet",
- "ja": "この通りはcyclestreetだ",
- "nb_NO": "Denne gaten er en sykkelvei",
- "de": "Diese Straße ist eine Fahrradstraße"
- },
- "hideInAnswer": true
- },
- {
- "if": {
- "and": [
- "cyclestreet=",
- "proposed:cyclestreet=yes"
- ]
- },
- "then": {
- "nl": "Deze straat wordt binnenkort een fietsstraat",
- "en": "This street will become a cyclstreet soon",
- "ja": "この通りはまもなくcyclstreetになるだろう",
- "nb_NO": "Denne gaten vil bli sykkelvei ganske snart",
- "de": "Diese Straße wird bald eine Fahrradstraße sein"
- }
- },
- {
- "if": {
- "and": [
- "cyclestreet=",
- "proposed:cyclestreet=",
- "overtaking:motor_vehicle="
- ]
- },
- "then": {
- "nl": "Deze straat is geen fietsstraat",
- "en": "This street is not a cyclestreet",
- "ja": "この通りはcyclestreetではない",
- "nb_NO": "Denne gaten er ikke en sykkelvei",
- "it": "Questa strada non è una strada ciclabile",
- "de": "Diese Straße ist keine Fahrradstraße"
- }
- }
- ]
- },
- {
- "question": {
- "nl": "Wanneer wordt deze straat een fietsstraat?",
- "en": "When will this street become a cyclestreet?",
- "ja": "この通りはいつcyclestreetになるんですか?",
- "it": "Questa strada diventerà una strada ciclabile quando?",
- "de": "Wann wird diese Straße eine Fahrradstraße?"
- },
- "render": {
- "nl": "Deze straat wordt fietsstraat op {cyclestreet:start_date}",
- "en": "This street will become a cyclestreet at {cyclestreet:start_date}",
- "ja": "この通りは{cyclestreet:start_date}に、cyclestreetになります",
- "it": "Questa strada diventerà una strada ciclabile dal {cyclestreet:start_date}",
- "de": "Diese Straße wird am {cyclestreet:start_date} zu einer Fahrradstraße"
- },
- "condition": "proposed:cyclestreet=yes",
- "freeform": {
- "type": "date",
- "key": "cyclestreet:start_date"
- }
- }
- ],
"layers": [
{
"id": "fietsstraat",
@@ -304,6 +205,105 @@
}
],
"overrideAll": {
- "allowSplit": true
+ "allowSplit": true,
+ "tagRenderings+": [
+ {"id": "is_cyclestreet",
+ "question": {
+ "nl": "Is deze straat een fietsstraat?",
+ "en": "Is this street a cyclestreet?",
+ "ja": "この通りはcyclestreetですか?",
+ "nb_NO": "Er denne gaten en sykkelvei?",
+ "de": "Ist diese Straße eine Fahrradstraße?"
+ },
+ "mappings": [
+ {
+ "if": {
+ "and": [
+ "cyclestreet=yes",
+ "maxspeed=30",
+ "overtaking:motor_vehicle=no",
+ "proposed:cyclestreet="
+ ]
+ },
+ "then": {
+ "nl": "Deze straat is een fietsstraat (en dus zone 30)",
+ "en": "This street is a cyclestreet (and has a speed limit of 30 km/h)",
+ "ja": "cyclestreet(最高速度は30km/h)",
+ "nb_NO": "Denne gaten er en sykkelvei (og har en fartsgrense på 30 km/t)",
+ "de": "Diese Straße ist eine Fahrradstraße (mit einer Geschwindigkeitsbegrenzung von 30 km/h)"
+ }
+ },
+ {
+ "if": {
+ "and": [
+ "cyclestreet=yes",
+ "proposed:cyclestreet="
+ ]
+ },
+ "then": {
+ "nl": "Deze straat i een fietsstraat",
+ "en": "This street is a cyclestreet",
+ "ja": "この通りはcyclestreetだ",
+ "nb_NO": "Denne gaten er en sykkelvei",
+ "de": "Diese Straße ist eine Fahrradstraße"
+ },
+ "hideInAnswer": true
+ },
+ {
+ "if": {
+ "and": [
+ "cyclestreet=",
+ "proposed:cyclestreet=yes"
+ ]
+ },
+ "then": {
+ "nl": "Deze straat wordt binnenkort een fietsstraat",
+ "en": "This street will become a cyclstreet soon",
+ "ja": "この通りはまもなくcyclstreetになるだろう",
+ "nb_NO": "Denne gaten vil bli sykkelvei ganske snart",
+ "de": "Diese Straße wird bald eine Fahrradstraße sein"
+ }
+ },
+ {
+ "if": {
+ "and": [
+ "cyclestreet=",
+ "proposed:cyclestreet=",
+ "overtaking:motor_vehicle="
+ ]
+ },
+ "then": {
+ "nl": "Deze straat is geen fietsstraat",
+ "en": "This street is not a cyclestreet",
+ "ja": "この通りはcyclestreetではない",
+ "nb_NO": "Denne gaten er ikke en sykkelvei",
+ "it": "Questa strada non è una strada ciclabile",
+ "de": "Diese Straße ist keine Fahrradstraße"
+ }
+ }
+ ]
+ },
+ {"id": "future_cyclestreet",
+ "question": {
+ "nl": "Wanneer wordt deze straat een fietsstraat?",
+ "en": "When will this street become a cyclestreet?",
+ "ja": "この通りはいつcyclestreetになるんですか?",
+ "it": "Questa strada diventerà una strada ciclabile quando?",
+ "de": "Wann wird diese Straße eine Fahrradstraße?"
+ },
+ "render": {
+ "nl": "Deze straat wordt fietsstraat op {cyclestreet:start_date}",
+ "en": "This street will become a cyclestreet at {cyclestreet:start_date}",
+ "ja": "この通りは{cyclestreet:start_date}に、cyclestreetになります",
+ "it": "Questa strada diventerà una strada ciclabile dal {cyclestreet:start_date}",
+ "de": "Diese Straße wird am {cyclestreet:start_date} zu einer Fahrradstraße"
+ },
+ "condition": "proposed:cyclestreet=yes",
+ "freeform": {
+ "type": "date",
+ "key": "cyclestreet:start_date"
+ }
+ }
+ ]
}
}
\ No newline at end of file
diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts
index d97c235cba..4ee4d388c2 100644
--- a/scripts/generateLayerOverview.ts
+++ b/scripts/generateLayerOverview.ts
@@ -118,6 +118,9 @@ class LayerOverviewUtils {
if (themeFile["units"] !== undefined) {
themeErrorCount.push("The theme " + themeFile.id + " has units defined - these should be defined on the layer instead. (Hint: use overrideAll: { '+units': ... }) ")
}
+ if (themeFile["roamingRenderings"] !== undefined) {
+ themeErrorCount.push("Theme " + themeFile.id + " contains an old 'roamingRenderings'. Use an 'overrideAll' instead")
+ }
for (const layer of themeFile.layers) {
if (typeof layer === "string") {
if (!knownLayerIds.has(layer)) {
@@ -213,4 +216,4 @@ class LayerOverviewUtils {
}
}
-new LayerOverviewUtils().main(process.argv)
\ No newline at end of file
+new LayerOverviewUtils().main(process.argv)
From 5806848dc8e7cf2d8d65a733e13da90a2ddf2f9b Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Tue, 19 Oct 2021 02:44:54 +0200
Subject: [PATCH 06/58] Remove all roaming tagRenderings
---
Models/ThemeConfig/TagRenderingConfig.ts | 3 ++
.../layers/bike_cleaning/bike_cleaning.json | 11 ++---
.../bike_repair_station.json | 3 +-
assets/layers/bike_shop/bike_shop.json | 41 +++++++++++++++++++
4 files changed, 48 insertions(+), 10 deletions(-)
diff --git a/Models/ThemeConfig/TagRenderingConfig.ts b/Models/ThemeConfig/TagRenderingConfig.ts
index 4edd0da1d2..40b7bdfe14 100644
--- a/Models/ThemeConfig/TagRenderingConfig.ts
+++ b/Models/ThemeConfig/TagRenderingConfig.ts
@@ -62,6 +62,9 @@ export default class TagRenderingConfig {
this.render = Translations.T(json.render, context + ".render");
this.question = Translations.T(json.question, context + ".question");
this.roaming = json.roaming ?? false;
+ if(this.roaming){
+ console.warn("Deprecation notice: roaming renderings will be scrapped.", this.id, context)
+ }
const condition = TagUtils.Tag(json.condition ?? {"and": []}, `${context}.condition`);
if (this.roaming && conditionIfRoaming !== undefined) {
this.condition = new And([condition, conditionIfRoaming]);
diff --git a/assets/layers/bike_cleaning/bike_cleaning.json b/assets/layers/bike_cleaning/bike_cleaning.json
index 9d56e19a5c..9e39755c77 100644
--- a/assets/layers/bike_cleaning/bike_cleaning.json
+++ b/assets/layers/bike_cleaning/bike_cleaning.json
@@ -79,16 +79,13 @@
]
},
"then": {
- "render": "./assets/layers/bike_cleaning/bike_cleaning_icon.svg",
- "roaming": true
- },
- "badge": true
+ "render": "./assets/layers/bike_cleaning/bike_cleaning_icon.svg"
+ }
}
],
"titleIcons": [
{
- "render": "",
- "roaming": true
+ "render": ""
}
],
"tagRenderings": [
@@ -118,7 +115,6 @@
"then": "The cleaning service has a fee"
}
],
- "roaming": true,
"id": "bike_cleaning-service:bicycle:cleaning:charge"
},
{
@@ -146,7 +142,6 @@
"then": "The cleaning service has a fee"
}
],
- "roaming": false,
"id": "bike_cleaning-charge"
}
],
diff --git a/assets/layers/bike_repair_station/bike_repair_station.json b/assets/layers/bike_repair_station/bike_repair_station.json
index 8b78c689d7..891f8a599c 100644
--- a/assets/layers/bike_repair_station/bike_repair_station.json
+++ b/assets/layers/bike_repair_station/bike_repair_station.json
@@ -129,8 +129,7 @@
"titleIcons": [
{
"render": "",
- "condition": "operator=De Fietsambassade Gent",
- "roaming": true
+ "condition": "operator=De Fietsambassade Gent"
},
"defaults"
],
diff --git a/assets/layers/bike_shop/bike_shop.json b/assets/layers/bike_shop/bike_shop.json
index 0615750377..8b80b5b043 100644
--- a/assets/layers/bike_shop/bike_shop.json
+++ b/assets/layers/bike_shop/bike_shop.json
@@ -174,6 +174,10 @@
"condition": "service:bicycle:diy=yes",
"render": ""
},
+ { "condition": "service:bicycle:cleaning=yes",
+
+ "render": ""
+ },
"defaults"
],
"description": {
@@ -659,6 +663,32 @@
}
}
]
+ },
+ {
+ "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"
}
],
"presets": [
@@ -700,6 +730,17 @@
"if": "service:bicycle:pump=yes",
"then": "circle:#e2783d;./assets/layers/bike_repair_station/pump.svg",
"badge": true
+ },
+ {
+ "if": {
+ "and": [
+ "service:bicycle:cleaning~*"
+ ]
+ },
+ "then": {
+ "render": "./assets/layers/bike_cleaning/bike_cleaning_icon.svg"
+ },
+ "badge": true
}
],
"width": {
From 691f8dd2e37ba1c1d4826bd4797b174bc3710058 Mon Sep 17 00:00:00 2001
From: kjon
Date: Mon, 18 Oct 2021 21:24:19 +0000
Subject: [PATCH 07/58] Translated using Weblate (German)
Currently translated at 98.9% (196 of 198 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/
---
langs/de.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/langs/de.json b/langs/de.json
index a97714ccae..214ae80e9e 100644
--- a/langs/de.json
+++ b/langs/de.json
@@ -77,7 +77,7 @@
"sharescreen": {
"intro": "
Diese Karte teilen
Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:",
"addToHomeScreen": "
Zum Startbildschirm hinzufügen
Sie können diese Website einfach zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der URL-Leiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.",
- "embedIntro": "
Auf Ihrer Website einbetten
Bitte, betten Sie diese Karte in Ihre Website ein. Wir ermutigen Sie, es zu tun - Sie müssen nicht einmal um Erlaubnis fragen. Es ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie.",
+ "embedIntro": "
Auf Ihrer Website einbetten
Bitte betten Sie diese Karte in Ihre Webseite ein. Wir ermutigen Sie, es zu tun - Sie müssen nicht einmal um Erlaubnis fragen. Es ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie.",
"copiedToClipboard": "Link in die Zwischenablage kopiert",
"thanksForSharing": "Danke für das Teilen!",
"editThisTheme": "Dieses Thema bearbeiten",
From c7b8148f7dcead2c52efd4d05bc09418a22c8c2a Mon Sep 17 00:00:00 2001
From: kjon
Date: Mon, 18 Oct 2021 21:09:51 +0000
Subject: [PATCH 08/58] Translated using Weblate (German)
Currently translated at 78.1% (383 of 490 strings)
Translation: MapComplete/themes
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/de/
---
langs/themes/de.json | 252 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 250 insertions(+), 2 deletions(-)
diff --git a/langs/themes/de.json b/langs/themes/de.json
index 32490ea829..3a988e18fa 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -404,7 +404,9 @@
"title": "Offene Toilette Karte"
},
"waste_basket": {
- "title": "Abfalleimer"
+ "title": "Abfalleimer",
+ "shortDescription": "Eine Karte mit Abfalleimern",
+ "description": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen"
},
"cyclestreets": {
"layers": {
@@ -552,7 +554,7 @@
"presets": {
"0": {
"title": "Wohnmobilstellplatz",
- "description": "Fügen Sie einen neuen offiziellen Wohnmobilstellplatz hinzu. Dies sind ausgewiesene Plätze, an denen Sie in Ihrem Wohnmobil übernachten können. Sie können wie ein richtiger Campingplatz oder nur wie ein Parkplatz aussehen. Möglicherweise sind sie gar nicht ausgeschildert, sondern nur in einem Gemeindebeschluss festgelegt. Ein normaler Parkplatz für Wohnmobile, auf dem übernachten nicht zulässig ist, ist kein Wohnmobilstellplatz. "
+ "description": "Fügen Sie einen neuen offiziellen Wohnmobilstellplatz hinzu. Dies sind ausgewiesene Plätze, an denen Sie in Ihrem Wohnmobil übernachten können. Sie können wie ein richtiger Campingplatz oder nur wie ein Parkplatz aussehen. Möglicherweise sind sie gar nicht ausgeschildert, sondern nur in einem Gemeindebeschluss festgelegt. Ein normaler Parkplatz für Wohnmobile, auf dem Übernachten nicht zulässig ist, ist kein Wohnmobilstellplatz. "
}
},
"tagRenderings": {
@@ -908,5 +910,251 @@
}
}
}
+ },
+ "hailhydrant": {
+ "layers": {
+ "0": {
+ "name": "Karte der Hydranten",
+ "tagRenderings": {
+ "hydrant-color": {
+ "mappings": {
+ "1": {
+ "then": "Die Farbe des Hydranten ist gelb."
+ },
+ "0": {
+ "then": "Die Farbe des Hydranten ist unbekannt."
+ },
+ "2": {
+ "then": "Die Farbe des Hydranten ist rot."
+ }
+ },
+ "render": "Der Hydrant hat die Farbe {colour}",
+ "question": "Welche Farbe hat der Hydrant?"
+ },
+ "hydrant-type": {
+ "mappings": {
+ "1": {
+ "then": " Säulenart."
+ },
+ "4": {
+ "then": " Untergrundtyp."
+ },
+ "0": {
+ "then": "Der Typ des Hydranten ist unbekannt."
+ },
+ "2": {
+ "then": " Rohrtyp."
+ },
+ "3": {
+ "then": " Wandtyp."
+ }
+ },
+ "question": "Um welche Art von Hydrant handelt es sich?",
+ "render": " Hydranten-Typ: {fire_hydrant:type}"
+ },
+ "hydrant-state": {
+ "mappings": {
+ "0": {
+ "then": "Der Hydrant ist (ganz oder teilweise) in Betrieb."
+ },
+ "1": {
+ "then": "Der Hydrant ist nicht verfügbar."
+ },
+ "2": {
+ "then": "Der Hydrant wurde entfernt."
+ }
+ },
+ "question": "Aktualisieren Sie den Lebenszyklusstatus des Hydranten.",
+ "render": "Lebenszyklus-Status"
+ }
+ },
+ "description": "Kartenebene zur Anzeige von Hydranten.",
+ "presets": {
+ "0": {
+ "description": "Ein Hydrant ist ein Anschlusspunkt, an dem die Feuerwehr Wasser zapfen kann. Er kann sich unterirdisch befinden.",
+ "title": "Löschwasser-Hydrant"
+ }
+ },
+ "title": {
+ "render": "Hydrant"
+ }
+ },
+ "3": {
+ "presets": {
+ "0": {
+ "description": "Eine Rettungsstation der Karte hinzufügen"
+ }
+ }
+ },
+ "1": {
+ "presets": {
+ "0": {
+ "description": "Ein Feuerlöscher ist ein kleines, tragbares Gerät, das dazu dient, ein Feuer zu löschen",
+ "title": "Feuerlöscher"
+ }
+ },
+ "description": "Kartenebene zur Anzeige von Hydranten.",
+ "name": "Karte mit Feuerlöschern.",
+ "tagRenderings": {
+ "extinguisher-location": {
+ "mappings": {
+ "0": {
+ "then": "Im Innenraum vorhanden."
+ },
+ "1": {
+ "then": "Im Außenraum vorhanden."
+ }
+ },
+ "question": "Wo befindet er sich?",
+ "render": "Standort: {location}"
+ }
+ },
+ "title": {
+ "render": "Feuerlöscher"
+ }
+ },
+ "2": {
+ "presets": {
+ "0": {
+ "description": "Eine Feuerwache ist ein Ort, an dem die Feuerwehrfahrzeuge und die Feuerwehrleute untergebracht sind, wenn sie nicht im Einsatz sind.",
+ "title": "Feuerwache"
+ }
+ },
+ "description": "Kartenebene zur Darstellung von Feuerwachen.",
+ "name": "Karte der Feuerwachen",
+ "tagRenderings": {
+ "station-name": {
+ "question": "Wie lautet der Name dieser Feuerwache?"
+ }
+ }
+ }
+ },
+ "description": "Auf dieser Karte können Sie Hydranten, Feuerwachen, Krankenwagen und Feuerlöscher in Ihren bevorzugten Stadtvierteln finden und aktualisieren. \n\nSie können Ihren genauen Standort verfolgen (nur mobil) und in der unteren linken Ecke die für Sie relevanten Ebenen auswählen. Sie können mit diesem Tool auch Pins (Points of Interest) zur Karte hinzufügen oder bearbeiten und durch die Beantwortung verfügbarer Fragen zusätzliche Angaben machen. \n\nAlle von Ihnen vorgenommenen Änderungen werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei weiterverwendet werden."
+ },
+ "shops": {
+ "layers": {
+ "0": {
+ "title": {
+ "mappings": {
+ "1": {
+ "then": "{shop}"
+ },
+ "0": {
+ "then": "{name}"
+ }
+ },
+ "render": "Geschäft"
+ },
+ "tagRenderings": {
+ "shops-shop": {
+ "mappings": {
+ "5": {
+ "then": "Autoreparatur (Werkstatt)"
+ },
+ "4": {
+ "then": "Bäckerei"
+ },
+ "3": {
+ "then": "Friseur"
+ },
+ "2": {
+ "then": "Bekleidungsgeschäft"
+ },
+ "1": {
+ "then": "Supermarkt"
+ },
+ "0": {
+ "then": "Lebensmittelladen"
+ },
+ "6": {
+ "then": "Autohändler"
+ }
+ },
+ "render": "Dieses Geschäft verkauft {shop}",
+ "question": "Was wird in diesem Geschäft verkauft?"
+ },
+ "shops-phone": {
+ "render": "{phone}"
+ },
+ "shops-website": {
+ "render": "{website}",
+ "question": "Wie lautet die Webseite dieses Geschäfts?"
+ }
+ },
+ "presets": {
+ "0": {
+ "description": "Ein neues Geschäft hinzufügen"
+ }
+ }
+ }
+ },
+ "title": "Freie Geschäftskarte",
+ "shortDescription": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen"
+ },
+ "surveillance": {
+ "description": "Auf dieser offenen Karte finden Sie Überwachungskameras.",
+ "title": "Überwachung unter Überwachung",
+ "shortDescription": "Überwachungskameras und andere Mittel zur Überwachung"
+ },
+ "sport_pitches": {
+ "title": "Sportplätze",
+ "shortDescription": "Eine Karte mit Sportplätzen",
+ "description": "Ein Sportplatz ist eine Fläche, auf der Sportarten gespielt werden"
+ },
+ "openwindpowermap": {
+ "description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen."
+ },
+ "postboxes": {
+ "layers": {
+ "1": {
+ "tagRenderings": {
+ "OH": {
+ "mappings": {
+ "0": {
+ "then": "durchgehend geöffnet (auch an Feiertagen)"
+ }
+ }
+ }
+ },
+ "description": "Eine Ebene mit Postämtern."
+ }
+ }
+ },
+ "uk_addresses": {
+ "shortDescription": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen",
+ "layers": {
+ "1": {
+ "tagRenderings": {
+ "uk_addresses_housenumber": {
+ "render": "Die Hausnummer ist {addr:housenumber}",
+ "question": "Wie lautet die Nummer dieses Hauses?",
+ "mappings": {
+ "0": {
+ "then": "Dieses Gebäude hat keine Hausnummer"
+ }
+ }
+ },
+ "uk_addresses_explanation_osm": {
+ "render": "Diese Adresse ist in OpenStreetMap gespeichert"
+ },
+ "uk_addresses_street": {
+ "render": "Diese Adresse befindet sich in der Straße {addr:street}",
+ "question": "In welcher Straße befindet sich diese Adresse?"
+ }
+ },
+ "name": "Bekannte Adressen in OSM",
+ "description": "Adressen",
+ "title": {
+ "render": "Bekannte Adresse"
+ }
+ }
+ },
+ "description": "Tragen Sie zu OpenStreetMap bei, indem Sie Adressinformationen ausfüllen",
+ "title": "Adressen in Großbritannien"
+ },
+ "trees": {
+ "title": "Bäume",
+ "description": "Kartieren Sie alle Bäume!",
+ "shortDescription": "Kartieren Sie alle Bäume"
}
}
From e782d33a0d63d66fd12dc0dbac466fa363771efc Mon Sep 17 00:00:00 2001
From: Joost
Date: Tue, 19 Oct 2021 14:15:36 +0000
Subject: [PATCH 09/58] Translated using Weblate (Dutch)
Currently translated at 54.2% (266 of 490 strings)
Translation: MapComplete/themes
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/nl/
---
langs/themes/nl.json | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/langs/themes/nl.json b/langs/themes/nl.json
index 0e7ec34387..1a3bd0f235 100644
--- a/langs/themes/nl.json
+++ b/langs/themes/nl.json
@@ -270,6 +270,24 @@
},
"caravansites-website": {
"render": "Officiële website: : {website}"
+ },
+ "caravansites-capacity": {
+ "question": "Hoeveel campers kunnen hier overnachten? (sla dit over als er geen duidelijk aantal plaatsen of aangeduid maximum is)",
+ "render": "{capacity} campers kunnen deze plaats tegelijk gebruiken"
+ },
+ "caravansites-description": {
+ "question": "Wil je graag een algemene beschrijving toevoegen van deze plaats? (Herhaal hier niet de antwoorden op de vragen die reeds gesteld zijn. Hou het objectief - je kan je mening geven via een review)",
+ "render": "Meer details over deze plaats: {description}"
+ },
+ "caravansites-internet": {
+ "mappings": {
+ "0": {
+ "then": "Er is internettoegang"
+ },
+ "1": {
+ "then": "Er is internettoegang"
+ }
+ }
}
},
"title": {
@@ -279,11 +297,17 @@
}
},
"render": "Camperplaats {name}"
+ },
+ "presets": {
+ "0": {
+ "description": "Voeg een nieuwe officiële camperplaats toe. Dit zijn speciaal aangeduide plaatsen waar het toegestaan is om te overnachten met een camper. Ze kunnen er uitzien als een parking, of soms eerder als een camping. Soms staan ze niet ter plaatse aangeduid, maar heeft de gemeente wel degelijk beslist dat dit een camperplaats is. Een parking voor campers waar je niet mag overnachten is géén camperplaats. ",
+ "title": "camperplaats"
+ }
}
}
},
"shortDescription": "Vind locaties waar je de nacht kan doorbrengen met je mobilehome",
- "title": "Kampeersite"
+ "title": "Camperplaatsen"
},
"charging_stations": {
"shortDescription": "Een wereldwijde kaart van oplaadpunten",
From 3984b01470489b6c56cb95b73ffffc60b936edc6 Mon Sep 17 00:00:00 2001
From: kjon
Date: Mon, 18 Oct 2021 21:22:50 +0000
Subject: [PATCH 10/58] Translated using Weblate (German)
Currently translated at 100.0% (25 of 25 strings)
Translation: MapComplete/shared-questions
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/shared-questions/de/
---
langs/shared-questions/de.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/langs/shared-questions/de.json b/langs/shared-questions/de.json
index cfc40498be..530766cb38 100644
--- a/langs/shared-questions/de.json
+++ b/langs/shared-questions/de.json
@@ -48,7 +48,7 @@
"wheelchair-access": {
"mappings": {
"0": {
- "then": "Dieser Ort ist speziell für Rollstuhlfahrer eingerichtet."
+ "then": "Dieser Ort ist speziell für Rollstuhlfahrer eingerichtet"
},
"1": {
"then": "Dieser Ort ist mit einem Rollstuhl leicht zu erreichen"
@@ -74,7 +74,7 @@
"then": "Hunde sind nicht erlaubt"
},
"2": {
- "then": "Hunde sind erlaubt, müssen aber angeleint sein."
+ "then": "Hunde sind erlaubt, müssen aber angeleint sein"
}
},
"question": "Sind Hunde in diesem Geschäft erlaubt?"
From aa75a5b797338bb1abf3c63edd370f220bca9284 Mon Sep 17 00:00:00 2001
From: plic ploc
Date: Tue, 19 Oct 2021 12:37:05 +0000
Subject: [PATCH 11/58] Translated using Weblate (French)
Currently translated at 92.0% (23 of 25 strings)
Translation: MapComplete/shared-questions
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/shared-questions/fr/
---
langs/shared-questions/fr.json | 41 +++++++++++++++++++++++++++++++++-
1 file changed, 40 insertions(+), 1 deletion(-)
diff --git a/langs/shared-questions/fr.json b/langs/shared-questions/fr.json
index 4f1f52590c..9fd4361545 100644
--- a/langs/shared-questions/fr.json
+++ b/langs/shared-questions/fr.json
@@ -33,6 +33,45 @@
},
"website": {
"question": "Quel est le site web de {name} ?"
+ },
+ "payment-options": {
+ "mappings": {
+ "1": {
+ "then": "Paiement par carte accepté"
+ },
+ "0": {
+ "then": "Paiement en liquide accepté"
+ }
+ },
+ "question": "Quelles sont les méthodes de paiement acceptées ici ?"
+ },
+ "wheelchair-access": {
+ "mappings": {
+ "2": {
+ "then": "Il est possible d'accéder à cet endroit en chaise roulante, mais ce n'est pas facile"
+ },
+ "3": {
+ "then": "Cet endroit n'est pas accessible en chaise roulante"
+ }
+ },
+ "question": "Est-ce que cet endroit est accessible en chaise roulante ?"
+ },
+ "dog-access": {
+ "mappings": {
+ "1": {
+ "then": "Les chiens ne sont pas admis"
+ },
+ "2": {
+ "then": "Les chiens sont admis, mais ils doivent être tenus en laisse"
+ },
+ "3": {
+ "then": "Les chiens sont admis et peuvent circuler librement"
+ },
+ "0": {
+ "then": "Chiens admis"
+ }
+ },
+ "question": "Est-ce que les chiens sont admis ici ?"
}
}
-}
\ No newline at end of file
+}
From 83af5adaea9d74cc58e84d03885092facd03b7d1 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 00:08:54 +0200
Subject: [PATCH 12/58] Disable clustering on aed_brugge theme
---
assets/themes/aed/aed_brugge.json | 3 +++
1 file changed, 3 insertions(+)
diff --git a/assets/themes/aed/aed_brugge.json b/assets/themes/aed/aed_brugge.json
index aad99cd440..2ccf774d84 100644
--- a/assets/themes/aed/aed_brugge.json
+++ b/assets/themes/aed/aed_brugge.json
@@ -15,6 +15,9 @@
"startLat": 51.25634,
"startLon": 3.195682,
"startZoom": 12,
+ "clustering": {
+ "maxZoom": 0
+ },
"layers": [
"defibrillator",
{
From 89d4a6bcceca09b2a992d3822c20e2c4be819708 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 00:09:40 +0200
Subject: [PATCH 13/58] Add robustness when run via console, formatting
---
Logic/Actors/AvailableBaseLayers.ts | 4 +-
Logic/Actors/BackgroundLayerResetter.ts | 6 +
Logic/Actors/PendingChangesUploader.ts | 5 +
Logic/Actors/SelectedElementTagsUpdater.ts | 142 ++++++++++++---------
Logic/Actors/TitleHandler.ts | 4 +
Logic/ImageProviders/AllImageProviders.ts | 6 +-
Logic/ImageProviders/ImgurUploader.ts | 3 +-
Logic/Osm/Changes.ts | 3 +-
Logic/Osm/OsmObject.ts | 6 +-
Logic/State/FeatureSwitchState.ts | 3 +-
Logic/UIEventSource.ts | 3 +
11 files changed, 118 insertions(+), 67 deletions(-)
diff --git a/Logic/Actors/AvailableBaseLayers.ts b/Logic/Actors/AvailableBaseLayers.ts
index ce77e46d7d..89a5435e6a 100644
--- a/Logic/Actors/AvailableBaseLayers.ts
+++ b/Logic/Actors/AvailableBaseLayers.ts
@@ -23,11 +23,11 @@ export default class AvailableBaseLayers {
private static implementation: AvailableBaseLayersObj
static AvailableLayersAt(location: UIEventSource): UIEventSource {
- return AvailableBaseLayers.implementation.AvailableLayersAt(location);
+ return AvailableBaseLayers.implementation?.AvailableLayersAt(location) ?? new UIEventSource([]);
}
static SelectBestLayerAccordingTo(location: UIEventSource, preferedCategory: UIEventSource): UIEventSource {
- return AvailableBaseLayers.implementation.SelectBestLayerAccordingTo(location, preferedCategory);
+ return AvailableBaseLayers.implementation?.SelectBestLayerAccordingTo(location, preferedCategory) ?? new UIEventSource(undefined);
}
diff --git a/Logic/Actors/BackgroundLayerResetter.ts b/Logic/Actors/BackgroundLayerResetter.ts
index d193d81329..60666c53d6 100644
--- a/Logic/Actors/BackgroundLayerResetter.ts
+++ b/Logic/Actors/BackgroundLayerResetter.ts
@@ -2,6 +2,7 @@ import {UIEventSource} from "../UIEventSource";
import BaseLayer from "../../Models/BaseLayer";
import AvailableBaseLayers from "./AvailableBaseLayers";
import Loc from "../../Models/Loc";
+import {Utils} from "../../Utils";
/**
* Sets the current background layer to a layer that is actually available
@@ -12,6 +13,11 @@ export default class BackgroundLayerResetter {
location: UIEventSource,
availableLayers: UIEventSource,
defaultLayerId: string = undefined) {
+
+ if(Utils.runningFromConsole){
+ return
+ }
+
defaultLayerId = defaultLayerId ?? AvailableBaseLayers.osmCarto.id;
// Change the baselayer back to OSM if we go out of the current range of the layer
diff --git a/Logic/Actors/PendingChangesUploader.ts b/Logic/Actors/PendingChangesUploader.ts
index bd1e93fd68..675491467f 100644
--- a/Logic/Actors/PendingChangesUploader.ts
+++ b/Logic/Actors/PendingChangesUploader.ts
@@ -1,6 +1,7 @@
import {Changes} from "../Osm/Changes";
import Constants from "../../Models/Constants";
import {UIEventSource} from "../UIEventSource";
+import {Utils} from "../../Utils";
export default class PendingChangesUploader {
@@ -30,6 +31,10 @@ export default class PendingChangesUploader {
}
});
+ if(Utils.runningFromConsole){
+ return;
+ }
+
document.addEventListener('mouseout', e => {
// @ts-ignore
if (!e.toElement && !e.relatedTarget) {
diff --git a/Logic/Actors/SelectedElementTagsUpdater.ts b/Logic/Actors/SelectedElementTagsUpdater.ts
index 35d725c313..765c9ee19d 100644
--- a/Logic/Actors/SelectedElementTagsUpdater.ts
+++ b/Logic/Actors/SelectedElementTagsUpdater.ts
@@ -9,6 +9,13 @@ import {OsmConnection} from "../Osm/OsmConnection";
export default class SelectedElementTagsUpdater {
+ private static readonly metatags = new Set(["timestamp",
+ "version",
+ "changeset",
+ "user",
+ "uid",
+ "id"] )
+
constructor(state: {
selectedElement: UIEventSource,
allElements: ElementStorage,
@@ -18,15 +25,15 @@ export default class SelectedElementTagsUpdater {
state.osmConnection.isLoggedIn.addCallbackAndRun(isLoggedIn => {
- if(isLoggedIn){
+ if (isLoggedIn) {
SelectedElementTagsUpdater.installCallback(state)
return true;
}
})
}
-
- private static installCallback(state: {
+
+ public static installCallback(state: {
selectedElement: UIEventSource,
allElements: ElementStorage,
changes: Changes,
@@ -36,80 +43,99 @@ export default class SelectedElementTagsUpdater {
state.selectedElement.addCallbackAndRunD(s => {
let id = s.properties?.id
-
+
const backendUrl = state.osmConnection._oauth_config.url
- if(id.startsWith(backendUrl)){
+ if (id.startsWith(backendUrl)) {
id = id.substring(backendUrl.length)
}
-
- if(!(id.startsWith("way") || id.startsWith("node") || id.startsWith("relation"))){
+
+ if (!(id.startsWith("way") || id.startsWith("node") || id.startsWith("relation"))) {
// This object is _not_ from OSM, so we skip it!
return;
}
-
- if(id.indexOf("-") >= 0){
+
+ if (id.indexOf("-") >= 0) {
// This is a new object
return;
}
-
- OsmObject.DownloadPropertiesOf(id).then(tags => {
- SelectedElementTagsUpdater.applyUpdate(state, tags, id)
- }).catch(e => {
- console.error("Could not update tags of ", id, "due to", e)
+ OsmObject.DownloadPropertiesOf(id).then(latestTags => {
+ SelectedElementTagsUpdater.applyUpdate(state, latestTags, id)
})
+
});
}
- private static applyUpdate(state: {
- selectedElement: UIEventSource,
- allElements: ElementStorage,
- changes: Changes,
- osmConnection: OsmConnection
- }, latestTags: any, id: string
+ public static applyUpdate(state: {
+ selectedElement: UIEventSource,
+ allElements: ElementStorage,
+ changes: Changes,
+ osmConnection: OsmConnection
+ }, latestTags: any, id: string
) {
- const pendingChanges = state.changes.pendingChanges.data
- .filter(change => change.type +"/"+ change.id === id)
- .filter(change => change.tags !== undefined);
-
- for (const pendingChange of pendingChanges) {
- const tagChanges = pendingChange.tags;
- for (const tagChange of tagChanges) {
- const key = tagChange.k
- const v = tagChange.v
- if (v === undefined || v === "") {
- delete latestTags[key]
- } else {
- latestTags[key] = v
+ try {
+
+ const pendingChanges = state.changes.pendingChanges.data
+ .filter(change => change.type + "/" + change.id === id)
+ .filter(change => change.tags !== undefined);
+
+ for (const pendingChange of pendingChanges) {
+ const tagChanges = pendingChange.tags;
+ for (const tagChange of tagChanges) {
+ const key = tagChange.k
+ const v = tagChange.v
+ if (v === undefined || v === "") {
+ delete latestTags[key]
+ } else {
+ latestTags[key] = v
+ }
}
}
- }
- // With the changes applied, we merge them onto the upstream object
- let somethingChanged = false;
- const currentTagsSource = state.allElements.getEventSourceById(id);
- const currentTags = currentTagsSource.data
- for (const key in latestTags) {
- let osmValue = latestTags[key]
-
- if(typeof osmValue === "number"){
- osmValue = ""+osmValue
- }
-
- const localValue = currentTags[key]
- if (localValue !== osmValue) {
- console.log("Local value for ", key ,":", localValue, "upstream", osmValue)
- somethingChanged = true;
- currentTags[key] = osmValue
- }
- }
- if (somethingChanged) {
- console.log("Detected upstream changes to the object when opening it, updating...")
- currentTagsSource.ping()
- }else{
- console.debug("Fetched latest tags for ", id, "but detected no changes")
- }
+ // With the changes applied, we merge them onto the upstream object
+ let somethingChanged = false;
+ const currentTagsSource = state.allElements.getEventSourceById(id);
+ const currentTags = currentTagsSource.data
+ for (const key in latestTags) {
+ let osmValue = latestTags[key]
+ if (typeof osmValue === "number") {
+ osmValue = "" + osmValue
+ }
+
+ const localValue = currentTags[key]
+ if (localValue !== osmValue) {
+ console.log("Local value for ", key, ":", localValue, "upstream", osmValue)
+ somethingChanged = true;
+ currentTags[key] = osmValue
+ }
+ }
+
+ for (const currentKey in currentTags) {
+ if (currentKey.startsWith("_")) {
+ continue
+ }
+ if(this.metatags.has(currentKey)){
+ continue
+ }
+ if (currentKey in latestTags) {
+ continue
+ }
+ console.log("Removing key as deleted upstream", currentKey)
+ delete currentTags[currentKey]
+ somethingChanged = true
+ }
+
+
+ if (somethingChanged) {
+ console.log("Detected upstream changes to the object when opening it, updating...")
+ currentTagsSource.ping()
+ } else {
+ console.debug("Fetched latest tags for ", id, "but detected no changes")
+ }
+ } catch (e) {
+ console.error("Updating the tags of selected element ", id, "failed due to", e)
+ }
}
diff --git a/Logic/Actors/TitleHandler.ts b/Logic/Actors/TitleHandler.ts
index 91ec89b0c8..d3d2f78fb2 100644
--- a/Logic/Actors/TitleHandler.ts
+++ b/Logic/Actors/TitleHandler.ts
@@ -5,6 +5,7 @@ import TagRenderingAnswer from "../../UI/Popup/TagRenderingAnswer";
import Combine from "../../UI/Base/Combine";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import {ElementStorage} from "../ElementStorage";
+import {Utils} from "../../Utils";
export default class TitleHandler {
constructor(state : {
@@ -38,6 +39,9 @@ export default class TitleHandler {
currentTitle.addCallbackAndRunD(title => {
+ if(Utils.runningFromConsole){
+ return
+ }
document.title = title
})
}
diff --git a/Logic/ImageProviders/AllImageProviders.ts b/Logic/ImageProviders/AllImageProviders.ts
index 745c367d45..5d428f2628 100644
--- a/Logic/ImageProviders/AllImageProviders.ts
+++ b/Logic/ImageProviders/AllImageProviders.ts
@@ -21,11 +21,13 @@ export default class AllImageProviders {
)
]
+
+ public static defaultKeys = [].concat(AllImageProviders.ImageAttributionSource.map(provider => provider.defaultKeyPrefixes))
private static _cache: Map> = new Map>()
- public static LoadImagesFor(tags: UIEventSource, tagKey?: string): UIEventSource {
+ public static LoadImagesFor(tags: UIEventSource, tagKey?: string[]): UIEventSource {
if (tags.data.id === undefined) {
return undefined;
}
@@ -44,7 +46,7 @@ export default class AllImageProviders {
let prefixes = imageProvider.defaultKeyPrefixes
if(tagKey !== undefined){
- prefixes = [...prefixes, tagKey]
+ prefixes = tagKey
}
const singleSource = imageProvider.GetRelevantUrls(tags, {
diff --git a/Logic/ImageProviders/ImgurUploader.ts b/Logic/ImageProviders/ImgurUploader.ts
index b8addab5a5..10bf436098 100644
--- a/Logic/ImageProviders/ImgurUploader.ts
+++ b/Logic/ImageProviders/ImgurUploader.ts
@@ -27,7 +27,8 @@ export default class ImgurUploader {
files,
function (url) {
console.log("File saved at", url);
- self.success.setData([...self.success.data, url]);
+ self.success.data.push(url)
+ self.success.ping();
self._handleSuccessUrl(url);
},
function () {
diff --git a/Logic/Osm/Changes.ts b/Logic/Osm/Changes.ts
index 6c90cccbb3..7faa234947 100644
--- a/Logic/Osm/Changes.ts
+++ b/Logic/Osm/Changes.ts
@@ -97,6 +97,7 @@ export class Changes {
console.log("Is already uploading... Abort")
return;
}
+ console.log("Uploading changes due to: ", flushreason)
this.isUploading.setData(true)
this.flushChangesAsync()
@@ -287,7 +288,7 @@ export class Changes {
v = undefined;
}
- const oldV = obj.type[k]
+ const oldV = obj.tags[k]
if (oldV === v) {
continue;
}
diff --git a/Logic/Osm/OsmObject.ts b/Logic/Osm/OsmObject.ts
index 91b4b6e89e..5d21f7d147 100644
--- a/Logic/Osm/OsmObject.ts
+++ b/Logic/Osm/OsmObject.ts
@@ -66,7 +66,9 @@ export abstract class OsmObject {
const url = `${OsmObject.backendURL}api/0.6/${id}`;
const rawData = await Utils.downloadJsonCached(url, 1000)
- return rawData.elements[0].tags
+ const tags = rawData.elements[0].tags
+ console.log("Tags are", tags)
+ return tags
}
static async DownloadObjectAsync(id: string): Promise {
@@ -263,7 +265,7 @@ export abstract class OsmObject {
continue;
}
const v = this.tags[key];
- if (v !== "") {
+ if (v !== "" && v !== undefined) {
tags += ' \n'
}
}
diff --git a/Logic/State/FeatureSwitchState.ts b/Logic/State/FeatureSwitchState.ts
index 215c819f85..2315280ca5 100644
--- a/Logic/State/FeatureSwitchState.ts
+++ b/Logic/State/FeatureSwitchState.ts
@@ -5,6 +5,7 @@ import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import {UIEventSource} from "../UIEventSource";
import {QueryParameters} from "../Web/QueryParameters";
import Constants from "../../Models/Constants";
+import {Utils} from "../../Utils";
export default class FeatureSwitchState {
@@ -137,7 +138,7 @@ export default class FeatureSwitchState {
let testingDefaultValue = false;
- if (this.featureSwitchApiURL.data !== "osm-test" &&
+ if (this.featureSwitchApiURL.data !== "osm-test" && !Utils.runningFromConsole &&
(location.hostname === "localhost" || location.hostname === "127.0.0.1")) {
testingDefaultValue = true
}
diff --git a/Logic/UIEventSource.ts b/Logic/UIEventSource.ts
index 77431441f9..0e802ad8cd 100644
--- a/Logic/UIEventSource.ts
+++ b/Logic/UIEventSource.ts
@@ -286,6 +286,9 @@ export class UIEventSource {
}
public stabilized(millisToStabilize): UIEventSource {
+ if(Utils.runningFromConsole){
+ return this;
+ }
const newSource = new UIEventSource(this.data);
From baaf66038d9cd6c16f63774c284f22745d850fd1 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 00:10:02 +0200
Subject: [PATCH 14/58] Add tests for selectedElementUpdater, fix deletion of
keys
---
test/Actors.spec.ts | 111 ++++++++++++++++++++++++++++++++++++++++++++
test/TestAll.ts | 4 +-
test/TestHelper.ts | 1 +
3 files changed, 115 insertions(+), 1 deletion(-)
create mode 100644 test/Actors.spec.ts
diff --git a/test/Actors.spec.ts b/test/Actors.spec.ts
new file mode 100644
index 0000000000..a847689772
--- /dev/null
+++ b/test/Actors.spec.ts
@@ -0,0 +1,111 @@
+import T from "./TestHelper";
+import State from "../State";
+import {AllKnownLayouts} from "../Customizations/AllKnownLayouts";
+import SelectedElementTagsUpdater from "../Logic/Actors/SelectedElementTagsUpdater";
+import UserRelatedState from "../Logic/State/UserRelatedState";
+import {Utils} from "../Utils";
+import ScriptUtils from "../scripts/ScriptUtils";
+
+export default class ActorsSpec extends T {
+
+ constructor() {
+
+ const latestTags = {
+ "amenity": "public_bookcase",
+ "books": "children;adults",
+ "capacity": "25",
+ "description": "Deze boekenruilkast vindt je recht tegenover de Pim Pam Poem",
+ "image:0": "https://i.imgur.com/Z8a69UG.jpg",
+ "name": "Stubbekwartier-buurtbibliotheek",
+ "nobrand": "yes",
+ "opening_hours": "24/7",
+ "operator": "Huisbewoner",
+ "public_bookcase:type": "reading_box"
+ }
+
+ Utils.injectJsonDownloadForTests(
+ "https://www.openstreetmap.org/api/0.6/node/5568693115",
+ {
+ "version": "0.6",
+ "generator": "CGImap 0.8.5 (1815943 spike-06.openstreetmap.org)",
+ "copyright": "OpenStreetMap and contributors",
+ "attribution": "http://www.openstreetmap.org/copyright",
+ "license": "http://opendatacommons.org/licenses/odbl/1-0/",
+ "elements": [{
+ "type": "node",
+ "id": 5568693115,
+ "lat": 51.2179199,
+ "lon": 3.2154662,
+ "timestamp": "2021-08-21T16:22:55Z",
+ "version": 6,
+ "changeset": 110034454,
+ "user": "Pieter Vander Vennet",
+ "uid": 3818858,
+ "tags": latestTags
+ }]
+ }
+ )
+
+ super("Actors", [
+ [
+ "download latest version",
+ () => {
+ const state = new UserRelatedState(AllKnownLayouts.allKnownLayouts.get("bookcases"))
+ const feature = {
+ "type": "Feature",
+ "id": "node/5568693115",
+ "properties": {
+ "amenity": "public_bookcase",
+ "books": "children;adults",
+ "capacity": "25",
+ "description": "Deze boekenruilkast vindt je recht tegenover de Pim Pam Poem",
+ "image:0": "https://i.imgur.com/Z8a69UG.jpg",
+ "name": "OUTDATED NAME",
+ "nobrand": "yes",
+ "opening_hours": "24/7",
+ "operator": "Huisbewoner",
+ "public_bookcase:type": "reading_box",
+ "id": "node/5568693115",
+ "_lat": "51.2179199",
+ "_lon": "3.2154662",
+ "fixme": "SOME FIXME"
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [
+ 3.2154662,
+ 51.2179199
+ ]
+ },
+ "bbox": {
+ "maxLat": 51.2179199,
+ "maxLon": 3.2154662,
+ "minLat": 51.2179199,
+ "minLon": 3.2154662
+ },
+ "_lon": 3.2154662,
+ "_lat": 51.2179199
+ }
+ state.allElements.addOrGetElement(feature)
+ SelectedElementTagsUpdater.installCallback(state)
+
+ // THis should trigger a download of the latest feaures and update the tags
+ // However, this doesn't work with ts-node for some reason
+ state.selectedElement.setData(feature)
+
+ SelectedElementTagsUpdater.applyUpdate(state, latestTags, feature.properties.id)
+
+ // The name should be updated
+ T.equals("Stubbekwartier-buurtbibliotheek", feature.properties.name)
+ // The fixme should be removed
+ T.equals(undefined, feature.properties.fixme)
+
+ }]
+
+
+ ]);
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/test/TestAll.ts b/test/TestAll.ts
index cf1d4d1745..9b23957d10 100644
--- a/test/TestAll.ts
+++ b/test/TestAll.ts
@@ -12,6 +12,7 @@ import {Utils} from "../Utils";
import TileFreshnessCalculatorSpec from "./TileFreshnessCalculator.spec";
import WikidataSpecTest from "./Wikidata.spec.test";
import ImageProviderSpec from "./ImageProvider.spec";
+import ActorsSpec from "./Actors.spec";
ScriptUtils.fixUtils()
@@ -27,7 +28,8 @@ const allTests = [
new SplitActionSpec(),
new TileFreshnessCalculatorSpec(),
new WikidataSpecTest(),
- new ImageProviderSpec()
+ new ImageProviderSpec(),
+ new ActorsSpec()
]
Utils.externalDownloadFunction = async (url) => {
diff --git a/test/TestHelper.ts b/test/TestHelper.ts
index b55186e7c9..ab7139160e 100644
--- a/test/TestHelper.ts
+++ b/test/TestHelper.ts
@@ -19,6 +19,7 @@ export default class T {
try {
test();
} catch (e) {
+ console.log("ERROR: ", e, e.stack)
failures.push({testsuite: this.name, name: name, msg: "" + e});
}
}
From 55937ec0c76e0782a94dba4b4908eeb4fa69151e Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 00:18:29 +0200
Subject: [PATCH 15/58] Cleanup of unused function
---
Logic/ExtraFunction.ts | 2 --
Logic/UIEventSource.ts | 17 -----------------
2 files changed, 19 deletions(-)
diff --git a/Logic/ExtraFunction.ts b/Logic/ExtraFunction.ts
index a022eb11a9..8f0265bb14 100644
--- a/Logic/ExtraFunction.ts
+++ b/Logic/ExtraFunction.ts
@@ -5,8 +5,6 @@ import State from "../State";
import BaseUIElement from "../UI/BaseUIElement";
import List from "../UI/Base/List";
import Title from "../UI/Base/Title";
-import {UIEventSourceTools} from "./UIEventSource";
-import AspectedRouting from "./Osm/aspectedRouting";
import {BBox} from "./BBox";
export interface ExtraFuncParams {
diff --git a/Logic/UIEventSource.ts b/Logic/UIEventSource.ts
index 0e802ad8cd..571c74f8e3 100644
--- a/Logic/UIEventSource.ts
+++ b/Logic/UIEventSource.ts
@@ -337,21 +337,4 @@ export class UIEventSource {
}
)
}
-}
-
-export class UIEventSourceTools {
-
- private static readonly _download_cache = new Map>()
-
- public static downloadJsonCached(url: string): UIEventSource {
- const cached = UIEventSourceTools._download_cache.get(url)
- if (cached !== undefined) {
- return cached;
- }
- const src = new UIEventSource(undefined)
- UIEventSourceTools._download_cache.set(url, src)
- Utils.downloadJson(url).then(r => src.setData(r))
- return src;
- }
-
}
\ No newline at end of file
From fd2ed950cc7c84e6ca6a993a2a90b8b2f39bac57 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 00:19:03 +0200
Subject: [PATCH 16/58] Fixed image loading (again)
---
UI/Image/ImageCarousel.ts | 4 +++-
UI/Image/ImageUploadFlow.ts | 37 ++++++++++++++++++++++++++++---------
UI/SpecialVisualizations.ts | 8 ++++----
3 files changed, 35 insertions(+), 14 deletions(-)
diff --git a/UI/Image/ImageCarousel.ts b/UI/Image/ImageCarousel.ts
index 9932da6164..43ce326821 100644
--- a/UI/Image/ImageCarousel.ts
+++ b/UI/Image/ImageCarousel.ts
@@ -9,7 +9,9 @@ import ImageProvider from "../../Logic/ImageProviders/ImageProvider";
export class ImageCarousel extends Toggle {
- constructor(images: UIEventSource<{ key: string, url: string, provider: ImageProvider }[]>, tags: UIEventSource) {
+ constructor(images: UIEventSource<{ key: string, url: string, provider: ImageProvider }[]>,
+ tags: UIEventSource,
+ keys: string[]) {
const uiElements = images.map((imageURLS: { key: string, url: string, provider: ImageProvider }[]) => {
const uiElements: BaseUIElement[] = [];
for (const url of imageURLS) {
diff --git a/UI/Image/ImageUploadFlow.ts b/UI/Image/ImageUploadFlow.ts
index 80ebe427c6..4806eef5e0 100644
--- a/UI/Image/ImageUploadFlow.ts
+++ b/UI/Image/ImageUploadFlow.ts
@@ -9,14 +9,15 @@ import LicensePicker from "../BigComponents/LicensePicker";
import Toggle from "../Input/Toggle";
import FileSelectorButton from "../Input/FileSelectorButton";
import ImgurUploader from "../../Logic/ImageProviders/ImgurUploader";
-import UploadFlowStateUI from "../BigComponents/UploadFlowStateUI";
import ChangeTagAction from "../../Logic/Osm/Actions/ChangeTagAction";
import LayerConfig from "../../Models/ThemeConfig/LayerConfig";
import {FixedUiElement} from "../Base/FixedUiElement";
+import {VariableUiElement} from "../Base/VariableUIElement";
export class ImageUploadFlow extends Toggle {
constructor(tagsSource: UIEventSource, imagePrefix: string = "image", text: string = undefined) {
+ const uploadedCount = new UIEventSource(0)
const uploader = new ImgurUploader(url => {
// A file was uploaded - we add it to the tags of the object
@@ -30,7 +31,9 @@ export class ImageUploadFlow extends Toggle {
key = imagePrefix + ":" + freeIndex;
}
console.log("Adding image:" + key, url);
- Promise.resolve(State.state.changes
+ uploadedCount.data ++
+ uploadedCount.ping()
+ Promise.resolve(State.state.changes
.applyAction(new ChangeTagAction(
tags.id, new Tag(key, url), tagsSource.data,
{
@@ -40,10 +43,6 @@ export class ImageUploadFlow extends Toggle {
)))
})
- uploader.queue.addCallbackD(q => console.log("Image upload queue is ", q))
- uploader.failed.addCallbackD(q => console.log("Image upload fail list is ", q))
- uploader.success.addCallbackD(q => console.log("Image upload success list is ", q))
-
const licensePicker = new LicensePicker()
const t = Translations.t.image;
@@ -105,10 +104,30 @@ export class ImageUploadFlow extends Toggle {
})
- const uploadStateUi = new UploadFlowStateUI(uploader.queue, uploader.failed, uploader.success)
-
const uploadFlow: BaseUIElement = new Combine([
- uploadStateUi,
+ new VariableUiElement(uploader.queue.map(q => q.length).map(l => {
+ if(l == 0){
+ return undefined;
+ }
+ if(l == 1){
+ return t.uploadingPicture.Clone().SetClass("alert")
+ }else{
+ return t.uploadingMultiple.Subs({count: "" + l}).SetClass("alert")
+ }
+ })),
+ new VariableUiElement(uploader.failed.map(q => q.length).map(l => {
+ if(l==0){
+ return undefined
+ }
+ return t.uploadFailed.Clone().SetClass("alert");
+ })),
+ new VariableUiElement(uploadedCount.map(l => {
+ if(l == 0){
+ return undefined;
+ }
+ return t.uploadDone.Clone().SetClass("thanks");
+ })),
+
fileSelector,
Translations.t.image.respectPrivacy.Clone().SetStyle("font-size:small;"),
licensePicker
diff --git a/UI/SpecialVisualizations.ts b/UI/SpecialVisualizations.ts
index 7e9ef1e65a..1882152965 100644
--- a/UI/SpecialVisualizations.ts
+++ b/UI/SpecialVisualizations.ts
@@ -83,15 +83,15 @@ export default class SpecialVisualizations {
docs: "Creates an image carousel for the given sources. An attempt will be made to guess what source is used. Supported: Wikidata identifiers, Wikipedia pages, Wikimedia categories, IMGUR (with attribution, direct links)",
args: [{
name: "image key/prefix (multiple values allowed if comma-seperated)",
- defaultValue: "image",
+ defaultValue: AllImageProviders.defaultKeys.join(","),
doc: "The keys given to the images, e.g. if image is given, the first picture URL will be added as image, the second as image:0, the third as image:1, etc... "
}],
constr: (state: State, tags, args) => {
- let imagePrefixes = undefined;
+ let imagePrefixes: string[] = undefined;
if(args.length > 0){
- imagePrefixes = args;
+ imagePrefixes = [].concat(...args.map(a => a.split(",")));
}
- return new ImageCarousel(AllImageProviders.LoadImagesFor(tags, imagePrefixes), tags);
+ return new ImageCarousel(AllImageProviders.LoadImagesFor(tags, imagePrefixes), tags, imagePrefixes);
}
},
{
From 3ac7a3c59e305fd04eab5066c35b451ad8e494c1 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 00:19:33 +0200
Subject: [PATCH 17/58] Various cleanups
---
Logic/ImageProviders/Mapillary.ts | 4 +--
Logic/Osm/OsmConnection.ts | 2 --
Logic/Osm/OsmObject.ts | 4 +--
UI/BigComponents/UploadFlowStateUI.ts | 45 ---------------------------
Utils.ts | 2 +-
5 files changed, 3 insertions(+), 54 deletions(-)
delete mode 100644 UI/BigComponents/UploadFlowStateUI.ts
diff --git a/Logic/ImageProviders/Mapillary.ts b/Logic/ImageProviders/Mapillary.ts
index 68491a5297..07e0473d4a 100644
--- a/Logic/ImageProviders/Mapillary.ts
+++ b/Logic/ImageProviders/Mapillary.ts
@@ -1,11 +1,9 @@
import ImageProvider, {ProvidedImage} from "./ImageProvider";
import BaseUIElement from "../../UI/BaseUIElement";
-import {UIEventSource} from "../UIEventSource";
import Svg from "../../Svg";
import {Utils} from "../../Utils";
import {LicenseInfo} from "./LicenseInfo";
import Constants from "../../Models/Constants";
-import {fail} from "assert";
export class Mapillary extends ImageProvider {
@@ -13,7 +11,7 @@ export class Mapillary extends ImageProvider {
public static readonly singleton = new Mapillary();
private static readonly valuePrefix = "https://a.mapillary.com"
- public static readonly valuePrefixes = [Mapillary.valuePrefix, "http://mapillary.com","https://mapillary.com"]
+ public static readonly valuePrefixes = [Mapillary.valuePrefix, "http://mapillary.com","https://mapillary.com","http://www.mapillary.com","https://www.mapillary.com"]
private static ExtractKeyFromURL(value: string, failIfNoMath = false): {
key: string,
diff --git a/Logic/Osm/OsmConnection.ts b/Logic/Osm/OsmConnection.ts
index c0795aad0c..7fd1078386 100644
--- a/Logic/Osm/OsmConnection.ts
+++ b/Logic/Osm/OsmConnection.ts
@@ -8,7 +8,6 @@ import Svg from "../../Svg";
import Img from "../../UI/Base/Img";
import {Utils} from "../../Utils";
import {OsmObject} from "./OsmObject";
-import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import {Changes} from "./Changes";
export default class UserDetails {
@@ -97,7 +96,6 @@ export class OsmConnection {
self.AttemptLogin()
}
});
- this.isLoggedIn.addCallbackAndRunD(li => console.log("User is logged in!", li))
this._dryRun = options.dryRun;
this.updateAuthObject();
diff --git a/Logic/Osm/OsmObject.ts b/Logic/Osm/OsmObject.ts
index 5d21f7d147..faf1ee79db 100644
--- a/Logic/Osm/OsmObject.ts
+++ b/Logic/Osm/OsmObject.ts
@@ -66,9 +66,7 @@ export abstract class OsmObject {
const url = `${OsmObject.backendURL}api/0.6/${id}`;
const rawData = await Utils.downloadJsonCached(url, 1000)
- const tags = rawData.elements[0].tags
- console.log("Tags are", tags)
- return tags
+ return rawData.elements[0].tags
}
static async DownloadObjectAsync(id: string): Promise {
diff --git a/UI/BigComponents/UploadFlowStateUI.ts b/UI/BigComponents/UploadFlowStateUI.ts
deleted file mode 100644
index c98c1a941a..0000000000
--- a/UI/BigComponents/UploadFlowStateUI.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import {UIEventSource} from "../../Logic/UIEventSource";
-import BaseUIElement from "../BaseUIElement";
-import {VariableUiElement} from "../Base/VariableUIElement";
-import Translations from "../i18n/Translations";
-
-/**
- * Shows that 'images are uploading', 'all images are uploaded' as relevant...
- */
-export default class UploadFlowStateUI extends VariableUiElement {
-
-
- constructor(queue: UIEventSource, failed: UIEventSource, success: UIEventSource) {
- const t = Translations.t.image;
-
- super(
- queue.map(queue => {
- const failedReasons = failed.data
- const successCount = success.data.length
- const pendingCount = queue.length - successCount - failedReasons.length;
-
- let stateMessages: BaseUIElement[] = []
-
- if (pendingCount == 1) {
- stateMessages.push(t.uploadingPicture.Clone().SetClass("alert"))
- }
- if (pendingCount > 1) {
- stateMessages.push(t.uploadingMultiple.Subs({count: "" + pendingCount}).SetClass("alert"))
- }
- if (failedReasons.length > 0) {
- stateMessages.push(t.uploadFailed.Clone().SetClass("alert"))
- }
- if (successCount > 0 && pendingCount == 0) {
- stateMessages.push(t.uploadDone.SetClass("thanks"))
- }
-
- stateMessages.forEach(msg => msg.SetStyle("display: block ruby"))
-
- return stateMessages
- }, [failed, success])
- );
-
-
- }
-
-}
\ No newline at end of file
diff --git a/Utils.ts b/Utils.ts
index 2aae7c8699..a732f1ab88 100644
--- a/Utils.ts
+++ b/Utils.ts
@@ -330,7 +330,7 @@ export class Utils {
return cached.promise
}
}
- const promise = Utils.downloadJson(url, headers)
+ const promise = /*NO AWAIT as we work with the promise directly */Utils.downloadJson(url, headers)
Utils._download_cache.set(url, {promise, timestamp: new Date().getTime()})
return await promise
}
From 668e68f87429bd1ed080c4cd59b338eb29be64b2 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 00:31:17 +0200
Subject: [PATCH 18/58] Translation reset
---
assets/layers/bike_shop/bike_shop.json | 4 +-
assets/themes/buurtnatuur/buurtnatuur.json | 1 -
langs/en.json | 3 +-
langs/layers/en.json | 2 +-
langs/layers/nl.json | 2 +-
langs/themes/de.json | 284 ++++++++--------
langs/themes/en.json | 316 +++++++++---------
langs/themes/fr.json | 192 +++++------
langs/themes/id.json | 18 +-
langs/themes/it.json | 50 +--
langs/themes/ja.json | 236 +++++++-------
langs/themes/nb_NO.json | 56 ++--
langs/themes/nl.json | 356 +++++++++++----------
langs/themes/ru.json | 36 ++-
14 files changed, 794 insertions(+), 762 deletions(-)
diff --git a/assets/layers/bike_shop/bike_shop.json b/assets/layers/bike_shop/bike_shop.json
index 8b80b5b043..6cd8890c31 100644
--- a/assets/layers/bike_shop/bike_shop.json
+++ b/assets/layers/bike_shop/bike_shop.json
@@ -174,8 +174,8 @@
"condition": "service:bicycle:diy=yes",
"render": ""
},
- { "condition": "service:bicycle:cleaning=yes",
-
+ {
+ "condition": "service:bicycle:cleaning=yes",
"render": ""
},
"defaults"
diff --git a/assets/themes/buurtnatuur/buurtnatuur.json b/assets/themes/buurtnatuur/buurtnatuur.json
index 03d04cffe9..0f1c8648a0 100644
--- a/assets/themes/buurtnatuur/buurtnatuur.json
+++ b/assets/themes/buurtnatuur/buurtnatuur.json
@@ -1,7 +1,6 @@
{
"id": "buurtnatuur",
"title": {
- "#": "DO NOT TRANSLATE THIS THEME - this one is only meant to be in dutch!",
"nl": "Breng jouw buurtnatuur in kaart"
},
"shortDescription": {
diff --git a/langs/en.json b/langs/en.json
index 8fd307d982..6b7d7723a2 100644
--- a/langs/en.json
+++ b/langs/en.json
@@ -10,7 +10,8 @@
"ccb": "under the CC-BY-license",
"uploadFailed": "Could not upload your picture. Are you connected to the Internet, and allow third party API's? The Brave browser or the uMatrix plugin might block them.",
"respectPrivacy": "Do not photograph people nor license plates. Do not upload Google Maps, Google Streetview or other copyrighted sources.",
- "uploadDone": "Your picture has been added. Thanks for helping out!",
+ "uploadDone": "Your picture has been added. Thanks for helping out!",
+ "uploadMultipleDone": "{count} pictures have been added. Thanks for helping out!",
"dontDelete": "Cancel",
"doDelete": "Remove image",
"isDeleted": "Deleted",
diff --git a/langs/layers/en.json b/langs/layers/en.json
index dd3acaee95..f32bf146e1 100644
--- a/langs/layers/en.json
+++ b/langs/layers/en.json
@@ -2376,7 +2376,7 @@
"question": "Is this street lit?"
},
"width:carriageway": {
- "question": "What is the carriage width of this road (in meters)?",
+ "question": "What is the carriage width of this road (in meters)? This is measured curb to curb and thus includes the width of parallell parking lanes",
"render": "The carriage width of this road is {width:carriageway}m"
}
},
diff --git a/langs/layers/nl.json b/langs/layers/nl.json
index b484dc8c45..fb5c7fbb88 100644
--- a/langs/layers/nl.json
+++ b/langs/layers/nl.json
@@ -2329,7 +2329,7 @@
"question": "Is deze weg verlicht?"
},
"width:carriageway": {
- "question": "Hoe breed is de rijbaan in deze straat (in meters)?",
+ "question": "Hoe breed is de rijbaan in deze straat (in meters)? Dit is Meet dit van stoepsteen tot stoepsteen, dus inclusief een parallelle parkeerstrook",
"render": "De breedte van deze rijbaan in deze straat is {width:carriageway}m"
}
},
diff --git a/langs/themes/de.json b/langs/themes/de.json
index d81b087491..f7680b81b5 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -233,21 +233,23 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "question": "Wer betreibt diesen Ort?",
- "render": "Dieser Ort wird betrieben von {operator}"
- },
- "1": {
- "mappings": {
- "0": {
- "then": "Dieser Ort hat eine Stromversorgung"
- },
- "1": {
- "then": "Dieser Ort hat keine Stromversorgung"
- }
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "Wer betreibt diesen Ort?",
+ "render": "Dieser Ort wird betrieben von {operator}"
},
- "question": "Hat dieser Ort eine Stromversorgung?"
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "Dieser Ort hat eine Stromversorgung"
+ },
+ "1": {
+ "then": "Dieser Ort hat keine Stromversorgung"
+ }
+ },
+ "question": "Hat dieser Ort eine Stromversorgung?"
+ }
}
},
"shortDescription": "Finden Sie Plätze zum Übernachten mit Ihrem Wohnmobil",
@@ -428,6 +430,113 @@
}
},
"overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "Gibt es eine (inoffizielle) Website mit mehr Informationen (z.B. Topos)?"
+ },
+ "2": {
+ "mappings": {
+ "0": {
+ "then": "Öffentlich zugänglich für jedermann"
+ },
+ "1": {
+ "then": "Zugang nur mit Genehmigung"
+ },
+ "2": {
+ "then": "Nur für Kunden"
+ },
+ "3": {
+ "then": "Nur für Vereinsmitglieder"
+ }
+ },
+ "question": "Wer hat hier Zugang?"
+ },
+ "4": {
+ "question": "Wie lang sind die Routen (durchschnittlich) in Metern?",
+ "render": "Die Routen sind durchschnittlich {canonical(climbing:length)} lang"
+ },
+ "5": {
+ "question": "Welche Schwierigkeit hat hier die leichteste Route (französisch/belgisches System)?",
+ "render": "Die leichteste Route hat hier die Schwierigkeit {climbing:grade:french:min} (französisch/belgisches System)"
+ },
+ "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)"
+ },
+ "7": {
+ "mappings": {
+ "0": {
+ "then": "Hier kann gebouldert werden"
+ },
+ "1": {
+ "then": "Hier kann nicht gebouldert werden"
+ },
+ "2": {
+ "then": "Bouldern ist hier nur an wenigen Routen möglich"
+ },
+ "3": {
+ "then": "Hier gibt es {climbing:boulder} Boulder-Routen"
+ }
+ },
+ "question": "Kann hier gebouldert werden?"
+ },
+ "8": {
+ "mappings": {
+ "0": {
+ "then": "Toprope-Klettern ist hier möglich"
+ },
+ "1": {
+ "then": "Toprope-Climbing ist hier nicht möglich"
+ },
+ "2": {
+ "then": "Hier gibt es {climbing:toprope} Toprope-Routen"
+ }
+ },
+ "question": "Ist Toprope-Klettern hier möglich?"
+ },
+ "9": {
+ "mappings": {
+ "0": {
+ "then": "Sportklettern ist hier möglich"
+ },
+ "1": {
+ "then": "Sportklettern ist hier nicht möglich"
+ },
+ "2": {
+ "then": "Hier gibt es {climbing:sport} Sportkletter-Routen"
+ }
+ },
+ "question": "Ist hier Sportklettern möglich (feste Ankerpunkte)?"
+ },
+ "10": {
+ "mappings": {
+ "0": {
+ "then": "Traditionelles Klettern ist hier möglich"
+ },
+ "1": {
+ "then": "Traditionelles Klettern ist hier nicht möglich"
+ },
+ "2": {
+ "then": "Hier gibt es {climbing:traditional} Routen für traditionelles Klettern"
+ }
+ },
+ "question": "Ist hier traditionelles Klettern möglich (eigene Sicherung z.B. mit Klemmkleilen)?"
+ },
+ "11": {
+ "mappings": {
+ "0": {
+ "then": "Hier gibt es eine Speedkletter-Wand"
+ },
+ "1": {
+ "then": "Hier gibt es keine Speedkletter-Wand"
+ },
+ "2": {
+ "then": "Hier gibt es {climbing:speed} Speedkletter-Routen"
+ }
+ },
+ "question": "Gibt es hier eine Speedkletter-Wand?"
+ }
+ },
"units+": {
"0": {
"applicableUnits": {
@@ -441,113 +550,6 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "question": "Gibt es eine (inoffizielle) Website mit mehr Informationen (z.B. Topos)?"
- },
- "2": {
- "mappings": {
- "0": {
- "then": "Öffentlich zugänglich für jedermann"
- },
- "1": {
- "then": "Zugang nur mit Genehmigung"
- },
- "2": {
- "then": "Nur für Kunden"
- },
- "3": {
- "then": "Nur für Vereinsmitglieder"
- }
- },
- "question": "Wer hat hier Zugang?"
- },
- "4": {
- "question": "Wie lang sind die Routen (durchschnittlich) in Metern?",
- "render": "Die Routen sind durchschnittlich {canonical(climbing:length)} lang"
- },
- "5": {
- "question": "Welche Schwierigkeit hat hier die leichteste Route (französisch/belgisches System)?",
- "render": "Die leichteste Route hat hier die Schwierigkeit {climbing:grade:french:min} (französisch/belgisches System)"
- },
- "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)"
- },
- "7": {
- "mappings": {
- "0": {
- "then": "Hier kann gebouldert werden"
- },
- "1": {
- "then": "Hier kann nicht gebouldert werden"
- },
- "2": {
- "then": "Bouldern ist hier nur an wenigen Routen möglich"
- },
- "3": {
- "then": "Hier gibt es {climbing:boulder} Boulder-Routen"
- }
- },
- "question": "Kann hier gebouldert werden?"
- },
- "8": {
- "mappings": {
- "0": {
- "then": "Toprope-Klettern ist hier möglich"
- },
- "1": {
- "then": "Toprope-Climbing ist hier nicht möglich"
- },
- "2": {
- "then": "Hier gibt es {climbing:toprope} Toprope-Routen"
- }
- },
- "question": "Ist Toprope-Klettern hier möglich?"
- },
- "9": {
- "mappings": {
- "0": {
- "then": "Sportklettern ist hier möglich"
- },
- "1": {
- "then": "Sportklettern ist hier nicht möglich"
- },
- "2": {
- "then": "Hier gibt es {climbing:sport} Sportkletter-Routen"
- }
- },
- "question": "Ist hier Sportklettern möglich (feste Ankerpunkte)?"
- },
- "10": {
- "mappings": {
- "0": {
- "then": "Traditionelles Klettern ist hier möglich"
- },
- "1": {
- "then": "Traditionelles Klettern ist hier nicht möglich"
- },
- "2": {
- "then": "Hier gibt es {climbing:traditional} Routen für traditionelles Klettern"
- }
- },
- "question": "Ist hier traditionelles Klettern möglich (eigene Sicherung z.B. mit Klemmkleilen)?"
- },
- "11": {
- "mappings": {
- "0": {
- "then": "Hier gibt es eine Speedkletter-Wand"
- },
- "1": {
- "then": "Hier gibt es keine Speedkletter-Wand"
- },
- "2": {
- "then": "Hier gibt es {climbing:speed} Speedkletter-Routen"
- }
- },
- "question": "Gibt es hier eine Speedkletter-Wand?"
- }
- },
"title": "Offene Kletterkarte"
},
"cycle_highways": {
@@ -594,27 +596,29 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "mappings": {
- "0": {
- "then": "Diese Straße ist eine Fahrradstraße (mit einer Geschwindigkeitsbegrenzung von 30 km/h)"
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "mappings": {
+ "0": {
+ "then": "Diese Straße ist eine Fahrradstraße (mit einer Geschwindigkeitsbegrenzung von 30 km/h)"
+ },
+ "1": {
+ "then": "Diese Straße ist eine Fahrradstraße"
+ },
+ "2": {
+ "then": "Diese Straße wird bald eine Fahrradstraße sein"
+ },
+ "3": {
+ "then": "Diese Straße ist keine Fahrradstraße"
+ }
},
- "1": {
- "then": "Diese Straße ist eine Fahrradstraße"
- },
- "2": {
- "then": "Diese Straße wird bald eine Fahrradstraße sein"
- },
- "3": {
- "then": "Diese Straße ist keine Fahrradstraße"
- }
+ "question": "Ist diese Straße eine Fahrradstraße?"
},
- "question": "Ist diese Straße eine Fahrradstraße?"
- },
- "1": {
- "question": "Wann wird diese Straße eine Fahrradstraße?",
- "render": "Diese Straße wird am {cyclestreet:start_date} zu einer Fahrradstraße"
+ "1": {
+ "question": "Wann wird diese Straße eine Fahrradstraße?",
+ "render": "Diese Straße wird am {cyclestreet:start_date} zu einer Fahrradstraße"
+ }
}
},
"shortDescription": "Eine Karte von Fahrradstraßen",
diff --git a/langs/themes/en.json b/langs/themes/en.json
index 8bf77665be..54905e2731 100644
--- a/langs/themes/en.json
+++ b/langs/themes/en.json
@@ -233,21 +233,23 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "question": "Who operates this place?",
- "render": "This place is operated by {operator}"
- },
- "1": {
- "mappings": {
- "0": {
- "then": "This place has a power supply"
- },
- "1": {
- "then": "This place does not have power supply"
- }
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "Who operates this place?",
+ "render": "This place is operated by {operator}"
},
- "question": "Does this place have a power supply?"
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "This place has a power supply"
+ },
+ "1": {
+ "then": "This place does not have power supply"
+ }
+ },
+ "question": "Does this place have a power supply?"
+ }
}
},
"shortDescription": "Find sites to spend the night with your camper",
@@ -452,6 +454,129 @@
}
},
"overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "Is there a (unofficial) website with more informations (e.g. topos)?"
+ },
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "The containing feature states that this is publicly accessible {_embedding_feature:access:description}"
+ },
+ "1": {
+ "then": "The containing feature states that a permit is needed to access {_embedding_feature:access:description}"
+ },
+ "2": {
+ "then": "The containing feature states that this is only accessible to customers {_embedding_feature:access:description}"
+ },
+ "3": {
+ "then": "The containing feature states that this is only accessible to club members {_embedding_feature:access:description}"
+ }
+ }
+ },
+ "2": {
+ "mappings": {
+ "0": {
+ "then": "Publicly accessible to anyone"
+ },
+ "1": {
+ "then": "You need a permit to access here"
+ },
+ "2": {
+ "then": "Only custumers"
+ },
+ "3": {
+ "then": "Only club members"
+ }
+ },
+ "question": "Who can access here?"
+ },
+ "4": {
+ "question": "What is the (average) length of the routes in meters?",
+ "render": "The routes are {canonical(climbing:length)} long on average"
+ },
+ "5": {
+ "question": "What is the level of the easiest route here, accoring to the french classification system?",
+ "render": "The minimal difficulty is {climbing:grade:french:min} according to the french/belgian system"
+ },
+ "6": {
+ "question": "What is the level of the most difficult route here, accoring to the french classification system?",
+ "render": "The maximal difficulty is {climbing:grade:french:max} according to the french/belgian system"
+ },
+ "7": {
+ "mappings": {
+ "0": {
+ "then": "Bouldering is possible here"
+ },
+ "1": {
+ "then": "Bouldering is not possible here"
+ },
+ "2": {
+ "then": "Bouldering is possible, allthough there are only a few routes"
+ },
+ "3": {
+ "then": "There are {climbing:boulder} boulder routes"
+ }
+ },
+ "question": "Is bouldering possible here?"
+ },
+ "8": {
+ "mappings": {
+ "0": {
+ "then": "Toprope climbing is possible here"
+ },
+ "1": {
+ "then": "Toprope climbing is not possible here"
+ },
+ "2": {
+ "then": "There are {climbing:toprope} toprope routes"
+ }
+ },
+ "question": "Is toprope climbing possible here?"
+ },
+ "9": {
+ "mappings": {
+ "0": {
+ "then": "Sport climbing is possible here"
+ },
+ "1": {
+ "then": "Sport climbing is not possible here"
+ },
+ "2": {
+ "then": "There are {climbing:sport} sport climbing routes"
+ }
+ },
+ "question": "Is sport climbing possible here on fixed anchors?"
+ },
+ "10": {
+ "mappings": {
+ "0": {
+ "then": "Traditional climbing is possible here"
+ },
+ "1": {
+ "then": "Traditional climbing is not possible here"
+ },
+ "2": {
+ "then": "There are {climbing:traditional} traditional climbing routes"
+ }
+ },
+ "question": "Is traditional climbing possible here (using own gear e.g. chocks)?"
+ },
+ "11": {
+ "mappings": {
+ "0": {
+ "then": "There is a speed climbing wall"
+ },
+ "1": {
+ "then": "There is no speed climbing wall"
+ },
+ "2": {
+ "then": "There are {climbing:speed} speed climbing walls"
+ }
+ },
+ "question": "Is there a speed climbing wall?"
+ }
+ },
"units+": {
"0": {
"applicableUnits": {
@@ -465,129 +590,6 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "question": "Is there a (unofficial) website with more informations (e.g. topos)?"
- },
- "1": {
- "mappings": {
- "0": {
- "then": "The containing feature states that this is publicly accessible {_embedding_feature:access:description}"
- },
- "1": {
- "then": "The containing feature states that a permit is needed to access {_embedding_feature:access:description}"
- },
- "2": {
- "then": "The containing feature states that this is only accessible to customers {_embedding_feature:access:description}"
- },
- "3": {
- "then": "The containing feature states that this is only accessible to club members {_embedding_feature:access:description}"
- }
- }
- },
- "2": {
- "mappings": {
- "0": {
- "then": "Publicly accessible to anyone"
- },
- "1": {
- "then": "You need a permit to access here"
- },
- "2": {
- "then": "Only custumers"
- },
- "3": {
- "then": "Only club members"
- }
- },
- "question": "Who can access here?"
- },
- "4": {
- "question": "What is the (average) length of the routes in meters?",
- "render": "The routes are {canonical(climbing:length)} long on average"
- },
- "5": {
- "question": "What is the level of the easiest route here, accoring to the french classification system?",
- "render": "The minimal difficulty is {climbing:grade:french:min} according to the french/belgian system"
- },
- "6": {
- "question": "What is the level of the most difficult route here, accoring to the french classification system?",
- "render": "The maximal difficulty is {climbing:grade:french:max} according to the french/belgian system"
- },
- "7": {
- "mappings": {
- "0": {
- "then": "Bouldering is possible here"
- },
- "1": {
- "then": "Bouldering is not possible here"
- },
- "2": {
- "then": "Bouldering is possible, allthough there are only a few routes"
- },
- "3": {
- "then": "There are {climbing:boulder} boulder routes"
- }
- },
- "question": "Is bouldering possible here?"
- },
- "8": {
- "mappings": {
- "0": {
- "then": "Toprope climbing is possible here"
- },
- "1": {
- "then": "Toprope climbing is not possible here"
- },
- "2": {
- "then": "There are {climbing:toprope} toprope routes"
- }
- },
- "question": "Is toprope climbing possible here?"
- },
- "9": {
- "mappings": {
- "0": {
- "then": "Sport climbing is possible here"
- },
- "1": {
- "then": "Sport climbing is not possible here"
- },
- "2": {
- "then": "There are {climbing:sport} sport climbing routes"
- }
- },
- "question": "Is sport climbing possible here on fixed anchors?"
- },
- "10": {
- "mappings": {
- "0": {
- "then": "Traditional climbing is possible here"
- },
- "1": {
- "then": "Traditional climbing is not possible here"
- },
- "2": {
- "then": "There are {climbing:traditional} traditional climbing routes"
- }
- },
- "question": "Is traditional climbing possible here (using own gear e.g. chocks)?"
- },
- "11": {
- "mappings": {
- "0": {
- "then": "There is a speed climbing wall"
- },
- "1": {
- "then": "There is no speed climbing wall"
- },
- "2": {
- "then": "There are {climbing:speed} speed climbing walls"
- }
- },
- "question": "Is there a speed climbing wall?"
- }
- },
"title": "Open Climbing Map"
},
"cycle_highways": {
@@ -634,27 +636,29 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "mappings": {
- "0": {
- "then": "This street is a cyclestreet (and has a speed limit of 30 km/h)"
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "mappings": {
+ "0": {
+ "then": "This street is a cyclestreet (and has a speed limit of 30 km/h)"
+ },
+ "1": {
+ "then": "This street is a cyclestreet"
+ },
+ "2": {
+ "then": "This street will become a cyclstreet soon"
+ },
+ "3": {
+ "then": "This street is not a cyclestreet"
+ }
},
- "1": {
- "then": "This street is a cyclestreet"
- },
- "2": {
- "then": "This street will become a cyclstreet soon"
- },
- "3": {
- "then": "This street is not a cyclestreet"
- }
+ "question": "Is this street a cyclestreet?"
},
- "question": "Is this street a cyclestreet?"
- },
- "1": {
- "question": "When will this street become a cyclestreet?",
- "render": "This street will become a cyclestreet at {cyclestreet:start_date}"
+ "1": {
+ "question": "When will this street become a cyclestreet?",
+ "render": "This street will become a cyclestreet at {cyclestreet:start_date}"
+ }
}
},
"shortDescription": "A map of cyclestreets",
diff --git a/langs/themes/fr.json b/langs/themes/fr.json
index 0c73fa52cb..f258a5cb04 100644
--- a/langs/themes/fr.json
+++ b/langs/themes/fr.json
@@ -225,21 +225,23 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "question": "Qui est l’exploitant du site ?",
- "render": "Ce site est exploité par {operator}"
- },
- "1": {
- "mappings": {
- "0": {
- "then": "Ce site a une source d’alimentation"
- },
- "1": {
- "then": "Ce site n’a pas de source d’alimentation"
- }
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "Qui est l’exploitant du site ?",
+ "render": "Ce site est exploité par {operator}"
},
- "question": "Ce site a-t’il une source d’électricité ?"
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "Ce site a une source d’alimentation"
+ },
+ "1": {
+ "then": "Ce site n’a pas de source d’alimentation"
+ }
+ },
+ "question": "Ce site a-t’il une source d’électricité ?"
+ }
}
},
"shortDescription": "Trouver des sites pour passer la nuit avec votre camping-car",
@@ -439,6 +441,87 @@
}
},
"overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "Existe-t’il un site avec plus d’informations (ex : topographie) ?"
+ },
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "L’élément englobant indique un accès libre {_embedding_feature:access:description}"
+ },
+ "1": {
+ "then": "L’élément englobant indique qu’ une autorisation d’accès est nécessaire {_embedding_feature:access:description}"
+ },
+ "2": {
+ "then": "L’élément englobant indique que l’accès est réservés aux clients {_embedding_feature:access:description}"
+ },
+ "3": {
+ "then": "L’élément englobant indique que l’accès est réservé aux membres {_embedding_feature:access:description}"
+ }
+ }
+ },
+ "2": {
+ "mappings": {
+ "0": {
+ "then": "Libre d’accès"
+ },
+ "1": {
+ "then": "Une autorisation est nécessaire"
+ },
+ "2": {
+ "then": "Réservé aux clients"
+ },
+ "3": {
+ "then": "Réservé aux membres"
+ }
+ },
+ "question": "Qui peut y accéder ?"
+ },
+ "4": {
+ "question": "Quelle est la longueur moyenne des voies en mètres ?",
+ "render": "Les voies font {canonical(climbing:length)} de long en moyenne"
+ },
+ "5": {
+ "question": "Quel est le niveau de la voie la plus simple selon la classification franco-belge ?",
+ "render": "La difficulté minimale est {climbing:grade:french:min} selon la classification franco-belge"
+ },
+ "6": {
+ "question": "Quel est le niveau de la voie la plus difficile selon la classification franco-belge ?",
+ "render": "La difficulté maximale est {climbing:grade:french:max} selon la classification franco-belge"
+ },
+ "7": {
+ "mappings": {
+ "0": {
+ "then": "L’escalade de bloc est possible"
+ },
+ "1": {
+ "then": "L’escalade de bloc n’est pas possible"
+ },
+ "2": {
+ "then": "L’escalade de bloc est possible sur des voies précises"
+ },
+ "3": {
+ "then": "Il y a {climbing:boulder} voies d’escalade de bloc"
+ }
+ },
+ "question": "L’escalade de bloc est-elle possible ici ?"
+ },
+ "8": {
+ "mappings": {
+ "0": {
+ "then": "L’escalade à la moulinette est possible"
+ },
+ "1": {
+ "then": "L’escalade à la moulinette n’est pas possible"
+ },
+ "2": {
+ "then": "{climbing:toprope} voies sont équipées de moulinettes"
+ }
+ },
+ "question": "Est-il possible d’escalader à la moulinette ?"
+ }
+ },
"units+": {
"0": {
"applicableUnits": {
@@ -452,87 +535,6 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "question": "Existe-t’il un site avec plus d’informations (ex : topographie) ?"
- },
- "1": {
- "mappings": {
- "0": {
- "then": "L’élément englobant indique un accès libre {_embedding_feature:access:description}"
- },
- "1": {
- "then": "L’élément englobant indique qu’ une autorisation d’accès est nécessaire {_embedding_feature:access:description}"
- },
- "2": {
- "then": "L’élément englobant indique que l’accès est réservés aux clients {_embedding_feature:access:description}"
- },
- "3": {
- "then": "L’élément englobant indique que l’accès est réservé aux membres {_embedding_feature:access:description}"
- }
- }
- },
- "2": {
- "mappings": {
- "0": {
- "then": "Libre d’accès"
- },
- "1": {
- "then": "Une autorisation est nécessaire"
- },
- "2": {
- "then": "Réservé aux clients"
- },
- "3": {
- "then": "Réservé aux membres"
- }
- },
- "question": "Qui peut y accéder ?"
- },
- "4": {
- "question": "Quelle est la longueur moyenne des voies en mètres ?",
- "render": "Les voies font {canonical(climbing:length)} de long en moyenne"
- },
- "5": {
- "question": "Quel est le niveau de la voie la plus simple selon la classification franco-belge ?",
- "render": "La difficulté minimale est {climbing:grade:french:min} selon la classification franco-belge"
- },
- "6": {
- "question": "Quel est le niveau de la voie la plus difficile selon la classification franco-belge ?",
- "render": "La difficulté maximale est {climbing:grade:french:max} selon la classification franco-belge"
- },
- "7": {
- "mappings": {
- "0": {
- "then": "L’escalade de bloc est possible"
- },
- "1": {
- "then": "L’escalade de bloc n’est pas possible"
- },
- "2": {
- "then": "L’escalade de bloc est possible sur des voies précises"
- },
- "3": {
- "then": "Il y a {climbing:boulder} voies d’escalade de bloc"
- }
- },
- "question": "L’escalade de bloc est-elle possible ici ?"
- },
- "8": {
- "mappings": {
- "0": {
- "then": "L’escalade à la moulinette est possible"
- },
- "1": {
- "then": "L’escalade à la moulinette n’est pas possible"
- },
- "2": {
- "then": "{climbing:toprope} voies sont équipées de moulinettes"
- }
- },
- "question": "Est-il possible d’escalader à la moulinette ?"
- }
- },
"title": "Open Climbing Map"
},
"cyclofix": {
diff --git a/langs/themes/id.json b/langs/themes/id.json
index b9e07e1ad1..8fd97982c5 100644
--- a/langs/themes/id.json
+++ b/langs/themes/id.json
@@ -52,14 +52,16 @@
}
}
},
- "roamingRenderings": {
- "1": {
- "mappings": {
- "0": {
- "then": "Tempat ini memiliki catu daya"
- },
- "1": {
- "then": "Tempat ini tidak memiliki sumber listrik"
+ "overrideAll": {
+ "tagRenderings+": {
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "Tempat ini memiliki catu daya"
+ },
+ "1": {
+ "then": "Tempat ini tidak memiliki sumber listrik"
+ }
}
}
}
diff --git a/langs/themes/it.json b/langs/themes/it.json
index b1a3980281..2b71cfcffa 100644
--- a/langs/themes/it.json
+++ b/langs/themes/it.json
@@ -225,21 +225,23 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "question": "Chi gestisce questo luogo?",
- "render": "Questo luogo è gestito da {operator}"
- },
- "1": {
- "mappings": {
- "0": {
- "then": "Questo luogo fornisce corrente elettrica"
- },
- "1": {
- "then": "Questo luogo non fornisce corrente elettrica"
- }
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "Chi gestisce questo luogo?",
+ "render": "Questo luogo è gestito da {operator}"
},
- "question": "Questo luogo fornisce corrente elettrica?"
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "Questo luogo fornisce corrente elettrica"
+ },
+ "1": {
+ "then": "Questo luogo non fornisce corrente elettrica"
+ }
+ },
+ "question": "Questo luogo fornisce corrente elettrica?"
+ }
}
},
"shortDescription": "Trova aree dove passare la notte con il tuo camper",
@@ -310,17 +312,19 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "mappings": {
- "3": {
- "then": "Questa strada non è una strada ciclabile"
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "mappings": {
+ "3": {
+ "then": "Questa strada non è una strada ciclabile"
+ }
}
+ },
+ "1": {
+ "question": "Questa strada diventerà una strada ciclabile quando?",
+ "render": "Questa strada diventerà una strada ciclabile dal {cyclestreet:start_date}"
}
- },
- "1": {
- "question": "Questa strada diventerà una strada ciclabile quando?",
- "render": "Questa strada diventerà una strada ciclabile dal {cyclestreet:start_date}"
}
}
},
diff --git a/langs/themes/ja.json b/langs/themes/ja.json
index a42d749bb0..de0493785d 100644
--- a/langs/themes/ja.json
+++ b/langs/themes/ja.json
@@ -225,21 +225,23 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "question": "この店は誰が経営しているんですか?",
- "render": "この場所は{operator}によって運営されます"
- },
- "1": {
- "mappings": {
- "0": {
- "then": "この場所には電源があります"
- },
- "1": {
- "then": "この場所には電源がありません"
- }
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "この店は誰が経営しているんですか?",
+ "render": "この場所は{operator}によって運営されます"
},
- "question": "この場所に電源はありますか?"
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "この場所には電源があります"
+ },
+ "1": {
+ "then": "この場所には電源がありません"
+ }
+ },
+ "question": "この場所に電源はありますか?"
+ }
}
},
"shortDescription": "キャンパーと夜を共にするキャンプサイトを見つける",
@@ -379,94 +381,96 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "question": "もっと情報のある(非公式の)ウェブサイトはありますか(例えば、topos)?"
- },
- "4": {
- "question": "ルートの(平均)長さはメートル単位でいくつですか?",
- "render": "ルートの長さは平均で{canonical(climbing:length)}です"
- },
- "5": {
- "question": "ここで一番簡単なルートのレベルは、フランスのランク評価システムで何ですか?",
- "render": "フランス/ベルギーのランク評価システムでは、最小の難易度は{climbing:grade:french:min}です"
- },
- "6": {
- "question": "フランスのランク評価によると、ここで一番難しいルートのレベルはどれくらいですか?",
- "render": "フランス/ベルギーのランク評価システムでは、最大の難易度は{climbing:grade:french:max}です"
- },
- "7": {
- "mappings": {
- "0": {
- "then": "ボルダリングはここで可能です"
- },
- "1": {
- "then": "ここではボルダリングはできません"
- },
- "2": {
- "then": "ボルダリングは可能ですが、少しのルートしかありません"
- },
- "3": {
- "then": "{climbing:boulder} ボルダールートがある"
- }
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "もっと情報のある(非公式の)ウェブサイトはありますか(例えば、topos)?"
},
- "question": "ここでボルダリングはできますか?"
- },
- "8": {
- "mappings": {
- "0": {
- "then": "ここでToprope登坂ができます"
- },
- "1": {
- "then": "ここではToprope登坂はできません"
- },
- "2": {
- "then": "{climbing:toprope} 登坂ルートがある"
- }
+ "4": {
+ "question": "ルートの(平均)長さはメートル単位でいくつですか?",
+ "render": "ルートの長さは平均で{canonical(climbing:length)}です"
},
- "question": "ここでtoprope登坂はできますか?"
- },
- "9": {
- "mappings": {
- "0": {
- "then": "ここでスポーツクライミングができます"
- },
- "1": {
- "then": "ここではスポーツクライミングはできません"
- },
- "2": {
- "then": "スポーツクライミングの {climbing:sport} ルートがある"
- }
+ "5": {
+ "question": "ここで一番簡単なルートのレベルは、フランスのランク評価システムで何ですか?",
+ "render": "フランス/ベルギーのランク評価システムでは、最小の難易度は{climbing:grade:french:min}です"
},
- "question": "ここでは固定アンカー式のスポーツクライミングはできますか?"
- },
- "10": {
- "mappings": {
- "0": {
- "then": "ここでは伝統的な登山が可能です"
- },
- "1": {
- "then": "伝統的な登山はここではできない"
- },
- "2": {
- "then": "{climbing:traditional} の伝統的な登山ルートがある"
- }
+ "6": {
+ "question": "フランスのランク評価によると、ここで一番難しいルートのレベルはどれくらいですか?",
+ "render": "フランス/ベルギーのランク評価システムでは、最大の難易度は{climbing:grade:french:max}です"
},
- "question": "伝統的な登山はここで可能ですか(例えば、チョックのような独自のギアを使用して)?"
- },
- "11": {
- "mappings": {
- "0": {
- "then": "スピードクライミングウォールがある"
+ "7": {
+ "mappings": {
+ "0": {
+ "then": "ボルダリングはここで可能です"
+ },
+ "1": {
+ "then": "ここではボルダリングはできません"
+ },
+ "2": {
+ "then": "ボルダリングは可能ですが、少しのルートしかありません"
+ },
+ "3": {
+ "then": "{climbing:boulder} ボルダールートがある"
+ }
},
- "1": {
- "then": "スピードクライミングウォールがない"
- },
- "2": {
- "then": "{climbing:speed} のスピードクライミングウォールがある"
- }
+ "question": "ここでボルダリングはできますか?"
},
- "question": "スピードクライミングウォールはありますか?"
+ "8": {
+ "mappings": {
+ "0": {
+ "then": "ここでToprope登坂ができます"
+ },
+ "1": {
+ "then": "ここではToprope登坂はできません"
+ },
+ "2": {
+ "then": "{climbing:toprope} 登坂ルートがある"
+ }
+ },
+ "question": "ここでtoprope登坂はできますか?"
+ },
+ "9": {
+ "mappings": {
+ "0": {
+ "then": "ここでスポーツクライミングができます"
+ },
+ "1": {
+ "then": "ここではスポーツクライミングはできません"
+ },
+ "2": {
+ "then": "スポーツクライミングの {climbing:sport} ルートがある"
+ }
+ },
+ "question": "ここでは固定アンカー式のスポーツクライミングはできますか?"
+ },
+ "10": {
+ "mappings": {
+ "0": {
+ "then": "ここでは伝統的な登山が可能です"
+ },
+ "1": {
+ "then": "伝統的な登山はここではできない"
+ },
+ "2": {
+ "then": "{climbing:traditional} の伝統的な登山ルートがある"
+ }
+ },
+ "question": "伝統的な登山はここで可能ですか(例えば、チョックのような独自のギアを使用して)?"
+ },
+ "11": {
+ "mappings": {
+ "0": {
+ "then": "スピードクライミングウォールがある"
+ },
+ "1": {
+ "then": "スピードクライミングウォールがない"
+ },
+ "2": {
+ "then": "{climbing:speed} のスピードクライミングウォールがある"
+ }
+ },
+ "question": "スピードクライミングウォールはありますか?"
+ }
}
},
"title": "登山地図を開く"
@@ -498,27 +502,29 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "mappings": {
- "0": {
- "then": "cyclestreet(最高速度は30km/h)"
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "mappings": {
+ "0": {
+ "then": "cyclestreet(最高速度は30km/h)"
+ },
+ "1": {
+ "then": "この通りはcyclestreetだ"
+ },
+ "2": {
+ "then": "この通りはまもなくcyclstreetになるだろう"
+ },
+ "3": {
+ "then": "この通りはcyclestreetではない"
+ }
},
- "1": {
- "then": "この通りはcyclestreetだ"
- },
- "2": {
- "then": "この通りはまもなくcyclstreetになるだろう"
- },
- "3": {
- "then": "この通りはcyclestreetではない"
- }
+ "question": "この通りはcyclestreetですか?"
},
- "question": "この通りはcyclestreetですか?"
- },
- "1": {
- "question": "この通りはいつcyclestreetになるんですか?",
- "render": "この通りは{cyclestreet:start_date}に、cyclestreetになります"
+ "1": {
+ "question": "この通りはいつcyclestreetになるんですか?",
+ "render": "この通りは{cyclestreet:start_date}に、cyclestreetになります"
+ }
}
},
"shortDescription": "cyclestreetsの地図",
diff --git a/langs/themes/nb_NO.json b/langs/themes/nb_NO.json
index dc5599dabb..d00366f03c 100644
--- a/langs/themes/nb_NO.json
+++ b/langs/themes/nb_NO.json
@@ -108,17 +108,19 @@
}
}
},
- "roamingRenderings": {
- "7": {
- "mappings": {
- "0": {
- "then": "Buldring er mulig her"
+ "overrideAll": {
+ "tagRenderings+": {
+ "7": {
+ "mappings": {
+ "0": {
+ "then": "Buldring er mulig her"
+ },
+ "1": {
+ "then": "Buldring er ikke mulig her"
+ }
},
- "1": {
- "then": "Buldring er ikke mulig her"
- }
- },
- "question": "Er buldring mulig her?"
+ "question": "Er buldring mulig her?"
+ }
}
},
"title": "Åpent klatrekart"
@@ -136,23 +138,25 @@
"name": "Alle gater"
}
},
- "roamingRenderings": {
- "0": {
- "mappings": {
- "0": {
- "then": "Denne gaten er en sykkelvei (og har en fartsgrense på 30 km/t)"
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "mappings": {
+ "0": {
+ "then": "Denne gaten er en sykkelvei (og har en fartsgrense på 30 km/t)"
+ },
+ "1": {
+ "then": "Denne gaten er en sykkelvei"
+ },
+ "2": {
+ "then": "Denne gaten vil bli sykkelvei ganske snart"
+ },
+ "3": {
+ "then": "Denne gaten er ikke en sykkelvei"
+ }
},
- "1": {
- "then": "Denne gaten er en sykkelvei"
- },
- "2": {
- "then": "Denne gaten vil bli sykkelvei ganske snart"
- },
- "3": {
- "then": "Denne gaten er ikke en sykkelvei"
- }
- },
- "question": "Er denne gaten en sykkelvei?"
+ "question": "Er denne gaten en sykkelvei?"
+ }
}
},
"shortDescription": "Et kart over sykkelveier"
diff --git a/langs/themes/nl.json b/langs/themes/nl.json
index a6322e3d5a..165e71b139 100644
--- a/langs/themes/nl.json
+++ b/langs/themes/nl.json
@@ -97,67 +97,69 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "mappings": {
- "0": {
- "then": "Dit gebied is vrij toegankelijk"
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "mappings": {
+ "0": {
+ "then": "Dit gebied is vrij toegankelijk"
+ },
+ "1": {
+ "then": "Vrij toegankelijk"
+ },
+ "2": {
+ "then": "Niet toegankelijk"
+ },
+ "3": {
+ "then": "Niet toegankelijk, want privégebied"
+ },
+ "4": {
+ "then": "Toegankelijk, ondanks dat het privegebied is"
+ },
+ "5": {
+ "then": "Enkel toegankelijk met een gids of tijdens een activiteit"
+ },
+ "6": {
+ "then": "Toegankelijk mits betaling"
+ }
},
- "1": {
- "then": "Vrij toegankelijk"
- },
- "2": {
- "then": "Niet toegankelijk"
- },
- "3": {
- "then": "Niet toegankelijk, want privégebied"
- },
- "4": {
- "then": "Toegankelijk, ondanks dat het privegebied is"
- },
- "5": {
- "then": "Enkel toegankelijk met een gids of tijdens een activiteit"
- },
- "6": {
- "then": "Toegankelijk mits betaling"
- }
+ "question": "Is dit gebied toegankelijk?",
+ "render": "De toegankelijkheid van dit gebied is: {access:description}"
},
- "question": "Is dit gebied toegankelijk?",
- "render": "De toegankelijkheid van dit gebied is: {access:description}"
- },
- "1": {
- "mappings": {
- "1": {
- "then": "Dit gebied wordt beheerd door Natuurpunt"
+ "1": {
+ "mappings": {
+ "1": {
+ "then": "Dit gebied wordt beheerd door Natuurpunt"
+ },
+ "2": {
+ "then": "Dit gebied wordt beheerd door {operator}"
+ },
+ "3": {
+ "then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos"
+ }
},
- "2": {
- "then": "Dit gebied wordt beheerd door {operator}"
+ "question": "Wie beheert dit gebied?",
+ "render": "Beheer door {operator}"
+ },
+ "2": {
+ "render": "Extra info: {description}"
+ },
+ "3": {
+ "render": "Extra info via buurtnatuur.be: {description:0}"
+ },
+ "4": {
+ "question": "Wat is de Nederlandstalige naam van dit gebied?",
+ "render": "Dit gebied heet {name:nl}"
+ },
+ "5": {
+ "mappings": {
+ "0": {
+ "then": "Dit gebied heeft geen naam"
+ }
},
- "3": {
- "then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos"
- }
- },
- "question": "Wie beheert dit gebied?",
- "render": "Beheer door {operator}"
- },
- "2": {
- "render": "Extra info: {description}"
- },
- "3": {
- "render": "Extra info via buurtnatuur.be: {description:0}"
- },
- "4": {
- "question": "Wat is de Nederlandstalige naam van dit gebied?",
- "render": "Dit gebied heet {name:nl}"
- },
- "5": {
- "mappings": {
- "0": {
- "then": "Dit gebied heeft geen naam"
- }
- },
- "question": "Wat is de naam van dit gebied?",
- "render": "Dit gebied heet {name}"
+ "question": "Wat is de naam van dit gebied?",
+ "render": "Dit gebied heet {name}"
+ }
}
},
"shortDescription": "Met deze tool kan je natuur in je buurt in kaart brengen en meer informatie geven over je favoriete plekje",
@@ -368,6 +370,106 @@
}
},
"overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "Is er een (onofficiële) website met meer informatie (b.v. met topos)?"
+ },
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "Een omvattend element geeft aan dat dit publiek toegangkelijk is {_embedding_feature:access:description}"
+ },
+ "1": {
+ "then": "Een omvattend element geeft aan dat een toelating nodig is om hier te klimmen {_embedding_feature:access:description}"
+ }
+ }
+ },
+ "4": {
+ "question": "Wat is de (gemiddelde) lengte van de klimroutes, in meter?",
+ "render": "De klimroutes zijn gemiddeld {canonical(climbing:length)} lang"
+ },
+ "5": {
+ "question": "Wat is het niveau van de makkelijkste route, volgens het Franse classificatiesysteem?",
+ "render": "De minimale klimmoeilijkheid is {climbing:grade:french:min} volgens het Franse/Belgische systeem"
+ },
+ "6": {
+ "question": "Wat is het niveau van de moeilijkste route, volgens het Franse classificatiesysteem?",
+ "render": "De maximale klimmoeilijkheid is {climbing:grade:french:max} volgens het Franse/Belgische systeem"
+ },
+ "7": {
+ "mappings": {
+ "0": {
+ "then": "Bolderen kan hier"
+ },
+ "1": {
+ "then": "Bolderen kan hier niet"
+ },
+ "2": {
+ "then": "Bolderen kan hier, maar er zijn niet zoveel routes"
+ },
+ "3": {
+ "then": "Er zijn hier {climbing:boulder} bolderroutes"
+ }
+ },
+ "question": "Is het mogelijk om hier te bolderen?"
+ },
+ "8": {
+ "mappings": {
+ "0": {
+ "then": "Toprope-klimmen kan hier"
+ },
+ "1": {
+ "then": "Toprope-klimmen kan hier niet"
+ },
+ "2": {
+ "then": "Er zijn hier {climbing:toprope} toprope routes"
+ }
+ },
+ "question": "Is het mogelijk om hier te toprope-klimmen?"
+ },
+ "9": {
+ "mappings": {
+ "0": {
+ "then": "Sportklimmen/voorklimmen kan hier"
+ },
+ "1": {
+ "then": "Sportklimmen/voorklimmen kan hier niet"
+ },
+ "2": {
+ "then": "Er zijn hier {climbing:sport} sportklimroutes/voorklimroutes"
+ }
+ },
+ "question": "Is het mogelijk om hier te sportklimmen/voorklimmen op reeds aangebrachte haken?"
+ },
+ "10": {
+ "mappings": {
+ "0": {
+ "then": "Traditioneel klimmen kan hier"
+ },
+ "1": {
+ "then": "Traditioneel klimmen kan hier niet"
+ },
+ "2": {
+ "then": "Er zijn hier {climbing:traditional} traditionele klimroutes"
+ }
+ },
+ "question": "Is het mogelijk om hier traditioneel te klimmen? (Dit is klimmen met klemblokjes en friends)"
+ },
+ "11": {
+ "mappings": {
+ "0": {
+ "then": "Er is een snelklimmuur voor speed climbing"
+ },
+ "1": {
+ "then": "Er is geen snelklimmuur voor speed climbing"
+ },
+ "2": {
+ "then": "Er zijn hier {climbing:speed} snelklimmuren"
+ }
+ },
+ "question": "Is er een snelklimmuur (speed climbing)?"
+ }
+ },
"units+": {
"0": {
"applicableUnits": {
@@ -381,106 +483,6 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "question": "Is er een (onofficiële) website met meer informatie (b.v. met topos)?"
- },
- "1": {
- "mappings": {
- "0": {
- "then": "Een omvattend element geeft aan dat dit publiek toegangkelijk is {_embedding_feature:access:description}"
- },
- "1": {
- "then": "Een omvattend element geeft aan dat een toelating nodig is om hier te klimmen {_embedding_feature:access:description}"
- }
- }
- },
- "4": {
- "question": "Wat is de (gemiddelde) lengte van de klimroutes, in meter?",
- "render": "De klimroutes zijn gemiddeld {canonical(climbing:length)} lang"
- },
- "5": {
- "question": "Wat is het niveau van de makkelijkste route, volgens het Franse classificatiesysteem?",
- "render": "De minimale klimmoeilijkheid is {climbing:grade:french:min} volgens het Franse/Belgische systeem"
- },
- "6": {
- "question": "Wat is het niveau van de moeilijkste route, volgens het Franse classificatiesysteem?",
- "render": "De maximale klimmoeilijkheid is {climbing:grade:french:max} volgens het Franse/Belgische systeem"
- },
- "7": {
- "mappings": {
- "0": {
- "then": "Bolderen kan hier"
- },
- "1": {
- "then": "Bolderen kan hier niet"
- },
- "2": {
- "then": "Bolderen kan hier, maar er zijn niet zoveel routes"
- },
- "3": {
- "then": "Er zijn hier {climbing:boulder} bolderroutes"
- }
- },
- "question": "Is het mogelijk om hier te bolderen?"
- },
- "8": {
- "mappings": {
- "0": {
- "then": "Toprope-klimmen kan hier"
- },
- "1": {
- "then": "Toprope-klimmen kan hier niet"
- },
- "2": {
- "then": "Er zijn hier {climbing:toprope} toprope routes"
- }
- },
- "question": "Is het mogelijk om hier te toprope-klimmen?"
- },
- "9": {
- "mappings": {
- "0": {
- "then": "Sportklimmen/voorklimmen kan hier"
- },
- "1": {
- "then": "Sportklimmen/voorklimmen kan hier niet"
- },
- "2": {
- "then": "Er zijn hier {climbing:sport} sportklimroutes/voorklimroutes"
- }
- },
- "question": "Is het mogelijk om hier te sportklimmen/voorklimmen op reeds aangebrachte haken?"
- },
- "10": {
- "mappings": {
- "0": {
- "then": "Traditioneel klimmen kan hier"
- },
- "1": {
- "then": "Traditioneel klimmen kan hier niet"
- },
- "2": {
- "then": "Er zijn hier {climbing:traditional} traditionele klimroutes"
- }
- },
- "question": "Is het mogelijk om hier traditioneel te klimmen? (Dit is klimmen met klemblokjes en friends)"
- },
- "11": {
- "mappings": {
- "0": {
- "then": "Er is een snelklimmuur voor speed climbing"
- },
- "1": {
- "then": "Er is geen snelklimmuur voor speed climbing"
- },
- "2": {
- "then": "Er zijn hier {climbing:speed} snelklimmuren"
- }
- },
- "question": "Is er een snelklimmuur (speed climbing)?"
- }
- },
"title": "Open klimkaart"
},
"cycle_infra": {
@@ -515,27 +517,29 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "mappings": {
- "0": {
- "then": "Deze straat is een fietsstraat (en dus zone 30)"
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "mappings": {
+ "0": {
+ "then": "Deze straat is een fietsstraat (en dus zone 30)"
+ },
+ "1": {
+ "then": "Deze straat i een fietsstraat"
+ },
+ "2": {
+ "then": "Deze straat wordt binnenkort een fietsstraat"
+ },
+ "3": {
+ "then": "Deze straat is geen fietsstraat"
+ }
},
- "1": {
- "then": "Deze straat i een fietsstraat"
- },
- "2": {
- "then": "Deze straat wordt binnenkort een fietsstraat"
- },
- "3": {
- "then": "Deze straat is geen fietsstraat"
- }
+ "question": "Is deze straat een fietsstraat?"
},
- "question": "Is deze straat een fietsstraat?"
- },
- "1": {
- "question": "Wanneer wordt deze straat een fietsstraat?",
- "render": "Deze straat wordt fietsstraat op {cyclestreet:start_date}"
+ "1": {
+ "question": "Wanneer wordt deze straat een fietsstraat?",
+ "render": "Deze straat wordt fietsstraat op {cyclestreet:start_date}"
+ }
}
},
"shortDescription": "Een kaart met alle gekende fietsstraten",
diff --git a/langs/themes/ru.json b/langs/themes/ru.json
index e473c91cee..6923005264 100644
--- a/langs/themes/ru.json
+++ b/langs/themes/ru.json
@@ -269,24 +269,26 @@
}
}
},
- "roamingRenderings": {
- "0": {
- "question": "Есть ли (неофициальный) веб-сайт с более подробной информацией (напр., topos)?"
- },
- "2": {
- "mappings": {
- "3": {
- "then": "Только членам клуба"
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "Есть ли (неофициальный) веб-сайт с более подробной информацией (напр., topos)?"
+ },
+ "2": {
+ "mappings": {
+ "3": {
+ "then": "Только членам клуба"
+ }
}
- }
- },
- "9": {
- "mappings": {
- "0": {
- "then": "Здесь можно заняться спортивным скалолазанием"
- },
- "1": {
- "then": "Спортивное скалолазание здесь невозможно"
+ },
+ "9": {
+ "mappings": {
+ "0": {
+ "then": "Здесь можно заняться спортивным скалолазанием"
+ },
+ "1": {
+ "then": "Спортивное скалолазание здесь невозможно"
+ }
}
}
}
From 1c4cf78a03caf0abbe748ff49e1ea9648c341038 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 00:34:26 +0200
Subject: [PATCH 19/58] Fix image upload status indication
---
UI/Image/ImageUploadFlow.ts | 15 +++++++++++++--
assets/themes/cyclestreets/cyclestreets.json | 6 ++++--
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/UI/Image/ImageUploadFlow.ts b/UI/Image/ImageUploadFlow.ts
index 4806eef5e0..c0407c2089 100644
--- a/UI/Image/ImageUploadFlow.ts
+++ b/UI/Image/ImageUploadFlow.ts
@@ -16,8 +16,16 @@ import {VariableUiElement} from "../Base/VariableUIElement";
export class ImageUploadFlow extends Toggle {
+
+ private static readonly uploadCountsPerId = new Map>()
+
constructor(tagsSource: UIEventSource, imagePrefix: string = "image", text: string = undefined) {
- const uploadedCount = new UIEventSource(0)
+ const perId = ImageUploadFlow.uploadCountsPerId
+ const id = tagsSource.data.id
+ if(!perId.has(id)){
+ perId.set(id, new UIEventSource(0))
+ }
+ const uploadedCount = perId.get(id)
const uploader = new ImgurUploader(url => {
// A file was uploaded - we add it to the tags of the object
@@ -125,7 +133,10 @@ export class ImageUploadFlow extends Toggle {
if(l == 0){
return undefined;
}
- return t.uploadDone.Clone().SetClass("thanks");
+ if(l == 1){
+ return t.uploadDone.Clone().SetClass("thanks");
+ }
+ return t.uploadMultipleDone.Subs({count: l}).SetClass("thanks")
})),
fileSelector,
diff --git a/assets/themes/cyclestreets/cyclestreets.json b/assets/themes/cyclestreets/cyclestreets.json
index 23343c762c..9f332e1576 100644
--- a/assets/themes/cyclestreets/cyclestreets.json
+++ b/assets/themes/cyclestreets/cyclestreets.json
@@ -207,7 +207,8 @@
"overrideAll": {
"allowSplit": true,
"tagRenderings+": [
- {"id": "is_cyclestreet",
+ {
+ "id": "is_cyclestreet",
"question": {
"nl": "Is deze straat een fietsstraat?",
"en": "Is this street a cyclestreet?",
@@ -283,7 +284,8 @@
}
]
},
- {"id": "future_cyclestreet",
+ {
+ "id": "future_cyclestreet",
"question": {
"nl": "Wanneer wordt deze straat een fietsstraat?",
"en": "When will this street become a cyclestreet?",
From 196d76d9dc8736667956ad803cf5aed15f3b682e Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 01:13:55 +0200
Subject: [PATCH 20/58] Fix: opening the popup if defined in the hash
---
Logic/Actors/SelectedFeatureHandler.ts | 146 ++++++++++++++++---------
UI/DefaultGUI.ts | 63 +++++++----
test/Actors.spec.ts | 40 ++++++-
3 files changed, 174 insertions(+), 75 deletions(-)
diff --git a/Logic/Actors/SelectedFeatureHandler.ts b/Logic/Actors/SelectedFeatureHandler.ts
index 73e69d72cd..b45e87b931 100644
--- a/Logic/Actors/SelectedFeatureHandler.ts
+++ b/Logic/Actors/SelectedFeatureHandler.ts
@@ -3,15 +3,20 @@ import {OsmObject} from "../Osm/OsmObject";
import Loc from "../../Models/Loc";
import {ElementStorage} from "../ElementStorage";
import FeaturePipeline from "../FeatureSource/FeaturePipeline";
+import {GeoOperations} from "../GeoOperations";
+import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
/**
* Makes sure the hash shows the selected element and vice-versa.
*/
export default class SelectedFeatureHandler {
private static readonly _no_trigger_on = new Set(["welcome", "copyright", "layers", "new", "", undefined])
- hash: UIEventSource;
+ private readonly hash: UIEventSource;
private readonly state: {
- selectedElement: UIEventSource
+ selectedElement: UIEventSource,
+ allElements: ElementStorage,
+ locationControl: UIEventSource,
+ layoutToUse: LayoutConfig
}
constructor(
@@ -19,7 +24,9 @@ export default class SelectedFeatureHandler {
state: {
selectedElement: UIEventSource,
allElements: ElementStorage,
- featurePipeline: FeaturePipeline
+ featurePipeline: FeaturePipeline,
+ locationControl: UIEventSource,
+ layoutToUse: LayoutConfig
}
) {
this.hash = hash;
@@ -27,30 +34,9 @@ export default class SelectedFeatureHandler {
// If the hash changes, set the selected element correctly
- function setSelectedElementFromHash(h){
- if (h === undefined || h === "") {
- // Hash has been cleared - we clear the selected element
- state.selectedElement.setData(undefined);
- }else{
- // we search the element to select
- const feature = state.allElements.ContainingFeatures.get(h)
- if(feature === undefined){
- return;
- }
- const currentlySeleced = state.selectedElement.data
- if(currentlySeleced === undefined){
- state.selectedElement.setData(feature)
- return;
- }
- if(currentlySeleced.properties?.id === feature.properties.id){
- // We already have the right feature
- return;
- }
- state.selectedElement.setData(feature)
- }
- }
- hash.addCallback(setSelectedElementFromHash)
+ const self = this;
+ hash.addCallback(() => self.setSelectedElementFromHash())
// IF the selected element changes, set the hash correctly
@@ -66,41 +52,103 @@ export default class SelectedFeatureHandler {
hash.setData(h)
}
})
-
- state.featurePipeline.newDataLoadedSignal.addCallbackAndRunD(_ => {
+
+ state.featurePipeline?.newDataLoadedSignal?.addCallbackAndRunD(_ => {
// New data was loaded. In initial startup, the hash might be set (via the URL) but might not be selected yet
- if(hash.data === undefined || SelectedFeatureHandler._no_trigger_on.has(hash.data)){
+ if (hash.data === undefined || SelectedFeatureHandler._no_trigger_on.has(hash.data)) {
// This is an invalid hash anyway
return;
}
- if(state.selectedElement.data !== undefined){
+ if (state.selectedElement.data !== undefined) {
// We already have something selected
return;
}
- setSelectedElementFromHash(hash.data)
+ self.setSelectedElementFromHash()
+ })
+
+
+ this.initialLoad()
+
+ }
+
+
+ /**
+ * On startup: check if the hash is loaded and eventually zoom to it
+ * @private
+ */
+ private initialLoad() {
+ const hash = this.hash.data
+ if (hash === undefined || hash === "" || hash.indexOf("-") >= 0) {
+ return;
+ }
+ if (SelectedFeatureHandler._no_trigger_on.has(hash)) {
+ return;
+ }
+
+ OsmObject.DownloadObjectAsync(hash).then(obj => {
+
+ try {
+
+ console.log("Downloaded selected object from OSM-API for initial load: ", hash)
+ const geojson = obj.asGeoJson()
+ this.state.allElements.addOrGetElement(geojson)
+ this.state.selectedElement.setData(geojson)
+ this.zoomToSelectedFeature()
+ } catch (e) {
+ console.error(e)
+ }
+
})
}
- // If a feature is selected via the hash, zoom there
- public zoomToSelectedFeature(location: UIEventSource) {
- const hash = this.hash.data;
- if (hash === undefined || SelectedFeatureHandler._no_trigger_on.has(hash)) {
- return; // No valid feature selected
- }
- // We should have a valid osm-ID and zoom to it... But we wrap it in try-catch to be sure
- try {
-
- OsmObject.DownloadObject(hash).addCallbackAndRunD(element => {
- const centerpoint = element.centerpoint();
- console.log("Zooming to location for select point: ", centerpoint)
- location.data.lat = centerpoint[0]
- location.data.lon = centerpoint[1]
- location.ping();
- })
- } catch (e) {
- console.error("Could not download OSM-object with id", hash, " - probably a weird hash")
+ private setSelectedElementFromHash() {
+ const state = this.state
+ const h = this.hash.data
+ if (h === undefined || h === "") {
+ // Hash has been cleared - we clear the selected element
+ state.selectedElement.setData(undefined);
+ } else {
+ // we search the element to select
+ const feature = state.allElements.ContainingFeatures.get(h)
+ if (feature === undefined) {
+ return;
+ }
+ const currentlySeleced = state.selectedElement.data
+ if (currentlySeleced === undefined) {
+ state.selectedElement.setData(feature)
+ return;
+ }
+ if (currentlySeleced.properties?.id === feature.properties.id) {
+ // We already have the right feature
+ return;
+ }
+ state.selectedElement.setData(feature)
}
}
+ // If a feature is selected via the hash, zoom there
+ private zoomToSelectedFeature() {
+
+ const selected = this.state.selectedElement.data
+ if(selected === undefined){
+ return
+ }
+
+ const centerpoint= GeoOperations.centerpointCoordinates(selected)
+ const location = this.state.locationControl;
+ location.data.lon = centerpoint[0]
+ location.data.lat = centerpoint[1]
+
+ const minZoom = Math.max(14, ...(this.state.layoutToUse?.layers?.map(l => l.minzoomVisible) ?? []))
+ if(location.data.zoom < minZoom ){
+ location.data.zoom = minZoom
+ }
+
+ location.ping();
+
+
+
+ }
+
}
\ No newline at end of file
diff --git a/UI/DefaultGUI.ts b/UI/DefaultGUI.ts
index 5c7f1b9a6b..c6416fe390 100644
--- a/UI/DefaultGUI.ts
+++ b/UI/DefaultGUI.ts
@@ -23,6 +23,10 @@ import ScrollableFullScreen from "./Base/ScrollableFullScreen";
import Translations from "./i18n/Translations";
import SimpleAddUI from "./BigComponents/SimpleAddUI";
import StrayClickHandler from "../Logic/Actors/StrayClickHandler";
+import Lazy from "./Base/Lazy";
+import ShowDataMultiLayer from "./ShowDataLayer/ShowDataMultiLayer";
+import StaticFeatureSource from "../Logic/FeatureSource/Sources/StaticFeatureSource";
+import FilteredLayer from "../Models/FilteredLayer";
export class DefaultGuiState {
public readonly welcomeMessageIsOpened;
@@ -81,12 +85,22 @@ export default class DefaultGUI {
constructor(state: FeaturePipelineState, guiState: DefaultGuiState) {
this.state = state;
this._guiState = guiState;
- const self = this;
if (state.layoutToUse.customCss !== undefined) {
Utils.LoadCustomCss(state.layoutToUse.customCss);
}
+
+ this.SetupUIElements();
+ this.SetupMap()
+
+ }
+
+
+ private SetupMap(){
+ const state = this.state;
+ const guiState = this._guiState;
+
// Attach the map
state.mainMapObject.SetClass("w-full h-full")
.AttachTo("leafletDiv")
@@ -96,8 +110,28 @@ export default class DefaultGUI {
state
)
- this.InitWelcomeMessage();
+ new ShowDataLayer({
+ leafletMap: state.leafletMap,
+ layerToShow: AllKnownLayers.sharedLayers.get("home_location"),
+ features: state.homeLocation,
+ enablePopups: false,
+ })
+
+ state.leafletMap.addCallbackAndRunD(_ => {
+ // Lets assume that all showDataLayers are initialized at this point
+ state.selectedElement.ping()
+ State.state.locationControl.ping();
+ return true;
+ })
+
+ }
+
+ private SetupUIElements(){
+ const state = this.state;
+ const guiState = this._guiState;
+
+ const self =this
Toggle.If(state.featureSwitchUserbadge,
() => new UserBadge(state)
).AttachTo("userbadge")
@@ -119,36 +153,21 @@ export default class DefaultGUI {
}
- new Toggle(self.InitWelcomeMessage(),
- Toggle.If(state.featureSwitchIframePopoutEnabled, iframePopout),
+ new Toggle(new Lazy(() => self.InitWelcomeMessage()),
+ Toggle.If(state.featureSwitchIframePopoutEnabled, iframePopout),
state.featureSwitchWelcomeMessage
).AttachTo("messagesbox");
new LeftControls(state, guiState).AttachTo("bottom-left");
new RightControls(state).AttachTo("bottom-right");
- State.state.locationControl.ping();
+
new CenterMessageBox(state).AttachTo("centermessage");
document
.getElementById("centermessage")
.classList.add("pointer-events-none");
-
-
- new ShowDataLayer({
- leafletMap: state.leafletMap,
- layerToShow: AllKnownLayers.sharedLayers.get("home_location"),
- features: state.homeLocation,
- enablePopups: false,
- })
-
- state.leafletMap.addCallbackAndRunD(_ => {
- // Lets assume that all showDataLayers are initialized at this point
- state.selectedElement.ping()
- return true;
- })
-
}
- private InitWelcomeMessage() {
+ private InitWelcomeMessage() : BaseUIElement{
const isOpened = this._guiState.welcomeMessageIsOpened
const fullOptions = new FullWelcomePaneWithTabs(isOpened, this._guiState.welcomeMessageOpenedTab, this.state);
@@ -180,7 +199,7 @@ export default class DefaultGUI {
public setupClickDialogOnMap(filterViewIsOpened: UIEventSource, state: FeaturePipelineState) {
- function setup(){
+ function setup() {
let presetCount = 0;
for (const layer of state.layoutToUse.layers) {
for (const preset of layer.presets) {
diff --git a/test/Actors.spec.ts b/test/Actors.spec.ts
index a847689772..b53cfd5c7b 100644
--- a/test/Actors.spec.ts
+++ b/test/Actors.spec.ts
@@ -5,11 +5,15 @@ import SelectedElementTagsUpdater from "../Logic/Actors/SelectedElementTagsUpdat
import UserRelatedState from "../Logic/State/UserRelatedState";
import {Utils} from "../Utils";
import ScriptUtils from "../scripts/ScriptUtils";
+import SelectedFeatureHandler from "../Logic/Actors/SelectedFeatureHandler";
+import {UIEventSource} from "../Logic/UIEventSource";
+import {ElementStorage} from "../Logic/ElementStorage";
+import Loc from "../Models/Loc";
export default class ActorsSpec extends T {
constructor() {
-
+
const latestTags = {
"amenity": "public_bookcase",
"books": "children;adults",
@@ -22,7 +26,7 @@ export default class ActorsSpec extends T {
"operator": "Huisbewoner",
"public_bookcase:type": "reading_box"
}
-
+
Utils.injectJsonDownloadForTests(
"https://www.openstreetmap.org/api/0.6/node/5568693115",
{
@@ -92,7 +96,7 @@ export default class ActorsSpec extends T {
// THis should trigger a download of the latest feaures and update the tags
// However, this doesn't work with ts-node for some reason
state.selectedElement.setData(feature)
-
+
SelectedElementTagsUpdater.applyUpdate(state, latestTags, feature.properties.id)
// The name should be updated
@@ -100,7 +104,35 @@ export default class ActorsSpec extends T {
// The fixme should be removed
T.equals(undefined, feature.properties.fixme)
- }]
+ }],
+ ["Hash without selected element should download geojson from OSM-API", async () => {
+ const hash = new UIEventSource("node/5568693115")
+ const selected = new UIEventSource(undefined)
+ const loc = new UIEventSource({
+ lat: 0,
+ lon: 0,
+ zoom: 0
+ })
+
+
+ loc.addCallback(_ => {
+ T.equals("node/5568693115", selected.data.properties.id)
+ T.equals(14, loc.data.zoom)
+ T.equals( 51.2179199, loc.data.lat)
+ })
+
+ new SelectedFeatureHandler(hash, {
+ selectedElement: selected,
+ allElements: new ElementStorage(),
+ featurePipeline: undefined,
+ locationControl: loc,
+ layoutToUse: undefined
+ })
+
+
+
+
+ }]
]);
From 914c12ce211874fa7da085a0af28d3f269bb448f Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 01:18:40 +0200
Subject: [PATCH 21/58] Update dependency on leaflet-providers, fix #469
---
package-lock.json | 14 +++++++-------
package.json | 2 +-
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index a21cb12e71..ca84f2e65b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -30,7 +30,7 @@
"jspdf": "^2.3.1",
"latlon2country": "^1.1.3",
"leaflet": "^1.7.1",
- "leaflet-providers": "^1.10.2",
+ "leaflet-providers": "^1.13.0",
"leaflet-simple-map-screenshoter": "^0.4.4",
"leaflet.markercluster": "^1.4.1",
"libphonenumber": "0.0.10",
@@ -10035,9 +10035,9 @@
"integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw=="
},
"node_modules/leaflet-providers": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/leaflet-providers/-/leaflet-providers-1.12.0.tgz",
- "integrity": "sha512-pU/mR4B+NbayBGCg5/88dmRq7t1EGiNPhsVGV3yqHuDn594vIwus4CiPVW0RtiKJNKg8Vf1pILAbFl0i+yk+lQ=="
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/leaflet-providers/-/leaflet-providers-1.13.0.tgz",
+ "integrity": "sha512-f/sN5wdgBbVA2jcCYzScIfYNxKdn2wBJP9bu+5cRX9Xj6g8Bt1G9Sr8WgJAt/ckIFIc3LVVxCBNFpSCfTuUElg=="
},
"node_modules/leaflet-simple-map-screenshoter": {
"version": "0.4.4",
@@ -25965,9 +25965,9 @@
"integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw=="
},
"leaflet-providers": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/leaflet-providers/-/leaflet-providers-1.12.0.tgz",
- "integrity": "sha512-pU/mR4B+NbayBGCg5/88dmRq7t1EGiNPhsVGV3yqHuDn594vIwus4CiPVW0RtiKJNKg8Vf1pILAbFl0i+yk+lQ=="
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/leaflet-providers/-/leaflet-providers-1.13.0.tgz",
+ "integrity": "sha512-f/sN5wdgBbVA2jcCYzScIfYNxKdn2wBJP9bu+5cRX9Xj6g8Bt1G9Sr8WgJAt/ckIFIc3LVVxCBNFpSCfTuUElg=="
},
"leaflet-simple-map-screenshoter": {
"version": "0.4.4",
diff --git a/package.json b/package.json
index f480e7dc00..ea7d04f0f6 100644
--- a/package.json
+++ b/package.json
@@ -77,7 +77,7 @@
"jspdf": "^2.3.1",
"latlon2country": "^1.1.3",
"leaflet": "^1.7.1",
- "leaflet-providers": "^1.10.2",
+ "leaflet-providers": "^1.13.0",
"leaflet-simple-map-screenshoter": "^0.4.4",
"leaflet.markercluster": "^1.4.1",
"libphonenumber": "0.0.10",
From b7c68614841c89036c9c215256b96f0ec420d1bd Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 01:26:39 +0200
Subject: [PATCH 22/58] Add failsafe: overpass will stop redownloading if the
features have been fetched by other sources and will pick the new bounds when
redownloading
---
Logic/Actors/OverpassFeatureSource.ts | 67 ++++++++++++++-------------
UI/DefaultGUI.ts | 3 --
2 files changed, 35 insertions(+), 35 deletions(-)
diff --git a/Logic/Actors/OverpassFeatureSource.ts b/Logic/Actors/OverpassFeatureSource.ts
index 5062133b68..e48ae2a3f9 100644
--- a/Logic/Actors/OverpassFeatureSource.ts
+++ b/Logic/Actors/OverpassFeatureSource.ts
@@ -29,7 +29,7 @@ export default class OverpassFeatureSource implements FeatureSource {
private readonly retries: UIEventSource = new UIEventSource(0);
-
+
private readonly state: {
readonly locationControl: UIEventSource,
readonly layoutToUse: LayoutConfig,
@@ -39,6 +39,7 @@ export default class OverpassFeatureSource implements FeatureSource {
}
private readonly _isActive: UIEventSource;
private readonly onBboxLoaded: (bbox: BBox, date: Date, layers: LayerConfig[], zoomlevel: number) => void;
+
constructor(
state: {
readonly locationControl: UIEventSource,
@@ -90,7 +91,7 @@ export default class OverpassFeatureSource implements FeatureSource {
}
const self = this;
this.updateAsync(paddedZoomLevel).then(bboxDate => {
- if(bboxDate === undefined || self.onBboxLoaded === undefined){
+ if (bboxDate === undefined || self.onBboxLoaded === undefined) {
return;
}
const [bbox, date, layers] = bboxDate
@@ -109,41 +110,43 @@ export default class OverpassFeatureSource implements FeatureSource {
return undefined;
}
- const bounds = this.state.currentBounds.data?.pad(this.state.layoutToUse.widenFactor)?.expandToTileBounds(padToZoomLevel);
-
- if (bounds === undefined) {
- return undefined;
- }
- const self = this;
-
-
- const layersToDownload = []
- for (const layer of this.state.layoutToUse.layers) {
-
- if (typeof (layer) === "string") {
- throw "A layer was not expanded!"
- }
- if(this.state.locationControl.data.zoom < layer.minzoom){
- continue;
- }
- if (layer.doNotDownload) {
- continue;
- }
- if (layer.source.geojsonSource !== undefined) {
- // Not our responsibility to download this layer!
- continue;
- }
- layersToDownload.push(layer)
- }
-
let data: any = undefined
let date: Date = undefined
- const overpassUrls = self.state.overpassUrl.data
let lastUsed = 0;
+
+
+ const layersToDownload = []
+ for (const layer of this.state.layoutToUse.layers) {
+
+ if (typeof (layer) === "string") {
+ throw "A layer was not expanded!"
+ }
+ if (this.state.locationControl.data.zoom < layer.minzoom) {
+ continue;
+ }
+ if (layer.doNotDownload) {
+ continue;
+ }
+ if (layer.source.geojsonSource !== undefined) {
+ // Not our responsibility to download this layer!
+ continue;
+ }
+ layersToDownload.push(layer)
+ }
+
+ const self = this;
+ const overpassUrls = self.state.overpassUrl.data
+ let bounds : BBox
do {
try {
-
+
+ bounds = this.state.currentBounds.data?.pad(this.state.layoutToUse.widenFactor)?.expandToTileBounds(padToZoomLevel);
+
+ if (bounds === undefined) {
+ return undefined;
+ }
+
const overpass = this.GetFilter(overpassUrls[lastUsed], layersToDownload);
if (overpass === undefined) {
@@ -175,7 +178,7 @@ export default class OverpassFeatureSource implements FeatureSource {
}
}
}
- } while (data === undefined);
+ } while (data === undefined && this._isActive.data);
self.retries.setData(0);
try {
diff --git a/UI/DefaultGUI.ts b/UI/DefaultGUI.ts
index c6416fe390..fc195f90d7 100644
--- a/UI/DefaultGUI.ts
+++ b/UI/DefaultGUI.ts
@@ -24,9 +24,6 @@ import Translations from "./i18n/Translations";
import SimpleAddUI from "./BigComponents/SimpleAddUI";
import StrayClickHandler from "../Logic/Actors/StrayClickHandler";
import Lazy from "./Base/Lazy";
-import ShowDataMultiLayer from "./ShowDataLayer/ShowDataMultiLayer";
-import StaticFeatureSource from "../Logic/FeatureSource/Sources/StaticFeatureSource";
-import FilteredLayer from "../Models/FilteredLayer";
export class DefaultGuiState {
public readonly welcomeMessageIsOpened;
From d3f84d51ace8fb521d94dc27918abb39495bbfa4 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Wed, 20 Oct 2021 19:12:28 +0200
Subject: [PATCH 23/58] Small fixes
---
Logic/Actors/OverpassFeatureSource.ts | 7 ++++++-
UI/BigComponents/SimpleAddUI.ts | 4 ++--
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/Logic/Actors/OverpassFeatureSource.ts b/Logic/Actors/OverpassFeatureSource.ts
index e48ae2a3f9..49c605137f 100644
--- a/Logic/Actors/OverpassFeatureSource.ts
+++ b/Logic/Actors/OverpassFeatureSource.ts
@@ -180,14 +180,19 @@ export default class OverpassFeatureSource implements FeatureSource {
}
} while (data === undefined && this._isActive.data);
- self.retries.setData(0);
+
try {
+ if(data === undefined){
+ return undefined
+ }
data.features.forEach(feature => SimpleMetaTagger.objectMetaInfo.applyMetaTagsOnFeature(feature, date, undefined));
self.features.setData(data.features.map(f => ({feature: f, freshness: date})));
return [bounds, date, layersToDownload];
} catch (e) {
console.error("Got the overpass response, but could not process it: ", e, e.stack)
+ return undefined
} finally {
+ self.retries.setData(0);
self.runningQuery.setData(false);
}
diff --git a/UI/BigComponents/SimpleAddUI.ts b/UI/BigComponents/SimpleAddUI.ts
index 204e7f955f..84e14b6827 100644
--- a/UI/BigComponents/SimpleAddUI.ts
+++ b/UI/BigComponents/SimpleAddUI.ts
@@ -113,9 +113,9 @@ export default class SimpleAddUI extends Toggle {
new Toggle(
new Toggle(
new Toggle(
- addUi,
Translations.t.general.add.stillLoading.Clone().SetClass("alert"),
- state.featurePipeline.somethingLoaded
+ addUi,
+ state.featurePipeline.runningQuery
),
Translations.t.general.add.zoomInFurther.Clone().SetClass("alert"),
state.locationControl.map(loc => loc.zoom >= Constants.userJourney.minZoomLevelToAddNewPoints)
From 38ce07cb56a4ed20ad5f7ffd95658ae54d8255eb Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Thu, 21 Oct 2021 01:21:02 +0200
Subject: [PATCH 24/58] Version bump
---
Models/Constants.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Models/Constants.ts b/Models/Constants.ts
index b8e2df07d6..ec2b8dcb8c 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.11.0-rc-1";
+ public static vNumber = "0.11.0";
public static ImgurApiKey = '7070e7167f0a25a'
public static readonly mapillary_client_token_v3 = 'TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2'
public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"
From 9634c553154024bacdd7b06db76ffa69da20f268 Mon Sep 17 00:00:00 2001
From: kjon
Date: Tue, 19 Oct 2021 18:29:39 +0000
Subject: [PATCH 25/58] Translated using Weblate (German)
Currently translated at 67.0% (784 of 1169 strings)
Translation: MapComplete/Layer translations
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layer-translations/de/
---
langs/layers/de.json | 897 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 888 insertions(+), 9 deletions(-)
diff --git a/langs/layers/de.json b/langs/layers/de.json
index 7d7678aa5d..29f15b0c77 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -702,6 +702,9 @@
},
"3": {
"then": "Nicht für die Öffentlichkeit zugänglich (z.B. nur für das Personal, die Eigentümer, ...)"
+ },
+ "4": {
+ "then": "Nicht zugänglich, möglicherweise nur für betriebliche Nutzung"
}
},
"question": "Ist dieser Defibrillator frei zugänglich?",
@@ -711,6 +714,9 @@
"mappings": {
"0": {
"then": "Dies ist ein manueller Defibrillator für den professionellen Einsatz"
+ },
+ "1": {
+ "then": "Dies ist ein normaler automatischer Defibrillator"
}
},
"render": "Es gibt keine Informationen über den Gerätetyp"
@@ -791,6 +797,13 @@
},
"title": {
"render": "Defibrillator"
+ },
+ "icon": {
+ "mappings": {
+ "0": {
+ "then": "./assets/layers/defibrillator/aed_checked.svg"
+ }
+ }
}
},
"drinking_water": {
@@ -814,7 +827,15 @@
},
"Still in use?": {
"question": "Ist diese Trinkwasserstelle noch in Betrieb?",
- "render": "Der Betriebsstatus ist {operational_status"
+ "render": "Der Betriebsstatus ist {operational_status",
+ "mappings": {
+ "1": {
+ "then": "Diese Trinkwasserstelle ist kaputt"
+ },
+ "2": {
+ "then": "Diese Trinkwasserstelle wurde geschlossen"
+ }
+ }
},
"render-closest-drinking-water": {
"render": "Ein weiterer Trinkwasserbrunnen befindet sich in {_closest_other_drinking_water_distance} Meter"
@@ -851,6 +872,9 @@
"ghost_bike-source": {
"question": "Auf welcher Webseite kann man mehr Informationen über das Geisterrad oder den Unfall finden?",
"render": "Mehr Informationen"
+ },
+ "ghost_bike-start_date": {
+ "question": "Wann wurde dieses Geisterrad aufgestellt?"
}
},
"title": {
@@ -914,7 +938,8 @@
},
"title": {
"render": "Karte"
- }
+ },
+ "description": "Eine Karte, die für Touristen gedacht ist und dauerhaft im öffentlichen Raum aufgestellt ist"
},
"nature_reserve": {
"tagRenderings": {
@@ -966,7 +991,8 @@
},
"title": {
"render": "Picknick-Tisch"
- }
+ },
+ "description": "Die Ebene zeigt Picknicktische an"
},
"playground": {
"description": "Spielplätze",
@@ -1057,6 +1083,26 @@
},
"question": "Welche Oberfläche hat dieser Spielplatz? Wenn es mehrere gibt, wähle die am häufigsten vorkommende aus",
"render": "Die Oberfläche ist {surface}"
+ },
+ "playground-opening_hours": {
+ "mappings": {
+ "0": {
+ "then": "Zugänglich von Sonnenaufgang bis Sonnenuntergang"
+ },
+ "1": {
+ "then": "Immer zugänglich"
+ },
+ "2": {
+ "then": "Immer zugänglich"
+ }
+ },
+ "question": "Wann ist dieser Spielplatz zugänglich?"
+ },
+ "playground-max_age": {
+ "render": "Zugang nur für Kinder bis maximal {max_age}"
+ },
+ "playground-min_age": {
+ "render": "Zugang nur für Kinder ab {min_age} Jahren"
}
},
"title": {
@@ -1066,6 +1112,11 @@
}
},
"render": "Spielplatz"
+ },
+ "presets": {
+ "0": {
+ "title": "Spielplatz"
+ }
}
},
"public_bookcase": {
@@ -1170,6 +1221,15 @@
}
},
"render": "Bücherschrank"
+ },
+ "filter": {
+ "2": {
+ "options": {
+ "0": {
+ "question": "Innen oder Außen"
+ }
+ }
+ }
}
},
"toilet": {
@@ -1281,6 +1341,29 @@
},
"title": {
"render": "Toilette"
+ },
+ "filter": {
+ "1": {
+ "options": {
+ "0": {
+ "question": "Hat einen Wickeltisch"
+ }
+ }
+ },
+ "0": {
+ "options": {
+ "0": {
+ "question": "Rollstuhlgerecht"
+ }
+ }
+ },
+ "2": {
+ "options": {
+ "0": {
+ "question": "Nutzung kostenlos"
+ }
+ }
+ }
}
},
"tree_node": {
@@ -1295,7 +1378,64 @@
"name": "Baum",
"presets": {
"2": {
- "title": "Baum"
+ "title": "Baum",
+ "description": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt."
+ },
+ "0": {
+ "title": "Laubbaum",
+ "description": "Ein Baum mit Blättern, z. B. Eiche oder Buche."
+ },
+ "1": {
+ "description": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte.",
+ "title": "Nadelbaum"
+ }
+ },
+ "tagRenderings": {
+ "tree-height": {
+ "mappings": {
+ "0": {
+ "then": "Höhe: {height} m"
+ }
+ },
+ "render": "Höhe: {height}"
+ },
+ "tree-heritage": {
+ "mappings": {
+ "3": {
+ "then": "Nicht als Denkmal registriert"
+ }
+ },
+ "question": "Ist dieser Baum ein Naturdenkmal?"
+ },
+ "tree-leaf_type": {
+ "mappings": {
+ "0": {
+ "then": " Laubbaum"
+ },
+ "1": {
+ "then": " Nadelbaum"
+ },
+ "2": {
+ "then": " Dauerhaft blattlos"
+ }
+ }
+ },
+ "tree-decidouous": {
+ "question": "Ist dies ein Nadelbaum oder ein Laubbaum?",
+ "mappings": {
+ "1": {
+ "then": "immergrüner Baum."
+ }
+ }
+ },
+ "tree_node-name": {
+ "render": "Name: {name}",
+ "mappings": {
+ "0": {
+ "then": "Der Baum hat keinen Namen."
+ }
+ },
+ "question": "Hat der Baum einen Namen?"
}
}
},
@@ -1512,16 +1652,35 @@
"0": {
"applicableUnits": {
"2": {
- "human": " Tage"
+ "human": " Tage",
+ "humanSingular": " Tag"
},
"1": {
- "human": " Stunden"
+ "human": " Stunden",
+ "humanSingular": " Stunde"
},
"0": {
"human": " Minuten",
"humanSingular": " Minute"
}
}
+ },
+ "3": {
+ "applicableUnits": {
+ "0": {
+ "human": "Kilowatt"
+ },
+ "1": {
+ "human": "Megawatt"
+ }
+ }
+ },
+ "1": {
+ "applicableUnits": {
+ "0": {
+ "human": "Volt"
+ }
+ }
}
},
"tagRenderings": {
@@ -1713,11 +1872,102 @@
"capacity": {
"question": "Wie viele Fahrzeuge können hier gleichzeitig geladen werden?",
"render": "{capacity} Fahrzeuge können hier gleichzeitig geladen werden"
+ },
+ "fee/charge": {
+ "mappings": {
+ "0": {
+ "then": "Nutzung kostenlos"
+ }
+ },
+ "render": "Die Nutzung dieser Ladestation kostet {charge}"
+ },
+ "website": {
+ "render": "Weitere Informationen auf {website}"
+ },
+ "ref": {
+ "render": "Die Kennziffer ist {ref}"
+ },
+ "maxstay": {
+ "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}"
}
+ },
+ "title": {
+ "render": "Ladestation"
}
},
"crossings": {
- "name": "Kreuzungen"
+ "name": "Kreuzungen",
+ "presets": {
+ "1": {
+ "description": "Ampel an einer Straße",
+ "title": "Ampel"
+ },
+ "0": {
+ "title": "Kreuzung",
+ "description": "Kreuzung für Fußgänger und/oder Radfahrer"
+ }
+ },
+ "tagRenderings": {
+ "crossing-tactile": {
+ "question": "Gibt es an dieser Kreuzung ein Blindenleitsystem?",
+ "mappings": {
+ "1": {
+ "then": "Diese Kreuzung hat kein Blindenleitsystem"
+ },
+ "0": {
+ "then": "An dieser Kreuzung gibt es ein Blindenleitsystem"
+ }
+ }
+ },
+ "crossing-bicycle-allowed": {
+ "mappings": {
+ "1": {
+ "then": "Radfahrer können diese Kreuzung nicht nutzen"
+ },
+ "0": {
+ "then": "Radfahrer können diese Kreuzung nutzen"
+ }
+ },
+ "question": "Können Radfahrer diese Kreuzung nutzen?"
+ },
+ "crossing-type": {
+ "mappings": {
+ "0": {
+ "then": "Kreuzungen ohne Ampeln"
+ },
+ "1": {
+ "then": "Kreuzungen mit Ampeln"
+ },
+ "2": {
+ "then": "Zebrastreifen"
+ }
+ },
+ "question": "Was ist das für eine Kreuzung?"
+ },
+ "crossing-is-zebra": {
+ "mappings": {
+ "0": {
+ "then": "Dies ist ein Zebrastreifen"
+ },
+ "1": {
+ "then": "Dies ist kein Zebrastreifen"
+ }
+ },
+ "question": "Ist das ein Zebrastreifen?"
+ }
+ },
+ "description": "Übergänge für Fußgänger und Radfahrer",
+ "title": {
+ "render": "Kreuzung",
+ "mappings": {
+ "1": {
+ "then": "Kreuzung mit Ampeln"
+ },
+ "0": {
+ "then": "Ampel"
+ }
+ }
+ }
},
"visitor_information_centre": {
"title": {
@@ -1749,15 +1999,644 @@
},
"0": {
"then": "Radweg"
+ },
+ "2": {
+ "then": "Fahrradspur"
+ },
+ "3": {
+ "then": "Radweg neben der Straße"
}
},
"render": "Radwege"
- }
+ },
+ "tagRenderings": {
+ "Maxspeed (for road)": {
+ "mappings": {
+ "0": {
+ "then": "Die Höchstgeschwindigkeit ist 20 km/h"
+ },
+ "1": {
+ "then": "Die Höchstgeschwindigkeit ist 30 km/h"
+ },
+ "2": {
+ "then": "Die Höchstgeschwindigkeit ist 50 km/h"
+ },
+ "3": {
+ "then": "Die Höchstgeschwindigkeit ist 70 km/h"
+ },
+ "4": {
+ "then": "Die Höchstgeschwindigkeit ist 90 km/h"
+ }
+ }
+ },
+ "is lit?": {
+ "mappings": {
+ "2": {
+ "then": "Diese Straße ist nachts beleuchtet"
+ },
+ "1": {
+ "then": "Diese Straße ist nicht beleuchtet"
+ },
+ "3": {
+ "then": "Diese Straße ist durchgehend beleuchtet"
+ }
+ },
+ "question": "Ist diese Straße beleuchtet?"
+ },
+ "Cycleway type for a road": {
+ "mappings": {
+ "5": {
+ "then": "Es gibt keinen Radweg"
+ },
+ "4": {
+ "then": "Es gibt keinen Radweg"
+ },
+ "3": {
+ "then": "Hier ist ein getrennter Radweg vorhanden"
+ }
+ },
+ "question": "Was für ein Radweg ist hier?"
+ },
+ "Cycleway:smoothness": {
+ "mappings": {
+ "0": {
+ "then": "Geeignet für dünne Rollen: Rollerblades, Skateboard"
+ },
+ "1": {
+ "then": "Geeignet für dünne Reifen: Rennrad"
+ },
+ "6": {
+ "then": "Geeignet für Geländefahrzeuge: Traktor, ATV"
+ },
+ "7": {
+ "then": "Unpassierbar / Keine bereiften Fahrzeuge"
+ }
+ },
+ "question": "Wie eben ist dieser Radweg?"
+ },
+ "Is this a cyclestreet? (For a road)": {
+ "mappings": {
+ "2": {
+ "then": "Dies ist keine Fahrradstraße."
+ },
+ "1": {
+ "then": "Dies ist eine Fahrradstraße"
+ }
+ },
+ "question": "Ist das eine Fahrradstraße"
+ },
+ "Cycleway:surface": {
+ "mappings": {
+ "2": {
+ "then": "Der Radweg ist aus Asphalt"
+ },
+ "8": {
+ "then": "Der Radweg ist aus Holz"
+ },
+ "9": {
+ "then": "Der Radweg ist aus Schotter"
+ },
+ "11": {
+ "then": "Der Radweg ist aus Kies"
+ },
+ "0": {
+ "then": "Dieser Radweg hat keinen festen Belag"
+ },
+ "1": {
+ "then": "Dieser Radweg hat einen festen Belag"
+ },
+ "10": {
+ "then": "Dieser Radweg besteht aus feinem Schotter"
+ },
+ "12": {
+ "then": "Dieser Radweg besteht aus Rohboden"
+ },
+ "4": {
+ "then": "Der Radweg ist aus Beton"
+ }
+ },
+ "render": "Der Radweg ist aus {cycleway:surface}"
+ },
+ "Surface of the road": {
+ "mappings": {
+ "2": {
+ "then": "Der Radweg ist aus Asphalt"
+ },
+ "4": {
+ "then": "Der Radweg ist aus Beton"
+ },
+ "1": {
+ "then": "Dieser Radweg hat einen festen Belag"
+ },
+ "8": {
+ "then": "Der Radweg ist aus Holz"
+ },
+ "10": {
+ "then": "Dieser Radweg besteht aus feinem Schotter"
+ },
+ "12": {
+ "then": "Dieser Radweg besteht aus Rohboden"
+ },
+ "9": {
+ "then": "Der Radweg ist aus Schotter"
+ },
+ "11": {
+ "then": "Der Radweg ist aus Kies"
+ }
+ },
+ "render": "Der Radweg ist aus {surface}"
+ },
+ "cycleway-lane-track-traffic-signs": {
+ "mappings": {
+ "2": {
+ "then": "Getrennter Fuß-/Radweg "
+ },
+ "3": {
+ "then": "Gemeinsamer Fuß-/Radweg "
+ },
+ "0": {
+ "then": "Vorgeschriebener Radweg "
+ },
+ "4": {
+ "then": "Kein Verkehrsschild vorhanden"
+ }
+ },
+ "question": "Welches Verkehrszeichen hat dieser Radweg?"
+ },
+ "Surface of the street": {
+ "mappings": {
+ "7": {
+ "then": "Unpassierbar / Keine bereiften Fahrzeuge"
+ },
+ "6": {
+ "then": "Geeignet für spezielle Geländewagen: Traktor, ATV"
+ },
+ "0": {
+ "then": "Geeignet für dünne Rollen: Rollerblades, Skateboard"
+ },
+ "1": {
+ "then": "Geeignet für dünne Reifen: Rennrad"
+ }
+ },
+ "question": "Wie eben ist diese Straße?"
+ },
+ "cyclelan-segregation": {
+ "mappings": {
+ "3": {
+ "then": "Dieser Radweg ist getrennt durch einen Bordstein"
+ }
+ }
+ },
+ "cycleway-segregation": {
+ "mappings": {
+ "3": {
+ "then": "Dieser Radweg ist getrennt durch einen Bordstein"
+ }
+ }
+ },
+ "cycleway-traffic-signs": {
+ "mappings": {
+ "2": {
+ "then": "Getrennter Fuß-/Radweg "
+ },
+ "0": {
+ "then": "Vorgeschriebener Radweg "
+ },
+ "4": {
+ "then": "Kein Verkehrsschild vorhanden"
+ },
+ "3": {
+ "then": "Gemeinsamer Fuß-/Radweg "
+ }
+ },
+ "question": "Welches Verkehrszeichen hat dieser Radweg?"
+ },
+ "cycleway-traffic-signs-D7-supplementary": {
+ "mappings": {
+ "1": {
+ "then": ""
+ },
+ "6": {
+ "then": "Kein zusätzliches Verkehrszeichen vorhanden"
+ }
+ }
+ },
+ "cycleway-traffic-signs-supplementary": {
+ "mappings": {
+ "6": {
+ "then": "Kein zusätzliches Verkehrszeichen vorhanden"
+ }
+ }
+ }
+ },
+ "name": "Radwege und Straßen"
},
"watermill": {
"name": "Wassermühle"
},
"waste_basket": {
- "description": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können."
+ "description": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können.",
+ "presets": {
+ "0": {
+ "title": "Abfalleimer"
+ }
+ },
+ "iconSize": {
+ "mappings": {
+ "0": {
+ "then": "Abfalleimer"
+ }
+ }
+ },
+ "name": "Abfalleimer",
+ "title": {
+ "render": "Abfalleimer"
+ },
+ "tagRenderings": {
+ "waste-basket-waste-types": {
+ "mappings": {
+ "3": {
+ "then": "Mülleimer für Zigaretten"
+ },
+ "4": {
+ "then": "Mülleimer für Drogen"
+ },
+ "0": {
+ "then": "Ein Abfalleimer für allgemeinen Müll"
+ },
+ "1": {
+ "then": "Ein Abfalleimer für allgemeinen Müll"
+ },
+ "2": {
+ "then": "Ein Abfalleimer für Hundekot"
+ }
+ }
+ }
+ }
+ },
+ "food": {
+ "presets": {
+ "1": {
+ "title": "Schnellimbiss"
+ },
+ "2": {
+ "title": "Pommesbude"
+ },
+ "0": {
+ "title": "Restaurant"
+ }
+ },
+ "filter": {
+ "2": {
+ "options": {
+ "0": {
+ "question": "Bietet vegan Speisen an"
+ }
+ }
+ },
+ "0": {
+ "options": {
+ "0": {
+ "question": "Aktuell geöffnet"
+ }
+ }
+ }
+ },
+ "tagRenderings": {
+ "Cuisine": {
+ "question": "Welches Essen gibt es hier?",
+ "mappings": {
+ "2": {
+ "then": "Bietet vorwiegend Pastagerichte an"
+ }
+ },
+ "render": "An diesem Ort gibt es hauptsächlich {cuisine}"
+ },
+ "Fastfood vs restaurant": {
+ "question": "Um was für ein Geschäft handelt es sich?"
+ },
+ "Takeaway": {
+ "mappings": {
+ "0": {
+ "then": "Dieses Geschäft bietet nur Artikel zur Mitnahme an"
+ },
+ "1": {
+ "then": "Mitnahme möglich"
+ },
+ "2": {
+ "then": "Mitnahme nicht möglich"
+ }
+ },
+ "question": "Ist an diesem Ort Mitnahme möglich?"
+ },
+ "halal (no friture)": {
+ "mappings": {
+ "0": {
+ "then": "Hier gibt es keine halal Speisen"
+ },
+ "3": {
+ "then": "Es gibt ausschließlich halal Speisen"
+ },
+ "1": {
+ "then": "Hier gibt es wenige halal Speisen"
+ },
+ "2": {
+ "then": "Es gibt halal Speisen"
+ }
+ }
+ },
+ "Name": {
+ "question": "Wie heißt dieses Restaurant?",
+ "render": "Das Restaurant heißt {name}"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "Restaurant {name}"
+ },
+ "1": {
+ "then": "Schnellrestaurant{name}"
+ }
+ }
+ }
+ },
+ "sport_pitch": {
+ "description": "Ein Sportplatz",
+ "name": "Sportplätze",
+ "tagRenderings": {
+ "sport_pitch-sport": {
+ "mappings": {
+ "2": {
+ "then": "Dies ist eine Tischtennisplatte"
+ },
+ "1": {
+ "then": "Hier wird Fußball gespielt"
+ },
+ "4": {
+ "then": "Hier wird Kopfball gespielt"
+ },
+ "3": {
+ "then": "Hier wird Tennis gespielt"
+ },
+ "5": {
+ "then": "Hier wird Basketball gespielt"
+ },
+ "0": {
+ "then": "Hier wird Basketball gespielt"
+ }
+ },
+ "question": "Welche Sportarten können hier gespielt werden?",
+ "render": "Hier wird {sport} gespielt"
+ },
+ "sport_pitch-opening_hours": {
+ "question": "Wann ist dieser Sportplatz zugänglich?",
+ "mappings": {
+ "1": {
+ "then": "Immer zugänglich"
+ }
+ }
+ },
+ "sport-pitch-access": {
+ "question": "Ist dieser Sportplatz öffentlich zugänglich?",
+ "mappings": {
+ "2": {
+ "then": "Zugang nur für Vereinsmitglieder"
+ },
+ "3": {
+ "then": "Privat - kein öffentlicher Zugang"
+ },
+ "0": {
+ "then": "Öffentlicher Zugang"
+ }
+ }
+ },
+ "sport-pitch-reservation": {
+ "mappings": {
+ "3": {
+ "then": "Termine nach Vereinbarung nicht möglich"
+ }
+ }
+ },
+ "sport_pitch-surface": {
+ "mappings": {
+ "2": {
+ "then": "Die Oberfläche ist aus Pflastersteinen"
+ },
+ "0": {
+ "then": "Die Oberfläche ist Gras"
+ },
+ "1": {
+ "then": "Die Oberfläche ist Sand"
+ },
+ "3": {
+ "then": "Die Oberfläche ist Asphalt"
+ },
+ "4": {
+ "then": "Die Oberfläche ist Beton"
+ }
+ },
+ "render": "Die Oberfläche ist {surface}"
+ }
+ },
+ "title": {
+ "render": "Sportplatz"
+ },
+ "presets": {
+ "1": {
+ "title": "Sportplatz"
+ },
+ "0": {
+ "title": "Tischtennisplatte"
+ }
+ }
+ },
+ "trail": {
+ "title": {
+ "render": "Wanderweg"
+ },
+ "name": "Wanderwege",
+ "tagRenderings": {
+ "trail-length": {
+ "render": "Der Wanderweg ist {_length:km} Kilometer lang"
+ },
+ "Color": {
+ "mappings": {
+ "2": {
+ "then": "Grüner Weg"
+ },
+ "0": {
+ "then": "Blauer Weg"
+ },
+ "1": {
+ "then": "Roter Weg"
+ },
+ "3": {
+ "then": "Gelber Weg"
+ }
+ }
+ }
+ }
+ },
+ "surveillance_camera": {
+ "name": "Überwachungskameras",
+ "tagRenderings": {
+ "Level": {
+ "question": "Auf welcher Ebene befindet sich diese Kamera?",
+ "render": "Befindet sich auf Ebene {level}"
+ },
+ "camera:mount": {
+ "question": "Wie ist diese Kamera montiert?",
+ "render": "Montageart: {mount}"
+ },
+ "Camera type: fixed; panning; dome": {
+ "mappings": {
+ "0": {
+ "then": "Eine fest montierte (nicht bewegliche) Kamera"
+ },
+ "2": {
+ "then": "Eine bewegliche Kamera"
+ },
+ "1": {
+ "then": "Eine Kuppelkamera (drehbar)"
+ }
+ },
+ "question": "Um welche Kameratyp handelt se sich?"
+ },
+ "Indoor camera? This isn't clear for 'public'-cameras": {
+ "mappings": {
+ "0": {
+ "then": "Diese Kamera befindet sich im Innenraum"
+ },
+ "1": {
+ "then": "Diese Kamera befindet sich im Freien"
+ },
+ "2": {
+ "then": "Diese Kamera ist möglicherweise im Freien"
+ }
+ }
+ },
+ "Surveillance:zone": {
+ "mappings": {
+ "4": {
+ "then": "Überwacht eine Haltestelle"
+ },
+ "1": {
+ "then": "Überwacht den Verkehr"
+ },
+ "2": {
+ "then": "Überwacht einen Eingang"
+ },
+ "3": {
+ "then": "Überwacht einen Gang"
+ },
+ "5": {
+ "then": "Überwacht ein Geschäft"
+ },
+ "0": {
+ "then": "Überwacht einen Parkplatz"
+ }
+ },
+ "question": "Was genau wird hier überwacht?",
+ "render": " Überwacht ein/e {surveillance:zone}"
+ },
+ "Operator": {
+ "question": "Wer betreibt diese CCTV Kamera?",
+ "render": "Betrieben von {operator}"
+ }
+ },
+ "title": {
+ "render": "Überwachungskamera"
+ }
+ },
+ "direction": {
+ "name": "Visualisierung der Richtung",
+ "description": "Diese Ebene visualisiert Richtungen"
+ },
+ "observation_tower": {
+ "units": {
+ "0": {
+ "applicableUnits": {
+ "0": {
+ "human": " Meter"
+ }
+ }
+ }
+ },
+ "tagRenderings": {
+ "Operator": {
+ "question": "Wer betreibt diesen Turm?",
+ "render": "Betrieben von {operator}"
+ },
+ "name": {
+ "render": "Der Name dieses Turms lautet {name}",
+ "mappings": {
+ "0": {
+ "then": "Dieser Turm hat keinen eigenen Namen"
+ }
+ },
+ "question": "Wie heißt dieser Turm?"
+ },
+ "Height": {
+ "question": "Wie hoch ist dieser Turm?",
+ "render": "Dieser Turm ist {height} hoch"
+ },
+ "Fee": {
+ "render": "Der Besuch des Turms kostet {charge}",
+ "mappings": {
+ "0": {
+ "then": "Eintritt kostenlos"
+ }
+ }
+ }
+ },
+ "description": "Türme mit Panoramablick",
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "{name}"
+ }
+ },
+ "render": "Beobachtungsturm"
+ },
+ "name": "Beobachtungstürme",
+ "presets": {
+ "0": {
+ "title": "Beobachtungsturm"
+ }
+ }
+ },
+ "slow_roads": {
+ "tagRenderings": {
+ "slow_roads-surface": {
+ "mappings": {
+ "0": {
+ "then": "Die Oberfläche ist Gras"
+ },
+ "1": {
+ "then": "Die Oberfläche ist Erde"
+ },
+ "2": {
+ "then": "Die Oberfläche ist ohne festen Belag"
+ },
+ "4": {
+ "then": "Die Oberfläche ist aus Pflastersteinen"
+ },
+ "5": {
+ "then": "Die Oberfläche ist Asphalt"
+ },
+ "3": {
+ "then": "Die Oberfläche ist Sand"
+ },
+ "6": {
+ "then": "Die Oberfläche ist Beton"
+ },
+ "7": {
+ "then": "Die Oberfläche ist gepflastert"
+ }
+ },
+ "render": "Die Oberfläche ist {surface}"
+ }
+ }
}
}
From 8f8f121e89d25db6840d1aa68806c3dfb401950d Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Thu, 21 Oct 2021 21:42:28 +0200
Subject: [PATCH 26/58] Fix osmcha link, add some docs on geolocation button,
use a lower and more sane default max zoom for editor layer index layers
---
Docs/Misc/gen.sh | 2 +
Docs/Misc/geolocation_button.gv | 22 +++
Docs/Misc/geolocation_button.gv.svg | 145 ++++++++++++++++++
.../AvailableBaseLayersImplementation.ts | 2 +-
langs/nl.json | 2 +-
5 files changed, 171 insertions(+), 2 deletions(-)
create mode 100755 Docs/Misc/gen.sh
create mode 100644 Docs/Misc/geolocation_button.gv
create mode 100644 Docs/Misc/geolocation_button.gv.svg
diff --git a/Docs/Misc/gen.sh b/Docs/Misc/gen.sh
new file mode 100755
index 0000000000..8304eee245
--- /dev/null
+++ b/Docs/Misc/gen.sh
@@ -0,0 +1,2 @@
+
+dot -Tps geolocation_button.gv -Tsvg -O
diff --git a/Docs/Misc/geolocation_button.gv b/Docs/Misc/geolocation_button.gv
new file mode 100644
index 0000000000..3881519e42
--- /dev/null
+++ b/Docs/Misc/geolocation_button.gv
@@ -0,0 +1,22 @@
+digraph G {
+ init [shape=box]
+ denied
+ init -> denied [label="geolocation permanently denied"]
+ init -> getting_location [label="previously granted flag set"]
+ init -> idle [label="previously granted flag unset"]
+ idle
+ idle -> request_permission [label="on click"]
+ request_permission
+ request_permission -> getting_location [label="granted (sets flag)"]
+ request_permission -> idle [label="not granted"]
+ request_permission -> denied [label="permanently denied"]
+ getting_location
+ location_found
+ getting_location -> location_found [label="location found"]
+ location_found -> open_lock [label="on click (zooms to location)"]
+ open_lock
+ open_lock -> location_found [label="after 3 sec"]
+ closed_lock
+ open_lock -> closed_lock [label="on click (locks zoom to location)"]
+ closed_lock -> location_found [label="on click"]
+}
diff --git a/Docs/Misc/geolocation_button.gv.svg b/Docs/Misc/geolocation_button.gv.svg
new file mode 100644
index 0000000000..6dbf788489
--- /dev/null
+++ b/Docs/Misc/geolocation_button.gv.svg
@@ -0,0 +1,145 @@
+
+
+
+
+
diff --git a/Logic/Actors/AvailableBaseLayersImplementation.ts b/Logic/Actors/AvailableBaseLayersImplementation.ts
index 5d7116381a..09f5cfe42a 100644
--- a/Logic/Actors/AvailableBaseLayersImplementation.ts
+++ b/Logic/Actors/AvailableBaseLayersImplementation.ts
@@ -175,7 +175,7 @@ export default class AvailableBaseLayersImplementation implements AvailableBaseL
// Note: if layer.geometry is null, there is global coverage for this layer
layers.push({
id: props.id,
- max_zoom: props.max_zoom ?? 25,
+ max_zoom: props.max_zoom ?? 19,
min_zoom: props.min_zoom ?? 1,
name: props.name,
layer: leafletLayer,
diff --git a/langs/nl.json b/langs/nl.json
index fa7a85612f..33a56e19a2 100644
--- a/langs/nl.json
+++ b/langs/nl.json
@@ -137,7 +137,7 @@
"getStartedNewAccount": " of maak een nieuwe account aan",
"noTagsSelected": "Geen tags geselecteerd",
"customThemeIntro": "
Onofficiële thema's
De onderstaande thema's heb je eerder bezocht en zijn gemaakt door andere OpenStreetMappers.",
- "aboutMapcomplete": "
Over MapComplete
Met MapComplete kun je OpenStreetMap verrijken met informatie over een bepaald thema. Beantwoord enkele vragen, en binnen een paar minuten is jouw bijdrage wereldwijd beschikbaar! De maker van het thema bepaalt de elementen, vragen en taalversies voor het thema.
Ontdek meer
MapComplete biedt altijd de volgende stap naar meer OpenStreetMap:
Indien ingebed in een website linkt het iframe naar de volledige MapComplete
De volledige versie heeft uitleg over OpenStreetMap
Bekijken kan altijd, maar wijzigen vereist een OSM-account
Als je niet aangemeld bent, wordt je gevraagd dit te doen
Als je minstens één vraag hebt beantwoord, kan je ook elementen toevoegen
Heb je genoeg changesets, dan verschijnen de OSM-tags, nog later links naar de wiki
Merk je een bug of wil je een extra feature? Wil je helpen vertalen? Bezoek dan de broncode en issue tracker.
Wil je je vorderingen zien? Volg de edits op OsmCha.",
+ "aboutMapcomplete": "
Over MapComplete
Met MapComplete kun je OpenStreetMap verrijken met informatie over een bepaald thema. Beantwoord enkele vragen, en binnen een paar minuten is jouw bijdrage wereldwijd beschikbaar! De maker van het thema bepaalt de elementen, vragen en taalversies voor het thema.
Ontdek meer
MapComplete biedt altijd de volgende stap naar meer OpenStreetMap:
Indien ingebed in een website linkt het iframe naar de volledige MapComplete
De volledige versie heeft uitleg over OpenStreetMap
Bekijken kan altijd, maar wijzigen vereist een OSM-account
Als je niet aangemeld bent, wordt je gevraagd dit te doen
Als je minstens één vraag hebt beantwoord, kan je ook elementen toevoegen
Heb je genoeg changesets, dan verschijnen de OSM-tags, nog later links naar de wiki
Merk je een bug of wil je een extra feature? Wil je helpen vertalen? Bezoek dan de broncode en issue tracker.
Wil je je vorderingen zien? Volg de edits op OsmCha.",
"backgroundMap": "Achtergrondkaart",
"layerSelection": {
"zoomInToSeeThisLayer": "Vergroot de kaart om deze laag te zien",
From d40bf15bc753ff4849b10fd788d3c4e23a3859e8 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Fri, 22 Oct 2021 13:47:36 +0200
Subject: [PATCH 27/58] Fix translations
---
.../charging_station/charging_station.json | 33 +-
assets/layers/crossings/crossings.json | 63 +-
.../cycleways_and_roads.json | 189 +-
.../layers/defibrillator/defibrillator.json | 9 +-
assets/layers/direction/direction.json | 6 +-
.../layers/drinking_water/drinking_water.json | 6 +-
assets/layers/food/food.json | 63 +-
assets/layers/ghost_bike/ghost_bike.json | 3 +-
assets/layers/map/map.json | 3 +-
.../observation_tower/observation_tower.json | 45 +-
assets/layers/picnic_table/picnic_table.json | 3 +-
assets/layers/playground/playground.json | 21 +-
.../public_bookcase/public_bookcase.json | 3 +-
assets/layers/shops/shops.json | 48 +-
assets/layers/slow_roads/slow_roads.json | 27 +-
assets/layers/sport_pitch/sport_pitch.json | 78 +-
.../surveillance_camera.json | 69 +-
assets/layers/toilet/toilet.json | 9 +-
assets/layers/trail/trail.json | 21 +-
assets/layers/tree_node/tree_node.json | 51 +-
assets/layers/waste_basket/waste_basket.json | 27 +-
assets/tagRenderings/questions.json | 35 +-
assets/themes/campersite/campersite.json | 26 +-
assets/themes/hailhydrant/hailhydrant.json | 115 +-
.../openwindpowermap/openwindpowermap.json | 4 +-
assets/themes/postboxes/postboxes.json | 9 +-
assets/themes/shops/shops.json | 10 +-
.../themes/sport_pitches/sport_pitches.json | 12 +-
assets/themes/surveillance/surveillance.json | 10 +-
assets/themes/trees/trees.json | 12 +-
assets/themes/uk_addresses/uk_addresses.json | 37 +-
assets/themes/waste_basket/waste_basket.json | 6 +-
langs/layers/de.json | 2720 +++++++++--------
langs/shared-questions/de.json | 50 +-
langs/shared-questions/fr.json | 58 +-
langs/themes/de.json | 1136 ++++---
langs/themes/nl.json | 96 +-
37 files changed, 2730 insertions(+), 2383 deletions(-)
diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json
index 3e421b24d2..52d4e30c3d 100644
--- a/assets/layers/charging_station/charging_station.json
+++ b/assets/layers/charging_station/charging_station.json
@@ -27,7 +27,8 @@
"ja": "充電ステーション",
"nb_NO": "Ladestasjon",
"ru": "Зарядная станция",
- "zh_Hant": "充電站"
+ "zh_Hant": "充電站",
+ "de": "Ladestation"
}
},
"description": {
@@ -2991,7 +2992,8 @@
},
"render": {
"en": "Using this charging station costs {charge}",
- "nl": "Dit oplaadpunt gebruiken kost {charge}"
+ "nl": "Dit oplaadpunt gebruiken kost {charge}",
+ "de": "Die Nutzung dieser Ladestation kostet {charge}"
},
"mappings": [
{
@@ -3003,7 +3005,8 @@
},
"then": {
"nl": "Gratis te gebruiken",
- "en": "Free to use"
+ "en": "Free to use",
+ "de": "Nutzung kostenlos"
}
}
]
@@ -3049,7 +3052,8 @@
},
"render": {
"en": "One can stay at most {canonical(maxstay)}",
- "nl": "De maximale parkeertijd hier is {canonical(maxstay)}"
+ "nl": "De maximale parkeertijd hier is {canonical(maxstay)}",
+ "de": "Die maximale Parkzeit beträgt {canonical(maxstay)}"
},
"mappings": [
{
@@ -3167,7 +3171,8 @@
"en": "What is the website of the operator?"
},
"render": {
- "en": "More info on {website}"
+ "en": "More info on {website}",
+ "de": "Weitere Informationen auf {website}"
},
"freeform": {
"key": "website",
@@ -3181,7 +3186,8 @@
"en": "What is the reference number of this charging station?"
},
"render": {
- "en": "Reference number is {ref}"
+ "en": "Reference number is {ref}",
+ "de": "Die Kennziffer ist {ref}"
},
"freeform": {
"key": "ref"
@@ -3585,7 +3591,8 @@
"humanSingular": {
"en": " hour",
"nl": " uur",
- "ru": " час"
+ "ru": " час",
+ "de": " Stunde"
}
},
{
@@ -3605,7 +3612,8 @@
"humanSingular": {
"en": " day",
"nl": " dag",
- "ru": " день"
+ "ru": " день",
+ "de": " Tag"
}
}
]
@@ -3642,7 +3650,8 @@
"human": {
"en": "Volts",
"nl": "volt",
- "ru": "Вольт"
+ "ru": "Вольт",
+ "de": "Volt"
}
}
],
@@ -3712,7 +3721,8 @@
"human": {
"en": "kilowatt",
"nl": "kilowatt",
- "ru": "киловатт"
+ "ru": "киловатт",
+ "de": "Kilowatt"
}
},
{
@@ -3723,7 +3733,8 @@
"human": {
"en": "megawatt",
"nl": "megawatt",
- "ru": "мегаватт"
+ "ru": "мегаватт",
+ "de": "Megawatt"
}
}
],
diff --git a/assets/layers/crossings/crossings.json b/assets/layers/crossings/crossings.json
index 3b71f3f1e3..2681fd8913 100644
--- a/assets/layers/crossings/crossings.json
+++ b/assets/layers/crossings/crossings.json
@@ -7,7 +7,8 @@
},
"description": {
"en": "Crossings for pedestrians and cyclists",
- "nl": "Oversteekplaatsen voor voetgangers en fietsers"
+ "nl": "Oversteekplaatsen voor voetgangers en fietsers",
+ "de": "Übergänge für Fußgänger und Radfahrer"
},
"source": {
"osmTags": {
@@ -21,7 +22,8 @@
"title": {
"render": {
"en": "Crossing",
- "nl": "Oversteekplaats"
+ "nl": "Oversteekplaats",
+ "de": "Kreuzung"
},
"mappings": [
{
@@ -29,14 +31,16 @@
"then": {
"en": "Traffic signal",
"nl": "Verkeerslicht",
- "ru": "Светофор"
+ "ru": "Светофор",
+ "de": "Ampel"
}
},
{
"if": "crossing=traffic_signals",
"then": {
"en": "Crossing with traffic signals",
- "nl": "Oversteektplaats met verkeerslichten"
+ "nl": "Oversteektplaats met verkeerslichten",
+ "de": "Kreuzung mit Ampeln"
}
}
]
@@ -60,14 +64,16 @@
{
"title": {
"en": "Crossing",
- "nl": "Oversteekplaats"
+ "nl": "Oversteekplaats",
+ "de": "Kreuzung"
},
"tags": [
"highway=crossing"
],
"description": {
"en": "Crossing for pedestrians and/or cyclists",
- "nl": "Oversteekplaats voor voetgangers en/of fietsers"
+ "nl": "Oversteekplaats voor voetgangers en/of fietsers",
+ "de": "Kreuzung für Fußgänger und/oder Radfahrer"
},
"preciseInput": {
"preferredBackground": [
@@ -81,14 +87,16 @@
"title": {
"en": "Traffic signal",
"nl": "Verkeerslicht",
- "ru": "Светофор"
+ "ru": "Светофор",
+ "de": "Ampel"
},
"tags": [
"highway=traffic_signals"
],
"description": {
"en": "Traffic signal on a road",
- "nl": "Verkeerslicht op een weg"
+ "nl": "Verkeerslicht op een weg",
+ "de": "Ampel an einer Straße"
},
"preciseInput": {
"preferredBackground": [
@@ -104,7 +112,8 @@
"id": "crossing-type",
"question": {
"en": "What kind of crossing is this?",
- "nl": "Wat voor oversteekplaats is dit?"
+ "nl": "Wat voor oversteekplaats is dit?",
+ "de": "Was ist das für eine Kreuzung?"
},
"condition": "highway=crossing",
"mappings": [
@@ -112,21 +121,24 @@
"if": "crossing=uncontrolled",
"then": {
"en": "Crossing, without traffic lights",
- "nl": "Oversteekplaats, zonder verkeerslichten"
+ "nl": "Oversteekplaats, zonder verkeerslichten",
+ "de": "Kreuzungen ohne Ampeln"
}
},
{
"if": "crossing=traffic_signals",
"then": {
"en": "Crossing with traffic signals",
- "nl": "Oversteekplaats met verkeerslichten"
+ "nl": "Oversteekplaats met verkeerslichten",
+ "de": "Kreuzungen mit Ampeln"
}
},
{
"if": "crossing=zebra",
"then": {
"en": "Zebra crossing",
- "nl": "Zebrapad"
+ "nl": "Zebrapad",
+ "de": "Zebrastreifen"
},
"hideInAnswer": true
}
@@ -136,7 +148,8 @@
"id": "crossing-is-zebra",
"question": {
"en": "Is this is a zebra crossing?",
- "nl": "Is dit een zebrapad?"
+ "nl": "Is dit een zebrapad?",
+ "de": "Ist das ein Zebrastreifen?"
},
"condition": "crossing=uncontrolled",
"mappings": [
@@ -144,14 +157,16 @@
"if": "crossing_ref=zebra",
"then": {
"en": "This is a zebra crossing",
- "nl": "Dit is een zebrapad"
+ "nl": "Dit is een zebrapad",
+ "de": "Dies ist ein Zebrastreifen"
}
},
{
"if": "crossing_ref=",
"then": {
"en": "This is not a zebra crossing",
- "nl": "Dit is geen zebrapad"
+ "nl": "Dit is geen zebrapad",
+ "de": "Dies ist kein Zebrastreifen"
}
}
]
@@ -160,7 +175,8 @@
"id": "crossing-bicycle-allowed",
"question": {
"en": "Is this crossing also for bicycles?",
- "nl": "Is deze oversteekplaats ook voor fietsers"
+ "nl": "Is deze oversteekplaats ook voor fietsers",
+ "de": "Können Radfahrer diese Kreuzung nutzen?"
},
"condition": "highway=crossing",
"mappings": [
@@ -168,14 +184,16 @@
"if": "bicycle=yes",
"then": {
"en": "A cyclist can use this crossing",
- "nl": "Een fietser kan deze oversteekplaats gebruiken"
+ "nl": "Een fietser kan deze oversteekplaats gebruiken",
+ "de": "Radfahrer können diese Kreuzung nutzen"
}
},
{
"if": "bicycle=no",
"then": {
"en": "A cyclist can not use this crossing",
- "nl": "Een fietser kan deze oversteekplaats niet gebruiken"
+ "nl": "Een fietser kan deze oversteekplaats niet gebruiken",
+ "de": "Radfahrer können diese Kreuzung nicht nutzen"
}
}
]
@@ -208,7 +226,8 @@
"id": "crossing-tactile",
"question": {
"en": "Does this crossing have tactile paving?",
- "nl": "Heeft deze oversteekplaats een geleidelijn?"
+ "nl": "Heeft deze oversteekplaats een geleidelijn?",
+ "de": "Gibt es an dieser Kreuzung ein Blindenleitsystem?"
},
"condition": "highway=crossing",
"mappings": [
@@ -216,14 +235,16 @@
"if": "tactile_paving=yes",
"then": {
"en": "This crossing has tactile paving",
- "nl": "Deze oversteekplaats heeft een geleidelijn"
+ "nl": "Deze oversteekplaats heeft een geleidelijn",
+ "de": "An dieser Kreuzung gibt es ein Blindenleitsystem"
}
},
{
"if": "tactile_paving=no",
"then": {
"en": "This crossing does not have tactile paving",
- "nl": "Deze oversteekplaats heeft geen geleidelijn"
+ "nl": "Deze oversteekplaats heeft geen geleidelijn",
+ "de": "Diese Kreuzung hat kein Blindenleitsystem"
}
},
{
diff --git a/assets/layers/cycleways_and_roads/cycleways_and_roads.json b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
index 8b10ac7b32..b8f476567c 100644
--- a/assets/layers/cycleways_and_roads/cycleways_and_roads.json
+++ b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
@@ -2,7 +2,8 @@
"id": "cycleways_and_roads",
"name": {
"en": "Cycleways and roads",
- "nl": "Fietspaden, straten en wegen"
+ "nl": "Fietspaden, straten en wegen",
+ "de": "Radwege und Straßen"
},
"minzoom": 16,
"source": {
@@ -60,14 +61,16 @@
"if": "cycleway=lane",
"then": {
"nl": "Fietsstrook",
- "en": "Bike lane"
+ "en": "Bike lane",
+ "de": "Fahrradspur"
}
},
{
"if": "cycleway=track",
"then": {
"en": "Cycleway next to the road",
- "nl": "Fietsweg naast de weg"
+ "nl": "Fietsweg naast de weg",
+ "de": "Radweg neben der Straße"
}
},
{
@@ -85,7 +88,8 @@
{
"question": {
"en": "What kind of cycleway is here?",
- "nl": "Wat voor fietspad is hier?"
+ "nl": "Wat voor fietspad is hier?",
+ "de": "Was für ein Radweg ist hier?"
},
"condition": {
"and": [
@@ -119,14 +123,16 @@
"if": "cycleway=separate",
"then": {
"en": "There is a separately drawn cycleway",
- "nl": "Er is een apart getekend fietspad."
+ "nl": "Er is een apart getekend fietspad.",
+ "de": "Hier ist ein getrennter Radweg vorhanden"
}
},
{
"if": "cycleway=no",
"then": {
"en": "There is no cycleway",
- "nl": "Er is geen fietspad aanwezig"
+ "nl": "Er is geen fietspad aanwezig",
+ "de": "Es gibt keinen Radweg"
},
"hideInAnswer": "cycleway=opposite"
},
@@ -134,7 +140,8 @@
"if": "cycleway=no",
"then": {
"en": "There is no cycleway",
- "nl": "Er is geen fietspad aanwezig"
+ "nl": "Er is geen fietspad aanwezig",
+ "de": "Es gibt keinen Radweg"
},
"hideInAnswer": "cycleway!=opposite",
"addExtraTags": [
@@ -148,7 +155,8 @@
{
"question": {
"en": "Is this street lit?",
- "nl": "Is deze weg verlicht?"
+ "nl": "Is deze weg verlicht?",
+ "de": "Ist diese Straße beleuchtet?"
},
"mappings": [
{
@@ -162,14 +170,16 @@
"if": "lit=no",
"then": {
"en": "This road is not lit",
- "nl": "Deze weg is niet verlicht"
+ "nl": "Deze weg is niet verlicht",
+ "de": "Diese Straße ist nicht beleuchtet"
}
},
{
"if": "lit=sunset-sunrise",
"then": {
"en": "This road is lit at night",
- "nl": "Deze weg is 's nachts verlicht"
+ "nl": "Deze weg is 's nachts verlicht",
+ "de": "Diese Straße ist nachts beleuchtet"
},
"hideInAnswer": true
},
@@ -177,7 +187,8 @@
"if": "lit=24/7",
"then": {
"en": "This road is lit 24/7",
- "nl": "Deze weg is 24/7 verlicht"
+ "nl": "Deze weg is 24/7 verlicht",
+ "de": "Diese Straße ist durchgehend beleuchtet"
}
}
],
@@ -186,7 +197,8 @@
{
"question": {
"en": "Is this a cyclestreet?",
- "nl": "Is dit een fietsstraat?"
+ "nl": "Is dit een fietsstraat?",
+ "de": "Ist das eine Fahrradstraße"
},
"condition": {
"and": [
@@ -211,7 +223,8 @@
"if": "cyclestreet=yes",
"then": {
"en": "This is a cyclestreet",
- "nl": "Dit is een fietsstraat"
+ "nl": "Dit is een fietsstraat",
+ "de": "Dies ist eine Fahrradstraße"
},
"hideInAnswer": "_country=be"
},
@@ -219,7 +232,8 @@
"if": "cyclestreet=",
"then": {
"en": "This is not a cyclestreet.",
- "nl": "Dit is geen fietsstraat"
+ "nl": "Dit is geen fietsstraat",
+ "de": "Dies ist keine Fahrradstraße."
},
"addExtraTags": [
"overtaking:motor_vehicle="
@@ -248,35 +262,40 @@
"if": "maxspeed=20",
"then": {
"en": "The maximum speed is 20 km/h",
- "nl": "De maximumsnelheid is 20 km/u"
+ "nl": "De maximumsnelheid is 20 km/u",
+ "de": "Die Höchstgeschwindigkeit ist 20 km/h"
}
},
{
"if": "maxspeed=30",
"then": {
"en": "The maximum speed is 30 km/h",
- "nl": "De maximumsnelheid is 30 km/u"
+ "nl": "De maximumsnelheid is 30 km/u",
+ "de": "Die Höchstgeschwindigkeit ist 30 km/h"
}
},
{
"if": "maxspeed=50",
"then": {
"en": "The maximum speed is 50 km/h",
- "nl": "De maximumsnelheid is 50 km/u"
+ "nl": "De maximumsnelheid is 50 km/u",
+ "de": "Die Höchstgeschwindigkeit ist 50 km/h"
}
},
{
"if": "maxspeed=70",
"then": {
"en": "The maximum speed is 70 km/h",
- "nl": "De maximumsnelheid is 70 km/u"
+ "nl": "De maximumsnelheid is 70 km/u",
+ "de": "Die Höchstgeschwindigkeit ist 70 km/h"
}
},
{
"if": "maxspeed=90",
"then": {
"en": "The maximum speed is 90 km/h",
- "nl": "De maximumsnelheid is 90 km/u"
+ "nl": "De maximumsnelheid is 90 km/u",
+ "de": "Die Höchstgeschwindigkeit ist 90 km/h"
}
}
],
@@ -289,7 +308,8 @@
{
"render": {
"en": "This cyleway is made of {cycleway:surface}",
- "nl": "Dit fietspad is gemaakt van {cycleway:surface}"
+ "nl": "Dit fietspad is gemaakt van {cycleway:surface}",
+ "de": "Der Radweg ist aus {cycleway:surface}"
},
"freeform": {
"key": "cycleway:surface"
@@ -306,7 +326,8 @@
"if": "cycleway:surface=unpaved",
"then": {
"en": "This cycleway is unpaved",
- "nl": "Dit fietspad is onverhard"
+ "nl": "Dit fietspad is onverhard",
+ "de": "Dieser Radweg hat keinen festen Belag"
},
"hideInAnswer": true
},
@@ -314,7 +335,8 @@
"if": "cycleway:surface=paved",
"then": {
"en": "This cycleway is paved",
- "nl": "Dit fietspad is geplaveid"
+ "nl": "Dit fietspad is geplaveid",
+ "de": "Dieser Radweg hat einen festen Belag"
},
"hideInAnswer": true
},
@@ -322,7 +344,8 @@
"if": "cycleway:surface=asphalt",
"then": {
"en": "This cycleway is made of asphalt",
- "nl": "Dit fietspad is gemaakt van asfalt"
+ "nl": "Dit fietspad is gemaakt van asfalt",
+ "de": "Der Radweg ist aus Asphalt"
}
},
{
@@ -336,7 +359,8 @@
"if": "cycleway:surface=concrete",
"then": {
"en": "This cycleway is made of concrete",
- "nl": "Dit fietspad is gemaakt van beton"
+ "nl": "Dit fietspad is gemaakt van beton",
+ "de": "Der Radweg ist aus Beton"
}
},
{
@@ -365,35 +389,40 @@
"if": "cycleway:surface=wood",
"then": {
"en": "This cycleway is made of wood",
- "nl": "Dit fietspad is gemaakt van hout"
+ "nl": "Dit fietspad is gemaakt van hout",
+ "de": "Der Radweg ist aus Holz"
}
},
{
"if": "cycleway:surface=gravel",
"then": {
"en": "This cycleway is made of gravel",
- "nl": "Dit fietspad is gemaakt van grind"
+ "nl": "Dit fietspad is gemaakt van grind",
+ "de": "Der Radweg ist aus Schotter"
}
},
{
"if": "cycleway:surface=fine_gravel",
"then": {
"en": "This cycleway is made of fine gravel",
- "nl": "Dit fietspad is gemaakt van fijn grind"
+ "nl": "Dit fietspad is gemaakt van fijn grind",
+ "de": "Dieser Radweg besteht aus feinem Schotter"
}
},
{
"if": "cycleway:surface=pebblestone",
"then": {
"en": "This cycleway is made of pebblestone",
- "nl": "Dit fietspad is gemaakt van kiezelsteentjes"
+ "nl": "Dit fietspad is gemaakt van kiezelsteentjes",
+ "de": "Der Radweg ist aus Kies"
}
},
{
"if": "cycleway:surface=ground",
"then": {
"en": "This cycleway is made from raw ground",
- "nl": "Dit fietspad is gemaakt van aarde"
+ "nl": "Dit fietspad is gemaakt van aarde",
+ "de": "Dieser Radweg besteht aus Rohboden"
}
}
],
@@ -406,7 +435,8 @@
{
"question": {
"en": "What is the smoothness of this cycleway?",
- "nl": "Wat is de kwaliteit van dit fietspad?"
+ "nl": "Wat is de kwaliteit van dit fietspad?",
+ "de": "Wie eben ist dieser Radweg?"
},
"condition": {
"or": [
@@ -420,14 +450,16 @@
"if": "cycleway:smoothness=excellent",
"then": {
"en": "Usable for thin rollers: rollerblade, skateboard",
- "nl": "Geschikt voor fijne rollers: rollerblade, skateboard"
+ "nl": "Geschikt voor fijne rollers: rollerblade, skateboard",
+ "de": "Geeignet für dünne Rollen: Rollerblades, Skateboard"
}
},
{
"if": "cycleway:smoothness=good",
"then": {
"en": "Usable for thin wheels: racing bike",
- "nl": "Geschikt voor fijne wielen: racefiets"
+ "nl": "Geschikt voor fijne wielen: racefiets",
+ "de": "Geeignet für dünne Reifen: Rennrad"
}
},
{
@@ -462,14 +494,16 @@
"if": "cycleway:smoothness=very_horrible",
"then": {
"en": "Usable for specialized off-road vehicles: tractor, ATV",
- "nl": "Geschikt voor gespecialiseerde terreinwagens: tractor, alleterreinwagen"
+ "nl": "Geschikt voor gespecialiseerde terreinwagens: tractor, alleterreinwagen",
+ "de": "Geeignet für Geländefahrzeuge: Traktor, ATV"
}
},
{
"if": "cycleway:smoothness=impassable",
"then": {
"en": "Impassable / No wheeled vehicle",
- "nl": "Niet geschikt voor voertuigen met wielen"
+ "nl": "Niet geschikt voor voertuigen met wielen",
+ "de": "Unpassierbar / Keine bereiften Fahrzeuge"
}
}
],
@@ -478,7 +512,8 @@
{
"render": {
"en": "This road is made of {surface}",
- "nl": "Deze weg is gemaakt van {surface}"
+ "nl": "Deze weg is gemaakt van {surface}",
+ "de": "Der Radweg ist aus {surface}"
},
"freeform": {
"key": "surface"
@@ -496,7 +531,8 @@
"if": "surface=paved",
"then": {
"en": "This cycleway is paved",
- "nl": "Dit fietspad is geplaveid"
+ "nl": "Dit fietspad is geplaveid",
+ "de": "Dieser Radweg hat einen festen Belag"
},
"hideInAnswer": true
},
@@ -504,7 +540,8 @@
"if": "surface=asphalt",
"then": {
"en": "This cycleway is made of asphalt",
- "nl": "Dit fietspad is gemaakt van asfalt"
+ "nl": "Dit fietspad is gemaakt van asfalt",
+ "de": "Der Radweg ist aus Asphalt"
}
},
{
@@ -518,7 +555,8 @@
"if": "surface=concrete",
"then": {
"en": "This cycleway is made of concrete",
- "nl": "Dit fietspad is gemaakt van beton"
+ "nl": "Dit fietspad is gemaakt van beton",
+ "de": "Der Radweg ist aus Beton"
}
},
{
@@ -547,35 +585,40 @@
"if": "surface=wood",
"then": {
"en": "This cycleway is made of wood",
- "nl": "Dit fietspad is gemaakt van hout"
+ "nl": "Dit fietspad is gemaakt van hout",
+ "de": "Der Radweg ist aus Holz"
}
},
{
"if": "surface=gravel",
"then": {
"en": "This cycleway is made of gravel",
- "nl": "Dit fietspad is gemaakt van grind"
+ "nl": "Dit fietspad is gemaakt van grind",
+ "de": "Der Radweg ist aus Schotter"
}
},
{
"if": "surface=fine_gravel",
"then": {
"en": "This cycleway is made of fine gravel",
- "nl": "Dit fietspad is gemaakt van fijn grind"
+ "nl": "Dit fietspad is gemaakt van fijn grind",
+ "de": "Dieser Radweg besteht aus feinem Schotter"
}
},
{
"if": "surface=pebblestone",
"then": {
"en": "This cycleway is made of pebblestone",
- "nl": "Dit fietspad is gemaakt van kiezelsteentjes"
+ "nl": "Dit fietspad is gemaakt van kiezelsteentjes",
+ "de": "Der Radweg ist aus Kies"
}
},
{
"if": "surface=ground",
"then": {
"en": "This cycleway is made from raw ground",
- "nl": "Dit fietspad is gemaakt van aarde"
+ "nl": "Dit fietspad is gemaakt van aarde",
+ "de": "Dieser Radweg besteht aus Rohboden"
}
}
],
@@ -588,7 +631,8 @@
{
"question": {
"en": "What is the smoothness of this street?",
- "nl": "Wat is de kwaliteit van deze straat?"
+ "nl": "Wat is de kwaliteit van deze straat?",
+ "de": "Wie eben ist diese Straße?"
},
"condition": {
"or": [
@@ -600,13 +644,15 @@
{
"if": "smoothness=excellent",
"then": {
- "en": "Usable for thin rollers: rollerblade, skateboard"
+ "en": "Usable for thin rollers: rollerblade, skateboard",
+ "de": "Geeignet für dünne Rollen: Rollerblades, Skateboard"
}
},
{
"if": "smoothness=good",
"then": {
- "en": "Usable for thin wheels: racing bike"
+ "en": "Usable for thin wheels: racing bike",
+ "de": "Geeignet für dünne Reifen: Rennrad"
}
},
{
@@ -636,13 +682,15 @@
{
"if": "smoothness=very_horrible",
"then": {
- "en": "Usable for specialized off-road vehicles: tractor, ATV"
+ "en": "Usable for specialized off-road vehicles: tractor, ATV",
+ "de": "Geeignet für spezielle Geländewagen: Traktor, ATV"
}
},
{
"if": "smoothness=impassable",
"then": {
- "en": "Impassable / No wheeled vehicle"
+ "en": "Impassable / No wheeled vehicle",
+ "de": "Unpassierbar / Keine bereiften Fahrzeuge"
}
}
],
@@ -677,7 +725,8 @@
"id": "cycleway-lane-track-traffic-signs",
"question": {
"en": "What traffic sign does this cycleway have?",
- "nl": "Welk verkeersbord heeft dit fietspad?"
+ "nl": "Welk verkeersbord heeft dit fietspad?",
+ "de": "Welches Verkehrszeichen hat dieser Radweg?"
},
"condition": {
"or": [
@@ -690,7 +739,8 @@
"if": "cycleway:traffic_sign=BE:D7",
"then": {
"en": "Compulsory cycleway ",
- "nl": "Verplicht fietspad "
+ "nl": "Verplicht fietspad ",
+ "de": "Vorgeschriebener Radweg "
},
"hideInAnswer": "_country!=be"
},
@@ -706,7 +756,8 @@
"if": "cycleway:traffic_sign=BE:D9",
"then": {
"en": "Segregated foot/cycleway ",
- "nl": "Afgescheiden voet-/fietspad "
+ "nl": "Afgescheiden voet-/fietspad ",
+ "de": "Getrennter Fuß-/Radweg "
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@@ -718,7 +769,8 @@
"if": "cycleway:traffic_sign=BE:D10",
"then": {
"en": "Unsegregated foot/cycleway ",
- "nl": "Gedeeld voet-/fietspad "
+ "nl": "Gedeeld voet-/fietspad ",
+ "de": "Gemeinsamer Fuß-/Radweg "
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@@ -730,7 +782,8 @@
"if": "cycleway:traffic_sign=none",
"then": {
"en": "No traffic sign present",
- "nl": "Geen verkeersbord aanwezig"
+ "nl": "Geen verkeersbord aanwezig",
+ "de": "Kein Verkehrsschild vorhanden"
}
}
]
@@ -739,7 +792,8 @@
"id": "cycleway-traffic-signs",
"question": {
"en": "What traffic sign does this cycleway have?",
- "nl": "Welk verkeersbord heeft dit fietspad?"
+ "nl": "Welk verkeersbord heeft dit fietspad?",
+ "de": "Welches Verkehrszeichen hat dieser Radweg?"
},
"condition": {
"or": [
@@ -752,7 +806,8 @@
"if": "traffic_sign=BE:D7",
"then": {
"en": "Compulsory cycleway ",
- "nl": "Verplicht fietspad "
+ "nl": "Verplicht fietspad ",
+ "de": "Vorgeschriebener Radweg "
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@@ -774,7 +829,8 @@
"if": "traffic_sign=BE:D9",
"then": {
"en": "Segregated foot/cycleway ",
- "nl": "Afgescheiden voet-/fietspad "
+ "nl": "Afgescheiden voet-/fietspad ",
+ "de": "Getrennter Fuß-/Radweg "
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@@ -790,7 +846,8 @@
"if": "traffic_sign=BE:D10",
"then": {
"en": "Unsegregated foot/cycleway ",
- "nl": "Gedeeld voet-/fietspad "
+ "nl": "Gedeeld voet-/fietspad ",
+ "de": "Gemeinsamer Fuß-/Radweg "
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@@ -806,7 +863,8 @@
"if": "traffic_sign=none",
"then": {
"en": "No traffic sign present",
- "nl": "Geen verkeersbord aanwezig"
+ "nl": "Geen verkeersbord aanwezig",
+ "de": "Kein Verkehrsschild vorhanden"
}
}
]
@@ -896,7 +954,8 @@
"if": "cycleway:traffic_sign:supplementary=none",
"then": {
"en": "No supplementary traffic sign present",
- "nl": "Geen onderbord aanwezig"
+ "nl": "Geen onderbord aanwezig",
+ "de": "Kein zusätzliches Verkehrszeichen vorhanden"
}
}
]
@@ -929,7 +988,8 @@
"if": "traffic_sign=BE:D7;BE:M13",
"then": {
"en": "",
- "nl": ""
+ "nl": "",
+ "de": ""
},
"hideInAnswer": "_country!=be",
"addExtraTags": [
@@ -986,7 +1046,8 @@
"if": "traffic_sign:supplementary=none",
"then": {
"en": "No supplementary traffic sign present",
- "nl": "Geen onderbord aanwezig"
+ "nl": "Geen onderbord aanwezig",
+ "de": "Kein zusätzliches Verkehrszeichen vorhanden"
}
}
]
@@ -1054,7 +1115,8 @@
"if": "cycleway:separation=kerb",
"then": {
"en": "This cycleway is separated by a kerb",
- "nl": "Dit fietspad is gescheiden van de weg met een stoeprand"
+ "nl": "Dit fietspad is gescheiden van de weg met een stoeprand",
+ "de": "Dieser Radweg ist getrennt durch einen Bordstein"
}
}
]
@@ -1097,7 +1159,8 @@
"if": "separation=kerb",
"then": {
"en": "This cycleway is separated by a kerb",
- "nl": "Dit fietspad is gescheiden van de weg met een stoeprand"
+ "nl": "Dit fietspad is gescheiden van de weg met een stoeprand",
+ "de": "Dieser Radweg ist getrennt durch einen Bordstein"
}
}
]
diff --git a/assets/layers/defibrillator/defibrillator.json b/assets/layers/defibrillator/defibrillator.json
index 8a7fff1ec9..88b63ee646 100644
--- a/assets/layers/defibrillator/defibrillator.json
+++ b/assets/layers/defibrillator/defibrillator.json
@@ -39,7 +39,8 @@
"en": "./assets/layers/defibrillator/aed_checked.svg",
"ru": "./assets/layers/defibrillator/aed_checked.svg",
"it": "./assets/layers/defibrillator/aed_checked.svg",
- "fr": "./assets/layers/defibrillator/aed_checked.svg"
+ "fr": "./assets/layers/defibrillator/aed_checked.svg",
+ "de": "./assets/layers/defibrillator/aed_checked.svg"
}
}
]
@@ -189,7 +190,8 @@
"en": "Not accessible, possibly only for professional use",
"nl": "Niet toegankelijk, mogelijk enkel voor professionals",
"fr": "Pas accessible, peut-être uniquement à usage professionnel",
- "it": "Non accessibile, potrebbe essere solo per uso professionale"
+ "it": "Non accessibile, potrebbe essere solo per uso professionale",
+ "de": "Nicht zugänglich, möglicherweise nur für betriebliche Nutzung"
}
}
],
@@ -235,7 +237,8 @@
"nl": "Dit is een gewone automatische defibrillator",
"fr": "C'est un défibrillateur automatique manuel",
"it": "È un normale defibrillatore automatico",
- "ru": "Это обычный автоматический дефибриллятор"
+ "ru": "Это обычный автоматический дефибриллятор",
+ "de": "Dies ist ein normaler automatischer Defibrillator"
}
}
],
diff --git a/assets/layers/direction/direction.json b/assets/layers/direction/direction.json
index 4d3fd684d5..75cd375c25 100644
--- a/assets/layers/direction/direction.json
+++ b/assets/layers/direction/direction.json
@@ -5,7 +5,8 @@
"nl": "Richtingsvisualisatie",
"fr": "Visualisation de la direction",
"it": "Visualizzazione della direzione",
- "ru": "Визуализация направления"
+ "ru": "Визуализация направления",
+ "de": "Visualisierung der Richtung"
},
"minzoom": 16,
"source": {
@@ -23,7 +24,8 @@
"en": "This layer visualizes directions",
"nl": "Deze laag toont de oriëntatie van een object",
"fr": "Cette couche visualise les directions",
- "it": "Questo livello visualizza le direzioni"
+ "it": "Questo livello visualizza le direzioni",
+ "de": "Diese Ebene visualisiert Richtungen"
},
"tagRenderings": [],
"icon": {
diff --git a/assets/layers/drinking_water/drinking_water.json b/assets/layers/drinking_water/drinking_water.json
index c6040e3af5..a8081734c3 100644
--- a/assets/layers/drinking_water/drinking_water.json
+++ b/assets/layers/drinking_water/drinking_water.json
@@ -108,7 +108,8 @@
"en": "This drinking water is broken",
"nl": "Deze drinkwaterfontein is kapot",
"it": "La fontanella è guasta",
- "fr": "Cette fontaine est cassée"
+ "fr": "Cette fontaine est cassée",
+ "de": "Diese Trinkwasserstelle ist kaputt"
}
},
{
@@ -117,7 +118,8 @@
"en": "This drinking water is closed",
"nl": "Deze drinkwaterfontein is afgesloten",
"it": "La fontanella è chiusa",
- "fr": "Cette fontaine est fermée"
+ "fr": "Cette fontaine est fermée",
+ "de": "Diese Trinkwasserstelle wurde geschlossen"
}
}
],
diff --git a/assets/layers/food/food.json b/assets/layers/food/food.json
index c2c966aac3..41e205c926 100644
--- a/assets/layers/food/food.json
+++ b/assets/layers/food/food.json
@@ -64,7 +64,8 @@
"title": {
"en": "restaurant",
"nl": "restaurant",
- "ru": "ресторан"
+ "ru": "ресторан",
+ "de": "Restaurant"
},
"tags": [
"amenity=restaurant"
@@ -81,7 +82,8 @@
"title": {
"en": "fastfood",
"nl": "fastfood-zaak",
- "ru": "быстрое питание"
+ "ru": "быстрое питание",
+ "de": "Schnellimbiss"
},
"tags": [
"amenity=fast_food"
@@ -97,7 +99,8 @@
{
"title": {
"en": "fries shop",
- "nl": "frituur"
+ "nl": "frituur",
+ "de": "Pommesbude"
},
"tags": [
"amenity=fast_food",
@@ -125,7 +128,8 @@
},
"then": {
"nl": "Restaurant {name}",
- "en": "Restaurant {name}"
+ "en": "Restaurant {name}",
+ "de": "Restaurant {name}"
}
},
{
@@ -137,7 +141,8 @@
},
"then": {
"nl": "Fastfood-zaak {name}",
- "en": "Fastfood {name}"
+ "en": "Fastfood {name}",
+ "de": "Schnellrestaurant{name}"
}
}
]
@@ -147,11 +152,13 @@
{
"question": {
"nl": "Wat is de naam van deze eetgelegenheid?",
- "en": "What is the name of this restaurant?"
+ "en": "What is the name of this restaurant?",
+ "de": "Wie heißt dieses Restaurant?"
},
"render": {
"nl": "De naam van deze eetgelegeheid is {name}",
- "en": "The name of this restaurant is {name}"
+ "en": "The name of this restaurant is {name}",
+ "de": "Das Restaurant heißt {name}"
},
"freeform": {
"key": "name"
@@ -161,7 +168,8 @@
{
"question": {
"en": "What type of business is this?",
- "nl": "Wat voor soort zaak is dit?"
+ "nl": "Wat voor soort zaak is dit?",
+ "de": "Um was für ein Geschäft handelt es sich?"
},
"mappings": [
{
@@ -188,11 +196,13 @@
{
"question": {
"nl": "Welk soort gerechten worden hier geserveerd?",
- "en": "Which food is served here?"
+ "en": "Which food is served here?",
+ "de": "Welches Essen gibt es hier?"
},
"render": {
"nl": "Deze plaats serveert vooral {cuisine}",
- "en": "This place mostly serves {cuisine}"
+ "en": "This place mostly serves {cuisine}",
+ "de": "An diesem Ort gibt es hauptsächlich {cuisine}"
},
"freeform": {
"key": "cuisine",
@@ -219,7 +229,8 @@
"if": "cuisine=pasta",
"then": {
"en": "Mainly serves pasta",
- "nl": "Dit is een pastazaak"
+ "nl": "Dit is een pastazaak",
+ "de": "Bietet vorwiegend Pastagerichte an"
}
},
{
@@ -300,28 +311,32 @@
{
"question": {
"nl": "Biedt deze zaak een afhaalmogelijkheid aan?",
- "en": "Does this place offer takea-way?"
+ "en": "Does this place offer takea-way?",
+ "de": "Ist an diesem Ort Mitnahme möglich?"
},
"mappings": [
{
"if": "takeaway=only",
"then": {
"en": "This is a take-away only business",
- "nl": "Hier is enkel afhaal mogelijk"
+ "nl": "Hier is enkel afhaal mogelijk",
+ "de": "Dieses Geschäft bietet nur Artikel zur Mitnahme an"
}
},
{
"if": "takeaway=yes",
"then": {
"en": "Take-away is possible here",
- "nl": "Eten kan hier afgehaald worden"
+ "nl": "Eten kan hier afgehaald worden",
+ "de": "Mitnahme möglich"
}
},
{
"if": "takeaway=no",
"then": {
"en": "Take-away is not possible here",
- "nl": "Hier is geen afhaalmogelijkheid"
+ "nl": "Hier is geen afhaalmogelijkheid",
+ "de": "Mitnahme nicht möglich"
}
}
],
@@ -404,28 +419,32 @@
"if": "diet:halal=no",
"then": {
"en": "There are no halal options available",
- "nl": "Er zijn geen halal opties aanwezig"
+ "nl": "Er zijn geen halal opties aanwezig",
+ "de": "Hier gibt es keine halal Speisen"
}
},
{
"if": "diet:halal=limited",
"then": {
"en": "There is a small halal menu",
- "nl": "Er zijn een beperkt aantal halal opties"
+ "nl": "Er zijn een beperkt aantal halal opties",
+ "de": "Hier gibt es wenige halal Speisen"
}
},
{
"if": "diet:halal=yes",
"then": {
"nl": "Halal menu verkrijgbaar",
- "en": "There is a halal menu"
+ "en": "There is a halal menu",
+ "de": "Es gibt halal Speisen"
}
},
{
"if": "diet:halal=only",
"then": {
"nl": "Enkel halal opties zijn beschikbaar",
- "en": "Only halal options are available"
+ "en": "Only halal options are available",
+ "de": "Es gibt ausschließlich halal Speisen"
}
}
],
@@ -567,7 +586,8 @@
{
"question": {
"en": "Opened now",
- "nl": "Nu geopened"
+ "nl": "Nu geopened",
+ "de": "Aktuell geöffnet"
},
"osmTags": "_isOpen=yes"
}
@@ -598,7 +618,8 @@
{
"question": {
"en": "Has a vegan menu",
- "nl": "Heeft een veganistisch menu"
+ "nl": "Heeft een veganistisch menu",
+ "de": "Bietet vegan Speisen an"
},
"osmTags": {
"or": [
diff --git a/assets/layers/ghost_bike/ghost_bike.json b/assets/layers/ghost_bike/ghost_bike.json
index de82c8bae4..fe576aef81 100644
--- a/assets/layers/ghost_bike/ghost_bike.json
+++ b/assets/layers/ghost_bike/ghost_bike.json
@@ -174,7 +174,8 @@
"nl": "Wanneer werd deze witte fiets geplaatst?",
"en": "When was this Ghost bike installed?",
"it": "Quando è stata installata questa bici fantasma?",
- "fr": "Quand ce vélo fantôme a-t-il été installée ?"
+ "fr": "Quand ce vélo fantôme a-t-il été installée ?",
+ "de": "Wann wurde dieses Geisterrad aufgestellt?"
},
"render": {
"nl": "Geplaatst op {start_date}",
diff --git a/assets/layers/map/map.json b/assets/layers/map/map.json
index b0031e5732..52083262b8 100644
--- a/assets/layers/map/map.json
+++ b/assets/layers/map/map.json
@@ -31,7 +31,8 @@
"en": "A map, meant for tourists which is permanently installed in the public space",
"nl": "Een permantent geinstalleerde kaart",
"it": "Una mappa, destinata ai turisti e che è sistemata in maniera permanente in uno spazio pubblico",
- "fr": "Une carte, destinée aux touristes, installée en permanence dans l'espace public"
+ "fr": "Une carte, destinée aux touristes, installée en permanence dans l'espace public",
+ "de": "Eine Karte, die für Touristen gedacht ist und dauerhaft im öffentlichen Raum aufgestellt ist"
},
"tagRenderings": [
"images",
diff --git a/assets/layers/observation_tower/observation_tower.json b/assets/layers/observation_tower/observation_tower.json
index 20f92ad8ba..2a0da90555 100644
--- a/assets/layers/observation_tower/observation_tower.json
+++ b/assets/layers/observation_tower/observation_tower.json
@@ -3,14 +3,16 @@
"name": {
"en": "Observation towers",
"nl": "Uitkijktorens",
- "ru": "Смотровые башни"
+ "ru": "Смотровые башни",
+ "de": "Beobachtungstürme"
},
"minzoom": 8,
"title": {
"render": {
"en": "Observation tower",
"nl": "Uitkijktoren",
- "ru": "Смотровая башня"
+ "ru": "Смотровая башня",
+ "de": "Beobachtungsturm"
},
"mappings": [
{
@@ -18,25 +20,29 @@
"then": {
"en": "{name}",
"nl": "{name}",
- "ru": "{name}"
+ "ru": "{name}",
+ "de": "{name}"
}
}
]
},
"description": {
"en": "Towers with a panoramic view",
- "nl": "Torens om van het uitzicht te genieten"
+ "nl": "Torens om van het uitzicht te genieten",
+ "de": "Türme mit Panoramablick"
},
"tagRenderings": [
"images",
{
"question": {
"en": "What is the name of this tower?",
- "nl": "Heeft deze toren een naam?"
+ "nl": "Heeft deze toren een naam?",
+ "de": "Wie heißt dieser Turm?"
},
"render": {
"en": "This tower is called {name}",
- "nl": "Deze toren heet {name}"
+ "nl": "Deze toren heet {name}",
+ "de": "Der Name dieses Turms lautet {name}"
},
"freeform": {
"key": "name"
@@ -46,7 +52,8 @@
"if": "noname=yes",
"then": {
"en": "This tower doesn't have a specific name",
- "nl": "Deze toren heeft geen specifieke naam"
+ "nl": "Deze toren heeft geen specifieke naam",
+ "de": "Dieser Turm hat keinen eigenen Namen"
}
}
],
@@ -55,11 +62,13 @@
{
"question": {
"en": "What is the height of this tower?",
- "nl": "Hoe hoog is deze toren?"
+ "nl": "Hoe hoog is deze toren?",
+ "de": "Wie hoch ist dieser Turm?"
},
"render": {
"en": "This tower is {height} high",
- "nl": "Deze toren is {height} hoog"
+ "nl": "Deze toren is {height} hoog",
+ "de": "Dieser Turm ist {height} hoch"
},
"freeform": {
"key": "height",
@@ -70,11 +79,13 @@
{
"question": {
"en": "Who maintains this tower?",
- "nl": "Wie onderhoudt deze toren?"
+ "nl": "Wie onderhoudt deze toren?",
+ "de": "Wer betreibt diesen Turm?"
},
"render": {
"nl": "Wordt onderhouden door {operator}",
- "en": "Maintained by {operator}"
+ "en": "Maintained by {operator}",
+ "de": "Betrieben von {operator}"
},
"freeform": {
"key": "operator"
@@ -89,7 +100,8 @@
},
"render": {
"en": "Visiting this tower costs {charge}",
- "nl": "Deze toren bezoeken kost {charge}"
+ "nl": "Deze toren bezoeken kost {charge}",
+ "de": "Der Besuch des Turms kostet {charge}"
},
"freeform": {
"key": "charge",
@@ -107,7 +119,8 @@
},
"then": {
"en": "Free to visit",
- "nl": "Gratis te bezoeken"
+ "nl": "Gratis te bezoeken",
+ "de": "Eintritt kostenlos"
}
}
],
@@ -150,7 +163,8 @@
"title": {
"en": "observation tower",
"nl": "Uitkijktoren",
- "ru": "смотровая башня"
+ "ru": "смотровая башня",
+ "de": "Beobachtungsturm"
},
"description": {
"nl": "Een publiek toegankelijke uitkijktoren"
@@ -179,7 +193,8 @@
"human": {
"nl": " meter",
"en": " meter",
- "ru": " метр"
+ "ru": " метр",
+ "de": " Meter"
}
}
],
diff --git a/assets/layers/picnic_table/picnic_table.json b/assets/layers/picnic_table/picnic_table.json
index e4cdc4ac2d..d98331acc1 100644
--- a/assets/layers/picnic_table/picnic_table.json
+++ b/assets/layers/picnic_table/picnic_table.json
@@ -27,7 +27,8 @@
"nl": "Deze laag toont picnictafels",
"it": "Il livello che mostra i tavoli da picnic",
"fr": "La couche montrant les tables de pique-nique",
- "ru": "Слой, отображающий столы для пикника"
+ "ru": "Слой, отображающий столы для пикника",
+ "de": "Die Ebene zeigt Picknicktische an"
},
"tagRenderings": [
{
diff --git a/assets/layers/playground/playground.json b/assets/layers/playground/playground.json
index 1baaab7cce..653b6c83f4 100644
--- a/assets/layers/playground/playground.json
+++ b/assets/layers/playground/playground.json
@@ -205,7 +205,8 @@
"en": "Accessible to kids older than {min_age} years",
"it": "Accessibile ai bambini di almeno {min_age} anni",
"ru": "Доступно для детей старше {min_age} лет",
- "fr": "Accessible aux enfants de plus de {min_age} ans"
+ "fr": "Accessible aux enfants de plus de {min_age} ans",
+ "de": "Zugang nur für Kinder ab {min_age} Jahren"
},
"question": {
"nl": "Wat is de minimale leeftijd om op deze speeltuin te mogen?",
@@ -226,7 +227,8 @@
"en": "Accessible to kids of at most {max_age}",
"it": "Accessibile ai bambini di età inferiore a {max_age}",
"fr": "Accessible aux enfants de {max_age} au maximum",
- "ru": "Доступно детям до {max_age}"
+ "ru": "Доступно детям до {max_age}",
+ "de": "Zugang nur für Kinder bis maximal {max_age}"
},
"question": {
"nl": "Wat is de maximaal toegestane leeftijd voor deze speeltuin?",
@@ -428,7 +430,8 @@
"en": "When is this playground accessible?",
"fr": "Quand ce terrain de jeux est-il accessible ?",
"it": "Quando si può accedere a questo campetto?",
- "ru": "Когда открыта эта игровая площадка?"
+ "ru": "Когда открыта эта игровая площадка?",
+ "de": "Wann ist dieser Spielplatz zugänglich?"
},
"mappings": [
{
@@ -438,7 +441,8 @@
"en": "Accessible from sunrise till sunset",
"fr": "Accessible du lever au coucher du soleil",
"it": "Si può accedere dall'alba al tramonto",
- "ru": "Открыто от рассвета до заката"
+ "ru": "Открыто от рассвета до заката",
+ "de": "Zugänglich von Sonnenaufgang bis Sonnenuntergang"
}
},
{
@@ -448,7 +452,8 @@
"en": "Always accessible",
"fr": "Toujours accessible",
"ru": "Всегда доступен",
- "it": "Si può sempre accedere"
+ "it": "Si può sempre accedere",
+ "de": "Immer zugänglich"
}
},
{
@@ -458,7 +463,8 @@
"en": "Always accessible",
"ru": "Всегда доступен",
"fr": "Toujours accessible",
- "it": "Si può sempre accedere"
+ "it": "Si può sempre accedere",
+ "de": "Immer zugänglich"
},
"hideInAnswer": true
}
@@ -523,7 +529,8 @@
"en": "Playground",
"ru": "Детская площадка",
"fr": "Terrain de jeux",
- "it": "Campetto"
+ "it": "Campetto",
+ "de": "Spielplatz"
}
}
],
diff --git a/assets/layers/public_bookcase/public_bookcase.json b/assets/layers/public_bookcase/public_bookcase.json
index 64b6230c16..407751fd95 100644
--- a/assets/layers/public_bookcase/public_bookcase.json
+++ b/assets/layers/public_bookcase/public_bookcase.json
@@ -467,7 +467,8 @@
{
"question": {
"nl": "Binnen of buiten",
- "en": "Indoor or outdoor"
+ "en": "Indoor or outdoor",
+ "de": "Innen oder Außen"
}
},
{
diff --git a/assets/layers/shops/shops.json b/assets/layers/shops/shops.json
index 1e5679d483..9f1910aeff 100644
--- a/assets/layers/shops/shops.json
+++ b/assets/layers/shops/shops.json
@@ -21,7 +21,8 @@
"fr": "Magasin",
"ru": "Магазин",
"ja": "店",
- "nl": "Winkel"
+ "nl": "Winkel",
+ "de": "Geschäft"
},
"mappings": [
{
@@ -34,7 +35,8 @@
"en": "{name}",
"fr": "{name}",
"ru": "{name}",
- "ja": "{name}"
+ "ja": "{name}",
+ "de": "{name}"
}
},
{
@@ -47,7 +49,8 @@
"en": "{shop}",
"fr": "{shop}",
"ru": "{shop}",
- "ja": "{shop}"
+ "ja": "{shop}",
+ "de": "{shop}"
}
}
]
@@ -79,13 +82,15 @@
"render": {
"en": "This shop sells {shop}",
"fr": "Ce magasin vends {shop}",
- "ja": "こちらのお店では{shop}を販売しております"
+ "ja": "こちらのお店では{shop}を販売しております",
+ "de": "Dieses Geschäft verkauft {shop}"
},
"question": {
"en": "What does this shop sell?",
"fr": "Que vends ce magasin ?",
"ja": "このお店では何を売っていますか?",
- "ru": "Что продаётся в этом магазине?"
+ "ru": "Что продаётся в этом магазине?",
+ "de": "Was wird in diesem Geschäft verkauft?"
},
"freeform": {
"key": "shop"
@@ -100,7 +105,8 @@
"then": {
"en": "Convenience store",
"fr": "Épicerie/superette",
- "ja": "コンビニエンスストア"
+ "ja": "コンビニエンスストア",
+ "de": "Lebensmittelladen"
}
},
{
@@ -114,7 +120,8 @@
"fr": "Supermarché",
"ru": "Супермаркет",
"ja": "スーパーマーケット",
- "nl": "Supermarkt"
+ "nl": "Supermarkt",
+ "de": "Supermarkt"
}
},
{
@@ -127,7 +134,8 @@
"en": "Clothing store",
"fr": "Magasin de vêtements",
"ru": "Магазин одежды",
- "ja": "衣料品店"
+ "ja": "衣料品店",
+ "de": "Bekleidungsgeschäft"
}
},
{
@@ -141,7 +149,8 @@
"fr": "Coiffeur",
"ru": "Парикмахерская",
"ja": "理容師",
- "nl": "Kapper"
+ "nl": "Kapper",
+ "de": "Friseur"
}
},
{
@@ -154,7 +163,8 @@
"en": "Bakery",
"fr": "Boulangerie",
"ja": "ベーカリー",
- "nl": "Bakkerij"
+ "nl": "Bakkerij",
+ "de": "Bäckerei"
}
},
{
@@ -166,7 +176,8 @@
"then": {
"en": "Car repair (garage)",
"fr": "Garagiste",
- "ja": "自動車修理(ガレージ)"
+ "ja": "自動車修理(ガレージ)",
+ "de": "Autoreparatur (Werkstatt)"
}
},
{
@@ -179,7 +190,8 @@
"en": "Car dealer",
"fr": "Concessionnaire",
"ru": "Автосалон",
- "ja": "自動車ディーラー"
+ "ja": "自動車ディーラー",
+ "de": "Autohändler"
}
}
],
@@ -192,7 +204,8 @@
"ca": "{phone}",
"id": "{phone}",
"ru": "{phone}",
- "ja": "{phone}"
+ "ja": "{phone}",
+ "de": "{phone}"
},
"question": {
"en": "What is the phone number?",
@@ -214,14 +227,16 @@
"ca": "{website}",
"id": "{website}",
"ru": "{website}",
- "ja": "{website}"
+ "ja": "{website}",
+ "de": "{website}"
},
"question": {
"en": "What is the website of this shop?",
"fr": "Quel est le site internet de ce magasin ?",
"ja": "このお店のホームページは何ですか?",
"nl": "Wat is de website van deze winkel?",
- "ru": "Какой веб-сайт у этого магазина?"
+ "ru": "Какой веб-сайт у этого магазина?",
+ "de": "Wie lautet die Webseite dieses Geschäfts?"
},
"freeform": {
"key": "website",
@@ -309,7 +324,8 @@
"fr": "Ajouter un nouveau magasin",
"ru": "Добавить новый магазин",
"ja": "新しい店を追加する",
- "nl": "Voeg een nieuwe winkel toe"
+ "nl": "Voeg een nieuwe winkel toe",
+ "de": "Ein neues Geschäft hinzufügen"
}
}
],
diff --git a/assets/layers/slow_roads/slow_roads.json b/assets/layers/slow_roads/slow_roads.json
index 50e7cd61d3..7f559bf2cd 100644
--- a/assets/layers/slow_roads/slow_roads.json
+++ b/assets/layers/slow_roads/slow_roads.json
@@ -116,7 +116,8 @@
"en": "The surface is {surface}",
"ru": "Поверхность - {surface}",
"fr": "La surface en {surface}",
- "it": "La superficie è {surface}"
+ "it": "La superficie è {surface}",
+ "de": "Die Oberfläche ist {surface}"
},
"freeform": {
"key": "surface"
@@ -129,7 +130,8 @@
"en": "The surface is grass",
"ru": "Поверхность - трава",
"fr": "La surface est en herbe",
- "it": "La superficie è erba"
+ "it": "La superficie è erba",
+ "de": "Die Oberfläche ist Gras"
}
},
{
@@ -139,7 +141,8 @@
"en": "The surface is ground",
"ru": "Поверхность - земля",
"fr": "La surface est en terre",
- "it": "La superficie è terreno"
+ "it": "La superficie è terreno",
+ "de": "Die Oberfläche ist Erde"
}
},
{
@@ -148,7 +151,8 @@
"nl": "De ondergrond is onverhard",
"en": "The surface is unpaved",
"fr": "La surface est non pavée",
- "it": "La superficie è non pavimentata"
+ "it": "La superficie è non pavimentata",
+ "de": "Die Oberfläche ist ohne festen Belag"
},
"hideInAnswer": true
},
@@ -159,7 +163,8 @@
"en": "The surface is sand",
"ru": "Поверхность - песок",
"fr": "La surface est en sable",
- "it": "La superficie è sabbia"
+ "it": "La superficie è sabbia",
+ "de": "Die Oberfläche ist Sand"
}
},
{
@@ -169,7 +174,8 @@
"en": "The surface is paving stones",
"ru": "Поверхность - брусчатка",
"it": "La superficie è pietre irregolari",
- "fr": "La surface est en pierres pavées"
+ "fr": "La surface est en pierres pavées",
+ "de": "Die Oberfläche ist aus Pflastersteinen"
}
},
{
@@ -179,7 +185,8 @@
"en": "The surface is asphalt",
"ru": "Поверхность - асфальт",
"it": "La superficie è asfalto",
- "fr": "La surface est en bitume"
+ "fr": "La surface est en bitume",
+ "de": "Die Oberfläche ist Asphalt"
}
},
{
@@ -189,7 +196,8 @@
"en": "The surface is concrete",
"ru": "Поверхность - бетон",
"fr": "La surface est en béton",
- "it": "La superficie è calcestruzzo"
+ "it": "La superficie è calcestruzzo",
+ "de": "Die Oberfläche ist Beton"
}
},
{
@@ -198,7 +206,8 @@
"nl": "De ondergrond is verhard",
"en": "The surface is paved",
"fr": "La surface est pavée",
- "it": "La superficie è pavimentata"
+ "it": "La superficie è pavimentata",
+ "de": "Die Oberfläche ist gepflastert"
},
"hideInAnswer": true
}
diff --git a/assets/layers/sport_pitch/sport_pitch.json b/assets/layers/sport_pitch/sport_pitch.json
index 90f1dca732..5d437fe425 100644
--- a/assets/layers/sport_pitch/sport_pitch.json
+++ b/assets/layers/sport_pitch/sport_pitch.json
@@ -5,7 +5,8 @@
"fr": "Terrains de sport",
"en": "Sport pitches",
"ru": "Спортивные площадки",
- "it": "Campi sportivi"
+ "it": "Campi sportivi",
+ "de": "Sportplätze"
},
"wayHandling": 1,
"minzoom": 12,
@@ -25,7 +26,8 @@
"fr": "Terrain de sport",
"en": "Sport pitch",
"ru": "Спортивная площадка",
- "it": "Campo sportivo"
+ "it": "Campo sportivo",
+ "de": "Sportplatz"
}
},
"description": {
@@ -33,7 +35,8 @@
"fr": "Un terrain de sport",
"en": "A sport pitch",
"it": "Un campo sportivo",
- "ru": "Спортивная площадка"
+ "ru": "Спортивная площадка",
+ "de": "Ein Sportplatz"
},
"tagRenderings": [
"images",
@@ -42,7 +45,8 @@
"nl": "Hier kan men {sport} beoefenen",
"fr": "Ici on joue au {sport}",
"en": "{sport} is played here",
- "it": "Qui si gioca a {sport}"
+ "it": "Qui si gioca a {sport}",
+ "de": "Hier wird {sport} gespielt"
},
"freeform": {
"key": "sport"
@@ -51,7 +55,8 @@
"nl": "Welke sporten kan men hier beoefenen?",
"fr": "À quel sport peut-on jouer ici ?",
"en": "Which sport can be played here?",
- "it": "Quale sport si gioca qui?"
+ "it": "Quale sport si gioca qui?",
+ "de": "Welche Sportarten können hier gespielt werden?"
},
"multiAnswer": true,
"mappings": [
@@ -66,7 +71,8 @@
"fr": "Ici, on joue au basketball",
"en": "Basketball is played here",
"it": "Qui si gioca a basket",
- "ru": "Здесь можно играть в баскетбол"
+ "ru": "Здесь можно играть в баскетбол",
+ "de": "Hier wird Basketball gespielt"
}
},
{
@@ -80,7 +86,8 @@
"fr": "Ici, on joue au football",
"en": "Soccer is played here",
"it": "Qui si gioca a calcio",
- "ru": "Здесь можно играть в футбол"
+ "ru": "Здесь можно играть в футбол",
+ "de": "Hier wird Fußball gespielt"
}
},
{
@@ -94,7 +101,8 @@
"fr": "C'est une table de ping-pong",
"en": "This is a pingpong table",
"ru": "Это стол для пинг-понга",
- "it": "Questo è un tavolo da ping pong"
+ "it": "Questo è un tavolo da ping pong",
+ "de": "Dies ist eine Tischtennisplatte"
}
},
{
@@ -108,7 +116,8 @@
"fr": "Ici, on joue au tennis",
"en": "Tennis is played here",
"it": "Qui si gioca a tennis",
- "ru": "Здесь можно играть в теннис"
+ "ru": "Здесь можно играть в теннис",
+ "de": "Hier wird Tennis gespielt"
}
},
{
@@ -122,7 +131,8 @@
"fr": "Ici, on joue au korfball",
"en": "Korfball is played here",
"it": "Qui si gioca a korfball",
- "ru": "Здесь можно играть в корфбол"
+ "ru": "Здесь можно играть в корфбол",
+ "de": "Hier wird Kopfball gespielt"
}
},
{
@@ -136,7 +146,8 @@
"fr": "Ici, on joue au basketball",
"en": "Basketball is played here",
"it": "Qui si gioca a basket",
- "ru": "Здесь можно играть в баскетбол"
+ "ru": "Здесь можно играть в баскетбол",
+ "de": "Hier wird Basketball gespielt"
},
"hideInAnswer": true
}
@@ -156,7 +167,8 @@
"fr": "La surface est {surface}",
"en": "The surface is {surface}",
"ru": "Поверхность - {surface}",
- "it": "La superficie è {surface}"
+ "it": "La superficie è {surface}",
+ "de": "Die Oberfläche ist {surface}"
},
"freeform": {
"key": "surface"
@@ -169,7 +181,8 @@
"fr": "La surface est de l'herbe",
"en": "The surface is grass",
"ru": "Поверхность - трава",
- "it": "La superficie è erba"
+ "it": "La superficie è erba",
+ "de": "Die Oberfläche ist Gras"
}
},
{
@@ -179,7 +192,8 @@
"fr": "La surface est du sable",
"en": "The surface is sand",
"ru": "Поверхность - песок",
- "it": "La superficie è sabbia"
+ "it": "La superficie è sabbia",
+ "de": "Die Oberfläche ist Sand"
}
},
{
@@ -189,7 +203,8 @@
"fr": "La surface est des pavés",
"en": "The surface is paving stones",
"ru": "Поверхность - брусчатка",
- "it": "La superficie è pietre irregolari"
+ "it": "La superficie è pietre irregolari",
+ "de": "Die Oberfläche ist aus Pflastersteinen"
}
},
{
@@ -199,7 +214,8 @@
"fr": "La surface est de l'asphalte",
"en": "The surface is asphalt",
"ru": "Поверхность - асфальт",
- "it": "La superficie è asfalto"
+ "it": "La superficie è asfalto",
+ "de": "Die Oberfläche ist Asphalt"
}
},
{
@@ -209,7 +225,8 @@
"fr": "La surface est du béton",
"en": "The surface is concrete",
"ru": "Поверхность - бетон",
- "it": "La superficie è calcestruzzo"
+ "it": "La superficie è calcestruzzo",
+ "de": "Die Oberfläche ist Beton"
}
}
],
@@ -222,7 +239,8 @@
"fr": "Est-ce que ce terrain de sport est accessible au public ?",
"en": "Is this sport pitch publicly accessible?",
"it": "Questo campo sportivo è aperto al pubblico?",
- "ru": "Есть ли свободный доступ к этой спортивной площадке?"
+ "ru": "Есть ли свободный доступ к этой спортивной площадке?",
+ "de": "Ist dieser Sportplatz öffentlich zugänglich?"
},
"mappings": [
{
@@ -232,7 +250,8 @@
"fr": "Accessible au public",
"en": "Public access",
"it": "Aperto al pubblico",
- "ru": "Свободный доступ"
+ "ru": "Свободный доступ",
+ "de": "Öffentlicher Zugang"
}
},
{
@@ -252,7 +271,8 @@
"fr": "Accessible uniquement aux membres du club",
"en": "Only accessible for members of the club",
"it": "Accesso limitato ai membri dell'associazione",
- "ru": "Доступ только членам клуба"
+ "ru": "Доступ только членам клуба",
+ "de": "Zugang nur für Vereinsmitglieder"
}
},
{
@@ -261,7 +281,8 @@
"nl": "Privaat en niet toegankelijk",
"fr": "Privé - Pas accessible au public",
"en": "Private - not accessible to the public",
- "it": "Privato - non aperto al pubblico"
+ "it": "Privato - non aperto al pubblico",
+ "de": "Privat - kein öffentlicher Zugang"
}
}
]
@@ -319,7 +340,8 @@
"fr": "On ne peut pas réserver",
"en": "Making an appointment is not possible",
"it": "Non è possibile prenotare",
- "ru": "Невозможна предварительная запись"
+ "ru": "Невозможна предварительная запись",
+ "de": "Termine nach Vereinbarung nicht möglich"
}
}
]
@@ -358,7 +380,8 @@
"fr": "Quand ce terrain est-il accessible ?",
"en": "When is this pitch accessible?",
"it": "Quando è aperto questo campo sportivo?",
- "ru": "В какое время доступна эта площадка?"
+ "ru": "В какое время доступна эта площадка?",
+ "de": "Wann ist dieser Sportplatz zugänglich?"
},
"render": "Openingsuren: {opening_hours_table()}",
"freeform": {
@@ -378,7 +401,8 @@
"fr": "Accessible en permanence",
"en": "Always accessible",
"ru": "Всегда доступен",
- "it": "Sempre aperto"
+ "it": "Sempre aperto",
+ "de": "Immer zugänglich"
}
}
],
@@ -470,7 +494,8 @@
"fr": "Table de ping-pong",
"en": "Tabletennis table",
"it": "Tavolo da tennistavolo",
- "ru": "Стол для настольного тенниса"
+ "ru": "Стол для настольного тенниса",
+ "de": "Tischtennisplatte"
},
"tags": [
"leisure=pitch",
@@ -483,7 +508,8 @@
"fr": "Terrain de sport",
"en": "Sport pitch",
"ru": "Спортивная площадка",
- "it": "Campo sportivo"
+ "it": "Campo sportivo",
+ "de": "Sportplatz"
},
"tags": [
"leisure=pitch",
diff --git a/assets/layers/surveillance_camera/surveillance_camera.json b/assets/layers/surveillance_camera/surveillance_camera.json
index 7472ffd80a..8750fa7839 100644
--- a/assets/layers/surveillance_camera/surveillance_camera.json
+++ b/assets/layers/surveillance_camera/surveillance_camera.json
@@ -5,7 +5,8 @@
"nl": "Bewakingscamera's",
"ru": "Камеры наблюдения",
"fr": "Caméras de surveillance",
- "it": "Videocamere di sorveglianza"
+ "it": "Videocamere di sorveglianza",
+ "de": "Überwachungskameras"
},
"minzoom": 12,
"source": {
@@ -28,7 +29,8 @@
"nl": "Bewakingscamera",
"ru": "Камера наблюдения",
"fr": "Caméra de surveillance",
- "it": "Videocamera di sorveglianza"
+ "it": "Videocamera di sorveglianza",
+ "de": "Überwachungskamera"
}
},
"tagRenderings": [
@@ -39,7 +41,8 @@
"nl": "Wat voor soort camera is dit?",
"fr": "Quel genre de caméra est-ce ?",
"it": "Di che tipo di videocamera si tratta?",
- "ru": "Какая это камера?"
+ "ru": "Какая это камера?",
+ "de": "Um welche Kameratyp handelt se sich?"
},
"mappings": [
{
@@ -52,7 +55,8 @@
"en": "A fixed (non-moving) camera",
"nl": "Een vaste camera",
"fr": "Une caméra fixe (non mobile)",
- "it": "Una videocamera fissa (non semovente)"
+ "it": "Una videocamera fissa (non semovente)",
+ "de": "Eine fest montierte (nicht bewegliche) Kamera"
}
},
{
@@ -66,7 +70,8 @@
"nl": "Een dome (bolvormige camera die kan draaien)",
"fr": "Une caméra dôme (qui peut tourner)",
"it": "Una videocamera a cupola (che può ruotare)",
- "ru": "Камера с поворотным механизмом"
+ "ru": "Камера с поворотным механизмом",
+ "de": "Eine Kuppelkamera (drehbar)"
}
},
{
@@ -80,7 +85,8 @@
"nl": "Een camera die (met een motor) van links naar rechts kan draaien",
"ru": "Панорамная камера",
"fr": "Une caméra panoramique",
- "it": "Una videocamera panoramica"
+ "it": "Una videocamera panoramica",
+ "de": "Eine bewegliche Kamera"
}
}
],
@@ -143,13 +149,15 @@
"en": "Who operates this CCTV?",
"nl": "Wie beheert deze bewakingscamera?",
"fr": "Qui exploite ce système de vidéosurveillance ?",
- "it": "Chi gestisce questa videocamera a circuito chiuso?"
+ "it": "Chi gestisce questa videocamera a circuito chiuso?",
+ "de": "Wer betreibt diese CCTV Kamera?"
},
"render": {
"en": "Operated by {operator}",
"nl": "Beheer door {operator}",
"fr": "Exploité par {operator}",
- "it": "È gestita da {operator}"
+ "it": "È gestita da {operator}",
+ "de": "Betrieben von {operator}"
},
"id": "Operator"
},
@@ -222,7 +230,8 @@
"en": "This camera is located indoors",
"nl": "Deze camera bevindt zich binnen",
"fr": "Cette caméra est située à l'intérieur",
- "it": "Questa videocamera si trova al chiuso"
+ "it": "Questa videocamera si trova al chiuso",
+ "de": "Diese Kamera befindet sich im Innenraum"
}
},
{
@@ -232,7 +241,8 @@
"nl": "Deze camera bevindt zich buiten",
"fr": "Cette caméra est située à l'extérieur",
"it": "Questa videocamera si trova all'aperto",
- "ru": "Эта камера расположена снаружи"
+ "ru": "Эта камера расположена снаружи",
+ "de": "Diese Kamera befindet sich im Freien"
}
},
{
@@ -242,7 +252,8 @@
"nl": "Deze camera bevindt zich waarschijnlijk buiten",
"fr": "Cette caméra est probablement située à l'extérieur",
"it": "Questa videocamera si trova probabilmente all'esterno",
- "ru": "Возможно, эта камера расположена снаружи"
+ "ru": "Возможно, эта камера расположена снаружи",
+ "de": "Diese Kamera ist möglicherweise im Freien"
},
"hideInAnswer": true
}
@@ -254,13 +265,15 @@
"en": "On which level is this camera located?",
"nl": "Op welke verdieping bevindt deze camera zich?",
"fr": "À quel niveau se trouve cette caméra ?",
- "it": "A che piano si trova questa videocamera?"
+ "it": "A che piano si trova questa videocamera?",
+ "de": "Auf welcher Ebene befindet sich diese Kamera?"
},
"render": {
"en": "Located on level {level}",
"nl": "Bevindt zich op verdieping {level}",
"fr": "Situé au niveau {level}",
- "it": "Si trova al piano {level}"
+ "it": "Si trova al piano {level}",
+ "de": "Befindet sich auf Ebene {level}"
},
"freeform": {
"key": "level",
@@ -279,7 +292,8 @@
"en": "What exactly is surveilled here?",
"nl": "Wat wordt hier precies bewaakt?",
"fr": "Qu'est-ce qui est surveillé ici ?",
- "it": "Che cosa è sorvegliato qui?"
+ "it": "Che cosa è sorvegliato qui?",
+ "de": "Was genau wird hier überwacht?"
},
"freeform": {
"key": "surveillance:zone"
@@ -288,7 +302,8 @@
"en": " Surveills a {surveillance:zone}",
"nl": "Bewaakt een {surveillance:zone}",
"fr": " Surveille un(e) {surveillance:zone}",
- "it": " Sorveglia una {surveillance:zone}"
+ "it": " Sorveglia una {surveillance:zone}",
+ "de": " Überwacht ein/e {surveillance:zone}"
},
"mappings": [
{
@@ -301,7 +316,8 @@
"en": "Surveills a parking",
"nl": "Bewaakt een parking",
"fr": "Surveille un parking",
- "it": "Sorveglia un parcheggio"
+ "it": "Sorveglia un parcheggio",
+ "de": "Überwacht einen Parkplatz"
}
},
{
@@ -314,7 +330,8 @@
"en": "Surveills the traffic",
"nl": "Bewaakt het verkeer",
"fr": "Surveille la circulation",
- "it": "Sorveglia il traffico"
+ "it": "Sorveglia il traffico",
+ "de": "Überwacht den Verkehr"
}
},
{
@@ -327,7 +344,8 @@
"en": "Surveills an entrance",
"nl": "Bewaakt een ingang",
"fr": "Surveille une entrée",
- "it": "Sorveglia un ingresso"
+ "it": "Sorveglia un ingresso",
+ "de": "Überwacht einen Eingang"
}
},
{
@@ -340,7 +358,8 @@
"en": "Surveills a corridor",
"nl": "Bewaakt een gang",
"fr": "Surveille un couloir",
- "it": "Sorveglia un corridoio"
+ "it": "Sorveglia un corridoio",
+ "de": "Überwacht einen Gang"
}
},
{
@@ -353,7 +372,8 @@
"en": "Surveills a public tranport platform",
"nl": "Bewaakt een perron of bushalte",
"fr": "Surveille un quai de transport public",
- "it": "Sorveglia una pensilina del trasporto pubblico"
+ "it": "Sorveglia una pensilina del trasporto pubblico",
+ "de": "Überwacht eine Haltestelle"
}
},
{
@@ -366,7 +386,8 @@
"en": "Surveills a shop",
"nl": "Bewaakt een winkel",
"fr": "Surveille un magasin",
- "it": "Sorveglia un negozio"
+ "it": "Sorveglia un negozio",
+ "de": "Überwacht ein Geschäft"
}
}
],
@@ -378,13 +399,15 @@
"nl": "Hoe is deze camera geplaatst?",
"fr": "Comment cette caméra est-elle placée ?",
"it": "Com'è posizionata questa telecamera?",
- "ru": "Как расположена эта камера?"
+ "ru": "Как расположена эта камера?",
+ "de": "Wie ist diese Kamera montiert?"
},
"render": {
"en": "Mounting method: {mount}",
"nl": "Montage: {camera:mount}",
"fr": "Méthode de montage : {mount}",
- "it": "Metodo di montaggio: {mount}"
+ "it": "Metodo di montaggio: {mount}",
+ "de": "Montageart: {mount}"
},
"freeform": {
"key": "camera:mount"
diff --git a/assets/layers/toilet/toilet.json b/assets/layers/toilet/toilet.json
index 7b0366ca9b..3c06cbdaa0 100644
--- a/assets/layers/toilet/toilet.json
+++ b/assets/layers/toilet/toilet.json
@@ -462,7 +462,8 @@
{
"question": {
"en": "Wheelchair accessible",
- "nl": "Rolstoel toegankelijk"
+ "nl": "Rolstoel toegankelijk",
+ "de": "Rollstuhlgerecht"
},
"osmTags": "wheelchair=yes"
}
@@ -474,7 +475,8 @@
{
"question": {
"en": "Has a changing table",
- "nl": "Heeft een luiertafel"
+ "nl": "Heeft een luiertafel",
+ "de": "Hat einen Wickeltisch"
},
"osmTags": "changing_table=yes"
}
@@ -486,7 +488,8 @@
{
"question": {
"en": "Free to use",
- "nl": "Gratis toegankelijk"
+ "nl": "Gratis toegankelijk",
+ "de": "Nutzung kostenlos"
},
"osmTags": {
"or": [
diff --git a/assets/layers/trail/trail.json b/assets/layers/trail/trail.json
index fa33cc095a..79c0c92176 100644
--- a/assets/layers/trail/trail.json
+++ b/assets/layers/trail/trail.json
@@ -3,7 +3,8 @@
"name": {
"en": "Trails",
"nl": "Wandeltochten",
- "ru": "Тропы"
+ "ru": "Тропы",
+ "de": "Wanderwege"
},
"minzoom": 12,
"source": {
@@ -23,7 +24,8 @@
"render": {
"en": "Trail",
"nl": "Wandeltocht",
- "ru": "Тропа"
+ "ru": "Тропа",
+ "de": "Wanderweg"
},
"mappings": [
{
@@ -38,7 +40,8 @@
"id": "trail-length",
"render": {
"en": "The trail is {_length:km} kilometers long",
- "nl": "Deze wandeling is {_length:km} kilometer lang"
+ "nl": "Deze wandeling is {_length:km} kilometer lang",
+ "de": "Der Wanderweg ist {_length:km} Kilometer lang"
}
},
{
@@ -104,28 +107,32 @@
"if": "colour=blue",
"then": {
"nl": "Blauwe wandeling",
- "en": "Blue trail"
+ "en": "Blue trail",
+ "de": "Blauer Weg"
}
},
{
"if": "colour=red",
"then": {
"nl": "Rode wandeling",
- "en": "Red trail"
+ "en": "Red trail",
+ "de": "Roter Weg"
}
},
{
"if": "colour=green",
"then": {
"nl": "Groene wandeling",
- "en": "Green trail"
+ "en": "Green trail",
+ "de": "Grüner Weg"
}
},
{
"if": "colour=yellow",
"then": {
"nl": "Gele wandeling",
- "en": "Yellow trail"
+ "en": "Yellow trail",
+ "de": "Gelber Weg"
}
}
],
diff --git a/assets/layers/tree_node/tree_node.json b/assets/layers/tree_node/tree_node.json
index 6d99b8382c..107191a1d7 100644
--- a/assets/layers/tree_node/tree_node.json
+++ b/assets/layers/tree_node/tree_node.json
@@ -50,7 +50,8 @@
"en": "Height: {height}",
"it": "Altezza: {height}",
"ru": "Высота: {height}",
- "fr": "Hauteur : {height}"
+ "fr": "Hauteur : {height}",
+ "de": "Höhe: {height}"
},
"condition": {
"and": [
@@ -69,7 +70,8 @@
"en": "Height: {height} m",
"it": "Altezza: {height} m",
"ru": "Высота: {height} м",
- "fr": "Hauteur : {height} m"
+ "fr": "Hauteur : {height} m",
+ "de": "Höhe: {height} m"
}
}
]
@@ -93,7 +95,8 @@
"nl": " Loofboom",
"en": " Broadleaved",
"it": " Latifoglia",
- "fr": " Feuillu"
+ "fr": " Feuillu",
+ "de": " Laubbaum"
}
},
{
@@ -106,7 +109,8 @@
"nl": " Naaldboom",
"en": " Needleleaved",
"it": " Aghifoglia",
- "fr": " Résineux"
+ "fr": " Résineux",
+ "de": " Nadelbaum"
}
},
{
@@ -119,7 +123,8 @@
"nl": " Permanent bladloos",
"en": " Permanently leafless",
"it": " Privo di foglie (permanente)",
- "fr": " Sans feuilles (Permanent)"
+ "fr": " Sans feuilles (Permanent)",
+ "de": " Dauerhaft blattlos"
},
"hideInAnswer": true
}
@@ -247,7 +252,8 @@
"en": "Is this tree evergreen or deciduous?",
"it": "È un sempreverde o caduco?",
"ru": "Это дерево вечнозелёное или листопадное?",
- "fr": "L’arbre est-il à feuillage persistant ou caduc ?"
+ "fr": "L’arbre est-il à feuillage persistant ou caduc ?",
+ "de": "Ist dies ein Nadelbaum oder ein Laubbaum?"
},
"mappings": [
{
@@ -275,7 +281,8 @@
"en": "Evergreen.",
"it": "Sempreverde.",
"fr": "À feuilles persistantes.",
- "ru": "Вечнозелёное."
+ "ru": "Вечнозелёное.",
+ "de": "immergrüner Baum."
}
}
],
@@ -292,14 +299,16 @@
"it": "Nome: {name}",
"ru": "Название: {name}",
"fr": "Nom : {name}",
- "id": "Nama: {name}"
+ "id": "Nama: {name}",
+ "de": "Name: {name}"
},
"question": {
"nl": "Heeft de boom een naam?",
"en": "Does the tree have a name?",
"it": "L’albero ha un nome?",
"fr": "L'arbre a-t-il un nom ?",
- "ru": "Есть ли у этого дерева название?"
+ "ru": "Есть ли у этого дерева название?",
+ "de": "Hat der Baum einen Namen?"
},
"freeform": {
"key": "name",
@@ -320,7 +329,8 @@
"en": "The tree does not have a name.",
"it": "L’albero non ha un nome.",
"fr": "L'arbre n'a pas de nom.",
- "ru": "У этого дерева нет названия."
+ "ru": "У этого дерева нет названия.",
+ "de": "Der Baum hat keinen Namen."
}
}
],
@@ -339,7 +349,8 @@
"nl": "Is deze boom erkend als erfgoed?",
"en": "Is this tree registered heritage?",
"it": "Quest’albero è registrato come patrimonio?",
- "fr": "Cet arbre est-il inscrit au patrimoine ?"
+ "fr": "Cet arbre est-il inscrit au patrimoine ?",
+ "de": "Ist dieser Baum ein Naturdenkmal?"
},
"mappings": [
{
@@ -395,7 +406,8 @@
"nl": "Niet erkend als erfgoed",
"en": "Not registered as heritage",
"it": "Non è registrato come patrimonio",
- "fr": "Non enregistré comme patrimoine"
+ "fr": "Non enregistré comme patrimoine",
+ "de": "Nicht als Denkmal registriert"
}
},
{
@@ -516,13 +528,15 @@
"en": "Broadleaved tree",
"it": "Albero latifoglia",
"fr": "Arbre feuillu",
- "ru": "Лиственное дерево"
+ "ru": "Лиственное дерево",
+ "de": "Laubbaum"
},
"description": {
"nl": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.",
"en": "A tree of a species with leaves, such as oak or populus.",
"it": "Un albero di una specie con foglie larghe come la quercia o il pioppo.",
- "fr": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier."
+ "fr": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier.",
+ "de": "Ein Baum mit Blättern, z. B. Eiche oder Buche."
},
"preciseInput": {
"preferredBackground": "photo"
@@ -538,14 +552,16 @@
"en": "Needleleaved tree",
"it": "Albero aghifoglia",
"ru": "Хвойное дерево",
- "fr": "Arbre résineux"
+ "fr": "Arbre résineux",
+ "de": "Nadelbaum"
},
"description": {
"nl": "Een boom van een soort met naalden, bijvoorbeeld den of spar.",
"en": "A tree of a species with needles, such as pine or spruce.",
"it": "Un albero di una specie con aghi come il pino o l’abete.",
"ru": "Дерево с хвоей (иглами), например, сосна или ель.",
- "fr": "Une espèce d’arbre avec des épines comme le pin ou l’épicéa."
+ "fr": "Une espèce d’arbre avec des épines comme le pin ou l’épicéa.",
+ "de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte."
},
"preciseInput": {
"preferredBackground": "photo"
@@ -569,7 +585,8 @@
"en": "If you're not sure whether it's a broadleaved or needleleaved tree.",
"it": "Qualora non si sia sicuri se si tratta di un albero latifoglia o aghifoglia.",
"fr": "Si vous n'êtes pas sûr(e) de savoir s'il s'agit d'un arbre à feuilles larges ou à aiguilles.",
- "ru": "Если вы не уверены в том, лиственное это дерево или хвойное."
+ "ru": "Если вы не уверены в том, лиственное это дерево или хвойное.",
+ "de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt."
},
"preciseInput": {
"preferredBackground": "photo"
diff --git a/assets/layers/waste_basket/waste_basket.json b/assets/layers/waste_basket/waste_basket.json
index 98296a9427..1a234e9e0a 100644
--- a/assets/layers/waste_basket/waste_basket.json
+++ b/assets/layers/waste_basket/waste_basket.json
@@ -3,7 +3,8 @@
"name": {
"en": "Waste Basket",
"nl": "Vuilnisbak",
- "ru": "Контейнер для мусора"
+ "ru": "Контейнер для мусора",
+ "de": "Abfalleimer"
},
"minzoom": 17,
"source": {
@@ -17,7 +18,8 @@
"render": {
"en": "Waste Basket",
"nl": "Vuilnisbak",
- "ru": "Контейнер для мусора"
+ "ru": "Контейнер для мусора",
+ "de": "Abfalleimer"
}
},
"description": {
@@ -38,7 +40,8 @@
"if": "waste=",
"then": {
"en": "A waste basket for general waste",
- "nl": "Een vuilnisbak voor zwerfvuil"
+ "nl": "Een vuilnisbak voor zwerfvuil",
+ "de": "Ein Abfalleimer für allgemeinen Müll"
},
"hideInAnswer": true
},
@@ -46,28 +49,32 @@
"if": "waste=trash",
"then": {
"en": "A waste basket for general waste",
- "nl": "Een vuilnisbak voor zwerfvuil"
+ "nl": "Een vuilnisbak voor zwerfvuil",
+ "de": "Ein Abfalleimer für allgemeinen Müll"
}
},
{
"if": "waste=dog_excrement",
"then": {
"en": "A waste basket for dog excrements",
- "nl": "Een vuilnisbak specifiek voor hondenuitwerpselen"
+ "nl": "Een vuilnisbak specifiek voor hondenuitwerpselen",
+ "de": "Ein Abfalleimer für Hundekot"
}
},
{
"if": "waste=cigarettes",
"then": {
"en": "A waste basket for cigarettes",
- "nl": "Een vuilnisbak voor sigarettenpeuken"
+ "nl": "Een vuilnisbak voor sigarettenpeuken",
+ "de": "Mülleimer für Zigaretten"
}
},
{
"if": "waste=drugs",
"then": {
"en": "A waste basket for drugs",
- "nl": "Een vuilnisbak voor (vervallen) medicatie en drugs"
+ "nl": "Een vuilnisbak voor (vervallen) medicatie en drugs",
+ "de": "Mülleimer für Drogen"
}
},
{
@@ -142,7 +149,8 @@
"then": {
"en": "Waste Basket",
"nl": "Vuilnisbak",
- "ru": "Контейнер для мусора"
+ "ru": "Контейнер для мусора",
+ "de": "Abfalleimer"
}
}
]
@@ -158,7 +166,8 @@
"title": {
"en": "Waste Basket",
"nl": "Vuilnisbak",
- "ru": "Контейнер для мусора"
+ "ru": "Контейнер для мусора",
+ "de": "Abfalleimer"
},
"presiceInput": {
"preferredBackground": "photo"
diff --git a/assets/tagRenderings/questions.json b/assets/tagRenderings/questions.json
index 0a9a113fec..cab25af7c1 100644
--- a/assets/tagRenderings/questions.json
+++ b/assets/tagRenderings/questions.json
@@ -131,7 +131,8 @@
"en": "Is this place accessible with a wheelchair?",
"pt": "Este lugar é acessível a utilizadores de cadeiras de rodas?",
"pt_BR": "Este lugar é acessível com uma cadeira de rodas?",
- "de": "Ist dieser Ort mit einem Rollstuhl zugänglich?"
+ "de": "Ist dieser Ort mit einem Rollstuhl zugänglich?",
+ "fr": "Est-ce que cet endroit est accessible en chaise roulante ?"
},
"mappings": [
{
@@ -145,7 +146,7 @@
"en": "This place is specially adapated for wheelchair users",
"pt": "Este lugar está especialmente adaptado para utilizadores de cadeira de rodas",
"pt_BR": "Este lugar é especialmente adaptado para usuários de cadeira de rodas",
- "de": "Dieser Ort ist speziell für Rollstuhlfahrer eingerichtet."
+ "de": "Dieser Ort ist speziell für Rollstuhlfahrer eingerichtet"
}
},
{
@@ -173,7 +174,8 @@
"en": "It is possible to reach this place in a wheelchair, but it is not easy",
"pt": "É possível chegar a este local em cadeira de rodas, mas não é fácil",
"pt_BR": "É possível chegar a esse local em uma cadeira de rodas, mas não é fácil",
- "de": "Es ist möglich, diesen Ort mit einem Rollstuhl zu erreichen, aber es ist nicht einfach"
+ "de": "Es ist möglich, diesen Ort mit einem Rollstuhl zu erreichen, aber es ist nicht einfach",
+ "fr": "Il est possible d'accéder à cet endroit en chaise roulante, mais ce n'est pas facile"
}
},
{
@@ -187,7 +189,8 @@
"en": "This place is not reachable with a wheelchair",
"pt": "Este lugar não é acessível com uma cadeira de rodas",
"pt_BR": "Este lugar não é alcançável com uma cadeira de rodas",
- "de": "Dieser Ort ist nicht mit einem Rollstuhl erreichbar"
+ "de": "Dieser Ort ist nicht mit einem Rollstuhl erreichbar",
+ "fr": "Cet endroit n'est pas accessible en chaise roulante"
}
}
]
@@ -197,7 +200,8 @@
"en": "Are dogs allowed in this business?",
"nl": "Zijn honden toegelaten in deze zaak?",
"pt": "Os cães são permitidos neste estabelecimento?",
- "de": "Sind Hunde in diesem Geschäft erlaubt?"
+ "de": "Sind Hunde in diesem Geschäft erlaubt?",
+ "fr": "Est-ce que les chiens sont admis ici ?"
},
"mappings": [
{
@@ -206,7 +210,8 @@
"en": "Dogs are allowed",
"nl": "honden zijn toegelaten",
"pt": "Os cães são permitidos",
- "de": "Hunde sind erlaubt"
+ "de": "Hunde sind erlaubt",
+ "fr": "Chiens admis"
}
},
{
@@ -215,7 +220,8 @@
"en": "Dogs are not allowed",
"nl": "honden zijn niet toegelaten",
"pt": "Os cães não são permitidos",
- "de": "Hunde sind nicht erlaubt"
+ "de": "Hunde sind nicht erlaubt",
+ "fr": "Les chiens ne sont pas admis"
}
},
{
@@ -224,7 +230,8 @@
"en": "Dogs are allowed, but they have to be leashed",
"nl": "honden zijn enkel aan de leiband welkom",
"pt": "Os cães são permitidos, mas têm de ser presos pela trela",
- "de": "Hunde sind erlaubt, müssen aber angeleint sein."
+ "de": "Hunde sind erlaubt, müssen aber angeleint sein",
+ "fr": "Les chiens sont admis, mais ils doivent être tenus en laisse"
}
},
{
@@ -233,7 +240,8 @@
"en": "Dogs are allowed and can run around freely",
"nl": "honden zijn welkom en mogen vrij rondlopen",
"pt": "Os cães são permitidos e podem correr livremente",
- "de": "Hunde sind erlaubt und können frei herumlaufen"
+ "de": "Hunde sind erlaubt und können frei herumlaufen",
+ "fr": "Les chiens sont admis et peuvent circuler librement"
}
}
]
@@ -298,7 +306,8 @@
"pt": "Que métodos de pagamento são aceites aqui?",
"pt_BR": "Quais métodos de pagamento são aceitos aqui?",
"id": "Metode pembayaran manakah yang di terima disini?",
- "de": "Welche Zahlungsmethoden werden hier akzeptiert?"
+ "de": "Welche Zahlungsmethoden werden hier akzeptiert?",
+ "fr": "Quelles sont les méthodes de paiement acceptées ici ?"
},
"multiAnswer": true,
"mappings": [
@@ -311,7 +320,8 @@
"pt": "Aceitam pagamento com dinheiro aqui",
"pt_BR": "Dinheiro é aceito aqui",
"id": "Disini menerima pembayaran tunai",
- "de": "Hier wird Bargeld akzeptiert"
+ "de": "Hier wird Bargeld akzeptiert",
+ "fr": "Paiement en liquide accepté"
}
},
{
@@ -323,7 +333,8 @@
"pt": "Aceitam pagamento com cartões bancários aqui",
"pt_BR": "Cartões de pagamento são aceitos aqui",
"id": "Disini menerima pembayaran dengan kartu",
- "de": "Hier werden Zahlungskarten akzeptiert"
+ "de": "Hier werden Zahlungskarten akzeptiert",
+ "fr": "Paiement par carte accepté"
}
}
]
diff --git a/assets/themes/campersite/campersite.json b/assets/themes/campersite/campersite.json
index 670e45299e..1b060b8240 100644
--- a/assets/themes/campersite/campersite.json
+++ b/assets/themes/campersite/campersite.json
@@ -2,7 +2,7 @@
"id": "campersite",
"title": {
"en": "Campersites",
- "nl": "Kampeersite",
+ "nl": "Camperplaatsen",
"it": "Aree camper",
"ru": "Кемпинги",
"ja": "キャンプサイト",
@@ -304,7 +304,8 @@
"zh_Hant": "{capacity} 露營者能夠同時使用這個地方",
"fr": "{capacity} personnes peuvent utiliser cet espace en même temps",
"pt_BR": "{capacity} campistas podem usar este lugar ao mesmo tempo",
- "de": "{capacity} Wohnmobile können diesen Platz gleichzeitig nutzen"
+ "de": "{capacity} Wohnmobile können diesen Platz gleichzeitig nutzen",
+ "nl": "{capacity} campers kunnen deze plaats tegelijk gebruiken"
},
"question": {
"en": "How many campers can stay here? (skip if there is no obvious number of spaces or allowed vehicles)",
@@ -314,7 +315,8 @@
"zh_Hant": "多少露營者能夠待在這裡?(如果沒有明顯的空間數字或是允許車輛則可以跳過)",
"fr": "Combien de personnes peuvent camper ici ? (Passez s’il n’y a pas de places délimitées)",
"pt_BR": "Quantos campistas podem ficar aqui? (pule se não houver um número óbvio de vagas ou veículos permitidos)",
- "de": "Wie viele Wohnmobile können hier parken? (Überspringen, wenn es keine offensichtliche Anzahl von Stellplätzen oder erlaubten Fahrzeugen gibt)"
+ "de": "Wie viele Wohnmobile können hier parken? (Überspringen, wenn es keine offensichtliche Anzahl von Stellplätzen oder erlaubten Fahrzeugen gibt)",
+ "nl": "Hoeveel campers kunnen hier overnachten? (sla dit over als er geen duidelijk aantal plaatsen of aangeduid maximum is)"
},
"freeform": {
"key": "capacity",
@@ -351,7 +353,8 @@
"zh_Hant": "這裡有網路連線",
"fr": "Il y a un accès internet",
"pt_BR": "Há acesso à internet",
- "de": "Internetzugang ist vorhanden"
+ "de": "Internetzugang ist vorhanden",
+ "nl": "Er is internettoegang"
}
},
{
@@ -370,7 +373,8 @@
"zh_Hant": "這裡有網路連線",
"fr": "Il y a un accès internet",
"pt_BR": "Há acesso à Internet",
- "de": "Internetzugang ist vorhanden"
+ "de": "Internetzugang ist vorhanden",
+ "nl": "Er is internettoegang"
},
"hideInAnswer": true
},
@@ -609,7 +613,8 @@
"it": "Maggiori dettagli su questo luogo: {description}",
"fr": "Plus de détails à propos du site : {description}",
"pt_BR": "Mais detalhes sobre este lugar: {description}",
- "de": "Mehr Details über diesen Ort: {description}"
+ "de": "Mehr Details über diesen Ort: {description}",
+ "nl": "Meer details over deze plaats: {description}"
},
"question": {
"en": "Would you like to add a general description of this place? (Do not repeat information previously asked or shown above. Please keep it objective - opinions go into the reviews)",
@@ -618,7 +623,8 @@
"zh_Hant": "你想要為這個地方加一般的敘述嗎?(不要重覆加先前問過或提供的資訊,請保持敘述性-請將意見留在評價)",
"it": "Desideri aggiungere una descrizione del luogo? (Non vanno ripetute informazioni già richieste e mostrate precedentemente. Si prega di attenersi a dati oggettivi - le opinioni vanno nelle recensioni)",
"fr": "Souhaitez-vous ajouter une description générale du lieu ? (Ne pas répéter les informations précédentes et rester neutre, les opinions vont dans les avis)",
- "de": "Möchten Sie eine allgemeine Beschreibung für diesen Ort hinzufügen? (Bitte wiederholen Sie keine Informationen, die Sie bereits zuvor angegeben haben. Bitte bleiben Sie objektiv - Meinungen gehen in die Bewertungen ein)"
+ "de": "Möchten Sie eine allgemeine Beschreibung für diesen Ort hinzufügen? (Bitte wiederholen Sie keine Informationen, die Sie bereits zuvor angegeben haben. Bitte bleiben Sie objektiv - Meinungen gehen in die Bewertungen ein)",
+ "nl": "Wil je graag een algemene beschrijving toevoegen van deze plaats? (Herhaal hier niet de antwoorden op de vragen die reeds gesteld zijn. Hou het objectief - je kan je mening geven via een review)"
},
"freeform": {
"key": "description",
@@ -664,7 +670,8 @@
"it": "luogo di campeggio",
"fr": "Aire de camping",
"pt_BR": "local de acampamento",
- "de": "Wohnmobilstellplatz"
+ "de": "Wohnmobilstellplatz",
+ "nl": "camperplaats"
},
"description": {
"en": "Add a new official camper site. These are designated places to stay overnight with your camper. They might look like a real camping or just look like a parking. They might not be signposted at all, but just be defined in a municipal decision. A regular parking intended for campers where it is not expected to spend the night, is -not- a camper site ",
@@ -672,7 +679,8 @@
"ja": "新しい公式キャンプサイトを追加します。お客様のキャンピングカーで一泊する指定の場所です。本物のキャンプのように見えるかもしれないし、単なる駐車場のように見えるかもしれない。それらは全く署名されていないかもしれませんが、自治体の決定で定義されているだけです。夜を過ごすことが予想されないキャンパー向けの通常の駐車場は、キャンプサイトではない ",
"it": "Aggiungi una nuova area di sosta ufficiale per camper. Si tratta di aree destinate alla sosta notturna dei camper. Potrebbe trattarsi di luoghi di campeggio o semplici parcheggi. Potrebbero anche non essere segnalati sul posto, ma semplicemente indicati in una delibera comunale. Un parcheggio destinato ai camper in cui non è però consentito trascorrere la notte -non- va considerato un'area di sosta per camper. ",
"fr": "Ajouter une nouvelle aire de camping officielle, destinée à y passer la nuit avec un camping-car. Elle ne nécessite pas d’infrastructures particulières et peut être simplement désignée sous arrêté municipal, un simple parking ne suffit pas à rentrer dans cette catégorie ",
- "de": "Fügen Sie einen neuen offiziellen Wohnmobilstellplatz hinzu. Dies sind ausgewiesene Plätze, an denen Sie in Ihrem Wohnmobil übernachten können. Sie können wie ein richtiger Campingplatz oder nur wie ein Parkplatz aussehen. Möglicherweise sind sie gar nicht ausgeschildert, sondern nur in einem Gemeindebeschluss festgelegt. Ein normaler Parkplatz für Wohnmobile, auf dem übernachten nicht zulässig ist, ist kein Wohnmobilstellplatz. "
+ "de": "Fügen Sie einen neuen offiziellen Wohnmobilstellplatz hinzu. Dies sind ausgewiesene Plätze, an denen Sie in Ihrem Wohnmobil übernachten können. Sie können wie ein richtiger Campingplatz oder nur wie ein Parkplatz aussehen. Möglicherweise sind sie gar nicht ausgeschildert, sondern nur in einem Gemeindebeschluss festgelegt. Ein normaler Parkplatz für Wohnmobile, auf dem Übernachten nicht zulässig ist, ist kein Wohnmobilstellplatz. ",
+ "nl": "Voeg een nieuwe officiële camperplaats toe. Dit zijn speciaal aangeduide plaatsen waar het toegestaan is om te overnachten met een camper. Ze kunnen er uitzien als een parking, of soms eerder als een camping. Soms staan ze niet ter plaatse aangeduid, maar heeft de gemeente wel degelijk beslist dat dit een camperplaats is. Een parking voor campers waar je niet mag overnachten is géén camperplaats. "
}
}
],
diff --git a/assets/themes/hailhydrant/hailhydrant.json b/assets/themes/hailhydrant/hailhydrant.json
index 3a94dbb1be..92f54e50f0 100644
--- a/assets/themes/hailhydrant/hailhydrant.json
+++ b/assets/themes/hailhydrant/hailhydrant.json
@@ -18,7 +18,8 @@
"en": "On this map you can find and update hydrants, fire stations, ambulance stations, and extinguishers in your favorite neighborhoods. \n\nYou can track your precise location (mobile only) and select layers that are relevant for you in the bottom left corner. You can also use this tool to add or edit pins (points of interest) to the map and provide additional details by answering available questions. \n\nAll changes you make will automatically be saved in the global database of OpenStreetMap and can be freely re-used by others.",
"ja": "このマップでは、お気に入りの近隣にある消火栓、消防署、救急ステーション、消火器を検索して更新できます。\n\n正確な位置を追跡し(モバイルのみ)、左下コーナーで関連するレイヤを選択できます。このツールを使用して、マップにピン(注視点)を追加または編集したり、利用可能な質問に答えることによって追加の詳細を提供することもできます。\n\nすべての変更は自動的にOpenStreetMapのグローバルデータベースに保存され、他のユーザが自由に再利用できます。",
"zh_Hant": "在這份地圖上面你可以在你喜愛的社區尋找與更新消防栓、消防隊、急救站與滅火器。\n\n你可以追蹤確切位置 (只有行動版) 以及在左下角選擇與你相關的圖層。你也可以使用這工具新增或編輯地圖上的釘子 (興趣點),以及透過回答一些問題提供額外的資訊。\n\n所有你做出的變動都會自動存到開放街圖這個全球資料庫,而且能自由讓其他人取用。",
- "fr": "Sur cette carte on trouve et met à jour les bornes incendies, extincteurs, casernes de pompiers et ambulanciers dans son quartier. Les options en haut à gauche permettent de localiser sa position (sur téléphone) et de filtrer les éléments. Il est possible d’utiliser cet outil pour ajouter et éditer les points d’intérêt de la carte et d’y ajouter des détails en répondant aux questions. Toutes les modifications sont automatiquement enregistrées dans la base de données OpenStreetMap et peuvent êtres librement réutilisées par d’autres."
+ "fr": "Sur cette carte on trouve et met à jour les bornes incendies, extincteurs, casernes de pompiers et ambulanciers dans son quartier. Les options en haut à gauche permettent de localiser sa position (sur téléphone) et de filtrer les éléments. Il est possible d’utiliser cet outil pour ajouter et éditer les points d’intérêt de la carte et d’y ajouter des détails en répondant aux questions. Toutes les modifications sont automatiquement enregistrées dans la base de données OpenStreetMap et peuvent êtres librement réutilisées par d’autres.",
+ "de": "Auf dieser Karte können Sie Hydranten, Feuerwachen, Krankenwagen und Feuerlöscher in Ihren bevorzugten Stadtvierteln finden und aktualisieren. \n\nSie können Ihren genauen Standort verfolgen (nur mobil) und in der unteren linken Ecke die für Sie relevanten Ebenen auswählen. Sie können mit diesem Tool auch Pins (Points of Interest) zur Karte hinzufügen oder bearbeiten und durch die Beantwortung verfügbarer Fragen zusätzliche Angaben machen. \n\nAlle von Ihnen vorgenommenen Änderungen werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei weiterverwendet werden."
},
"language": [
"en",
@@ -26,6 +27,7 @@
"zh_Hant",
"ru",
"fr",
+ "de",
"nb_NO",
"it",
"id"
@@ -47,7 +49,8 @@
"zh_Hant": "消防栓地圖",
"nb_NO": "Kart over brannhydranter",
"ru": "Карта пожарных гидрантов",
- "fr": "Carte des bornes incendie"
+ "fr": "Carte des bornes incendie",
+ "de": "Karte der Hydranten"
},
"minzoom": 14,
"source": {
@@ -63,7 +66,8 @@
"ru": "Гидрант",
"ja": "消火栓",
"nb_NO": "Brannhydrant",
- "fr": "Bornes incendie"
+ "fr": "Bornes incendie",
+ "de": "Hydrant"
}
},
"description": {
@@ -72,7 +76,8 @@
"zh_Hant": "顯示消防栓的地圖圖層。",
"nb_NO": "Kartlag for å vise brannhydranter.",
"ru": "Слой карты, отображающий пожарные гидранты.",
- "fr": "Couche des bornes incendie."
+ "fr": "Couche des bornes incendie.",
+ "de": "Kartenebene zur Anzeige von Hydranten."
},
"tagRenderings": [
{
@@ -82,14 +87,16 @@
"ja": "消火栓の色は何色ですか?",
"nb_NO": "Hvilken farge har brannhydranten?",
"ru": "Какого цвета гидрант?",
- "fr": "Quelle est la couleur de la borne ?"
+ "fr": "Quelle est la couleur de la borne ?",
+ "de": "Welche Farbe hat der Hydrant?"
},
"render": {
"en": "The hydrant color is {colour}",
"ja": "消火栓の色は{color}です",
"nb_NO": "Brannhydranter er {colour}",
"ru": "Цвет гидранта {colour}",
- "fr": "La borne est {colour}"
+ "fr": "La borne est {colour}",
+ "de": "Der Hydrant hat die Farbe {colour}"
},
"freeform": {
"key": "colour"
@@ -105,7 +112,8 @@
"en": "The hydrant color is unknown.",
"ja": "消火栓の色は不明です。",
"ru": "Цвет гидранта не определён.",
- "fr": "La borne est de couleur inconnue."
+ "fr": "La borne est de couleur inconnue.",
+ "de": "Die Farbe des Hydranten ist unbekannt."
},
"hideInAnswer": true
},
@@ -119,7 +127,8 @@
"en": "The hydrant color is yellow.",
"ja": "消火栓の色は黄色です。",
"ru": "Гидрант жёлтого цвета.",
- "fr": "La borne est jaune."
+ "fr": "La borne est jaune.",
+ "de": "Die Farbe des Hydranten ist gelb."
}
},
{
@@ -133,7 +142,8 @@
"ja": "消火栓の色は赤です。",
"it": "L'idrante è rosso.",
"ru": "Гидрант красного цвета.",
- "fr": "La borne est rouge."
+ "fr": "La borne est rouge.",
+ "de": "Die Farbe des Hydranten ist rot."
}
}
]
@@ -145,7 +155,8 @@
"ja": "どんな消火栓なんですか?",
"it": "Di che tipo è questo idrante?",
"ru": "К какому типу относится этот гидрант?",
- "fr": "De quel type de borne s’agit-il ?"
+ "fr": "De quel type de borne s’agit-il ?",
+ "de": "Um welche Art von Hydrant handelt es sich?"
},
"freeform": {
"key": "fire_hydrant:type"
@@ -155,7 +166,8 @@
"ru": " Тип гидранта: {fire_hydrant:type}",
"ja": " 消火栓のタイプ:{fire_hydrant:type}",
"it": " Tipo di idrante: {fire_hydrant:type}",
- "fr": " Type de borne : {fire_hydrant:type}"
+ "fr": " Type de borne : {fire_hydrant:type}",
+ "de": " Hydranten-Typ: {fire_hydrant:type}"
},
"mappings": [
{
@@ -169,7 +181,8 @@
"ja": "消火栓の種類は不明です。",
"it": "Il tipo di idrante è sconosciuto.",
"ru": "Тип гидранта не определён.",
- "fr": "La borne est de type inconnu."
+ "fr": "La borne est de type inconnu.",
+ "de": "Der Typ des Hydranten ist unbekannt."
},
"hideInAnswer": true
},
@@ -182,7 +195,8 @@
"then": {
"en": " Pillar type.",
"ja": " ピラー型。",
- "fr": " Pilier."
+ "fr": " Pilier.",
+ "de": " Säulenart."
}
},
{
@@ -194,7 +208,8 @@
"then": {
"en": " Pipe type.",
"ja": " パイプ型。",
- "fr": " Tuyau."
+ "fr": " Tuyau.",
+ "de": " Rohrtyp."
}
},
{
@@ -208,7 +223,8 @@
"id": " Jenis dinding.",
"ru": " Тип стены.",
"ja": " 壁型。",
- "fr": " Mural."
+ "fr": " Mural.",
+ "de": " Wandtyp."
}
},
{
@@ -220,7 +236,8 @@
"then": {
"en": " Underground type.",
"ja": "地下式。",
- "fr": " Enterré."
+ "fr": " Enterré.",
+ "de": " Untergrundtyp."
}
}
]
@@ -230,12 +247,14 @@
"question": {
"en": "Update the lifecycle status of the hydrant.",
"ja": "消火栓のライフサイクルステータスを更新します。",
- "fr": "Mettre à jour l’état de la borne."
+ "fr": "Mettre à jour l’état de la borne.",
+ "de": "Aktualisieren Sie den Lebenszyklusstatus des Hydranten."
},
"render": {
"en": "Lifecycle status",
"ja": "ライフサイクルステータス",
- "fr": "État"
+ "fr": "État",
+ "de": "Lebenszyklus-Status"
},
"freeform": {
"key": "disused:emergency"
@@ -251,7 +270,8 @@
"en": "The hydrant is (fully or partially) working.",
"ja": "消火栓は(完全にまたは部分的に)機能しています。",
"ru": "Гидрант (полностью или частично) в рабочем состоянии.",
- "fr": "La borne est en état, ou partiellement en état, de fonctionner."
+ "fr": "La borne est en état, ou partiellement en état, de fonctionner.",
+ "de": "Der Hydrant ist (ganz oder teilweise) in Betrieb."
}
},
{
@@ -264,7 +284,8 @@
"then": {
"en": "The hydrant is unavailable.",
"ja": "消火栓は使用できません。",
- "fr": "La borne est hors-service."
+ "fr": "La borne est hors-service.",
+ "de": "Der Hydrant ist nicht verfügbar."
}
},
{
@@ -278,7 +299,8 @@
"en": "The hydrant has been removed.",
"ja": "消火栓が撤去されました。",
"ru": "Гидрант демонтирован.",
- "fr": "La borne a été retirée."
+ "fr": "La borne a été retirée.",
+ "de": "Der Hydrant wurde entfernt."
}
}
]
@@ -307,12 +329,14 @@
"ru": "Пожарный гидрант",
"ja": "消火栓",
"nb_NO": "Brannhydrant",
- "fr": "Borne incendie"
+ "fr": "Borne incendie",
+ "de": "Löschwasser-Hydrant"
},
"description": {
"en": "A hydrant is a connection point where firefighters can tap water. It might be located underground.",
"ja": "消火栓は消防士が水を汲み上げることができる接続点です。地下にあるかもしれません。",
- "fr": "Une borne incendie est un point où les pompiers peuvent s’alimenter en eau. Elle peut être enterrée."
+ "fr": "Une borne incendie est un point où les pompiers peuvent s’alimenter en eau. Elle peut être enterrée.",
+ "de": "Ein Hydrant ist ein Anschlusspunkt, an dem die Feuerwehr Wasser zapfen kann. Er kann sich unterirdisch befinden."
}
}
],
@@ -325,7 +349,8 @@
"ja": "消火器の地図です。",
"nb_NO": "Kart over brannhydranter",
"ru": "Карта огнетушителей.",
- "fr": "Couche des extincteurs."
+ "fr": "Couche des extincteurs.",
+ "de": "Karte mit Feuerlöschern."
},
"minzoom": 14,
"source": {
@@ -341,7 +366,8 @@
"ru": "Огнетушители",
"ja": "消火器",
"nb_NO": "Brannslokkere",
- "fr": "Exctincteurs"
+ "fr": "Exctincteurs",
+ "de": "Feuerlöscher"
}
},
"description": {
@@ -350,7 +376,8 @@
"zh_Hant": "顯示消防栓的地圖圖層。",
"nb_NO": "Kartlag for å vise brannslokkere.",
"ru": "Слой карты, отображающий огнетушители.",
- "fr": "Couche des lances à incendie."
+ "fr": "Couche des lances à incendie.",
+ "de": "Kartenebene zur Anzeige von Hydranten."
},
"tagRenderings": [
{
@@ -359,13 +386,15 @@
"en": "Location: {location}",
"ja": "場所:{location}",
"ru": "Местоположение: {location}",
- "fr": "Emplacement : {location}"
+ "fr": "Emplacement : {location}",
+ "de": "Standort: {location}"
},
"question": {
"en": "Where is it positioned?",
"ja": "どこにあるんですか?",
"ru": "Где это расположено?",
- "fr": "Où est-elle positionnée ?"
+ "fr": "Où est-elle positionnée ?",
+ "de": "Wo befindet er sich?"
},
"mappings": [
{
@@ -378,7 +407,8 @@
"en": "Found indoors.",
"ja": "屋内にある。",
"ru": "Внутри.",
- "fr": "Intérieur."
+ "fr": "Intérieur.",
+ "de": "Im Innenraum vorhanden."
}
},
{
@@ -391,7 +421,8 @@
"en": "Found outdoors.",
"ja": "屋外にある。",
"ru": "Снаружи.",
- "fr": "Extérieur."
+ "fr": "Extérieur.",
+ "de": "Im Außenraum vorhanden."
}
}
],
@@ -423,13 +454,15 @@
"ja": "消火器",
"nb_NO": "Brannslukker",
"ru": "Огнетушитель",
- "fr": "Extincteur"
+ "fr": "Extincteur",
+ "de": "Feuerlöscher"
},
"description": {
"en": "A fire extinguisher is a small, portable device used to stop a fire",
"ja": "消火器は、火災を止めるために使用される小型で携帯可能な装置である",
"ru": "Огнетушитель - небольшое переносное устройство для тушения огня",
- "fr": "Un extincteur est un appareil portatif servant à éteindre un feu"
+ "fr": "Un extincteur est un appareil portatif servant à éteindre un feu",
+ "de": "Ein Feuerlöscher ist ein kleines, tragbares Gerät, das dazu dient, ein Feuer zu löschen"
}
}
],
@@ -443,7 +476,8 @@
"nb_NO": "Kart over brannstasjoner",
"it": "Mappa delle caserme dei vigili del fuoco",
"ru": "Карта пожарных частей",
- "fr": "Couche des stations de pompiers"
+ "fr": "Couche des stations de pompiers",
+ "de": "Karte der Feuerwachen"
},
"minzoom": 12,
"source": {
@@ -469,7 +503,8 @@
"ja": "消防署を表示するためのマップレイヤ。",
"it": "Livello che mostra le caserme dei vigili del fuoco.",
"ru": "Слой карты, отображающий пожарные части.",
- "fr": "Couche des stations de pompiers."
+ "fr": "Couche des stations de pompiers.",
+ "de": "Kartenebene zur Darstellung von Feuerwachen."
},
"tagRenderings": [
{
@@ -482,7 +517,8 @@
"ja": "この消防署の名前は何ですか?",
"ru": "Как называется эта пожарная часть?",
"it": "Come si chiama questa caserma dei vigili del fuoco?",
- "fr": "Quel est le nom de la station ?"
+ "fr": "Quel est le nom de la station ?",
+ "de": "Wie lautet der Name dieser Feuerwache?"
},
"render": {
"en": "This station is called {name}.",
@@ -649,12 +685,14 @@
"en": "Fire station",
"ja": "消防署",
"ru": "Пожарная часть",
- "fr": "Caserne de pompiers"
+ "fr": "Caserne de pompiers",
+ "de": "Feuerwache"
},
"description": {
"en": "A fire station is a place where the fire trucks and firefighters are located when not in operation.",
"ja": "消防署は、運転していないときに消防車や消防士がいる場所です。",
- "fr": "Une caserne de pompiers est un lieu où les pompiers et leur équipements sont situés en dehors des missions."
+ "fr": "Une caserne de pompiers est un lieu où les pompiers et leur équipements sont situés en dehors des missions.",
+ "de": "Eine Feuerwache ist ein Ort, an dem die Feuerwehrfahrzeuge und die Feuerwehrleute untergebracht sind, wenn sie nicht im Einsatz sind."
}
}
]
@@ -854,7 +892,8 @@
"en": "Add an ambulance station to the map",
"ja": "救急ステーション(消防署)をマップに追加する",
"ru": "Добавить станцию скорой помощи на карту",
- "fr": "Ajouter une station d’ambulances à la carte"
+ "fr": "Ajouter une station d’ambulances à la carte",
+ "de": "Eine Rettungsstation der Karte hinzufügen"
}
}
],
diff --git a/assets/themes/openwindpowermap/openwindpowermap.json b/assets/themes/openwindpowermap/openwindpowermap.json
index a437a06bd2..c7e910d48b 100644
--- a/assets/themes/openwindpowermap/openwindpowermap.json
+++ b/assets/themes/openwindpowermap/openwindpowermap.json
@@ -8,11 +8,13 @@
"icon": "./assets/themes/openwindpowermap/wind_turbine.svg",
"description": {
"en": "A map for showing and editing wind turbines.",
- "fr": "Une carte indiquant les éoliennes et permettant leur édition."
+ "fr": "Une carte indiquant les éoliennes et permettant leur édition.",
+ "de": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen."
},
"language": [
"en",
"fr",
+ "de",
"nl"
],
"version": "2021-06-18",
diff --git a/assets/themes/postboxes/postboxes.json b/assets/themes/postboxes/postboxes.json
index d90c5a1c39..96dce929b2 100644
--- a/assets/themes/postboxes/postboxes.json
+++ b/assets/themes/postboxes/postboxes.json
@@ -10,7 +10,8 @@
"en": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :) Spotted an error or is a post box missing? You can edit this map with a free OpenStreetMap account. "
},
"language": [
- "en"
+ "en",
+ "de"
],
"maintainer": "",
"icon": "./assets/themes/postboxes/postbox.svg",
@@ -96,7 +97,8 @@
}
},
"description": {
- "en": "A layer showing post offices."
+ "en": "A layer showing post offices.",
+ "de": "Eine Ebene mit Postämtern."
},
"tagRenderings": [
"images",
@@ -119,7 +121,8 @@
{
"if": "opening_hours=24/7",
"then": {
- "en": "24/7 opened (including holidays)"
+ "en": "24/7 opened (including holidays)",
+ "de": "durchgehend geöffnet (auch an Feiertagen)"
}
}
],
diff --git a/assets/themes/shops/shops.json b/assets/themes/shops/shops.json
index 878225a90e..a6d904a436 100644
--- a/assets/themes/shops/shops.json
+++ b/assets/themes/shops/shops.json
@@ -5,12 +5,14 @@
"fr": "Carte des magasins",
"ja": "オープン ショップ マップ",
"zh_Hant": "開放商店地圖",
- "ru": "Открыть карту магазинов"
+ "ru": "Открыть карту магазинов",
+ "de": "Freie Geschäftskarte"
},
"shortDescription": {
"en": "An editable map with basic shop information",
"fr": "Carte modifiable affichant les informations de base des magasins",
- "ja": "基本的なショップ情報を含む編集可能なマップ"
+ "ja": "基本的なショップ情報を含む編集可能なマップ",
+ "de": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen"
},
"description": {
"en": "On this map, one can mark basic information about shops, add opening hours and phone numbers",
@@ -24,9 +26,7 @@
"ja",
"zh_Hant",
"ru",
- "nl",
- "ca",
- "id"
+ "de"
],
"maintainer": "MapComplete",
"icon": "./assets/themes/shops/shop.svg",
diff --git a/assets/themes/sport_pitches/sport_pitches.json b/assets/themes/sport_pitches/sport_pitches.json
index 257b835a8d..cf7197dd4a 100644
--- a/assets/themes/sport_pitches/sport_pitches.json
+++ b/assets/themes/sport_pitches/sport_pitches.json
@@ -6,7 +6,8 @@
"en": "Sport pitches",
"ja": "スポーツ競技場",
"zh_Hant": "運動場地",
- "ru": "Спортивные площадки"
+ "ru": "Спортивные площадки",
+ "de": "Sportplätze"
},
"shortDescription": {
"nl": "Deze kaart toont sportvelden",
@@ -14,14 +15,16 @@
"en": "A map showing sport pitches",
"ja": "スポーツ競技場を示す地図",
"zh_Hant": "顯示運動場地的地圖",
- "ru": "Карта, отображающая спортивные площадки"
+ "ru": "Карта, отображающая спортивные площадки",
+ "de": "Eine Karte mit Sportplätzen"
},
"description": {
"nl": "Een sportveld is een ingerichte plaats met infrastructuur om een sport te beoefenen",
"fr": "Un terrain de sport est une zone faite pour pratiquer un sport",
"en": "A sport pitch is an area where sports are played",
"ja": "スポーツ競技場は、スポーツが行われる場所です",
- "zh_Hant": "運動場地是進行運動的地方"
+ "zh_Hant": "運動場地是進行運動的地方",
+ "de": "Ein Sportplatz ist eine Fläche, auf der Sportarten gespielt werden"
},
"language": [
"nl",
@@ -29,7 +32,8 @@
"en",
"ja",
"zh_Hant",
- "ru"
+ "ru",
+ "de"
],
"maintainer": "",
"icon": "./assets/layers/sport_pitch/table_tennis.svg",
diff --git a/assets/themes/surveillance/surveillance.json b/assets/themes/surveillance/surveillance.json
index 4663b87fbd..3d5586b52e 100644
--- a/assets/themes/surveillance/surveillance.json
+++ b/assets/themes/surveillance/surveillance.json
@@ -5,7 +5,8 @@
"nl": "Surveillance under Surveillance",
"ja": "監視カメラの監視",
"zh_Hant": "被監視的監視器",
- "fr": "Surveillance"
+ "fr": "Surveillance",
+ "de": "Überwachung unter Überwachung"
},
"shortDescription": {
"en": "Surveillance cameras and other means of surveillance",
@@ -13,7 +14,8 @@
"ja": "監視カメラおよびその他の監視手段",
"zh_Hant": "監視鏡頭與其他型式的監視",
"fr": "Caméras et autres dispositifs de surveillance",
- "pl": "Kamery monitorujące i inne środki nadzoru"
+ "pl": "Kamery monitorujące i inne środki nadzoru",
+ "de": "Überwachungskameras und andere Mittel zur Überwachung"
},
"description": {
"en": "On this open map, you can find surveillance cameras.",
@@ -21,7 +23,8 @@
"ja": "このオープンマップでは、監視カメラを確認できます。",
"zh_Hant": "在這份開放地圖,你可以找到監視鏡頭。",
"fr": "Cette carte indique l’emplacement des caméras de surveillance.",
- "pl": "Na tej otwartej mapie można znaleźć kamery monitoringu."
+ "pl": "Na tej otwartej mapie można znaleźć kamery monitoringu.",
+ "de": "Auf dieser offenen Karte finden Sie Überwachungskameras."
},
"language": [
"en",
@@ -29,6 +32,7 @@
"ja",
"zh_Hant",
"fr",
+ "de",
"pl"
],
"maintainer": "",
diff --git a/assets/themes/trees/trees.json b/assets/themes/trees/trees.json
index 35815969b1..960367dad2 100644
--- a/assets/themes/trees/trees.json
+++ b/assets/themes/trees/trees.json
@@ -8,7 +8,8 @@
"ru": "Деревья",
"ja": "樹木",
"zh_Hant": "樹木",
- "pl": "Drzewa"
+ "pl": "Drzewa",
+ "de": "Bäume"
},
"shortDescription": {
"nl": "Breng bomen in kaart",
@@ -18,7 +19,8 @@
"ja": "すべての樹木をマッピングする",
"zh_Hant": "所有樹木的地圖",
"ru": "Карта деревьев",
- "pl": "Sporządzić mapę wszystkich drzew"
+ "pl": "Sporządzić mapę wszystkich drzew",
+ "de": "Kartieren Sie alle Bäume"
},
"description": {
"nl": "Breng bomen in kaart!",
@@ -27,7 +29,8 @@
"it": "Mappa tutti gli alberi!",
"ja": "すべての樹木をマッピングします!",
"zh_Hant": "繪製所有樹木!",
- "ru": "Нанесите все деревья на карту!"
+ "ru": "Нанесите все деревья на карту!",
+ "de": "Kartieren Sie alle Bäume!"
},
"language": [
"nl",
@@ -37,7 +40,8 @@
"ru",
"ja",
"zh_Hant",
- "pl"
+ "pl",
+ "de"
],
"maintainer": "Midgard",
"icon": "./assets/themes/trees/logo.svg",
diff --git a/assets/themes/uk_addresses/uk_addresses.json b/assets/themes/uk_addresses/uk_addresses.json
index 09e93cbe6a..ff865b9142 100644
--- a/assets/themes/uk_addresses/uk_addresses.json
+++ b/assets/themes/uk_addresses/uk_addresses.json
@@ -1,17 +1,21 @@
{
"id": "uk_addresses",
"title": {
- "en": "UK Addresses"
+ "en": "UK Addresses",
+ "de": "Adressen in Großbritannien"
},
"shortDescription": {
- "en": "Help to build an open dataset of UK addresses"
+ "en": "Help to build an open dataset of UK addresses",
+ "de": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen"
},
"description": {
"en": "Contribute to OpenStreetMap by filling out address information",
- "nl": "Draag bij aan OpenStreetMap door adresinformatie in te vullen"
+ "nl": "Draag bij aan OpenStreetMap door adresinformatie in te vullen",
+ "de": "Tragen Sie zu OpenStreetMap bei, indem Sie Adressinformationen ausfüllen"
},
"language": [
"en",
+ "de",
"nl"
],
"maintainer": "Pieter Vander Vennet, Rob Nickerson, Russ Garrett",
@@ -113,7 +117,8 @@
{
"id": "addresses",
"name": {
- "en": "Known addresses in OSM"
+ "en": "Known addresses in OSM",
+ "de": "Bekannte Adressen in OSM"
},
"minzoom": 18,
"source": {
@@ -133,28 +138,33 @@
],
"title": {
"render": {
- "en": "Known address"
+ "en": "Known address",
+ "de": "Bekannte Adresse"
}
},
"description": {
"en": "Addresses",
- "nl": "Adressen"
+ "nl": "Adressen",
+ "de": "Adressen"
},
"tagRenderings": [
{
"id": "uk_addresses_explanation_osm",
"render": {
- "en": "This address is saved in OpenStreetMap"
+ "en": "This address is saved in OpenStreetMap",
+ "de": "Diese Adresse ist in OpenStreetMap gespeichert"
}
},
{
"id": "uk_addresses_housenumber",
"render": {
"en": "The housenumber is {addr:housenumber}",
- "nl": "Het huisnummer is {addr:housenumber}"
+ "nl": "Het huisnummer is {addr:housenumber}",
+ "de": "Die Hausnummer ist {addr:housenumber}"
},
"question": {
- "en": "What is the number of this house?"
+ "en": "What is the number of this house?",
+ "de": "Wie lautet die Nummer dieses Hauses?"
},
"freeform": {
"key": "addr:housenumber",
@@ -171,7 +181,8 @@
},
"then": {
"en": "This building has no house number",
- "nl": "Dit gebouw heeft geen huisnummer"
+ "nl": "Dit gebouw heeft geen huisnummer",
+ "de": "Dieses Gebäude hat keine Hausnummer"
}
}
]
@@ -179,10 +190,12 @@
{
"id": "uk_addresses_street",
"render": {
- "en": "This address is in street {addr:street}"
+ "en": "This address is in street {addr:street}",
+ "de": "Diese Adresse befindet sich in der Straße {addr:street}"
},
"question": {
- "en": "What street is this address located in?"
+ "en": "What street is this address located in?",
+ "de": "In welcher Straße befindet sich diese Adresse?"
},
"freeform": {
"key": "addr:street"
diff --git a/assets/themes/waste_basket/waste_basket.json b/assets/themes/waste_basket/waste_basket.json
index b31d12d9a0..3702180831 100644
--- a/assets/themes/waste_basket/waste_basket.json
+++ b/assets/themes/waste_basket/waste_basket.json
@@ -7,11 +7,13 @@
},
"shortDescription": {
"en": "A map with waste baskets",
- "nl": "Een kaart met vuilnisbakken"
+ "nl": "Een kaart met vuilnisbakken",
+ "de": "Eine Karte mit Abfalleimern"
},
"description": {
"en": "On this map, you'll find waste baskets near you. If a waste basket is missing on this map, you can add it yourself",
- "nl": "Op deze kaart vind je vuilnisbakken waar je afval in kan smijten. Ontbreekt er een vuilnisbak? Dan kan je die zelf toevoegen"
+ "nl": "Op deze kaart vind je vuilnisbakken waar je afval in kan smijten. Ontbreekt er een vuilnisbak? Dan kan je die zelf toevoegen",
+ "de": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen"
},
"language": [
"en",
diff --git a/langs/layers/de.json b/langs/layers/de.json
index 2fb7c1c41c..b8866f7591 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -1,4 +1,165 @@
{
+ "artwork": {
+ "description": "Verschiedene Kunstwerke",
+ "name": "Kunstwerke",
+ "presets": {
+ "0": {
+ "title": "Kunstwerk"
+ }
+ },
+ "tagRenderings": {
+ "artwork-artist_name": {
+ "question": "Welcher Künstler hat das geschaffen?",
+ "render": "Erstellt von {artist_name}"
+ },
+ "artwork-artwork_type": {
+ "mappings": {
+ "0": {
+ "then": "Architektur"
+ },
+ "1": {
+ "then": "Wandbild"
+ },
+ "2": {
+ "then": "Malerei"
+ },
+ "3": {
+ "then": "Skulptur"
+ },
+ "4": {
+ "then": "Statue"
+ },
+ "5": {
+ "then": "Büste"
+ },
+ "6": {
+ "then": "Stein"
+ },
+ "7": {
+ "then": "Installation"
+ },
+ "8": {
+ "then": "Graffiti"
+ },
+ "9": {
+ "then": "Relief"
+ },
+ "10": {
+ "then": "Azulejo (spanische dekorative Fliesenarbeit)"
+ },
+ "11": {
+ "then": "Fliesenarbeit"
+ }
+ },
+ "question": "Was ist die Art dieses Kunstwerks?",
+ "render": "Dies ist ein {artwork_type}"
+ },
+ "artwork-website": {
+ "question": "Gibt es eine Website mit weiteren Informationen über dieses Kunstwerk?",
+ "render": "Weitere Informationen auf dieser Webseite"
+ },
+ "artwork-wikidata": {
+ "question": "Welcher Wikidata-Eintrag entspricht diesem Kunstwerk?",
+ "render": "Entspricht {wikidata}"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "Kunstwerk {name}"
+ }
+ },
+ "render": "Kunstwerk"
+ }
+ },
+ "barrier": {
+ "description": "Hindernisse beim Fahrradfahren, wie zum Beispiel Poller und Fahrrad Barrieren",
+ "name": "Hindernisse",
+ "presets": {
+ "0": {
+ "description": "Ein Poller auf der Straße",
+ "title": "Poller"
+ },
+ "1": {
+ "description": "Fahrradhindernis, das Radfahrer abbremst",
+ "title": "Fahrradhindernis"
+ }
+ },
+ "tagRenderings": {
+ "Bollard type": {
+ "mappings": {
+ "0": {
+ "then": "Entfernbarer Poller"
+ },
+ "1": {
+ "then": "Feststehender Poller"
+ },
+ "2": {
+ "then": "Umlegbarer Poller"
+ },
+ "3": {
+ "then": "Flexibler Poller, meist aus Kunststoff"
+ },
+ "4": {
+ "then": "Ausfahrender Poller"
+ }
+ },
+ "question": "Um was für einen Poller handelt es sich?"
+ },
+ "Cycle barrier type": {
+ "mappings": {
+ "0": {
+ "then": "Einfach, nur zwei Barrieren mit einem Zwischenraum "
+ },
+ "1": {
+ "then": "Doppelt, zwei Barrieren hintereinander "
+ },
+ "2": {
+ "then": "Dreifach, drei Barrieren hintereinander "
+ }
+ },
+ "question": "Um welche Art Fahrradhindernis handelt es sich?"
+ },
+ "MaxWidth": {
+ "question": "Welche Durchfahrtsbreite hat das Hindernis?",
+ "render": "Maximale Durchfahrtsbreite: {maxwidth:physical} m"
+ },
+ "Overlap (cyclebarrier)": {
+ "question": "Wie stark überschneiden sich die Barrieren?",
+ "render": "Überschneidung: {overlap} m"
+ },
+ "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): {width:separation} m"
+ },
+ "Width of opening (cyclebarrier)": {
+ "question": "Wie breit ist die kleinste Öffnung neben den Barrieren?",
+ "render": "Breite der Öffnung: {width:opening} m"
+ },
+ "bicycle=yes/no": {
+ "mappings": {
+ "0": {
+ "then": "Ein Radfahrer kann hindurchfahren."
+ },
+ "1": {
+ "then": "Ein Radfahrer kann nicht hindurchfahren."
+ }
+ },
+ "question": "Kann ein Radfahrer das Hindernis passieren?"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "Poller"
+ },
+ "1": {
+ "then": "Barriere für Radfahrer"
+ }
+ },
+ "render": "Hindernis"
+ }
+ },
"bench": {
"name": "Sitzbänke",
"presets": {
@@ -114,6 +275,13 @@
},
"bicycle_library": {
"description": "Eine Einrichtung, in der Fahrräder für längere Zeit geliehen werden können",
+ "name": "Fahrradbibliothek",
+ "presets": {
+ "0": {
+ "description": "Eine Fahrradbibliothek verfügt über eine Sammlung von Fahrrädern, die ausgeliehen werden können",
+ "title": "Fahrradbibliothek"
+ }
+ },
"tagRenderings": {
"bicycle-library-target-group": {
"mappings": {
@@ -148,13 +316,6 @@
},
"title": {
"render": "Fahrradbibliothek"
- },
- "name": "Fahrradbibliothek",
- "presets": {
- "0": {
- "title": "Fahrradbibliothek",
- "description": "Eine Fahrradbibliothek verfügt über eine Sammlung von Fahrrädern, die ausgeliehen werden können"
- }
}
},
"bicycle_tube_vending_machine": {
@@ -211,6 +372,9 @@
"question": "Wie heißt dieses Fahrrad-Café?",
"render": "Dieses Fahrrad-Café heißt {name}"
},
+ "bike_cafe-opening_hours": {
+ "question": "Wann ist dieses Fahrradcafé geöffnet?"
+ },
"bike_cafe-phone": {
"question": "Wie lautet die Telefonnummer von {name}?"
},
@@ -238,9 +402,6 @@
},
"bike_cafe-website": {
"question": "Was ist die Webseite von {name}?"
- },
- "bike_cafe-opening_hours": {
- "question": "Wann ist dieses Fahrradcafé geöffnet?"
}
},
"title": {
@@ -380,6 +541,9 @@
}
},
"bike_repair_station": {
+ "icon": {
+ "render": "./assets/layers/bike_repair_station/repair_station.svg"
+ },
"name": "Fahrradstationen (Reparatur, Pumpe oder beides)",
"presets": {
"0": {
@@ -453,6 +617,9 @@
},
"question": "Ist dies eine elektrische Fahrradpumpe?"
},
+ "bike_repair_station-email": {
+ "question": "Wie lautet die E-Mail-Adresse des Betreuers?"
+ },
"bike_repair_station-manometer": {
"mappings": {
"0": {
@@ -482,6 +649,9 @@
"question": "Wer wartet diese Fahrradpumpe?",
"render": "Gewartet von {operator}"
},
+ "bike_repair_station-phone": {
+ "question": "Wie lautet die Telefonnummer des Betreibers?"
+ },
"bike_repair_station-valves": {
"mappings": {
"0": {
@@ -496,12 +666,6 @@
},
"question": "Welche Ventile werden unterstützt?",
"render": "Diese Pumpe unterstützt die folgenden Ventile: {valves}"
- },
- "bike_repair_station-email": {
- "question": "Wie lautet die E-Mail-Adresse des Betreuers?"
- },
- "bike_repair_station-phone": {
- "question": "Wie lautet die Telefonnummer des Betreibers?"
}
},
"title": {
@@ -523,12 +687,10 @@
}
},
"render": "Fahrradstation (Pumpe & Reparatur)"
- },
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
}
},
"bike_shop": {
+ "description": "Ein Geschäft, das speziell Fahrräder oder verwandte Artikel verkauft",
"name": "Fahrradwerkstatt/geschäft",
"presets": {
"0": {
@@ -634,6 +796,9 @@
"bike_shop-email": {
"question": "Wie lautet die E-Mail-Adresse von {name}?"
},
+ "bike_shop-is-bicycle_shop": {
+ "render": "Dieses Geschäft ist auf den Verkauf von {shop} spezialisiert und im Bereich Fahrrad tätig"
+ },
"bike_shop-name": {
"question": "Wie heißt dieser Fahrradladen?",
"render": "Dieses Fahrradgeschäft heißt {name}"
@@ -643,9 +808,6 @@
},
"bike_shop-website": {
"question": "Was ist die Webseite von {name}?"
- },
- "bike_shop-is-bicycle_shop": {
- "render": "Dieses Geschäft ist auf den Verkauf von {shop} spezialisiert und im Bereich Fahrrad tätig"
}
},
"title": {
@@ -667,8 +829,7 @@
}
},
"render": "Fahrradwerkstatt/geschäft"
- },
- "description": "Ein Geschäft, das speziell Fahrräder oder verwandte Artikel verkauft"
+ }
},
"bike_themed_object": {
"name": "Mit Fahrrad zusammenhängendes Objekt",
@@ -681,7 +842,690 @@
"render": "Mit Fahrrad zusammenhängendes Objekt"
}
},
+ "binocular": {
+ "description": "Fernglas",
+ "name": "Ferngläser",
+ "presets": {
+ "0": {
+ "description": "Ein fest installiertes Teleskop oder Fernglas, für die öffentliche Nutzung. ",
+ "title": "Ferngläser"
+ }
+ },
+ "tagRenderings": {
+ "binocular-charge": {
+ "mappings": {
+ "0": {
+ "then": "Kostenlose Nutzung"
+ }
+ },
+ "question": "Wie viel muss man für die Nutzung dieser Ferngläser bezahlen?",
+ "render": "Die Benutzung dieses Fernglases kostet {charge}"
+ },
+ "binocular-direction": {
+ "question": "In welche Richtung blickt man, wenn man durch dieses Fernglas schaut?",
+ "render": "Blick in Richtung {direction}°"
+ }
+ },
+ "title": {
+ "render": "Ferngläser"
+ }
+ },
+ "birdhide": {
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "Zugänglich für Rollstuhlfahrer"
+ }
+ }
+ }
+ }
+ },
+ "cafe_pub": {
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "Jetzt geöffnet"
+ }
+ }
+ }
+ },
+ "name": "Cafés und Kneipen",
+ "presets": {
+ "0": {
+ "title": "Kneipe"
+ },
+ "1": {
+ "title": "Bar"
+ },
+ "2": {
+ "title": "Café"
+ }
+ },
+ "tagRenderings": {
+ "Classification": {
+ "question": "Was ist das für ein Café"
+ },
+ "Name": {
+ "question": "Wie heißt diese Kneipe?",
+ "render": "Diese Kneipe heißt {name}"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "{name}"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "name": "Ladestationen",
+ "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": "Keine Authentifizierung erforderlich"
+ }
+ },
+ "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 ist kaputt"
+ },
+ "1": {
+ "then": "Hier ist eine Ladestation geplant"
+ },
+ "2": {
+ "then": "Hier wird eine Ladestation gebaut"
+ },
+ "3": {
+ "then": "Diese Ladestation wurde dauerhaft deaktiviert und wird nicht mehr benutzt, ist aber noch sichtbar"
+ },
+ "4": {
+ "then": "Diese Ladestation funktioniert"
+ }
+ },
+ "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"
+ },
+ "fee/charge": {
+ "mappings": {
+ "0": {
+ "then": "Nutzung kostenlos"
+ }
+ },
+ "render": "Die Nutzung dieser Ladestation kostet {charge}"
+ },
+ "maxstay": {
+ "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}"
+ },
+ "ref": {
+ "render": "Die Kennziffer ist {ref}"
+ },
+ "website": {
+ "render": "Weitere Informationen auf {website}"
+ }
+ },
+ "title": {
+ "render": "Ladestation"
+ },
+ "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",
+ "presets": {
+ "0": {
+ "description": "Kreuzung für Fußgänger und/oder Radfahrer",
+ "title": "Kreuzung"
+ },
+ "1": {
+ "description": "Ampel an einer Straße",
+ "title": "Ampel"
+ }
+ },
+ "tagRenderings": {
+ "crossing-bicycle-allowed": {
+ "mappings": {
+ "0": {
+ "then": "Radfahrer können diese Kreuzung nutzen"
+ },
+ "1": {
+ "then": "Radfahrer können diese Kreuzung nicht nutzen"
+ }
+ },
+ "question": "Können Radfahrer diese Kreuzung nutzen?"
+ },
+ "crossing-is-zebra": {
+ "mappings": {
+ "0": {
+ "then": "Dies ist ein Zebrastreifen"
+ },
+ "1": {
+ "then": "Dies ist kein Zebrastreifen"
+ }
+ },
+ "question": "Ist das ein Zebrastreifen?"
+ },
+ "crossing-tactile": {
+ "mappings": {
+ "0": {
+ "then": "An dieser Kreuzung gibt es ein Blindenleitsystem"
+ },
+ "1": {
+ "then": "Diese Kreuzung hat kein Blindenleitsystem"
+ }
+ },
+ "question": "Gibt es an dieser Kreuzung ein Blindenleitsystem?"
+ },
+ "crossing-type": {
+ "mappings": {
+ "0": {
+ "then": "Kreuzungen ohne Ampeln"
+ },
+ "1": {
+ "then": "Kreuzungen mit Ampeln"
+ },
+ "2": {
+ "then": "Zebrastreifen"
+ }
+ },
+ "question": "Was ist das für eine Kreuzung?"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "Ampel"
+ },
+ "1": {
+ "then": "Kreuzung mit Ampeln"
+ }
+ },
+ "render": "Kreuzung"
+ }
+ },
+ "cycleways_and_roads": {
+ "name": "Radwege und Straßen",
+ "tagRenderings": {
+ "Cycleway type for a road": {
+ "mappings": {
+ "3": {
+ "then": "Hier ist ein getrennter Radweg vorhanden"
+ },
+ "4": {
+ "then": "Es gibt keinen Radweg"
+ },
+ "5": {
+ "then": "Es gibt keinen Radweg"
+ }
+ },
+ "question": "Was für ein Radweg ist hier?"
+ },
+ "Cycleway:smoothness": {
+ "mappings": {
+ "0": {
+ "then": "Geeignet für dünne Rollen: Rollerblades, Skateboard"
+ },
+ "1": {
+ "then": "Geeignet für dünne Reifen: Rennrad"
+ },
+ "6": {
+ "then": "Geeignet für Geländefahrzeuge: Traktor, ATV"
+ },
+ "7": {
+ "then": "Unpassierbar / Keine bereiften Fahrzeuge"
+ }
+ },
+ "question": "Wie eben ist dieser Radweg?"
+ },
+ "Cycleway:surface": {
+ "mappings": {
+ "0": {
+ "then": "Dieser Radweg hat keinen festen Belag"
+ },
+ "1": {
+ "then": "Dieser Radweg hat einen festen Belag"
+ },
+ "2": {
+ "then": "Der Radweg ist aus Asphalt"
+ },
+ "4": {
+ "then": "Der Radweg ist aus Beton"
+ },
+ "8": {
+ "then": "Der Radweg ist aus Holz"
+ },
+ "9": {
+ "then": "Der Radweg ist aus Schotter"
+ },
+ "10": {
+ "then": "Dieser Radweg besteht aus feinem Schotter"
+ },
+ "11": {
+ "then": "Der Radweg ist aus Kies"
+ },
+ "12": {
+ "then": "Dieser Radweg besteht aus Rohboden"
+ }
+ },
+ "render": "Der Radweg ist aus {cycleway:surface}"
+ },
+ "Is this a cyclestreet? (For a road)": {
+ "mappings": {
+ "1": {
+ "then": "Dies ist eine Fahrradstraße"
+ },
+ "2": {
+ "then": "Dies ist keine Fahrradstraße."
+ }
+ },
+ "question": "Ist das eine Fahrradstraße"
+ },
+ "Maxspeed (for road)": {
+ "mappings": {
+ "0": {
+ "then": "Die Höchstgeschwindigkeit ist 20 km/h"
+ },
+ "1": {
+ "then": "Die Höchstgeschwindigkeit ist 30 km/h"
+ },
+ "2": {
+ "then": "Die Höchstgeschwindigkeit ist 50 km/h"
+ },
+ "3": {
+ "then": "Die Höchstgeschwindigkeit ist 70 km/h"
+ },
+ "4": {
+ "then": "Die Höchstgeschwindigkeit ist 90 km/h"
+ }
+ }
+ },
+ "Surface of the road": {
+ "mappings": {
+ "1": {
+ "then": "Dieser Radweg hat einen festen Belag"
+ },
+ "2": {
+ "then": "Der Radweg ist aus Asphalt"
+ },
+ "4": {
+ "then": "Der Radweg ist aus Beton"
+ },
+ "8": {
+ "then": "Der Radweg ist aus Holz"
+ },
+ "9": {
+ "then": "Der Radweg ist aus Schotter"
+ },
+ "10": {
+ "then": "Dieser Radweg besteht aus feinem Schotter"
+ },
+ "11": {
+ "then": "Der Radweg ist aus Kies"
+ },
+ "12": {
+ "then": "Dieser Radweg besteht aus Rohboden"
+ }
+ },
+ "render": "Der Radweg ist aus {surface}"
+ },
+ "Surface of the street": {
+ "mappings": {
+ "0": {
+ "then": "Geeignet für dünne Rollen: Rollerblades, Skateboard"
+ },
+ "1": {
+ "then": "Geeignet für dünne Reifen: Rennrad"
+ },
+ "6": {
+ "then": "Geeignet für spezielle Geländewagen: Traktor, ATV"
+ },
+ "7": {
+ "then": "Unpassierbar / Keine bereiften Fahrzeuge"
+ }
+ },
+ "question": "Wie eben ist diese Straße?"
+ },
+ "cyclelan-segregation": {
+ "mappings": {
+ "3": {
+ "then": "Dieser Radweg ist getrennt durch einen Bordstein"
+ }
+ }
+ },
+ "cycleway-lane-track-traffic-signs": {
+ "mappings": {
+ "0": {
+ "then": "Vorgeschriebener Radweg "
+ },
+ "2": {
+ "then": "Getrennter Fuß-/Radweg "
+ },
+ "3": {
+ "then": "Gemeinsamer Fuß-/Radweg "
+ },
+ "4": {
+ "then": "Kein Verkehrsschild vorhanden"
+ }
+ },
+ "question": "Welches Verkehrszeichen hat dieser Radweg?"
+ },
+ "cycleway-segregation": {
+ "mappings": {
+ "3": {
+ "then": "Dieser Radweg ist getrennt durch einen Bordstein"
+ }
+ }
+ },
+ "cycleway-traffic-signs": {
+ "mappings": {
+ "0": {
+ "then": "Vorgeschriebener Radweg "
+ },
+ "2": {
+ "then": "Getrennter Fuß-/Radweg "
+ },
+ "3": {
+ "then": "Gemeinsamer Fuß-/Radweg "
+ },
+ "4": {
+ "then": "Kein Verkehrsschild vorhanden"
+ }
+ },
+ "question": "Welches Verkehrszeichen hat dieser Radweg?"
+ },
+ "cycleway-traffic-signs-D7-supplementary": {
+ "mappings": {
+ "1": {
+ "then": ""
+ },
+ "6": {
+ "then": "Kein zusätzliches Verkehrszeichen vorhanden"
+ }
+ }
+ },
+ "cycleway-traffic-signs-supplementary": {
+ "mappings": {
+ "6": {
+ "then": "Kein zusätzliches Verkehrszeichen vorhanden"
+ }
+ }
+ },
+ "is lit?": {
+ "mappings": {
+ "1": {
+ "then": "Diese Straße ist nicht beleuchtet"
+ },
+ "2": {
+ "then": "Diese Straße ist nachts beleuchtet"
+ },
+ "3": {
+ "then": "Diese Straße ist durchgehend beleuchtet"
+ }
+ },
+ "question": "Ist diese Straße beleuchtet?"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "Radweg"
+ },
+ "2": {
+ "then": "Fahrradspur"
+ },
+ "3": {
+ "then": "Radweg neben der Straße"
+ },
+ "4": {
+ "then": "Fahrradstraße"
+ }
+ },
+ "render": "Radwege"
+ }
+ },
"defibrillator": {
+ "icon": {
+ "mappings": {
+ "0": {
+ "then": "./assets/layers/defibrillator/aed_checked.svg"
+ }
+ }
+ },
"name": "Defibrillatoren",
"presets": {
"0": {
@@ -797,15 +1641,12 @@
},
"title": {
"render": "Defibrillator"
- },
- "icon": {
- "mappings": {
- "0": {
- "then": "./assets/layers/defibrillator/aed_checked.svg"
- }
- }
}
},
+ "direction": {
+ "description": "Diese Ebene visualisiert Richtungen",
+ "name": "Visualisierung der Richtung"
+ },
"drinking_water": {
"name": "Trinkwasser",
"presets": {
@@ -826,8 +1667,6 @@
"question": "Wie einfach ist es, Wasserflaschen zu füllen?"
},
"Still in use?": {
- "question": "Ist diese Trinkwasserstelle noch in Betrieb?",
- "render": "Der Betriebsstatus ist {operational_status",
"mappings": {
"1": {
"then": "Diese Trinkwasserstelle ist kaputt"
@@ -835,7 +1674,9 @@
"2": {
"then": "Diese Trinkwasserstelle wurde geschlossen"
}
- }
+ },
+ "question": "Ist diese Trinkwasserstelle noch in Betrieb?",
+ "render": "Der Betriebsstatus ist {operational_status"
},
"render-closest-drinking-water": {
"render": "Ein weiterer Trinkwasserbrunnen befindet sich in {_closest_other_drinking_water_distance} Meter"
@@ -845,6 +1686,101 @@
"render": "Trinkwasser"
}
},
+ "etymology": {
+ "description": "Alle Objekte, die eine bekannte Namensherkunft haben",
+ "tagRenderings": {
+ "simple etymology": {
+ "render": "Benannt nach {name:etymology}"
+ }
+ }
+ },
+ "food": {
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "Aktuell geöffnet"
+ }
+ }
+ },
+ "2": {
+ "options": {
+ "0": {
+ "question": "Bietet vegan Speisen an"
+ }
+ }
+ }
+ },
+ "presets": {
+ "0": {
+ "title": "Restaurant"
+ },
+ "1": {
+ "title": "Schnellimbiss"
+ },
+ "2": {
+ "title": "Pommesbude"
+ }
+ },
+ "tagRenderings": {
+ "Cuisine": {
+ "mappings": {
+ "2": {
+ "then": "Bietet vorwiegend Pastagerichte an"
+ }
+ },
+ "question": "Welches Essen gibt es hier?",
+ "render": "An diesem Ort gibt es hauptsächlich {cuisine}"
+ },
+ "Fastfood vs restaurant": {
+ "question": "Um was für ein Geschäft handelt es sich?"
+ },
+ "Name": {
+ "question": "Wie heißt dieses Restaurant?",
+ "render": "Das Restaurant heißt {name}"
+ },
+ "Takeaway": {
+ "mappings": {
+ "0": {
+ "then": "Dieses Geschäft bietet nur Artikel zur Mitnahme an"
+ },
+ "1": {
+ "then": "Mitnahme möglich"
+ },
+ "2": {
+ "then": "Mitnahme nicht möglich"
+ }
+ },
+ "question": "Ist an diesem Ort Mitnahme möglich?"
+ },
+ "halal (no friture)": {
+ "mappings": {
+ "0": {
+ "then": "Hier gibt es keine halal Speisen"
+ },
+ "1": {
+ "then": "Hier gibt es wenige halal Speisen"
+ },
+ "2": {
+ "then": "Es gibt halal Speisen"
+ },
+ "3": {
+ "then": "Es gibt ausschließlich halal Speisen"
+ }
+ }
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "Restaurant {name}"
+ },
+ "1": {
+ "then": "Schnellrestaurant{name}"
+ }
+ }
+ }
+ },
"ghost_bike": {
"name": "Geisterrad",
"presets": {
@@ -898,6 +1834,7 @@
}
},
"map": {
+ "description": "Eine Karte, die für Touristen gedacht ist und dauerhaft im öffentlichen Raum aufgestellt ist",
"name": "Karten",
"presets": {
"0": {
@@ -938,8 +1875,7 @@
},
"title": {
"render": "Karte"
- },
- "description": "Eine Karte, die für Touristen gedacht ist und dauerhaft im öffentlichen Raum aufgestellt ist"
+ }
},
"nature_reserve": {
"tagRenderings": {
@@ -968,7 +1904,61 @@
}
}
},
+ "observation_tower": {
+ "description": "Türme mit Panoramablick",
+ "name": "Beobachtungstürme",
+ "presets": {
+ "0": {
+ "title": "Beobachtungsturm"
+ }
+ },
+ "tagRenderings": {
+ "Fee": {
+ "mappings": {
+ "0": {
+ "then": "Eintritt kostenlos"
+ }
+ },
+ "render": "Der Besuch des Turms kostet {charge}"
+ },
+ "Height": {
+ "question": "Wie hoch ist dieser Turm?",
+ "render": "Dieser Turm ist {height} hoch"
+ },
+ "Operator": {
+ "question": "Wer betreibt diesen Turm?",
+ "render": "Betrieben von {operator}"
+ },
+ "name": {
+ "mappings": {
+ "0": {
+ "then": "Dieser Turm hat keinen eigenen Namen"
+ }
+ },
+ "question": "Wie heißt dieser Turm?",
+ "render": "Der Name dieses Turms lautet {name}"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "{name}"
+ }
+ },
+ "render": "Beobachtungsturm"
+ },
+ "units": {
+ "0": {
+ "applicableUnits": {
+ "0": {
+ "human": " Meter"
+ }
+ }
+ }
+ }
+ },
"picnic_table": {
+ "description": "Die Ebene zeigt Picknicktische an",
"name": "Picknick-Tische",
"presets": {
"0": {
@@ -991,12 +1981,16 @@
},
"title": {
"render": "Picknick-Tisch"
- },
- "description": "Die Ebene zeigt Picknicktische an"
+ }
},
"playground": {
"description": "Spielplätze",
"name": "Spielplätze",
+ "presets": {
+ "0": {
+ "title": "Spielplatz"
+ }
+ },
"tagRenderings": {
"Playground-wheelchair": {
"mappings": {
@@ -1047,6 +2041,26 @@
},
"question": "Ist dieser Spielplatz nachts beleuchtet?"
},
+ "playground-max_age": {
+ "render": "Zugang nur für Kinder bis maximal {max_age}"
+ },
+ "playground-min_age": {
+ "render": "Zugang nur für Kinder ab {min_age} Jahren"
+ },
+ "playground-opening_hours": {
+ "mappings": {
+ "0": {
+ "then": "Zugänglich von Sonnenaufgang bis Sonnenuntergang"
+ },
+ "1": {
+ "then": "Immer zugänglich"
+ },
+ "2": {
+ "then": "Immer zugänglich"
+ }
+ },
+ "question": "Wann ist dieser Spielplatz zugänglich?"
+ },
"playground-operator": {
"question": "Wer betreibt diesen Spielplatz?",
"render": "Betrieben von {operator}"
@@ -1083,26 +2097,6 @@
},
"question": "Welche Oberfläche hat dieser Spielplatz? Wenn es mehrere gibt, wähle die am häufigsten vorkommende aus",
"render": "Die Oberfläche ist {surface}"
- },
- "playground-opening_hours": {
- "mappings": {
- "0": {
- "then": "Zugänglich von Sonnenaufgang bis Sonnenuntergang"
- },
- "1": {
- "then": "Immer zugänglich"
- },
- "2": {
- "then": "Immer zugänglich"
- }
- },
- "question": "Wann ist dieser Spielplatz zugänglich?"
- },
- "playground-min_age": {
- "render": "Zugang nur für Kinder ab {min_age} Jahren"
- },
- "playground-max_age": {
- "render": "Zugang nur für Kinder bis maximal {max_age}"
}
},
"title": {
@@ -1112,15 +2106,19 @@
}
},
"render": "Spielplatz"
- },
- "presets": {
- "0": {
- "title": "Spielplatz"
- }
}
},
"public_bookcase": {
"description": "Ein Bücherschrank am Straßenrand mit Büchern, für jedermann zugänglich",
+ "filter": {
+ "2": {
+ "options": {
+ "0": {
+ "question": "Innen oder Außen"
+ }
+ }
+ }
+ },
"name": "Bücherschränke",
"presets": {
"0": {
@@ -1221,18 +2219,280 @@
}
},
"render": "Bücherschrank"
+ }
+ },
+ "shops": {
+ "presets": {
+ "0": {
+ "description": "Ein neues Geschäft hinzufügen"
+ }
},
- "filter": {
- "2": {
- "options": {
+ "tagRenderings": {
+ "shops-phone": {
+ "render": "{phone}"
+ },
+ "shops-shop": {
+ "mappings": {
"0": {
- "question": "Innen oder Außen"
+ "then": "Lebensmittelladen"
+ },
+ "1": {
+ "then": "Supermarkt"
+ },
+ "2": {
+ "then": "Bekleidungsgeschäft"
+ },
+ "3": {
+ "then": "Friseur"
+ },
+ "4": {
+ "then": "Bäckerei"
+ },
+ "5": {
+ "then": "Autoreparatur (Werkstatt)"
+ },
+ "6": {
+ "then": "Autohändler"
}
+ },
+ "question": "Was wird in diesem Geschäft verkauft?",
+ "render": "Dieses Geschäft verkauft {shop}"
+ },
+ "shops-website": {
+ "question": "Wie lautet die Webseite dieses Geschäfts?",
+ "render": "{website}"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "{name}"
+ },
+ "1": {
+ "then": "{shop}"
}
+ },
+ "render": "Geschäft"
+ }
+ },
+ "slow_roads": {
+ "tagRenderings": {
+ "slow_roads-surface": {
+ "mappings": {
+ "0": {
+ "then": "Die Oberfläche ist Gras"
+ },
+ "1": {
+ "then": "Die Oberfläche ist Erde"
+ },
+ "2": {
+ "then": "Die Oberfläche ist ohne festen Belag"
+ },
+ "3": {
+ "then": "Die Oberfläche ist Sand"
+ },
+ "4": {
+ "then": "Die Oberfläche ist aus Pflastersteinen"
+ },
+ "5": {
+ "then": "Die Oberfläche ist Asphalt"
+ },
+ "6": {
+ "then": "Die Oberfläche ist Beton"
+ },
+ "7": {
+ "then": "Die Oberfläche ist gepflastert"
+ }
+ },
+ "render": "Die Oberfläche ist {surface}"
}
}
},
+ "sport_pitch": {
+ "description": "Ein Sportplatz",
+ "name": "Sportplätze",
+ "presets": {
+ "0": {
+ "title": "Tischtennisplatte"
+ },
+ "1": {
+ "title": "Sportplatz"
+ }
+ },
+ "tagRenderings": {
+ "sport-pitch-access": {
+ "mappings": {
+ "0": {
+ "then": "Öffentlicher Zugang"
+ },
+ "2": {
+ "then": "Zugang nur für Vereinsmitglieder"
+ },
+ "3": {
+ "then": "Privat - kein öffentlicher Zugang"
+ }
+ },
+ "question": "Ist dieser Sportplatz öffentlich zugänglich?"
+ },
+ "sport-pitch-reservation": {
+ "mappings": {
+ "3": {
+ "then": "Termine nach Vereinbarung nicht möglich"
+ }
+ }
+ },
+ "sport_pitch-opening_hours": {
+ "mappings": {
+ "1": {
+ "then": "Immer zugänglich"
+ }
+ },
+ "question": "Wann ist dieser Sportplatz zugänglich?"
+ },
+ "sport_pitch-sport": {
+ "mappings": {
+ "0": {
+ "then": "Hier wird Basketball gespielt"
+ },
+ "1": {
+ "then": "Hier wird Fußball gespielt"
+ },
+ "2": {
+ "then": "Dies ist eine Tischtennisplatte"
+ },
+ "3": {
+ "then": "Hier wird Tennis gespielt"
+ },
+ "4": {
+ "then": "Hier wird Kopfball gespielt"
+ },
+ "5": {
+ "then": "Hier wird Basketball gespielt"
+ }
+ },
+ "question": "Welche Sportarten können hier gespielt werden?",
+ "render": "Hier wird {sport} gespielt"
+ },
+ "sport_pitch-surface": {
+ "mappings": {
+ "0": {
+ "then": "Die Oberfläche ist Gras"
+ },
+ "1": {
+ "then": "Die Oberfläche ist Sand"
+ },
+ "2": {
+ "then": "Die Oberfläche ist aus Pflastersteinen"
+ },
+ "3": {
+ "then": "Die Oberfläche ist Asphalt"
+ },
+ "4": {
+ "then": "Die Oberfläche ist Beton"
+ }
+ },
+ "render": "Die Oberfläche ist {surface}"
+ }
+ },
+ "title": {
+ "render": "Sportplatz"
+ }
+ },
+ "surveillance_camera": {
+ "name": "Überwachungskameras",
+ "tagRenderings": {
+ "Camera type: fixed; panning; dome": {
+ "mappings": {
+ "0": {
+ "then": "Eine fest montierte (nicht bewegliche) Kamera"
+ },
+ "1": {
+ "then": "Eine Kuppelkamera (drehbar)"
+ },
+ "2": {
+ "then": "Eine bewegliche Kamera"
+ }
+ },
+ "question": "Um welche Kameratyp handelt se sich?"
+ },
+ "Indoor camera? This isn't clear for 'public'-cameras": {
+ "mappings": {
+ "0": {
+ "then": "Diese Kamera befindet sich im Innenraum"
+ },
+ "1": {
+ "then": "Diese Kamera befindet sich im Freien"
+ },
+ "2": {
+ "then": "Diese Kamera ist möglicherweise im Freien"
+ }
+ }
+ },
+ "Level": {
+ "question": "Auf welcher Ebene befindet sich diese Kamera?",
+ "render": "Befindet sich auf Ebene {level}"
+ },
+ "Operator": {
+ "question": "Wer betreibt diese CCTV Kamera?",
+ "render": "Betrieben von {operator}"
+ },
+ "Surveillance:zone": {
+ "mappings": {
+ "0": {
+ "then": "Überwacht einen Parkplatz"
+ },
+ "1": {
+ "then": "Überwacht den Verkehr"
+ },
+ "2": {
+ "then": "Überwacht einen Eingang"
+ },
+ "3": {
+ "then": "Überwacht einen Gang"
+ },
+ "4": {
+ "then": "Überwacht eine Haltestelle"
+ },
+ "5": {
+ "then": "Überwacht ein Geschäft"
+ }
+ },
+ "question": "Was genau wird hier überwacht?",
+ "render": " Überwacht ein/e {surveillance:zone}"
+ },
+ "camera:mount": {
+ "question": "Wie ist diese Kamera montiert?",
+ "render": "Montageart: {mount}"
+ }
+ },
+ "title": {
+ "render": "Überwachungskamera"
+ }
+ },
"toilet": {
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "Rollstuhlgerecht"
+ }
+ }
+ },
+ "1": {
+ "options": {
+ "0": {
+ "question": "Hat einen Wickeltisch"
+ }
+ }
+ },
+ "2": {
+ "options": {
+ "0": {
+ "question": "Nutzung kostenlos"
+ }
+ }
+ }
+ },
"name": "Toiletten",
"presets": {
"0": {
@@ -1341,56 +2601,60 @@
},
"title": {
"render": "Toilette"
- },
- "filter": {
- "0": {
- "options": {
+ }
+ },
+ "trail": {
+ "name": "Wanderwege",
+ "tagRenderings": {
+ "Color": {
+ "mappings": {
"0": {
- "question": "Rollstuhlgerecht"
+ "then": "Blauer Weg"
+ },
+ "1": {
+ "then": "Roter Weg"
+ },
+ "2": {
+ "then": "Grüner Weg"
+ },
+ "3": {
+ "then": "Gelber Weg"
}
}
},
- "1": {
- "options": {
- "0": {
- "question": "Hat einen Wickeltisch"
- }
- }
- },
- "2": {
- "options": {
- "0": {
- "question": "Nutzung kostenlos"
- }
- }
+ "trail-length": {
+ "render": "Der Wanderweg ist {_length:km} Kilometer lang"
}
+ },
+ "title": {
+ "render": "Wanderweg"
}
},
"tree_node": {
- "title": {
- "mappings": {
- "0": {
- "then": "{name}"
- }
- },
- "render": "Baum"
- },
"name": "Baum",
"presets": {
"0": {
- "title": "Laubbaum",
- "description": "Ein Baum mit Blättern, z. B. Eiche oder Buche."
+ "description": "Ein Baum mit Blättern, z. B. Eiche oder Buche.",
+ "title": "Laubbaum"
},
"1": {
"description": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte.",
"title": "Nadelbaum"
},
"2": {
- "title": "Baum",
- "description": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt."
+ "description": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt.",
+ "title": "Baum"
}
},
"tagRenderings": {
+ "tree-decidouous": {
+ "mappings": {
+ "1": {
+ "then": "immergrüner Baum."
+ }
+ },
+ "question": "Ist dies ein Nadelbaum oder ein Laubbaum?"
+ },
"tree-height": {
"mappings": {
"0": {
@@ -1420,23 +2684,23 @@
}
}
},
- "tree-decidouous": {
- "question": "Ist dies ein Nadelbaum oder ein Laubbaum?",
- "mappings": {
- "1": {
- "then": "immergrüner Baum."
- }
- }
- },
"tree_node-name": {
- "render": "Name: {name}",
"mappings": {
"0": {
"then": "Der Baum hat keinen Namen."
}
},
- "question": "Hat der Baum einen Namen?"
+ "question": "Hat der Baum einen Namen?",
+ "render": "Name: {name}"
}
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "{name}"
+ }
+ },
+ "render": "Baum"
}
},
"viewpoint": {
@@ -1456,520 +2720,8 @@
"render": "Aussichtspunkt"
}
},
- "barrier": {
- "tagRenderings": {
- "Bollard type": {
- "mappings": {
- "0": {
- "then": "Entfernbarer Poller"
- },
- "1": {
- "then": "Feststehender Poller"
- },
- "2": {
- "then": "Umlegbarer Poller"
- },
- "3": {
- "then": "Flexibler Poller, meist aus Kunststoff"
- },
- "4": {
- "then": "Ausfahrender Poller"
- }
- },
- "question": "Um was für einen Poller handelt es sich?"
- },
- "Cycle barrier type": {
- "mappings": {
- "0": {
- "then": "Einfach, nur zwei Barrieren mit einem Zwischenraum "
- },
- "1": {
- "then": "Doppelt, zwei Barrieren hintereinander "
- },
- "2": {
- "then": "Dreifach, drei Barrieren hintereinander "
- }
- },
- "question": "Um welche Art Fahrradhindernis handelt es sich?"
- },
- "MaxWidth": {
- "question": "Welche Durchfahrtsbreite hat das Hindernis?",
- "render": "Maximale Durchfahrtsbreite: {maxwidth:physical} m"
- },
- "Overlap (cyclebarrier)": {
- "question": "Wie stark überschneiden sich die Barrieren?",
- "render": "Überschneidung: {overlap} m"
- },
- "Space between barrier (cyclebarrier)": {
- "render": "Abstand zwischen den Barrieren (entlang der Straße): {width:separation} m",
- "question": "Wie groß ist der Abstand zwischen den Barrieren (entlang der Straße)?"
- },
- "Width of opening (cyclebarrier)": {
- "question": "Wie breit ist die kleinste Öffnung neben den Barrieren?",
- "render": "Breite der Öffnung: {width:opening} m"
- },
- "bicycle=yes/no": {
- "question": "Kann ein Radfahrer das Hindernis passieren?",
- "mappings": {
- "0": {
- "then": "Ein Radfahrer kann hindurchfahren."
- },
- "1": {
- "then": "Ein Radfahrer kann nicht hindurchfahren."
- }
- }
- }
- },
- "title": {
- "mappings": {
- "0": {
- "then": "Poller"
- },
- "1": {
- "then": "Barriere für Radfahrer"
- }
- },
- "render": "Hindernis"
- },
- "presets": {
- "0": {
- "description": "Ein Poller auf der Straße",
- "title": "Poller"
- },
- "1": {
- "description": "Fahrradhindernis, das Radfahrer abbremst",
- "title": "Fahrradhindernis"
- }
- },
- "description": "Hindernisse beim Fahrradfahren, wie zum Beispiel Poller und Fahrrad Barrieren",
- "name": "Hindernisse"
- },
- "binocular": {
- "description": "Fernglas",
- "name": "Ferngläser",
- "presets": {
- "0": {
- "title": "Ferngläser",
- "description": "Ein fest installiertes Teleskop oder Fernglas, für die öffentliche Nutzung. "
- }
- },
- "tagRenderings": {
- "binocular-charge": {
- "mappings": {
- "0": {
- "then": "Kostenlose Nutzung"
- }
- },
- "render": "Die Benutzung dieses Fernglases kostet {charge}",
- "question": "Wie viel muss man für die Nutzung dieser Ferngläser bezahlen?"
- },
- "binocular-direction": {
- "question": "In welche Richtung blickt man, wenn man durch dieses Fernglas schaut?",
- "render": "Blick in Richtung {direction}°"
- }
- },
- "title": {
- "render": "Ferngläser"
- }
- },
- "cafe_pub": {
- "filter": {
- "0": {
- "options": {
- "0": {
- "question": "Jetzt geöffnet"
- }
- }
- }
- },
- "presets": {
- "0": {
- "title": "Kneipe"
- },
- "1": {
- "title": "Bar"
- },
- "2": {
- "title": "Café"
- }
- },
- "name": "Cafés und Kneipen",
- "tagRenderings": {
- "Classification": {
- "question": "Was ist das für ein Café"
- },
- "Name": {
- "question": "Wie heißt diese Kneipe?",
- "render": "Diese Kneipe heißt {name}"
- }
- },
- "title": {
- "mappings": {
- "0": {
- "then": "{name}"
- }
- }
- }
- },
- "charging_station": {
- "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"
- }
- }
- }
- },
- "name": "Ladestationen",
- "presets": {
- "0": {
- "title": "Ladestation"
- }
- },
- "description": "Eine Ladestation",
- "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"
- }
- }
- }
- },
- "tagRenderings": {
- "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?"
- },
- "Available_charging_stations (generated)": {
- "question": "Welche Ladestationen gibt es hier?",
- "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
"
- }
- }
- },
- "Parking:fee": {
- "question": "Muss man beim Laden eine Parkgebühr bezahlen?",
- "mappings": {
- "0": {
- "then": "Keine zusätzlichen Parkgebühren beim Laden"
- },
- "1": {
- "then": "Beim Laden ist eine zusätzliche Parkgebühr zu entrichten"
- }
- }
- },
- "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": "Keine Authentifizierung erforderlich"
- }
- },
- "question": "Welche Authentifizierung ist an der Ladestation möglich?"
- },
- "Operator": {
- "mappings": {
- "0": {
- "then": "Eigentlich ist {operator} das Netzwerk"
- }
- },
- "question": "Wer ist der Betreiber dieser Ladestation?",
- "render": "Diese Ladestation wird betrieben von {operator}"
- },
- "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 ist kaputt"
- },
- "1": {
- "then": "Hier ist eine Ladestation geplant"
- },
- "2": {
- "then": "Hier wird eine Ladestation gebaut"
- },
- "3": {
- "then": "Diese Ladestation wurde dauerhaft deaktiviert und wird nicht mehr benutzt, ist aber noch sichtbar"
- },
- "4": {
- "then": "Diese Ladestation funktioniert"
- }
- },
- "question": "Ist dieser Ladepunkt in Betrieb?"
- },
- "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"
- },
- "website": {
- "render": "Weitere Informationen auf {website}"
- },
- "ref": {
- "render": "Die Kennziffer ist {ref}"
- },
- "maxstay": {
- "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}"
- },
- "fee/charge": {
- "mappings": {
- "0": {
- "then": "Nutzung kostenlos"
- }
- },
- "render": "Die Nutzung dieser Ladestation kostet {charge}"
- }
- },
- "title": {
- "render": "Ladestation"
- }
- },
- "crossings": {
- "name": "Kreuzungen",
- "title": {
- "render": "Kreuzung",
- "mappings": {
- "0": {
- "then": "Ampel"
- },
- "1": {
- "then": "Kreuzung mit Ampeln"
- }
- }
- },
- "tagRenderings": {
- "crossing-tactile": {
- "question": "Gibt es an dieser Kreuzung ein Blindenleitsystem?",
- "mappings": {
- "0": {
- "then": "An dieser Kreuzung gibt es ein Blindenleitsystem"
- },
- "1": {
- "then": "Diese Kreuzung hat kein Blindenleitsystem"
- }
- }
- },
- "crossing-bicycle-allowed": {
- "mappings": {
- "0": {
- "then": "Radfahrer können diese Kreuzung nutzen"
- },
- "1": {
- "then": "Radfahrer können diese Kreuzung nicht nutzen"
- }
- },
- "question": "Können Radfahrer diese Kreuzung nutzen?"
- },
- "crossing-type": {
- "mappings": {
- "0": {
- "then": "Kreuzungen ohne Ampeln"
- },
- "1": {
- "then": "Kreuzungen mit Ampeln"
- },
- "2": {
- "then": "Zebrastreifen"
- }
- },
- "question": "Was ist das für eine Kreuzung?"
- },
- "crossing-is-zebra": {
- "mappings": {
- "0": {
- "then": "Dies ist ein Zebrastreifen"
- },
- "1": {
- "then": "Dies ist kein Zebrastreifen"
- }
- },
- "question": "Ist das ein Zebrastreifen?"
- }
- },
- "presets": {
- "0": {
- "title": "Kreuzung",
- "description": "Kreuzung für Fußgänger und/oder Radfahrer"
- },
- "1": {
- "description": "Ampel an einer Straße",
- "title": "Ampel"
- }
- },
- "description": "Übergänge für Fußgänger und Radfahrer"
- },
"visitor_information_centre": {
+ "name": "Besucherinformationszentrum",
"title": {
"mappings": {
"1": {
@@ -1977,267 +2729,22 @@
}
},
"render": "{name}"
- },
- "name": "Besucherinformationszentrum"
- },
- "birdhide": {
- "filter": {
- "0": {
- "options": {
- "0": {
- "question": "Zugänglich für Rollstuhlfahrer"
- }
- }
- }
}
},
- "cycleways_and_roads": {
- "title": {
- "mappings": {
- "0": {
- "then": "Radweg"
- },
- "2": {
- "then": "Fahrradspur"
- },
- "3": {
- "then": "Radweg neben der Straße"
- },
- "4": {
- "then": "Fahrradstraße"
- }
- },
- "render": "Radwege"
- },
- "tagRenderings": {
- "Maxspeed (for road)": {
- "mappings": {
- "0": {
- "then": "Die Höchstgeschwindigkeit ist 20 km/h"
- },
- "1": {
- "then": "Die Höchstgeschwindigkeit ist 30 km/h"
- },
- "2": {
- "then": "Die Höchstgeschwindigkeit ist 50 km/h"
- },
- "3": {
- "then": "Die Höchstgeschwindigkeit ist 70 km/h"
- },
- "4": {
- "then": "Die Höchstgeschwindigkeit ist 90 km/h"
- }
- }
- },
- "is lit?": {
- "mappings": {
- "1": {
- "then": "Diese Straße ist nicht beleuchtet"
- },
- "2": {
- "then": "Diese Straße ist nachts beleuchtet"
- },
- "3": {
- "then": "Diese Straße ist durchgehend beleuchtet"
- }
- },
- "question": "Ist diese Straße beleuchtet?"
- },
- "Cycleway type for a road": {
- "mappings": {
- "3": {
- "then": "Hier ist ein getrennter Radweg vorhanden"
- },
- "4": {
- "then": "Es gibt keinen Radweg"
- },
- "5": {
- "then": "Es gibt keinen Radweg"
- }
- },
- "question": "Was für ein Radweg ist hier?"
- },
- "Cycleway:smoothness": {
- "mappings": {
- "0": {
- "then": "Geeignet für dünne Rollen: Rollerblades, Skateboard"
- },
- "1": {
- "then": "Geeignet für dünne Reifen: Rennrad"
- },
- "6": {
- "then": "Geeignet für Geländefahrzeuge: Traktor, ATV"
- },
- "7": {
- "then": "Unpassierbar / Keine bereiften Fahrzeuge"
- }
- },
- "question": "Wie eben ist dieser Radweg?"
- },
- "Is this a cyclestreet? (For a road)": {
- "mappings": {
- "1": {
- "then": "Dies ist eine Fahrradstraße"
- },
- "2": {
- "then": "Dies ist keine Fahrradstraße."
- }
- },
- "question": "Ist das eine Fahrradstraße"
- },
- "Cycleway:surface": {
- "mappings": {
- "0": {
- "then": "Dieser Radweg hat keinen festen Belag"
- },
- "1": {
- "then": "Dieser Radweg hat einen festen Belag"
- },
- "2": {
- "then": "Der Radweg ist aus Asphalt"
- },
- "4": {
- "then": "Der Radweg ist aus Beton"
- },
- "8": {
- "then": "Der Radweg ist aus Holz"
- },
- "9": {
- "then": "Der Radweg ist aus Schotter"
- },
- "10": {
- "then": "Dieser Radweg besteht aus feinem Schotter"
- },
- "11": {
- "then": "Der Radweg ist aus Kies"
- },
- "12": {
- "then": "Dieser Radweg besteht aus Rohboden"
- }
- },
- "render": "Der Radweg ist aus {cycleway:surface}"
- },
- "Surface of the road": {
- "mappings": {
- "1": {
- "then": "Dieser Radweg hat einen festen Belag"
- },
- "2": {
- "then": "Der Radweg ist aus Asphalt"
- },
- "4": {
- "then": "Der Radweg ist aus Beton"
- },
- "8": {
- "then": "Der Radweg ist aus Holz"
- },
- "9": {
- "then": "Der Radweg ist aus Schotter"
- },
- "10": {
- "then": "Dieser Radweg besteht aus feinem Schotter"
- },
- "11": {
- "then": "Der Radweg ist aus Kies"
- },
- "12": {
- "then": "Dieser Radweg besteht aus Rohboden"
- }
- },
- "render": "Der Radweg ist aus {surface}"
- },
- "cycleway-lane-track-traffic-signs": {
- "mappings": {
- "0": {
- "then": "Vorgeschriebener Radweg "
- },
- "2": {
- "then": "Getrennter Fuß-/Radweg "
- },
- "3": {
- "then": "Gemeinsamer Fuß-/Radweg "
- },
- "4": {
- "then": "Kein Verkehrsschild vorhanden"
- }
- },
- "question": "Welches Verkehrszeichen hat dieser Radweg?"
- },
- "Surface of the street": {
- "mappings": {
- "0": {
- "then": "Geeignet für dünne Rollen: Rollerblades, Skateboard"
- },
- "1": {
- "then": "Geeignet für dünne Reifen: Rennrad"
- },
- "6": {
- "then": "Geeignet für spezielle Geländewagen: Traktor, ATV"
- },
- "7": {
- "then": "Unpassierbar / Keine bereiften Fahrzeuge"
- }
- },
- "question": "Wie eben ist diese Straße?"
- },
- "cyclelan-segregation": {
- "mappings": {
- "3": {
- "then": "Dieser Radweg ist getrennt durch einen Bordstein"
- }
- }
- },
- "cycleway-segregation": {
- "mappings": {
- "3": {
- "then": "Dieser Radweg ist getrennt durch einen Bordstein"
- }
- }
- },
- "cycleway-traffic-signs": {
- "mappings": {
- "0": {
- "then": "Vorgeschriebener Radweg "
- },
- "2": {
- "then": "Getrennter Fuß-/Radweg "
- },
- "3": {
- "then": "Gemeinsamer Fuß-/Radweg "
- },
- "4": {
- "then": "Kein Verkehrsschild vorhanden"
- }
- },
- "question": "Welches Verkehrszeichen hat dieser Radweg?"
- },
- "cycleway-traffic-signs-D7-supplementary": {
- "mappings": {
- "1": {
- "then": ""
- },
- "6": {
- "then": "Kein zusätzliches Verkehrszeichen vorhanden"
- }
- }
- },
- "cycleway-traffic-signs-supplementary": {
- "mappings": {
- "6": {
- "then": "Kein zusätzliches Verkehrszeichen vorhanden"
- }
- }
- }
- },
- "name": "Radwege und Straßen"
- },
- "watermill": {
- "name": "Wassermühle"
- },
"waste_basket": {
"description": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können.",
- "title": {
- "render": "Abfalleimer"
+ "iconSize": {
+ "mappings": {
+ "0": {
+ "then": "Abfalleimer"
+ }
+ }
+ },
+ "name": "Abfalleimer",
+ "presets": {
+ "0": {
+ "title": "Abfalleimer"
+ }
},
"tagRenderings": {
"waste-basket-waste-types": {
@@ -2260,464 +2767,11 @@
}
}
},
- "presets": {
- "0": {
- "title": "Abfalleimer"
- }
- },
- "name": "Abfalleimer",
- "iconSize": {
- "mappings": {
- "0": {
- "then": "Abfalleimer"
- }
- }
- }
- },
- "trail": {
"title": {
- "render": "Wanderweg"
- },
- "name": "Wanderwege",
- "tagRenderings": {
- "trail-length": {
- "render": "Der Wanderweg ist {_length:km} Kilometer lang"
- },
- "Color": {
- "mappings": {
- "0": {
- "then": "Blauer Weg"
- },
- "1": {
- "then": "Roter Weg"
- },
- "2": {
- "then": "Grüner Weg"
- },
- "3": {
- "then": "Gelber Weg"
- }
- }
- }
+ "render": "Abfalleimer"
}
},
- "surveillance_camera": {
- "name": "Überwachungskameras",
- "tagRenderings": {
- "Level": {
- "question": "Auf welcher Ebene befindet sich diese Kamera?",
- "render": "Befindet sich auf Ebene {level}"
- },
- "camera:mount": {
- "question": "Wie ist diese Kamera montiert?",
- "render": "Montageart: {mount}"
- },
- "Camera type: fixed; panning; dome": {
- "mappings": {
- "0": {
- "then": "Eine fest montierte (nicht bewegliche) Kamera"
- },
- "1": {
- "then": "Eine Kuppelkamera (drehbar)"
- },
- "2": {
- "then": "Eine bewegliche Kamera"
- }
- },
- "question": "Um welche Kameratyp handelt se sich?"
- },
- "Indoor camera? This isn't clear for 'public'-cameras": {
- "mappings": {
- "0": {
- "then": "Diese Kamera befindet sich im Innenraum"
- },
- "1": {
- "then": "Diese Kamera befindet sich im Freien"
- },
- "2": {
- "then": "Diese Kamera ist möglicherweise im Freien"
- }
- }
- },
- "Surveillance:zone": {
- "mappings": {
- "0": {
- "then": "Überwacht einen Parkplatz"
- },
- "1": {
- "then": "Überwacht den Verkehr"
- },
- "2": {
- "then": "Überwacht einen Eingang"
- },
- "3": {
- "then": "Überwacht einen Gang"
- },
- "4": {
- "then": "Überwacht eine Haltestelle"
- },
- "5": {
- "then": "Überwacht ein Geschäft"
- }
- },
- "question": "Was genau wird hier überwacht?",
- "render": " Überwacht ein/e {surveillance:zone}"
- },
- "Operator": {
- "question": "Wer betreibt diese CCTV Kamera?",
- "render": "Betrieben von {operator}"
- }
- },
- "title": {
- "render": "Überwachungskamera"
- }
- },
- "sport_pitch": {
- "description": "Ein Sportplatz",
- "name": "Sportplätze",
- "tagRenderings": {
- "sport_pitch-sport": {
- "mappings": {
- "0": {
- "then": "Hier wird Basketball gespielt"
- },
- "1": {
- "then": "Hier wird Fußball gespielt"
- },
- "2": {
- "then": "Dies ist eine Tischtennisplatte"
- },
- "3": {
- "then": "Hier wird Tennis gespielt"
- },
- "4": {
- "then": "Hier wird Kopfball gespielt"
- },
- "5": {
- "then": "Hier wird Basketball gespielt"
- }
- },
- "question": "Welche Sportarten können hier gespielt werden?",
- "render": "Hier wird {sport} gespielt"
- },
- "sport_pitch-opening_hours": {
- "question": "Wann ist dieser Sportplatz zugänglich?",
- "mappings": {
- "1": {
- "then": "Immer zugänglich"
- }
- }
- },
- "sport-pitch-access": {
- "question": "Ist dieser Sportplatz öffentlich zugänglich?",
- "mappings": {
- "0": {
- "then": "Öffentlicher Zugang"
- },
- "2": {
- "then": "Zugang nur für Vereinsmitglieder"
- },
- "3": {
- "then": "Privat - kein öffentlicher Zugang"
- }
- }
- },
- "sport-pitch-reservation": {
- "mappings": {
- "3": {
- "then": "Termine nach Vereinbarung nicht möglich"
- }
- }
- },
- "sport_pitch-surface": {
- "mappings": {
- "0": {
- "then": "Die Oberfläche ist Gras"
- },
- "1": {
- "then": "Die Oberfläche ist Sand"
- },
- "2": {
- "then": "Die Oberfläche ist aus Pflastersteinen"
- },
- "3": {
- "then": "Die Oberfläche ist Asphalt"
- },
- "4": {
- "then": "Die Oberfläche ist Beton"
- }
- },
- "render": "Die Oberfläche ist {surface}"
- }
- },
- "title": {
- "render": "Sportplatz"
- },
- "presets": {
- "0": {
- "title": "Tischtennisplatte"
- },
- "1": {
- "title": "Sportplatz"
- }
- }
- },
- "slow_roads": {
- "tagRenderings": {
- "slow_roads-surface": {
- "mappings": {
- "0": {
- "then": "Die Oberfläche ist Gras"
- },
- "1": {
- "then": "Die Oberfläche ist Erde"
- },
- "2": {
- "then": "Die Oberfläche ist ohne festen Belag"
- },
- "3": {
- "then": "Die Oberfläche ist Sand"
- },
- "4": {
- "then": "Die Oberfläche ist aus Pflastersteinen"
- },
- "5": {
- "then": "Die Oberfläche ist Asphalt"
- },
- "6": {
- "then": "Die Oberfläche ist Beton"
- },
- "7": {
- "then": "Die Oberfläche ist gepflastert"
- }
- },
- "render": "Die Oberfläche ist {surface}"
- }
- }
- },
- "observation_tower": {
- "units": {
- "0": {
- "applicableUnits": {
- "0": {
- "human": " Meter"
- }
- }
- }
- },
- "tagRenderings": {
- "Operator": {
- "question": "Wer betreibt diesen Turm?",
- "render": "Betrieben von {operator}"
- },
- "name": {
- "render": "Der Name dieses Turms lautet {name}",
- "mappings": {
- "0": {
- "then": "Dieser Turm hat keinen eigenen Namen"
- }
- },
- "question": "Wie heißt dieser Turm?"
- },
- "Height": {
- "question": "Wie hoch ist dieser Turm?",
- "render": "Dieser Turm ist {height} hoch"
- },
- "Fee": {
- "render": "Der Besuch des Turms kostet {charge}",
- "mappings": {
- "0": {
- "then": "Eintritt kostenlos"
- }
- }
- }
- },
- "description": "Türme mit Panoramablick",
- "title": {
- "mappings": {
- "0": {
- "then": "{name}"
- }
- },
- "render": "Beobachtungsturm"
- },
- "name": "Beobachtungstürme",
- "presets": {
- "0": {
- "title": "Beobachtungsturm"
- }
- }
- },
- "food": {
- "presets": {
- "0": {
- "title": "Restaurant"
- },
- "1": {
- "title": "Schnellimbiss"
- },
- "2": {
- "title": "Pommesbude"
- }
- },
- "filter": {
- "0": {
- "options": {
- "0": {
- "question": "Aktuell geöffnet"
- }
- }
- },
- "2": {
- "options": {
- "0": {
- "question": "Bietet vegan Speisen an"
- }
- }
- }
- },
- "tagRenderings": {
- "Cuisine": {
- "question": "Welches Essen gibt es hier?",
- "mappings": {
- "2": {
- "then": "Bietet vorwiegend Pastagerichte an"
- }
- },
- "render": "An diesem Ort gibt es hauptsächlich {cuisine}"
- },
- "Fastfood vs restaurant": {
- "question": "Um was für ein Geschäft handelt es sich?"
- },
- "Takeaway": {
- "mappings": {
- "0": {
- "then": "Dieses Geschäft bietet nur Artikel zur Mitnahme an"
- },
- "1": {
- "then": "Mitnahme möglich"
- },
- "2": {
- "then": "Mitnahme nicht möglich"
- }
- },
- "question": "Ist an diesem Ort Mitnahme möglich?"
- },
- "halal (no friture)": {
- "mappings": {
- "0": {
- "then": "Hier gibt es keine halal Speisen"
- },
- "1": {
- "then": "Hier gibt es wenige halal Speisen"
- },
- "2": {
- "then": "Es gibt halal Speisen"
- },
- "3": {
- "then": "Es gibt ausschließlich halal Speisen"
- }
- }
- },
- "Name": {
- "question": "Wie heißt dieses Restaurant?",
- "render": "Das Restaurant heißt {name}"
- }
- },
- "title": {
- "mappings": {
- "0": {
- "then": "Restaurant {name}"
- },
- "1": {
- "then": "Schnellrestaurant{name}"
- }
- }
- }
- },
- "etymology": {
- "description": "Alle Objekte, die eine bekannte Namensherkunft haben",
- "tagRenderings": {
- "simple etymology": {
- "render": "Benannt nach {name:etymology}"
- }
- }
- },
- "direction": {
- "name": "Visualisierung der Richtung",
- "description": "Diese Ebene visualisiert Richtungen"
- },
- "artwork": {
- "description": "Verschiedene Kunstwerke",
- "name": "Kunstwerke",
- "presets": {
- "0": {
- "title": "Kunstwerk"
- }
- },
- "tagRenderings": {
- "artwork-artist_name": {
- "question": "Welcher Künstler hat das geschaffen?",
- "render": "Erstellt von {artist_name}"
- },
- "artwork-artwork_type": {
- "mappings": {
- "0": {
- "then": "Architektur"
- },
- "1": {
- "then": "Wandbild"
- },
- "2": {
- "then": "Malerei"
- },
- "3": {
- "then": "Skulptur"
- },
- "4": {
- "then": "Statue"
- },
- "5": {
- "then": "Büste"
- },
- "6": {
- "then": "Stein"
- },
- "7": {
- "then": "Installation"
- },
- "8": {
- "then": "Graffiti"
- },
- "9": {
- "then": "Relief"
- },
- "10": {
- "then": "Azulejo (spanische dekorative Fliesenarbeit)"
- },
- "11": {
- "then": "Fliesenarbeit"
- }
- },
- "question": "Was ist die Art dieses Kunstwerks?",
- "render": "Dies ist ein {artwork_type}"
- },
- "artwork-website": {
- "question": "Gibt es eine Website mit weiteren Informationen über dieses Kunstwerk?",
- "render": "Weitere Informationen auf dieser Webseite"
- },
- "artwork-wikidata": {
- "question": "Welcher Wikidata-Eintrag entspricht diesem Kunstwerk?",
- "render": "Entspricht {wikidata}"
- }
- },
- "title": {
- "mappings": {
- "0": {
- "then": "Kunstwerk {name}"
- }
- },
- "render": "Kunstwerk"
- }
+ "watermill": {
+ "name": "Wassermühle"
}
}
\ No newline at end of file
diff --git a/langs/shared-questions/de.json b/langs/shared-questions/de.json
index 24d1c1b728..2baaebe377 100644
--- a/langs/shared-questions/de.json
+++ b/langs/shared-questions/de.json
@@ -3,6 +3,23 @@
"description": {
"question": "Gibt es noch etwas, das die vorhergehenden Fragen nicht abgedeckt haben? Hier wäre Platz dafür. Bitte keine bereits erhobenen Informationen."
},
+ "dog-access": {
+ "mappings": {
+ "0": {
+ "then": "Hunde sind erlaubt"
+ },
+ "1": {
+ "then": "Hunde sind nicht erlaubt"
+ },
+ "2": {
+ "then": "Hunde sind erlaubt, müssen aber angeleint sein"
+ },
+ "3": {
+ "then": "Hunde sind erlaubt und können frei herumlaufen"
+ }
+ },
+ "question": "Sind Hunde in diesem Geschäft erlaubt?"
+ },
"email": {
"question": "Was ist die Mail-Adresse von {name}?"
},
@@ -28,14 +45,7 @@
"question": "Was sind die Öffnungszeiten von {name}?",
"render": "
Öffnungszeiten
{opening_hours_table(opening_hours)}"
},
- "phone": {
- "question": "Was ist die Telefonnummer von {name}?"
- },
- "website": {
- "question": "Was ist die Website von {name}?"
- },
"payment-options": {
- "question": "Welche Zahlungsmethoden werden hier akzeptiert?",
"mappings": {
"0": {
"then": "Hier wird Bargeld akzeptiert"
@@ -43,7 +53,14 @@
"1": {
"then": "Hier werden Zahlungskarten akzeptiert"
}
- }
+ },
+ "question": "Welche Zahlungsmethoden werden hier akzeptiert?"
+ },
+ "phone": {
+ "question": "Was ist die Telefonnummer von {name}?"
+ },
+ "website": {
+ "question": "Was ist die Website von {name}?"
},
"wheelchair-access": {
"mappings": {
@@ -61,23 +78,6 @@
}
},
"question": "Ist dieser Ort mit einem Rollstuhl zugänglich?"
- },
- "dog-access": {
- "mappings": {
- "0": {
- "then": "Hunde sind erlaubt"
- },
- "1": {
- "then": "Hunde sind nicht erlaubt"
- },
- "2": {
- "then": "Hunde sind erlaubt, müssen aber angeleint sein"
- },
- "3": {
- "then": "Hunde sind erlaubt und können frei herumlaufen"
- }
- },
- "question": "Sind Hunde in diesem Geschäft erlaubt?"
}
}
}
\ No newline at end of file
diff --git a/langs/shared-questions/fr.json b/langs/shared-questions/fr.json
index 9fd4361545..7f0de79045 100644
--- a/langs/shared-questions/fr.json
+++ b/langs/shared-questions/fr.json
@@ -3,6 +3,23 @@
"description": {
"question": "Y a-t-il quelque chose de pertinent que vous n'avez pas pu donner à la dernière question ? Ajoutez-le ici. Ne répétez pas des réponses déjà données"
},
+ "dog-access": {
+ "mappings": {
+ "0": {
+ "then": "Chiens admis"
+ },
+ "1": {
+ "then": "Les chiens ne sont pas admis"
+ },
+ "2": {
+ "then": "Les chiens sont admis, mais ils doivent être tenus en laisse"
+ },
+ "3": {
+ "then": "Les chiens sont admis et peuvent circuler librement"
+ }
+ },
+ "question": "Est-ce que les chiens sont admis ici ?"
+ },
"email": {
"question": "Quelle est l'adresse courriel de {name} ?"
},
@@ -28,23 +45,23 @@
"question": "Quelles sont les horaires d'ouverture de {name} ?",
"render": "
Horaires d'ouverture
{opening_hours_table(opening_hours)}"
},
+ "payment-options": {
+ "mappings": {
+ "0": {
+ "then": "Paiement en liquide accepté"
+ },
+ "1": {
+ "then": "Paiement par carte accepté"
+ }
+ },
+ "question": "Quelles sont les méthodes de paiement acceptées ici ?"
+ },
"phone": {
"question": "Quel est le numéro de téléphone de {name} ?"
},
"website": {
"question": "Quel est le site web de {name} ?"
},
- "payment-options": {
- "mappings": {
- "1": {
- "then": "Paiement par carte accepté"
- },
- "0": {
- "then": "Paiement en liquide accepté"
- }
- },
- "question": "Quelles sont les méthodes de paiement acceptées ici ?"
- },
"wheelchair-access": {
"mappings": {
"2": {
@@ -55,23 +72,6 @@
}
},
"question": "Est-ce que cet endroit est accessible en chaise roulante ?"
- },
- "dog-access": {
- "mappings": {
- "1": {
- "then": "Les chiens ne sont pas admis"
- },
- "2": {
- "then": "Les chiens sont admis, mais ils doivent être tenus en laisse"
- },
- "3": {
- "then": "Les chiens sont admis et peuvent circuler librement"
- },
- "0": {
- "then": "Chiens admis"
- }
- },
- "question": "Est-ce que les chiens sont admis ici ?"
}
}
-}
+}
\ No newline at end of file
diff --git a/langs/themes/de.json b/langs/themes/de.json
index 3a1f8d2952..ed6ecf5169 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -13,13 +13,253 @@
"title": "Sitzbänke"
},
"bicyclelib": {
- "title": "Fahrradbibliothek",
- "description": "Eine Fahrradbibliothek ist ein Ort, an dem Fahrräder ausgeliehen werden können, oft gegen eine geringe Jahresgebühr. Ein wichtiger Anwendungsfall sind Fahrradbibliotheken für Kinder, die es ihnen ermöglichen, auf ein größeres Fahrrad umzusteigen, wenn sie aus ihrem aktuellen Fahrrad herausgewachsen sind"
+ "description": "Eine Fahrradbibliothek ist ein Ort, an dem Fahrräder ausgeliehen werden können, oft gegen eine geringe Jahresgebühr. Ein wichtiger Anwendungsfall sind Fahrradbibliotheken für Kinder, die es ihnen ermöglichen, auf ein größeres Fahrrad umzusteigen, wenn sie aus ihrem aktuellen Fahrrad herausgewachsen sind",
+ "title": "Fahrradbibliothek"
+ },
+ "binoculars": {
+ "description": "Eine Karte mit festinstallierten Ferngläsern. Man findet sie typischerweise an touristischen Orten, Aussichtspunkten, auf Aussichtstürmen oder gelegentlich in einem Naturschutzgebiet.",
+ "shortDescription": "Eine Karte mit festinstallierten Ferngläsern",
+ "title": "Ferngläser"
},
"bookcases": {
"description": "Ein öffentlicher Bücherschrank ist ein kleiner Bücherschrank am Straßenrand, ein Kasten, eine alte Telefonzelle oder andere Gegenstände, in denen Bücher aufbewahrt werden. Jeder kann ein Buch hinstellen oder mitnehmen. Diese Karte zielt darauf ab, all diese Bücherschränke zu sammeln. Sie können neue Bücherschränke in der Nähe entdecken und mit einem kostenlosen OpenStreetMap-Account schnell Ihre Lieblingsbücherschränke hinzufügen.",
"title": "Öffentliche Bücherschränke Karte"
},
+ "cafes_and_pubs": {
+ "title": "Cafés und Kneipen"
+ },
+ "campersite": {
+ "description": "Auf dieser Seite finden Sie alle offiziellen Wohnmobilstellplätze und Orte zur Entsorgung von Schmutzwasser. Sie können Details über die angebotenen Dienstleistungen und die Kosten hinzufügen. Fügen Sie Bilder und Bewertungen hinzu. Dies ist eine Webseite und eine Webapp. Die Daten werden in OpenStreetMap gespeichert, so dass sie für immer kostenlos sind und von jeder App weiterverwendet werden können.",
+ "layers": {
+ "0": {
+ "description": "Wohnmobilstellplätze",
+ "name": "Wohnmobilstellplätze",
+ "presets": {
+ "0": {
+ "description": "Fügen Sie einen neuen offiziellen Wohnmobilstellplatz hinzu. Dies sind ausgewiesene Plätze, an denen Sie in Ihrem Wohnmobil übernachten können. Sie können wie ein richtiger Campingplatz oder nur wie ein Parkplatz aussehen. Möglicherweise sind sie gar nicht ausgeschildert, sondern nur in einem Gemeindebeschluss festgelegt. Ein normaler Parkplatz für Wohnmobile, auf dem Übernachten nicht zulässig ist, ist kein Wohnmobilstellplatz. ",
+ "title": "Wohnmobilstellplatz"
+ }
+ },
+ "tagRenderings": {
+ "caravansites-capacity": {
+ "question": "Wie viele Wohnmobile können hier parken? (Überspringen, wenn es keine offensichtliche Anzahl von Stellplätzen oder erlaubten Fahrzeugen gibt)",
+ "render": "{capacity} Wohnmobile können diesen Platz gleichzeitig nutzen"
+ },
+ "caravansites-charge": {
+ "question": "Wie hoch ist die Gebühr an diesem Ort?",
+ "render": "Die Gebühr beträgt {charge}"
+ },
+ "caravansites-description": {
+ "question": "Möchten Sie eine allgemeine Beschreibung für diesen Ort hinzufügen? (Bitte wiederholen Sie keine Informationen, die Sie bereits zuvor angegeben haben. Bitte bleiben Sie objektiv - Meinungen gehen in die Bewertungen ein)",
+ "render": "Mehr Details über diesen Ort: {description}"
+ },
+ "caravansites-fee": {
+ "mappings": {
+ "0": {
+ "then": "Sie müssen für die Nutzung bezahlen"
+ },
+ "1": {
+ "then": "Nutzung kostenlos"
+ }
+ },
+ "question": "Wird hier eine Gebühr erhoben?"
+ },
+ "caravansites-internet": {
+ "mappings": {
+ "0": {
+ "then": "Internetzugang ist vorhanden"
+ },
+ "1": {
+ "then": "Internetzugang ist vorhanden"
+ },
+ "2": {
+ "then": "Kein Internetzugang vorhanden"
+ }
+ },
+ "question": "Ist an diesem Ort ein Internetzugang vorhanden?"
+ },
+ "caravansites-internet-fee": {
+ "mappings": {
+ "0": {
+ "then": "Der Internetzugang ist gebührenpflichtig"
+ },
+ "1": {
+ "then": "Der Internetzugang ist kostenlos"
+ }
+ },
+ "question": "Ist der Internetzugang gebührenpflichtig?"
+ },
+ "caravansites-long-term": {
+ "mappings": {
+ "0": {
+ "then": "Ja, es gibt einige Plätze für Langzeitmieten, aber Sie können auch tageweise bleiben"
+ },
+ "1": {
+ "then": "Nein, hier gibt es keine Dauergäste"
+ },
+ "2": {
+ "then": "Es sind nur Plätze für Dauercamper vorhanden (wenn Sie diese Antwort auswählen, wird dieser Ort wird von der Karte verschwinden)"
+ }
+ },
+ "question": "Gibt es a diesem Ort Plätze für Dauercamper?"
+ },
+ "caravansites-name": {
+ "question": "Wie heißt dieser Ort?",
+ "render": "Dieser Ort heißt {name}"
+ },
+ "caravansites-sanitary-dump": {
+ "mappings": {
+ "0": {
+ "then": "Dieser Ort hat eine sanitäre Entsorgungsstation"
+ },
+ "1": {
+ "then": "Dieser Ort hat keine sanitäre Entsorgungsstation"
+ }
+ },
+ "question": "Hat dieser Ort eine sanitäre Entsorgungsstation?"
+ },
+ "caravansites-toilets": {
+ "mappings": {
+ "0": {
+ "then": "Dieser Ort verfügt über Toiletten"
+ },
+ "1": {
+ "then": "Dieser Ort verfügt nicht über Toiletten"
+ }
+ },
+ "question": "Verfügt dieser Ort über Toiletten?"
+ },
+ "caravansites-website": {
+ "question": "Hat dieser Ort eine Webseite?",
+ "render": "Offizielle Webseite: {website}"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "Unbenannter Wohnmobilstellplatz"
+ }
+ },
+ "render": "Wohnmobilstellplatz {name}"
+ }
+ },
+ "1": {
+ "description": "Sanitäre Entsorgungsstationen",
+ "name": "Sanitäre Entsorgungsstationen",
+ "presets": {
+ "0": {
+ "description": "Fügen Sie eine neue sanitäre Entsorgungsstation hinzu. Hier können Camper Abwasser oder chemischen Toilettenabfälle entsorgen. Oft gibt es auch Trinkwasser und Strom.",
+ "title": "Sanitäre Entsorgungsstation"
+ }
+ },
+ "tagRenderings": {
+ "dumpstations-access": {
+ "mappings": {
+ "0": {
+ "then": "Sie benötigen einen Schlüssel/Code zur Benutzung"
+ },
+ "1": {
+ "then": "Sie müssen Kunde des Campingplatzes sein, um diesen Ort nutzen zu können"
+ },
+ "2": {
+ "then": "Jeder darf diese sanitäre Entsorgungsstation nutzen"
+ },
+ "3": {
+ "then": "Jeder darf diese sanitäre Entsorgungsstation nutzen"
+ }
+ },
+ "question": "Wer darf diese sanitäre Entsorgungsstation nutzen?"
+ },
+ "dumpstations-charge": {
+ "question": "Wie hoch ist die Gebühr an diesem Ort?",
+ "render": "Die Gebühr beträgt {charge}"
+ },
+ "dumpstations-chemical-waste": {
+ "mappings": {
+ "0": {
+ "then": "Hier können Sie chemische Toilettenabfälle entsorgen"
+ },
+ "1": {
+ "then": "Hier können Sie keine chemischen Toilettenabfälle entsorgen"
+ }
+ },
+ "question": "Können Sie hier chemische Toilettenabfälle entsorgen?"
+ },
+ "dumpstations-fee": {
+ "mappings": {
+ "0": {
+ "then": "Sie müssen für die Nutzung bezahlen"
+ },
+ "1": {
+ "then": "Nutzung kostenlos"
+ }
+ },
+ "question": "Wird hier eine Gebühr erhoben?"
+ },
+ "dumpstations-grey-water": {
+ "mappings": {
+ "0": {
+ "then": "Hier können Sie Brauch-/Grauwasser entsorgen"
+ },
+ "1": {
+ "then": "Hier können Sie kein Brauch-/Grauwasser entsorgen"
+ }
+ },
+ "question": "Können Sie hier Brauch-/Grauwasser entsorgen?"
+ },
+ "dumpstations-network": {
+ "question": "Zu welchem Verbund/Netzwerk gehört dieser Ort? (Überspringen, wenn nicht zutreffend)",
+ "render": "Diese Station gehört zum Verbund/Netzwerk {network}"
+ },
+ "dumpstations-waterpoint": {
+ "mappings": {
+ "0": {
+ "then": "Dieser Ort hat eine Wasserstelle"
+ },
+ "1": {
+ "then": "Dieser Ort hat keine Wasserstelle"
+ }
+ },
+ "question": "Hat dieser Ort eine Wasserstelle?"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "Entsorgungsstation"
+ }
+ },
+ "render": "Entsorgungsstation {name}"
+ }
+ }
+ },
+ "overrideAll": {
+ "tagRenderings+": {
+ "0": {
+ "question": "Wer betreibt diesen Ort?",
+ "render": "Dieser Ort wird betrieben von {operator}"
+ },
+ "1": {
+ "mappings": {
+ "0": {
+ "then": "Dieser Ort hat eine Stromversorgung"
+ },
+ "1": {
+ "then": "Dieser Ort hat keine Stromversorgung"
+ }
+ },
+ "question": "Hat dieser Ort eine Stromversorgung?"
+ }
+ }
+ },
+ "shortDescription": "Finden Sie Plätze zum Übernachten mit Ihrem Wohnmobil",
+ "title": "Wohnmobilstellplätze"
+ },
+ "charging_stations": {
+ "description": "Auf dieser freien Karte kann man Informationen über Ladestationen finden und hinzufügen",
+ "shortDescription": "Eine weltweite Karte mit Ladestationen",
+ "title": "Ladestationen"
+ },
"climbing": {
"description": "Auf dieser Karte finden Sie verschiedene Klettermöglichkeiten wie Kletterhallen, Boulderhallen und Felsen in der Natur.",
"descriptionTail": "
{histogramm(_length_hist)}"
- },
"Type": {
"mappings": {
"0": {
"then": "Ein Kletterfelsen - ein einzelner Felsen oder eine Klippe mit einer oder wenigen Kletterrouten, die ohne Seil sicher bestiegen werden können"
}
}
+ },
+ "name": {
+ "mappings": {
+ "0": {
+ "then": "Diese Klettergelegenheit hat keinen Namen"
+ }
+ },
+ "question": "Wie heißt diese Klettergelegenheit?",
+ "render": "{name}"
}
},
"title": {
- "render": "Klettermöglichkeit",
"mappings": {
"1": {
"then": "Klettergebiet {name}"
@@ -159,7 +398,8 @@
"3": {
"then": "Klettermöglichkeit {name}"
}
- }
+ },
+ "render": "Klettermöglichkeit"
}
},
"4": {
@@ -189,20 +429,7 @@
}
}
},
- "title": "Offene Kletterkarte",
"overrideAll": {
- "units+": {
- "0": {
- "applicableUnits": {
- "0": {
- "human": " Meter"
- },
- "1": {
- "human": " Fuß"
- }
- }
- }
- },
"tagRenderings+": {
"0": {
"question": "Gibt es eine (inoffizielle) Website mit mehr Informationen (z.B. Topos)?"
@@ -309,59 +536,66 @@
},
"question": "Gibt es hier eine Speedkletter-Wand?"
}
+ },
+ "units+": {
+ "0": {
+ "applicableUnits": {
+ "0": {
+ "human": " Meter"
+ },
+ "1": {
+ "human": " Fuß"
+ }
+ }
+ }
}
- }
+ },
+ "title": "Offene Kletterkarte"
},
- "cyclofix": {
- "description": "Das Ziel dieser Karte ist es, den Radfahrern eine einfach zu benutzende Lösung zu präsentieren, um die geeignete Infrastruktur für ihre Bedürfnisse zu finden.
Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.
Alle Änderungen, die Sie vornehmen, werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei wiederverwendet werden.
Weitere Informationen über das Projekt Cyclofix finden Sie unter cyclofix.osm.be.",
- "title": "Cyclofix - eine offene Karte für Radfahrer"
- },
- "ghostbikes": {
- "description": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap kennt. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
- "title": "Geisterrad"
- },
- "personal": {
- "description": "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen",
- "title": "Persönliches Thema"
- },
- "toilets": {
- "description": "Eine Karte der öffentlichen Toiletten",
- "title": "Offene Toilette Karte"
- },
- "waste_basket": {
- "title": "Abfalleimer",
- "shortDescription": "Eine Karte mit Abfalleimern",
- "description": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen"
- },
- "cyclestreets": {
+ "cycle_highways": {
+ "description": "Diese Karte zeigt Radschnellwege",
"layers": {
"0": {
- "name": "Fahrradstraßen",
- "description": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr einen Radfahrer nicht überholen darf"
+ "name": "Radschnellwege",
+ "title": {
+ "render": "Radschnellweg"
+ }
+ }
+ },
+ "title": "Radschnellwege"
+ },
+ "cycle_infra": {
+ "description": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur. Erstellt während #osoc21.",
+ "shortDescription": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur.",
+ "title": "Fahrradinfrastruktur"
+ },
+ "cyclestreets": {
+ "description": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr Radfahrer nicht überholen darf. Sie sind durch ein spezielles Verkehrsschild gekennzeichnet. Fahrradstraßen gibt es in den Niederlanden und Belgien, aber auch in Deutschland und Frankreich. ",
+ "layers": {
+ "0": {
+ "description": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr einen Radfahrer nicht überholen darf",
+ "name": "Fahrradstraßen"
},
"1": {
+ "description": "Diese Straße wird bald eine Fahrradstraße sein",
+ "name": "Zukünftige Fahrradstraße",
"title": {
- "render": "Zukünftige Fahrradstraße",
"mappings": {
"0": {
"then": "{name} wird bald eine Fahrradstraße werden"
}
- }
- },
- "description": "Diese Straße wird bald eine Fahrradstraße sein",
- "name": "Zukünftige Fahrradstraße"
+ },
+ "render": "Zukünftige Fahrradstraße"
+ }
},
"2": {
+ "description": "Ebene zur Kennzeichnung einer Straße als Fahrradstraße",
+ "name": "Alle Straßen",
"title": {
"render": "Straße"
- },
- "name": "Alle Straßen",
- "description": "Ebene zur Kennzeichnung einer Straße als Fahrradstraße"
+ }
}
},
- "shortDescription": "Eine Karte von Fahrradstraßen",
- "title": "Fahrradstraßen",
- "description": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr Radfahrer nicht überholen darf. Sie sind durch ein spezielles Verkehrsschild gekennzeichnet. Fahrradstraßen gibt es in den Niederlanden und Belgien, aber auch in Deutschland und Frankreich. ",
"overrideAll": {
"tagRenderings+": {
"0": {
@@ -386,371 +620,43 @@
"render": "Diese Straße wird am {cyclestreet:start_date} zu einer Fahrradstraße"
}
}
- }
- },
- "hackerspaces": {
- "shortDescription": "Eine Karte von Hackerspaces",
- "description": "Auf dieser Karte können Sie Hackerspaces sehen, einen neuen Hackerspace hinzufügen oder Daten direkt aktualisieren",
- "layers": {
- "0": {
- "description": "Hackerspace",
- "tagRenderings": {
- "hackerspaces-opening_hours": {
- "mappings": {
- "0": {
- "then": "durchgehend geöffnet"
- }
- },
- "question": "Wann hat dieser Hackerspace geöffnet?",
- "render": "{opening_hours_table()}"
- },
- "is_makerspace": {
- "mappings": {
- "0": {
- "then": "Dies ist ein Makerspace"
- },
- "1": {
- "then": "Dies ist ein traditioneller (softwareorientierter) Hackerspace"
- }
- },
- "question": "Ist dies ein Hackerspace oder ein Makerspace?"
- },
- "hackerspaces-name": {
- "question": "Wie lautet der Name dieses Hackerspace?",
- "render": "Dieser Hackerspace heißt {name}"
- },
- "hs-club-mate": {
- "mappings": {
- "0": {
- "then": "In diesem Hackerspace gibt es Club Mate"
- },
- "1": {
- "then": "In diesem Hackerspace gibt es kein Club Mate"
- }
- },
- "question": "Gibt es in diesem Hackerspace Club Mate?"
- },
- "hackerspaces-start_date": {
- "question": "Wann wurde dieser Hackerspace gegründet?",
- "render": "Dieser Hackerspace wurde gegründet am {start_date}"
- }
- },
- "title": {
- "mappings": {
- "0": {
- "then": " {name}"
- }
- },
- "render": "Hackerspace"
- },
- "icon": {
- "mappings": {
- "0": {
- "then": "./assets/themes/hackerspaces/led.png"
- }
- }
- },
- "name": "Hackerspace",
- "presets": {
- "0": {
- "description": "Ein Hackerspace ist ein Ort, an dem sich Menschen treffen, die sich für Software interessieren",
- "title": "Hackerspace"
- },
- "1": {
- "description": "Ein Makerspace ist ein Ort, an dem Heimwerker-Enthusiasten zusammenkommen, um mit Elektronik zu experimentieren, wie Arduino, LED-Strips, ...",
- "title": "Makerspace"
- }
- }
- }
},
- "title": "Hackerspaces"
+ "shortDescription": "Eine Karte von Fahrradstraßen",
+ "title": "Fahrradstraßen"
},
- "campersite": {
- "layers": {
- "0": {
- "title": {
- "mappings": {
- "0": {
- "then": "Unbenannter Wohnmobilstellplatz"
- }
- },
- "render": "Wohnmobilstellplatz {name}"
- },
- "description": "Wohnmobilstellplätze",
- "name": "Wohnmobilstellplätze",
- "presets": {
- "0": {
- "title": "Wohnmobilstellplatz",
- "description": "Fügen Sie einen neuen offiziellen Wohnmobilstellplatz hinzu. Dies sind ausgewiesene Plätze, an denen Sie in Ihrem Wohnmobil übernachten können. Sie können wie ein richtiger Campingplatz oder nur wie ein Parkplatz aussehen. Möglicherweise sind sie gar nicht ausgeschildert, sondern nur in einem Gemeindebeschluss festgelegt. Ein normaler Parkplatz für Wohnmobile, auf dem Übernachten nicht zulässig ist, ist kein Wohnmobilstellplatz. "
- }
- },
- "tagRenderings": {
- "caravansites-charge": {
- "question": "Wie hoch ist die Gebühr an diesem Ort?",
- "render": "Die Gebühr beträgt {charge}"
- },
- "caravansites-description": {
- "question": "Möchten Sie eine allgemeine Beschreibung für diesen Ort hinzufügen? (Bitte wiederholen Sie keine Informationen, die Sie bereits zuvor angegeben haben. Bitte bleiben Sie objektiv - Meinungen gehen in die Bewertungen ein)",
- "render": "Mehr Details über diesen Ort: {description}"
- },
- "caravansites-fee": {
- "mappings": {
- "0": {
- "then": "Sie müssen für die Nutzung bezahlen"
- },
- "1": {
- "then": "Nutzung kostenlos"
- }
- },
- "question": "Wird hier eine Gebühr erhoben?"
- },
- "caravansites-internet": {
- "mappings": {
- "0": {
- "then": "Internetzugang ist vorhanden"
- },
- "1": {
- "then": "Internetzugang ist vorhanden"
- },
- "2": {
- "then": "Kein Internetzugang vorhanden"
- }
- },
- "question": "Ist an diesem Ort ein Internetzugang vorhanden?"
- },
- "caravansites-internet-fee": {
- "mappings": {
- "0": {
- "then": "Der Internetzugang ist gebührenpflichtig"
- },
- "1": {
- "then": "Der Internetzugang ist kostenlos"
- }
- },
- "question": "Ist der Internetzugang gebührenpflichtig?"
- },
- "caravansites-long-term": {
- "mappings": {
- "0": {
- "then": "Ja, es gibt einige Plätze für Langzeitmieten, aber Sie können auch tageweise bleiben"
- },
- "1": {
- "then": "Nein, hier gibt es keine Dauergäste"
- },
- "2": {
- "then": "Es sind nur Plätze für Dauercamper vorhanden (wenn Sie diese Antwort auswählen, wird dieser Ort wird von der Karte verschwinden)"
- }
- },
- "question": "Gibt es a diesem Ort Plätze für Dauercamper?"
- },
- "caravansites-name": {
- "render": "Dieser Ort heißt {name}",
- "question": "Wie heißt dieser Ort?"
- },
- "caravansites-sanitary-dump": {
- "mappings": {
- "0": {
- "then": "Dieser Ort hat eine sanitäre Entsorgungsstation"
- },
- "1": {
- "then": "Dieser Ort hat keine sanitäre Entsorgungsstation"
- }
- },
- "question": "Hat dieser Ort eine sanitäre Entsorgungsstation?"
- },
- "caravansites-toilets": {
- "mappings": {
- "0": {
- "then": "Dieser Ort verfügt über Toiletten"
- },
- "1": {
- "then": "Dieser Ort verfügt nicht über Toiletten"
- }
- },
- "question": "Verfügt dieser Ort über Toiletten?"
- },
- "caravansites-website": {
- "render": "Offizielle Webseite: {website}",
- "question": "Hat dieser Ort eine Webseite?"
- },
- "caravansites-capacity": {
- "question": "Wie viele Wohnmobile können hier parken? (Überspringen, wenn es keine offensichtliche Anzahl von Stellplätzen oder erlaubten Fahrzeugen gibt)",
- "render": "{capacity} Wohnmobile können diesen Platz gleichzeitig nutzen"
- }
- }
- },
- "1": {
- "name": "Sanitäre Entsorgungsstationen",
- "title": {
- "mappings": {
- "0": {
- "then": "Entsorgungsstation"
- }
- },
- "render": "Entsorgungsstation {name}"
- },
- "description": "Sanitäre Entsorgungsstationen",
- "presets": {
- "0": {
- "description": "Fügen Sie eine neue sanitäre Entsorgungsstation hinzu. Hier können Camper Abwasser oder chemischen Toilettenabfälle entsorgen. Oft gibt es auch Trinkwasser und Strom.",
- "title": "Sanitäre Entsorgungsstation"
- }
- },
- "tagRenderings": {
- "dumpstations-access": {
- "mappings": {
- "0": {
- "then": "Sie benötigen einen Schlüssel/Code zur Benutzung"
- },
- "1": {
- "then": "Sie müssen Kunde des Campingplatzes sein, um diesen Ort nutzen zu können"
- },
- "2": {
- "then": "Jeder darf diese sanitäre Entsorgungsstation nutzen"
- },
- "3": {
- "then": "Jeder darf diese sanitäre Entsorgungsstation nutzen"
- }
- },
- "question": "Wer darf diese sanitäre Entsorgungsstation nutzen?"
- },
- "dumpstations-charge": {
- "question": "Wie hoch ist die Gebühr an diesem Ort?",
- "render": "Die Gebühr beträgt {charge}"
- },
- "dumpstations-chemical-waste": {
- "mappings": {
- "0": {
- "then": "Hier können Sie chemische Toilettenabfälle entsorgen"
- },
- "1": {
- "then": "Hier können Sie keine chemischen Toilettenabfälle entsorgen"
- }
- },
- "question": "Können Sie hier chemische Toilettenabfälle entsorgen?"
- },
- "dumpstations-fee": {
- "mappings": {
- "0": {
- "then": "Sie müssen für die Nutzung bezahlen"
- },
- "1": {
- "then": "Nutzung kostenlos"
- }
- },
- "question": "Wird hier eine Gebühr erhoben?"
- },
- "dumpstations-network": {
- "question": "Zu welchem Verbund/Netzwerk gehört dieser Ort? (Überspringen, wenn nicht zutreffend)",
- "render": "Diese Station gehört zum Verbund/Netzwerk {network}"
- },
- "dumpstations-waterpoint": {
- "mappings": {
- "0": {
- "then": "Dieser Ort hat eine Wasserstelle"
- },
- "1": {
- "then": "Dieser Ort hat keine Wasserstelle"
- }
- },
- "question": "Hat dieser Ort eine Wasserstelle?"
- },
- "dumpstations-grey-water": {
- "question": "Können Sie hier Brauch-/Grauwasser entsorgen?",
- "mappings": {
- "0": {
- "then": "Hier können Sie Brauch-/Grauwasser entsorgen"
- },
- "1": {
- "then": "Hier können Sie kein Brauch-/Grauwasser entsorgen"
- }
- }
- }
- }
- }
- },
- "shortDescription": "Finden Sie Plätze zum Übernachten mit Ihrem Wohnmobil",
- "description": "Auf dieser Seite finden Sie alle offiziellen Wohnmobilstellplätze und Orte zur Entsorgung von Schmutzwasser. Sie können Details über die angebotenen Dienstleistungen und die Kosten hinzufügen. Fügen Sie Bilder und Bewertungen hinzu. Dies ist eine Webseite und eine Webapp. Die Daten werden in OpenStreetMap gespeichert, so dass sie für immer kostenlos sind und von jeder App weiterverwendet werden können.",
- "title": "Wohnmobilstellplätze",
- "overrideAll": {
- "tagRenderings+": {
- "0": {
- "question": "Wer betreibt diesen Ort?",
- "render": "Dieser Ort wird betrieben von {operator}"
- },
- "1": {
- "mappings": {
- "0": {
- "then": "Dieser Ort hat eine Stromversorgung"
- },
- "1": {
- "then": "Dieser Ort hat keine Stromversorgung"
- }
- },
- "question": "Hat dieser Ort eine Stromversorgung?"
- }
- }
- }
- },
- "charging_stations": {
- "description": "Auf dieser freien Karte kann man Informationen über Ladestationen finden und hinzufügen",
- "shortDescription": "Eine weltweite Karte mit Ladestationen",
- "title": "Ladestationen"
- },
- "cycle_highways": {
- "description": "Diese Karte zeigt Radschnellwege",
- "layers": {
- "0": {
- "name": "Radschnellwege",
- "title": {
- "render": "Radschnellweg"
- }
- }
- },
- "title": "Radschnellwege"
- },
- "cycle_infra": {
- "description": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur. Erstellt während #osoc21.",
- "shortDescription": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur.",
- "title": "Fahrradinfrastruktur"
+ "cyclofix": {
+ "description": "Das Ziel dieser Karte ist es, den Radfahrern eine einfach zu benutzende Lösung zu präsentieren, um die geeignete Infrastruktur für ihre Bedürfnisse zu finden.
Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.
Alle Änderungen, die Sie vornehmen, werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei wiederverwendet werden.
Weitere Informationen über das Projekt Cyclofix finden Sie unter cyclofix.osm.be.",
+ "title": "Cyclofix - eine offene Karte für Radfahrer"
},
"drinking_water": {
"description": "Auf dieser Karte sind öffentlich zugängliche Trinkwasserstellen eingezeichnet und können leicht hinzugefügt werden",
"title": "Trinkwasser"
},
+ "etymology": {
+ "description": "Auf dieser Karte können Sie sehen, nach was ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. Die Informationen stammen aus Wikipedia.",
+ "shortDescription": "Was ist der Ursprung eines Ortsnamens?",
+ "title": "Open Etymology Map"
+ },
"facadegardens": {
"layers": {
"0": {
+ "description": "Fassadenbegrünung",
+ "name": "Fassadenbegrünung",
+ "presets": {
+ "0": {
+ "description": "Eine Fassadenbegrünung hinzufügen",
+ "title": "Fassadenbegrünung"
+ }
+ },
"tagRenderings": {
- "facadegardens-rainbarrel": {
- "mappings": {
- "0": {
- "then": "Es gibt eine Regentonne"
- },
- "1": {
- "then": "Es gibt keine Regentonne"
- }
- },
- "question": "Gibt es ein Wasserfass für den Garten?"
- },
- "facadegardens-sunshine": {
- "mappings": {
- "0": {
- "then": "Der Garten liegt in voller Sonne"
- },
- "1": {
- "then": "Der Garten liegt im Halbschatten"
- },
- "2": {
- "then": "Der Garten liegt im Schatten"
- }
- },
- "question": "Ist der Garten schattig oder sonnig?"
- },
"facadegardens-description": {
"question": "Zusätzliche Informationen über den Garten (falls erforderlich und oben noch nicht beschrieben)",
"render": "Weitere Details: {description}"
},
+ "facadegardens-direction": {
+ "question": "Wie ist der Garten ausgerichtet?",
+ "render": "Ausrichtung: {direction} (wobei 0=N und 90=O)"
+ },
"facadegardens-edible": {
"mappings": {
"0": {
@@ -779,43 +685,43 @@
},
"question": "Welche Pflanzen wachsen hier?"
},
- "facadegardens-direction": {
- "question": "Wie ist der Garten ausgerichtet?",
- "render": "Ausrichtung: {direction} (wobei 0=N und 90=O)"
+ "facadegardens-rainbarrel": {
+ "mappings": {
+ "0": {
+ "then": "Es gibt eine Regentonne"
+ },
+ "1": {
+ "then": "Es gibt keine Regentonne"
+ }
+ },
+ "question": "Gibt es ein Wasserfass für den Garten?"
},
"facadegardens-start_date": {
"question": "Wann wurde der Garten angelegt? (Jahr ist ausreichend)",
"render": "Errichtungsdatum des Gartens: {start_date}"
+ },
+ "facadegardens-sunshine": {
+ "mappings": {
+ "0": {
+ "then": "Der Garten liegt in voller Sonne"
+ },
+ "1": {
+ "then": "Der Garten liegt im Halbschatten"
+ },
+ "2": {
+ "then": "Der Garten liegt im Schatten"
+ }
+ },
+ "question": "Ist der Garten schattig oder sonnig?"
}
},
- "presets": {
- "0": {
- "description": "Eine Fassadenbegrünung hinzufügen",
- "title": "Fassadenbegrünung"
- }
- },
- "name": "Fassadenbegrünung",
"title": {
"render": "Fassadenbegrünung"
- },
- "description": "Fassadenbegrünung"
+ }
}
},
- "title": "Fassadenbegrünung",
- "shortDescription": "Diese Karte zeigt Fassadenbegrünungen mit Bildern und nützlichen Informationen über Ausrichtung, Sonneneinstrahlung und Pflanzenarten."
- },
- "etymology": {
- "description": "Auf dieser Karte können Sie sehen, nach was ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. Die Informationen stammen aus Wikipedia.",
- "shortDescription": "Was ist der Ursprung eines Ortsnamens?",
- "title": "Open Etymology Map"
- },
- "binoculars": {
- "title": "Ferngläser",
- "shortDescription": "Eine Karte mit festinstallierten Ferngläsern",
- "description": "Eine Karte mit festinstallierten Ferngläsern. Man findet sie typischerweise an touristischen Orten, Aussichtspunkten, auf Aussichtstürmen oder gelegentlich in einem Naturschutzgebiet."
- },
- "cafes_and_pubs": {
- "title": "Cafés und Kneipen"
+ "shortDescription": "Diese Karte zeigt Fassadenbegrünungen mit Bildern und nützlichen Informationen über Ausrichtung, Sonneneinstrahlung und Pflanzenarten.",
+ "title": "Fassadenbegrünung"
},
"food": {
"title": "Restaurants und Schnellimbisse"
@@ -829,136 +735,99 @@
}
}
},
- "uk_addresses": {
- "shortDescription": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen",
- "layers": {
- "1": {
- "tagRenderings": {
- "uk_addresses_housenumber": {
- "render": "Die Hausnummer ist {addr:housenumber}",
- "question": "Wie lautet die Nummer dieses Hauses?",
- "mappings": {
- "0": {
- "then": "Dieses Gebäude hat keine Hausnummer"
- }
- }
- },
- "uk_addresses_explanation_osm": {
- "render": "Diese Adresse ist in OpenStreetMap gespeichert"
- },
- "uk_addresses_street": {
- "render": "Diese Adresse befindet sich in der Straße {addr:street}",
- "question": "In welcher Straße befindet sich diese Adresse?"
- }
- },
- "name": "Bekannte Adressen in OSM",
- "description": "Adressen",
- "title": {
- "render": "Bekannte Adresse"
- }
- }
- },
- "description": "Tragen Sie zu OpenStreetMap bei, indem Sie Adressinformationen ausfüllen",
- "title": "Adressen in Großbritannien"
+ "ghostbikes": {
+ "description": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap kennt. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
+ "title": "Geisterrad"
},
- "trees": {
- "title": "Bäume",
- "description": "Kartieren Sie alle Bäume!",
- "shortDescription": "Kartieren Sie alle Bäume"
- },
- "surveillance": {
- "description": "Auf dieser offenen Karte finden Sie Überwachungskameras.",
- "title": "Überwachung unter Überwachung",
- "shortDescription": "Überwachungskameras und andere Mittel zur Überwachung"
- },
- "sport_pitches": {
- "title": "Sportplätze",
- "shortDescription": "Eine Karte mit Sportplätzen",
- "description": "Ein Sportplatz ist eine Fläche, auf der Sportarten gespielt werden"
- },
- "shops": {
+ "hackerspaces": {
+ "description": "Auf dieser Karte können Sie Hackerspaces sehen, einen neuen Hackerspace hinzufügen oder Daten direkt aktualisieren",
"layers": {
"0": {
+ "description": "Hackerspace",
+ "icon": {
+ "mappings": {
+ "0": {
+ "then": "./assets/themes/hackerspaces/led.png"
+ }
+ }
+ },
+ "name": "Hackerspace",
+ "presets": {
+ "0": {
+ "description": "Ein Hackerspace ist ein Ort, an dem sich Menschen treffen, die sich für Software interessieren",
+ "title": "Hackerspace"
+ },
+ "1": {
+ "description": "Ein Makerspace ist ein Ort, an dem Heimwerker-Enthusiasten zusammenkommen, um mit Elektronik zu experimentieren, wie Arduino, LED-Strips, ...",
+ "title": "Makerspace"
+ }
+ },
+ "tagRenderings": {
+ "hackerspaces-name": {
+ "question": "Wie lautet der Name dieses Hackerspace?",
+ "render": "Dieser Hackerspace heißt {name}"
+ },
+ "hackerspaces-opening_hours": {
+ "mappings": {
+ "0": {
+ "then": "durchgehend geöffnet"
+ }
+ },
+ "question": "Wann hat dieser Hackerspace geöffnet?",
+ "render": "{opening_hours_table()}"
+ },
+ "hackerspaces-start_date": {
+ "question": "Wann wurde dieser Hackerspace gegründet?",
+ "render": "Dieser Hackerspace wurde gegründet am {start_date}"
+ },
+ "hs-club-mate": {
+ "mappings": {
+ "0": {
+ "then": "In diesem Hackerspace gibt es Club Mate"
+ },
+ "1": {
+ "then": "In diesem Hackerspace gibt es kein Club Mate"
+ }
+ },
+ "question": "Gibt es in diesem Hackerspace Club Mate?"
+ },
+ "is_makerspace": {
+ "mappings": {
+ "0": {
+ "then": "Dies ist ein Makerspace"
+ },
+ "1": {
+ "then": "Dies ist ein traditioneller (softwareorientierter) Hackerspace"
+ }
+ },
+ "question": "Ist dies ein Hackerspace oder ein Makerspace?"
+ }
+ },
"title": {
"mappings": {
"0": {
- "then": "{name}"
- },
- "1": {
- "then": "{shop}"
+ "then": " {name}"
}
},
- "render": "Geschäft"
- },
- "tagRenderings": {
- "shops-shop": {
- "mappings": {
- "0": {
- "then": "Lebensmittelladen"
- },
- "1": {
- "then": "Supermarkt"
- },
- "2": {
- "then": "Bekleidungsgeschäft"
- },
- "3": {
- "then": "Friseur"
- },
- "4": {
- "then": "Bäckerei"
- },
- "5": {
- "then": "Autoreparatur (Werkstatt)"
- },
- "6": {
- "then": "Autohändler"
- }
- },
- "render": "Dieses Geschäft verkauft {shop}",
- "question": "Was wird in diesem Geschäft verkauft?"
- },
- "shops-phone": {
- "render": "{phone}"
- },
- "shops-website": {
- "render": "{website}",
- "question": "Wie lautet die Webseite dieses Geschäfts?"
- }
- },
- "presets": {
- "0": {
- "description": "Ein neues Geschäft hinzufügen"
- }
+ "render": "Hackerspace"
}
}
},
- "title": "Freie Geschäftskarte",
- "shortDescription": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen"
- },
- "postboxes": {
- "layers": {
- "1": {
- "tagRenderings": {
- "OH": {
- "mappings": {
- "0": {
- "then": "durchgehend geöffnet (auch an Feiertagen)"
- }
- }
- }
- },
- "description": "Eine Ebene mit Postämtern."
- }
- }
- },
- "openwindpowermap": {
- "description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen."
+ "shortDescription": "Eine Karte von Hackerspaces",
+ "title": "Hackerspaces"
},
"hailhydrant": {
+ "description": "Auf dieser Karte können Sie Hydranten, Feuerwachen, Krankenwagen und Feuerlöscher in Ihren bevorzugten Stadtvierteln finden und aktualisieren. \n\nSie können Ihren genauen Standort verfolgen (nur mobil) und in der unteren linken Ecke die für Sie relevanten Ebenen auswählen. Sie können mit diesem Tool auch Pins (Points of Interest) zur Karte hinzufügen oder bearbeiten und durch die Beantwortung verfügbarer Fragen zusätzliche Angaben machen. \n\nAlle von Ihnen vorgenommenen Änderungen werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei weiterverwendet werden.",
"layers": {
"0": {
+ "description": "Kartenebene zur Anzeige von Hydranten.",
"name": "Karte der Hydranten",
+ "presets": {
+ "0": {
+ "description": "Ein Hydrant ist ein Anschlusspunkt, an dem die Feuerwehr Wasser zapfen kann. Er kann sich unterirdisch befinden.",
+ "title": "Löschwasser-Hydrant"
+ }
+ },
"tagRenderings": {
"hydrant-color": {
"mappings": {
@@ -972,8 +841,23 @@
"then": "Die Farbe des Hydranten ist rot."
}
},
- "render": "Der Hydrant hat die Farbe {colour}",
- "question": "Welche Farbe hat der Hydrant?"
+ "question": "Welche Farbe hat der Hydrant?",
+ "render": "Der Hydrant hat die Farbe {colour}"
+ },
+ "hydrant-state": {
+ "mappings": {
+ "0": {
+ "then": "Der Hydrant ist (ganz oder teilweise) in Betrieb."
+ },
+ "1": {
+ "then": "Der Hydrant ist nicht verfügbar."
+ },
+ "2": {
+ "then": "Der Hydrant wurde entfernt."
+ }
+ },
+ "question": "Aktualisieren Sie den Lebenszyklusstatus des Hydranten.",
+ "render": "Lebenszyklus-Status"
},
"hydrant-type": {
"mappings": {
@@ -995,28 +879,6 @@
},
"question": "Um welche Art von Hydrant handelt es sich?",
"render": " Hydranten-Typ: {fire_hydrant:type}"
- },
- "hydrant-state": {
- "mappings": {
- "0": {
- "then": "Der Hydrant ist (ganz oder teilweise) in Betrieb."
- },
- "1": {
- "then": "Der Hydrant ist nicht verfügbar."
- },
- "2": {
- "then": "Der Hydrant wurde entfernt."
- }
- },
- "question": "Aktualisieren Sie den Lebenszyklusstatus des Hydranten.",
- "render": "Lebenszyklus-Status"
- }
- },
- "description": "Kartenebene zur Anzeige von Hydranten.",
- "presets": {
- "0": {
- "description": "Ein Hydrant ist ein Anschlusspunkt, an dem die Feuerwehr Wasser zapfen kann. Er kann sich unterirdisch befinden.",
- "title": "Löschwasser-Hydrant"
}
},
"title": {
@@ -1024,14 +886,14 @@
}
},
"1": {
+ "description": "Kartenebene zur Anzeige von Hydranten.",
+ "name": "Karte mit Feuerlöschern.",
"presets": {
"0": {
"description": "Ein Feuerlöscher ist ein kleines, tragbares Gerät, das dazu dient, ein Feuer zu löschen",
"title": "Feuerlöscher"
}
},
- "description": "Kartenebene zur Anzeige von Hydranten.",
- "name": "Karte mit Feuerlöschern.",
"tagRenderings": {
"extinguisher-location": {
"mappings": {
@@ -1051,14 +913,14 @@
}
},
"2": {
+ "description": "Kartenebene zur Darstellung von Feuerwachen.",
+ "name": "Karte der Feuerwachen",
"presets": {
"0": {
"description": "Eine Feuerwache ist ein Ort, an dem die Feuerwehrfahrzeuge und die Feuerwehrleute untergebracht sind, wenn sie nicht im Einsatz sind.",
"title": "Feuerwache"
}
},
- "description": "Kartenebene zur Darstellung von Feuerwachen.",
- "name": "Karte der Feuerwachen",
"tagRenderings": {
"station-name": {
"question": "Wie lautet der Name dieser Feuerwache?"
@@ -1072,7 +934,89 @@
}
}
}
+ }
+ },
+ "openwindpowermap": {
+ "description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen."
+ },
+ "personal": {
+ "description": "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen",
+ "title": "Persönliches Thema"
+ },
+ "postboxes": {
+ "layers": {
+ "1": {
+ "description": "Eine Ebene mit Postämtern.",
+ "tagRenderings": {
+ "OH": {
+ "mappings": {
+ "0": {
+ "then": "durchgehend geöffnet (auch an Feiertagen)"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shops": {
+ "shortDescription": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen",
+ "title": "Freie Geschäftskarte"
+ },
+ "sport_pitches": {
+ "description": "Ein Sportplatz ist eine Fläche, auf der Sportarten gespielt werden",
+ "shortDescription": "Eine Karte mit Sportplätzen",
+ "title": "Sportplätze"
+ },
+ "surveillance": {
+ "description": "Auf dieser offenen Karte finden Sie Überwachungskameras.",
+ "shortDescription": "Überwachungskameras und andere Mittel zur Überwachung",
+ "title": "Überwachung unter Überwachung"
+ },
+ "toilets": {
+ "description": "Eine Karte der öffentlichen Toiletten",
+ "title": "Offene Toilette Karte"
+ },
+ "trees": {
+ "description": "Kartieren Sie alle Bäume!",
+ "shortDescription": "Kartieren Sie alle Bäume",
+ "title": "Bäume"
+ },
+ "uk_addresses": {
+ "description": "Tragen Sie zu OpenStreetMap bei, indem Sie Adressinformationen ausfüllen",
+ "layers": {
+ "1": {
+ "description": "Adressen",
+ "name": "Bekannte Adressen in OSM",
+ "tagRenderings": {
+ "uk_addresses_explanation_osm": {
+ "render": "Diese Adresse ist in OpenStreetMap gespeichert"
+ },
+ "uk_addresses_housenumber": {
+ "mappings": {
+ "0": {
+ "then": "Dieses Gebäude hat keine Hausnummer"
+ }
+ },
+ "question": "Wie lautet die Nummer dieses Hauses?",
+ "render": "Die Hausnummer ist {addr:housenumber}"
+ },
+ "uk_addresses_street": {
+ "question": "In welcher Straße befindet sich diese Adresse?",
+ "render": "Diese Adresse befindet sich in der Straße {addr:street}"
+ }
+ },
+ "title": {
+ "render": "Bekannte Adresse"
+ }
+ }
},
- "description": "Auf dieser Karte können Sie Hydranten, Feuerwachen, Krankenwagen und Feuerlöscher in Ihren bevorzugten Stadtvierteln finden und aktualisieren. \n\nSie können Ihren genauen Standort verfolgen (nur mobil) und in der unteren linken Ecke die für Sie relevanten Ebenen auswählen. Sie können mit diesem Tool auch Pins (Points of Interest) zur Karte hinzufügen oder bearbeiten und durch die Beantwortung verfügbarer Fragen zusätzliche Angaben machen. \n\nAlle von Ihnen vorgenommenen Änderungen werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei weiterverwendet werden."
+ "shortDescription": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen",
+ "title": "Adressen in Großbritannien"
+ },
+ "waste_basket": {
+ "description": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen",
+ "shortDescription": "Eine Karte mit Abfalleimern",
+ "title": "Abfalleimer"
}
}
\ No newline at end of file
diff --git a/langs/themes/nl.json b/langs/themes/nl.json
index 0bf2453528..34fef4ae80 100644
--- a/langs/themes/nl.json
+++ b/langs/themes/nl.json
@@ -97,8 +97,6 @@
}
}
},
- "shortDescription": "Met deze tool kan je natuur in je buurt in kaart brengen en meer informatie geven over je favoriete plekje",
- "title": "Breng jouw buurtnatuur in kaart",
"overrideAll": {
"tagRenderings+": {
"0": {
@@ -163,7 +161,9 @@
"render": "Dit gebied heet {name}"
}
}
- }
+ },
+ "shortDescription": "Met deze tool kan je natuur in je buurt in kaart brengen en meer informatie geven over je favoriete plekje",
+ "title": "Breng jouw buurtnatuur in kaart"
},
"cafes_and_pubs": {
"description": "Cafés, kroegen en drinkgelegenheden",
@@ -175,11 +175,25 @@
"0": {
"description": "camperplaatsen",
"name": "Camperplaatsen",
+ "presets": {
+ "0": {
+ "description": "Voeg een nieuwe officiële camperplaats toe. Dit zijn speciaal aangeduide plaatsen waar het toegestaan is om te overnachten met een camper. Ze kunnen er uitzien als een parking, of soms eerder als een camping. Soms staan ze niet ter plaatse aangeduid, maar heeft de gemeente wel degelijk beslist dat dit een camperplaats is. Een parking voor campers waar je niet mag overnachten is géén camperplaats. ",
+ "title": "camperplaats"
+ }
+ },
"tagRenderings": {
+ "caravansites-capacity": {
+ "question": "Hoeveel campers kunnen hier overnachten? (sla dit over als er geen duidelijk aantal plaatsen of aangeduid maximum is)",
+ "render": "{capacity} campers kunnen deze plaats tegelijk gebruiken"
+ },
"caravansites-charge": {
"question": "Hoeveel kost deze plaats?",
"render": "Deze plaats vraagt {charge}"
},
+ "caravansites-description": {
+ "question": "Wil je graag een algemene beschrijving toevoegen van deze plaats? (Herhaal hier niet de antwoorden op de vragen die reeds gesteld zijn. Hou het objectief - je kan je mening geven via een review)",
+ "render": "Meer details over deze plaats: {description}"
+ },
"caravansites-fee": {
"mappings": {
"0": {
@@ -191,13 +205,6 @@
},
"question": "Moet men betalen om deze camperplaats te gebruiken?"
},
- "caravansites-name": {
- "question": "Wat is de naam van deze plaats?",
- "render": "Deze plaats heet {name}"
- },
- "caravansites-website": {
- "render": "Officiële website: : {website}"
- },
"caravansites-internet": {
"mappings": {
"0": {
@@ -208,13 +215,12 @@
}
}
},
- "caravansites-description": {
- "question": "Wil je graag een algemene beschrijving toevoegen van deze plaats? (Herhaal hier niet de antwoorden op de vragen die reeds gesteld zijn. Hou het objectief - je kan je mening geven via een review)",
- "render": "Meer details over deze plaats: {description}"
+ "caravansites-name": {
+ "question": "Wat is de naam van deze plaats?",
+ "render": "Deze plaats heet {name}"
},
- "caravansites-capacity": {
- "question": "Hoeveel campers kunnen hier overnachten? (sla dit over als er geen duidelijk aantal plaatsen of aangeduid maximum is)",
- "render": "{capacity} campers kunnen deze plaats tegelijk gebruiken"
+ "caravansites-website": {
+ "render": "Officiële website: : {website}"
}
},
"title": {
@@ -224,12 +230,6 @@
}
},
"render": "Camperplaats {name}"
- },
- "presets": {
- "0": {
- "description": "Voeg een nieuwe officiële camperplaats toe. Dit zijn speciaal aangeduide plaatsen waar het toegestaan is om te overnachten met een camper. Ze kunnen er uitzien als een parking, of soms eerder als een camping. Soms staan ze niet ter plaatse aangeduid, maar heeft de gemeente wel degelijk beslist dat dit een camperplaats is. Een parking voor campers waar je niet mag overnachten is géén camperplaats. ",
- "title": "camperplaats"
- }
}
}
},
@@ -394,18 +394,6 @@
}
},
"overrideAll": {
- "units+": {
- "0": {
- "applicableUnits": {
- "0": {
- "human": " meter"
- },
- "1": {
- "human": " voet"
- }
- }
- }
- },
"tagRenderings+": {
"0": {
"question": "Is er een (onofficiële) website met meer informatie (b.v. met topos)?"
@@ -505,6 +493,18 @@
},
"question": "Is er een snelklimmuur (speed climbing)?"
}
+ },
+ "units+": {
+ "0": {
+ "applicableUnits": {
+ "0": {
+ "human": " meter"
+ },
+ "1": {
+ "human": " voet"
+ }
+ }
+ }
}
},
"title": "Open klimkaart"
@@ -541,8 +541,6 @@
}
}
},
- "shortDescription": "Een kaart met alle gekende fietsstraten",
- "title": "Fietsstraten",
"overrideAll": {
"tagRenderings+": {
"0": {
@@ -567,7 +565,9 @@
"render": "Deze straat wordt fietsstraat op {cyclestreet:start_date}"
}
}
- }
+ },
+ "shortDescription": "Een kaart met alle gekende fietsstraten",
+ "title": "Fietsstraten"
},
"cyclofix": {
"description": "Het doel van deze kaart is om fietsers een gebruiksvriendelijke oplossing te bieden voor het vinden van de juiste infrastructuur voor hun behoeften.
U kunt uw exacte locatie volgen (enkel mobiel) en in de linkerbenedenhoek categorieën selecteren die voor u relevant zijn. U kunt deze tool ook gebruiken om 'spelden' aan de kaart toe te voegen of te bewerken en meer gegevens te verstrekken door de vragen te beantwoorden.
Alle wijzigingen die u maakt worden automatisch opgeslagen in de wereldwijde database van OpenStreetMap en kunnen door anderen vrij worden hergebruikt.
Bekijk voor meer info over cyclofix ook cyclofix.osm.be.",
@@ -945,27 +945,27 @@
"shortDescription": "Breng bomen in kaart",
"title": "Bomen"
},
- "waste_basket": {
- "description": "Op deze kaart vind je vuilnisbakken waar je afval in kan smijten. Ontbreekt er een vuilnisbak? Dan kan je die zelf toevoegen",
- "shortDescription": "Een kaart met vuilnisbakken",
- "title": "Vuilnisbak"
- },
"uk_addresses": {
+ "description": "Draag bij aan OpenStreetMap door adresinformatie in te vullen",
"layers": {
"1": {
+ "description": "Adressen",
"tagRenderings": {
"uk_addresses_housenumber": {
- "render": "Het huisnummer is {addr:housenumber}",
"mappings": {
"0": {
"then": "Dit gebouw heeft geen huisnummer"
}
- }
+ },
+ "render": "Het huisnummer is {addr:housenumber}"
}
- },
- "description": "Adressen"
+ }
}
- },
- "description": "Draag bij aan OpenStreetMap door adresinformatie in te vullen"
+ }
+ },
+ "waste_basket": {
+ "description": "Op deze kaart vind je vuilnisbakken waar je afval in kan smijten. Ontbreekt er een vuilnisbak? Dan kan je die zelf toevoegen",
+ "shortDescription": "Een kaart met vuilnisbakken",
+ "title": "Vuilnisbak"
}
}
\ No newline at end of file
From 933c0f007365c21a14af692001d5e616e68da24b Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Sat, 23 Oct 2021 02:46:37 +0200
Subject: [PATCH 28/58] Fix opening of various views when set by
url-parameters, small styling tweaks in the popups
---
Logic/Actors/SelectedFeatureHandler.ts | 28 ++--
Logic/State/FeatureSwitchState.ts | 21 +--
Logic/State/MapState.ts | 11 +-
Logic/Web/QueryParameters.ts | 4 +
UI/Base/Ornament.ts | 11 --
UI/Base/ScrollableFullScreen.ts | 47 ++----
UI/BigComponents/AllDownloads.ts | 3 +-
UI/BigComponents/FullWelcomePaneWithTabs.ts | 2 +-
UI/BigComponents/LeftControls.ts | 26 +---
UI/DefaultGUI.ts | 98 +++++++++----
UI/Popup/FeatureInfoBox.ts | 3 +-
assets/svg/close.svg | 155 ++++++++++----------
css/index-tailwind-output.css | 75 +++++-----
index.css | 1 +
14 files changed, 237 insertions(+), 248 deletions(-)
delete mode 100644 UI/Base/Ornament.ts
diff --git a/Logic/Actors/SelectedFeatureHandler.ts b/Logic/Actors/SelectedFeatureHandler.ts
index b45e87b931..7d431c7af5 100644
--- a/Logic/Actors/SelectedFeatureHandler.ts
+++ b/Logic/Actors/SelectedFeatureHandler.ts
@@ -10,7 +10,7 @@ import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
* Makes sure the hash shows the selected element and vice-versa.
*/
export default class SelectedFeatureHandler {
- private static readonly _no_trigger_on = new Set(["welcome", "copyright", "layers", "new", "", undefined])
+ private static readonly _no_trigger_on = new Set(["welcome", "copyright", "layers", "new", "filter","", undefined])
private readonly hash: UIEventSource;
private readonly state: {
selectedElement: UIEventSource,
@@ -70,7 +70,7 @@ export default class SelectedFeatureHandler {
this.initialLoad()
}
-
+
/**
* On startup: check if the hash is loaded and eventually zoom to it
@@ -85,6 +85,11 @@ export default class SelectedFeatureHandler {
return;
}
+ if (!(hash.startsWith("node") || hash.startsWith("way") || hash.startsWith("relation"))) {
+ return;
+ }
+
+
OsmObject.DownloadObjectAsync(hash).then(obj => {
try {
@@ -129,26 +134,25 @@ export default class SelectedFeatureHandler {
// If a feature is selected via the hash, zoom there
private zoomToSelectedFeature() {
-
+
const selected = this.state.selectedElement.data
- if(selected === undefined){
+ if (selected === undefined) {
return
}
-
- const centerpoint= GeoOperations.centerpointCoordinates(selected)
+
+ const centerpoint = GeoOperations.centerpointCoordinates(selected)
const location = this.state.locationControl;
location.data.lon = centerpoint[0]
location.data.lat = centerpoint[1]
-
+
const minZoom = Math.max(14, ...(this.state.layoutToUse?.layers?.map(l => l.minzoomVisible) ?? []))
- if(location.data.zoom < minZoom ){
+ if (location.data.zoom < minZoom) {
location.data.zoom = minZoom
}
-
+
location.ping();
-
-
-
+
+
}
}
\ No newline at end of file
diff --git a/Logic/State/FeatureSwitchState.ts b/Logic/State/FeatureSwitchState.ts
index 2315280ca5..0f5df51f78 100644
--- a/Logic/State/FeatureSwitchState.ts
+++ b/Logic/State/FeatureSwitchState.ts
@@ -144,31 +144,20 @@ export default class FeatureSwitchState {
}
- this.featureSwitchIsTesting = QueryParameters.GetQueryParameter(
+ this.featureSwitchIsTesting = QueryParameters.GetBooleanQueryParameter(
"test",
""+testingDefaultValue,
"If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org"
- ).map(
- (str) => str === "true",
- [],
- (b) => "" + b
- );
+ )
- this.featureSwitchIsDebugging = QueryParameters.GetQueryParameter(
+ this.featureSwitchIsDebugging = QueryParameters.GetBooleanQueryParameter(
"debug",
"false",
"If true, shows some extra debugging help such as all the available tags on every object"
- ).map(
- (str) => str === "true",
- [],
- (b) => "" + b
- );
+ )
- this.featureSwitchFakeUser = QueryParameters.GetQueryParameter("fake-user", "false",
+ this.featureSwitchFakeUser = QueryParameters.GetBooleanQueryParameter("fake-user", "false",
"If true, 'dryrun' mode is activated and a fake user account is loaded")
- .map(str => str === "true", [], b => "" + b);
-
-
this.overpassUrl = QueryParameters.GetQueryParameter("overpassUrl",
diff --git a/Logic/State/MapState.ts b/Logic/State/MapState.ts
index afcbb1bf21..00a05dd61c 100644
--- a/Logic/State/MapState.ts
+++ b/Logic/State/MapState.ts
@@ -119,7 +119,7 @@ export default class MapState extends UserRelatedState {
this.overlayToggles = this.layoutToUse.tileLayerSources.filter(c => c.name !== undefined).map(c => ({
config: c,
- isDisplayed: QueryParameters.GetQueryParameter("overlay-" + c.id, "" + c.defaultState, "Wether or not the overlay " + c.id + " is shown").map(str => str === "true", [], b => "" + b)
+ isDisplayed: QueryParameters.GetBooleanQueryParameter("overlay-" + c.id, "" + c.defaultState, "Wether or not the overlay " + c.id + " is shown")
}))
this.filteredLayers = this.InitializeFilteredLayers()
@@ -170,17 +170,12 @@ export default class MapState extends UserRelatedState {
.map(value => value === "yes", [], enabled => {
return enabled ? "yes" : "";
})
- isDisplayed.addCallbackAndRun(d => console.log("IsDisplayed for layer", layer.id, "is currently", d))
} else {
- isDisplayed = QueryParameters.GetQueryParameter(
+ isDisplayed = QueryParameters.GetBooleanQueryParameter(
"layer-" + layer.id,
"true",
"Wether or not layer " + layer.id + " is shown"
- ).map(
- (str) => str !== "false",
- [],
- (b) => b.toString()
- );
+ )
}
const flayer = {
isDisplayed: isDisplayed,
diff --git a/Logic/Web/QueryParameters.ts b/Logic/Web/QueryParameters.ts
index 36ecc76803..8af95a69bd 100644
--- a/Logic/Web/QueryParameters.ts
+++ b/Logic/Web/QueryParameters.ts
@@ -55,6 +55,10 @@ export class QueryParameters {
return source;
}
+ public static GetBooleanQueryParameter(key: string, deflt: string, documentation?: string): UIEventSource{
+ return QueryParameters.GetQueryParameter(key, deflt, documentation).map(str => str === "true", [], b => ""+b)
+ }
+
public static GenerateQueryParameterDocs(): string {
const docs = [QueryParameters.QueryParamDocsIntro];
for (const key in QueryParameters.documentation) {
diff --git a/UI/Base/Ornament.ts b/UI/Base/Ornament.ts
deleted file mode 100644
index 7c2798892f..0000000000
--- a/UI/Base/Ornament.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import {FixedUiElement} from "./FixedUiElement";
-
-export default class Ornament extends FixedUiElement {
-
- constructor() {
- super("");
- this.SetClass("pt-3 pb-3 flex justify-center box-border")
- }
-
-
-}
\ No newline at end of file
diff --git a/UI/Base/ScrollableFullScreen.ts b/UI/Base/ScrollableFullScreen.ts
index da8114f8ca..07124f997c 100644
--- a/UI/Base/ScrollableFullScreen.ts
+++ b/UI/Base/ScrollableFullScreen.ts
@@ -1,11 +1,11 @@
import {UIElement} from "../UIElement";
import Svg from "../../Svg";
import Combine from "./Combine";
-import Ornament from "./Ornament";
import {FixedUiElement} from "./FixedUiElement";
import {UIEventSource} from "../../Logic/UIEventSource";
import Hash from "../../Logic/Web/Hash";
import BaseUIElement from "../BaseUIElement";
+import Img from "./Img";
/**
*
@@ -18,26 +18,22 @@ import BaseUIElement from "../BaseUIElement";
*/
export default class ScrollableFullScreen extends UIElement {
private static readonly empty = new FixedUiElement("");
- private static readonly _actor = ScrollableFullScreen.InitActor();
private static _currentlyOpen: ScrollableFullScreen;
public isShown: UIEventSource;
private _component: BaseUIElement;
private _fullscreencomponent: BaseUIElement;
- private _hashToSet: string;
constructor(title: ((mode: string) => BaseUIElement), content: ((mode: string) => BaseUIElement),
- hashToSet: string,
isShown: UIEventSource = new UIEventSource(false)
) {
super();
this.isShown = isShown;
- this._hashToSet = hashToSet;
this._component = this.BuildComponent(title("desktop"), content("desktop"), isShown)
.SetClass("hidden md:block");
- this._fullscreencomponent = this.BuildComponent(title("mobile"), content("mobile"), isShown);
+ this._fullscreencomponent = this.BuildComponent(title("mobile"), content("mobile").SetClass("pb-20"), isShown);
+
-
const self = this;
isShown.addCallback(isShown => {
if (isShown) {
@@ -56,15 +52,6 @@ export default class ScrollableFullScreen extends UIElement {
Hash.hash.setData(undefined);
}
- private static InitActor() {
- Hash.hash.addCallback(hash => {
- if (hash === undefined || hash === "") {
- ScrollableFullScreen.clear()
- }
- });
- return true;
- }
-
InnerRender(): BaseUIElement {
return this._component;
}
@@ -72,9 +59,6 @@ export default class ScrollableFullScreen extends UIElement {
Activate(): void {
this.isShown.setData(true)
this._fullscreencomponent.AttachTo("fullscreen");
- if (this._hashToSet != undefined) {
- Hash.hash.setData(this._hashToSet)
- }
const fs = document.getElementById("fullscreen");
ScrollableFullScreen._currentlyOpen = this;
fs.classList.remove("hidden")
@@ -83,25 +67,26 @@ export default class ScrollableFullScreen extends UIElement {
private BuildComponent(title: BaseUIElement, content: BaseUIElement, isShown: UIEventSource) {
const returnToTheMap =
new Combine([
- Svg.back_svg().SetClass("block md:hidden"),
- Svg.close_svg().SetClass("hidden md:block")
- ])
- .onClick(() => {
- isShown.setData(false)
- }).SetClass("mb-2 bg-blue-50 rounded-full w-12 h-12 p-1.5 flex-shrink-0")
+ new Img(Svg.back.replace(/#000000/g,"#cccccc"),true)
+ .SetClass("block md:hidden w-12 h-12 p-2"),
+ new Img(Svg.close.replace(/#000000/g,"#cccccc"),true)
+ .SetClass("hidden md:block w-12 h-12 p-3")
+ ]).SetClass("rounded-full p-0 flex-shrink-0 self-center")
- title.SetClass("block text-l sm:text-xl md:text-2xl w-full font-bold p-2 pl-4 max-h-20vh overflow-y-auto")
- const ornament = new Combine([new Ornament().SetStyle("height:5em;")])
- .SetClass("md:hidden h-5")
+ returnToTheMap.onClick(() => {
+ isShown.setData(false)
+ })
+
+ title.SetClass("block text-l sm:text-xl md:text-2xl w-full font-bold p-0 max-h-20vh overflow-y-auto")
return new Combine([
new Combine([
new Combine([returnToTheMap, title])
- .SetClass("border-b-2 border-black shadow md:shadow-none bg-white p-2 pb-0 md:p-0 flex flex-shrink-0"),
- new Combine([content, ornament])
+ .SetClass("border-b-1 border-black shadow bg-white flex flex-shrink-0 pt-1 pb-1 md:pt-0 md:pb-0"),
+ new Combine([content])
.SetClass("block p-2 md:pt-4 w-full h-full overflow-y-auto md:max-h-65vh"),
// We add an ornament which takes around 5em. This is in order to make sure the Web UI doesn't hide
]).SetClass("flex flex-col h-full relative bg-white")
- ]).SetClass("fixed top-0 left-0 right-0 h-screen w-screen md:max-h-65vh md:w-auto md:relative z-above-controls");
+ ]).SetClass("fixed top-0 left-0 right-0 h-screen w-screen md:max-h-65vh md:w-auto md:relative z-above-controls md:rounded-xl overflow-hidden");
}
diff --git a/UI/BigComponents/AllDownloads.ts b/UI/BigComponents/AllDownloads.ts
index 3df26f53de..b49e77bcb0 100644
--- a/UI/BigComponents/AllDownloads.ts
+++ b/UI/BigComponents/AllDownloads.ts
@@ -9,12 +9,11 @@ import {DownloadPanel} from "./DownloadPanel";
import {SubtleButton} from "../Base/SubtleButton";
import Svg from "../../Svg";
import ExportPDF from "../ExportPDF";
-import {FixedUiElement} from "../Base/FixedUiElement";
export default class AllDownloads extends ScrollableFullScreen {
constructor(isShown: UIEventSource) {
- super(AllDownloads.GenTitle, AllDownloads.GeneratePanel, "layers", isShown);
+ super(AllDownloads.GenTitle, AllDownloads.GeneratePanel, isShown);
}
private static GenTitle(): BaseUIElement {
diff --git a/UI/BigComponents/FullWelcomePaneWithTabs.ts b/UI/BigComponents/FullWelcomePaneWithTabs.ts
index 8dc7cf668f..1862110ce2 100644
--- a/UI/BigComponents/FullWelcomePaneWithTabs.ts
+++ b/UI/BigComponents/FullWelcomePaneWithTabs.ts
@@ -30,7 +30,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
super(
() => layoutToUse.title.Clone(),
() => FullWelcomePaneWithTabs.GenerateContents(state, currentTab, isShown),
- undefined, isShown
+ isShown
)
}
diff --git a/UI/BigComponents/LeftControls.ts b/UI/BigComponents/LeftControls.ts
index b92adb54ab..4b2328533e 100644
--- a/UI/BigComponents/LeftControls.ts
+++ b/UI/BigComponents/LeftControls.ts
@@ -26,12 +26,12 @@ export default class LeftControls extends Combine {
featureSwitchEnableExport: UIEventSource,
featureSwitchExportAsPdf: UIEventSource,
filteredLayers: UIEventSource,
- featureSwitchFilter: UIEventSource,
- selectedElement: UIEventSource
+ featureSwitchFilter: UIEventSource
},
guiState: {
downloadControlIsOpened: UIEventSource,
filterViewIsOpened: UIEventSource,
+ copyrightViewIsOpened: UIEventSource
}) {
const toggledCopyright = new ScrollableFullScreen(
@@ -41,7 +41,7 @@ export default class LeftControls extends Combine {
state.layoutToUse,
new ContributorCount(state).Contributors
),
- undefined
+ guiState.copyrightViewIsOpened
);
const copyrightButton = new Toggle(
@@ -49,8 +49,7 @@ export default class LeftControls extends Combine {
new MapControlButton(Svg.copyright_svg())
.onClick(() => toggledCopyright.isShown.setData(true)),
toggledCopyright.isShown
- )
- .SetClass("p-0.5");
+ ).SetClass("p-0.5");
const toggledDownload = new Toggle(
new AllDownloads(
@@ -73,11 +72,10 @@ export default class LeftControls extends Combine {
() => Translations.t.general.layerSelection.title.Clone(),
() =>
new FilterView(state.filteredLayers, state.overlayToggles).SetClass(
- "block p-1 rounded-full"
+ "block p-1"
),
- undefined,
guiState.filterViewIsOpened
- ),
+ ).SetClass("rounded-lg"),
new MapControlButton(Svg.filter_svg())
.onClick(() => guiState.filterViewIsOpened.setData(true)),
guiState.filterViewIsOpened
@@ -90,18 +88,6 @@ export default class LeftControls extends Combine {
);
- state.locationControl.addCallback(() => {
- // Close the layer selection when the map is moved
- toggledDownload.isEnabled.setData(false);
- copyrightButton.isEnabled.setData(false);
- toggledFilter.isEnabled.setData(false);
- });
-
- state.selectedElement.addCallbackAndRunD((_) => {
- toggledDownload.isEnabled.setData(false);
- copyrightButton.isEnabled.setData(false);
- toggledFilter.isEnabled.setData(false);
- });
super([filterButton,
downloadButtonn,
copyrightButton])
diff --git a/UI/DefaultGUI.ts b/UI/DefaultGUI.ts
index fc195f90d7..9af6162335 100644
--- a/UI/DefaultGUI.ts
+++ b/UI/DefaultGUI.ts
@@ -26,44 +26,71 @@ import StrayClickHandler from "../Logic/Actors/StrayClickHandler";
import Lazy from "./Base/Lazy";
export class DefaultGuiState {
- public readonly welcomeMessageIsOpened;
+ public readonly welcomeMessageIsOpened : UIEventSource;
public readonly downloadControlIsOpened: UIEventSource;
public readonly filterViewIsOpened: UIEventSource;
- public readonly welcomeMessageOpenedTab
+ public readonly copyrightViewIsOpened: UIEventSource;
+ public readonly welcomeMessageOpenedTab: UIEventSource
+ public readonly allFullScreenStates: UIEventSource[] = []
constructor() {
- this.filterViewIsOpened = QueryParameters.GetQueryParameter(
- "filter-toggle",
- "false",
- "Whether or not the filter view is shown"
- ).map(
- (str) => str !== "false",
- [],
- (b) => "" + b
- );
- this.welcomeMessageIsOpened = new UIEventSource(Hash.hash.data === undefined ||
- Hash.hash.data === "" ||
- Hash.hash.data == "welcome");
- this.welcomeMessageOpenedTab = QueryParameters.GetQueryParameter(
+
+
+ this.welcomeMessageOpenedTab = UIEventSource.asFloat(QueryParameters.GetQueryParameter(
"tab",
"0",
`The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >${Constants.userJourney.mapCompleteHelpUnlock} changesets)`
- ).map(
- (str) => (isNaN(Number(str)) ? 0 : Number(str)),
- [],
- (n) => "" + n
- );
- this.downloadControlIsOpened =
- QueryParameters.GetQueryParameter(
+ ));
+ this.welcomeMessageIsOpened = QueryParameters.GetBooleanQueryParameter(
+ "welcome-control-toggle",
+ "false",
+ "Whether or not the welcome panel is shown"
+ )
+ this.downloadControlIsOpened = QueryParameters.GetBooleanQueryParameter(
"download-control-toggle",
"false",
"Whether or not the download panel is shown"
- ).map(
- (str) => str !== "false",
- [],
- (b) => "" + b
- );
+ )
+ this.filterViewIsOpened = QueryParameters.GetBooleanQueryParameter(
+ "filter-toggle",
+ "false",
+ "Whether or not the filter view is shown"
+ )
+ this.copyrightViewIsOpened = QueryParameters.GetBooleanQueryParameter(
+ "copyright-toggle",
+ "false",
+ "Whether or not the copyright view is shown"
+ )
+ if(Hash.hash.data === "download"){
+ this.downloadControlIsOpened.setData(true)
+ }
+ if(Hash.hash.data === "filter"){
+ this.filterViewIsOpened.setData(true)
+ }
+ if(Hash.hash.data === "copyright"){
+ this.copyrightViewIsOpened.setData(true)
+ }
+ if(Hash.hash.data === "" || Hash.hash.data === undefined || Hash.hash.data === "welcome"){
+ this.welcomeMessageIsOpened.setData(true)
+ }
+
+ this.allFullScreenStates.push(this.downloadControlIsOpened, this.filterViewIsOpened, this.copyrightViewIsOpened, this.welcomeMessageIsOpened)
+
+ for (let i = 0; i < this.allFullScreenStates.length; i++){
+ const fullScreenState = this.allFullScreenStates[i];
+ for (let j = 0; j < this.allFullScreenStates.length; j++){
+ if(i == j){
+ continue
+ }
+ const otherState = this.allFullScreenStates[j];
+ fullScreenState.addCallbackAndRunD(isOpened => {
+ if(isOpened){
+ otherState.setData(false)
+ }
+ })
+ }
+ }
}
}
@@ -154,6 +181,7 @@ export default class DefaultGUI {
Toggle.If(state.featureSwitchIframePopoutEnabled, iframePopout),
state.featureSwitchWelcomeMessage
).AttachTo("messagesbox");
+
new LeftControls(state, guiState).AttachTo("bottom-left");
new RightControls(state).AttachTo("bottom-right");
@@ -162,6 +190,21 @@ export default class DefaultGUI {
document
.getElementById("centermessage")
.classList.add("pointer-events-none");
+
+ // We have to ping the welcomeMessageIsOpened and other isOpened-stuff to activate the FullScreenMessage if needed
+ for (const state of guiState.allFullScreenStates) {
+ if(state.data){
+ state.ping()
+ }
+ }
+
+ /**
+ * At last, if the map moves or an element is selected, we close all the panels just as well
+ */
+
+ state.selectedElement.addCallbackAndRunD((_) => {
+ guiState.allFullScreenStates.forEach(s => s.setData(false))
+ });
}
private InitWelcomeMessage() : BaseUIElement{
@@ -211,7 +254,6 @@ export default class DefaultGUI {
const addNewPoint = new ScrollableFullScreen(
() => Translations.t.general.add.title.Clone(),
() => new SimpleAddUI(newPointDialogIsShown, filterViewIsOpened, state),
- "new",
newPointDialogIsShown
);
addNewPoint.isShown.addCallback((isShown) => {
diff --git a/UI/Popup/FeatureInfoBox.ts b/UI/Popup/FeatureInfoBox.ts
index 155df8bdc0..86f3aa68fa 100644
--- a/UI/Popup/FeatureInfoBox.ts
+++ b/UI/Popup/FeatureInfoBox.ts
@@ -26,8 +26,7 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
layerConfig: LayerConfig,
) {
super(() => FeatureInfoBox.GenerateTitleBar(tags, layerConfig),
- () => FeatureInfoBox.GenerateContent(tags, layerConfig),
- undefined);
+ () => FeatureInfoBox.GenerateContent(tags, layerConfig));
if (layerConfig === undefined) {
throw "Undefined layerconfig";
diff --git a/assets/svg/close.svg b/assets/svg/close.svg
index 1d43446560..ded2ef0e4e 100644
--- a/assets/svg/close.svg
+++ b/assets/svg/close.svg
@@ -2,83 +2,80 @@
diff --git a/css/index-tailwind-output.css b/css/index-tailwind-output.css
index 63c10a8d0c..ee61e9cea2 100644
--- a/css/index-tailwind-output.css
+++ b/css/index-tailwind-output.css
@@ -856,10 +856,6 @@ video {
margin-left: 0.75rem;
}
-.mb-2 {
- margin-bottom: 0.5rem;
-}
-
.mr-4 {
margin-right: 1rem;
}
@@ -924,6 +920,14 @@ video {
margin-right: 0.75rem;
}
+.mb-2 {
+ margin-bottom: 0.5rem;
+}
+
+.mb-0 {
+ margin-bottom: 0px;
+}
+
.box-border {
box-sizing: border-box;
}
@@ -988,10 +992,6 @@ video {
height: 3rem;
}
-.h-5 {
- height: 1.25rem;
-}
-
.h-screen {
height: 100vh;
}
@@ -1279,10 +1279,6 @@ video {
border-width: 2px;
}
-.border-b-2 {
- border-bottom-width: 2px;
-}
-
.border-b {
border-bottom-width: 1px;
}
@@ -1316,11 +1312,6 @@ video {
background-color: rgba(255, 255, 255, var(--tw-bg-opacity));
}
-.bg-blue-50 {
- --tw-bg-opacity: 1;
- background-color: rgba(239, 246, 255, var(--tw-bg-opacity));
-}
-
.bg-blue-100 {
--tw-bg-opacity: 1;
background-color: rgba(219, 234, 254, var(--tw-bg-opacity));
@@ -1386,32 +1377,28 @@ video {
padding: 0.5rem;
}
-.p-0\.5 {
- padding: 0.125rem;
-}
-
.p-0 {
padding: 0px;
}
+.p-0\.5 {
+ padding: 0.125rem;
+}
+
.pl-2 {
padding-left: 0.5rem;
}
-.pt-3 {
- padding-top: 0.75rem;
+.pb-20 {
+ padding-bottom: 5rem;
}
-.pb-3 {
- padding-bottom: 0.75rem;
+.pt-1 {
+ padding-top: 0.25rem;
}
-.pl-4 {
- padding-left: 1rem;
-}
-
-.pb-0 {
- padding-bottom: 0px;
+.pb-1 {
+ padding-bottom: 0.25rem;
}
.pl-1 {
@@ -1426,6 +1413,10 @@ video {
padding-top: 1.5rem;
}
+.pb-3 {
+ padding-bottom: 0.75rem;
+}
+
.pl-5 {
padding-left: 1.25rem;
}
@@ -1434,6 +1425,10 @@ video {
padding-right: 0.75rem;
}
+.pl-4 {
+ padding-left: 1rem;
+}
+
.pr-4 {
padding-right: 1rem;
}
@@ -2187,6 +2182,7 @@ li::marker {
.leaflet-popup-content {
width: 45em !important;
+ margin: 0.25rem !important;
}
.leaflet-div-icon {
@@ -2422,8 +2418,8 @@ li::marker {
flex-direction: row;
}
- .md\:p-0 {
- padding: 0px;
+ .md\:rounded-xl {
+ border-radius: 0.75rem;
}
.md\:p-1 {
@@ -2442,6 +2438,14 @@ li::marker {
padding: 0.75rem;
}
+ .md\:pt-0 {
+ padding-top: 0px;
+ }
+
+ .md\:pb-0 {
+ padding-bottom: 0px;
+ }
+
.md\:pt-4 {
padding-top: 1rem;
}
@@ -2461,11 +2465,6 @@ li::marker {
line-height: 1.75rem;
}
- .md\:shadow-none {
- --tw-shadow: 0 0 #0000;
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
- }
-
.md\:w-160 {
width: 40rem;
}
diff --git a/index.css b/index.css
index 6eb113abcf..108f02fe27 100644
--- a/index.css
+++ b/index.css
@@ -424,6 +424,7 @@ li::marker {
.leaflet-popup-content {
width: 45em !important;
+ margin: 0.25rem !important;
}
.leaflet-div-icon {
From e0ad1fb4a00c73feefe658f6cb9a26624d69ec81 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sat, 23 Oct 2021 18:36:38 +0000
Subject: [PATCH 29/58] Translated using Weblate (German)
Currently translated at 67.0% (827 of 1233 strings)
Translation: MapComplete/Layer translations
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layer-translations/de/
---
langs/layers/de.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/langs/layers/de.json b/langs/layers/de.json
index b8866f7591..1072f2c7ae 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -986,7 +986,7 @@
"then": "Authentifizierung per Debitkarte ist möglich"
},
"7": {
- "then": "Keine Authentifizierung erforderlich"
+ "then": "Das Aufladen ist hier (auch) ohne Authentifizierung möglich"
}
},
"question": "Welche Authentifizierung ist an der Ladestation möglich?"
@@ -2774,4 +2774,4 @@
"watermill": {
"name": "Wassermühle"
}
-}
\ No newline at end of file
+}
From 23ee93fe16da821f89a2cb27caaf8039ce74c145 Mon Sep 17 00:00:00 2001
From: SC
Date: Sat, 23 Oct 2021 13:39:06 +0000
Subject: [PATCH 30/58] Translated using Weblate (Portuguese)
Currently translated at 100.0% (29 of 29 strings)
Translation: MapComplete/shared-questions
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/shared-questions/pt/
---
langs/shared-questions/pt.json | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/langs/shared-questions/pt.json b/langs/shared-questions/pt.json
index fbd7309863..2afb0b221f 100644
--- a/langs/shared-questions/pt.json
+++ b/langs/shared-questions/pt.json
@@ -78,6 +78,22 @@
}
},
"question": "Este lugar é acessível a utilizadores de cadeiras de rodas?"
+ },
+ "wikipedialink": {
+ "question": "Qual é o item correspondente na Wikipédia?",
+ "mappings": {
+ "0": {
+ "then": "Não vinculado à Wikipédia"
+ }
+ }
+ },
+ "wikipedia": {
+ "question": "Qual é a entidade Wikidata correspondente?",
+ "mappings": {
+ "0": {
+ "then": "Ainda não foi vinculada nenhuma página da Wikipédia"
+ }
+ }
}
}
-}
\ No newline at end of file
+}
From 9d2527661bc6664d52694e14685d5c848a0d6325 Mon Sep 17 00:00:00 2001
From: SC
Date: Sat, 23 Oct 2021 13:39:30 +0000
Subject: [PATCH 31/58] Translated using Weblate (Portuguese)
Currently translated at 41.6% (95 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/pt/
---
langs/pt.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/langs/pt.json b/langs/pt.json
index 92db819cb1..21667811d9 100644
--- a/langs/pt.json
+++ b/langs/pt.json
@@ -9,7 +9,7 @@
"isDeleted": "Eliminada",
"doDelete": "Remover imagem",
"dontDelete": "Cancelar",
- "uploadDone": "A sua imagem foi adicionada. Obrigado pela ajuda!",
+ "uploadDone": "A sua imagem foi adicionada. Obrigado pela ajuda!",
"respectPrivacy": "Não fotografe pessoas nem placas de veículos. Não envie imagens do Google Maps, do Google Streetview ou outras fontes protegidas por direitos de autor.",
"uploadFailed": "Não foi possível enviar a sua imagem. Está conectado à Internet e permite APIs de terceiros? O navegador \"Brave\" ou o plugin \"uMatrix\" podem estar a bloqueá-los.",
"ccb": "sob a licença CC-BY",
From abebed35515653d96303d9a70355f38a1f982668 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sat, 23 Oct 2021 18:29:08 +0000
Subject: [PATCH 32/58] Translated using Weblate (German)
Currently translated at 100.0% (228 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/
---
langs/de.json | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/langs/de.json b/langs/de.json
index 214ae80e9e..bde085d103 100644
--- a/langs/de.json
+++ b/langs/de.json
@@ -10,7 +10,7 @@
"ccb": "unter der 'CC-BY-Lizenz'",
"uploadFailed": "Wir konnten Ihr Bild nicht hochladen. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.",
"respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.",
- "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!",
+ "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!",
"dontDelete": "Abbrechen",
"doDelete": "Bild entfernen",
"isDeleted": "Gelöscht"
@@ -24,7 +24,7 @@
"index": {
"#": "Dieser Text wird über die Thema-Auswahlschaltfläche gezeigt, wenn kein Thema geladen ist",
"title": "Willkommen bei MapComplete",
- "intro": "MapComplete ist eine OpenStreetMap-Anwendung, mit der Informationen zu einem bestimmten Thema angezeigt und angepasst werden können.",
+ "intro": "MapComplete ist eine OpenStreetMap-Anwendung, mit der Informationen zu Objekten eines bestimmten Themas angezeigt und angepasst werden können.",
"pickTheme": "Wähle unten ein Thema, um zu starten."
},
"general": {
@@ -106,7 +106,7 @@
"getStartedNewAccount": " oder ein neues Konto anlegen",
"noTagsSelected": "Keine Tags ausgewählt",
"customThemeIntro": "
Benutzerdefinierte Themes
Dies sind zuvor besuchte benutzergenerierte Themen.",
- "aboutMapcomplete": "
Über MapComplete
MapComplete ist ein OpenStreetMap-Editor, der jedem helfen soll, auf einfache Weise Informationen zu einem Einzelthema hinzuzufügen.
Nur Merkmale, die für ein einzelnes Thema relevant sind, werden mit einigen vordefinierten Fragen gezeigt, um die Dinge einfach und extrem benutzerfreundlich zu halten. Der Themen-Betreuer kann auch eine Sprache für die Schnittstelle wählen, Elemente deaktivieren oder sogar in eine andere Website ohne jegliches UI-Element einbetten.
Ein weiterer wichtiger Teil von MapComplete ist jedoch, immer den nächsten Schritt anzubietenum mehr über OpenStreetMap zu erfahren:
Ein iframe ohne UI-Elemente verlinkt zu einer Vollbildversion
Die Vollbildversion bietet Informationen über OpenStreetMap
Wenn Sie nicht eingeloggt sind, werden Sie gebeten, sich einzuloggen
Wenn Sie eine einzige Frage beantwortet haben, dürfen Sie Punkte hinzufügen
An einem bestimmten Punkt erscheinen die tatsächlich hinzugefügten Tags, die später mit dem Wiki verlinkt werden...
Fällt Ihnen ein Problem mit MapComplete auf? Haben Sie einen Feature-Wunsch? Wollen Sie beim Übersetzen helfen? Gehen Sie zum Quellcode oder zur Problemverfolgung.
",
+ "aboutMapcomplete": "
Über MapComplete
Mit MapComplete können Sie OpenStreetMap mit Informationen zu einem einzigen Thema anreichern. Beantworten Sie ein paar Fragen, und innerhalb von Minuten werden Ihre Beiträge rund um den Globus verfügbar sein! Der Themen-Maintainer definiert Elemente, Fragen und Sprachen für das Thema.
Mehr erfahren
MapComplete bietet immer den nächsten Schritt, um mehr über OpenStreetMap zu erfahren.
Wenn es in eine Website eingebettet wird, verlinkt der Iframe zu einer Vollbildversion von MapComplete
Die Vollbildversion bietet Informationen über OpenStreetMap
Das Betrachten funktioniert ohne Login, aber das Bearbeiten erfordert ein OSM-Login.
Wenn Sie nicht eingeloggt sind, werden Sie aufgefordert, sich anzumelden
Nach der Beantwortung einer einzelnen Frage können Sie der Karte neue Punkte hinzufügen
Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt sind
Haben Sie ein Problem bemerkt? Haben Sie einen Funktionswunsch? Möchten Sie bei der Übersetzung helfen? Besuchen Sie den Quellcode oder den Issue Tracker
Möchten Sie Ihren Fortschritt sehen? Verfolgen Sie die Anzahl der Änderungen auf OsmCha.
",
"backgroundMap": "Hintergrundkarte",
"layerSelection": {
"zoomInToSeeThisLayer": "Vergrößern, um diese Ebene zu sehen",
@@ -164,7 +164,8 @@
"downloadAsPdf": "PDF der aktuellen Karte herunterladen",
"downloadGeojson": "Sichtbare Daten als geojson herunterladen",
"includeMetaData": "Metadaten übernehmen (letzter Bearbeiter, berechnete Werte, ...)",
- "noDataLoaded": "Noch keine Daten geladen. Download ist in Kürze verfügbar"
+ "noDataLoaded": "Noch keine Daten geladen. Download ist in Kürze verfügbar",
+ "licenseInfo": "
Copyright-Hinweis
Die bereitgestellten Daten sind unter ODbL verfügbar. Die Wiederverwendung dieser Daten ist für jeden Zweck frei, aber
Jede Änderung dieser Daten muss unter der gleichen Lizenz veröffentlicht werden
Bitte lesen Sie den vollständigen Copyright-Hinweis für weitere Details"
},
"pdf": {
"versionInfo": "v{version} - erstellt am {date}"
From 38e1918dfa3407f85f1c80042ece79bd27057798 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sat, 23 Oct 2021 18:34:39 +0000
Subject: [PATCH 33/58] Translated using Weblate (German)
Currently translated at 77.0% (339 of 440 strings)
Translation: MapComplete/themes
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/de/
---
langs/themes/de.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/langs/themes/de.json b/langs/themes/de.json
index ed6ecf5169..cfefb4350a 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -633,7 +633,7 @@
"title": "Trinkwasser"
},
"etymology": {
- "description": "Auf dieser Karte können Sie sehen, nach was ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. Die Informationen stammen aus Wikipedia.",
+ "description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.
Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.",
"shortDescription": "Was ist der Ursprung eines Ortsnamens?",
"title": "Open Etymology Map"
},
@@ -1019,4 +1019,4 @@
"shortDescription": "Eine Karte mit Abfalleimern",
"title": "Abfalleimer"
}
-}
\ No newline at end of file
+}
From efe497be09a33789c97911cd5a80a9b03f7cdec8 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sat, 23 Oct 2021 18:30:07 +0000
Subject: [PATCH 34/58] Translated using Weblate (German)
Currently translated at 100.0% (29 of 29 strings)
Translation: MapComplete/shared-questions
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/shared-questions/de/
---
langs/shared-questions/de.json | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/langs/shared-questions/de.json b/langs/shared-questions/de.json
index 2baaebe377..cc6df974b8 100644
--- a/langs/shared-questions/de.json
+++ b/langs/shared-questions/de.json
@@ -78,6 +78,22 @@
}
},
"question": "Ist dieser Ort mit einem Rollstuhl zugänglich?"
+ },
+ "wikipedia": {
+ "mappings": {
+ "0": {
+ "then": "Es wurde noch keine Wikipedia-Seite verlinkt"
+ }
+ },
+ "question": "Was ist das entsprechende Wikidata Element?"
+ },
+ "wikipedialink": {
+ "mappings": {
+ "0": {
+ "then": "Nicht mit Wikipedia verknüpft"
+ }
+ },
+ "question": "Was ist der entsprechende Artikel auf Wikipedia?"
}
}
-}
\ No newline at end of file
+}
From 181ba5251435248f7f786cce48a80558634f5742 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sun, 24 Oct 2021 10:14:51 +0000
Subject: [PATCH 35/58] Translated using Weblate (German)
Currently translated at 100.0% (228 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/
---
langs/de.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/langs/de.json b/langs/de.json
index bde085d103..a5d13b49ca 100644
--- a/langs/de.json
+++ b/langs/de.json
@@ -73,7 +73,7 @@
"emailOf": "Wie lautet die E-Mail-Adresse der {category}?",
"emailIs": "Die E-Mail-Adresse dieser {category} lautet {email}"
},
- "openStreetMapIntro": "
Eine offene Karte
Wäre es nicht toll, wenn es eine offene Karte gäbe, die von jedem angepasst und benutzt werden könnte? Eine Karte, zu der jeder seine Interessen hinzufügen kann? Dann bräuchte man all diese Websites mit unterschiedlichen, kleinen und inkompatiblen Karten (die immer veraltet sind) nicht mehr.
OpenStreetMap ist diese offene Karte. Die Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Website basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.
Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram,... Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!
Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.
",
+ "openStreetMapIntro": "
Eine freie Karte
Wäre es nicht toll, wenn es eine freie Karte gäbe, die von jedem angepasst und genutzt werden könnte? Eine Karte, zu der jeder Informationen hinzufügen kann? Dann bräuchte man all diese Webseiten mit unterschiedlichen, eingeschränkten und veralteten Karten nicht mehr.
OpenStreetMap ist diese freie Karte. Alle Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Webseite basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.
Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram, ...<br/>Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!
Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.
",
"sharescreen": {
"intro": "
Diese Karte teilen
Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:",
"addToHomeScreen": "
Zum Startbildschirm hinzufügen
Sie können diese Website einfach zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der URL-Leiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.",
From bbcd1f5bee248fd5a74212719b1618901af30d56 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sun, 24 Oct 2021 08:28:51 +0000
Subject: [PATCH 36/58] Translated using Weblate (German)
Currently translated at 84.7% (373 of 440 strings)
Translation: MapComplete/themes
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/de/
---
langs/themes/de.json | 122 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 117 insertions(+), 5 deletions(-)
diff --git a/langs/themes/de.json b/langs/themes/de.json
index cfefb4350a..d94a860c96 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -635,7 +635,19 @@
"etymology": {
"description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.
Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.",
"shortDescription": "Was ist der Ursprung eines Ortsnamens?",
- "title": "Open Etymology Map"
+ "title": "Open Etymology Map",
+ "layers": {
+ "1": {
+ "override": {
+ "name": "Straßen ohne Informationen zur Namensherkunft"
+ }
+ },
+ "2": {
+ "override": {
+ "name": "Parks und Waldflächen ohne Informationen zur Namensherkunft"
+ }
+ }
+ }
},
"facadegardens": {
"layers": {
@@ -736,7 +748,7 @@
}
},
"ghostbikes": {
- "description": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap kennt. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
+ "description": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
"title": "Geisterrad"
},
"hackerspaces": {
@@ -925,6 +937,9 @@
"station-name": {
"question": "Wie lautet der Name dieser Feuerwache?"
}
+ },
+ "title": {
+ "render": "Feuerwache"
}
},
"3": {
@@ -937,7 +952,46 @@
}
},
"openwindpowermap": {
- "description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen."
+ "description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen.",
+ "layers": {
+ "0": {
+ "units": {
+ "0": {
+ "applicableUnits": {
+ "0": {
+ "human": " Megawatt"
+ },
+ "1": {
+ "human": " Kilowatt"
+ },
+ "2": {
+ "human": " Watt"
+ },
+ "3": {
+ "human": " Gigawatt"
+ }
+ }
+ },
+ "1": {
+ "applicableUnits": {
+ "0": {
+ "human": " Meter"
+ }
+ }
+ }
+ },
+ "title": {
+ "render": "Windrad"
+ },
+ "name": "Windrad",
+ "presets": {
+ "0": {
+ "title": "Windrad"
+ }
+ }
+ }
+ },
+ "title": "OpenWindPowerMap"
},
"personal": {
"description": "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen",
@@ -955,9 +1009,41 @@
}
}
}
+ },
+ "title": {
+ "render": "Poststelle"
+ },
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "Aktuell geöffnet"
+ }
+ }
+ }
+ },
+ "name": "Poststellen",
+ "presets": {
+ "0": {
+ "title": "Poststelle"
+ }
}
+ },
+ "0": {
+ "name": "Brieflästen",
+ "presets": {
+ "0": {
+ "title": "Briefkasten"
+ }
+ },
+ "title": {
+ "render": "Briefkasten"
+ },
+ "description": "Die Ebene zeigt Briefkästen."
}
- }
+ },
+ "shortDescription": "Eine Karte die Briefkästen und Poststellen anzeigt",
+ "title": "Karte mit Briefkästen und Poststellen"
},
"shops": {
"shortDescription": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen",
@@ -1012,11 +1098,37 @@
}
},
"shortDescription": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen",
- "title": "Adressen in Großbritannien"
+ "title": "Adressen in Großbritannien",
+ "tileLayerSources": {
+ "0": {
+ "name": "Grenzverläufe gemäß osmuk.org"
+ }
+ }
},
"waste_basket": {
"description": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen",
"shortDescription": "Eine Karte mit Abfalleimern",
"title": "Abfalleimer"
+ },
+ "maps": {
+ "title": "Eine Karte der Karten"
+ },
+ "playgrounds": {
+ "title": "Spielpläzte",
+ "shortDescription": "Eine Karte mit Spielplätzen"
+ },
+ "parkings": {
+ "title": "Parken",
+ "shortDescription": "Diese Karte zeigt Parkplätze",
+ "description": "Diese Karte zeigt Parkplätze"
+ },
+ "natuurpunt": {
+ "title": "Naturschutzgebiete",
+ "shortDescription": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt"
+ },
+ "observation_towers": {
+ "title": "Beobachtungstürme",
+ "description": "Öffentlich zugänglicher Aussichtsturm",
+ "shortDescription": "Öffentlich zugänglicher Aussichtsturm"
}
}
From 51caa24a716b0ddcddf783a431837c72c8e44afe Mon Sep 17 00:00:00 2001
From: kjon
Date: Sun, 24 Oct 2021 10:18:02 +0000
Subject: [PATCH 37/58] Translated using Weblate (German)
Currently translated at 100.0% (228 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/
---
langs/de.json | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/langs/de.json b/langs/de.json
index a5d13b49ca..ae55b7bccd 100644
--- a/langs/de.json
+++ b/langs/de.json
@@ -17,7 +17,7 @@
},
"centerMessage": {
"loadingData": "Daten werden geladen…",
- "zoomIn": "Vergrößern, um die Daten anzuzeigen oder zu bearbeiten",
+ "zoomIn": "Ausschnitt vergrößern, um Daten anzuzeigen oder zu bearbeiten",
"ready": "Erledigt!",
"retrying": "Laden von Daten fehlgeschlagen. Erneuter Versuch in {count} Sekunden …"
},
@@ -28,7 +28,7 @@
"pickTheme": "Wähle unten ein Thema, um zu starten."
},
"general": {
- "loginWithOpenStreetMap": "Anmeldung mit OpenStreetMap",
+ "loginWithOpenStreetMap": "Bei OpenStreetMap anmelden",
"welcomeBack": "Sie sind eingeloggt, willkommen zurück!",
"loginToStart": "Anmelden, um diese Frage zu beantworten",
"search": {
@@ -61,7 +61,7 @@
"disableFiltersExplanation": "Einige Elemente können durch einen Filter ausgeblendet sein",
"disableFilters": "Alle Filter deaktivieren"
},
- "pickLanguage": "Wählen Sie eine Sprache: ",
+ "pickLanguage": "Sprache wählen: ",
"about": "OpenStreetMap für ein bestimmtes Thema einfach bearbeiten und hinzufügen",
"nameInlineQuestion": "Der Name dieser {category} ist $$$",
"noNameCategory": "{category} ohne Namen",
@@ -76,7 +76,7 @@
"openStreetMapIntro": "
Eine freie Karte
Wäre es nicht toll, wenn es eine freie Karte gäbe, die von jedem angepasst und genutzt werden könnte? Eine Karte, zu der jeder Informationen hinzufügen kann? Dann bräuchte man all diese Webseiten mit unterschiedlichen, eingeschränkten und veralteten Karten nicht mehr.
OpenStreetMap ist diese freie Karte. Alle Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Webseite basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.
Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram, ...<br/>Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!
Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.
",
"sharescreen": {
"intro": "
Diese Karte teilen
Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:",
- "addToHomeScreen": "
Zum Startbildschirm hinzufügen
Sie können diese Website einfach zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der URL-Leiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.",
+ "addToHomeScreen": "
Zum Startbildschirm hinzufügen
Sie können diese Webseite zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der Adressleiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.",
"embedIntro": "
Auf Ihrer Website einbetten
Bitte betten Sie diese Karte in Ihre Webseite ein. Wir ermutigen Sie, es zu tun - Sie müssen nicht einmal um Erlaubnis fragen. Es ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie.",
"copiedToClipboard": "Link in die Zwischenablage kopiert",
"thanksForSharing": "Danke für das Teilen!",
@@ -109,7 +109,7 @@
"aboutMapcomplete": "
Über MapComplete
Mit MapComplete können Sie OpenStreetMap mit Informationen zu einem einzigen Thema anreichern. Beantworten Sie ein paar Fragen, und innerhalb von Minuten werden Ihre Beiträge rund um den Globus verfügbar sein! Der Themen-Maintainer definiert Elemente, Fragen und Sprachen für das Thema.
Mehr erfahren
MapComplete bietet immer den nächsten Schritt, um mehr über OpenStreetMap zu erfahren.
Wenn es in eine Website eingebettet wird, verlinkt der Iframe zu einer Vollbildversion von MapComplete
Die Vollbildversion bietet Informationen über OpenStreetMap
Das Betrachten funktioniert ohne Login, aber das Bearbeiten erfordert ein OSM-Login.
Wenn Sie nicht eingeloggt sind, werden Sie aufgefordert, sich anzumelden
Nach der Beantwortung einer einzelnen Frage können Sie der Karte neue Punkte hinzufügen
Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt sind
Haben Sie ein Problem bemerkt? Haben Sie einen Funktionswunsch? Möchten Sie bei der Übersetzung helfen? Besuchen Sie den Quellcode oder den Issue Tracker
Möchten Sie Ihren Fortschritt sehen? Verfolgen Sie die Anzahl der Änderungen auf OsmCha.
",
"backgroundMap": "Hintergrundkarte",
"layerSelection": {
- "zoomInToSeeThisLayer": "Vergrößern, um diese Ebene zu sehen",
+ "zoomInToSeeThisLayer": "Ausschnitt vergrößern, um diese Ebene anzuzeigen",
"title": "Ebenen auswählen"
},
"weekdays": {
@@ -170,7 +170,7 @@
"pdf": {
"versionInfo": "v{version} - erstellt am {date}"
},
- "loginOnlyNeededToEdit": "wenn du die Karte bearbeiten willst"
+ "loginOnlyNeededToEdit": "zum Bearbeiten der Karte"
},
"favourite": {
"panelIntro": "
Ihr persönliches Thema
Aktivieren Sie Ihre Lieblingsebenen aus allen offiziellen Themen",
From 45c22ea8324c6ebb0e4f0ed9955463b3fe7d0f3e Mon Sep 17 00:00:00 2001
From: kjon
Date: Sun, 24 Oct 2021 12:19:04 +0000
Subject: [PATCH 38/58] Translated using Weblate (German)
Currently translated at 85.6% (377 of 440 strings)
Translation: MapComplete/themes
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/de/
---
langs/themes/de.json | 28 ++++++++++++++++++++--------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/langs/themes/de.json b/langs/themes/de.json
index d94a860c96..105fdb9fc5 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -334,6 +334,18 @@
},
"question": "Wie heißt diese Kletterroute?",
"render": "{name}"
+ },
+ "Bolts": {
+ "render": "Diese Kletterroute hat {climbing:bolts} Haken",
+ "question": "Wie viele Haken gibt es auf dieser Kletterroute bevor der Umlenker bzw. Standhaken erreicht ist?",
+ "mappings": {
+ "1": {
+ "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
+ },
+ "0": {
+ "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
+ }
+ }
}
},
"title": {
@@ -625,12 +637,12 @@
"title": "Fahrradstraßen"
},
"cyclofix": {
- "description": "Das Ziel dieser Karte ist es, den Radfahrern eine einfach zu benutzende Lösung zu präsentieren, um die geeignete Infrastruktur für ihre Bedürfnisse zu finden.
Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.
Alle Änderungen, die Sie vornehmen, werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei wiederverwendet werden.
Weitere Informationen über das Projekt Cyclofix finden Sie unter cyclofix.osm.be.",
- "title": "Cyclofix - eine offene Karte für Radfahrer"
+ "description": "Mit dieser Karte soll Radfahrern eine einfache Lösung bereitgestellt werden, um die passende Farradinfrastruktur zu finden.
Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.
Ihre Änderungen, werden automatisch in der Datenbank von OpenStreetMap gespeichert und können von anderen frei verwendet werden.
Weitere Informationen über Cyclofix finden Sie unter cyclofix.osm.be.",
+ "title": "Cyclofix - eine freie Karte für Radfahrer"
},
"drinking_water": {
- "description": "Auf dieser Karte sind öffentlich zugängliche Trinkwasserstellen eingezeichnet und können leicht hinzugefügt werden",
- "title": "Trinkwasser"
+ "description": "Eine Karte zum Anzeigen und Bearbeiten öffentlicher Trinkwasserstellen",
+ "title": "Trinkwasserstelle"
},
"etymology": {
"description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.
Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.",
@@ -749,7 +761,7 @@
},
"ghostbikes": {
"description": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
- "title": "Geisterrad"
+ "title": "Geisterräder"
},
"hackerspaces": {
"description": "Auf dieser Karte können Sie Hackerspaces sehen, einen neuen Hackerspace hinzufügen oder Daten direkt aktualisieren",
@@ -1060,8 +1072,8 @@
"title": "Überwachung unter Überwachung"
},
"toilets": {
- "description": "Eine Karte der öffentlichen Toiletten",
- "title": "Offene Toilette Karte"
+ "description": "Eine Karte mit öffentlich zugänglichen Toiletten",
+ "title": "Freie Toilettenkarte"
},
"trees": {
"description": "Kartieren Sie alle Bäume!",
@@ -1127,7 +1139,7 @@
"shortDescription": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt"
},
"observation_towers": {
- "title": "Beobachtungstürme",
+ "title": "Aussichtstürme",
"description": "Öffentlich zugänglicher Aussichtsturm",
"shortDescription": "Öffentlich zugänglicher Aussichtsturm"
}
From e25b5e42f963271905bc1143a9a5616388f00d5f Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 13:53:46 +0200
Subject: [PATCH 39/58] Clustering tweak
---
Models/Constants.ts | 2 +-
assets/themes/etymology.json | 6 +++++-
assets/welcome_message.json | 8 ++++----
3 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/Models/Constants.ts b/Models/Constants.ts
index ec2b8dcb8c..15f6e94f9d 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.11.0";
+ public static vNumber = "0.11.1";
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/assets/themes/etymology.json b/assets/themes/etymology.json
index 375cf5bf51..f342e2e2b5 100644
--- a/assets/themes/etymology.json
+++ b/assets/themes/etymology.json
@@ -28,6 +28,10 @@
"startZoom": 1,
"widenFactor": 2,
"socialImage": "",
+ "clustering": {
+ "maxZoom": 14,
+ "minNeededElements": 250
+ },
"layers": [
"etymology",
{
@@ -75,5 +79,5 @@
}
}
],
- "hideFromOverview": true
+ "hideFromOverview": false
}
\ No newline at end of file
diff --git a/assets/welcome_message.json b/assets/welcome_message.json
index db78072220..d2a3fc2577 100644
--- a/assets/welcome_message.json
+++ b/assets/welcome_message.json
@@ -7,13 +7,13 @@
},
{
"start_date": "2022-04-11",
- "end_date": "2022-04-17",
+ "end_date": "2022-04-18",
"message": "The 15th of april is World Art Day - the ideal moment to go out, enjoy some artwork and add missing artwork to the map. And of course, you can snap some pictures",
"featured_theme": "artwork"
},
{
"start_date": "2022-03-24",
- "end_date": "2022-01-30",
+ "end_date": "2022-03-31",
"message": "The 22nd of March is World Water Day. Time to go out and find all the public drinking water spots!",
"featured_theme": "drinking_water"
},
@@ -40,13 +40,13 @@
},
{
"start_date": "2021-10-25",
- "end_date": "2021-10-31",
+ "end_date": "2021-11-01",
"message": "Did you know you could link OpenStreetMap with Wikidata? With name:etymology:wikidata, it is even possible to link to whom or what a feature is named after. Quite some volunteers have done this - because it is interesting or for the Equal Street Names-project. For this, a new theme has been created which shows the Wikipedia page and Wikimedia-images of this tag and which makes it easy to link them both with the search box. Give it a try!",
"featured_theme": "etymology"
},
{
"start_date": "2021-10-17",
- "end_date": "2021-10-24",
+ "end_date": "2021-10-25",
"message": "
Hi all!
Thanks for using MapComplete. It has been quite a ride since it's inception, a bit over a year ago. MapComplete has grown significantly recently, which you can read more about on in my diary entry.
Furthermore, NicoleLaine made a really cool new theme about postboxes, so make sure to check it out!
",
"featured_theme": "postboxes"
}
From 084d22928b8bd43facaf54436123bf581f79c98c Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 14:02:32 +0200
Subject: [PATCH 40/58] undefined robustness
---
UI/Wikipedia/WikidataPreviewBox.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/UI/Wikipedia/WikidataPreviewBox.ts b/UI/Wikipedia/WikidataPreviewBox.ts
index 9358f3a830..1d7595e6d0 100644
--- a/UI/Wikipedia/WikidataPreviewBox.ts
+++ b/UI/Wikipedia/WikidataPreviewBox.ts
@@ -122,13 +122,13 @@ export default class WikidataPreviewBox extends VariableUiElement {
const els : BaseUIElement[] = []
for (const extraProperty of WikidataPreviewBox.extraProperties) {
- let hasAllRequirements =true
+ let hasAllRequirements = true
for (const requirement of extraProperty.requires) {
- if(!wikidata.claims.has("P"+requirement.p)){
+ if(!wikidata.claims?.has("P"+requirement.p)){
hasAllRequirements = false;
break
}
- if(!wikidata.claims.get("P"+requirement.p).has("Q"+requirement.q)){
+ if(!wikidata.claims?.get("P"+requirement.p).has("Q"+requirement.q)){
hasAllRequirements = false;
break
}
From 9a85df94069b2ef19f94bf2e21e8854a0fe4bca4 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sat, 23 Oct 2021 18:39:41 +0000
Subject: [PATCH 41/58] Translated using Weblate (German)
Currently translated at 77.9% (961 of 1233 strings)
Translation: MapComplete/Layer translations
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layer-translations/de/
---
langs/layers/de.json | 446 +++++++++++++++++++++++++++++++++++++++----
1 file changed, 410 insertions(+), 36 deletions(-)
diff --git a/langs/layers/de.json b/langs/layers/de.json
index 1072f2c7ae..8c995a73c6 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -947,6 +947,12 @@
"options": {
"0": {
"question": "Alle Anschlüsse"
+ },
+ "7": {
+ "question": "Hat einen
Tesla Supercharger
Stecker"
+ },
+ "3": {
+ "question": "Hat einen
Chademo
Stecker"
}
}
}
@@ -1153,16 +1159,45 @@
"then": "Nutzung kostenlos"
}
},
- "render": "Die Nutzung dieser Ladestation kostet {charge}"
+ "render": "Die Nutzung dieser Ladestation kostet {charge}",
+ "question": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?"
},
"maxstay": {
- "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}"
+ "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}",
+ "question": "Was ist die Höchstdauer des Aufenthalts hier?",
+ "mappings": {
+ "0": {
+ "then": "Keine Höchstparkdauer"
+ }
+ }
},
"ref": {
- "render": "Die Kennziffer ist {ref}"
+ "render": "Die Kennziffer ist {ref}",
+ "question": "Wie lautet die Kennung dieser Ladestation?"
},
"website": {
- "render": "Weitere Informationen auf {website}"
+ "render": "Weitere Informationen auf {website}",
+ "question": "Wie ist die Webseite des Betreibers?"
+ },
+ "payment-options": {
+ "override": {
+ "mappings+": {
+ "0": {
+ "then": "Bezahlung mit einer speziellen App"
+ },
+ "1": {
+ "then": "Bezahlung mit einer Mitgliedskarte"
+ }
+ }
+ }
+ },
+ "email": {
+ "question": "Wie ist die Email-Adresse des Betreibers?",
+ "render": "Bei Problemen senden Sie eine E-Mail an {email}"
+ },
+ "phone": {
+ "render": "Bei Problemen, anrufen unter {phone}",
+ "question": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?"
}
},
"title": {
@@ -1264,6 +1299,53 @@
}
},
"question": "Was ist das für eine Kreuzung?"
+ },
+ "crossing-continue-through-red": {
+ "mappings": {
+ "0": {
+ "then": "Ein Radfahrer kann bei roter Ampel geradeaus fahren "
+ },
+ "1": {
+ "then": "Ein Radfahrer kann bei roter Ampel geradeaus fahren"
+ },
+ "2": {
+ "then": "Ein Radfahrer kann bei roter Ampel nicht geradeaus fahren"
+ }
+ },
+ "question": "Kann ein Radfahrer bei roter Ampel geradeaus fahren?"
+ },
+ "crossing-has-island": {
+ "mappings": {
+ "0": {
+ "then": "Der Übergang hat eine Verkehrsinsel"
+ },
+ "1": {
+ "then": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern"
+ }
+ },
+ "question": "Gibt es an diesem Übergang eine Verkehrsinsel?"
+ },
+ "crossing-right-turn-through-red": {
+ "mappings": {
+ "1": {
+ "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen"
+ },
+ "2": {
+ "then": "Ein Radfahrer kann bei roter Ampel nicht rechts abbiegen"
+ },
+ "0": {
+ "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen "
+ }
+ },
+ "question": "Kann ein Radfahrer bei roter Ampel rechts abbiegen?"
+ },
+ "crossing-button": {
+ "question": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?",
+ "mappings": {
+ "1": {
+ "then": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern."
+ }
+ }
}
},
"title": {
@@ -1291,6 +1373,15 @@
},
"5": {
"then": "Es gibt keinen Radweg"
+ },
+ "2": {
+ "then": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist."
+ },
+ "1": {
+ "then": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)"
+ },
+ "0": {
+ "then": "Es gibt eine geteilte Fahrspur"
}
},
"question": "Was für ein Radweg ist hier?"
@@ -1308,6 +1399,18 @@
},
"7": {
"then": "Unpassierbar / Keine bereiften Fahrzeuge"
+ },
+ "2": {
+ "then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
+ },
+ "3": {
+ "then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
+ },
+ "5": {
+ "then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
+ },
+ "4": {
+ "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
}
},
"question": "Wie eben ist dieser Radweg?"
@@ -1340,9 +1443,22 @@
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
+ },
+ "5": {
+ "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
+ },
+ "3": {
+ "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
+ },
+ "7": {
+ "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
+ },
+ "6": {
+ "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
}
},
- "render": "Der Radweg ist aus {cycleway:surface}"
+ "render": "Der Radweg ist aus {cycleway:surface}",
+ "question": "Was ist der Belag dieses Radwegs?"
},
"Is this a cyclestreet? (For a road)": {
"mappings": {
@@ -1351,6 +1467,9 @@
},
"2": {
"then": "Dies ist keine Fahrradstraße."
+ },
+ "0": {
+ "then": "Dies ist eine Fahrradstraße in einer 30km/h Zone."
}
},
"question": "Ist das eine Fahrradstraße"
@@ -1372,7 +1491,9 @@
"4": {
"then": "Die Höchstgeschwindigkeit ist 90 km/h"
}
- }
+ },
+ "render": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h",
+ "question": "Was ist die Höchstgeschwindigkeit auf dieser Straße?"
},
"Surface of the road": {
"mappings": {
@@ -1399,9 +1520,25 @@
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
+ },
+ "3": {
+ "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
+ },
+ "0": {
+ "then": "Dieser Radweg ist nicht befestigt"
+ },
+ "6": {
+ "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
+ },
+ "7": {
+ "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
+ },
+ "5": {
+ "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
}
},
- "render": "Der Radweg ist aus {surface}"
+ "render": "Der Radweg ist aus {surface}",
+ "question": "Was ist der Belag dieser Straße?"
},
"Surface of the street": {
"mappings": {
@@ -1416,6 +1553,18 @@
},
"7": {
"then": "Unpassierbar / Keine bereiften Fahrzeuge"
+ },
+ "4": {
+ "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
+ },
+ "2": {
+ "then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
+ },
+ "3": {
+ "then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
+ },
+ "5": {
+ "then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
}
},
"question": "Wie eben ist diese Straße?"
@@ -1424,8 +1573,18 @@
"mappings": {
"3": {
"then": "Dieser Radweg ist getrennt durch einen Bordstein"
+ },
+ "0": {
+ "then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
+ },
+ "1": {
+ "then": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie"
+ },
+ "2": {
+ "then": "Der Radweg ist abgegrenzt durch eine Parkspur"
}
- }
+ },
+ "question": "Wie ist der Radweg von der Straße abgegrenzt?"
},
"cycleway-lane-track-traffic-signs": {
"mappings": {
@@ -1440,6 +1599,9 @@
},
"4": {
"then": "Kein Verkehrsschild vorhanden"
+ },
+ "1": {
+ "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
}
},
"question": "Welches Verkehrszeichen hat dieser Radweg?"
@@ -1448,8 +1610,18 @@
"mappings": {
"3": {
"then": "Dieser Radweg ist getrennt durch einen Bordstein"
+ },
+ "0": {
+ "then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
+ },
+ "1": {
+ "then": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie"
+ },
+ "2": {
+ "then": "Der Radweg ist abgegrenzt durch eine Parkspur"
}
- }
+ },
+ "question": "Wie ist der Radweg von der Straße abgegrenzt?"
},
"cycleway-traffic-signs": {
"mappings": {
@@ -1464,6 +1636,9 @@
},
"4": {
"then": "Kein Verkehrsschild vorhanden"
+ },
+ "1": {
+ "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
}
},
"question": "Welches Verkehrszeichen hat dieser Radweg?"
@@ -1495,9 +1670,16 @@
},
"3": {
"then": "Diese Straße ist durchgehend beleuchtet"
+ },
+ "0": {
+ "then": "Diese Straße ist beleuchtet"
}
},
"question": "Ist diese Straße beleuchtet?"
+ },
+ "cycleways_and_roads-cycleway:buffer": {
+ "question": "Wie breit ist der Abstand zwischen Radweg und Straße?",
+ "render": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m"
}
},
"title": {
@@ -1563,7 +1745,8 @@
"then": "Dies ist ein normaler automatischer Defibrillator"
}
},
- "render": "Es gibt keine Informationen über den Gerätetyp"
+ "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)",
@@ -1648,10 +1831,10 @@
"name": "Visualisierung der Richtung"
},
"drinking_water": {
- "name": "Trinkwasser",
+ "name": "Trinkwasserstelle",
"presets": {
"0": {
- "title": "trinkwasser"
+ "title": "Trinkwasserstelle"
}
},
"tagRenderings": {
@@ -1673,24 +1856,37 @@
},
"2": {
"then": "Diese Trinkwasserstelle wurde geschlossen"
+ },
+ "0": {
+ "then": "Diese Trinkwasserstelle funktioniert"
}
},
"question": "Ist diese Trinkwasserstelle noch in Betrieb?",
"render": "Der Betriebsstatus ist {operational_status"
},
"render-closest-drinking-water": {
- "render": "Ein weiterer Trinkwasserbrunnen befindet sich in {_closest_other_drinking_water_distance} Meter"
+ "render": "Eine weitere Trinkwasserstelle liegt {_closest_other_drinking_water_distance} Meter entfernt"
}
},
"title": {
- "render": "Trinkwasser"
+ "render": "Trinkwasserstelle"
}
},
"etymology": {
"description": "Alle Objekte, die eine bekannte Namensherkunft haben",
"tagRenderings": {
"simple etymology": {
- "render": "Benannt nach {name:etymology}"
+ "render": "Benannt nach {name:etymology}",
+ "question": "Wonach ist dieses Objekt benannt? Das könnte auf einem Straßenschild stehen",
+ "mappings": {
+ "0": {
+ "then": "Der Ursprung dieses Namens ist in der gesamten Literatur unbekannt"
+ }
+ }
+ },
+ "wikipedia-etymology": {
+ "question": "Was ist das Wikidata-Element, nach dem dieses Objekt benannt ist?",
+ "render": "
Wikipedia Artikel zur Namensherkunft
{wikipedia(name:etymology:wikidata):max-height:20rem}"
}
}
},
@@ -1709,11 +1905,26 @@
"question": "Bietet vegan Speisen an"
}
}
+ },
+ "3": {
+ "options": {
+ "0": {
+ "question": "Hat halal Speisen"
+ }
+ }
+ },
+ "1": {
+ "options": {
+ "0": {
+ "question": "Hat vegetarische Speisen"
+ }
+ }
}
},
"presets": {
"0": {
- "title": "Restaurant"
+ "title": "Restaurant",
+ "description": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden"
},
"1": {
"title": "Schnellimbiss"
@@ -1727,6 +1938,12 @@
"mappings": {
"2": {
"then": "Bietet vorwiegend Pastagerichte an"
+ },
+ "0": {
+ "then": "Dies ist eine Pizzeria"
+ },
+ "1": {
+ "then": "Dies ist eine Pommesbude"
}
},
"question": "Welches Essen gibt es hier?",
@@ -1767,7 +1984,19 @@
"3": {
"then": "Es gibt ausschließlich halal Speisen"
}
- }
+ },
+ "question": "Gibt es im das Restaurant halal Speisen?"
+ },
+ "Vegetarian (no friture)": {
+ "question": "Gibt es im das Restaurant vegetarische Speisen?"
+ },
+ "friture-take-your-container": {
+ "mappings": {
+ "0": {
+ "then": "Sie können ihre eigenen Behälter mitbringen, um Ihre Bestellung zu erhalten, was Einwegverpackungsmaterial und damit Abfall spart"
+ }
+ },
+ "question": "Wenn Sie Ihr eigenes Behältnis mitbringen (z. B. einen Kochtopf und kleine Töpfe), wird es dann zum Verpacken Ihrer Bestellung verwendet? "
}
},
"title": {
@@ -1779,10 +2008,11 @@
"then": "Schnellrestaurant{name}"
}
}
- }
+ },
+ "name": "Restaurants und Fast Food"
},
"ghost_bike": {
- "name": "Geisterrad",
+ "name": "Geisterräder",
"presets": {
"0": {
"title": "Geisterrad"
@@ -1790,7 +2020,7 @@
},
"tagRenderings": {
"ghost-bike-explanation": {
- "render": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt wird."
+ "render": "Ein Geisterrad ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde."
},
"ghost_bike-inscription": {
"question": "Wie lautet die Inschrift auf diesem Geisterrad?",
@@ -1810,7 +2040,8 @@
"render": "Mehr Informationen"
},
"ghost_bike-start_date": {
- "question": "Wann wurde dieses Geisterrad aufgestellt?"
+ "question": "Wann wurde dieses Geisterrad aufgestellt?",
+ "render": "Aufgestellt am {start_date}"
}
},
"title": {
@@ -1901,12 +2132,18 @@
},
"phone": {
"render": "{phone}"
+ },
+ "Curator": {
+ "question": "Wer ist der Verwalter dieses Naturschutzgebietes? Respektieren Sie die Privatsphäre - geben Sie nur dann einen Namen an, wenn dieser allgemein bekannt ist"
+ },
+ "Surface area": {
+ "render": "Grundfläche: {_surface:ha}ha"
}
}
},
"observation_tower": {
- "description": "Türme mit Panoramablick",
- "name": "Beobachtungstürme",
+ "description": "Türme zur Aussicht auf die umgebende Landschaft",
+ "name": "Aussichtstürme",
"presets": {
"0": {
"title": "Beobachtungsturm"
@@ -1919,7 +2156,8 @@
"then": "Eintritt kostenlos"
}
},
- "render": "Der Besuch des Turms kostet {charge}"
+ "render": "Der Besuch des Turms kostet {charge}",
+ "question": "Was kostet der Zugang zu diesem Turm?"
},
"Height": {
"question": "Wie hoch ist dieser Turm?",
@@ -2042,10 +2280,12 @@
"question": "Ist dieser Spielplatz nachts beleuchtet?"
},
"playground-max_age": {
- "render": "Zugang nur für Kinder bis maximal {max_age}"
+ "render": "Zugang nur für Kinder bis maximal {max_age}",
+ "question": "Bis zu welchem Alter dürfen Kinder auf diesem Spielplatz spielen?"
},
"playground-min_age": {
- "render": "Zugang nur für Kinder ab {min_age} Jahren"
+ "render": "Zugang nur für Kinder ab {min_age} Jahren",
+ "question": "Ab welchem Alter dürfen Kinder auf diesem Spielplatz spielen?"
},
"playground-opening_hours": {
"mappings": {
@@ -2066,7 +2306,8 @@
"render": "Betrieben von {operator}"
},
"playground-phone": {
- "render": "{phone}"
+ "render": "{phone}",
+ "question": "Wie lautet die Telefonnummer vom Betreiber des Spielplatzes?"
},
"playground-surface": {
"mappings": {
@@ -2224,12 +2465,14 @@
"shops": {
"presets": {
"0": {
- "description": "Ein neues Geschäft hinzufügen"
+ "description": "Ein neues Geschäft hinzufügen",
+ "title": "Geschäft"
}
},
"tagRenderings": {
"shops-phone": {
- "render": "{phone}"
+ "render": "{phone}",
+ "question": "Wie ist die Telefonnummer?"
},
"shops-shop": {
"mappings": {
@@ -2261,6 +2504,15 @@
"shops-website": {
"question": "Wie lautet die Webseite dieses Geschäfts?",
"render": "{website}"
+ },
+ "shops-opening_hours": {
+ "question": "Wie sind die Öffnungszeiten dieses Geschäfts?"
+ },
+ "shops-email": {
+ "question": "Wie ist die Email-Adresse dieses Geschäfts?"
+ },
+ "shops-name": {
+ "question": "Wie ist der Name dieses Geschäfts?"
}
},
"title": {
@@ -2273,7 +2525,9 @@
}
},
"render": "Geschäft"
- }
+ },
+ "name": "Geschäft",
+ "description": "Ein Geschäft"
},
"slow_roads": {
"tagRenderings": {
@@ -2330,6 +2584,9 @@
},
"3": {
"then": "Privat - kein öffentlicher Zugang"
+ },
+ "1": {
+ "then": "Eingeschränkter Zugang (z. B. nur mit Termin, zu bestimmten Zeiten, ...)"
}
},
"question": "Ist dieser Sportplatz öffentlich zugänglich?"
@@ -2338,8 +2595,18 @@
"mappings": {
"3": {
"then": "Termine nach Vereinbarung nicht möglich"
+ },
+ "0": {
+ "then": "Für die Nutzung des Sportplatzes ist eine Voranmeldung erforderlich"
+ },
+ "1": {
+ "then": "Für die Nutzung des Sportplatzes wird eine Voranmeldung empfohlen"
+ },
+ "2": {
+ "then": "Eine Voranmeldung ist möglich, aber nicht notwendig, um diesen Sportplatz zu nutzen"
}
- }
+ },
+ "question": "Muss man einen Termin vereinbaren, um diesen Sportplatz zu benutzen?"
},
"sport_pitch-opening_hours": {
"mappings": {
@@ -2391,7 +2658,14 @@
"then": "Die Oberfläche ist Beton"
}
},
- "render": "Die Oberfläche ist {surface}"
+ "render": "Die Oberfläche ist {surface}",
+ "question": "Was ist die Oberfläche dieses Sportplatzes?"
+ },
+ "sport_pitch-email": {
+ "question": "Wie ist die Email-Adresse des Betreibers?"
+ },
+ "sport_pitch-phone": {
+ "question": "Wie ist die Telefonnummer des Betreibers?"
}
},
"title": {
@@ -2426,7 +2700,8 @@
"2": {
"then": "Diese Kamera ist möglicherweise im Freien"
}
- }
+ },
+ "question": "Handelt es sich bei dem von dieser Kamera überwachten öffentlichen Raum um einen Innen- oder Außenbereich?"
},
"Level": {
"question": "Auf welcher Ebene befindet sich diese Kamera?",
@@ -2462,7 +2737,32 @@
},
"camera:mount": {
"question": "Wie ist diese Kamera montiert?",
- "render": "Montageart: {mount}"
+ "render": "Montageart: {mount}",
+ "mappings": {
+ "0": {
+ "then": "Diese Kamera ist an einer Wand montiert"
+ },
+ "1": {
+ "then": "Diese Kamera ist an einer Stange montiert"
+ },
+ "2": {
+ "then": "Diese Kamera ist an der Decke montiert"
+ }
+ }
+ },
+ "Surveillance type: public, outdoor, indoor": {
+ "question": "Um was für eine Überwachungskamera handelt es sich",
+ "mappings": {
+ "2": {
+ "then": "Ein privater Innenbereich wird überwacht, z. B. ein Geschäft, eine private Tiefgarage, ..."
+ },
+ "1": {
+ "then": "Ein privater Außenbereich wird überwacht (z. B. ein Parkplatz, eine Tankstelle, ein Innenhof, ein Eingang, eine private Einfahrt, ...)"
+ }
+ }
+ },
+ "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?"
}
},
"title": {
@@ -2597,6 +2897,25 @@
}
},
"question": "Gibt es eine Toilette für Rollstuhlfahrer?"
+ },
+ "toilet-has-paper": {
+ "question": "Muss man für diese Toilette sein eigenes Toilettenpapier mitbringen?",
+ "mappings": {
+ "1": {
+ "then": "Für diese Toilette müssen Sie Ihr eigenes Toilettenpapier mitbringen"
+ }
+ }
+ },
+ "toilet-handwashing": {
+ "question": "Verfügt diese Toilette über ein Waschbecken?",
+ "mappings": {
+ "0": {
+ "then": "Diese Toilette verfügt über ein Waschbecken"
+ },
+ "1": {
+ "then": "Diese Toilette verfügt über kein Waschbecken"
+ }
+ }
}
},
"title": {
@@ -2651,6 +2970,9 @@
"mappings": {
"1": {
"then": "immergrüner Baum."
+ },
+ "0": {
+ "then": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter."
}
},
"question": "Ist dies ein Nadelbaum oder ein Laubbaum?"
@@ -2667,6 +2989,12 @@
"mappings": {
"3": {
"then": "Nicht als Denkmal registriert"
+ },
+ "0": {
+ "then": " Als Denkmal registriert von der Onroerend Erfgoed Flandern"
+ },
+ "1": {
+ "then": "Als Denkmal registriert von der Direction du Patrimoine culturel Brüssel"
}
},
"question": "Ist dieser Baum ein Naturdenkmal?"
@@ -2682,7 +3010,8 @@
"2": {
"then": " Dauerhaft blattlos"
}
- }
+ },
+ "question": "Ist dies ein Laub- oder Nadelbaum?"
},
"tree_node-name": {
"mappings": {
@@ -2692,6 +3021,35 @@
},
"question": "Hat der Baum einen Namen?",
"render": "Name: {name}"
+ },
+ "tree_node-ref:OnroerendErfgoed": {
+ "question": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?"
+ },
+ "tree_node-wikidata": {
+ "question": "Was ist das passende Wikidata Element zu diesem Baum?"
+ },
+ "tree-denotation": {
+ "mappings": {
+ "5": {
+ "then": "Dieser Baum steht entlang einer Straße."
+ },
+ "7": {
+ "then": "Dieser Baum steht außerhalb eines städtischen Gebiets."
+ },
+ "2": {
+ "then": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage."
+ },
+ "3": {
+ "then": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)."
+ },
+ "0": {
+ "then": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung."
+ },
+ "1": {
+ "then": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört."
+ }
+ },
+ "question": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft."
}
},
"title": {
@@ -2729,7 +3087,8 @@
}
},
"render": "{name}"
- }
+ },
+ "description": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet."
},
"waste_basket": {
"description": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können.",
@@ -2764,6 +3123,21 @@
"4": {
"then": "Mülleimer für Drogen"
}
+ },
+ "question": "Um was für einen Abfalleimer handelt es sich?"
+ },
+ "dispensing_dog_bags": {
+ "question": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?",
+ "mappings": {
+ "1": {
+ "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
+ },
+ "2": {
+ "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
+ },
+ "0": {
+ "then": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel"
+ }
}
}
},
From c99e15eed975a523eec46af1bf4cd0096f86b9a8 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 20:38:57 +0200
Subject: [PATCH 42/58] Add cache timeout option on layerSource
---
Logic/FeatureSource/FeaturePipeline.ts | 23 +++++----
.../TiledFromLocalStorageSource.ts | 50 ++++++++++++++-----
Models/ThemeConfig/Json/LayerConfigJson.ts | 9 +++-
Models/ThemeConfig/Json/LayoutConfigJson.ts | 20 --------
Models/ThemeConfig/LayerConfig.ts | 8 ++-
Models/ThemeConfig/LayoutConfig.ts | 6 +--
assets/themes/grb.json | 2 +-
7 files changed, 67 insertions(+), 51 deletions(-)
diff --git a/Logic/FeatureSource/FeaturePipeline.ts b/Logic/FeatureSource/FeaturePipeline.ts
index e8b77bb77c..a96f1e2782 100644
--- a/Logic/FeatureSource/FeaturePipeline.ts
+++ b/Logic/FeatureSource/FeaturePipeline.ts
@@ -30,14 +30,14 @@ import TileFreshnessCalculator from "./TileFreshnessCalculator";
/**
* The features pipeline ties together a myriad of various datasources:
- *
+ *
* - The Overpass-API
* - The OSM-API
* - Third-party geojson files, either sliced or directly.
- *
+ *
* In order to truly understand this class, please have a look at the following diagram: https://cdn-images-1.medium.com/fit/c/800/618/1*qTK1iCtyJUr4zOyw4IFD7A.jpeg
- *
- *
+ *
+ *
*/
export default class FeaturePipeline {
@@ -68,7 +68,7 @@ export default class FeaturePipeline {
private readonly freshnesses = new Map();
- private readonly oldestAllowedDate: Date = new Date(new Date().getTime() - 60 * 60 * 24 * 30 * 1000);
+ private readonly oldestAllowedDate: Date;
private readonly osmSourceZoomLevel
constructor(
@@ -90,6 +90,11 @@ export default class FeaturePipeline {
this.state = state;
const self = this
+ const expiryInSeconds = Math.min(...state.layoutToUse.layers.map(l => l.maxAgeOfCache))
+ this.oldestAllowedDate = new Date(new Date().getTime() - expiryInSeconds);
+ for (const layer of state.layoutToUse.layers) {
+ TiledFromLocalStorageSource.cleanCacheForLayer(layer)
+ }
this.osmSourceZoomLevel = state.osmApiTileSize.data;
// milliseconds
const useOsmApi = state.locationControl.map(l => l.zoom > (state.overpassMaxZoom.data ?? 12))
@@ -220,7 +225,7 @@ export default class FeaturePipeline {
maxZoomLevel: state.layoutToUse.clustering.maxZoom,
registerTile: (tile) => {
// We save the tile data for the given layer to local storage
- if(source.layer.layerDef.source.geojsonSource === undefined || source.layer.layerDef.source.isOsmCacheLayer == true){
+ if (source.layer.layerDef.source.geojsonSource === undefined || source.layer.layerDef.source.isOsmCacheLayer == true) {
new SaveTileToLocalStorageActor(tile, tile.tileIndex)
}
perLayerHierarchy.get(source.layer.layerDef.id).registerTile(new RememberingSource(tile))
@@ -257,7 +262,7 @@ export default class FeaturePipeline {
this.runningQuery = updater.runningQuery.map(
overpass => {
console.log("FeaturePipeline: runningQuery state changed. Overpass", overpass ? "is querying," : "is idle,",
- "osmFeatureSource is", osmFeatureSource.isRunning ? "is running and needs "+neededTilesFromOsm.data?.length+" tiles (already got "+ osmFeatureSource.downloadedTiles.size +" tiles )" : "is idle")
+ "osmFeatureSource is", osmFeatureSource.isRunning ? "is running and needs " + neededTilesFromOsm.data?.length + " tiles (already got " + osmFeatureSource.downloadedTiles.size + " tiles )" : "is idle")
return overpass || osmFeatureSource.isRunning.data;
}, [osmFeatureSource.isRunning]
)
@@ -353,7 +358,7 @@ export default class FeaturePipeline {
isActive: useOsmApi.map(b => !b && overpassIsActive.data, [overpassIsActive]),
onBboxLoaded: (bbox, date, downloadedLayers, paddedToZoomLevel) => {
Tiles.MapRange(bbox.containingTileRange(paddedToZoomLevel), (x, y) => {
- const tileIndex = Tiles.tile_index(paddedToZoomLevel, x, y)
+ const tileIndex = Tiles.tile_index(paddedToZoomLevel, x, y)
downloadedLayers.forEach(layer => {
self.freshnesses.get(layer.id).addTileLoad(tileIndex, date)
SaveTileToLocalStorageActor.MarkVisited(layer.id, tileIndex, date)
@@ -412,7 +417,7 @@ export default class FeaturePipeline {
}
public GetFeaturesWithin(layerId: string, bbox: BBox): any[][] {
- if(layerId === "*"){
+ if (layerId === "*") {
return this.GetAllFeaturesWithin(bbox)
}
const requestedHierarchy = this.perLayerHierarchy.get(layerId)
diff --git a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
index a2cd50be08..7f69fedc42 100644
--- a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
+++ b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
@@ -5,6 +5,7 @@ import TileHierarchy from "./TileHierarchy";
import SaveTileToLocalStorageActor from "../Actors/SaveTileToLocalStorageActor";
import {Tiles} from "../../../Models/TileRange";
import {BBox} from "../../BBox";
+import LayerConfig from "../../../Models/ThemeConfig/LayerConfig";
export default class TiledFromLocalStorageSource implements TileHierarchy {
public readonly loadedTiles: Map = new Map();
@@ -16,7 +17,7 @@ export default class TiledFromLocalStorageSource implements TileHierarchy()
for (const key of Object.keys(localStorage)) {
- if(!(key.startsWith(prefix) && key.endsWith("-time"))){
+ if (!(key.startsWith(prefix) && key.endsWith("-time"))) {
continue
}
const index = Number(key.substring(prefix.length, key.length - "-time".length))
@@ -28,6 +29,29 @@ export default class TiledFromLocalStorageSource implements TileHierarchy= layer.maxAgeOfCache){
+ const k = prefix+index;
+ localStorage.removeItem(k)
+ localStorage.removeItem(k+"-format")
+ localStorage.removeItem(k+"-time")
+ console.debug("Removed "+k+" from local storage: too old")
+ }
+ }
+ }
+
constructor(layer: FilteredLayer,
handleFeatureSource: (src: FeatureSourceForLayer & Tiled, index: number) => void,
state: {
@@ -36,7 +60,7 @@ export default class TiledFromLocalStorageSource implements TileHierarchy()
const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layer.layerDef.id + "-"
const knownTiles: number[] = Object.keys(localStorage)
@@ -56,9 +80,9 @@ export default class TiledFromLocalStorageSource implements TileHierarchy {
- if(bounds === undefined){
+ if (bounds === undefined) {
return;
}
for (const knownTile of knownTiles) {
-
- if(this.loadedTiles.has(knownTile)){
+
+ if (this.loadedTiles.has(knownTile)) {
continue;
}
- if(this.undefinedTiles.has(knownTile)){
+ if (this.undefinedTiles.has(knownTile)) {
continue;
}
-
- if(!bounds.overlapsWith(BBox.fromTileIndex(knownTile))){
+
+ if (!bounds.overlapsWith(BBox.fromTileIndex(knownTile))) {
continue;
}
self.loadTile(knownTile)
@@ -86,8 +110,8 @@ export default class TiledFromLocalStorageSource implements TileHierarchy
Date: Mon, 25 Oct 2021 20:48:06 +0200
Subject: [PATCH 43/58] Fix changeset comment for move reason
---
UI/Popup/MoveWizard.ts | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/UI/Popup/MoveWizard.ts b/UI/Popup/MoveWizard.ts
index 3606581e2b..152dfcabab 100644
--- a/UI/Popup/MoveWizard.ts
+++ b/UI/Popup/MoveWizard.ts
@@ -17,7 +17,6 @@ import ChangeLocationAction from "../../Logic/Osm/Actions/ChangeLocationAction";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import MoveConfig from "../../Models/ThemeConfig/MoveConfig";
import {ElementStorage} from "../../Logic/ElementStorage";
-import ValidatedTextField from "../Input/ValidatedTextField";
import AvailableBaseLayers from "../../Logic/Actors/AvailableBaseLayers";
interface MoveReason {
@@ -152,7 +151,7 @@ export default class MoveWizard extends Toggle {
confirmMove.onClick(() => {
const loc = locationInput.GetValue().data
state.changes.applyAction(new ChangeLocationAction(featureToMove.properties.id, [loc.lon, loc.lat], {
- reason: Translations.WT(reason.text).textFor("en"),
+ reason: reason.changesetCommentValue,
theme: state.layoutToUse.id
}))
featureToMove.properties._lat = loc.lat
From 936cf1bf9fb60a3f7ce78ab56f09387dabb373c7 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 20:50:59 +0200
Subject: [PATCH 44/58] Fix back button behaviour, fix #523
---
UI/Base/ScrollableFullScreen.ts | 19 ++++++++++++++++---
UI/BigComponents/AllDownloads.ts | 2 +-
UI/BigComponents/FullWelcomePaneWithTabs.ts | 1 +
UI/BigComponents/LeftControls.ts | 2 ++
UI/DefaultGUI.ts | 1 +
UI/Popup/FeatureInfoBox.ts | 3 ++-
6 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/UI/Base/ScrollableFullScreen.ts b/UI/Base/ScrollableFullScreen.ts
index 07124f997c..b9f134565b 100644
--- a/UI/Base/ScrollableFullScreen.ts
+++ b/UI/Base/ScrollableFullScreen.ts
@@ -24,11 +24,16 @@ export default class ScrollableFullScreen extends UIElement {
private _fullscreencomponent: BaseUIElement;
constructor(title: ((mode: string) => BaseUIElement), content: ((mode: string) => BaseUIElement),
+ hashToShow: string,
isShown: UIEventSource = new UIEventSource(false)
) {
super();
this.isShown = isShown;
+ if (hashToShow === undefined) {
+ throw "HashToShow should be defined as it is vital for the 'back' key functionality"
+ }
+
this._component = this.BuildComponent(title("desktop"), content("desktop"), isShown)
.SetClass("hidden md:block");
this._fullscreencomponent = this.BuildComponent(title("mobile"), content("mobile").SetClass("pb-20"), isShown);
@@ -38,10 +43,18 @@ export default class ScrollableFullScreen extends UIElement {
isShown.addCallback(isShown => {
if (isShown) {
self.Activate();
+ Hash.hash.setData(hashToShow)
} else {
ScrollableFullScreen.clear();
}
})
+
+ Hash.hash.addCallback(hash => {
+ if (hash === hashToShow) {
+ return
+ }
+ isShown.setData(false)
+ })
}
private static clear() {
@@ -67,10 +80,10 @@ export default class ScrollableFullScreen extends UIElement {
private BuildComponent(title: BaseUIElement, content: BaseUIElement, isShown: UIEventSource) {
const returnToTheMap =
new Combine([
- new Img(Svg.back.replace(/#000000/g,"#cccccc"),true)
+ new Img(Svg.back.replace(/#000000/g, "#cccccc"), true)
.SetClass("block md:hidden w-12 h-12 p-2"),
- new Img(Svg.close.replace(/#000000/g,"#cccccc"),true)
- .SetClass("hidden md:block w-12 h-12 p-3")
+ new Img(Svg.close.replace(/#000000/g, "#cccccc"), true)
+ .SetClass("hidden md:block w-12 h-12 p-3")
]).SetClass("rounded-full p-0 flex-shrink-0 self-center")
returnToTheMap.onClick(() => {
diff --git a/UI/BigComponents/AllDownloads.ts b/UI/BigComponents/AllDownloads.ts
index b49e77bcb0..2586fef3f1 100644
--- a/UI/BigComponents/AllDownloads.ts
+++ b/UI/BigComponents/AllDownloads.ts
@@ -13,7 +13,7 @@ import ExportPDF from "../ExportPDF";
export default class AllDownloads extends ScrollableFullScreen {
constructor(isShown: UIEventSource) {
- super(AllDownloads.GenTitle, AllDownloads.GeneratePanel, isShown);
+ super(AllDownloads.GenTitle, AllDownloads.GeneratePanel, "downloads", isShown);
}
private static GenTitle(): BaseUIElement {
diff --git a/UI/BigComponents/FullWelcomePaneWithTabs.ts b/UI/BigComponents/FullWelcomePaneWithTabs.ts
index 1862110ce2..10ab25de5b 100644
--- a/UI/BigComponents/FullWelcomePaneWithTabs.ts
+++ b/UI/BigComponents/FullWelcomePaneWithTabs.ts
@@ -30,6 +30,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
super(
() => layoutToUse.title.Clone(),
() => FullWelcomePaneWithTabs.GenerateContents(state, currentTab, isShown),
+ "welcome",
isShown
)
}
diff --git a/UI/BigComponents/LeftControls.ts b/UI/BigComponents/LeftControls.ts
index 4b2328533e..cc8b9e4c05 100644
--- a/UI/BigComponents/LeftControls.ts
+++ b/UI/BigComponents/LeftControls.ts
@@ -41,6 +41,7 @@ export default class LeftControls extends Combine {
state.layoutToUse,
new ContributorCount(state).Contributors
),
+ "copyright",
guiState.copyrightViewIsOpened
);
@@ -74,6 +75,7 @@ export default class LeftControls extends Combine {
new FilterView(state.filteredLayers, state.overlayToggles).SetClass(
"block p-1"
),
+ "filters",
guiState.filterViewIsOpened
).SetClass("rounded-lg"),
new MapControlButton(Svg.filter_svg())
diff --git a/UI/DefaultGUI.ts b/UI/DefaultGUI.ts
index 9af6162335..e259b4f2e3 100644
--- a/UI/DefaultGUI.ts
+++ b/UI/DefaultGUI.ts
@@ -254,6 +254,7 @@ export default class DefaultGUI {
const addNewPoint = new ScrollableFullScreen(
() => Translations.t.general.add.title.Clone(),
() => new SimpleAddUI(newPointDialogIsShown, filterViewIsOpened, state),
+ "new",
newPointDialogIsShown
);
addNewPoint.isShown.addCallback((isShown) => {
diff --git a/UI/Popup/FeatureInfoBox.ts b/UI/Popup/FeatureInfoBox.ts
index 86f3aa68fa..d1ba0db371 100644
--- a/UI/Popup/FeatureInfoBox.ts
+++ b/UI/Popup/FeatureInfoBox.ts
@@ -26,7 +26,8 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
layerConfig: LayerConfig,
) {
super(() => FeatureInfoBox.GenerateTitleBar(tags, layerConfig),
- () => FeatureInfoBox.GenerateContent(tags, layerConfig));
+ () => FeatureInfoBox.GenerateContent(tags, layerConfig),
+ tags.data.id);
if (layerConfig === undefined) {
throw "Undefined layerconfig";
From d1ecaf75277be7bfdaa7e14f70539acb9e3367a6 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 21:08:44 +0200
Subject: [PATCH 45/58] Force cache clearing when a new point is added, fix
#522
---
.../Actors/SaveTileToLocalStorageActor.ts | 26 ++++++++++++++++---
Logic/FeatureSource/FeaturePipeline.ts | 12 +++++++--
.../TiledFromLocalStorageSource.ts | 1 -
3 files changed, 32 insertions(+), 7 deletions(-)
diff --git a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts
index 092c1a4023..83a269b89e 100644
--- a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts
+++ b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts
@@ -4,13 +4,14 @@
* Technically, more an Actor then a featuresource, but it fits more neatly this ay
*/
import {FeatureSourceForLayer} from "../FeatureSource";
+import {Tiles} from "../../../Models/TileRange";
export default class SaveTileToLocalStorageActor {
public static readonly storageKey: string = "cached-features";
public static readonly formatVersion: string = "2"
constructor(source: FeatureSourceForLayer, tileIndex: number) {
-
+
source.features.addCallbackAndRunD(features => {
const key = `${SaveTileToLocalStorageActor.storageKey}-${source.layer.layerDef.id}-${tileIndex}`
const now = new Date()
@@ -28,13 +29,30 @@ export default class SaveTileToLocalStorageActor {
}
- public static MarkVisited(layerId: string, tileId: number, freshness: Date){
+ public static MarkVisited(layerId: string, tileId: number, freshness: Date) {
const key = `${SaveTileToLocalStorageActor.storageKey}-${layerId}-${tileId}`
- try{
+ try {
localStorage.setItem(key + "-time", JSON.stringify(freshness.getTime()))
localStorage.setItem(key + "-format", SaveTileToLocalStorageActor.formatVersion)
- }catch(e){
+ } catch (e) {
console.error("Could not mark tile ", key, "as visited")
}
}
+
+ public static poison(layers: string[], lon: number, lat: number) {
+ for (let z = 0; z < 25; z++) {
+
+ const {x, y} = Tiles.embedded_tile(lat, lon, z)
+ const tileId = Tiles.tile_index(z, x, y)
+
+ for (const layerId of layers) {
+
+ const key = `${SaveTileToLocalStorageActor.storageKey}-${layerId}-${tileId}`
+ localStorage.removeItem(key + "-time");
+ localStorage.removeItem(key + "-format")
+ localStorage.removeItem(key)
+ }
+ }
+
+ }
}
\ No newline at end of file
diff --git a/Logic/FeatureSource/FeaturePipeline.ts b/Logic/FeatureSource/FeaturePipeline.ts
index a96f1e2782..bcda3f6886 100644
--- a/Logic/FeatureSource/FeaturePipeline.ts
+++ b/Logic/FeatureSource/FeaturePipeline.ts
@@ -91,14 +91,22 @@ export default class FeaturePipeline {
const self = this
const expiryInSeconds = Math.min(...state.layoutToUse.layers.map(l => l.maxAgeOfCache))
- this.oldestAllowedDate = new Date(new Date().getTime() - expiryInSeconds);
for (const layer of state.layoutToUse.layers) {
TiledFromLocalStorageSource.cleanCacheForLayer(layer)
}
+ this.oldestAllowedDate = new Date(new Date().getTime() - expiryInSeconds);
this.osmSourceZoomLevel = state.osmApiTileSize.data;
- // milliseconds
const useOsmApi = state.locationControl.map(l => l.zoom > (state.overpassMaxZoom.data ?? 12))
this.relationTracker = new RelationsTracker()
+
+ state.changes.allChanges.addCallbackAndRun(allChanges => {
+ allChanges.filter(ch => ch.id < 0)
+ .map(ch => ch.changes)
+ .filter(coor => coor["lat"] !== undefined && coor["lon"] !== undefined)
+ .forEach(coor => {
+ SaveTileToLocalStorageActor.poison(state.layoutToUse.layers.map(l => l.id), coor["lon"], coor["lat"])
+ })
+ })
this.sufficientlyZoomed = state.locationControl.map(location => {
diff --git a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
index 7f69fedc42..900393c1e4 100644
--- a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
+++ b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
@@ -47,7 +47,6 @@ export default class TiledFromLocalStorageSource implements TileHierarchy
Date: Mon, 25 Oct 2021 21:48:45 +0200
Subject: [PATCH 46/58] Regenerate translations
---
.../charging_station/charging_station.json | 41 ++++---
.../charging_station.protojson | 12 +-
assets/layers/crossings/crossings.json | 39 ++++--
.../cycleways_and_roads.json | 114 ++++++++++++------
.../layers/defibrillator/defibrillator.json | 3 +-
.../layers/drinking_water/drinking_water.json | 11 +-
assets/layers/etymology/etymology.json | 12 +-
assets/layers/food/food.json | 30 +++--
assets/layers/ghost_bike/ghost_bike.json | 7 +-
.../layers/nature_reserve/nature_reserve.json | 6 +-
.../observation_tower/observation_tower.json | 7 +-
assets/layers/playground/playground.json | 9 +-
assets/layers/shops/shops.json | 21 ++--
assets/layers/sport_pitch/sport_pitch.json | 24 ++--
.../surveillance_camera.json | 24 ++--
assets/layers/toilet/toilet.json | 15 ++-
assets/layers/tree_node/tree_node.json | 39 ++++--
.../visitor_information_centre.json | 3 +-
assets/layers/waste_basket/waste_basket.json | 15 ++-
assets/themes/climbing/climbing.json | 12 +-
assets/themes/cyclofix/cyclofix.json | 4 +-
.../themes/drinking_water/drinking_water.json | 4 +-
assets/themes/etymology.json | 8 +-
assets/themes/ghostbikes/ghostbikes.json | 4 +-
assets/themes/hailhydrant/hailhydrant.json | 3 +-
assets/themes/maps/maps.json | 6 +-
assets/themes/natuurpunt/natuurpunt.json | 9 +-
.../observation_towers.json | 12 +-
.../openwindpowermap/openwindpowermap.json | 27 +++--
assets/themes/parkings/parkings.json | 12 +-
assets/themes/playgrounds/playgrounds.json | 9 +-
assets/themes/postboxes/postboxes.json | 30 +++--
assets/themes/toilets/toilets.json | 4 +-
assets/themes/uk_addresses/uk_addresses.json | 3 +-
34 files changed, 383 insertions(+), 196 deletions(-)
diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json
index 52d4e30c3d..efd8c1a24b 100644
--- a/assets/layers/charging_station/charging_station.json
+++ b/assets/layers/charging_station/charging_station.json
@@ -2902,7 +2902,7 @@
"ifnot": "authentication:none=no",
"then": {
"en": "Charging here is (also) possible without authentication",
- "de": "Keine Authentifizierung erforderlich"
+ "de": "Das Aufladen ist hier (auch) ohne Authentifizierung möglich"
}
}
]
@@ -2982,7 +2982,8 @@
"id": "fee/charge",
"question": {
"en": "How much does one have to pay to use this charging station?",
- "nl": "Hoeveel kost het gebruik van dit oplaadpunt?"
+ "nl": "Hoeveel kost het gebruik van dit oplaadpunt?",
+ "de": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?"
},
"freeform": {
"key": "charge",
@@ -3027,7 +3028,8 @@
"ifnot": "payment:app=no",
"then": {
"en": "Payment is done using a dedicated app",
- "nl": "Betalen via een app van het netwerk"
+ "nl": "Betalen via een app van het netwerk",
+ "de": "Bezahlung mit einer speziellen App"
}
},
{
@@ -3035,7 +3037,8 @@
"ifnot": "payment:membership_card=no",
"then": {
"en": "Payment is done using a membership card",
- "nl": "Betalen via een lidkaart van het netwerk"
+ "nl": "Betalen via een lidkaart van het netwerk",
+ "de": "Bezahlung mit einer Mitgliedskarte"
}
}
]
@@ -3045,7 +3048,8 @@
"id": "maxstay",
"question": {
"en": "What is the maximum amount of time one is allowed to stay here?",
- "nl": "Hoelang mag een voertuig hier blijven staan?"
+ "nl": "Hoelang mag een voertuig hier blijven staan?",
+ "de": "Was ist die Höchstdauer des Aufenthalts hier?"
},
"freeform": {
"key": "maxstay"
@@ -3060,7 +3064,8 @@
"if": "maxstay=unlimited",
"then": {
"en": "No timelimit on leaving your vehicle here",
- "nl": "Geen maximum parkeertijd"
+ "nl": "Geen maximum parkeertijd",
+ "de": "Keine Höchstparkdauer"
}
}
]
@@ -3142,10 +3147,12 @@
{
"id": "phone",
"question": {
- "en": "What number can one call if there is a problem with this charging station?"
+ "en": "What number can one call if there is a problem with this charging station?",
+ "de": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?"
},
"render": {
- "en": "In case of problems, call {phone}"
+ "en": "In case of problems, call {phone}",
+ "de": "Bei Problemen, anrufen unter {phone}"
},
"freeform": {
"key": "phone",
@@ -3155,10 +3162,12 @@
{
"id": "email",
"question": {
- "en": "What is the email address of the operator?"
+ "en": "What is the email address of the operator?",
+ "de": "Wie ist die Email-Adresse des Betreibers?"
},
"render": {
- "en": "In case of problems, send an email to {email}"
+ "en": "In case of problems, send an email to {email}",
+ "de": "Bei Problemen senden Sie eine E-Mail an {email}"
},
"freeform": {
"key": "email",
@@ -3168,7 +3177,8 @@
{
"id": "website",
"question": {
- "en": "What is the website of the operator?"
+ "en": "What is the website of the operator?",
+ "de": "Wie ist die Webseite des Betreibers?"
},
"render": {
"en": "More info on {website}",
@@ -3183,7 +3193,8 @@
{
"id": "ref",
"question": {
- "en": "What is the reference number of this charging station?"
+ "en": "What is the reference number of this charging station?",
+ "de": "Wie lautet die Kennung dieser Ladestation?"
},
"render": {
"en": "Reference number is {ref}",
@@ -3444,7 +3455,8 @@
{
"question": {
"en": "Has a
Stecker"
},
"osmTags": "socket:tesla_supercharger~*"
},
diff --git a/assets/layers/charging_station/charging_station.protojson b/assets/layers/charging_station/charging_station.protojson
index 410404d4ef..955245640e 100644
--- a/assets/layers/charging_station/charging_station.protojson
+++ b/assets/layers/charging_station/charging_station.protojson
@@ -749,5 +749,15 @@
}
]
}
- ]
+ ],
+ "allowMove": {
+ "enableRelocation": false,
+ "enableImproveAccuracy": true
+ },
+ "deletion": {
+ "softDeletionTags": {
+ "and": ["amenity=","disused:amenity=charging_station"]
+ },
+ "neededChangesets": 10
+ }
}
diff --git a/assets/layers/crossings/crossings.json b/assets/layers/crossings/crossings.json
index 2681fd8913..b257f101c6 100644
--- a/assets/layers/crossings/crossings.json
+++ b/assets/layers/crossings/crossings.json
@@ -202,7 +202,8 @@
"id": "crossing-has-island",
"question": {
"en": "Does this crossing have an island in the middle?",
- "nl": "Heeft deze oversteekplaats een verkeerseiland in het midden?"
+ "nl": "Heeft deze oversteekplaats een verkeerseiland in het midden?",
+ "de": "Gibt es an diesem Übergang eine Verkehrsinsel?"
},
"condition": "highway=crossing",
"mappings": [
@@ -210,14 +211,16 @@
"if": "crossing:island=yes",
"then": {
"en": "This crossing has an island in the middle",
- "nl": "Deze oversteekplaats heeft een verkeerseiland in het midden"
+ "nl": "Deze oversteekplaats heeft een verkeerseiland in het midden",
+ "de": "Der Übergang hat eine Verkehrsinsel"
}
},
{
"if": "crossing:island=no",
"then": {
"en": "This crossing does not have an island in the middle",
- "nl": "Deze oversteekplaats heeft geen verkeerseiland in het midden"
+ "nl": "Deze oversteekplaats heeft geen verkeerseiland in het midden",
+ "de": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern"
}
}
]
@@ -261,7 +264,8 @@
"id": "crossing-button",
"question": {
"en": "Does this traffic light have a button to request green light?",
- "nl": "Heeft dit verkeerslicht een knop voor groen licht?"
+ "nl": "Heeft dit verkeerslicht een knop voor groen licht?",
+ "de": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?"
},
"condition": {
"or": [
@@ -281,7 +285,8 @@
"if": "button_operated=no",
"then": {
"en": "This traffic light does not have a button to request green light",
- "nl": "Dit verkeerlicht heeft geen knop voor groen licht"
+ "nl": "Dit verkeerlicht heeft geen knop voor groen licht",
+ "de": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern."
}
}
]
@@ -290,7 +295,8 @@
"id": "crossing-right-turn-through-red",
"question": {
"en": "Can a cyclist turn right when the light is red?",
- "nl": "Mag een fietser rechtsaf slaan als het licht rood is?"
+ "nl": "Mag een fietser rechtsaf slaan als het licht rood is?",
+ "de": "Kann ein Radfahrer bei roter Ampel rechts abbiegen?"
},
"condition": "highway=traffic_signals",
"mappings": [
@@ -298,7 +304,8 @@
"if": "red_turn:right:bicycle=yes",
"then": {
"en": "A cyclist can turn right if the light is red ",
- "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is "
+ "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is ",
+ "de": "Ein Radfahrer kann bei roter Ampel rechts abbiegen "
},
"hideInAnswer": "_country!=be"
},
@@ -306,7 +313,8 @@
"if": "red_turn:right:bicycle=yes",
"then": {
"en": "A cyclist can turn right if the light is red",
- "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is"
+ "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is",
+ "de": "Ein Radfahrer kann bei roter Ampel rechts abbiegen"
},
"hideInAnswer": "_country=be"
},
@@ -314,7 +322,8 @@
"if": "red_turn:right:bicycle=no",
"then": {
"en": "A cyclist can not turn right if the light is red",
- "nl": "Een fietser mag niet rechtsaf slaan als het licht rood is"
+ "nl": "Een fietser mag niet rechtsaf slaan als het licht rood is",
+ "de": "Ein Radfahrer kann bei roter Ampel nicht rechts abbiegen"
}
}
]
@@ -323,7 +332,8 @@
"id": "crossing-continue-through-red",
"question": {
"en": "Can a cyclist go straight on when the light is red?",
- "nl": "Mag een fietser rechtdoor gaan als het licht rood is?"
+ "nl": "Mag een fietser rechtdoor gaan als het licht rood is?",
+ "de": "Kann ein Radfahrer bei roter Ampel geradeaus fahren?"
},
"condition": "highway=traffic_signals",
"mappings": [
@@ -331,7 +341,8 @@
"if": "red_turn:straight:bicycle=yes",
"then": {
"en": "A cyclist can go straight on if the light is red ",
- "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is "
+ "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is ",
+ "de": "Ein Radfahrer kann bei roter Ampel geradeaus fahren "
},
"hideInAnswer": "_country!=be"
},
@@ -339,7 +350,8 @@
"if": "red_turn:straight:bicycle=yes",
"then": {
"en": "A cyclist can go straight on if the light is red",
- "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is"
+ "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is",
+ "de": "Ein Radfahrer kann bei roter Ampel geradeaus fahren"
},
"hideInAnswer": "_country=be"
},
@@ -347,7 +359,8 @@
"if": "red_turn:straight:bicycle=no",
"then": {
"en": "A cyclist can not go straight on if the light is red",
- "nl": "Een fietser mag niet rechtdoor gaan als het licht rood is"
+ "nl": "Een fietser mag niet rechtdoor gaan als het licht rood is",
+ "de": "Ein Radfahrer kann bei roter Ampel nicht geradeaus fahren"
}
}
]
diff --git a/assets/layers/cycleways_and_roads/cycleways_and_roads.json b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
index b8f476567c..da3f5ba20f 100644
--- a/assets/layers/cycleways_and_roads/cycleways_and_roads.json
+++ b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
@@ -102,21 +102,24 @@
"if": "cycleway=shared_lane",
"then": {
"en": "There is a shared lane",
- "nl": "Er is een fietssuggestiestrook"
+ "nl": "Er is een fietssuggestiestrook",
+ "de": "Es gibt eine geteilte Fahrspur"
}
},
{
"if": "cycleway=lane",
"then": {
"en": "There is a lane next to the road (separated with paint)",
- "nl": "Er is een fietspad aangrenzend aan de weg (gescheiden met verf)"
+ "nl": "Er is een fietspad aangrenzend aan de weg (gescheiden met verf)",
+ "de": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)"
}
},
{
"if": "cycleway=track",
"then": {
"en": "There is a track, but no cycleway drawn separately from this road on the map.",
- "nl": "Er is een fietspad (los van de weg), maar geen fietspad afzonderlijk getekend naast deze weg."
+ "nl": "Er is een fietspad (los van de weg), maar geen fietspad afzonderlijk getekend naast deze weg.",
+ "de": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist."
}
},
{
@@ -163,7 +166,8 @@
"if": "lit=yes",
"then": {
"en": "This street is lit",
- "nl": "Deze weg is verlicht"
+ "nl": "Deze weg is verlicht",
+ "de": "Diese Straße ist beleuchtet"
}
},
{
@@ -211,7 +215,8 @@
"if": "cyclestreet=yes",
"then": {
"en": "This is a cyclestreet, and a 30km/h zone.",
- "nl": "Dit is een fietsstraat, en dus een 30km/h zone"
+ "nl": "Dit is een fietsstraat, en dus een 30km/h zone",
+ "de": "Dies ist eine Fahrradstraße in einer 30km/h Zone."
},
"addExtraTags": [
"overtaking:motor_vehicle=no",
@@ -245,7 +250,8 @@
{
"render": {
"en": "The maximum speed on this road is {maxspeed} km/h",
- "nl": "De maximumsnelheid op deze weg is {maxspeed} km/u"
+ "nl": "De maximumsnelheid op deze weg is {maxspeed} km/u",
+ "de": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h"
},
"freeform": {
"key": "maxspeed",
@@ -301,7 +307,8 @@
],
"question": {
"en": "What is the maximum speed in this street?",
- "nl": "Wat is de maximumsnelheid in deze straat?"
+ "nl": "Wat is de maximumsnelheid in deze straat?",
+ "de": "Was ist die Höchstgeschwindigkeit auf dieser Straße?"
},
"id": "Maxspeed (for road)"
},
@@ -352,7 +359,8 @@
"if": "cycleway:surface=paving_stones",
"then": {
"en": "This cycleway is made of smooth paving stones",
- "nl": "Dit fietspad is gemaakt van straatstenen"
+ "nl": "Dit fietspad is gemaakt van straatstenen",
+ "de": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
}
},
{
@@ -367,7 +375,8 @@
"if": "cycleway:surface=cobblestone",
"then": {
"en": "This cycleway is made of cobblestone (unhewn or sett)",
- "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)"
+ "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)",
+ "de": "Dieser Radweg besteht aus Kopfsteinpflaster"
},
"hideInAnswer": true
},
@@ -375,14 +384,16 @@
"if": "cycleway:surface=unhewn_cobblestone",
"then": {
"en": "This cycleway is made of raw, natural cobblestone",
- "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien"
+ "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien",
+ "de": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
}
},
{
"if": "cycleway:surface=sett",
"then": {
"en": "This cycleway is made of flat, square cobblestone",
- "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien"
+ "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien",
+ "de": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
}
},
{
@@ -428,7 +439,8 @@
],
"question": {
"en": "What is the surface of the cycleway made from?",
- "nl": "Waaruit is het oppervlak van het fietspad van gemaakt?"
+ "nl": "Waaruit is het oppervlak van het fietspad van gemaakt?",
+ "de": "Was ist der Belag dieses Radwegs?"
},
"id": "Cycleway:surface"
},
@@ -466,28 +478,32 @@
"if": "cycleway:smoothness=intermediate",
"then": {
"en": "Usable for normal wheels: city bike, wheelchair, scooter",
- "nl": "Geschikt voor normale wielen: stadsfiets, rolstoel, scooter"
+ "nl": "Geschikt voor normale wielen: stadsfiets, rolstoel, scooter",
+ "de": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
}
},
{
"if": "cycleway:smoothness=bad",
"then": {
"en": "Usable for robust wheels: trekking bike, car, rickshaw",
- "nl": "Geschikt voor brede wielen: trekfiets, auto, rickshaw"
+ "nl": "Geschikt voor brede wielen: trekfiets, auto, rickshaw",
+ "de": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
}
},
{
"if": "cycleway:smoothness=very_bad",
"then": {
"en": "Usable for vehicles with high clearance: light duty off-road vehicle",
- "nl": "Geschikt voor voertuigen met hoge banden: lichte terreinwagen"
+ "nl": "Geschikt voor voertuigen met hoge banden: lichte terreinwagen",
+ "de": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
}
},
{
"if": "cycleway:smoothness=horrible",
"then": {
"en": "Usable for off-road vehicles: heavy duty off-road vehicle",
- "nl": "Geschikt voor terreinwagens: zware terreinwagen"
+ "nl": "Geschikt voor terreinwagens: zware terreinwagen",
+ "de": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
}
},
{
@@ -523,7 +539,8 @@
"if": "surface=unpaved",
"then": {
"en": "This cycleway is unhardened",
- "nl": "Dit fietspad is onverhard"
+ "nl": "Dit fietspad is onverhard",
+ "de": "Dieser Radweg ist nicht befestigt"
},
"hideInAnswer": true
},
@@ -548,7 +565,8 @@
"if": "surface=paving_stones",
"then": {
"en": "This cycleway is made of smooth paving stones",
- "nl": "Dit fietspad is gemaakt van straatstenen"
+ "nl": "Dit fietspad is gemaakt van straatstenen",
+ "de": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
}
},
{
@@ -563,7 +581,8 @@
"if": "surface=cobblestone",
"then": {
"en": "This cycleway is made of cobblestone (unhewn or sett)",
- "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)"
+ "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)",
+ "de": "Dieser Radweg besteht aus Kopfsteinpflaster"
},
"hideInAnswer": true
},
@@ -571,14 +590,16 @@
"if": "surface=unhewn_cobblestone",
"then": {
"en": "This cycleway is made of raw, natural cobblestone",
- "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien"
+ "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien",
+ "de": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
}
},
{
"if": "surface=sett",
"then": {
"en": "This cycleway is made of flat, square cobblestone",
- "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien"
+ "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien",
+ "de": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
}
},
{
@@ -624,7 +645,8 @@
],
"question": {
"en": "What is the surface of the street made from?",
- "nl": "Waaruit is het oppervlak van de straat gemaakt?"
+ "nl": "Waaruit is het oppervlak van de straat gemaakt?",
+ "de": "Was ist der Belag dieser Straße?"
},
"id": "Surface of the road"
},
@@ -658,25 +680,29 @@
{
"if": "smoothness=intermediate",
"then": {
- "en": "Usable for normal wheels: city bike, wheelchair, scooter"
+ "en": "Usable for normal wheels: city bike, wheelchair, scooter",
+ "de": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
}
},
{
"if": "smoothness=bad",
"then": {
- "en": "Usable for robust wheels: trekking bike, car, rickshaw"
+ "en": "Usable for robust wheels: trekking bike, car, rickshaw",
+ "de": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
}
},
{
"if": "smoothness=very_bad",
"then": {
- "en": "Usable for vehicles with high clearance: light duty off-road vehicle"
+ "en": "Usable for vehicles with high clearance: light duty off-road vehicle",
+ "de": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
}
},
{
"if": "smoothness=horrible",
"then": {
- "en": "Usable for off-road vehicles: heavy duty off-road vehicle"
+ "en": "Usable for off-road vehicles: heavy duty off-road vehicle",
+ "de": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
}
},
{
@@ -748,7 +774,8 @@
"if": "cycleway:traffic_sign~BE:D7;.*",
"then": {
"en": "Compulsory cycleway (with supplementary sign) ",
- "nl": "Verplicht fietspad (met onderbord) "
+ "nl": "Verplicht fietspad (met onderbord) ",
+ "de": "Vorgeschriebener Radweg (mit Zusatzschild) "
},
"hideInAnswer": true
},
@@ -821,7 +848,8 @@
"if": "traffic_sign~BE:D7;.*",
"then": {
"en": "Compulsory cycleway (with supplementary sign) ",
- "nl": "Verplicht fietspad (met onderbord) "
+ "nl": "Verplicht fietspad (met onderbord) ",
+ "de": "Vorgeschriebener Radweg (mit Zusatzschild) "
},
"hideInAnswer": true
},
@@ -1055,11 +1083,13 @@
{
"render": {
"en": "The buffer besides this cycleway is {cycleway:buffer} m",
- "nl": "De schrikafstand van dit fietspad is {cycleway:buffer} m"
+ "nl": "De schrikafstand van dit fietspad is {cycleway:buffer} m",
+ "de": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m"
},
"question": {
"en": "How wide is the gap between the cycleway and the road?",
- "nl": "Hoe breed is de ruimte tussen het fietspad en de weg?"
+ "nl": "Hoe breed is de ruimte tussen het fietspad en de weg?",
+ "de": "Wie breit ist der Abstand zwischen Radweg und Straße?"
},
"condition": {
"or": [
@@ -1081,7 +1111,8 @@
"id": "cyclelan-segregation",
"question": {
"en": "How is this cycleway separated from the road?",
- "nl": "Hoe is dit fietspad gescheiden van de weg?"
+ "nl": "Hoe is dit fietspad gescheiden van de weg?",
+ "de": "Wie ist der Radweg von der Straße abgegrenzt?"
},
"condition": {
"or": [
@@ -1094,21 +1125,24 @@
"if": "cycleway:separation=dashed_line",
"then": {
"en": "This cycleway is separated by a dashed line",
- "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep"
+ "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep",
+ "de": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
}
},
{
"if": "cycleway:separation=solid_line",
"then": {
"en": "This cycleway is separated by a solid line",
- "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep"
+ "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep",
+ "de": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie"
}
},
{
"if": "cycleway:separation=parking_lane",
"then": {
"en": "This cycleway is separated by a parking lane",
- "nl": "Dit fietspad is gescheiden van de weg met parkeervakken"
+ "nl": "Dit fietspad is gescheiden van de weg met parkeervakken",
+ "de": "Der Radweg ist abgegrenzt durch eine Parkspur"
}
},
{
@@ -1125,7 +1159,8 @@
"id": "cycleway-segregation",
"question": {
"en": "How is this cycleway separated from the road?",
- "nl": "Hoe is dit fietspad gescheiden van de weg?"
+ "nl": "Hoe is dit fietspad gescheiden van de weg?",
+ "de": "Wie ist der Radweg von der Straße abgegrenzt?"
},
"condition": {
"or": [
@@ -1138,21 +1173,24 @@
"if": "separation=dashed_line",
"then": {
"en": "This cycleway is separated by a dashed line",
- "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep"
+ "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep",
+ "de": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
}
},
{
"if": "separation=solid_line",
"then": {
"en": "This cycleway is separated by a solid line",
- "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep"
+ "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep",
+ "de": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie"
}
},
{
"if": "separation=parking_lane",
"then": {
"en": "This cycleway is separated by a parking lane",
- "nl": "Dit fietspad is gescheiden van de weg met parkeervakken"
+ "nl": "Dit fietspad is gescheiden van de weg met parkeervakken",
+ "de": "Der Radweg ist abgegrenzt durch eine Parkspur"
}
},
{
diff --git a/assets/layers/defibrillator/defibrillator.json b/assets/layers/defibrillator/defibrillator.json
index 88b63ee646..f6b335358f 100644
--- a/assets/layers/defibrillator/defibrillator.json
+++ b/assets/layers/defibrillator/defibrillator.json
@@ -209,7 +209,8 @@
"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?",
"fr": "Est-ce un défibrillateur automatique normal ou un défibrillateur manuel à usage professionnel uniquement ?",
- "it": "Si tratta di un normale defibrillatore automatico o un defibrillatore manuale riservato ai professionisti?"
+ "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"
diff --git a/assets/layers/drinking_water/drinking_water.json b/assets/layers/drinking_water/drinking_water.json
index a8081734c3..1170a823e4 100644
--- a/assets/layers/drinking_water/drinking_water.json
+++ b/assets/layers/drinking_water/drinking_water.json
@@ -5,7 +5,7 @@
"nl": "Drinkbaar water",
"fr": "Eau potable",
"gl": "Auga potábel",
- "de": "Trinkwasser",
+ "de": "Trinkwasserstelle",
"it": "Acqua potabile",
"ru": "Питьевая вода",
"id": "Air minum"
@@ -16,7 +16,7 @@
"nl": "Drinkbaar water",
"fr": "Eau potable",
"gl": "Auga potábel",
- "de": "Trinkwasser",
+ "de": "Trinkwasserstelle",
"it": "Acqua potabile",
"ru": "Питьевая вода",
"id": "Air minum"
@@ -61,7 +61,7 @@
"nl": "drinkbaar water",
"fr": "eau potable",
"gl": "auga potábel",
- "de": "trinkwasser",
+ "de": "Trinkwasserstelle",
"it": "acqua potabile",
"ru": "питьевая вода",
"id": "air minum"
@@ -99,7 +99,8 @@
"en": "This drinking water works",
"nl": "Deze drinkwaterfontein werkt",
"it": "La fontanella funziona",
- "fr": "Cette fontaine fonctionne"
+ "fr": "Cette fontaine fonctionne",
+ "de": "Diese Trinkwasserstelle funktioniert"
}
},
{
@@ -163,7 +164,7 @@
"en": "There is another drinking water fountain at {_closest_other_drinking_water_distance} meter",
"nl": "Er bevindt zich een ander drinkwaterpunt op {_closest_other_drinking_water_distance} meter",
"it": "C’è un’altra fontanella a {_closest_other_drinking_water_distance} metri",
- "de": "Ein weiterer Trinkwasserbrunnen befindet sich in {_closest_other_drinking_water_distance} Meter",
+ "de": "Eine weitere Trinkwasserstelle liegt {_closest_other_drinking_water_distance} Meter entfernt",
"fr": "Une autre source d’eau potable est à {_closest_other_drinking_water_distance} mètres a>"
},
"condition": "_closest_other_drinking_water_id~*"
diff --git a/assets/layers/etymology/etymology.json b/assets/layers/etymology/etymology.json
index 690612341f..eaefef94b1 100644
--- a/assets/layers/etymology/etymology.json
+++ b/assets/layers/etymology/etymology.json
@@ -38,7 +38,8 @@
"id": "wikipedia-etymology",
"question": {
"en": "What is the Wikidata-item that this object is named after?",
- "nl": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?"
+ "nl": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?",
+ "de": "Was ist das Wikidata-Element, nach dem dieses Objekt benannt ist?"
},
"freeform": {
"key": "name:etymology:wikidata",
@@ -71,7 +72,8 @@
},
"render": {
"en": "
U kunt uw exacte locatie volgen (enkel mobiel) en in de linkerbenedenhoek categorieën selecteren die voor u relevant zijn. U kunt deze tool ook gebruiken om 'spelden' aan de kaart toe te voegen of te bewerken en meer gegevens te verstrekken door de vragen te beantwoorden.
Alle wijzigingen die u maakt worden automatisch opgeslagen in de wereldwijde database van OpenStreetMap en kunnen door anderen vrij worden hergebruikt.
Bekijk voor meer info over cyclofix ook cyclofix.osm.be.",
"fr": "Le but de cette carte est de présenter aux cyclistes une solution facile à utiliser pour trouver l'infrastructure appropriée à leurs besoins.
Vous pouvez suivre votre localisation précise (mobile uniquement) et sélectionner les couches qui vous concernent dans le coin inférieur gauche. Vous pouvez également utiliser cet outil pour ajouter ou modifier des épingles (points d'intérêt) sur la carte et fournir plus de données en répondant aux questions.
Toutes les modifications que vous apportez seront automatiquement enregistrées dans la base de données mondiale d'OpenStreetMap et peuvent être librement réutilisées par d'autres.
Pour plus d'informations sur le projet cyclofix, rendez-vous sur cyclofix.osm.be.",
"gl": "O obxectivo deste mapa é amosar ós ciclistas unha solución doada de empregar para atopar a infraestrutura axeitada para as súas necesidades.
Podes obter a túa localización precisa (só para dispositivos móbiles) e escoller as capas que sexan relevantes para ti na esquina inferior esquerda. Tamén podes empregar esta ferramenta para engadir ou editar puntos de interese ó mapa e fornecer máis datos respondendo as cuestións.
Todas as modificacións que fagas serán gardadas de xeito automático na base de datos global do OpenStreetMap e outros poderán reutilizalos libremente.
Para máis información sobre o proxecto cyclofix, vai a cyclofix.osm.be.",
- "de": "Das Ziel dieser Karte ist es, den Radfahrern eine einfach zu benutzende Lösung zu präsentieren, um die geeignete Infrastruktur für ihre Bedürfnisse zu finden.
Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.
Alle Änderungen, die Sie vornehmen, werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei wiederverwendet werden.
Weitere Informationen über das Projekt Cyclofix finden Sie unter cyclofix.osm.be.",
+ "de": "Mit dieser Karte soll Radfahrern eine einfache Lösung bereitgestellt werden, um die passende Farradinfrastruktur zu finden.
Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.
Ihre Änderungen, werden automatisch in der Datenbank von OpenStreetMap gespeichert und können von anderen frei verwendet werden.
Weitere Informationen über Cyclofix finden Sie unter cyclofix.osm.be.",
"ja": "このマップの目的は、サイクリストのニーズに適した施設を見つけるための使いやすいソリューションを提供することです。
你可以到 cyclofix.osm.be 閱讀更多資訊。",
"it": "Questa mappa offre a chi va in bici una soluzione semplice per trovare tutte le infrastrutture di cui ha bisogno.
Puoi tracciare la tua posizione esatta (solo su mobile) e selezionare i livelli che ti interessano nell'angolo in basso a sinistra. Puoi anche usare questo strumento per aggiungere o modificare punti di interesse alla mappa e aggiungere nuove informazioni rispendendo alle domande.
Tutte le modifiche che apporterai saranno automaticamente salvate nel database mondiale di OpenStreetMap e potranno essere liberamente riutilizzate da tutti e tutte.
Per maggiori informazioni sul progetto ciclofix, visita cyclofix.osm.be."
diff --git a/assets/themes/drinking_water/drinking_water.json b/assets/themes/drinking_water/drinking_water.json
index 5da9ee3c71..9eda4b7f71 100644
--- a/assets/themes/drinking_water/drinking_water.json
+++ b/assets/themes/drinking_water/drinking_water.json
@@ -8,7 +8,7 @@
"ja": "飲料水",
"zh_Hant": "飲用水",
"it": "Acqua potabile",
- "de": "Trinkwasser"
+ "de": "Trinkwasserstelle"
},
"description": {
"en": "On this map, publicly accessible drinking water spots are shown and can be easily added",
@@ -18,7 +18,7 @@
"zh_Hant": "在這份地圖上,公共可及的飲水點可以顯示出來,也能輕易的增加",
"it": "Questa mappa mostra tutti i luoghi in cui è disponibile acqua potabile ed è possibile aggiungerne di nuovi",
"ru": "На этой карте показываются и могут быть легко добавлены общедоступные точки питьевой воды",
- "de": "Auf dieser Karte sind öffentlich zugängliche Trinkwasserstellen eingezeichnet und können leicht hinzugefügt werden"
+ "de": "Eine Karte zum Anzeigen und Bearbeiten öffentlicher Trinkwasserstellen"
},
"language": [
"en",
diff --git a/assets/themes/etymology.json b/assets/themes/etymology.json
index f342e2e2b5..735f119de6 100644
--- a/assets/themes/etymology.json
+++ b/assets/themes/etymology.json
@@ -13,7 +13,7 @@
"description": {
"en": "On this map, you can see what an object is named after. The streets, buildings, ... come from OpenStreetMap which got linked with Wikidata. In the popup, you'll see the Wikipedia article (if it exists) or a wikidata box of what the object is named after. If the object itself has a wikipedia page, that'll be shown too.
You can help contribute too!Zoom in enough and all streets will show up. You can click one and a Wikidata-search box will popup. With a few clicks, you can add an etymology link. Note that you need a free OpenStreetMap account to do this.",
"nl": "Op deze kaart zie je waar een plaats naar is vernoemd. De straten, gebouwen, ... komen uit OpenStreetMap, waar een link naar Wikidata werd gelegd. In de popup zie je het Wikipedia-artikel van hetgeen naarwaar het vernoemd is of de Wikidata-box.
Je kan zelf ook meehelpen!Als je ver inzoomt, krijg je alle straten te zien. Klik je een straat aan, dan krijg je een zoekfunctie waarmee je snel een nieuwe link kan leggen. Je hebt hiervoor een gratis OpenStreetMap account nodig.",
- "de": "Auf dieser Karte können Sie sehen, nach was ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. Die Informationen stammen aus Wikipedia."
+ "de": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.
Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen."
},
"language": [
"en",
@@ -40,7 +40,8 @@
"id": "streets_without_etymology",
"name": {
"en": "Streets without etymology information",
- "nl": "Straten zonder etymologische informatie"
+ "nl": "Straten zonder etymologische informatie",
+ "de": "Straßen ohne Informationen zur Namensherkunft"
},
"minzoom": 18,
"source": {
@@ -60,7 +61,8 @@
"id": "parks_and_forests_without_etymology",
"name": {
"en": "Parks and forests without etymology information",
- "nl": "Parken en bossen zonder etymologische informatie"
+ "nl": "Parken en bossen zonder etymologische informatie",
+ "de": "Parks und Waldflächen ohne Informationen zur Namensherkunft"
},
"minzoom": 18,
"source": {
diff --git a/assets/themes/ghostbikes/ghostbikes.json b/assets/themes/ghostbikes/ghostbikes.json
index 7c9aec38bd..97c5806172 100644
--- a/assets/themes/ghostbikes/ghostbikes.json
+++ b/assets/themes/ghostbikes/ghostbikes.json
@@ -24,7 +24,7 @@
"title": {
"en": "Ghost bikes",
"nl": "Witte Fietsen",
- "de": "Geisterrad",
+ "de": "Geisterräder",
"ja": "ゴーストバイク",
"nb_NO": "Spøkelsessykler",
"zh_Hant": "幽靈單車",
@@ -43,7 +43,7 @@
"description": {
"en": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location.
On this map, one can see all the ghost bikes which are known by OpenStreetMap. Is a ghost bike missing? Everyone can add or update information here - you only need to have a (free) OpenStreetMap account.",
"nl": "Een Witte Fiets of Spookfiets is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat om een fiets die volledig wit is geschilderd en in de buurt van het ongeval werd geinstalleerd.
Op deze kaart zie je alle witte fietsen die door OpenStreetMap gekend zijn. Ontbreekt er een Witte Fiets of wens je informatie aan te passen? Meld je dan aan met een (gratis) OpenStreetMap account.",
- "de": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap kennt. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
+ "de": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
"ja": "ゴーストバイクは、交通事故で死亡したサイクリストを記念するもので、事故現場の近くに恒久的に置かれた白い自転車の形をしています。
在這份地圖上面,你可以看到所有在開放街圖已知的幽靈單車。有缺漏的幽靈單車嗎?所有人都可以在這邊新增或是更新資訊-只有你有(免費)開放街圖帳號。",
"fr": "Les vélos fantômes sont des mémoriaux pour les cyclistes tuées sur la route, prenant la forme de vélos blancs placés à proximité des faits.
Cette carte indique leur emplacement à partir d’OpenStreetMap. Il est possible de contribuer aux informations ici, sous réserve d’avoir un compte OpenStreetMap (gratuit)."
diff --git a/assets/themes/hailhydrant/hailhydrant.json b/assets/themes/hailhydrant/hailhydrant.json
index 92f54e50f0..a46b53d12a 100644
--- a/assets/themes/hailhydrant/hailhydrant.json
+++ b/assets/themes/hailhydrant/hailhydrant.json
@@ -495,7 +495,8 @@
"ru": "Пожарная часть",
"nb_NO": "Brannstasjon",
"it": "Caserma dei vigili del fuoco",
- "fr": "Station de pompiers"
+ "fr": "Station de pompiers",
+ "de": "Feuerwache"
}
},
"description": {
diff --git a/assets/themes/maps/maps.json b/assets/themes/maps/maps.json
index 959494a063..b14817ee69 100644
--- a/assets/themes/maps/maps.json
+++ b/assets/themes/maps/maps.json
@@ -6,7 +6,8 @@
"fr": "Carte des cartes",
"ja": "マップのマップ",
"zh_Hant": "地圖的地圖",
- "ru": "Карта карт"
+ "ru": "Карта карт",
+ "de": "Eine Karte der Karten"
},
"shortDescription": {
"en": "This theme shows all (touristic) maps that OpenStreetMap knows of",
@@ -28,7 +29,8 @@
"fr",
"ja",
"zh_Hant",
- "ru"
+ "ru",
+ "de"
],
"maintainer": "MapComplete",
"icon": "./assets/themes/maps/logo.svg",
diff --git a/assets/themes/natuurpunt/natuurpunt.json b/assets/themes/natuurpunt/natuurpunt.json
index ecbe8afe95..78866a9680 100644
--- a/assets/themes/natuurpunt/natuurpunt.json
+++ b/assets/themes/natuurpunt/natuurpunt.json
@@ -3,11 +3,13 @@
"customCss": "./assets/themes/natuurpunt/natuurpunt.css",
"title": {
"nl": "Natuurgebieden",
- "en": "Nature Reserves"
+ "en": "Nature Reserves",
+ "de": "Naturschutzgebiete"
},
"shortDescription": {
"nl": "Deze kaart toont de natuurgebieden van Natuurpunt",
- "en": "This map shows the nature reserves of Natuurpunt"
+ "en": "This map shows the nature reserves of Natuurpunt",
+ "de": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt"
},
"description": {
"nl": "Op deze kaart vind je alle natuurgebieden die Natuurpunt ter beschikking stelt",
@@ -15,7 +17,8 @@
},
"language": [
"nl",
- "en"
+ "en",
+ "de"
],
"mustHaveLanguage": [
"nl"
diff --git a/assets/themes/observation_towers/observation_towers.json b/assets/themes/observation_towers/observation_towers.json
index 3ab5a6b58f..20406a939b 100644
--- a/assets/themes/observation_towers/observation_towers.json
+++ b/assets/themes/observation_towers/observation_towers.json
@@ -2,19 +2,23 @@
"id": "observation_towers",
"title": {
"en": "Observation towers",
- "nl": "Uitkijktorens"
+ "nl": "Uitkijktorens",
+ "de": "Aussichtstürme"
},
"shortDescription": {
"en": "Publicly accessible towers to enjoy the view",
- "nl": "Publieke uitkijktorens om van het panorama te genieten"
+ "nl": "Publieke uitkijktorens om van het panorama te genieten",
+ "de": "Öffentlich zugänglicher Aussichtsturm"
},
"description": {
"nl": "Publieke uitkijktorens om van het panorama te genieten",
- "en": "Publicly accessible towers to enjoy the view"
+ "en": "Publicly accessible towers to enjoy the view",
+ "de": "Öffentlich zugänglicher Aussichtsturm"
},
"language": [
"en",
- "nl"
+ "nl",
+ "de"
],
"maintainer": "",
"icon": "./assets/layers/observation_tower/Tower_observation.svg",
diff --git a/assets/themes/openwindpowermap/openwindpowermap.json b/assets/themes/openwindpowermap/openwindpowermap.json
index c7e910d48b..04282bcaeb 100644
--- a/assets/themes/openwindpowermap/openwindpowermap.json
+++ b/assets/themes/openwindpowermap/openwindpowermap.json
@@ -2,7 +2,8 @@
"id": "openwindpowermap",
"title": {
"en": "OpenWindPowerMap",
- "fr": "OpenWindPowerMap"
+ "fr": "OpenWindPowerMap",
+ "de": "OpenWindPowerMap"
},
"maintainer": "Seppe Santens",
"icon": "./assets/themes/openwindpowermap/wind_turbine.svg",
@@ -30,7 +31,8 @@
"name": {
"en": "wind turbine",
"nl": "windturbine",
- "fr": "Éolienne"
+ "fr": "Éolienne",
+ "de": "Windrad"
},
"source": {
"osmTags": "generator:source=wind"
@@ -41,7 +43,8 @@
"render": {
"en": "wind turbine",
"nl": "windturbine",
- "fr": "éolienne"
+ "fr": "éolienne",
+ "de": "Windrad"
},
"mappings": [
{
@@ -149,7 +152,8 @@
"title": {
"en": "wind turbine",
"nl": "windturbine",
- "fr": "Éolienne"
+ "fr": "Éolienne",
+ "de": "Windrad"
}
}
],
@@ -168,7 +172,8 @@
"human": {
"en": " megawatts",
"nl": " megawatt",
- "fr": " megawatts"
+ "fr": " megawatts",
+ "de": " Megawatt"
}
},
{
@@ -180,7 +185,8 @@
"human": {
"en": " kilowatts",
"nl": " kilowatt",
- "fr": " kilowatts"
+ "fr": " kilowatts",
+ "de": " Kilowatt"
}
},
{
@@ -192,7 +198,8 @@
"human": {
"en": " watts",
"nl": " watt",
- "fr": " watts"
+ "fr": " watts",
+ "de": " Watt"
}
},
{
@@ -204,7 +211,8 @@
"human": {
"en": " gigawatts",
"nl": " gigawatt",
- "fr": " gigawatts"
+ "fr": " gigawatts",
+ "de": " Gigawatt"
}
}
],
@@ -224,7 +232,8 @@
"human": {
"en": " meter",
"nl": " meter",
- "fr": " mètres"
+ "fr": " mètres",
+ "de": " Meter"
}
}
]
diff --git a/assets/themes/parkings/parkings.json b/assets/themes/parkings/parkings.json
index affbbfc211..ab62475175 100644
--- a/assets/themes/parkings/parkings.json
+++ b/assets/themes/parkings/parkings.json
@@ -2,19 +2,23 @@
"id": "parkings",
"title": {
"nl": "Parking",
- "en": "Parking"
+ "en": "Parking",
+ "de": "Parken"
},
"shortDescription": {
"nl": "Deze kaart toont verschillende parkeerplekken",
- "en": "This map shows different parking spots"
+ "en": "This map shows different parking spots",
+ "de": "Diese Karte zeigt Parkplätze"
},
"description": {
"nl": "Deze kaart toont verschillende parkeerplekken",
- "en": "This map shows different parking spots"
+ "en": "This map shows different parking spots",
+ "de": "Diese Karte zeigt Parkplätze"
},
"language": [
"nl",
- "en"
+ "en",
+ "de"
],
"maintainer": "",
"icon": "./assets/themes/parkings/parkings.svg",
diff --git a/assets/themes/playgrounds/playgrounds.json b/assets/themes/playgrounds/playgrounds.json
index 8c153a10a6..b60c955753 100644
--- a/assets/themes/playgrounds/playgrounds.json
+++ b/assets/themes/playgrounds/playgrounds.json
@@ -6,7 +6,8 @@
"fr": "Aires de jeux",
"ja": "遊び場",
"zh_Hant": "遊樂場",
- "ru": "Игровые площадки"
+ "ru": "Игровые площадки",
+ "de": "Spielpläzte"
},
"shortDescription": {
"nl": "Een kaart met speeltuinen",
@@ -14,7 +15,8 @@
"fr": "Une carte des aires de jeux",
"ja": "遊び場のある地図",
"zh_Hant": "遊樂場的地圖",
- "ru": "Карта игровых площадок"
+ "ru": "Карта игровых площадок",
+ "de": "Eine Karte mit Spielplätzen"
},
"description": {
"nl": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen",
@@ -30,7 +32,8 @@
"fr",
"ja",
"zh_Hant",
- "ru"
+ "ru",
+ "de"
],
"maintainer": "",
"icon": "./assets/themes/playgrounds/playground.svg",
diff --git a/assets/themes/postboxes/postboxes.json b/assets/themes/postboxes/postboxes.json
index 96dce929b2..a6a30a3720 100644
--- a/assets/themes/postboxes/postboxes.json
+++ b/assets/themes/postboxes/postboxes.json
@@ -1,10 +1,12 @@
{
"id": "postboxes",
"title": {
- "en": "Postbox and Post Office Map"
+ "en": "Postbox and Post Office Map",
+ "de": "Karte mit Briefkästen und Poststellen"
},
"shortDescription": {
- "en": "A map showing postboxes and post offices"
+ "en": "A map showing postboxes and post offices",
+ "de": "Eine Karte die Briefkästen und Poststellen anzeigt"
},
"description": {
"en": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :) Spotted an error or is a post box missing? You can edit this map with a free OpenStreetMap account. "
@@ -29,7 +31,8 @@
{
"id": "postboxes",
"name": {
- "en": "Postboxes"
+ "en": "Postboxes",
+ "de": "Brieflästen"
},
"minzoom": 12,
"source": {
@@ -37,11 +40,13 @@
},
"title": {
"render": {
- "en": "Postbox"
+ "en": "Postbox",
+ "de": "Briefkasten"
}
},
"description": {
- "en": "The layer showing postboxes."
+ "en": "The layer showing postboxes.",
+ "de": "Die Ebene zeigt Briefkästen."
},
"tagRenderings": [
"images",
@@ -68,7 +73,8 @@
"amenity=post_box"
],
"title": {
- "en": "postbox"
+ "en": "postbox",
+ "de": "Briefkasten"
}
}
],
@@ -85,7 +91,8 @@
{
"id": "postoffices",
"name": {
- "en": "Post offices"
+ "en": "Post offices",
+ "de": "Poststellen"
},
"minzoom": 12,
"source": {
@@ -93,7 +100,8 @@
},
"title": {
"render": {
- "en": "Post Office"
+ "en": "Post Office",
+ "de": "Poststelle"
}
},
"description": {
@@ -154,7 +162,8 @@
"amenity=post_office"
],
"title": {
- "en": "Post Office"
+ "en": "Post Office",
+ "de": "Poststelle"
}
}
],
@@ -165,7 +174,8 @@
"options": [
{
"question": {
- "en": "Currently open"
+ "en": "Currently open",
+ "de": "Aktuell geöffnet"
},
"osmTags": "_isOpen=yes"
}
diff --git a/assets/themes/toilets/toilets.json b/assets/themes/toilets/toilets.json
index 1d1567de42..de62c5c14a 100644
--- a/assets/themes/toilets/toilets.json
+++ b/assets/themes/toilets/toilets.json
@@ -2,7 +2,7 @@
"id": "toilets",
"title": {
"en": "Open Toilet Map",
- "de": "Offene Toilette Karte",
+ "de": "Freie Toilettenkarte",
"fr": "Carte des WC et toilettes publiques",
"nl": "Open Toilettenkaart",
"ru": "Открытая карта туалетов",
@@ -12,7 +12,7 @@
},
"description": {
"en": "A map of public toilets",
- "de": "Eine Karte der öffentlichen Toiletten",
+ "de": "Eine Karte mit öffentlich zugänglichen Toiletten",
"fr": "Carte affichant les WC et toilettes publiques",
"nl": "Een kaart met openbare toiletten",
"ru": "Карта общественных туалетов",
diff --git a/assets/themes/uk_addresses/uk_addresses.json b/assets/themes/uk_addresses/uk_addresses.json
index ff865b9142..aa0aeed0b4 100644
--- a/assets/themes/uk_addresses/uk_addresses.json
+++ b/assets/themes/uk_addresses/uk_addresses.json
@@ -40,7 +40,8 @@
"maxZoom": 20,
"defaultState": false,
"name": {
- "en": "Property boundaries by osmuk.org"
+ "en": "Property boundaries by osmuk.org",
+ "de": "Grenzverläufe gemäß osmuk.org"
}
}
],
From 887318ee2b3d440a34c8b87332ff6f677b964ee4 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 21:48:59 +0200
Subject: [PATCH 47/58] Regenerate translatiosn
---
assets/tagRenderings/questions.json | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/assets/tagRenderings/questions.json b/assets/tagRenderings/questions.json
index cab25af7c1..814e0058a0 100644
--- a/assets/tagRenderings/questions.json
+++ b/assets/tagRenderings/questions.json
@@ -6,14 +6,18 @@
"render": "{wikipedia():max-height:25rem}",
"question": {
"en": "What is the corresponding Wikidata entity?",
- "nl": "Welk Wikidata-item komt overeen met dit object?"
+ "nl": "Welk Wikidata-item komt overeen met dit object?",
+ "de": "Was ist das entsprechende Wikidata Element?",
+ "pt": "Qual é a entidade Wikidata correspondente?"
},
"mappings": [
{
"if": "wikidata=",
"then": {
"en": "No Wikipedia page has been linked yet",
- "nl": "Er werd nog geen Wikipedia-pagina gekoppeld"
+ "nl": "Er werd nog geen Wikipedia-pagina gekoppeld",
+ "de": "Es wurde noch keine Wikipedia-Seite verlinkt",
+ "pt": "Ainda não foi vinculada nenhuma página da Wikipédia"
},
"hideInAnswer": true
}
@@ -64,14 +68,18 @@
"render": "",
"question": {
"en": "What is the corresponding item on Wikipedia?",
- "nl": "Welk Wikipedia-artikel beschrijft dit object?"
+ "nl": "Welk Wikipedia-artikel beschrijft dit object?",
+ "de": "Was ist der entsprechende Artikel auf Wikipedia?",
+ "pt": "Qual é o item correspondente na Wikipédia?"
},
"mappings": [
{
"if": "wikidata=",
"then": {
"en": "Not linked with Wikipedia",
- "nl": "Nog geen Wikipedia-artikel bekend"
+ "nl": "Nog geen Wikipedia-artikel bekend",
+ "de": "Nicht mit Wikipedia verknüpft",
+ "pt": "Não vinculado à Wikipédia"
}
}
],
From feb684d9e5c269f67ebc2aec55168bfaba69caac Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 21:49:25 +0200
Subject: [PATCH 48/58] Translation regeneration
---
langs/layers/de.json | 590 ++++++++++++++++-----------------
langs/shared-questions/de.json | 2 +-
langs/shared-questions/pt.json | 22 +-
langs/themes/de.json | 138 ++++----
4 files changed, 376 insertions(+), 376 deletions(-)
diff --git a/langs/layers/de.json b/langs/layers/de.json
index 8c995a73c6..73735975b9 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -948,11 +948,11 @@
"0": {
"question": "Alle Anschlüsse"
},
- "7": {
- "question": "Hat einen
Tesla Supercharger
Stecker"
- },
"3": {
"question": "Hat einen
Chademo
Stecker"
+ },
+ "7": {
+ "question": "Hat einen
Tesla Supercharger
Stecker"
}
}
}
@@ -1153,31 +1153,27 @@
"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}"
+ },
"fee/charge": {
"mappings": {
"0": {
"then": "Nutzung kostenlos"
}
},
- "render": "Die Nutzung dieser Ladestation kostet {charge}",
- "question": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?"
+ "question": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?",
+ "render": "Die Nutzung dieser Ladestation kostet {charge}"
},
"maxstay": {
- "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}",
- "question": "Was ist die Höchstdauer des Aufenthalts hier?",
"mappings": {
"0": {
"then": "Keine Höchstparkdauer"
}
- }
- },
- "ref": {
- "render": "Die Kennziffer ist {ref}",
- "question": "Wie lautet die Kennung dieser Ladestation?"
- },
- "website": {
- "render": "Weitere Informationen auf {website}",
- "question": "Wie ist die Webseite des Betreibers?"
+ },
+ "question": "Was ist die Höchstdauer des Aufenthalts hier?",
+ "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}"
},
"payment-options": {
"override": {
@@ -1191,13 +1187,17 @@
}
}
},
- "email": {
- "question": "Wie ist die Email-Adresse des Betreibers?",
- "render": "Bei Problemen senden Sie eine E-Mail an {email}"
- },
"phone": {
- "render": "Bei Problemen, anrufen unter {phone}",
- "question": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?"
+ "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}"
}
},
"title": {
@@ -1264,41 +1264,13 @@
},
"question": "Können Radfahrer diese Kreuzung nutzen?"
},
- "crossing-is-zebra": {
+ "crossing-button": {
"mappings": {
- "0": {
- "then": "Dies ist ein Zebrastreifen"
- },
"1": {
- "then": "Dies ist kein Zebrastreifen"
+ "then": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern."
}
},
- "question": "Ist das ein Zebrastreifen?"
- },
- "crossing-tactile": {
- "mappings": {
- "0": {
- "then": "An dieser Kreuzung gibt es ein Blindenleitsystem"
- },
- "1": {
- "then": "Diese Kreuzung hat kein Blindenleitsystem"
- }
- },
- "question": "Gibt es an dieser Kreuzung ein Blindenleitsystem?"
- },
- "crossing-type": {
- "mappings": {
- "0": {
- "then": "Kreuzungen ohne Ampeln"
- },
- "1": {
- "then": "Kreuzungen mit Ampeln"
- },
- "2": {
- "then": "Zebrastreifen"
- }
- },
- "question": "Was ist das für eine Kreuzung?"
+ "question": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?"
},
"crossing-continue-through-red": {
"mappings": {
@@ -1325,27 +1297,55 @@
},
"question": "Gibt es an diesem Übergang eine Verkehrsinsel?"
},
+ "crossing-is-zebra": {
+ "mappings": {
+ "0": {
+ "then": "Dies ist ein Zebrastreifen"
+ },
+ "1": {
+ "then": "Dies ist kein Zebrastreifen"
+ }
+ },
+ "question": "Ist das ein Zebrastreifen?"
+ },
"crossing-right-turn-through-red": {
"mappings": {
+ "0": {
+ "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen "
+ },
"1": {
"then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen"
},
"2": {
"then": "Ein Radfahrer kann bei roter Ampel nicht rechts abbiegen"
- },
- "0": {
- "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen "
}
},
"question": "Kann ein Radfahrer bei roter Ampel rechts abbiegen?"
},
- "crossing-button": {
- "question": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?",
+ "crossing-tactile": {
"mappings": {
+ "0": {
+ "then": "An dieser Kreuzung gibt es ein Blindenleitsystem"
+ },
"1": {
- "then": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern."
+ "then": "Diese Kreuzung hat kein Blindenleitsystem"
}
- }
+ },
+ "question": "Gibt es an dieser Kreuzung ein Blindenleitsystem?"
+ },
+ "crossing-type": {
+ "mappings": {
+ "0": {
+ "then": "Kreuzungen ohne Ampeln"
+ },
+ "1": {
+ "then": "Kreuzungen mit Ampeln"
+ },
+ "2": {
+ "then": "Zebrastreifen"
+ }
+ },
+ "question": "Was ist das für eine Kreuzung?"
}
},
"title": {
@@ -1365,6 +1365,15 @@
"tagRenderings": {
"Cycleway type for a road": {
"mappings": {
+ "0": {
+ "then": "Es gibt eine geteilte Fahrspur"
+ },
+ "1": {
+ "then": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)"
+ },
+ "2": {
+ "then": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist."
+ },
"3": {
"then": "Hier ist ein getrennter Radweg vorhanden"
},
@@ -1373,15 +1382,6 @@
},
"5": {
"then": "Es gibt keinen Radweg"
- },
- "2": {
- "then": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist."
- },
- "1": {
- "then": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)"
- },
- "0": {
- "then": "Es gibt eine geteilte Fahrspur"
}
},
"question": "Was für ein Radweg ist hier?"
@@ -1394,23 +1394,23 @@
"1": {
"then": "Geeignet für dünne Reifen: Rennrad"
},
- "6": {
- "then": "Geeignet für Geländefahrzeuge: Traktor, ATV"
- },
- "7": {
- "then": "Unpassierbar / Keine bereiften Fahrzeuge"
- },
"2": {
"then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
},
"3": {
"then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
},
+ "4": {
+ "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
+ },
"5": {
"then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
},
- "4": {
- "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
+ "6": {
+ "then": "Geeignet für Geländefahrzeuge: Traktor, ATV"
+ },
+ "7": {
+ "then": "Unpassierbar / Keine bereiften Fahrzeuge"
}
},
"question": "Wie eben ist dieser Radweg?"
@@ -1426,9 +1426,21 @@
"2": {
"then": "Der Radweg ist aus Asphalt"
},
+ "3": {
+ "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
+ },
"4": {
"then": "Der Radweg ist aus Beton"
},
+ "5": {
+ "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
+ },
+ "6": {
+ "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
+ },
+ "7": {
+ "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
+ },
"8": {
"then": "Der Radweg ist aus Holz"
},
@@ -1443,33 +1455,21 @@
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
- },
- "5": {
- "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
- },
- "3": {
- "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
- },
- "7": {
- "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
- },
- "6": {
- "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
}
},
- "render": "Der Radweg ist aus {cycleway:surface}",
- "question": "Was ist der Belag dieses Radwegs?"
+ "question": "Was ist der Belag dieses Radwegs?",
+ "render": "Der Radweg ist aus {cycleway:surface}"
},
"Is this a cyclestreet? (For a road)": {
"mappings": {
+ "0": {
+ "then": "Dies ist eine Fahrradstraße in einer 30km/h Zone."
+ },
"1": {
"then": "Dies ist eine Fahrradstraße"
},
"2": {
"then": "Dies ist keine Fahrradstraße."
- },
- "0": {
- "then": "Dies ist eine Fahrradstraße in einer 30km/h Zone."
}
},
"question": "Ist das eine Fahrradstraße"
@@ -1492,20 +1492,35 @@
"then": "Die Höchstgeschwindigkeit ist 90 km/h"
}
},
- "render": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h",
- "question": "Was ist die Höchstgeschwindigkeit auf dieser Straße?"
+ "question": "Was ist die Höchstgeschwindigkeit auf dieser Straße?",
+ "render": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h"
},
"Surface of the road": {
"mappings": {
+ "0": {
+ "then": "Dieser Radweg ist nicht befestigt"
+ },
"1": {
"then": "Dieser Radweg hat einen festen Belag"
},
"2": {
"then": "Der Radweg ist aus Asphalt"
},
+ "3": {
+ "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
+ },
"4": {
"then": "Der Radweg ist aus Beton"
},
+ "5": {
+ "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
+ },
+ "6": {
+ "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
+ },
+ "7": {
+ "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
+ },
"8": {
"then": "Der Radweg ist aus Holz"
},
@@ -1520,25 +1535,10 @@
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
- },
- "3": {
- "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
- },
- "0": {
- "then": "Dieser Radweg ist nicht befestigt"
- },
- "6": {
- "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
- },
- "7": {
- "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
- },
- "5": {
- "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
}
},
- "render": "Der Radweg ist aus {surface}",
- "question": "Was ist der Belag dieser Straße?"
+ "question": "Was ist der Belag dieser Straße?",
+ "render": "Der Radweg ist aus {surface}"
},
"Surface of the street": {
"mappings": {
@@ -1548,32 +1548,29 @@
"1": {
"then": "Geeignet für dünne Reifen: Rennrad"
},
- "6": {
- "then": "Geeignet für spezielle Geländewagen: Traktor, ATV"
- },
- "7": {
- "then": "Unpassierbar / Keine bereiften Fahrzeuge"
- },
- "4": {
- "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
- },
"2": {
"then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
},
"3": {
"then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
},
+ "4": {
+ "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
+ },
"5": {
"then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
+ },
+ "6": {
+ "then": "Geeignet für spezielle Geländewagen: Traktor, ATV"
+ },
+ "7": {
+ "then": "Unpassierbar / Keine bereiften Fahrzeuge"
}
},
"question": "Wie eben ist diese Straße?"
},
"cyclelan-segregation": {
"mappings": {
- "3": {
- "then": "Dieser Radweg ist getrennt durch einen Bordstein"
- },
"0": {
"then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
},
@@ -1582,6 +1579,9 @@
},
"2": {
"then": "Der Radweg ist abgegrenzt durch eine Parkspur"
+ },
+ "3": {
+ "then": "Dieser Radweg ist getrennt durch einen Bordstein"
}
},
"question": "Wie ist der Radweg von der Straße abgegrenzt?"
@@ -1591,6 +1591,9 @@
"0": {
"then": "Vorgeschriebener Radweg "
},
+ "1": {
+ "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
+ },
"2": {
"then": "Getrennter Fuß-/Radweg "
},
@@ -1599,18 +1602,12 @@
},
"4": {
"then": "Kein Verkehrsschild vorhanden"
- },
- "1": {
- "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
}
},
"question": "Welches Verkehrszeichen hat dieser Radweg?"
},
"cycleway-segregation": {
"mappings": {
- "3": {
- "then": "Dieser Radweg ist getrennt durch einen Bordstein"
- },
"0": {
"then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
},
@@ -1619,6 +1616,9 @@
},
"2": {
"then": "Der Radweg ist abgegrenzt durch eine Parkspur"
+ },
+ "3": {
+ "then": "Dieser Radweg ist getrennt durch einen Bordstein"
}
},
"question": "Wie ist der Radweg von der Straße abgegrenzt?"
@@ -1628,6 +1628,9 @@
"0": {
"then": "Vorgeschriebener Radweg "
},
+ "1": {
+ "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
+ },
"2": {
"then": "Getrennter Fuß-/Radweg "
},
@@ -1636,9 +1639,6 @@
},
"4": {
"then": "Kein Verkehrsschild vorhanden"
- },
- "1": {
- "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
}
},
"question": "Welches Verkehrszeichen hat dieser Radweg?"
@@ -1660,8 +1660,15 @@
}
}
},
+ "cycleways_and_roads-cycleway:buffer": {
+ "question": "Wie breit ist der Abstand zwischen Radweg und Straße?",
+ "render": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m"
+ },
"is lit?": {
"mappings": {
+ "0": {
+ "then": "Diese Straße ist beleuchtet"
+ },
"1": {
"then": "Diese Straße ist nicht beleuchtet"
},
@@ -1670,16 +1677,9 @@
},
"3": {
"then": "Diese Straße ist durchgehend beleuchtet"
- },
- "0": {
- "then": "Diese Straße ist beleuchtet"
}
},
"question": "Ist diese Straße beleuchtet?"
- },
- "cycleways_and_roads-cycleway:buffer": {
- "question": "Wie breit ist der Abstand zwischen Radweg und Straße?",
- "render": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m"
}
},
"title": {
@@ -1745,8 +1745,8 @@
"then": "Dies ist ein normaler automatischer Defibrillator"
}
},
- "render": "Es gibt keine Informationen über den Gerätetyp",
- "question": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?"
+ "question": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?",
+ "render": "Es gibt keine Informationen über den Gerätetyp"
},
"defibrillator-defibrillator:location": {
"question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (in der lokalen Sprache)",
@@ -1851,14 +1851,14 @@
},
"Still in use?": {
"mappings": {
+ "0": {
+ "then": "Diese Trinkwasserstelle funktioniert"
+ },
"1": {
"then": "Diese Trinkwasserstelle ist kaputt"
},
"2": {
"then": "Diese Trinkwasserstelle wurde geschlossen"
- },
- "0": {
- "then": "Diese Trinkwasserstelle funktioniert"
}
},
"question": "Ist diese Trinkwasserstelle noch in Betrieb?",
@@ -1876,13 +1876,13 @@
"description": "Alle Objekte, die eine bekannte Namensherkunft haben",
"tagRenderings": {
"simple etymology": {
- "render": "Benannt nach {name:etymology}",
- "question": "Wonach ist dieses Objekt benannt? Das könnte auf einem Straßenschild stehen",
"mappings": {
"0": {
"then": "Der Ursprung dieses Namens ist in der gesamten Literatur unbekannt"
}
- }
+ },
+ "question": "Wonach ist dieses Objekt benannt? Das könnte auf einem Straßenschild stehen",
+ "render": "Benannt nach {name:etymology}"
},
"wikipedia-etymology": {
"question": "Was ist das Wikidata-Element, nach dem dieses Objekt benannt ist?",
@@ -1899,6 +1899,13 @@
}
}
},
+ "1": {
+ "options": {
+ "0": {
+ "question": "Hat vegetarische Speisen"
+ }
+ }
+ },
"2": {
"options": {
"0": {
@@ -1912,19 +1919,13 @@
"question": "Hat halal Speisen"
}
}
- },
- "1": {
- "options": {
- "0": {
- "question": "Hat vegetarische Speisen"
- }
- }
}
},
+ "name": "Restaurants und Fast Food",
"presets": {
"0": {
- "title": "Restaurant",
- "description": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden"
+ "description": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden",
+ "title": "Restaurant"
},
"1": {
"title": "Schnellimbiss"
@@ -1936,14 +1937,14 @@
"tagRenderings": {
"Cuisine": {
"mappings": {
- "2": {
- "then": "Bietet vorwiegend Pastagerichte an"
- },
"0": {
"then": "Dies ist eine Pizzeria"
},
"1": {
"then": "Dies ist eine Pommesbude"
+ },
+ "2": {
+ "then": "Bietet vorwiegend Pastagerichte an"
}
},
"question": "Welches Essen gibt es hier?",
@@ -1970,6 +1971,17 @@
},
"question": "Ist an diesem Ort Mitnahme möglich?"
},
+ "Vegetarian (no friture)": {
+ "question": "Gibt es im das Restaurant vegetarische Speisen?"
+ },
+ "friture-take-your-container": {
+ "mappings": {
+ "0": {
+ "then": "Sie können ihre eigenen Behälter mitbringen, um Ihre Bestellung zu erhalten, was Einwegverpackungsmaterial und damit Abfall spart"
+ }
+ },
+ "question": "Wenn Sie Ihr eigenes Behältnis mitbringen (z. B. einen Kochtopf und kleine Töpfe), wird es dann zum Verpacken Ihrer Bestellung verwendet? "
+ },
"halal (no friture)": {
"mappings": {
"0": {
@@ -1986,17 +1998,6 @@
}
},
"question": "Gibt es im das Restaurant halal Speisen?"
- },
- "Vegetarian (no friture)": {
- "question": "Gibt es im das Restaurant vegetarische Speisen?"
- },
- "friture-take-your-container": {
- "mappings": {
- "0": {
- "then": "Sie können ihre eigenen Behälter mitbringen, um Ihre Bestellung zu erhalten, was Einwegverpackungsmaterial und damit Abfall spart"
- }
- },
- "question": "Wenn Sie Ihr eigenes Behältnis mitbringen (z. B. einen Kochtopf und kleine Töpfe), wird es dann zum Verpacken Ihrer Bestellung verwendet? "
}
},
"title": {
@@ -2008,8 +2009,7 @@
"then": "Schnellrestaurant{name}"
}
}
- },
- "name": "Restaurants und Fast Food"
+ }
},
"ghost_bike": {
"name": "Geisterräder",
@@ -2110,6 +2110,9 @@
},
"nature_reserve": {
"tagRenderings": {
+ "Curator": {
+ "question": "Wer ist der Verwalter dieses Naturschutzgebietes? Respektieren Sie die Privatsphäre - geben Sie nur dann einen Namen an, wenn dieser allgemein bekannt ist"
+ },
"Dogs?": {
"mappings": {
"0": {
@@ -2127,17 +2130,14 @@
"Email": {
"render": "{email}"
},
+ "Surface area": {
+ "render": "Grundfläche: {_surface:ha}ha"
+ },
"Website": {
"question": "Auf welcher Webseite kann man mehr Informationen über dieses Naturschutzgebiet finden?"
},
"phone": {
"render": "{phone}"
- },
- "Curator": {
- "question": "Wer ist der Verwalter dieses Naturschutzgebietes? Respektieren Sie die Privatsphäre - geben Sie nur dann einen Namen an, wenn dieser allgemein bekannt ist"
- },
- "Surface area": {
- "render": "Grundfläche: {_surface:ha}ha"
}
}
},
@@ -2156,8 +2156,8 @@
"then": "Eintritt kostenlos"
}
},
- "render": "Der Besuch des Turms kostet {charge}",
- "question": "Was kostet der Zugang zu diesem Turm?"
+ "question": "Was kostet der Zugang zu diesem Turm?",
+ "render": "Der Besuch des Turms kostet {charge}"
},
"Height": {
"question": "Wie hoch ist dieser Turm?",
@@ -2280,12 +2280,12 @@
"question": "Ist dieser Spielplatz nachts beleuchtet?"
},
"playground-max_age": {
- "render": "Zugang nur für Kinder bis maximal {max_age}",
- "question": "Bis zu welchem Alter dürfen Kinder auf diesem Spielplatz spielen?"
+ "question": "Bis zu welchem Alter dürfen Kinder auf diesem Spielplatz spielen?",
+ "render": "Zugang nur für Kinder bis maximal {max_age}"
},
"playground-min_age": {
- "render": "Zugang nur für Kinder ab {min_age} Jahren",
- "question": "Ab welchem Alter dürfen Kinder auf diesem Spielplatz spielen?"
+ "question": "Ab welchem Alter dürfen Kinder auf diesem Spielplatz spielen?",
+ "render": "Zugang nur für Kinder ab {min_age} Jahren"
},
"playground-opening_hours": {
"mappings": {
@@ -2306,8 +2306,8 @@
"render": "Betrieben von {operator}"
},
"playground-phone": {
- "render": "{phone}",
- "question": "Wie lautet die Telefonnummer vom Betreiber des Spielplatzes?"
+ "question": "Wie lautet die Telefonnummer vom Betreiber des Spielplatzes?",
+ "render": "{phone}"
},
"playground-surface": {
"mappings": {
@@ -2463,6 +2463,8 @@
}
},
"shops": {
+ "description": "Ein Geschäft",
+ "name": "Geschäft",
"presets": {
"0": {
"description": "Ein neues Geschäft hinzufügen",
@@ -2470,9 +2472,18 @@
}
},
"tagRenderings": {
+ "shops-email": {
+ "question": "Wie ist die Email-Adresse dieses Geschäfts?"
+ },
+ "shops-name": {
+ "question": "Wie ist der Name dieses Geschäfts?"
+ },
+ "shops-opening_hours": {
+ "question": "Wie sind die Öffnungszeiten dieses Geschäfts?"
+ },
"shops-phone": {
- "render": "{phone}",
- "question": "Wie ist die Telefonnummer?"
+ "question": "Wie ist die Telefonnummer?",
+ "render": "{phone}"
},
"shops-shop": {
"mappings": {
@@ -2504,15 +2515,6 @@
"shops-website": {
"question": "Wie lautet die Webseite dieses Geschäfts?",
"render": "{website}"
- },
- "shops-opening_hours": {
- "question": "Wie sind die Öffnungszeiten dieses Geschäfts?"
- },
- "shops-email": {
- "question": "Wie ist die Email-Adresse dieses Geschäfts?"
- },
- "shops-name": {
- "question": "Wie ist der Name dieses Geschäfts?"
}
},
"title": {
@@ -2525,9 +2527,7 @@
}
},
"render": "Geschäft"
- },
- "name": "Geschäft",
- "description": "Ein Geschäft"
+ }
},
"slow_roads": {
"tagRenderings": {
@@ -2579,23 +2579,20 @@
"0": {
"then": "Öffentlicher Zugang"
},
+ "1": {
+ "then": "Eingeschränkter Zugang (z. B. nur mit Termin, zu bestimmten Zeiten, ...)"
+ },
"2": {
"then": "Zugang nur für Vereinsmitglieder"
},
"3": {
"then": "Privat - kein öffentlicher Zugang"
- },
- "1": {
- "then": "Eingeschränkter Zugang (z. B. nur mit Termin, zu bestimmten Zeiten, ...)"
}
},
"question": "Ist dieser Sportplatz öffentlich zugänglich?"
},
"sport-pitch-reservation": {
"mappings": {
- "3": {
- "then": "Termine nach Vereinbarung nicht möglich"
- },
"0": {
"then": "Für die Nutzung des Sportplatzes ist eine Voranmeldung erforderlich"
},
@@ -2604,10 +2601,16 @@
},
"2": {
"then": "Eine Voranmeldung ist möglich, aber nicht notwendig, um diesen Sportplatz zu nutzen"
+ },
+ "3": {
+ "then": "Termine nach Vereinbarung nicht möglich"
}
},
"question": "Muss man einen Termin vereinbaren, um diesen Sportplatz zu benutzen?"
},
+ "sport_pitch-email": {
+ "question": "Wie ist die Email-Adresse des Betreibers?"
+ },
"sport_pitch-opening_hours": {
"mappings": {
"1": {
@@ -2616,6 +2619,9 @@
},
"question": "Wann ist dieser Sportplatz zugänglich?"
},
+ "sport_pitch-phone": {
+ "question": "Wie ist die Telefonnummer des Betreibers?"
+ },
"sport_pitch-sport": {
"mappings": {
"0": {
@@ -2658,14 +2664,8 @@
"then": "Die Oberfläche ist Beton"
}
},
- "render": "Die Oberfläche ist {surface}",
- "question": "Was ist die Oberfläche dieses Sportplatzes?"
- },
- "sport_pitch-email": {
- "question": "Wie ist die Email-Adresse des Betreibers?"
- },
- "sport_pitch-phone": {
- "question": "Wie ist die Telefonnummer des Betreibers?"
+ "question": "Was ist die Oberfläche dieses Sportplatzes?",
+ "render": "Die Oberfläche ist {surface}"
}
},
"title": {
@@ -2711,6 +2711,17 @@
"question": "Wer betreibt diese CCTV Kamera?",
"render": "Betrieben von {operator}"
},
+ "Surveillance type: public, outdoor, indoor": {
+ "mappings": {
+ "1": {
+ "then": "Ein privater Außenbereich wird überwacht (z. B. ein Parkplatz, eine Tankstelle, ein Innenhof, ein Eingang, eine private Einfahrt, ...)"
+ },
+ "2": {
+ "then": "Ein privater Innenbereich wird überwacht, z. B. ein Geschäft, eine private Tiefgarage, ..."
+ }
+ },
+ "question": "Um was für eine Überwachungskamera handelt es sich"
+ },
"Surveillance:zone": {
"mappings": {
"0": {
@@ -2736,8 +2747,6 @@
"render": " Überwacht ein/e {surveillance:zone}"
},
"camera:mount": {
- "question": "Wie ist diese Kamera montiert?",
- "render": "Montageart: {mount}",
"mappings": {
"0": {
"then": "Diese Kamera ist an einer Wand montiert"
@@ -2748,18 +2757,9 @@
"2": {
"then": "Diese Kamera ist an der Decke montiert"
}
- }
- },
- "Surveillance type: public, outdoor, indoor": {
- "question": "Um was für eine Überwachungskamera handelt es sich",
- "mappings": {
- "2": {
- "then": "Ein privater Innenbereich wird überwacht, z. B. ein Geschäft, eine private Tiefgarage, ..."
- },
- "1": {
- "then": "Ein privater Außenbereich wird überwacht (z. B. ein Parkplatz, eine Tankstelle, ein Innenhof, ein Eingang, eine private Einfahrt, ...)"
- }
- }
+ },
+ "question": "Wie ist diese Kamera montiert?",
+ "render": "Montageart: {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?"
@@ -2848,6 +2848,25 @@
"question": "Wie viel muss man für diese Toiletten bezahlen?",
"render": "Die Gebühr beträgt {charge}"
},
+ "toilet-handwashing": {
+ "mappings": {
+ "0": {
+ "then": "Diese Toilette verfügt über ein Waschbecken"
+ },
+ "1": {
+ "then": "Diese Toilette verfügt über kein Waschbecken"
+ }
+ },
+ "question": "Verfügt diese Toilette über ein Waschbecken?"
+ },
+ "toilet-has-paper": {
+ "mappings": {
+ "1": {
+ "then": "Für diese Toilette müssen Sie Ihr eigenes Toilettenpapier mitbringen"
+ }
+ },
+ "question": "Muss man für diese Toilette sein eigenes Toilettenpapier mitbringen?"
+ },
"toilets-changing-table": {
"mappings": {
"0": {
@@ -2897,25 +2916,6 @@
}
},
"question": "Gibt es eine Toilette für Rollstuhlfahrer?"
- },
- "toilet-has-paper": {
- "question": "Muss man für diese Toilette sein eigenes Toilettenpapier mitbringen?",
- "mappings": {
- "1": {
- "then": "Für diese Toilette müssen Sie Ihr eigenes Toilettenpapier mitbringen"
- }
- }
- },
- "toilet-handwashing": {
- "question": "Verfügt diese Toilette über ein Waschbecken?",
- "mappings": {
- "0": {
- "then": "Diese Toilette verfügt über ein Waschbecken"
- },
- "1": {
- "then": "Diese Toilette verfügt über kein Waschbecken"
- }
- }
}
},
"title": {
@@ -2968,15 +2968,38 @@
"tagRenderings": {
"tree-decidouous": {
"mappings": {
- "1": {
- "then": "immergrüner Baum."
- },
"0": {
"then": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter."
+ },
+ "1": {
+ "then": "immergrüner Baum."
}
},
"question": "Ist dies ein Nadelbaum oder ein Laubbaum?"
},
+ "tree-denotation": {
+ "mappings": {
+ "0": {
+ "then": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung."
+ },
+ "1": {
+ "then": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört."
+ },
+ "2": {
+ "then": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage."
+ },
+ "3": {
+ "then": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)."
+ },
+ "5": {
+ "then": "Dieser Baum steht entlang einer Straße."
+ },
+ "7": {
+ "then": "Dieser Baum steht außerhalb eines städtischen Gebiets."
+ }
+ },
+ "question": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft."
+ },
"tree-height": {
"mappings": {
"0": {
@@ -2987,14 +3010,14 @@
},
"tree-heritage": {
"mappings": {
- "3": {
- "then": "Nicht als Denkmal registriert"
- },
"0": {
"then": " Als Denkmal registriert von der Onroerend Erfgoed Flandern"
},
"1": {
"then": "Als Denkmal registriert von der Direction du Patrimoine culturel Brüssel"
+ },
+ "3": {
+ "then": "Nicht als Denkmal registriert"
}
},
"question": "Ist dieser Baum ein Naturdenkmal?"
@@ -3027,29 +3050,6 @@
},
"tree_node-wikidata": {
"question": "Was ist das passende Wikidata Element zu diesem Baum?"
- },
- "tree-denotation": {
- "mappings": {
- "5": {
- "then": "Dieser Baum steht entlang einer Straße."
- },
- "7": {
- "then": "Dieser Baum steht außerhalb eines städtischen Gebiets."
- },
- "2": {
- "then": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage."
- },
- "3": {
- "then": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)."
- },
- "0": {
- "then": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung."
- },
- "1": {
- "then": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört."
- }
- },
- "question": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft."
}
},
"title": {
@@ -3079,6 +3079,7 @@
}
},
"visitor_information_centre": {
+ "description": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet.",
"name": "Besucherinformationszentrum",
"title": {
"mappings": {
@@ -3087,8 +3088,7 @@
}
},
"render": "{name}"
- },
- "description": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet."
+ }
},
"waste_basket": {
"description": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können.",
@@ -3106,6 +3106,20 @@
}
},
"tagRenderings": {
+ "dispensing_dog_bags": {
+ "mappings": {
+ "0": {
+ "then": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel"
+ },
+ "1": {
+ "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
+ },
+ "2": {
+ "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
+ }
+ },
+ "question": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?"
+ },
"waste-basket-waste-types": {
"mappings": {
"0": {
@@ -3125,20 +3139,6 @@
}
},
"question": "Um was für einen Abfalleimer handelt es sich?"
- },
- "dispensing_dog_bags": {
- "question": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?",
- "mappings": {
- "1": {
- "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
- },
- "2": {
- "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
- },
- "0": {
- "then": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel"
- }
- }
}
},
"title": {
@@ -3148,4 +3148,4 @@
"watermill": {
"name": "Wassermühle"
}
-}
+}
\ No newline at end of file
diff --git a/langs/shared-questions/de.json b/langs/shared-questions/de.json
index cc6df974b8..24b5582b65 100644
--- a/langs/shared-questions/de.json
+++ b/langs/shared-questions/de.json
@@ -96,4 +96,4 @@
"question": "Was ist der entsprechende Artikel auf Wikipedia?"
}
}
-}
+}
\ No newline at end of file
diff --git a/langs/shared-questions/pt.json b/langs/shared-questions/pt.json
index 2afb0b221f..b1f25a4351 100644
--- a/langs/shared-questions/pt.json
+++ b/langs/shared-questions/pt.json
@@ -79,21 +79,21 @@
},
"question": "Este lugar é acessível a utilizadores de cadeiras de rodas?"
},
- "wikipedialink": {
- "question": "Qual é o item correspondente na Wikipédia?",
- "mappings": {
- "0": {
- "then": "Não vinculado à Wikipédia"
- }
- }
- },
"wikipedia": {
- "question": "Qual é a entidade Wikidata correspondente?",
"mappings": {
"0": {
"then": "Ainda não foi vinculada nenhuma página da Wikipédia"
}
- }
+ },
+ "question": "Qual é a entidade Wikidata correspondente?"
+ },
+ "wikipedialink": {
+ "mappings": {
+ "0": {
+ "then": "Não vinculado à Wikipédia"
+ }
+ },
+ "question": "Qual é o item correspondente na Wikipédia?"
}
}
-}
+}
\ No newline at end of file
diff --git a/langs/themes/de.json b/langs/themes/de.json
index 105fdb9fc5..e01564288a 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -318,6 +318,18 @@
}
},
"tagRenderings": {
+ "Bolts": {
+ "mappings": {
+ "0": {
+ "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
+ },
+ "1": {
+ "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
+ }
+ },
+ "question": "Wie viele Haken gibt es auf dieser Kletterroute bevor der Umlenker bzw. Standhaken erreicht ist?",
+ "render": "Diese Kletterroute hat {climbing:bolts} Haken"
+ },
"Difficulty": {
"question": "Wie hoch ist der Schwierigkeitsgrad dieser Kletterroute nach dem französisch/belgischen System?",
"render": "Die Schwierigkeit ist {climbing:grade:french} entsprechend des französisch/belgischen Systems"
@@ -334,18 +346,6 @@
},
"question": "Wie heißt diese Kletterroute?",
"render": "{name}"
- },
- "Bolts": {
- "render": "Diese Kletterroute hat {climbing:bolts} Haken",
- "question": "Wie viele Haken gibt es auf dieser Kletterroute bevor der Umlenker bzw. Standhaken erreicht ist?",
- "mappings": {
- "1": {
- "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
- },
- "0": {
- "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
- }
- }
}
},
"title": {
@@ -646,8 +646,6 @@
},
"etymology": {
"description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.
Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.",
- "shortDescription": "Was ist der Ursprung eines Ortsnamens?",
- "title": "Open Etymology Map",
"layers": {
"1": {
"override": {
@@ -659,7 +657,9 @@
"name": "Parks und Waldflächen ohne Informationen zur Namensherkunft"
}
}
- }
+ },
+ "shortDescription": "Was ist der Ursprung eines Ortsnamens?",
+ "title": "Open Etymology Map"
},
"facadegardens": {
"layers": {
@@ -963,10 +963,31 @@
}
}
},
+ "maps": {
+ "title": "Eine Karte der Karten"
+ },
+ "natuurpunt": {
+ "shortDescription": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt",
+ "title": "Naturschutzgebiete"
+ },
+ "observation_towers": {
+ "description": "Öffentlich zugänglicher Aussichtsturm",
+ "shortDescription": "Öffentlich zugänglicher Aussichtsturm",
+ "title": "Aussichtstürme"
+ },
"openwindpowermap": {
"description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen.",
"layers": {
"0": {
+ "name": "Windrad",
+ "presets": {
+ "0": {
+ "title": "Windrad"
+ }
+ },
+ "title": {
+ "render": "Windrad"
+ },
"units": {
"0": {
"applicableUnits": {
@@ -991,40 +1012,40 @@
}
}
}
- },
- "title": {
- "render": "Windrad"
- },
- "name": "Windrad",
- "presets": {
- "0": {
- "title": "Windrad"
- }
}
}
},
"title": "OpenWindPowerMap"
},
+ "parkings": {
+ "description": "Diese Karte zeigt Parkplätze",
+ "shortDescription": "Diese Karte zeigt Parkplätze",
+ "title": "Parken"
+ },
"personal": {
"description": "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen",
"title": "Persönliches Thema"
},
+ "playgrounds": {
+ "shortDescription": "Eine Karte mit Spielplätzen",
+ "title": "Spielpläzte"
+ },
"postboxes": {
"layers": {
- "1": {
- "description": "Eine Ebene mit Postämtern.",
- "tagRenderings": {
- "OH": {
- "mappings": {
- "0": {
- "then": "durchgehend geöffnet (auch an Feiertagen)"
- }
- }
+ "0": {
+ "description": "Die Ebene zeigt Briefkästen.",
+ "name": "Brieflästen",
+ "presets": {
+ "0": {
+ "title": "Briefkasten"
}
},
"title": {
- "render": "Poststelle"
- },
+ "render": "Briefkasten"
+ }
+ },
+ "1": {
+ "description": "Eine Ebene mit Postämtern.",
"filter": {
"0": {
"options": {
@@ -1039,19 +1060,19 @@
"0": {
"title": "Poststelle"
}
- }
- },
- "0": {
- "name": "Brieflästen",
- "presets": {
- "0": {
- "title": "Briefkasten"
+ },
+ "tagRenderings": {
+ "OH": {
+ "mappings": {
+ "0": {
+ "then": "durchgehend geöffnet (auch an Feiertagen)"
+ }
+ }
}
},
"title": {
- "render": "Briefkasten"
- },
- "description": "Die Ebene zeigt Briefkästen."
+ "render": "Poststelle"
+ }
}
},
"shortDescription": "Eine Karte die Briefkästen und Poststellen anzeigt",
@@ -1110,37 +1131,16 @@
}
},
"shortDescription": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen",
- "title": "Adressen in Großbritannien",
"tileLayerSources": {
"0": {
"name": "Grenzverläufe gemäß osmuk.org"
}
- }
+ },
+ "title": "Adressen in Großbritannien"
},
"waste_basket": {
"description": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen",
"shortDescription": "Eine Karte mit Abfalleimern",
"title": "Abfalleimer"
- },
- "maps": {
- "title": "Eine Karte der Karten"
- },
- "playgrounds": {
- "title": "Spielpläzte",
- "shortDescription": "Eine Karte mit Spielplätzen"
- },
- "parkings": {
- "title": "Parken",
- "shortDescription": "Diese Karte zeigt Parkplätze",
- "description": "Diese Karte zeigt Parkplätze"
- },
- "natuurpunt": {
- "title": "Naturschutzgebiete",
- "shortDescription": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt"
- },
- "observation_towers": {
- "title": "Aussichtstürme",
- "description": "Öffentlich zugänglicher Aussichtsturm",
- "shortDescription": "Öffentlich zugänglicher Aussichtsturm"
}
-}
+}
\ No newline at end of file
From 9dc8404c438e0abdd0c2ebccf1e0a472115864b1 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 21:50:38 +0200
Subject: [PATCH 49/58] No more need to add '.clone()' for compiled
translations, removed a bunch of 'clones'
---
UI/BigComponents/FilterView.ts | 24 ++++++----------
UI/BigComponents/FullWelcomePaneWithTabs.ts | 6 ++--
UI/BigComponents/MoreScreen.ts | 7 ++---
UI/Popup/FeatureInfoBox.ts | 4 +--
UI/Popup/MoveWizard.ts | 32 ++++++++++-----------
UI/Popup/TagRenderingQuestion.ts | 18 ++++++++----
UI/i18n/Translations.ts | 10 ++-----
scripts/generateTranslations.ts | 16 +++++++----
8 files changed, 56 insertions(+), 61 deletions(-)
diff --git a/UI/BigComponents/FilterView.ts b/UI/BigComponents/FilterView.ts
index d8a46d517a..71506c398e 100644
--- a/UI/BigComponents/FilterView.ts
+++ b/UI/BigComponents/FilterView.ts
@@ -40,20 +40,16 @@ export default class FilterView extends VariableUiElement {
const iconUnselected = new Combine([Svg.checkbox_empty]).SetStyle(
iconStyle
);
- const name: Translation = config.config.name.Clone();
+ const name: Translation = config.config.name;
- const styledNameChecked = name
- .Clone()
- .SetStyle("font-size:large;padding-left:1.25rem");
+ const styledNameChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
- const styledNameUnChecked = name
- .Clone()
- .SetStyle("font-size:large;padding-left:1.25rem");
+ const styledNameUnChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
const zoomStatus =
new Toggle(
undefined,
- Translations.t.general.layerSelection.zoomInToSeeThisLayer.Clone()
+ Translations.t.general.layerSelection.zoomInToSeeThisLayer
.SetClass("alert")
.SetStyle("display: block ruby;width:min-content;"),
State.state.locationControl.map(location => location.zoom >= config.config.minzoom)
@@ -97,20 +93,16 @@ export default class FilterView extends VariableUiElement {
const name: Translation = Translations.WT(
filteredLayer.layerDef.name
- )?.Clone();
+ );
- const styledNameChecked = name
- .Clone()
- .SetStyle("font-size:large;padding-left:1.25rem");
+ const styledNameChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
- const styledNameUnChecked = name
- .Clone()
- .SetStyle("font-size:large;padding-left:1.25rem");
+ const styledNameUnChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
const zoomStatus =
new Toggle(
undefined,
- Translations.t.general.layerSelection.zoomInToSeeThisLayer.Clone()
+ Translations.t.general.layerSelection.zoomInToSeeThisLayer
.SetClass("alert")
.SetStyle("display: block ruby;width:min-content;"),
State.state.locationControl.map(location => location.zoom >= filteredLayer.layerDef.minzoom)
diff --git a/UI/BigComponents/FullWelcomePaneWithTabs.ts b/UI/BigComponents/FullWelcomePaneWithTabs.ts
index 10ab25de5b..7e2b4d8fbf 100644
--- a/UI/BigComponents/FullWelcomePaneWithTabs.ts
+++ b/UI/BigComponents/FullWelcomePaneWithTabs.ts
@@ -50,7 +50,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
{header: ``, content: welcome},
{
header: Svg.osm_logo_img,
- content: Translations.t.general.openStreetMapIntro.Clone().SetClass("link-underline")
+ content: Translations.t.general.openStreetMapIntro.SetClass("link-underline")
},
]
@@ -64,7 +64,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
header: Svg.add_img,
content:
new Combine([
- Translations.t.general.morescreen.intro.Clone(),
+ Translations.t.general.morescreen.intro,
new MoreScreen(state)
]).SetClass("flex flex-col")
});
@@ -86,7 +86,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
tabsWithAboutMc.push({
header: Svg.help,
- content: new Combine([Translations.t.general.aboutMapcomplete.Clone()
+ content: new Combine([Translations.t.general.aboutMapcomplete
.Subs({"osmcha_link": Utils.OsmChaLinkFor(7)}), " Version " + Constants.vNumber])
.SetClass("link-underline")
}
diff --git a/UI/BigComponents/MoreScreen.ts b/UI/BigComponents/MoreScreen.ts
index c59766f288..84475d3bef 100644
--- a/UI/BigComponents/MoreScreen.ts
+++ b/UI/BigComponents/MoreScreen.ts
@@ -6,8 +6,6 @@ import {SubtleButton} from "../Base/SubtleButton";
import Translations from "../i18n/Translations";
import * as personal from "../../assets/themes/personal/personal.json"
import Constants from "../../Models/Constants";
-import LanguagePicker from "../LanguagePicker";
-import IndexText from "./IndexText";
import BaseUIElement from "../BaseUIElement";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import {UIEventSource} from "../../Logic/UIEventSource";
@@ -201,14 +199,13 @@ export default class MoreScreen extends Combine {
}) ?? new UIEventSource(`${linkPrefix}${linkSuffix}`)
- let description = Translations.WT(layout.shortDescription).Clone();
return new SubtleButton(layout.icon,
new Combine([
`
heeft een spanning van {socket:bosch_5pin:voltage} volt"
- },
- "freeform": {
- "key": "socket:bosch_5pin:voltage",
- "type": "pfloat"
- },
- "mappings": [],
- "condition": {
- "and": [
- "socket:bosch_5pin~*",
- "socket:bosch_5pin!=0"
- ]
- }
- },
- {
- "id": "current-15",
- "question": {
- "en": "What current do the plugs with
Bosch Active Connect with 5 pins and cable
offer?",
- "nl": "Welke stroom levert de stekker van type
Bosch Active Connect met 5 pinnen aan een kabel
?"
- },
- "render": {
- "en": "
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:current}A",
- "nl": "
Bosch Active Connect met 5 pinnen aan een kabel
levert een stroom van maximaal {socket:bosch_5pin:current}A"
- },
- "freeform": {
- "key": "socket:bosch_5pin:current",
- "type": "pfloat"
- },
- "mappings": [],
- "condition": {
- "and": [
- "socket:bosch_5pin~*",
- "socket:bosch_5pin!=0"
- ]
- }
- },
- {
- "id": "power-output-15",
- "question": {
- "en": "What power output does a single plug of type
Bosch Active Connect with 5 pins and cable
offer?",
- "nl": "Welk vermogen levert een enkele stekker van type
Bosch Active Connect met 5 pinnen aan een kabel
?"
- },
- "render": {
- "en": "
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:output}",
- "nl": "
Bosch Active Connect met 5 pinnen aan een kabel
levert een vermogen van maximaal {socket:bosch_5pin:output}"
- },
- "freeform": {
- "key": "socket:bosch_5pin:output",
- "type": "pfloat"
- },
- "mappings": [],
- "condition": {
- "and": [
- "socket:bosch_5pin~*",
- "socket:bosch_5pin!=0"
- ]
- }
- },
{
"id": "Authentication",
"question": {
"en": "What kind of authentication is available at the charging station?",
- "it": "Quali sono gli orari di apertura di questa stazione di ricarica?",
- "ja": "この充電ステーションはいつオープンしますか?",
- "nb_NO": "Når åpnet denne ladestasjonen?",
- "ru": "В какое время работает эта зарядная станция?",
- "zh_Hant": "何時是充電站開放使用的時間?",
+ "nl": "Hoe kan men zich aanmelden aan dit oplaadstation?",
"de": "Welche Authentifizierung ist an der Ladestation möglich?"
},
"multiAnswer": true,
@@ -2846,6 +1244,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"
}
},
@@ -2854,6 +1253,7 @@
"ifnot": "authentication:app=no",
"then": {
"en": "Authentication by an app",
+ "nl": "Aanmelden via een applicatie is mogelijk",
"de": "Authentifizierung durch eine App"
}
},
@@ -2862,6 +1262,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"
}
},
@@ -2870,6 +1271,7 @@
"ifnot": "authentication:short_message=no",
"then": {
"en": "Authentication via phone call is available",
+ "nl": "Aanmelden via SMS is mogelijk",
"de": "Authentifizierung per Anruf ist möglich"
}
},
@@ -2878,6 +1280,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"
}
},
@@ -2886,6 +1289,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"
}
},
@@ -2894,6 +1298,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"
}
},
@@ -2902,6 +1307,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"
}
}
@@ -2911,19 +1317,12 @@
"id": "Auth phone",
"render": {
"en": "Authenticate by calling or SMS'ing to {authentication:phone_call:number}",
- "it": "{network}",
- "ja": "{network}",
- "nb_NO": "{network}",
- "ru": "{network}",
- "zh_Hant": "{network}",
+ "nl": "Aanmelden door te bellen of te SMS'en naar {authentication:phone_call:number}",
"de": "Authentifizierung durch Anruf oder SMS an {authentication:phone_call:number}"
},
"question": {
"en": "What's the phone number for authentication call or SMS?",
- "it": "A quale rete appartiene questa stazione di ricarica?",
- "ja": "この充電ステーションの運営チェーンはどこですか?",
- "ru": "К какой сети относится эта станция?",
- "zh_Hant": "充電站所屬的網路是?",
+ "nl": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?",
"de": "Wie lautet die Telefonnummer für den Authentifizierungsanruf oder die SMS?"
},
"freeform": {
@@ -2935,26 +1334,6 @@
"authentication:phone_call=yes",
"authentication:short_message=yes"
]
- },
- "it": {
- "0": {
- "then": "Non appartiene a una rete"
- }
- },
- "ja": {
- "0": {
- "then": "大規模な運営チェーンの一部ではない"
- }
- },
- "ru": {
- "0": {
- "then": "Не является частью более крупной сети"
- }
- },
- "zh_Hant": {
- "0": {
- "then": "不屬於大型網路"
- }
}
},
{
@@ -2966,13 +1345,20 @@
},
"question": {
"en": "When is this charging station opened?",
- "de": "Wann ist diese Ladestation geöffnet?"
+ "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": "何時是充電站開放使用的時間?"
},
"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)"
}
}
@@ -3074,11 +1460,20 @@
"id": "Network",
"render": {
"en": "Part of the network {network}",
- "de": "Teil des Netzwerks {network}"
+ "de": "Teil des Netzwerks {network}",
+ "it": "{network}",
+ "ja": "{network}",
+ "nb_NO": "{network}",
+ "ru": "{network}",
+ "zh_Hant": "{network}"
},
"question": {
"en": "Is this charging station part of a network?",
- "de": "Ist diese Ladestation Teil eines Netzwerks?"
+ "de": "Ist diese Ladestation Teil eines Netzwerks?",
+ "it": "A quale rete appartiene questa stazione di ricarica?",
+ "ja": "この充電ステーションの運営チェーンはどこですか?",
+ "ru": "К какой сети относится эта станция?",
+ "zh_Hant": "充電站所屬的網路是?"
},
"freeform": {
"key": "network"
@@ -3198,6 +1593,7 @@
},
"render": {
"en": "Reference number is {ref}",
+ "nl": "Het referentienummer van dit oplaadpunt is {ref}",
"de": "Die Kennziffer ist {ref}"
},
"freeform": {
@@ -3295,7 +1691,16 @@
"de": "Beim Laden ist eine zusätzliche Parkgebühr zu entrichten"
}
}
- ]
+ ],
+ "condition": {
+ "or": [
+ "motor_vehicle=yes",
+ "hgv=yes",
+ "bus=yes",
+ "bicycle=no",
+ "bicycle="
+ ]
+ }
}
],
"icon": {
@@ -3604,8 +2009,8 @@
"humanSingular": {
"en": " hour",
"nl": " uur",
- "ru": " час",
- "de": " Stunde"
+ "de": " Stunde",
+ "ru": " час"
}
},
{
@@ -3625,8 +2030,8 @@
"humanSingular": {
"en": " day",
"nl": " dag",
- "ru": " день",
- "de": " Tag"
+ "de": " Tag",
+ "ru": " день"
}
}
]
@@ -3663,8 +2068,8 @@
"human": {
"en": "Volts",
"nl": "volt",
- "ru": "Вольт",
- "de": "Volt"
+ "de": "Volt",
+ "ru": "Вольт"
}
}
],
@@ -3734,8 +2139,8 @@
"human": {
"en": "kilowatt",
"nl": "kilowatt",
- "ru": "киловатт",
- "de": "Kilowatt"
+ "de": "Kilowatt",
+ "ru": "киловатт"
}
},
{
@@ -3746,12 +2151,25 @@
"human": {
"en": "megawatt",
"nl": "megawatt",
- "ru": "мегаватт",
- "de": "Megawatt"
+ "de": "Megawatt",
+ "ru": "мегаватт"
}
}
],
"eraseInvalidValues": true
}
- ]
+ ],
+ "allowMove": {
+ "enableRelocation": false,
+ "enableImproveAccuracy": true
+ },
+ "deletion": {
+ "softDeletionTags": {
+ "and": [
+ "amenity=",
+ "disused:amenity=charging_station"
+ ]
+ },
+ "neededChangesets": 10
+ }
}
\ No newline at end of file
diff --git a/assets/layers/charging_station/charging_station.protojson b/assets/layers/charging_station/charging_station.protojson
index 955245640e..84e54298f6 100644
--- a/assets/layers/charging_station/charging_station.protojson
+++ b/assets/layers/charging_station/charging_station.protojson
@@ -2,11 +2,7 @@
"id": "charging_station",
"name": {
"en": "Charging stations",
- "it": "Stazioni di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "Ladestasjoner",
- "ru": "Зарядные станции",
- "zh_Hant": "充電站"
+ "nl": "Oplaadpunten"
},
"minzoom": 10,
"source": {
@@ -22,27 +18,21 @@
"title": {
"render": {
"en": "Charging station",
- "it": "Stazione di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "Ladestasjon",
- "ru": "Зарядная станция",
- "zh_Hant": "充電站"
+ "nl": "Oplaadpunten"
}
},
"description": {
"en": "A charging station",
- "it": "Una stazione di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "En ladestasjon",
- "ru": "Зарядная станция",
- "zh_Hant": "充電站"
+ "nl": "Oplaadpunten"
},
"tagRenderings": [
"images",
{
"id": "Type",
+ "#": "Allowed vehicle types",
"question": {
- "en": "Which vehicles are allowed to charge here?"
+ "en": "Which vehicles are allowed to charge here?",
+ "nl": "Welke voertuigen kunnen hier opgeladen worden?"
},
"multiAnswer": true,
"mappings": [
@@ -50,35 +40,40 @@
"if": "bicycle=yes",
"ifnot": "bicycle=no",
"then": {
- "en": "bicycles can be charged here"
+ "en": "Bcycles can be charged here",
+ "nl": "Fietsen kunnen hier opgeladen worden"
}
},
{
"if": "motorcar=yes",
"ifnot": "motorcar=no",
"then": {
- "en": "Cars can be charged here"
+ "en": "Cars can be charged here",
+ "nl": "Elektrische auto's kunnen hier opgeladen worden"
}
},
{
"if": "scooter=yes",
"ifnot": "scooter=no",
"then": {
- "en": "Scooters can be charged here"
+ "en": "Scooters can be charged here",
+ "nl": "Electrische scooters (snorfiets of bromfiets) kunnen hier opgeladen worden"
}
},
{
"if": "hgv=yes",
"ifnot": "hgv=no",
"then": {
- "en": "Heavy good vehicles (such as trucks) can be charged here"
+ "en": "Heavy good vehicles (such as trucks) can be charged here",
+ "nl": "Vrachtwagens kunnen hier opgeladen worden"
}
},
{
"if": "bus=yes",
"ifnot": "bus=no",
"then": {
- "en": "Buses can be charged here"
+ "en": "Buses can be charged here",
+ "nl": "Bussen kunnen hier opgeladen worden"
}
}
]
@@ -86,10 +81,12 @@
{
"id": "access",
"question": {
- "en": "Who is allowed to use this charging station?"
+ "en": "Who is allowed to use this charging station?",
+ "nl": "Wie mag er dit oplaadpunt gebruiken?"
},
"render": {
- "en": "Access is {access}"
+ "en": "Access is {access}",
+ "nl": "Toegang voor {access}"
},
"freeform": {
"key": "access",
@@ -100,7 +97,10 @@
"mappings": [
{
"if": "access=yes",
- "then": "Anyone can use this charging station (payment might be needed)"
+ "then": {
+ "en":"Anyone can use this charging station (payment might be needed)",
+ "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
+ }
},
{
"if": {
@@ -109,16 +109,25 @@
"access=public"
]
},
- "then": "Anyone can use this charging station (payment might be needed)",
+ "then": {
+ "en":"Anyone can use this charging station (payment might be needed)",
+ "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
+ },
"hideInAnswer": true
},
{
"if": "access=customers",
- "then": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests "
+ "then": {
+ "en": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests",
+ "nl": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken Bijvoorbeeld een oplaadpunt op de parking van een restaurant dat enkel door klanten van het restaurant gebruikt mag worden"
+ }
},
{
"if": "access=private",
- "then": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)"
+ "then": {
+ "en":"Not accessible to the general public (e.g. only accessible to the owners, employees, ...)",
+ "nl": "Niet toegankelijk voor het publiek Enkel toegankelijk voor de eigenaar, medewerkers ,... "
+ }
}
]
},
@@ -142,11 +151,7 @@
"id": "Authentication",
"question": {
"en": "What kind of authentication is available at the charging station?",
- "it": "Quali sono gli orari di apertura di questa stazione di ricarica?",
- "ja": "この充電ステーションはいつオープンしますか?",
- "nb_NO": "Når åpnet denne ladestasjonen?",
- "ru": "В какое время работает эта зарядная станция?",
- "zh_Hant": "何時是充電站開放使用的時間?"
+ "nl": "Hoe kan men zich aanmelden aan dit oplaadstation?"
},
"multiAnswer": true,
"mappings": [
@@ -154,56 +159,64 @@
"if": "authentication:membership_card=yes",
"ifnot": "authentication:membership_card=no",
"then": {
- "en": "Authentication by a membership card"
+ "en": "Authentication by a membership card",
+ "nl": "Aanmelden met een lidkaart is mogelijk"
}
},
{
"if": "authentication:app=yes",
"ifnot": "authentication:app=no",
"then": {
- "en": "Authentication by an app"
+ "en": "Authentication by an app",
+ "nl": "Aanmelden via een applicatie is mogelijk"
}
},
{
"if": "authentication:phone_call=yes",
"ifnot": "authentication:phone_call=no",
"then": {
- "en": "Authentication via phone call is available"
+ "en": "Authentication via phone call is available",
+ "nl": "Aanmelden door te bellen naar een telefoonnummer is mogelijk"
}
},
{
"if": "authentication:short_message=yes",
"ifnot": "authentication:short_message=no",
"then": {
- "en": "Authentication via phone call is available"
+ "en": "Authentication via SMS is available",
+ "nl": "Aanmelden via SMS is mogelijk"
}
},
{
"if": "authentication:nfc=yes",
"ifnot": "authentication:nfc=no",
"then": {
- "en": "Authentication via NFC is available"
+ "en": "Authentication via NFC is available",
+ "nl": "Aanmelden via NFC is mogelijk"
}
},
{
"if": "authentication:money_card=yes",
"ifnot": "authentication:money_card=no",
"then": {
- "en": "Authentication via Money Card is available"
+ "en": "Authentication via Money Card is available",
+ "nl": "Aanmelden met Money Card is mogelijk"
}
},
{
"if": "authentication:debit_card=yes",
"ifnot": "authentication:debit_card=no",
"then": {
- "en": "Authentication via debit card is available"
+ "en": "Authentication via debit card is available",
+ "nl": "Aanmelden met een betaalkaart is mogelijk"
}
},
{
"if": "authentication:none=yes",
"ifnot": "authentication:none=no",
"then": {
- "en": "Charging here is (also) possible without authentication"
+ "en": "Charging here is (also) possible without authentication",
+ "nl": "Hier opladen is (ook) mogelijk zonder aan te melden"
}
}
]
@@ -212,18 +225,12 @@
"id": "Auth phone",
"render": {
"en": "Authenticate by calling or SMS'ing to {authentication:phone_call:number}",
- "it": "{network}",
- "ja": "{network}",
- "nb_NO": "{network}",
- "ru": "{network}",
- "zh_Hant": "{network}"
+ "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?",
- "it": "A quale rete appartiene questa stazione di ricarica?",
- "ja": "この充電ステーションの運営チェーンはどこですか?",
- "ru": "К какой сети относится эта станция?",
- "zh_Hant": "充電站所屬的網路是?"
+ "nl": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?"
},
"freeform": {
"key": "authentication:phone_call:number",
@@ -234,26 +241,6 @@
"authentication:phone_call=yes",
"authentication:short_message=yes"
]
- },
- "it": {
- "0": {
- "then": "Non appartiene a una rete"
- }
- },
- "ja": {
- "0": {
- "then": "大規模な運営チェーンの一部ではない"
- }
- },
- "ru": {
- "0": {
- "then": "Не является частью более крупной сети"
- }
- },
- "zh_Hant": {
- "0": {
- "then": "不屬於大型網路"
- }
}
},
{
@@ -264,13 +251,15 @@
"type": "opening_hours"
},
"question": {
- "en": "When is this charging station opened?"
+ "en": "When is this charging station opened?",
+ "nl": "Wanneer is dit oplaadpunt beschikbaar??"
},
"mappings": [
{
"if": "opening_hours=24/7",
"then": {
- "en": "24/7 opened (including holidays)"
+ "en": "24/7 opened (including holidays)",
+ "nl": "24/7 open - ook tijdens vakanties"
}
}
]
@@ -472,7 +461,8 @@
"en": "What is the reference number of this charging station?"
},
"render": {
- "en": "Reference number is {ref}"
+ "en": "Reference number is {ref}",
+ "nl": "Het referentienummer van dit oplaadpunt is {ref}"
},
"freeform": {
"key": "ref"
@@ -557,7 +547,16 @@
"en": "An additional parking fee should be paid while charging"
}
}
- ]
+ ],
+ "condition": {
+ "or": [
+ "motor_vehicle=yes",
+ "hgv=yes",
+ "bus=yes",
+ "bicycle=no",
+ "bicycle="
+ ]
+ }
}
],
"icon": {
diff --git a/assets/layers/charging_station/csvToJson.ts b/assets/layers/charging_station/csvToJson.ts
index c630297c01..d781d33e7c 100644
--- a/assets/layers/charging_station/csvToJson.ts
+++ b/assets/layers/charging_station/csvToJson.ts
@@ -56,6 +56,7 @@ function run(file, protojson) {
const overview_question_answers = []
const questions: (TagRenderingConfigJson & { "id": string })[] = []
+ const technicalQuestions: (TagRenderingConfigJson & { "id": string })[] = []
const filterOptions: { question: any, osmTags?: string } [] = [
{
question: {
@@ -149,7 +150,7 @@ function run(file, protojson) {
}
})
- questions.push({
+ technicalQuestions.push({
"id": "voltage-" + i,
question: {
en: `What voltage do the plugs with ${descrWithImage_en} offer?`,
@@ -178,7 +179,7 @@ function run(file, protojson) {
})
- questions.push({
+ technicalQuestions.push({
"id": "current-" + i,
question: {
en: `What current do the plugs with ${descrWithImage_en} offer?`,
@@ -207,7 +208,7 @@ function run(file, protojson) {
})
- questions.push({
+ technicalQuestions.push({
"id": "power-output-" + i,
question: {
en: `What power output does a single plug of type ${descrWithImage_en} offer?`,
@@ -247,7 +248,8 @@ function run(file, protojson) {
const toggles = {
"id": "Available_charging_stations (generated)",
"question": {
- "en": "Which charging stations are available here?"
+ "en": "Which charging connections are available here?",
+ "nl": "Welke aansluitingen zijn hier beschikbaar?"
},
"multiAnswer": true,
"mappings": overview_question_answers
diff --git a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json
index 733b94d9f8..911cf7ac91 100644
--- a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json
+++ b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json
@@ -7,6 +7,9 @@
"en",
"nl"
],
+ "mustHaveLanguage": [
+ "nl"
+ ],
"title": {
"nl": "Toeristisch relevante info"
},
diff --git a/langs/layers/en.json b/langs/layers/en.json
index f32bf146e1..3c5dae71ab 100644
--- a/langs/layers/en.json
+++ b/langs/layers/en.json
@@ -1227,6 +1227,20 @@
"question": "Which vehicles are allowed to charge here?"
},
"access": {
+ "mappings": {
+ "0": {
+ "then": "Anyone can use this charging station (payment might be needed)"
+ },
+ "1": {
+ "then": "Anyone can use this charging station (payment might be needed)"
+ },
+ "2": {
+ "then": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests"
+ },
+ "3": {
+ "then": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)"
+ }
+ },
"question": "Who is allowed to use this charging station?",
"render": "Access is {access}"
},
@@ -1234,167 +1248,6 @@
"question": "How much vehicles can be charged here at the same time?",
"render": "{capacity} vehicles can be charged here at the same time"
},
- "current-0": {
- "mappings": {
- "0": {
- "then": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most 16 A"
- }
- },
- "question": "What current do the plugs with
Schuko wall plug without ground pin (CEE7/4 type F)
offer?",
- "render": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most {socket:schuko:current}A"
- },
- "current-1": {
- "mappings": {
- "0": {
- "then": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most 16 A"
- }
- },
- "question": "What current do the plugs with
European wall plug with ground pin (CEE7/4 type E)
offer?",
- "render": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most {socket:typee:current}A"
- },
- "current-10": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most 125 A"
- },
- "1": {
- "then": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most 350 A"
- }
- },
- "question": "What current do the plugs with
Tesla Supercharger CCS (a branded type2_css)
offer?",
- "render": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most {socket:tesla_supercharger_ccs:current}A"
- },
- "current-11": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger (destination)
outputs at most 125 A"
- },
- "1": {
- "then": "
Tesla Supercharger (destination)
outputs at most 350 A"
- }
- },
- "question": "What current do the plugs with
Tesla Supercharger (destination)
offer?",
- "render": "
Tesla Supercharger (destination)
outputs at most {socket:tesla_destination:current}A"
- },
- "current-12": {
- "mappings": {
- "0": {
- "then": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 16 A"
- },
- "1": {
- "then": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 32 A"
- }
- },
- "question": "What current do the plugs with
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
offer?",
- "render": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most {socket:tesla_destination:current}A"
- },
- "current-13": {
- "mappings": {
- "0": {
- "then": "
USB to charge phones and small electronics
outputs at most 1 A"
- },
- "1": {
- "then": "
USB to charge phones and small electronics
outputs at most 2 A"
- }
- },
- "question": "What current do the plugs with
USB to charge phones and small electronics
offer?",
- "render": "
USB to charge phones and small electronics
outputs at most {socket:USB-A:current}A"
- },
- "current-14": {
- "question": "What current do the plugs with
Bosch Active Connect with 3 pins and cable
offer?",
- "render": "
Bosch Active Connect with 3 pins and cable
outputs at most {socket:bosch_3pin:current}A"
- },
- "current-15": {
- "question": "What current do the plugs with
Bosch Active Connect with 5 pins and cable
offer?",
- "render": "
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:current}A"
- },
- "current-2": {
- "mappings": {
- "0": {
- "then": "
Chademo
outputs at most 120 A"
- }
- },
- "question": "What current do the plugs with
Chademo
offer?",
- "render": "
Chademo
outputs at most {socket:chademo:current}A"
- },
- "current-3": {
- "mappings": {
- "0": {
- "then": "
Type 1 with cable (J1772)
outputs at most 32 A"
- }
- },
- "question": "What current do the plugs with
Type 1 with cable (J1772)
offer?",
- "render": "
Type 1 with cable (J1772)
outputs at most {socket:type1_cable:current}A"
- },
- "current-4": {
- "mappings": {
- "0": {
- "then": "
Type 1 without cable (J1772)
outputs at most 32 A"
- }
- },
- "question": "What current do the plugs with
Type 1 without cable (J1772)
offer?",
- "render": "
Type 1 without cable (J1772)
outputs at most {socket:type1:current}A"
- },
- "current-5": {
- "mappings": {
- "0": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 50 A"
- },
- "1": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 125 A"
- }
- },
- "question": "What current do the plugs with
Type 1 CCS (aka Type 1 Combo)
offer?",
- "render": "
Type 1 CCS (aka Type 1 Combo)
outputs at most {socket:type1_combo:current}A"
- },
- "current-6": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger
outputs at most 125 A"
- },
- "1": {
- "then": "
Tesla Supercharger
outputs at most 350 A"
- }
- },
- "question": "What current do the plugs with
Tesla Supercharger
offer?",
- "render": "
Tesla Supercharger
outputs at most {socket:tesla_supercharger:current}A"
- },
- "current-7": {
- "mappings": {
- "0": {
- "then": "
Type 2 (mennekes)
outputs at most 16 A"
- },
- "1": {
- "then": "
Type 2 (mennekes)
outputs at most 32 A"
- }
- },
- "question": "What current do the plugs with
Type 2 (mennekes)
offer?",
- "render": "
Type 2 (mennekes)
outputs at most {socket:type2:current}A"
- },
- "current-8": {
- "mappings": {
- "0": {
- "then": "
Type 2 CCS (mennekes)
outputs at most 125 A"
- },
- "1": {
- "then": "
Type 2 CCS (mennekes)
outputs at most 350 A"
- }
- },
- "question": "What current do the plugs with
Type 2 CCS (mennekes)
offer?",
- "render": "
Type 2 CCS (mennekes)
outputs at most {socket:type2_combo:current}A"
- },
- "current-9": {
- "mappings": {
- "0": {
- "then": "
Type 2 with cable (mennekes)
outputs at most 16 A"
- },
- "1": {
- "then": "
Type 2 with cable (mennekes)
outputs at most 32 A"
- }
- },
- "question": "What current do the plugs with
Type 2 with cable (mennekes)
offer?",
- "render": "
Type 2 with cable (mennekes)
outputs at most {socket:type2_cable:current}A"
- },
"email": {
"question": "What is the email address of the operator?",
"render": "In case of problems, send an email to {email}"
@@ -1497,350 +1350,10 @@
"question": "How much plugs of type
Type 2 with cable (mennekes)
are available here?",
"render": "There are {socket:type2_cable} plugs of type
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most 3.6 kw"
- }
- },
- "question": "What power output does a single plug of type
Schuko wall plug without ground pin (CEE7/4 type F)
offer?",
- "render": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most {socket:schuko:output}"
- },
- "power-output-1": {
- "mappings": {
- "0": {
- "then": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most 3 kw"
- },
- "1": {
- "then": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most 22 kw"
- }
- },
- "question": "What power output does a single plug of type
European wall plug with ground pin (CEE7/4 type E)
offer?",
- "render": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most {socket:typee:output}"
- },
- "power-output-10": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most 50 kw"
- }
- },
- "question": "What power output does a single plug of type
Tesla Supercharger CCS (a branded type2_css)
offer?",
- "render": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most {socket:tesla_supercharger_ccs:output}"
- },
- "power-output-11": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger (destination)
outputs at most 120 kw"
- },
- "1": {
- "then": "
Tesla Supercharger (destination)
outputs at most 150 kw"
- },
- "2": {
- "then": "
Tesla Supercharger (destination)
outputs at most 250 kw"
- }
- },
- "question": "What power output does a single plug of type
Tesla Supercharger (destination)
offer?",
- "render": "
Tesla Supercharger (destination)
outputs at most {socket:tesla_destination:output}"
- },
- "power-output-12": {
- "mappings": {
- "0": {
- "then": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 11 kw"
- },
- "1": {
- "then": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 22 kw"
- }
- },
- "question": "What power output does a single plug of type
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
offer?",
- "render": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most {socket:tesla_destination:output}"
- },
- "power-output-13": {
- "mappings": {
- "0": {
- "then": "
USB to charge phones and small electronics
outputs at most 5w"
- },
- "1": {
- "then": "
USB to charge phones and small electronics
outputs at most 10w"
- }
- },
- "question": "What power output does a single plug of type
USB to charge phones and small electronics
offer?",
- "render": "
USB to charge phones and small electronics
outputs at most {socket:USB-A:output}"
- },
- "power-output-14": {
- "question": "What power output does a single plug of type
Bosch Active Connect with 3 pins and cable
offer?",
- "render": "
Bosch Active Connect with 3 pins and cable
outputs at most {socket:bosch_3pin:output}"
- },
- "power-output-15": {
- "question": "What power output does a single plug of type
Bosch Active Connect with 5 pins and cable
offer?",
- "render": "
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:output}"
- },
- "power-output-2": {
- "mappings": {
- "0": {
- "then": "
Chademo
outputs at most 50 kw"
- }
- },
- "question": "What power output does a single plug of type
Chademo
offer?",
- "render": "
Chademo
outputs at most {socket:chademo:output}"
- },
- "power-output-3": {
- "mappings": {
- "0": {
- "then": "
Type 1 with cable (J1772)
outputs at most 3.7 kw"
- },
- "1": {
- "then": "
Type 1 with cable (J1772)
outputs at most 7 kw"
- }
- },
- "question": "What power output does a single plug of type
Type 1 with cable (J1772)
offer?",
- "render": "
Type 1 with cable (J1772)
outputs at most {socket:type1_cable:output}"
- },
- "power-output-4": {
- "mappings": {
- "0": {
- "then": "
Type 1 without cable (J1772)
outputs at most 3.7 kw"
- },
- "1": {
- "then": "
Type 1 without cable (J1772)
outputs at most 6.6 kw"
- },
- "2": {
- "then": "
Type 1 without cable (J1772)
outputs at most 7 kw"
- },
- "3": {
- "then": "
Type 1 without cable (J1772)
outputs at most 7.2 kw"
- }
- },
- "question": "What power output does a single plug of type
Type 1 without cable (J1772)
offer?",
- "render": "
Type 1 without cable (J1772)
outputs at most {socket:type1:output}"
- },
- "power-output-5": {
- "mappings": {
- "0": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 50 kw"
- },
- "1": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 62.5 kw"
- },
- "2": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 150 kw"
- },
- "3": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 350 kw"
- }
- },
- "question": "What power output does a single plug of type
Type 1 CCS (aka Type 1 Combo)
offer?",
- "render": "
Type 1 CCS (aka Type 1 Combo)
outputs at most {socket:type1_combo:output}"
- },
- "power-output-6": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger
outputs at most 120 kw"
- },
- "1": {
- "then": "
Tesla Supercharger
outputs at most 150 kw"
- },
- "2": {
- "then": "
Tesla Supercharger
outputs at most 250 kw"
- }
- },
- "question": "What power output does a single plug of type
Tesla Supercharger
offer?",
- "render": "
Tesla Supercharger
outputs at most {socket:tesla_supercharger:output}"
- },
- "power-output-7": {
- "mappings": {
- "0": {
- "then": "
Type 2 (mennekes)
outputs at most 11 kw"
- },
- "1": {
- "then": "
Type 2 (mennekes)
outputs at most 22 kw"
- }
- },
- "question": "What power output does a single plug of type
Type 2 (mennekes)
offer?",
- "render": "
Type 2 (mennekes)
outputs at most {socket:type2:output}"
- },
- "power-output-8": {
- "mappings": {
- "0": {
- "then": "
Type 2 CCS (mennekes)
outputs at most 50 kw"
- }
- },
- "question": "What power output does a single plug of type
Type 2 CCS (mennekes)
offer?",
- "render": "
Type 2 CCS (mennekes)
outputs at most {socket:type2_combo:output}"
- },
- "power-output-9": {
- "mappings": {
- "0": {
- "then": "
Type 2 with cable (mennekes)
outputs at most 11 kw"
- },
- "1": {
- "then": "
Type 2 with cable (mennekes)
outputs at most 22 kw"
- }
- },
- "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}"
- },
"ref": {
"question": "What is the reference number of this charging station?",
"render": "Reference number is {ref}"
},
- "voltage-0": {
- "mappings": {
- "0": {
- "then": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs 230 volt"
- }
- },
- "question": "What voltage do the plugs with
Schuko wall plug without ground pin (CEE7/4 type F)
offer?",
- "render": "
Schuko wall plug without ground pin (CEE7/4 type F)
levert een vermogen van maximaal 3.6 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Schuko stekker zonder aardingspin (CEE7/4 type F)
?",
- "render": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
levert een vermogen van maximaal {socket:schuko:output}"
- },
- "power-output-1": {
- "mappings": {
- "0": {
- "then": "
Europese stekker met aardingspin (CEE7/4 type E)
levert een vermogen van maximaal 3 kw"
- },
- "1": {
- "then": "
Europese stekker met aardingspin (CEE7/4 type E)
levert een vermogen van maximaal 22 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Europese stekker met aardingspin (CEE7/4 type E)
?",
- "render": "
Europese stekker met aardingspin (CEE7/4 type E)
levert een vermogen van maximaal {socket:typee:output}"
- },
- "power-output-10": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
levert een vermogen van maximaal 50 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
?",
- "render": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
levert een vermogen van maximaal {socket:tesla_supercharger_ccs:output}"
- },
- "power-output-11": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger (destination)
levert een vermogen van maximaal 120 kw"
- },
- "1": {
- "then": "
Tesla Supercharger (destination)
levert een vermogen van maximaal 150 kw"
- },
- "2": {
- "then": "
Tesla Supercharger (destination)
levert een vermogen van maximaal 250 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Tesla Supercharger (destination)
?",
- "render": "
Tesla Supercharger (destination)
levert een vermogen van maximaal {socket:tesla_destination:output}"
- },
- "power-output-12": {
- "mappings": {
- "0": {
- "then": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een vermogen van maximaal 11 kw"
- },
- "1": {
- "then": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een vermogen van maximaal 22 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
?",
- "render": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een vermogen van maximaal {socket:tesla_destination:output}"
- },
- "power-output-13": {
- "mappings": {
- "0": {
- "then": "
USB om GSMs en kleine electronica op te laden
levert een vermogen van maximaal 5w"
- },
- "1": {
- "then": "
USB om GSMs en kleine electronica op te laden
levert een vermogen van maximaal 10w"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
USB om GSMs en kleine electronica op te laden
?",
- "render": "
USB om GSMs en kleine electronica op te laden
levert een vermogen van maximaal {socket:USB-A:output}"
- },
- "power-output-14": {
- "question": "Welk vermogen levert een enkele stekker van type
Bosch Active Connect met 3 pinnen aan een kabel
?",
- "render": "
Bosch Active Connect met 3 pinnen aan een kabel
levert een vermogen van maximaal {socket:bosch_3pin:output}"
- },
- "power-output-15": {
- "question": "Welk vermogen levert een enkele stekker van type
Bosch Active Connect met 5 pinnen aan een kabel
?",
- "render": "
Bosch Active Connect met 5 pinnen aan een kabel
levert een vermogen van maximaal {socket:bosch_5pin:output}"
- },
- "power-output-2": {
- "mappings": {
- "0": {
- "then": "
Chademo
levert een vermogen van maximaal 50 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Chademo
?",
- "render": "
Chademo
levert een vermogen van maximaal {socket:chademo:output}"
- },
- "power-output-3": {
- "mappings": {
- "0": {
- "then": "
Type 1 met kabel (J1772)
levert een vermogen van maximaal 3.7 kw"
- },
- "1": {
- "then": "
Type 1 met kabel (J1772)
levert een vermogen van maximaal 7 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Type 1 met kabel (J1772)
?",
- "render": "
Type 1 met kabel (J1772)
levert een vermogen van maximaal {socket:type1_cable:output}"
- },
- "power-output-4": {
- "mappings": {
- "0": {
- "then": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 3.7 kw"
- },
- "1": {
- "then": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 6.6 kw"
- },
- "2": {
- "then": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 7 kw"
- },
- "3": {
- "then": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 7.2 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Type 1 zonder kabel (J1772)
?",
- "render": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal {socket:type1:output}"
- },
- "power-output-5": {
- "mappings": {
- "0": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 50 kw"
- },
- "1": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 62.5 kw"
- },
- "2": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 150 kw"
- },
- "3": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 350 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Type 1 CCS (ook gekend als Type 1 Combo)
?",
- "render": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal {socket:type1_combo:output}"
- },
- "power-output-6": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger
levert een vermogen van maximaal 120 kw"
- },
- "1": {
- "then": "
Tesla Supercharger
levert een vermogen van maximaal 150 kw"
- },
- "2": {
- "then": "
Tesla Supercharger
levert een vermogen van maximaal 250 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Tesla Supercharger
?",
- "render": "
Tesla Supercharger
levert een vermogen van maximaal {socket:tesla_supercharger:output}"
- },
- "power-output-7": {
- "mappings": {
- "0": {
- "then": "
Type 2 (mennekes)
levert een vermogen van maximaal 11 kw"
- },
- "1": {
- "then": "
Type 2 (mennekes)
levert een vermogen van maximaal 22 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Type 2 (mennekes)
?",
- "render": "
Type 2 (mennekes)
levert een vermogen van maximaal {socket:type2:output}"
- },
- "power-output-8": {
- "mappings": {
- "0": {
- "then": "
Type 2 CCS (mennekes)
levert een vermogen van maximaal 50 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Type 2 CCS (mennekes)
?",
- "render": "
Type 2 CCS (mennekes)
levert een vermogen van maximaal {socket:type2_combo:output}"
- },
- "power-output-9": {
- "mappings": {
- "0": {
- "then": "
Type 2 met kabel (J1772)
levert een vermogen van maximaal 11 kw"
- },
- "1": {
- "then": "
Type 2 met kabel (J1772)
levert een vermogen van maximaal 22 kw"
- }
- },
- "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}"
- },
- "voltage-0": {
- "mappings": {
- "0": {
- "then": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
heeft een spanning van 230 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Schuko stekker zonder aardingspin (CEE7/4 type F)
",
- "render": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
heeft een spanning van {socket:schuko:voltage} volt"
- },
- "voltage-1": {
- "mappings": {
- "0": {
- "then": "
Europese stekker met aardingspin (CEE7/4 type E)
heeft een spanning van 230 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Europese stekker met aardingspin (CEE7/4 type E)
",
- "render": "
Europese stekker met aardingspin (CEE7/4 type E)
heeft een spanning van {socket:typee:voltage} volt"
- },
- "voltage-10": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
heeft een spanning van 500 volt"
- },
- "1": {
- "then": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
heeft een spanning van 920 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
",
- "render": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
heeft een spanning van {socket:tesla_supercharger_ccs:voltage} volt"
- },
- "voltage-11": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger (destination)
heeft een spanning van 480 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Tesla Supercharger (destination)
",
- "render": "
Tesla Supercharger (destination)
heeft een spanning van {socket:tesla_destination:voltage} volt"
- },
- "voltage-12": {
- "mappings": {
- "0": {
- "then": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
heeft een spanning van 230 volt"
- },
- "1": {
- "then": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
heeft een spanning van 400 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
",
- "render": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
heeft een spanning van {socket:tesla_destination:voltage} volt"
- },
- "voltage-13": {
- "mappings": {
- "0": {
- "then": "
USB om GSMs en kleine electronica op te laden
heeft een spanning van 5 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
USB om GSMs en kleine electronica op te laden
",
- "render": "
USB om GSMs en kleine electronica op te laden
heeft een spanning van {socket:USB-A:voltage} volt"
- },
- "voltage-14": {
- "question": "Welke spanning levert de stekker van type
Bosch Active Connect met 3 pinnen aan een kabel
",
- "render": "
Bosch Active Connect met 3 pinnen aan een kabel
heeft een spanning van {socket:bosch_3pin:voltage} volt"
- },
- "voltage-15": {
- "question": "Welke spanning levert de stekker van type
Bosch Active Connect met 5 pinnen aan een kabel
",
- "render": "
Bosch Active Connect met 5 pinnen aan een kabel
heeft een spanning van {socket:bosch_5pin:voltage} volt"
- },
- "voltage-2": {
- "mappings": {
- "0": {
- "then": "
Chademo
heeft een spanning van 500 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Chademo
",
- "render": "
Chademo
heeft een spanning van {socket:chademo:voltage} volt"
- },
- "voltage-3": {
- "mappings": {
- "0": {
- "then": "
Type 1 met kabel (J1772)
heeft een spanning van 200 volt"
- },
- "1": {
- "then": "
Type 1 met kabel (J1772)
heeft een spanning van 240 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 1 met kabel (J1772)
",
- "render": "
Type 1 met kabel (J1772)
heeft een spanning van {socket:type1_cable:voltage} volt"
- },
- "voltage-4": {
- "mappings": {
- "0": {
- "then": "
Type 1 zonder kabel (J1772)
heeft een spanning van 200 volt"
- },
- "1": {
- "then": "
Type 1 zonder kabel (J1772)
heeft een spanning van 240 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 1 zonder kabel (J1772)
",
- "render": "
Type 1 zonder kabel (J1772)
heeft een spanning van {socket:type1:voltage} volt"
- },
- "voltage-5": {
- "mappings": {
- "0": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
heeft een spanning van 400 volt"
- },
- "1": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
heeft een spanning van 1000 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 1 CCS (ook gekend als Type 1 Combo)
",
- "render": "
Type 1 CCS (ook gekend als Type 1 Combo)
heeft een spanning van {socket:type1_combo:voltage} volt"
- },
- "voltage-6": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger
heeft een spanning van 480 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Tesla Supercharger
",
- "render": "
Tesla Supercharger
heeft een spanning van {socket:tesla_supercharger:voltage} volt"
- },
- "voltage-7": {
- "mappings": {
- "0": {
- "then": "
Type 2 (mennekes)
heeft een spanning van 230 volt"
- },
- "1": {
- "then": "
Type 2 (mennekes)
heeft een spanning van 400 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 2 (mennekes)
",
- "render": "
Type 2 (mennekes)
heeft een spanning van {socket:type2:voltage} volt"
- },
- "voltage-8": {
- "mappings": {
- "0": {
- "then": "
Type 2 CCS (mennekes)
heeft een spanning van 500 volt"
- },
- "1": {
- "then": "
Type 2 CCS (mennekes)
heeft een spanning van 920 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 2 CCS (mennekes)
",
- "render": "
Type 2 CCS (mennekes)
heeft een spanning van {socket:type2_combo:voltage} volt"
- },
- "voltage-9": {
- "mappings": {
- "0": {
- "then": "
Type 2 met kabel (J1772)
heeft een spanning van 230 volt"
- },
- "1": {
- "then": "
Type 2 met kabel (J1772)
heeft een spanning van 400 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 2 met kabel (J1772)
",
- "render": "
Type 2 met kabel (J1772)
heeft een spanning van {socket:type2_cable:voltage} volt"
+ "ref": {
+ "render": "Het referentienummer van dit oplaadpunt is {ref}"
}
},
+ "title": {
+ "render": "Oplaadpunten"
+ },
"units": {
"0": {
"applicableUnits": {
diff --git a/langs/layers/ru.json b/langs/layers/ru.json
index 66f7d0cb07..11ae28440b 100644
--- a/langs/layers/ru.json
+++ b/langs/layers/ru.json
@@ -643,11 +643,11 @@
}
},
"tagRenderings": {
- "Auth phone": {
+ "Network": {
"question": "К какой сети относится эта станция?",
"render": "{network}"
},
- "Authentication": {
+ "OH": {
"question": "В какое время работает эта зарядная станция?"
}
},
diff --git a/langs/layers/zh_Hant.json b/langs/layers/zh_Hant.json
index b0afffb78a..e5e5f65bf9 100644
--- a/langs/layers/zh_Hant.json
+++ b/langs/layers/zh_Hant.json
@@ -449,11 +449,11 @@
"description": "充電站",
"name": "充電站",
"tagRenderings": {
- "Auth phone": {
+ "Network": {
"question": "充電站所屬的網路是?",
"render": "{network}"
},
- "Authentication": {
+ "OH": {
"question": "何時是充電站開放使用的時間?"
}
},
diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts
index 4ee4d388c2..e4c981decf 100644
--- a/scripts/generateLayerOverview.ts
+++ b/scripts/generateLayerOverview.ts
@@ -145,7 +145,7 @@ class LayerOverviewUtils {
}
}
- const referencedLayers = Utils.NoNull(themeFile.layers.map(layer => {
+ const referencedLayers = Utils.NoNull([].concat(...themeFile.layers.map(layer => {
if(typeof layer === "string"){
return layer
}
@@ -153,7 +153,12 @@ class LayerOverviewUtils {
return layer["builtin"]
}
return undefined
- }))
+ }).map(layerName => {
+ if(typeof layerName === "string"){
+ return [layerName]
+ }
+ return layerName
+ })))
themeFile.layers = themeFile.layers
.filter(l => typeof l != "string") // We remove all the builtin layer references as they don't work with ts-node for some weird reason
@@ -172,7 +177,8 @@ class LayerOverviewUtils {
const neededLanguages = themeFile["mustHaveLanguage"]
if (neededLanguages !== undefined) {
console.log("Checking language requerements for ", theme.id, "as it must have", neededLanguages.join(", "))
- const allTranslations = [].concat(Translation.ExtractAllTranslationsFrom(theme, theme.id), ...referencedLayers.map(layerId => Translation.ExtractAllTranslationsFrom(knownLayerIds.get(layerId), theme.id+"->"+layerId)))
+ const allTranslations = [].concat(Translation.ExtractAllTranslationsFrom(theme, theme.id),
+ ...referencedLayers.map(layerId => Translation.ExtractAllTranslationsFrom(knownLayerIds.get(layerId), theme.id+"->"+layerId)))
for (const neededLanguage of neededLanguages) {
allTranslations
.filter(t => t.tr.translations[neededLanguage] === undefined && t.tr.translations["*"] === undefined)
From 0252fd43abad1352846a5a27eebb6063229c29f3 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 23:58:42 +0200
Subject: [PATCH 51/58] Improvements to the charging station theme
---
.../charging_station/charging_station.json | 3271 ++++++-----------
.../charging_station.protojson | 306 +-
2 files changed, 1300 insertions(+), 2277 deletions(-)
diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json
index fb14977e25..d353a778ec 100644
--- a/assets/layers/charging_station/charging_station.json
+++ b/assets/layers/charging_station/charging_station.json
@@ -1,2175 +1,1102 @@
{
- "id": "charging_station",
- "name": {
- "en": "Charging stations",
- "nl": "Oplaadpunten",
- "de": "Ladestationen",
- "it": "Stazioni di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "Ladestasjoner",
- "ru": "Зарядные станции",
- "zh_Hant": "充電站"
- },
- "minzoom": 10,
- "source": {
- "osmTags": {
- "or": [
- "amenity=charging_station",
- "disused:amenity=charging_station",
- "planned:amenity=charging_station",
- "construction:amenity=charging_station"
- ]
- }
- },
- "title": {
- "render": {
- "en": "Charging station",
- "nl": "Oplaadpunten",
- "de": "Ladestation",
- "it": "Stazione di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "Ladestasjon",
- "ru": "Зарядная станция",
- "zh_Hant": "充電站"
- }
- },
- "description": {
- "en": "A charging station",
- "nl": "Oplaadpunten",
- "de": "Eine Ladestation",
- "it": "Una stazione di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "En ladestasjon",
- "ru": "Зарядная станция",
- "zh_Hant": "充電站"
- },
- "tagRenderings": [
- "images",
- {
- "id": "Type",
- "#": "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?"
- },
- "multiAnswer": true,
- "mappings": [
- {
- "if": "bicycle=yes",
- "ifnot": "bicycle=no",
- "then": {
- "en": "bicycles can be charged here",
- "nl": "Fietsen kunnen hier opgeladen worden",
- "de": "Fahrräder können hier geladen werden"
- }
- },
- {
- "if": "motorcar=yes",
- "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"
- }
- },
- {
- "if": "scooter=yes",
- "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"
- }
- },
- {
- "if": "hgv=yes",
- "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"
- }
- },
- {
- "if": "bus=yes",
- "ifnot": "bus=no",
- "then": {
- "en": "Buses can be charged here",
- "nl": "Bussen kunnen hier opgeladen worden",
- "de": "Busse können hier geladen werden"
- }
- }
- ]
- },
- {
- "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?"
- },
- "render": {
- "en": "Access is {access}",
- "nl": "Toegang voor {access}",
- "de": "Zugang ist {access}"
- },
- "freeform": {
- "key": "access",
- "addExtraTags": [
- "fixme=Freeform field used for access - doublecheck the value"
- ]
- },
- "mappings": [
- {
- "if": "access=yes",
- "then": {
- "en": "Anyone can use this charging station (payment might be needed)",
- "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
- }
- },
- {
- "if": {
- "or": [
- "access=permissive",
- "access=public"
- ]
- },
- "then": {
- "en": "Anyone can use this charging station (payment might be needed)",
- "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
- },
- "hideInAnswer": true
- },
- {
- "if": "access=customers",
- "then": {
- "en": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests",
- "nl": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken Bijvoorbeeld een oplaadpunt op de parking van een restaurant dat enkel door klanten van het restaurant gebruikt mag worden"
- }
- },
- {
- "if": "access=private",
- "then": {
- "en": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)",
- "nl": "Niet toegankelijk voor het publiek Enkel toegankelijk voor de eigenaar, medewerkers ,... "
- }
- }
- ]
- },
- {
- "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"
- },
- "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?"
- },
- "freeform": {
- "key": "capacity",
- "type": "pnat"
- }
- },
- {
- "id": "Available_charging_stations (generated)",
- "question": {
- "en": "Which charging stations are available here?",
- "nl": "Welke aansluitingen zijn hier beschikbaar?",
- "de": "Welche Ladestationen gibt es hier?"
- },
- "multiAnswer": true,
- "mappings": [
- {
- "if": "socket:schuko=1",
- "ifnot": "socket:schuko=",
- "then": {
- "en": "
Schuko wall plug without ground pin (CEE7/4 type F)
are available here?",
+ "nl": "Hoeveel stekkers van type
Bosch Active Connect met 5 pinnen aan een kabel
heeft dit oplaadpunt?"
+ },
+ "render": {
+ "en": "There are {socket:bosch_5pin} plugs of type
Bosch Active Connect with 5 pins and cable
available here",
+ "nl": "Hier zijn {socket:bosch_5pin} stekkers van het type
Bosch Active Connect met 5 pinnen aan een kabel
"
+ },
+ "freeform": {
+ "key": "socket:bosch_5pin",
+ "type": "pnat"
+ },
+ "condition": {
+ "and": [
+ "socket:bosch_5pin~*",
+ "socket:bosch_5pin!=0"
+ ]
+ }
},
{
"id": "OH",
@@ -424,10 +1455,12 @@
{
"id": "Network",
"render": {
- "en": "Part of the network {network}"
+ "en": "Part of the network {network}",
+ "nl": "Maakt deel uit van het {network}-netwerk"
},
"question": {
- "en": "Is this charging station part of a network?"
+ "en": "Is this charging station part of a network?",
+ "nl": "Is dit oplaadpunt deel van een groter netwerk?"
},
"freeform": {
"key": "network"
@@ -436,13 +1469,15 @@
{
"if": "no:network=yes",
"then": {
- "en": "Not part of a bigger network"
+ "en": "Not part of a bigger network",
+ "nl": "Maakt geen deel uit van een groter netwerk"
}
},
{
"if": "network=none",
"then": {
- "en": "Not part of a bigger network"
+ "en": "Not part of a bigger network",
+ "nl": "Maakt geen deel uit van een groter netwerk"
},
"hideInAnswer": true
},
@@ -463,10 +1498,12 @@
{
"id": "Operator",
"question": {
- "en": "Who is the operator of this charging station?"
+ "en": "Who is the operator of this charging station?",
+ "nl": "Wie beheert dit oplaadpunt?"
},
"render": {
- "en": "This charging station is operated by {operator}"
+ "en": "This charging station is operated by {operator}",
+ "nl": "Wordt beheerd door {operator}"
},
"freeform": {
"key": "operator"
@@ -479,7 +1516,8 @@
]
},
"then": {
- "en": "Actually, {operator} is the network"
+ "en": "Actually, {operator} is the network",
+ "nl": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt"
},
"addExtraTags": [
"operator="
@@ -491,10 +1529,12 @@
{
"id": "phone",
"question": {
- "en": "What number can one call if there is a problem with this charging station?"
+ "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?"
},
"render": {
- "en": "In case of problems, call {phone}"
+ "en": "In case of problems, call {phone}",
+ "nl": "Bij problemen, bel naar {phone}"
},
"freeform": {
"key": "phone",
@@ -504,10 +1544,12 @@
{
"id": "email",
"question": {
- "en": "What is the email address of the operator?"
+ "en": "What is the email address of the operator?",
+ "nl": "Wat is het email-adres van de operator?"
},
"render": {
- "en": "In case of problems, send an email to {email}"
+ "en": "In case of problems, send an email to {email}",
+ "nl": "Bij problemen, email naar {email}"
},
"freeform": {
"key": "email",
@@ -517,10 +1559,12 @@
{
"id": "website",
"question": {
- "en": "What is the website of the operator?"
+ "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?"
},
"render": {
- "en": "More info on {website}"
+ "en": "More info on {website}",
+ "nl": "Meer informatie op {website}"
},
"freeform": {
"key": "website",
@@ -531,7 +1575,8 @@
{
"id": "ref",
"question": {
- "en": "What is the reference number of this charging station?"
+ "en": "What is the reference number of this charging station?",
+ "nl": "Wat is het referentienummer van dit oplaadstation?"
},
"render": {
"en": "Reference number is {ref}",
@@ -630,19 +1675,22 @@
{
"id": "Parking:fee",
"question": {
- "en": "Does one have to pay a parking fee while charging?"
+ "en": "Does one have to pay a parking fee while charging?",
+ "nl": "Moet men parkeergeld betalen tijdens het opladen?"
},
"mappings": [
{
"if": "parking:fee=no",
"then": {
- "en": "No additional parking cost while charging"
+ "en": "No additional parking cost while charging",
+ "nl": "Geen extra parkeerkost tijdens het opladen"
}
},
{
"if": "parking:fee=yes",
"then": {
- "en": "An additional parking fee should be paid while charging"
+ "en": "An additional parking fee should be paid while charging",
+ "nl": "Tijdens het opladen moet er parkeergeld betaald worden"
}
}
],
@@ -721,12 +1769,56 @@
"render": "#00f"
},
"presets": [
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=no",
+ "bicycle=yes",
+ "socket:typee=1"
+ ],
+ "title": {
+ "en": "electrical outlet to charge e-bikes",
+ "nl": "gewone stekker (bedoeld om electrische fietsen op te laden)"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=no",
+ "bicycle=yes"
+ ],
+ "title": {
+ "en": "charging station for e-bikes",
+ "nl": "oplaadpunt voor elektrische fietsen"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=yes",
+ "bicycle=no"
+ ],
+ "title": {
+ "en": "charging station for cars",
+ "nl": "oplaadstation voor elektrische auto's"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
{
"tags": [
"amenity=charging_station"
],
"title": {
- "en": "Charging station"
+ "en": "charging station",
+ "nl": "oplaadstation"
},
"preciseInput": {
"preferredBackground": "map"
@@ -770,7 +1862,8 @@
"options": [
{
"question": {
- "en": "Only working charging stations"
+ "en": "Only working charging stations",
+ "nl": "Enkel werkende oplaadpunten"
},
"osmTags": {
"and": [
diff --git a/assets/layers/charging_station/charging_station.protojson b/assets/layers/charging_station/charging_station.protojson
index 88ce359321..5a941d6b08 100644
--- a/assets/layers/charging_station/charging_station.protojson
+++ b/assets/layers/charging_station/charging_station.protojson
@@ -119,14 +119,14 @@
"if": "access=customers",
"then": {
"en": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests",
- "nl": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken Bijvoorbeeld een oplaadpunt op de parking van een restaurant dat enkel door klanten van het restaurant gebruikt mag worden"
+ "nl": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken Bv. op de parking van een hotel en enkel toegankelijk voor klanten van dit hotel"
}
},
{
"if": "access=private",
"then": {
"en": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)",
- "nl": "Niet toegankelijk voor het publiek Enkel toegankelijk voor de eigenaar, medewerkers ,... "
+ "nl": "Niet toegankelijk voor het publiek Bv. enkel toegankelijk voor de eigenaar, medewerkers ,... "
}
}
]
@@ -419,10 +419,12 @@
{
"id": "Network",
"render": {
- "en": "Part of the network {network}"
+ "en": "Part of the network {network}",
+ "nl": "Maakt deel uit van het {network}-netwerk"
},
"question": {
- "en": "Is this charging station part of a network?"
+ "en": "Is this charging station part of a network?",
+ "nl": "Is dit oplaadpunt deel van een groter netwerk?"
},
"freeform": {
"key": "network"
@@ -431,13 +433,15 @@
{
"if": "no:network=yes",
"then": {
- "en": "Not part of a bigger network"
+ "en": "Not part of a bigger network",
+ "nl": "Maakt geen deel uit van een groter netwerk"
}
},
{
"if": "network=none",
"then": {
- "en": "Not part of a bigger network"
+ "en": "Not part of a bigger network",
+ "nl": "Maakt geen deel uit van een groter netwerk"
},
"hideInAnswer": true
},
@@ -458,10 +462,12 @@
{
"id": "Operator",
"question": {
- "en": "Who is the operator of this charging station?"
+ "en": "Who is the operator of this charging station?",
+ "nl": "Wie beheert dit oplaadpunt?"
},
"render": {
- "en": "This charging station is operated by {operator}"
+ "en": "This charging station is operated by {operator}",
+ "nl": "Wordt beheerd door {operator}"
},
"freeform": {
"key": "operator"
@@ -474,7 +480,8 @@
]
},
"then": {
- "en": "Actually, {operator} is the network"
+ "en": "Actually, {operator} is the network",
+ "nl": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt"
},
"addExtraTags": [
"operator="
@@ -486,10 +493,11 @@
{
"id": "phone",
"question": {
- "en": "What number can one call if there is a problem with this charging station?"
+ "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?"
},
"render": {
- "en": "In case of problems, call {phone}"
+ "en": "In case of problems, call {phone}", "nl": "Bij problemen, bel naar {phone}"
},
"freeform": {
"key": "phone",
@@ -499,10 +507,12 @@
{
"id": "email",
"question": {
- "en": "What is the email address of the operator?"
+ "en": "What is the email address of the operator?",
+ "nl": "Wat is het email-adres van de operator?"
},
"render": {
- "en": "In case of problems, send an email to {email}"
+ "en": "In case of problems, send an email to {email}",
+ "nl": "Bij problemen, email naar {email}"
},
"freeform": {
"key": "email",
@@ -512,10 +522,12 @@
{
"id": "website",
"question": {
- "en": "What is the website of the operator?"
+ "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?"
},
"render": {
- "en": "More info on {website}"
+ "en": "More info on {website}",
+ "nl": "Meer informatie op {website}"
},
"freeform": {
"key": "website",
@@ -526,7 +538,8 @@
{
"id": "ref",
"question": {
- "en": "What is the reference number of this charging station?"
+ "en": "What is the reference number of this charging station?",
+ "nl": "Wat is het referentienummer van dit oplaadstation?"
},
"render": {
"en": "Reference number is {ref}",
@@ -625,19 +638,22 @@
{
"id": "Parking:fee",
"question": {
- "en": "Does one have to pay a parking fee while charging?"
+ "en": "Does one have to pay a parking fee while charging?",
+ "nl": "Moet men parkeergeld betalen tijdens het opladen?"
},
"mappings": [
{
"if": "parking:fee=no",
"then": {
- "en": "No additional parking cost while charging"
+ "en": "No additional parking cost while charging",
+ "nl": "Geen extra parkeerkost tijdens het opladen"
}
},
{
"if": "parking:fee=yes",
"then": {
- "en": "An additional parking fee should be paid while charging"
+ "en": "An additional parking fee should be paid while charging",
+ "nl": "Tijdens het opladen moet er parkeergeld betaald worden"
}
}
],
@@ -716,12 +732,56 @@
"render": "#00f"
},
"presets": [
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=no",
+ "bicycle=yes",
+ "socket:typee=1"
+ ],
+ "title": {
+ "en": "electrical outlet to charge e-bikes",
+ "nl": "laadpunt met gewone stekker(s) (bedoeld om electrische fietsen op te laden)"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=no",
+ "bicycle=yes"
+ ],
+ "title": {
+ "en": "charging station for e-bikes",
+ "nl": "oplaadpunt voor elektrische fietsen"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=yes",
+ "bicycle=no"
+ ],
+ "title": {
+ "en": "charging station for cars",
+ "nl": "oplaadstation voor elektrische auto's"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
{
"tags": [
"amenity=charging_station"
],
"title": {
- "en": "Charging station"
+ "en": "charging station",
+ "nl": "oplaadstation"
},
"preciseInput": {
"preferredBackground": "map"
@@ -765,7 +825,8 @@
"options": [
{
"question": {
- "en": "Only working charging stations"
+ "en": "Only working charging stations",
+ "nl": "Enkel werkende oplaadpunten"
},
"osmTags": {
"and": [
diff --git a/assets/layers/charging_station/csvToJson.ts b/assets/layers/charging_station/csvToJson.ts
index d781d33e7c..4b2490b905 100644
--- a/assets/layers/charging_station/csvToJson.ts
+++ b/assets/layers/charging_station/csvToJson.ts
@@ -259,7 +259,7 @@ function run(file, protojson) {
const stringified = questions.map(q => JSON.stringify(q, null, " "))
let protoString = readFileSync(protojson, "utf8")
- protoString = protoString.replace("{\"id\": \"$$$\"}", stringified.join(",\n"))
+ protoString = protoString.replace(/{[ \t\n]*"id"[ \t\n]*:[ \t\n]*"\$\$\$"[ \t\n]*}/, stringified.join(",\n"))
const proto = JSON.parse(protoString)
proto.tagRenderings.forEach(tr => {
if (typeof tr === "string") {
diff --git a/assets/layers/waste_basket/waste_basket.json b/assets/layers/waste_basket/waste_basket.json
index 612504a7b3..7a3691a979 100644
--- a/assets/layers/waste_basket/waste_basket.json
+++ b/assets/layers/waste_basket/waste_basket.json
@@ -91,6 +91,7 @@
"id": "dispensing_dog_bags",
"question": {
"en": "Does this waste basket have a dispenser for dog excrement bags?",
+ "nl": "Heeft deze vuilnisbak een verdeler voor hondenpoepzakjes?",
"de": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?"
},
"condition": {
@@ -110,6 +111,7 @@
},
"then": {
"en": "This waste basket has a dispenser for (dog) excrement bags",
+ "nl": "Deze vuilnisbak heeft een verdeler voor hondenpoepzakjes",
"de": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel"
}
},
@@ -122,6 +124,7 @@
},
"then": {
"en": "This waste basket does not have a dispenser for (dog) excrement bags",
+ "nl": "Deze vuilbak heeft geen verdeler voor hondenpoepzakjes",
"de": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
}
},
@@ -129,6 +132,7 @@
"if": "vending=",
"then": {
"en": "This waste basket does not have a dispenser for (dog) excrement bags",
+ "nl": "Deze vuilnisbak heeft geen verdeler voor hondenpoepzakjes",
"de": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
},
"hideInAnwer": true
From 93c6778a9d5ac974b7cc9031e6db0691c7444b43 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Tue, 26 Oct 2021 01:14:33 +0200
Subject: [PATCH 53/58] version bump
---
Models/Constants.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Models/Constants.ts b/Models/Constants.ts
index 15f6e94f9d..6405a34b6a 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.11.1";
+ public static vNumber = "0.11.2";
public static ImgurApiKey = '7070e7167f0a25a'
public static readonly mapillary_client_token_v3 = 'TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2'
public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"
From 289bf6f0dc43da6387da1d5582684432c7d52b21 Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Mon, 25 Oct 2021 22:48:57 +0000
Subject: [PATCH 54/58] Translated using Weblate (English)
Currently translated at 100.0% (228 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/en/
---
langs/en.json | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/langs/en.json b/langs/en.json
index 6b7d7723a2..cee2bae0c6 100644
--- a/langs/en.json
+++ b/langs/en.json
@@ -33,7 +33,7 @@
"split": {
"split": "Split",
"cancel": "Cancel",
- "inviteToSplit": "Split this road",
+ "inviteToSplit": "Split this road in smaller segments. This allows to give different properties to parts of the road.",
"loginToSplit": "You must be logged in to split a road",
"splitTitle": "Choose on the map where to split this road",
"hasBeenSplit": "This way has been split"
@@ -229,11 +229,11 @@
"wikipediaboxTitle": "Wikipedia",
"failed": "Loading the wikipedia entry failed",
"loading": "Loading Wikipedia...",
- "noWikipediaPage": "This wikidata item has no corresponding wikipedia page yet.",
- "searchWikidata": "Search on wikidata",
+ "noWikipediaPage": "This Wikidata item has no corresponding Wikipedia page yet.",
+ "searchWikidata": "Search on Wikidata",
"noResults": "Nothing found for {search}",
"doSearch": "Search above to see results",
- "createNewWikidata": "Create a new wikidata item"
+ "createNewWikidata": "Create a new Wikidata item"
}
},
"favourite": {
@@ -285,4 +285,4 @@
"partOfRelation": "This feature is part of a relation. Use another editor to move it",
"cancel": "Cancel move"
}
-}
\ No newline at end of file
+}
From 7474ceb395eeddbc8f6fca845a179158f1c0942f Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Mon, 25 Oct 2021 22:58:52 +0000
Subject: [PATCH 55/58] Translated using Weblate (Dutch)
Currently translated at 98.6% (225 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/nl/
---
langs/nl.json | 101 ++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 90 insertions(+), 11 deletions(-)
diff --git a/langs/nl.json b/langs/nl.json
index 33a56e19a2..33a2cf04ee 100644
--- a/langs/nl.json
+++ b/langs/nl.json
@@ -10,10 +10,12 @@
"ccb": "onder de CC-BY-licentie",
"uploadFailed": "Afbeelding uploaden mislukt. Heb je internet? Gebruik je Brave of UMatrix? Dan moet je derde partijen toelaten.",
"respectPrivacy": "Fotografeer geen mensen of nummerplaten. Voeg geen Google Maps, Google Streetview of foto's met auteursrechten toe.",
- "uploadDone": "Je afbeelding is toegevoegd. Bedankt om te helpen!",
+ "uploadDone": "Je afbeelding is toegevoegd. Bedankt om te helpen!",
"dontDelete": "Terug",
"doDelete": "Verwijder afbeelding",
- "isDeleted": "Verwijderd"
+ "isDeleted": "Verwijderd",
+ "uploadMultipleDone": "{count} afbeeldingen zijn toegevoegd. Bedankt voor je bijdrage!",
+ "toBig": "Je afbeelding is te groot, namelijk {actual_size}. Gelieve afbeeldingen van maximaal {max_size} te gebruiken"
},
"centerMessage": {
"loadingData": "Data wordt geladen...",
@@ -24,8 +26,9 @@
"index": {
"#": "These texts are shown above the theme buttons when no theme is loaded",
"title": "Welkom bij MapComplete",
- "intro": "MapComplete is een OpenStreetMap applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.",
- "pickTheme": "Kies hieronder een thema om te beginnen."
+ "intro": "MapComplete is een OpenStreetMap-applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.",
+ "pickTheme": "Kies hieronder een thema om te beginnen.",
+ "featuredThemeTitle": "Thema van de week"
},
"general": {
"loginWithOpenStreetMap": "Aanmelden met OpenStreetMap",
@@ -51,7 +54,10 @@
"layerNotEnabled": "De laag {layer} is gedeactiveerd. Activeer deze om een punt toe te voegen",
"presetInfo": "Het nieuwe punt krijgt de attributen {tags}",
"disableFiltersExplanation": "Interessepunten kunnen verborgen zijn door een filter",
- "disableFilters": "Zet alle filters af"
+ "disableFilters": "Zet alle filters af",
+ "hasBeenImported": "Dit punt is reeds geimporteerd",
+ "warnVisibleForEveryone": "Je toevoeging is voor iedereen zichtbaar",
+ "zoomInMore": "Zoom meer in om dit punt te importeren"
},
"pickLanguage": "Kies je taal: ",
"about": "Bewerk en voeg data toe aan OpenStreetMap over een specifiek onderwerp op een gemakkelijke manier",
@@ -128,7 +134,9 @@
"intro": "
"
- },
- "hideInAnswer": {
- "or": [
- {
- "and": [
- "car=no",
- "motorcar=no",
- "hgv=no",
- "bus=no"
+ "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?"
+ },
+ "render": {
+ "en": "Access is {access}",
+ "nl": "Toegang voor {access}",
+ "de": "Zugang ist {access}"
+ },
+ "freeform": {
+ "key": "access",
+ "addExtraTags": [
+ "fixme=Freeform field used for access - doublecheck the value"
]
- },
- {
- "and": [
- {
- "or": [
- "bicycle=yes",
- "scooter=yes"
- ]
- },
- "car!=yes",
- "motorcar!=yes",
- "hgv!=yes",
- "bus!=yes"
- ]
- }
+ },
+ "mappings": [
+ {
+ "if": "access=yes",
+ "then": {
+ "en": "Anyone can use this charging station (payment might be needed)",
+ "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
+ }
+ },
+ {
+ "if": {
+ "or": [
+ "access=permissive",
+ "access=public"
+ ]
+ },
+ "then": {
+ "en": "Anyone can use this charging station (payment might be needed)",
+ "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
+ },
+ "hideInAnswer": true
+ },
+ {
+ "if": "access=customers",
+ "then": {
+ "en": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests",
+ "nl": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken Bijvoorbeeld een oplaadpunt op de parking van een restaurant dat enkel door klanten van het restaurant gebruikt mag worden"
+ }
+ },
+ {
+ "if": "access=private",
+ "then": {
+ "en": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)",
+ "nl": "Niet toegankelijk voor het publiek Enkel toegankelijk voor de eigenaar, medewerkers ,... "
+ }
+ }
]
- }
},
{
- "if": {
- "and": [
- "socket:chademo~*",
- "socket:chademo!=1"
- ]
- },
- "then": {
- "en": "
"
- },
- "osmTags": "socket:bosch_5pin~*"
- }
- ]
- }
- ],
- "units": [
- {
- "appliesToKey": [
- "maxstay"
- ],
- "applicableUnits": [
- {
- "canonicalDenomination": "minutes",
- "canonicalDenominationSingular": "minute",
- "alternativeDenomination": [
- "m",
- "min",
- "mins",
- "minuten",
- "mns"
- ],
- "human": {
- "en": " minutes",
- "nl": " minuten"
- },
- "humanSingular": {
- "en": " minute",
- "nl": " minuut"
- }
- },
- {
- "canonicalDenomination": "hours",
- "canonicalDenominationSingular": "hour",
- "alternativeDenomination": [
- "h",
- "hrs",
- "hours",
- "u",
- "uur",
- "uren"
- ],
- "human": {
- "en": " hours",
- "nl": " uren"
- },
- "humanSingular": {
- "en": " hour",
- "nl": " uur"
- }
- },
- {
- "canonicalDenomination": "days",
- "canonicalDenominationSingular": "day",
- "alternativeDenomination": [
- "dys",
- "dagen",
- "dag"
- ],
- "human": {
- "en": " days",
- "nl": " day"
- },
- "humanSingular": {
- "en": " day",
- "nl": " dag"
- }
- }
- ]
- },
- {
- "appliesToKey": [
- "socket:schuko:voltage",
- "socket:typee:voltage",
- "socket:chademo:voltage",
- "socket:type1_cable:voltage",
- "socket:type1:voltage",
- "socket:type1_combo:voltage",
- "socket:tesla_supercharger:voltage",
- "socket:type2:voltage",
- "socket:type2_combo:voltage",
- "socket:type2_cable:voltage",
- "socket:tesla_supercharger_ccs:voltage",
- "socket:tesla_destination:voltage",
- "socket:tesla_destination:voltage",
- "socket:USB-A:voltage",
- "socket:bosch_3pin:voltage",
- "socket:bosch_5pin:voltage"
- ],
- "applicableUnits": [
- {
- "canonicalDenomination": "V",
- "alternativeDenomination": [
- "v",
- "volt",
- "voltage",
- "V",
- "Volt"
- ],
- "human": {
- "en": "Volts",
- "nl": "volt"
- }
- }
- ],
- "eraseInvalidValues": true
- },
- {
- "appliesToKey": [
- "socket:schuko:current",
- "socket:typee:current",
- "socket:chademo:current",
- "socket:type1_cable:current",
- "socket:type1:current",
- "socket:type1_combo:current",
- "socket:tesla_supercharger:current",
- "socket:type2:current",
- "socket:type2_combo:current",
- "socket:type2_cable:current",
- "socket:tesla_supercharger_ccs:current",
- "socket:tesla_destination:current",
- "socket:tesla_destination:current",
- "socket:USB-A:current",
- "socket:bosch_3pin:current",
- "socket:bosch_5pin:current"
- ],
- "applicableUnits": [
- {
- "canonicalDenomination": "A",
- "alternativeDenomination": [
- "a",
- "amp",
- "amperage",
- "A"
- ],
- "human": {
- "en": "A",
- "nl": "A"
- }
- }
- ],
- "eraseInvalidValues": true
- },
- {
- "appliesToKey": [
- "socket:schuko:output",
- "socket:typee:output",
- "socket:chademo:output",
- "socket:type1_cable:output",
- "socket:type1:output",
- "socket:type1_combo:output",
- "socket:tesla_supercharger:output",
- "socket:type2:output",
- "socket:type2_combo:output",
- "socket:type2_cable:output",
- "socket:tesla_supercharger_ccs:output",
- "socket:tesla_destination:output",
- "socket:tesla_destination:output",
- "socket:USB-A:output",
- "socket:bosch_3pin:output",
- "socket:bosch_5pin:output"
- ],
- "applicableUnits": [
- {
- "canonicalDenomination": "kW",
- "alternativeDenomination": [
- "kilowatt"
- ],
- "human": {
- "en": "kilowatt",
- "nl": "kilowatt"
- }
- },
- {
- "canonicalDenomination": "mW",
- "alternativeDenomination": [
- "megawatt"
- ],
- "human": {
- "en": "megawatt",
- "nl": "megawatt"
- }
- }
- ],
- "eraseInvalidValues": true
- }
- ],
- "allowMove": {
- "enableRelocation": false,
- "enableImproveAccuracy": true
- },
- "deletion": {
- "softDeletionTags": {
- "and": [
- "amenity=",
- "disused:amenity=charging_station"
- ]
- },
- "neededChangesets": 10
- }
}
\ No newline at end of file
diff --git a/assets/layers/defibrillator/defibrillator.json b/assets/layers/defibrillator/defibrillator.json
index f6b335358f..1055366784 100644
--- a/assets/layers/defibrillator/defibrillator.json
+++ b/assets/layers/defibrillator/defibrillator.json
@@ -35,13 +35,7 @@
"mappings": [
{
"if": "_recently_surveyed=true",
- "then": {
- "en": "./assets/layers/defibrillator/aed_checked.svg",
- "ru": "./assets/layers/defibrillator/aed_checked.svg",
- "it": "./assets/layers/defibrillator/aed_checked.svg",
- "fr": "./assets/layers/defibrillator/aed_checked.svg",
- "de": "./assets/layers/defibrillator/aed_checked.svg"
- }
+ "then": "./assets/layers/defibrillator/aed_checked.svg"
}
]
},
diff --git a/langs/layers/de.json b/langs/layers/de.json
index 73735975b9..664c8efa07 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -541,9 +541,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"name": "Fahrradstationen (Reparatur, Pumpe oder beides)",
"presets": {
"0": {
@@ -1157,15 +1154,6 @@
"question": "Wie ist die Email-Adresse des Betreibers?",
"render": "Bei Problemen senden Sie eine E-Mail an {email}"
},
- "fee/charge": {
- "mappings": {
- "0": {
- "then": "Nutzung kostenlos"
- }
- },
- "question": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?",
- "render": "Die Nutzung dieser Ladestation kostet {charge}"
- },
"maxstay": {
"mappings": {
"0": {
@@ -1701,13 +1689,6 @@
}
},
"defibrillator": {
- "icon": {
- "mappings": {
- "0": {
- "then": "./assets/layers/defibrillator/aed_checked.svg"
- }
- }
- },
"name": "Defibrillatoren",
"presets": {
"0": {
diff --git a/langs/layers/en.json b/langs/layers/en.json
index 3c5dae71ab..c5dbcbbc40 100644
--- a/langs/layers/en.json
+++ b/langs/layers/en.json
@@ -544,9 +544,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"name": "Bike stations (repair, pump or both)",
"presets": {
"0": {
@@ -1009,6 +1006,15 @@
"presets": {
"0": {
"title": "Charging station"
+ },
+ "1": {
+ "title": "charging station for e-bikes"
+ },
+ "2": {
+ "title": "charging station for cars"
+ },
+ "3": {
+ "title": "charging station"
}
},
"tagRenderings": {
@@ -1248,18 +1254,33 @@
"question": "How much vehicles can be charged here at the same time?",
"render": "{capacity} vehicles can be charged here at the same time"
},
+ "charge": {
+ "question": "How much does one have to pay to use this charging station?",
+ "render": "Using this charging station costs {charge}"
+ },
"email": {
"question": "What is the email address of the operator?",
"render": "In case of problems, send an email to {email}"
},
- "fee/charge": {
+ "fee": {
"mappings": {
"0": {
"then": "Free to use"
+ },
+ "1": {
+ "then": "Free to use (without authenticating)"
+ },
+ "2": {
+ "then": "Free to use, but one has to authenticate"
+ },
+ "3": {
+ "then": "Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station"
+ },
+ "4": {
+ "then": "Paid use"
}
},
- "question": "How much does one have to pay to use this charging station?",
- "render": "Using this charging station costs {charge}"
+ "question": "Does one have to pay to use this charging station?"
},
"maxstay": {
"mappings": {
@@ -1915,13 +1936,6 @@
}
},
"defibrillator": {
- "icon": {
- "mappings": {
- "0": {
- "then": "./assets/layers/defibrillator/aed_checked.svg"
- }
- }
- },
"name": "Defibrillators",
"presets": {
"0": {
diff --git a/langs/layers/fi.json b/langs/layers/fi.json
index a13231cd6f..91972fd665 100644
--- a/langs/layers/fi.json
+++ b/langs/layers/fi.json
@@ -90,9 +90,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"presets": {
"0": {
"title": "Pyöräpumppu"
diff --git a/langs/layers/fr.json b/langs/layers/fr.json
index 7892204ad5..b4c06d558a 100644
--- a/langs/layers/fr.json
+++ b/langs/layers/fr.json
@@ -453,9 +453,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"name": "Station velo (réparation, pompe à vélo)",
"presets": {
"0": {
@@ -749,13 +746,6 @@
}
},
"defibrillator": {
- "icon": {
- "mappings": {
- "0": {
- "then": "./assets/layers/defibrillator/aed_checked.svg"
- }
- }
- },
"name": "Défibrillateurs",
"presets": {
"0": {
diff --git a/langs/layers/it.json b/langs/layers/it.json
index efca2e950e..229bb82e01 100644
--- a/langs/layers/it.json
+++ b/langs/layers/it.json
@@ -453,9 +453,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"name": "Stazioni bici (riparazione, gonfiaggio o entrambi)",
"presets": {
"0": {
@@ -765,13 +762,6 @@
}
},
"defibrillator": {
- "icon": {
- "mappings": {
- "0": {
- "then": "./assets/layers/defibrillator/aed_checked.svg"
- }
- }
- },
"name": "Defibrillatori",
"presets": {
"0": {
diff --git a/langs/layers/nan.json b/langs/layers/nan.json
deleted file mode 100644
index 0967ef424b..0000000000
--- a/langs/layers/nan.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/langs/layers/nl.json b/langs/layers/nl.json
index fd947098d1..317a63c553 100644
--- a/langs/layers/nl.json
+++ b/langs/layers/nl.json
@@ -1052,6 +1052,13 @@
}
}
},
+ "1": {
+ "options": {
+ "0": {
+ "question": "Enkel werkende oplaadpunten"
+ }
+ }
+ },
"2": {
"options": {
"0": {
@@ -1109,6 +1116,20 @@
}
},
"name": "Oplaadpunten",
+ "presets": {
+ "0": {
+ "title": "gewone stekker (bedoeld om electrische fietsen op te laden)"
+ },
+ "1": {
+ "title": "oplaadpunt voor elektrische fietsen"
+ },
+ "2": {
+ "title": "oplaadstation voor elektrische auto's"
+ },
+ "3": {
+ "title": "oplaadstation"
+ }
+ },
"tagRenderings": {
"Auth phone": {
"question": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?",
@@ -1244,6 +1265,18 @@
},
"question": "Welke aansluitingen zijn hier beschikbaar?"
},
+ "Network": {
+ "mappings": {
+ "0": {
+ "then": "Maakt geen deel uit van een groter netwerk"
+ },
+ "1": {
+ "then": "Maakt geen deel uit van een groter netwerk"
+ }
+ },
+ "question": "Is dit oplaadpunt deel van een groter netwerk?",
+ "render": "Maakt deel uit van het {network}-netwerk"
+ },
"OH": {
"mappings": {
"0": {
@@ -1272,6 +1305,26 @@
},
"question": "Is dit oplaadpunt operationeel?"
},
+ "Operator": {
+ "mappings": {
+ "0": {
+ "then": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt"
+ }
+ },
+ "question": "Wie beheert dit oplaadpunt?",
+ "render": "Wordt beheerd door {operator}"
+ },
+ "Parking:fee": {
+ "mappings": {
+ "0": {
+ "then": "Geen extra parkeerkost tijdens het opladen"
+ },
+ "1": {
+ "then": "Tijdens het opladen moet er parkeergeld betaald worden"
+ }
+ },
+ "question": "Moet men parkeergeld betalen tijdens het opladen?"
+ },
"Type": {
"mappings": {
"0": {
@@ -1314,14 +1367,33 @@
"question": "Hoeveel voertuigen kunnen hier opgeladen worden?",
"render": "{capacity} voertuigen kunnen hier op hetzelfde moment opgeladen worden"
},
- "fee/charge": {
+ "charge": {
+ "question": "Hoeveel moet men betalen om dit oplaadpunt te gebruiken?",
+ "render": "Dit oplaadpunt gebruiken kost {charge}"
+ },
+ "email": {
+ "question": "Wat is het email-adres van de operator?",
+ "render": "Bij problemen, email naar {email}"
+ },
+ "fee": {
"mappings": {
"0": {
"then": "Gratis te gebruiken"
+ },
+ "1": {
+ "then": "Gratis te gebruiken (zonder aan te melden)"
+ },
+ "2": {
+ "then": "Gratis te gebruiken, maar aanmelden met een applicatie is verplicht"
+ },
+ "3": {
+ "then": "Betalend te gebruiken, maar gratis voor klanten van het bijhorende hotel/café/ziekenhuis/..."
+ },
+ "4": {
+ "then": "Betalend"
}
},
- "question": "Hoeveel kost het gebruik van dit oplaadpunt?",
- "render": "Dit oplaadpunt gebruiken kost {charge}"
+ "question": "Moet men betalen om dit oplaadpunt te gebruiken?"
},
"maxstay": {
"mappings": {
@@ -1344,6 +1416,10 @@
}
}
},
+ "phone": {
+ "question": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?",
+ "render": "Bij problemen, bel naar {phone}"
+ },
"plugs-0": {
"question": "Hoeveel stekkers van type
Schuko stekker zonder aardingspin (CEE7/4 type F)
heeft dit oplaadpunt?",
"render": "Hier zijn {socket:schuko} stekkers van het type
Schuko stekker zonder aardingspin (CEE7/4 type F)
"
@@ -1409,7 +1485,12 @@
"render": "Hier zijn {socket:type2_cable} stekkers van het type
Type 2 met kabel (J1772)
"
},
"ref": {
+ "question": "Wat is het referentienummer van dit oplaadstation?",
"render": "Het referentienummer van dit oplaadpunt is {ref}"
+ },
+ "website": {
+ "question": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?",
+ "render": "Meer informatie op {website}"
}
},
"title": {
@@ -3725,6 +3806,20 @@
}
},
"tagRenderings": {
+ "dispensing_dog_bags": {
+ "mappings": {
+ "0": {
+ "then": "Deze vuilnisbak heeft een verdeler voor hondenpoepzakjes"
+ },
+ "1": {
+ "then": "Deze vuilbak heeft geen verdeler voor hondenpoepzakjes"
+ },
+ "2": {
+ "then": "Deze vuilnisbak heeft geen verdeler voor hondenpoepzakjes"
+ }
+ },
+ "question": "Heeft deze vuilnisbak een verdeler voor hondenpoepzakjes?"
+ },
"waste-basket-waste-types": {
"mappings": {
"0": {
diff --git a/langs/layers/pt.json b/langs/layers/pt.json
index 5cdf2f56ae..461c8c5415 100644
--- a/langs/layers/pt.json
+++ b/langs/layers/pt.json
@@ -338,9 +338,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"presets": {
"0": {
"description": "Um aparelho para encher os seus pneus num local fixa no espaço público
Exemplos de bombas de bicicletas
"
diff --git a/langs/layers/pt_BR.json b/langs/layers/pt_BR.json
index 923a5d76d5..1bea7cdf89 100644
--- a/langs/layers/pt_BR.json
+++ b/langs/layers/pt_BR.json
@@ -338,9 +338,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"name": "Estações de bicicletas (reparo, bomba ou ambos)",
"presets": {
"0": {
diff --git a/langs/layers/ru.json b/langs/layers/ru.json
index 11ae28440b..33c93089d7 100644
--- a/langs/layers/ru.json
+++ b/langs/layers/ru.json
@@ -400,9 +400,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"presets": {
"0": {
"title": "Велосипедный насос"
@@ -715,13 +712,6 @@
}
},
"defibrillator": {
- "icon": {
- "mappings": {
- "0": {
- "then": "./assets/layers/defibrillator/aed_checked.svg"
- }
- }
- },
"name": "Дефибрилляторы",
"presets": {
"0": {
From fa012b024db90cb84886066a164d30f749246921 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Tue, 26 Oct 2021 01:21:56 +0200
Subject: [PATCH 57/58] Remove wrong translation
---
langs/layers/ru.json | 7 -------
1 file changed, 7 deletions(-)
diff --git a/langs/layers/ru.json b/langs/layers/ru.json
index 33c93089d7..534da2e01e 100644
--- a/langs/layers/ru.json
+++ b/langs/layers/ru.json
@@ -1429,13 +1429,6 @@
}
},
"waste_basket": {
- "iconSize": {
- "mappings": {
- "0": {
- "then": "Контейнер для мусора"
- }
- }
- },
"name": "Контейнер для мусора",
"presets": {
"0": {
From d443616d1f463d7463f25f48686336ff89397899 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Tue, 26 Oct 2021 01:44:57 +0200
Subject: [PATCH 58/58] Change order of mappings in charging stations theme
---
.../charging_station/charging_station.json | 48 +++++++++----------
.../charging_station.protojson | 4 +-
langs/layers/de.json | 10 ++--
langs/layers/en.json | 10 ++--
langs/layers/nl.json | 10 ++--
langs/layers/ru.json | 7 +++
6 files changed, 48 insertions(+), 41 deletions(-)
diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json
index ce39f6343b..3ec94777e3 100644
--- a/assets/layers/charging_station/charging_station.json
+++ b/assets/layers/charging_station/charging_station.json
@@ -1704,9 +1704,9 @@
]
},
"then": {
- "en": "This charging station is broken",
- "nl": "Dit oplaadpunt is kapot",
- "de": "Diese Ladestation ist kaputt"
+ "en": "This charging station works",
+ "nl": "Dit oplaadpunt werkt",
+ "de": "Diese Ladestation funktioniert"
}
},
{
@@ -1719,6 +1719,22 @@
"amenity=charging_station"
]
},
+ "then": {
+ "en": "This charging station is broken",
+ "nl": "Dit oplaadpunt is kapot",
+ "de": "Diese Ladestation ist kaputt"
+ }
+ },
+ {
+ "if": {
+ "and": [
+ "planned:amenity=charging_station",
+ "construction:amenity=",
+ "disused:amenity=",
+ "operational_status=",
+ "amenity="
+ ]
+ },
"then": {
"en": "A charging station is planned here",
"nl": "Hier zal binnenkort een oplaadpunt gebouwd worden",
@@ -1728,8 +1744,8 @@
{
"if": {
"and": [
- "planned:amenity=charging_station",
- "construction:amenity=",
+ "planned:amenity=",
+ "construction:amenity=charging_station",
"disused:amenity=",
"operational_status=",
"amenity="
@@ -1745,9 +1761,9 @@
"if": {
"and": [
"planned:amenity=",
- "construction:amenity=charging_station",
- "disused:amenity=",
- "operational_status=broken",
+ "construction:amenity=",
+ "disused:amenity=charging_station",
+ "operational_status=",
"amenity="
]
},
@@ -1756,22 +1772,6 @@
"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"
}
- },
- {
- "if": {
- "and": [
- "planned:amenity=",
- "construction:amenity=",
- "disused:amenity=charging_station",
- "operational_status=broken",
- "amenity="
- ]
- },
- "then": {
- "en": "This charging station works",
- "nl": "Dit oplaadpunt werkt",
- "de": "Diese Ladestation funktioniert"
- }
}
]
},
diff --git a/assets/layers/charging_station/charging_station.protojson b/assets/layers/charging_station/charging_station.protojson
index 5a941d6b08..ac7a86b9bf 100644
--- a/assets/layers/charging_station/charging_station.protojson
+++ b/assets/layers/charging_station/charging_station.protojson
@@ -609,7 +609,7 @@
"planned:amenity=",
"construction:amenity=charging_station",
"disused:amenity=",
- "operational_status=broken",
+ "operational_status=",
"amenity="
]
},
@@ -624,7 +624,7 @@
"planned:amenity=",
"construction:amenity=",
"disused:amenity=charging_station",
- "operational_status=broken",
+ "operational_status=",
"amenity="
]
},
diff --git a/langs/layers/de.json b/langs/layers/de.json
index 664c8efa07..46ea03b703 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -1085,19 +1085,19 @@
"Operational status": {
"mappings": {
"0": {
- "then": "Diese Ladestation ist kaputt"
+ "then": "Diese Ladestation funktioniert"
},
"1": {
- "then": "Hier ist eine Ladestation geplant"
+ "then": "Diese Ladestation ist kaputt"
},
"2": {
- "then": "Hier wird eine Ladestation gebaut"
+ "then": "Hier ist eine Ladestation geplant"
},
"3": {
- "then": "Diese Ladestation wurde dauerhaft deaktiviert und wird nicht mehr benutzt, ist aber noch sichtbar"
+ "then": "Hier wird eine Ladestation gebaut"
},
"4": {
- "then": "Diese Ladestation funktioniert"
+ "then": "Diese Ladestation wurde dauerhaft deaktiviert und wird nicht mehr benutzt, ist aber noch sichtbar"
}
},
"question": "Ist dieser Ladepunkt in Betrieb?"
diff --git a/langs/layers/en.json b/langs/layers/en.json
index c5dbcbbc40..98e6506fc0 100644
--- a/langs/layers/en.json
+++ b/langs/layers/en.json
@@ -1175,19 +1175,19 @@
"Operational status": {
"mappings": {
"0": {
- "then": "This charging station is broken"
+ "then": "This charging station works"
},
"1": {
- "then": "A charging station is planned here"
+ "then": "This charging station is broken"
},
"2": {
- "then": "A charging station is constructed here"
+ "then": "A charging station is planned here"
},
"3": {
- "then": "This charging station has beed permanently disabled and is not in use anymore but is still visible"
+ "then": "A charging station is constructed here"
},
"4": {
- "then": "This charging station works"
+ "then": "This charging station has beed permanently disabled and is not in use anymore but is still visible"
}
},
"question": "Is this charging point in use?"
diff --git a/langs/layers/nl.json b/langs/layers/nl.json
index 317a63c553..6338128394 100644
--- a/langs/layers/nl.json
+++ b/langs/layers/nl.json
@@ -1288,19 +1288,19 @@
"Operational status": {
"mappings": {
"0": {
- "then": "Dit oplaadpunt is kapot"
+ "then": "Dit oplaadpunt werkt"
},
"1": {
- "then": "Hier zal binnenkort een oplaadpunt gebouwd worden"
+ "then": "Dit oplaadpunt is kapot"
},
"2": {
- "then": "Hier wordt op dit moment een oplaadpunt gebouwd"
+ "then": "Hier zal binnenkort een oplaadpunt gebouwd worden"
},
"3": {
- "then": "Dit oplaadpunt is niet meer in gebruik maar is wel nog aanwezig"
+ "then": "Hier wordt op dit moment een oplaadpunt gebouwd"
},
"4": {
- "then": "Dit oplaadpunt werkt"
+ "then": "Dit oplaadpunt is niet meer in gebruik maar is wel nog aanwezig"
}
},
"question": "Is dit oplaadpunt operationeel?"
diff --git a/langs/layers/ru.json b/langs/layers/ru.json
index 534da2e01e..33c93089d7 100644
--- a/langs/layers/ru.json
+++ b/langs/layers/ru.json
@@ -1429,6 +1429,13 @@
}
},
"waste_basket": {
+ "iconSize": {
+ "mappings": {
+ "0": {
+ "then": "Контейнер для мусора"
+ }
+ }
+ },
"name": "Контейнер для мусора",
"presets": {
"0": {